Refactored Synchronizer API.
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientObjectFactory.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientObjectFactory.java
index 3381fc5..3b5f872 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientObjectFactory.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/ClientObjectFactory.java
@@ -16,7 +16,7 @@
 import org.eclipse.rap.rwt.Adaptable;
 import org.eclipse.rap.rwt.internal.service.ContextProvider;
 import org.eclipse.rap.rwt.internal.util.ParamCheck;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.service.IServiceStore;
 
 
@@ -33,7 +33,7 @@
 
   /**
    * Returns an {@link IClientObject} instance for the given object. The object
-   * must provide an {@link RemoteObjectAdapter} in its
+   * must provide an {@link RemoteObject} in its
    * {@link Adaptable#getAdapter(Class)} method. The returned client object
    * instance is unique during a request.
    * <p>
@@ -46,12 +46,12 @@
    */
   public static IClientObject getClientObject( Adaptable object ) {
     ParamCheck.notNull( object, "object" );
-    RemoteObjectAdapter adapter = getAdapter( object );
+    RemoteObject adapter = getAdapter( object );
     return getForId( adapter.getId() );
   }
 
-  private static RemoteObjectAdapter getAdapter( Adaptable object ) {
-    RemoteObjectAdapter result = object.getAdapter( RemoteObjectAdapter.class );
+  private static RemoteObject getAdapter( Adaptable object ) {
+    RemoteObject result = object.getAdapter( RemoteObject.class );
     if( result == null ) {
       String message = "Could not retrieve an instance of IClientObjectAdapter.";
       throw new IllegalArgumentException( message );
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry.java
deleted file mode 100644
index eff7424..0000000
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.rwt.internal.protocol;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.rap.rwt.SingletonUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
-
-
-public class RemoteObjectAdapterRegistry {
-  
-  private final List<RemoteObjectAdapter> adapters;
-
-  public static RemoteObjectAdapterRegistry getInstance() {
-    return SingletonUtil.getSessionInstance( RemoteObjectAdapterRegistry.class );
-  }
-
-  private RemoteObjectAdapterRegistry() {
-    adapters = Collections.synchronizedList( new ArrayList<RemoteObjectAdapter>() );
-  }
-  
-  public void register( RemoteObjectAdapter adapter ) {
-    adapters.add( adapter );
-  }
-  
-  void remove( RemoteObjectAdapter adapter ) {
-    adapters.remove( adapter );
-  }
-  
-  public List<RemoteObjectAdapter> getAdapters() {
-    return new ArrayList<RemoteObjectAdapter>( adapters );
-  }
-
-}
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl.java
index 7311c79..adcab79 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl.java
@@ -10,64 +10,62 @@
  ******************************************************************************/
 package org.eclipse.rap.rwt.internal.protocol;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
-import org.eclipse.rap.rwt.remote.Call;
-import org.eclipse.rap.rwt.remote.EventNotification;
-import org.eclipse.rap.rwt.remote.Property;
+import org.eclipse.rap.rwt.internal.util.ParamCheck;
+import org.eclipse.rap.rwt.remote.EventHandler;
+import org.eclipse.rap.rwt.remote.MethodHandler;
+import org.eclipse.rap.rwt.remote.PropertyHandler;
 import org.eclipse.rap.rwt.remote.RemoteObjectDefinition;
 
 
 public class RemoteObjectDefinitionImpl<T> implements RemoteObjectDefinition<T> {
 
   private final Class<T> type;
-  private final List<Property<T>> properties;
-  private final List<EventNotification<T>> events;
-  private final List<Call<T>> calls;
+  private final Map<String, PropertyHandler<T>> properties;
+  private final Map<String, EventHandler<T>> eventHandlers;
+  private final Map<String, MethodHandler<T>> methods;
 
   public RemoteObjectDefinitionImpl( Class<T> type ) {
-    checkArgument( type, "Type must not be null." );
+    ParamCheck.notNull( type, "RemoteObjectType" );
     this.type = type;
-    this.properties = new ArrayList<Property<T>>();
-    this.events = new ArrayList<EventNotification<T>>();
-    this.calls = new ArrayList<Call<T>>();
+    this.properties = new HashMap<String, PropertyHandler<T>>();
+    this.eventHandlers = new HashMap<String, EventHandler<T>>();
+    this.methods = new HashMap<String, MethodHandler<T>>();
   }
 
   public Class<T> getType() {
     return type;
   }
 
-  public void addProperty( Property<T> property ) {
-    checkArgument( property, "Property must not be null." );
-    properties.add( property );
+  public void addProperty( String name, PropertyHandler<T> propertyHandler ) {
+    ParamCheck.notNullOrEmpty( name, "Property Name" );
+    ParamCheck.notNull( propertyHandler, "PropertyHandler" );
+    properties.put( name, propertyHandler );
   }
 
-  public void addEvent( EventNotification<T> event ) {
-    checkArgument( event, "Event must not be null." );
-    events.add( event );
+  public void addEventHandler( String eventName, EventHandler<T> eventHandler ) {
+    ParamCheck.notNullOrEmpty( eventName, "Event Name" );
+    ParamCheck.notNull( eventHandler, "EventHandler" );
+    eventHandlers.put( eventName, eventHandler );
   }
 
-  public void addCall( Call<T> call ) {
-    checkArgument( call, "Call must not be null." );
-    calls.add( call );
+  public void addMethod( String name, MethodHandler<T> methodHandler ) {
+    ParamCheck.notNullOrEmpty( name, "Mehtod Name" );
+    ParamCheck.notNull( methodHandler, "MethodHandler" );
+    methods.put( name, methodHandler );
   }
 
-  public List<Property<T>> getProperties() {
-    return new ArrayList<Property<T>>( properties );
+  public PropertyHandler<T> getProperty( String name ) {
+    return properties.get( name );
   }
 
-  public List<EventNotification<T>> getEvents() {
-    return new ArrayList<EventNotification<T>>( events );
+  public EventHandler<T> getEventHandler( String eventName ) {
+    return eventHandlers.get( eventName );
   }
 
-  public List<Call<T>> getCalls() {
-    return new ArrayList<Call<T>>( calls );
-  }
-
-  private static void checkArgument( Object argument, String errorMessage ) {
-    if( argument == null ) {
-      throw new IllegalArgumentException( errorMessage );
-    }
+  public MethodHandler<T> getMethod( String name ) {
+    return methods.get( name );
   }
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl.java
similarity index 85%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl.java
index 95bf76f..0ae366c 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl.java
@@ -20,12 +20,12 @@
 import org.eclipse.rap.rwt.internal.lifecycle.CurrentPhase;
 import org.eclipse.rap.rwt.internal.util.ParamCheck;
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
-import org.eclipse.rap.rwt.remote.RemoteObjectSpecifier;
+import org.eclipse.rap.rwt.remote.RemoteObject;
+import org.eclipse.rap.rwt.remote.RemoteObjectSpecification;
 import org.eclipse.swt.internal.widgets.IdGenerator;
 
 
-public class RemoteObjectAdapterImpl<T> implements RemoteObjectAdapter {
+public class RemoteObjectImpl<T> implements RemoteObject {
 
   private final String id;
   private boolean initialized;
@@ -34,13 +34,13 @@
   private List<Runnable> queue;
   private HashMap<String, Boolean> listeners;
 
-  public RemoteObjectAdapterImpl( T remoteObject, Class<? extends RemoteObjectSpecifier<T>> specifierType ) {
-    this( remoteObject, specifierType, "o" );
+  public RemoteObjectImpl( T remoteObject, Class<? extends RemoteObjectSpecification<T>> specificationType ) {
+    this( remoteObject, specificationType, "o" );
   }
 
   @SuppressWarnings( "unchecked" )
-  public RemoteObjectAdapterImpl( T remoteObject,
-                                  Class<? extends RemoteObjectSpecifier<T>> specifierType,
+  public RemoteObjectImpl( T remoteObject,
+                                  Class<? extends RemoteObjectSpecification<T>> specifierType,
                                   String customPrefix )
   {
     this.id = IdGenerator.getInstance().newId( customPrefix );
@@ -51,7 +51,7 @@
       Class<T> remoteType = ( Class<T> )remoteObject.getClass();
       // TODO: Think about register implementation. Second call does nothing!
       RemoteObjectSynchronizerRegistry.getInstance().register( remoteType, specifierType );
-      RemoteObjectAdapterRegistry.getInstance().register( this );
+      RemoteObjectRegistry.getInstance().register( this );
     }
   }
 
@@ -75,7 +75,7 @@
     return destroyed;
   }
 
-  public T getRemoteObject() {
+  public T getObject() {
     return remoteObject;
   }
 
@@ -92,8 +92,7 @@
   public void set( final String propertyName, final String propertyValue ) {
     ParamCheck.notNullOrEmpty( propertyName, "Property Name" );
     ParamCheck.notNull( propertyValue, "Property Value" );
-    // TODO: Also accessible from Threads without any phase?
-    if( !CurrentPhase.get().equals( PhaseId.READ_DATA ) ) {
+    if( !PhaseId.READ_DATA.equals( CurrentPhase.get() ) ) {
       Runnable appendSetRunnable = new Runnable() {
         public void run() {
           getProtocolWriter().appendSet( getId(), propertyName, propertyValue );
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry.java
new file mode 100644
index 0000000..44f0172
--- /dev/null
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.rwt.internal.protocol;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.rap.rwt.SingletonUtil;
+import org.eclipse.rap.rwt.remote.RemoteObject;
+
+
+public class RemoteObjectRegistry {
+  
+  private final List<RemoteObject> remoteObjects;
+
+  public static RemoteObjectRegistry getInstance() {
+    return SingletonUtil.getSessionInstance( RemoteObjectRegistry.class );
+  }
+
+  private RemoteObjectRegistry() {
+    remoteObjects = Collections.synchronizedList( new ArrayList<RemoteObject>() );
+  }
+  
+  public void register( RemoteObject remoteObject ) {
+    remoteObjects.add( remoteObject );
+  }
+  
+  void remove( RemoteObject remoteObject ) {
+    remoteObjects.remove( remoteObject );
+  }
+  
+  public List<RemoteObject> getRemoteObjects() {
+    return new ArrayList<RemoteObject>( remoteObjects );
+  }
+
+}
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer.java
index 53b7a5d..4b5b7f0 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer.java
@@ -14,12 +14,13 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.rap.rwt.lifecycle.ProcessActionRunner;
-import org.eclipse.rap.rwt.remote.Call;
-import org.eclipse.rap.rwt.remote.EventNotification;
-import org.eclipse.rap.rwt.remote.Property;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.EventHandler;
+import org.eclipse.rap.rwt.remote.MethodHandler;
+import org.eclipse.rap.rwt.remote.PropertyHandler;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 
 
 public class RemoteObjectSynchronizer<T> {
@@ -37,58 +38,68 @@
   }
 
   public void set( T object, Map<String, Object> setProperties ) {
-    List<Property<T>> objectProperties = definition.getProperties();
-    for( Property<T> objectProperty : objectProperties ) {
-      Object newValue = setProperties.get( objectProperty.getName() );
-      if( newValue != null ) {
-        objectProperty.set( object, newValue );
+    for( Entry<String, Object> entry : setProperties.entrySet() ) {
+      PropertyHandler<T> propertyHandler = definition.getProperty( entry.getKey() );
+      if( propertyHandler != null ) {
+        propertyHandler.set( object, entry.getValue() );
+      } else {
+        throw new IllegalStateException( "Property " 
+                                         + entry.getKey() 
+                                         + " is not configured for type " 
+                                         + object.getClass().getName() );
       }
     }
   }
 
   public void call( T object, String methodName, Map<String, Object> callProperties ) {
-    List<Call<T>> calls = definition.getCalls();
-    for( Call<T> call : calls ) {
-      if( call.getName().equals( methodName ) ) {
-        call.call( object, callProperties );
-      }
+    MethodHandler<T> methodHandler = definition.getMethod( methodName );
+    if( methodHandler != null ) {
+      methodHandler.call( object, callProperties );
+    } else {
+      throw new IllegalStateException( "Method "
+                                       + methodName
+                                       + " is not configured for type "
+                                       + object.getClass().getName() );
     }
   }
 
   public void notify( T object, String eventName, Map<String, Object> properties ) {
-    List<EventNotification<T>> events = definition.getEvents();
-    for( EventNotification<T> event : events ) {
-      if( event.getName().equals( eventName ) ) {
-        notifyEventInProcessActionPhase( object, properties, event );
-      }
+    EventHandler<T> eventHandler = definition.getEventHandler( eventName );
+    if( eventHandler != null ) {
+      notifyEventInProcessActionPhase( object, properties, eventHandler );
+    } else {
+      throw new IllegalStateException( "Event "
+                                       + eventName
+                                       + " is not configured for type "
+                                       + object.getClass().getName() );
     }
   }
 
   private void notifyEventInProcessActionPhase( final T object,
                                                 final Map<String, Object> properties,
-                                                final EventNotification<T> event )
+                                                final EventHandler<T> eventHandler )
   {
     ProcessActionRunner.add( new Runnable() {
       public void run() {
-        event.notify( object, properties );
+        eventHandler.notify( object, properties );
       }
     } );
   }
 
-  public void create( RemoteObjectAdapter adapter ) {
+  public void create( RemoteObject adapter ) {
     getProtocolWriter().appendCreate( adapter.getId(), type );
   }
 
-  public void render( RemoteObjectAdapter adapter ) {
-    RemoteObjectAdapterImpl<?> adapterImpl = ( RemoteObjectAdapterImpl )adapter;
-    List<Runnable> renderQueue = adapterImpl.getRenderQueue();
+  public void render( RemoteObject remoteObject ) {
+    RemoteObjectImpl<?> remoteObjectImpl = ( RemoteObjectImpl )remoteObject;
+    List<Runnable> renderQueue = remoteObjectImpl.getRenderQueue();
     for( Runnable runnable : renderQueue ) {
       runnable.run();
     }
     renderQueue.clear();
   }
 
-  public void destroy( RemoteObjectAdapter adapter ) {
-    getProtocolWriter().appendDestroy( adapter.getId() );
+  public void destroy( RemoteObject remoteObject ) {
+    getProtocolWriter().appendDestroy( remoteObject.getId() );
   }
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry.java
index 9b67475..b066f1e 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry.java
@@ -16,7 +16,7 @@
 
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.internal.util.ClassUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectSpecifier;
+import org.eclipse.rap.rwt.remote.RemoteObjectSpecification;
 
 
 public class RemoteObjectSynchronizerRegistry {
@@ -36,22 +36,22 @@
     synchronizers = Collections.synchronizedList( new ArrayList<RemoteObjectSynchronizer<?>>() );
   }
 
-  public <T> void register( Class<T> type, Class<? extends RemoteObjectSpecifier<T>> specifierType )
+  public <T> void register( Class<T> type, Class<? extends RemoteObjectSpecification<T>> specification )
     throws IllegalStateException 
   {
     if( getSynchronizerForType( type ) == null ) {
-      createDefinition( type, createSpecifier( specifierType ) );
+      createDefinition( type, createSpecification( specification ) );
     } 
   }
   
-  private <T> RemoteObjectSpecifier<T> createSpecifier( Class<? extends RemoteObjectSpecifier<T>> specifierType ) {
+  private <T> RemoteObjectSpecification<T> createSpecification( Class<? extends RemoteObjectSpecification<T>> specifierType ) {
     return ClassUtil.newInstance( specifierType );
   }
 
-  private <T> void createDefinition( Class<T> type, RemoteObjectSpecifier<T> specifier ) {
+  private <T> void createDefinition( Class<T> type, RemoteObjectSpecification<T> specification ) {
     RemoteObjectDefinitionImpl<T> definition = new RemoteObjectDefinitionImpl<T>( type );
-    specifier.define( definition );
-    synchronizers.add( new RemoteObjectSynchronizer<T>( definition, specifier.getType() ) );
+    specification.define( definition );
+    synchronizers.add( new RemoteObjectSynchronizer<T>( definition, specification.getType() ) );
   }
   
   @SuppressWarnings( "unchecked" )
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects.java
index 7b398d3..0fd0431 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects.java
@@ -19,37 +19,37 @@
 import org.eclipse.rap.rwt.internal.protocol.ClientMessage.NotifyOperation;
 import org.eclipse.rap.rwt.internal.protocol.ClientMessage.Operation;
 import org.eclipse.rap.rwt.internal.protocol.ClientMessage.SetOperation;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 
 
 public class RemoteObjects {
 
   public static void readData() {
-    List<RemoteObjectAdapter> adapters = RemoteObjectAdapterRegistry.getInstance().getAdapters();
-    for( RemoteObjectAdapter adapter : adapters ) {
-      dispatchOperations( adapter );
+    List<RemoteObject> remoteObjects = RemoteObjectRegistry.getInstance().getRemoteObjects();
+    for( RemoteObject remoteObject : remoteObjects ) {
+      dispatchOperations( remoteObject );
     }
   }
 
-  private static void dispatchOperations( RemoteObjectAdapter adapter ) {
-    RemoteObjectSynchronizer<Object> synchronizer = getSynchronizer( adapter );
-    List<ClientMessage.Operation> operations = getOperations( adapter );
+  private static void dispatchOperations( RemoteObject remoteObject ) {
+    RemoteObjectSynchronizer<Object> synchronizer = getSynchronizer( remoteObject );
+    List<ClientMessage.Operation> operations = getOperations( remoteObject );
     for( ClientMessage.Operation operation : operations ) {
-      dispatchOperation( adapter, synchronizer, operation );
+      dispatchOperation( remoteObject, synchronizer, operation );
     }
   }
 
-  private static void dispatchOperation( RemoteObjectAdapter adapter, 
+  private static void dispatchOperation( RemoteObject remoteObject, 
                                          RemoteObjectSynchronizer<Object> synchronizer, 
                                          ClientMessage.Operation operation ) 
   {
-    Object remoteObject = ( ( RemoteObjectAdapterImpl )adapter ).getRemoteObject();
+    Object object = ( ( RemoteObjectImpl )remoteObject ).getObject();
     if( operation instanceof SetOperation ) {
-      synchronizer.set( remoteObject, getProperties( operation ) );
+      synchronizer.set( object, getProperties( operation ) );
     } else if( operation instanceof CallOperation ) {
-      synchronizer.call( remoteObject, ( ( CallOperation )operation ).getMethodName(), getProperties( operation ) );
+      synchronizer.call( object, ( ( CallOperation )operation ).getMethodName(), getProperties( operation ) );
     } else if( operation instanceof NotifyOperation ) {
-      synchronizer.notify( remoteObject, ( ( NotifyOperation )operation ).getEventName(), getProperties( operation ) );
+      synchronizer.notify( object, ( ( NotifyOperation )operation ).getEventName(), getProperties( operation ) );
     }
   }
 
@@ -62,44 +62,44 @@
     return result;
   }
 
-  private static List<ClientMessage.Operation> getOperations( RemoteObjectAdapter adapter ) {
+  private static List<ClientMessage.Operation> getOperations( RemoteObject adapter ) {
     Operation[] operations = ProtocolUtil.getClientMessage().getAllOperationsFor( adapter.getId() );
     return Arrays.asList( operations );
   }
 
   public static void render() {
-    List<RemoteObjectAdapter> adapters = RemoteObjectAdapterRegistry.getInstance().getAdapters();
-    for( RemoteObjectAdapter adapter : adapters ) {
-      RemoteObjectAdapterImpl remoteObjectAdapter = ( RemoteObjectAdapterImpl )adapter;
-      RemoteObjectSynchronizer<Object> synchronizer = getSynchronizer( adapter );
-      renderAdapter( remoteObjectAdapter, synchronizer );
+    List<RemoteObject> remoteObjects = RemoteObjectRegistry.getInstance().getRemoteObjects();
+    for( RemoteObject remoteObject : remoteObjects ) {
+      RemoteObjectImpl remoteObjectImpl = ( RemoteObjectImpl )remoteObject;
+      RemoteObjectSynchronizer<Object> synchronizer = getSynchronizer( remoteObject );
+      renderAdapter( remoteObjectImpl, synchronizer );
     }
   }
 
-  private static void renderAdapter( RemoteObjectAdapterImpl adapter, RemoteObjectSynchronizer<Object> synchronizer ) {
-    if( adapter.isDestroyed() ) {
-      synchronizer.destroy( adapter );
-      RemoteObjectAdapterRegistry.getInstance().remove( adapter );
+  private static void renderAdapter( RemoteObjectImpl remoteObject, RemoteObjectSynchronizer<Object> synchronizer ) {
+    if( remoteObject.isDestroyed() ) {
+      synchronizer.destroy( remoteObject );
+      RemoteObjectRegistry.getInstance().remove( remoteObject );
     } else {
-      ensureAdapterInitialization( adapter, synchronizer );
-      synchronizer.render( adapter );
+      ensureAdapterInitialization( remoteObject, synchronizer );
+      synchronizer.render( remoteObject );
     }
   }
 
-  private static void ensureAdapterInitialization( RemoteObjectAdapterImpl adapter,
+  private static void ensureAdapterInitialization( RemoteObjectImpl remoteObject,
                                                    RemoteObjectSynchronizer<Object> synchronizer )
   {
-    if( !adapter.isInitialized() ) {
-      synchronizer.create( adapter );
-      adapter.setInitialized( true );
+    if( !remoteObject.isInitialized() ) {
+      synchronizer.create( remoteObject );
+      remoteObject.setInitialized( true );
     }
   }
   
   @SuppressWarnings( "unchecked" )
-  private static RemoteObjectSynchronizer<Object> getSynchronizer( RemoteObjectAdapter adapter ) {
-    RemoteObjectAdapterImpl adapterImpl = ( RemoteObjectAdapterImpl )adapter;
+  private static RemoteObjectSynchronizer<Object> getSynchronizer( RemoteObject remoteObject ) {
+    RemoteObjectImpl remoteObjectImpl = ( RemoteObjectImpl )remoteObject;
     RemoteObjectSynchronizerRegistry registry = RemoteObjectSynchronizerRegistry.getInstance();
-    Class<? extends Object> type = adapterImpl.getRemoteObject().getClass();
+    Class<? extends Object> type = remoteObjectImpl.getObject().getClass();
     RemoteObjectSynchronizer<Object> result 
       = ( RemoteObjectSynchronizer<Object> )registry.getSynchronizerForType( type );
     if( result == null ) {
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/IWidgetAdapter.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/IWidgetAdapter.java
index df5d745..ac6ed3e 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/IWidgetAdapter.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/IWidgetAdapter.java
@@ -11,7 +11,7 @@
  ******************************************************************************/
 package org.eclipse.rap.rwt.lifecycle;
 
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.swt.widgets.Widget;
 
 
@@ -23,7 +23,7 @@
  *
  * @since 2.0
  */
-public interface IWidgetAdapter extends RemoteObjectAdapter {
+public interface IWidgetAdapter extends RemoteObject {
 
   /**
    * Returns the preserved value for a specified key.
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventNotification.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventHandler.java
similarity index 91%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventNotification.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventHandler.java
index 5e2da84..558cde2 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventNotification.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/EventHandler.java
@@ -16,9 +16,7 @@
 /**
  * @since 2.0
  */
-public interface EventNotification<T> {
-  
-  String getName();
+public interface EventHandler<T> {
   
   void notify( T object, Map<String, Object> properties );
   
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Call.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/MethodHandler.java
similarity index 92%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Call.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/MethodHandler.java
index fa558bd..17047e1 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Call.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/MethodHandler.java
@@ -16,9 +16,7 @@
 /**
  * @since 2.0
  */
-public interface Call<T> {
-  
-  String getName();
+public interface MethodHandler<T> {
   
   void call( T object, Map<String, Object> properties );
   
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Property.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/PropertyHandler.java
similarity index 91%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Property.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/PropertyHandler.java
index 2a89553..e8cfa3a 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/Property.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/PropertyHandler.java
@@ -14,9 +14,7 @@
 /**
  * @since 2.0
  */
-public interface Property<T> {
-  
-  String getName();
+public interface PropertyHandler<T> {
   
   void set( T object, Object value );
   
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectAdapter.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObject.java
similarity index 94%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectAdapter.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObject.java
index bacb208..9ea05c8 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectAdapter.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObject.java
@@ -11,11 +11,10 @@
 package org.eclipse.rap.rwt.remote;
 
 
-
 /**
  * @since 2.0
  */
-public interface RemoteObjectAdapter {
+public interface RemoteObject<T> {
 
   /**
    * Returns the id that identifies the object on the client.
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectDefinition.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectDefinition.java
index 223fdac..6e70192 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectDefinition.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectDefinition.java
@@ -17,9 +17,9 @@
  */
 public interface RemoteObjectDefinition<T> {
 
-  void addProperty( Property<T> property );
+  void addProperty( String name, PropertyHandler<T> propertyHandler );
 
-  void addEvent( EventNotification<T> event );
+  void addEventHandler( String eventName, EventHandler<T> eventHandler );
 
-  void addCall( Call<T> call );
+  void addMethod( String name, MethodHandler<T> methodHandler );
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecifier.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecification.java
similarity index 92%
rename from bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecifier.java
rename to bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecification.java
index 9076ec1..2a7eeec 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecifier.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteObjectSpecification.java
@@ -15,7 +15,7 @@
 /**
  * @since 2.0
  */
-public interface RemoteObjectSpecifier<T> {
+public interface RemoteObjectSpecification<T> {
 
   String getType();
   
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteUtil.java
index 68d7fbe..0826526 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/remote/RemoteUtil.java
@@ -11,9 +11,8 @@
 package org.eclipse.rap.rwt.remote;
 
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Map;
 
+import org.eclipse.rap.rwt.internal.protocol.RemoteObjectImpl;
 import org.eclipse.rap.rwt.internal.util.ParamCheck;
 
 
@@ -21,105 +20,55 @@
  * @since 2.0
  */
 public class RemoteUtil {
-
-  public static interface EventNotificationHandler<T> {
-    
-    void notify( T object, Map<String, Object> properties );
-  }
   
-  public static interface CallHandler<T> {
-    
-    void call( T object, Map<String, Object> properties );
-  }
-  
-  public static interface PropertyHandler<T> {
-    
-    void set( T object, Object propertyValue );
-  }
-  
-  public static <T> EventNotification<T> createEventNotification( 
-    final String eventName, 
-    final EventNotificationHandler<T> eventNotificationHandler ) 
+  // TODO: don't return Impl. Move API method into interface.
+  public static <T> RemoteObjectImpl<T> createRemoteObject( 
+    T object,
+    Class< ? extends RemoteObjectSpecification<T>> specificationType )
   {
-    return new EventNotification<T>() {
-
-      public String getName() {
-        return eventName;
-      }
-
-      public void notify( T object, Map<String, Object> properties ) {
-        eventNotificationHandler.notify( object, properties );
-      }
-    };
+    return new RemoteObjectImpl<T>( object, specificationType );
   }
   
-  public static <T> Call<T> createCall( final String methodName, final CallHandler<T> callHandler ) {
-    return new Call<T>() {
-      
-      public String getName() {
-        return methodName;
-      }
-      
-      public void call( T object, Map<String, Object> properties ) {
-        callHandler.call( object, properties );
-      }
-    };
+  public static <T> PropertyHandler<T> createBooleanPropertyHandler( Class<T> remoteType, String propertyName ) {
+    return createReflectivePropertyHandler( Boolean.class, remoteType, propertyName );
   }
   
-  public static <T> Property<T> createProperty( final String propertyName, final PropertyHandler<T> propertyHandler ) {
-    return new Property<T>() {
-
-      public String getName() {
-        return propertyName;
-      }
-
-      public void set( T object, Object value ) {
-        propertyHandler.set( object, value );
-      }
-      
-    };
+  public static <T> PropertyHandler<T> createStringPropertyHandler( Class<T> remoteType, String propertyName ) {
+    return createReflectivePropertyHandler( String.class, remoteType, propertyName );
   }
   
-  public static <T> Property<T> createBooleanProperty( Class<T> remoteType, String propertyName ) {
-    return createReflectiveProperty( Boolean.class, remoteType, propertyName );
+  public static <T> PropertyHandler<T> createIntPropertyHandler( Class<T> remoteType, String propertyName ) {
+    return createReflectivePropertyHandler( Integer.class, remoteType, propertyName );
   }
   
-  public static <T> Property<T> createStringProperty( Class<T> remoteType, String propertyName ) {
-    return createReflectiveProperty( String.class, remoteType, propertyName );
+  public static <T> PropertyHandler<T> createDoublePropertyHandler( Class<T> remoteType, String propertyName ) {
+    return createReflectivePropertyHandler( Double.class, remoteType, propertyName );
   }
   
-  public static <T> Property<T> createIntProperty( Class<T> remoteType, String propertyName ) {
-    return createReflectiveProperty( Integer.class, remoteType, propertyName );
-  }
-  
-  public static <T> Property<T> createDoubleProperty( Class<T> remoteType, String propertyName ) {
-    return createReflectiveProperty( Double.class, remoteType, propertyName );
-  }
-  
-  public static <T> Property<T> createObjectProperty( Class<T> remoteType, String propertyName ) {
-    return createReflectiveProperty( Object.class, remoteType, propertyName );
+  public static <T> PropertyHandler<T> createObjectPropertyHandler( Class<T> remoteType, String propertyName ) {
+    return createReflectivePropertyHandler( Object.class, remoteType, propertyName );
   }
 
-  private static <T> Property<T> createReflectiveProperty( Class<?> type, Class<T> remoteType, String propertyName ) {
-    ParamCheck.notNullOrEmpty( propertyName, "propertyName" );
+  private static <T> PropertyHandler<T> createReflectivePropertyHandler( 
+    Class<?> type, 
+    Class<T> remoteType, 
+    String propertyName ) 
+  {
     ParamCheck.notNull( remoteType, "remoteType" );
-    return new ReflectiveProperty<T>( propertyName, type );
+    ParamCheck.notNullOrEmpty( propertyName, "Property Name" );
+    return new ReflectivePropertyHandler<T>( propertyName, type );
   }
   
-  private static class ReflectiveProperty<T> implements Property<T> {
+  private static class ReflectivePropertyHandler<T> implements PropertyHandler<T> {
     
     private final String name;
     private final Class<?> type;
   
-    public ReflectiveProperty( String name, Class<?> type ) {
+    public ReflectivePropertyHandler( String name, Class<?> type ) {
       this.name = name;
       this.type = type;
     }
   
-    public String getName() {
-      return name;
-    }
-  
     public void set( Object object, Object value ) throws IllegalStateException {
       String methodName = "set" + name.substring( 0, 1 ).toUpperCase() + name.substring( 1, name.length() );
       try {
@@ -136,7 +85,7 @@
     private void invokeSetMethod( String methodName, Object object, Object propertyValue )
       throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
     {
-      Method method = object.getClass().getDeclaredMethod( methodName, getTypeToCast( type ) );
+      java.lang.reflect.Method method = object.getClass().getDeclaredMethod( methodName, getTypeToCast( type ) );
       if( !method.isAccessible() ) {
         method.setAccessible( true );
       }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/WidgetAdapter.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/WidgetAdapter.java
index b620e64..ee4ac28 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/WidgetAdapter.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/widgets/WidgetAdapter.java
@@ -18,9 +18,9 @@
 import org.eclipse.rap.rwt.internal.lifecycle.DisposedWidgets;
 import org.eclipse.rap.rwt.internal.lifecycle.IRenderRunnable;
 import org.eclipse.rap.rwt.internal.lifecycle.UITestUtil;
-import org.eclipse.rap.rwt.internal.protocol.RemoteObjectAdapterImpl;
+import org.eclipse.rap.rwt.internal.protocol.RemoteObjectImpl;
 import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.swt.internal.SerializableCompatibility;
 import org.eclipse.swt.widgets.Widget;
 
@@ -36,7 +36,7 @@
   private String jsParent;
   private transient IRenderRunnable renderRunnable;
   private transient String cachedVariant;
-  private RemoteObjectAdapterImpl gcObjectAdapter;
+  private RemoteObjectImpl gcObjectAdapter;
 
   public WidgetAdapter() {
     this( IdGenerator.getInstance().newId( "w" ) );
@@ -130,7 +130,7 @@
   @SuppressWarnings( "unchecked" )
   public Adaptable getGCForClient() {
     if( gcObjectAdapter == null ) {
-      gcObjectAdapter = new RemoteObjectAdapterImpl( null, null, "gc" );
+      gcObjectAdapter = new RemoteObjectImpl( null, null, "gc" );
     }
     return createGcAdaptable();
   }
@@ -140,7 +140,7 @@
     return new Adaptable() {
 
       public <T> T getAdapter( Class<T> adapter ) {
-        if( adapter == RemoteObjectAdapter.class ) {
+        if( adapter == RemoteObject.class ) {
           return ( T )gcObjectAdapter;
         }
         return null;
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
index 86038a8..860eb41 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
@@ -45,7 +45,7 @@
 import org.eclipse.rap.rwt.lifecycle.ProcessActionRunner;
 import org.eclipse.rap.rwt.lifecycle.UICallBack;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.service.ISessionStore;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
@@ -740,7 +740,7 @@
         displayAdapter = new DisplayAdapter();
       }
       result = ( T )displayAdapter;
-    } else if( adapter == RemoteObjectAdapter.class || adapter == IWidgetAdapter.class ) {
+    } else if( adapter == RemoteObject.class || adapter == IWidgetAdapter.class ) {
       if( widgetAdapter == null ) {
         widgetAdapter = new WidgetAdapter( "w1" );
       }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Widget.java
index cabb042..ec59baf 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Widget.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Widget.java
@@ -22,7 +22,7 @@
 import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.events.DisposeListener;
@@ -167,7 +167,7 @@
     // The adapters returned here are buffered for performance reasons. Don't change this without
     // good reason
     T result = null;
-    if( adapter == RemoteObjectAdapter.class || adapter == IWidgetAdapter.class ) {
+    if( adapter == RemoteObject.class || adapter == IWidgetAdapter.class ) {
       if( widgetAdapter == null ) {
         widgetAdapter = new WidgetAdapter();
       }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/ProtocolTestUtil.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/ProtocolTestUtil.java
index 7f15ffb..9da6906 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/ProtocolTestUtil.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/ProtocolTestUtil.java
@@ -12,11 +12,11 @@
 
 import java.util.Map;
 
-import org.eclipse.rap.rwt.remote.Call;
-import org.eclipse.rap.rwt.remote.EventNotification;
-import org.eclipse.rap.rwt.remote.Property;
+import org.eclipse.rap.rwt.remote.EventHandler;
+import org.eclipse.rap.rwt.remote.MethodHandler;
+import org.eclipse.rap.rwt.remote.PropertyHandler;
 import org.eclipse.rap.rwt.remote.RemoteObjectDefinition;
-import org.eclipse.rap.rwt.remote.RemoteObjectSpecifier;
+import org.eclipse.rap.rwt.remote.RemoteObjectSpecification;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -68,7 +68,7 @@
     
   }
 
-  public static class TestRemoteObjectSpecifier implements RemoteObjectSpecifier<TestRemoteObject> {
+  public static class TestRemoteObjectSpecification implements RemoteObjectSpecification<TestRemoteObject> {
   
     public static final String TEST_PROPERTY = "test";
     public static final String TEST_CALL = "call";
@@ -80,36 +80,20 @@
     }
 
     public void define( RemoteObjectDefinition<TestRemoteObject> definition ) {
-      definition.addProperty( new Property<TestRemoteObject>() {
-  
-        public String getName() {
-          return TEST_PROPERTY;
-        }
-  
+      definition.addProperty( TEST_PROPERTY, new PropertyHandler<TestRemoteObject>() {
         public void set( TestRemoteObject object, Object value ) {
           object.setTest( ( String )value );
         } 
-        
       } );
-      definition.addCall( new Call<TestRemoteObject>() {
-        
-        public String getName() {
-          return TEST_CALL;
-        }
-        
+      definition.addMethod( TEST_CALL, new MethodHandler<TestRemoteObject>() {
         public void call( TestRemoteObject object, Map<String, Object> properties ) {
           object.call( properties );
         }
       } );
-      definition.addEvent( new EventNotification<TestRemoteObject>() {
-        
+      definition.addEventHandler( TEST_EVENT, new EventHandler<TestRemoteObject>() {
         public void notify( TestRemoteObject object, Map<String, Object> properties ) {
           object.fireEvent( properties );
         }
-        
-        public String getName() {
-          return TEST_EVENT;
-        }
       } );
     }
     
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl_Test.java
deleted file mode 100644
index 1acbdfd..0000000
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterImpl_Test.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.rwt.internal.protocol;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecifier;
-import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
-import org.eclipse.rap.rwt.testfixture.Fixture;
-
-
-public class RemoteObjectAdapterImpl_Test extends TestCase {
-
-  @Override
-  protected void setUp() throws Exception {
-    Fixture.setUp();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    Fixture.tearDown();
-  }
-
-  public void testNewId() {
-    String id1 = new RemoteObjectAdapterImpl<Object>( new Object(), null ).getId();
-    String id2 = new RemoteObjectAdapterImpl<Object>( new Object(), null ).getId();
-
-    assertFalse( id1.equals( id2 ) );
-  }
-
-  public void testSameId() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( new Object(), null );
-    String id1 = adapter.getId();
-    String id2 = adapter.getId();
-
-    assertEquals( id1, id2 );
-  }
-
-  public void testPrefix() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( new Object(), null );
-    String id1 = adapter.getId();
-
-    assertTrue( id1.startsWith( "o" ) );
-  }
-
-  public void testCustomPrefix() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>(  new Object(), null, "gl" );
-    String id1 = adapter.getId();
-
-    assertTrue( id1.startsWith( "gl" ) );
-  }
-  
-  public void testRegistersSpecifier() {
-    new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    RemoteObjectSynchronizer<TestRemoteObject> synchronizer 
-      = RemoteObjectSynchronizerRegistry.getInstance().getSynchronizerForType( TestRemoteObject.class );
-    assertNotNull( synchronizer );
-  }
-  
-  public void testIsNotInitializedByDefault() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( new Object(), null );
-    
-    assertFalse( adapter.isInitialized() );
-  }
-  
-  public void testIsInitialized() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( new Object(), null );
-    
-    adapter.setInitialized( true );
-    
-    assertTrue( adapter.isInitialized() );
-  }
-  
-  public void testIsNotDestroyedByDefault() {
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( new Object(), null );
-    
-    assertFalse( adapter.isDestroyed() );
-  }
-  
-  public void testKeepsRemoteObject() {
-    Object remoteObject = new Object();
-    RemoteObjectAdapterImpl<Object> adapter = new RemoteObjectAdapterImpl<Object>( remoteObject, null );
-    
-    assertSame( remoteObject, adapter.getRemoteObject() );
-  }
-  
-  public void testCreationRegistersInstanceInRegistry() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-
-    List<RemoteObjectAdapter> adapters = RemoteObjectAdapterRegistry.getInstance().getAdapters();
-    assertTrue( adapters.contains( adapter ) );
-  }
-  
-  public void testIsDestroyed() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    adapter.destroy();
-    
-    assertTrue( adapter.isDestroyed() );
-  }
-  
-  public void testQueuesCalls() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put( "foo", "bar" );
-    
-    adapter.call( "fooBar", properties );
-    
-    List<Runnable> calls = adapter.getRenderQueue();
-    assertEquals( 1, calls.size() );
-  }
-  
-  public void testQueueSets() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-     
-    adapter.set( "foo", "bar" );
-    
-    List<Runnable> sets = adapter.getRenderQueue();
-    assertEquals( 1, sets.size() );
-  }
-  
-  public void testQueueListens() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-    = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    adapter.listen( "foo", true );
-    
-    List<Runnable> sets = adapter.getRenderQueue();
-    assertEquals( 1, sets.size() );
-  }
-  
-  public void testQueueListensOnlyIfChanged() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-    = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    adapter.listen( "foo", true );
-    adapter.listen( "foo", true );
-    
-    List<Runnable> sets = adapter.getRenderQueue();
-    assertEquals( 1, sets.size() );
-  }
-  
-  public void testQueueListensIfChanged() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-    = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    adapter.listen( "foo", true );
-    adapter.listen( "foo", false );
-    
-    List<Runnable> sets = adapter.getRenderQueue();
-    assertEquals( 2, sets.size() );
-  }
-  
-  public void testDoesNotQueueSetsInReadData() {
-    Fixture.fakePhase( PhaseId.READ_DATA );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-     
-    adapter.set( "foo", "bar" );
-    
-    List<Runnable> sets = adapter.getRenderQueue();
-    assertTrue( sets.isEmpty() );
-  }
-  
-  public void testQueueIsClearable() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put( "foo", "bar" );
-    adapter.call( "fooBar", properties );
-
-    adapter.getRenderQueue().clear();
-    
-    List<Runnable> operations = adapter.getRenderQueue();
-    assertTrue( operations.isEmpty() );
-  }
-  
-  public void testQueuesCallsFailsWithNullProperty() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put( "foo", "bar" );
-    
-    try {
-      adapter.call( null, properties );
-      fail();
-    } catch( NullPointerException expected ) {}
-  }
-  
-  public void testQueuesCallsFailsWithEmptyProperty() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-    = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put( "foo", "bar" );
-    
-    try {
-      adapter.call( "", properties );
-      fail();
-    } catch( IllegalArgumentException expected ) {}
-  }
-  
-  public void testQueueSetsFailsWithNullName() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-     
-    try {
-      adapter.set( null, "bar" );
-      fail();
-    } catch( NullPointerException expected ) {}
-  }
-  
-  public void testQueueSetsFailsWithEmptyName() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    try {
-      adapter.set( "", "bar" );
-      fail();
-    } catch( IllegalArgumentException expected ) {}
-  }
-  
-  public void testQueueSetsFailsWithNullValue() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    try {
-      adapter.set( "foo", null );
-      fail();
-    } catch( NullPointerException expected ) {}
-  }
-  
-  public void testQueueListensFailsWithNullName() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    try {
-      adapter.listen( null, true );
-      fail();
-    } catch( NullPointerException expected ) {}
-  }
-  
-  public void testQueueListensFailsWithEmptyName() {
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecifier.class, "gl" );
-    
-    try {
-      adapter.listen( "", true );
-      fail();
-    } catch( IllegalArgumentException expected ) {}
-  }
-  
-}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry_Test.java
deleted file mode 100644
index 5019fd7..0000000
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectAdapterRegistry_Test.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.rwt.internal.protocol;
-
-import static org.mockito.Mockito.mock;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
-import org.eclipse.rap.rwt.testfixture.Fixture;
-
-
-public class RemoteObjectAdapterRegistry_Test extends TestCase {
-  
-  private RemoteObjectAdapterRegistry registry;
-
-  @Override
-  protected void setUp() throws Exception {
-    Fixture.setUp();
-    registry = RemoteObjectAdapterRegistry.getInstance();
-  }
-
-  @Override
-  protected void tearDown() throws Exception {
-    Fixture.tearDown();
-  }
-  
-  public void testInstanceIsSingleton() {
-    assertSame( registry, RemoteObjectAdapterRegistry.getInstance() );
-  }
-  
-  public void testCreateAddsAdapter() {
-    RemoteObjectAdapter adapter = mock( RemoteObjectAdapter.class );
-    
-    registry.register( adapter );
-    
-    List<RemoteObjectAdapter> adapters = registry.getAdapters();
-    assertTrue( adapters.contains( adapter ) );
-  }
-  
-  public void testRemoveAdapterRemovesItFromAdapters() {
-    RemoteObjectAdapter adapter = mock( RemoteObjectAdapter.class );
-    registry.register( adapter );
-
-    registry.remove( adapter );
-    
-    List<RemoteObjectAdapter> adapters = registry.getAdapters();
-    assertFalse( adapters.contains( adapter ) );
-  }
-  
-  public void testHoldsAllAdapters() {
-    registry.register( mock( RemoteObjectAdapter.class ) );
-    registry.register( mock( RemoteObjectAdapter.class ) );
-    registry.register( mock( RemoteObjectAdapter.class ) );
-    
-    List<RemoteObjectAdapter> adapters = registry.getAdapters();
-    assertEquals( 3, adapters.size() );
-  }
-  
-  public void testAdaptersIsSafeCopy() {
-    List<RemoteObjectAdapter> adapters = registry.getAdapters();
-    
-    assertNotSame( adapters, registry.getAdapters() );
-  }
-  
-}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl_Test.java
index 9c77c7f..d8e60c2 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectDefinitionImpl_Test.java
@@ -11,14 +11,11 @@
 package org.eclipse.rap.rwt.internal.protocol;
 
 import static org.mockito.Mockito.mock;
-
-import java.util.List;
-
 import junit.framework.TestCase;
 
-import org.eclipse.rap.rwt.remote.Call;
-import org.eclipse.rap.rwt.remote.EventNotification;
-import org.eclipse.rap.rwt.remote.Property;
+import org.eclipse.rap.rwt.remote.EventHandler;
+import org.eclipse.rap.rwt.remote.MethodHandler;
+import org.eclipse.rap.rwt.remote.PropertyHandler;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 
 
@@ -44,35 +41,41 @@
     try {
       new RemoteObjectDefinitionImpl<Object>( null );
       fail();
-    } catch( IllegalArgumentException expected ) {}
+    } catch( NullPointerException expected ) {}
   }
   
   @SuppressWarnings( "unchecked" )
   public void testHasProperty() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    Property property = mock( Property.class );
+    PropertyHandler property = mock( PropertyHandler.class );
     
-    definition.addProperty( property );
+    definition.addProperty( "foo", property );
     
-    List<Property<Object>> properties = definition.getProperties();
-    assertTrue( properties.contains( property ) );
-    assertEquals( 1, properties.size() );
-  }
-  
-  @SuppressWarnings( "unchecked" )
-  public void testPropertiesIsSafeCopy() {
-    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    definition.addProperty( mock( Property.class ) );
-    
-    List<Property<Object>> properties = definition.getProperties();
-
-    assertNotSame( properties, definition.getProperties() );
+    assertNotNull( definition.getProperty( "foo" ) );
   }
   
   public void testFailsWithNullProperty() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
     try {
-      definition.addProperty( null );
+      definition.addProperty( "foo", null );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithNullPropertyName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addProperty( null, mock( PropertyHandler.class ) );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithEmptyPropertyName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addProperty( "", mock( PropertyHandler.class ) );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
@@ -80,29 +83,35 @@
   @SuppressWarnings( "unchecked" )
   public void testHasEvent() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    EventNotification event = mock( EventNotification.class );
+    EventHandler event = mock( EventHandler.class );
     
-    definition.addEvent( event );
+    definition.addEventHandler( "foo", event );
     
-    List<EventNotification<Object>> events = definition.getEvents();
-    assertTrue( events.contains( event ) );
-    assertEquals( 1, events.size() );
-  }
-  
-  @SuppressWarnings( "unchecked" )
-  public void testEventsIsSafeCopy() {
-    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    definition.addEvent( mock( EventNotification.class ) );
-    
-    List<EventNotification<Object>> events = definition.getEvents();
-    
-    assertNotSame( events, definition.getEvents() );
+    assertNotNull( definition.getEventHandler( "foo" ) );
   }
   
   public void testFailsWithNullEvent() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
     try {
-      definition.addEvent( null );
+      definition.addEventHandler( "foo", null );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithNullEventName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addEventHandler( null, mock( EventHandler.class ) );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithEmptyEventName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addEventHandler( "", mock( EventHandler.class ) );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
@@ -110,29 +119,35 @@
   @SuppressWarnings( "unchecked" )
   public void testHasCall() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    Call call = mock( Call.class );
+    MethodHandler method = mock( MethodHandler.class );
     
-    definition.addCall( call );
+    definition.addMethod( "foo", method );
     
-    List<Call<Object>> calls = definition.getCalls();
-    assertTrue( calls.contains( call ) );
-    assertEquals( 1, calls.size() );
-  }
-  
-  @SuppressWarnings( "unchecked" )
-  public void testCallsIsSafeCopy() {
-    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
-    definition.addCall( mock( Call.class ) );
-    
-    List<Call<Object>> calls = definition.getCalls();
-    
-    assertNotSame( calls, definition.getCalls() );
+    assertNotNull( definition.getMethod( "foo" ) );
   }
   
   public void testFailsWithNullCall() {
     RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
     try {
-      definition.addCall( null );
+      definition.addMethod( "foo", null );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithNullMethodName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addMethod( null, mock( MethodHandler.class ) );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  @SuppressWarnings( "unchecked" )
+  public void testFailsWithEmptyMethodName() {
+    RemoteObjectDefinitionImpl<Object> definition = new RemoteObjectDefinitionImpl<Object>( Object.class );
+    try {
+      definition.addMethod( "", mock( MethodHandler.class ) );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl_Test.java
new file mode 100644
index 0000000..b061e8f
--- /dev/null
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectImpl_Test.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.rwt.internal.protocol;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;
+import org.eclipse.rap.rwt.lifecycle.PhaseId;
+import org.eclipse.rap.rwt.remote.RemoteObject;
+import org.eclipse.rap.rwt.testfixture.Fixture;
+
+
+public class RemoteObjectImpl_Test extends TestCase {
+
+  @Override
+  protected void setUp() throws Exception {
+    Fixture.setUp();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    Fixture.tearDown();
+  }
+
+  public void testNewId() {
+    String id1 = new RemoteObjectImpl<Object>( new Object(), null ).getId();
+    String id2 = new RemoteObjectImpl<Object>( new Object(), null ).getId();
+
+    assertFalse( id1.equals( id2 ) );
+  }
+
+  public void testSameId() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( new Object(), null );
+    String id1 = remoteObject.getId();
+    String id2 = remoteObject.getId();
+
+    assertEquals( id1, id2 );
+  }
+
+  public void testPrefix() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( new Object(), null );
+    String id1 = remoteObject.getId();
+
+    assertTrue( id1.startsWith( "o" ) );
+  }
+
+  public void testCustomPrefix() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>(  new Object(), null, "gl" );
+    String id1 = remoteObject.getId();
+
+    assertTrue( id1.startsWith( "gl" ) );
+  }
+  
+  public void testRegistersSpecifier() {
+    new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    RemoteObjectSynchronizer<TestRemoteObject> synchronizer 
+      = RemoteObjectSynchronizerRegistry.getInstance().getSynchronizerForType( TestRemoteObject.class );
+    assertNotNull( synchronizer );
+  }
+  
+  public void testIsNotInitializedByDefault() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( new Object(), null );
+    
+    assertFalse( remoteObject.isInitialized() );
+  }
+  
+  public void testIsInitialized() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( new Object(), null );
+    
+    remoteObject.setInitialized( true );
+    
+    assertTrue( remoteObject.isInitialized() );
+  }
+  
+  public void testIsNotDestroyedByDefault() {
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( new Object(), null );
+    
+    assertFalse( remoteObject.isDestroyed() );
+  }
+  
+  public void testKeepsRemoteObject() {
+    Object object = new Object();
+    RemoteObjectImpl<Object> remoteObject = new RemoteObjectImpl<Object>( object, null );
+    
+    assertSame( object, remoteObject.getObject() );
+  }
+  
+  public void testCreationRegistersInstanceInRegistry() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+
+    List<RemoteObject> remoteObjects = RemoteObjectRegistry.getInstance().getRemoteObjects();
+    assertTrue( remoteObjects.contains( remoteObject ) );
+  }
+  
+  public void testIsDestroyed() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    remoteObject.destroy();
+    
+    assertTrue( remoteObject.isDestroyed() );
+  }
+  
+  public void testQueuesCalls() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "foo", "bar" );
+    
+    remoteObject.call( "fooBar", properties );
+    
+    List<Runnable> calls = remoteObject.getRenderQueue();
+    assertEquals( 1, calls.size() );
+  }
+  
+  public void testQueueSets() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+     
+    remoteObject.set( "foo", "bar" );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertEquals( 1, sets.size() );
+  }
+  
+  public void testQueueSetsWithoutPhase() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+    = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    remoteObject.set( "foo", "bar" );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertEquals( 1, sets.size() );
+  }
+  
+  public void testQueueListens() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+    = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    remoteObject.listen( "foo", true );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertEquals( 1, sets.size() );
+  }
+  
+  public void testQueueListensOnlyIfChanged() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+    = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    remoteObject.listen( "foo", true );
+    remoteObject.listen( "foo", true );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertEquals( 1, sets.size() );
+  }
+  
+  public void testQueueListensIfChanged() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+    = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    remoteObject.listen( "foo", true );
+    remoteObject.listen( "foo", false );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertEquals( 2, sets.size() );
+  }
+  
+  public void testDoesNotQueueSetsInReadData() {
+    Fixture.fakePhase( PhaseId.READ_DATA );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+     
+    remoteObject.set( "foo", "bar" );
+    
+    List<Runnable> sets = remoteObject.getRenderQueue();
+    assertTrue( sets.isEmpty() );
+  }
+  
+  public void testQueueIsClearable() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "foo", "bar" );
+    remoteObject.call( "fooBar", properties );
+
+    remoteObject.getRenderQueue().clear();
+    
+    List<Runnable> operations = remoteObject.getRenderQueue();
+    assertTrue( operations.isEmpty() );
+  }
+  
+  public void testQueuesCallsFailsWithNullProperty() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "foo", "bar" );
+    
+    try {
+      remoteObject.call( null, properties );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testQueuesCallsFailsWithEmptyProperty() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+    = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "foo", "bar" );
+    
+    try {
+      remoteObject.call( "", properties );
+      fail();
+    } catch( IllegalArgumentException expected ) {}
+  }
+  
+  public void testQueueSetsFailsWithNullName() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+     
+    try {
+      remoteObject.set( null, "bar" );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testQueueSetsFailsWithEmptyName() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    try {
+      remoteObject.set( "", "bar" );
+      fail();
+    } catch( IllegalArgumentException expected ) {}
+  }
+  
+  public void testQueueSetsFailsWithNullValue() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    try {
+      remoteObject.set( "foo", null );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testQueueListensFailsWithNullName() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    try {
+      remoteObject.listen( null, true );
+      fail();
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testQueueListensFailsWithEmptyName() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>(  new TestRemoteObject(), TestRemoteObjectSpecification.class, "gl" );
+    
+    try {
+      remoteObject.listen( "", true );
+      fail();
+    } catch( IllegalArgumentException expected ) {}
+  }
+  
+}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry_Test.java
new file mode 100644
index 0000000..5f4f5ad
--- /dev/null
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectRegistry_Test.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.rwt.internal.protocol;
+
+import static org.mockito.Mockito.mock;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.rap.rwt.remote.RemoteObject;
+import org.eclipse.rap.rwt.testfixture.Fixture;
+
+
+public class RemoteObjectRegistry_Test extends TestCase {
+  
+  private RemoteObjectRegistry registry;
+
+  @Override
+  protected void setUp() throws Exception {
+    Fixture.setUp();
+    registry = RemoteObjectRegistry.getInstance();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    Fixture.tearDown();
+  }
+  
+  public void testInstanceIsSingleton() {
+    assertSame( registry, RemoteObjectRegistry.getInstance() );
+  }
+  
+  public void testCreateAddsAdapter() {
+    RemoteObject remoteObject = mock( RemoteObject.class );
+    
+    registry.register( remoteObject );
+    
+    List<RemoteObject> remoteObjects = registry.getRemoteObjects();
+    assertTrue( remoteObjects.contains( remoteObject ) );
+  }
+  
+  public void testRemoveAdapterRemovesItFromAdapters() {
+    RemoteObject remoteObject = mock( RemoteObject.class );
+    registry.register( remoteObject );
+
+    registry.remove( remoteObject );
+    
+    List<RemoteObject> remoteObjects = registry.getRemoteObjects();
+    assertFalse( remoteObjects.contains( remoteObject ) );
+  }
+  
+  public void testHoldsAllAdapters() {
+    registry.register( mock( RemoteObject.class ) );
+    registry.register( mock( RemoteObject.class ) );
+    registry.register( mock( RemoteObject.class ) );
+    
+    List<RemoteObject> remoteObjects = registry.getRemoteObjects();
+    assertEquals( 3, remoteObjects.size() );
+  }
+  
+  public void testAdaptersIsSafeCopy() {
+    List<RemoteObject> remoteObjects = registry.getRemoteObjects();
+    
+    assertNotSame( remoteObjects, registry.getRemoteObjects() );
+  }
+  
+}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry_Test.java
index fcfc4dc..943b5c8 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizerRegistry_Test.java
@@ -16,7 +16,7 @@
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecifier;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 
 
@@ -42,9 +42,9 @@
   public void testDefinesDefinition() {
     TestRemoteObject remoteObject = new TestRemoteObject();
     Map<String, Object> setProperties = new HashMap<String, Object>();
-    setProperties.put( TestRemoteObjectSpecifier.TEST_PROPERTY, "foo" );
+    setProperties.put( TestRemoteObjectSpecification.TEST_PROPERTY, "foo" );
     
-    registry.register( TestRemoteObject.class, TestRemoteObjectSpecifier.class );
+    registry.register( TestRemoteObject.class, TestRemoteObjectSpecification.class );
     RemoteObjectSynchronizer<TestRemoteObject> synchronizer = registry.getSynchronizerForType( TestRemoteObject.class );
     synchronizer.set( remoteObject, setProperties );
     
@@ -53,20 +53,20 @@
   }
   
   public void testGetReigsteredSynchronizer() {
-    registry.register( TestRemoteObject.class, TestRemoteObjectSpecifier.class );
+    registry.register( TestRemoteObject.class, TestRemoteObjectSpecification.class );
     
     assertNotNull( registry.getSynchronizerForType( TestRemoteObject.class ) );
   }
   
   public void testSynchronizerHasSameTypeAsRegisteredWith() {
-    registry.register( TestRemoteObject.class, TestRemoteObjectSpecifier.class );
+    registry.register( TestRemoteObject.class, TestRemoteObjectSpecification.class );
     
     RemoteObjectSynchronizer<TestRemoteObject> synchronizer = registry.getSynchronizerForType( TestRemoteObject.class );
     assertEquals( TestRemoteObject.class, synchronizer.getType() );
   }
   
   public void testIgnoresRegisteringOfTypesTwice() {
-    registry.register( TestRemoteObject.class, TestRemoteObjectSpecifier.class );
-    registry.register( TestRemoteObject.class, TestRemoteObjectSpecifier.class );
+    registry.register( TestRemoteObject.class, TestRemoteObjectSpecification.class );
+    registry.register( TestRemoteObject.class, TestRemoteObjectSpecification.class );
   }
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer_Test.java
index 6a74966..11c170b 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjectSynchronizer_Test.java
@@ -16,7 +16,7 @@
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecifier;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.rap.rwt.testfixture.Message.CallOperation;
@@ -27,18 +27,18 @@
 
 public class RemoteObjectSynchronizer_Test extends TestCase {
   
-  private TestRemoteObject remoteObject;
+  private TestRemoteObject object;
   private RemoteObjectSynchronizer<TestRemoteObject> synchronizer;
 
   @Override
   public void setUp() throws Exception {
     Fixture.setUp();
-    RemoteObjectDefinitionImpl<TestRemoteObject> configuration 
+    RemoteObjectDefinitionImpl<TestRemoteObject> definition 
       = new RemoteObjectDefinitionImpl<TestRemoteObject>( TestRemoteObject.class );
-    TestRemoteObjectSpecifier initializer = new TestRemoteObjectSpecifier();
-    initializer.define( configuration );
-    synchronizer = new RemoteObjectSynchronizer<TestRemoteObject>( configuration, TestRemoteObjectSpecifier.TEST_TYPE );
-    remoteObject = new TestRemoteObject();
+    TestRemoteObjectSpecification specification = new TestRemoteObjectSpecification();
+    specification.define( definition );
+    synchronizer = new RemoteObjectSynchronizer<TestRemoteObject>( definition, TestRemoteObjectSpecification.TEST_TYPE );
+    object = new TestRemoteObject();
   }
   
   @Override
@@ -48,21 +48,41 @@
   
   public void testSetsProperties() {
     Map<String, Object> properties = new HashMap<String, Object>();
-    properties.put( TestRemoteObjectSpecifier.TEST_PROPERTY, "fooBar" );
+    properties.put( TestRemoteObjectSpecification.TEST_PROPERTY, "fooBar" );
     
-    synchronizer.set( remoteObject, properties );
+    synchronizer.set( object, properties );
     
-    assertEquals( "fooBar", remoteObject.test );
+    assertEquals( "fooBar", object.test );
+  }
+  
+  public void testSetFailsWithNotDefinedProperties() {
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "42", "fooBar" );
+    
+    try {
+      synchronizer.set( object, properties );
+      fail();
+    } catch( IllegalStateException expected ) {}
   }
   
   public void testCallsObject() {
     Map<String, Object> properties = new HashMap<String, Object>();
     properties.put( "foo", "bar" );
     
-    synchronizer.call( remoteObject, TestRemoteObjectSpecifier.TEST_CALL, properties );
+    synchronizer.call( object, TestRemoteObjectSpecification.TEST_CALL, properties );
     
-    assertNotNull( remoteObject.callProperties );
-    assertEquals( "bar", remoteObject.callProperties.get( "foo" ) );
+    assertNotNull( object.callProperties );
+    assertEquals( "bar", object.callProperties.get( "foo" ) );
+  }
+  
+  public void testCallFailsWithNotDefinedmethod() {
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "42", "fooBar" );
+    
+    try {
+      synchronizer.call( object, "42", properties );
+      fail();
+    } catch( IllegalStateException expected ) {}
   }
   
   public void testNotifiesObjectInProcessActionPhase() {
@@ -70,78 +90,89 @@
     Map<String, Object> properties = new HashMap<String, Object>();
     properties.put( "foo", "bar" );
     
-    synchronizer.notify( remoteObject, TestRemoteObjectSpecifier.TEST_EVENT, properties );
+    synchronizer.notify( object, TestRemoteObjectSpecification.TEST_EVENT, properties );
     
-    assertNotNull( remoteObject.eventProperties );
-    assertEquals( "bar", remoteObject.eventProperties.get( "foo" ) );
+    assertNotNull( object.eventProperties );
+    assertEquals( "bar", object.eventProperties.get( "foo" ) );
+  }
+  
+  public void testNotifyFailsWithNotDefinedEvent() {
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
+    Map<String, Object> properties = new HashMap<String, Object>();
+    properties.put( "42", "fooBar" );
+    
+    try {
+      synchronizer.notify( object, "42", properties );
+      fail();
+    } catch( IllegalStateException expected ) {}
   }
   
   public void testCreateRendersCreateOperation() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
     
-    synchronizer.create( adapter );
+    synchronizer.create( remoteObject );
     
-    CreateOperation createOperation = Fixture.getProtocolMessage().findCreateOperation( adapter.getId() );
-    assertEquals( TestRemoteObjectSpecifier.TEST_TYPE, createOperation.getType() );
+    CreateOperation createOperation = Fixture.getProtocolMessage().findCreateOperation( remoteObject.getId() );
+    assertEquals( TestRemoteObjectSpecification.TEST_TYPE, createOperation.getType() );
   }
   
   public void testDestroyRendersDestroyOperation() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
     
-    synchronizer.destroy( adapter );
+    synchronizer.destroy( remoteObject );
     
-    DestroyOperation destroyOperation = Fixture.getProtocolMessage().findDestroyOperation( adapter.getId() );
+    DestroyOperation destroyOperation = Fixture.getProtocolMessage().findDestroyOperation( remoteObject.getId() );
     assertNotNull( destroyOperation );
   }
   
   public void testRendersRenderQueueFromAdapterWithSets() {
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
-    adapter.set( TestRemoteObjectSpecifier.TEST_PROPERTY, "foo" );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
+    remoteObject.set( TestRemoteObjectSpecification.TEST_PROPERTY, "foo" );
     
-    synchronizer.render( adapter );
+    synchronizer.render( remoteObject );
     
-    Object property = Fixture.getProtocolMessage().findSetProperty( adapter.getId(), 
-                                                                    TestRemoteObjectSpecifier.TEST_PROPERTY );
+    Object property = Fixture.getProtocolMessage().findSetProperty( remoteObject.getId(), 
+                                                                    TestRemoteObjectSpecification.TEST_PROPERTY );
     assertEquals( "foo", property );
   }
   
   public void testRendersRenderQueueFromAdapterWithCalls() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
     Map<String, Object> properties = new HashMap<String, Object>();
     properties.put( "foo", "bar" );
-    adapter.call( "fooBar", properties );
+    remoteObject.call( "fooBar", properties );
     
-    synchronizer.render( adapter );
+    synchronizer.render( remoteObject );
     
-    CallOperation operation = Fixture.getProtocolMessage().findCallOperation( adapter.getId(), "fooBar" );
+    CallOperation operation = Fixture.getProtocolMessage().findCallOperation( remoteObject.getId(), "fooBar" );
     assertEquals( "bar", operation.getProperty( "foo" ) );
   }
   
   public void testRendersRenderQueueFromAdapterWithListen() {
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
-    adapter.listen( "foo", true );
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
+    remoteObject.listen( "foo", true );
     
-    synchronizer.render( adapter );
+    synchronizer.render( remoteObject );
     
-    ListenOperation operation = Fixture.getProtocolMessage().findListenOperation( adapter.getId(), "foo" );
+    ListenOperation operation = Fixture.getProtocolMessage().findListenOperation( remoteObject.getId(), "foo" );
     assertNotNull( operation );
   }
   
   public void testClearsRenderQueueFromAdapterAfterRender() {
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    RemoteObjectAdapterImpl<TestRemoteObject> adapter  
-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, null );
-    adapter.set( TestRemoteObjectSpecifier.TEST_PROPERTY, "foo" );
+    RemoteObjectImpl<TestRemoteObject> remoteObject  
+      = new RemoteObjectImpl<TestRemoteObject>( object, null );
+    remoteObject.set( TestRemoteObjectSpecification.TEST_PROPERTY, "foo" );
     
-    synchronizer.render( adapter );
+    synchronizer.render( remoteObject );
     
-    assertTrue( adapter.getRenderQueue().isEmpty() );
+    assertTrue( remoteObject.getRenderQueue().isEmpty() );
   }
   
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects_Test.java
index 91ff26d..baefcc2 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteObjects_Test.java
@@ -17,9 +17,9 @@
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecifier;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.rap.rwt.testfixture.Message.CreateOperation;
 import org.eclipse.rap.rwt.testfixture.Message.DestroyOperation;
@@ -27,19 +27,19 @@
 
 public class RemoteObjects_Test extends TestCase {
   
-  private RemoteObjectAdapterImpl adapter;
+  private RemoteObjectImpl adapter;
   private ProtocolTestUtil.TestRemoteObject remoteObject;
 
   @Override
   protected void setUp() throws Exception {
     Fixture.setUp();
     mockRemoteObjectAdapter();
-    RemoteObjectAdapterRegistry.getInstance().register( adapter );
+    RemoteObjectRegistry.getInstance().register( adapter );
   }
 
   private void mockRemoteObjectAdapter() {
     remoteObject = new TestRemoteObject();
-    adapter = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, TestRemoteObjectSpecifier.class, "o" );
+    adapter = new RemoteObjectImpl<TestRemoteObject>( remoteObject, TestRemoteObjectSpecification.class, "o" );
   }
   
   @Override
@@ -49,7 +49,7 @@
   
   public void testReadDataDispatchesSetProperty() {
     Map<String, Object> parameters = new HashMap<String, Object>();
-    parameters.put( TestRemoteObjectSpecifier.TEST_PROPERTY, "fooBar" );
+    parameters.put( TestRemoteObjectSpecification.TEST_PROPERTY, "fooBar" );
     Fixture.fakeSetOperation( adapter.getId(), parameters );
     
     RemoteObjects.readData();
@@ -61,7 +61,7 @@
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
     Map<String, Object> parameters = new HashMap<String, Object>();
     parameters.put( "foo", "bar" );
-    Fixture.fakeNotifyOperation( adapter.getId(), TestRemoteObjectSpecifier.TEST_EVENT, parameters );
+    Fixture.fakeNotifyOperation( adapter.getId(), TestRemoteObjectSpecification.TEST_EVENT, parameters );
     
     RemoteObjects.readData();
     
@@ -74,7 +74,7 @@
   public void testReadDataDispatchesCall() {
     Map<String, Object> parameters = new HashMap<String, Object>();
     parameters.put( "foo", "bar" );
-    Fixture.fakeCallOperation( adapter.getId(), TestRemoteObjectSpecifier.TEST_CALL, parameters );
+    Fixture.fakeCallOperation( adapter.getId(), TestRemoteObjectSpecification.TEST_CALL, parameters );
     
     RemoteObjects.readData();
     
@@ -88,7 +88,7 @@
     RemoteObjects.render();
     
     CreateOperation createOperation = Fixture.getProtocolMessage().findCreateOperation( adapter.getId() );
-    assertEquals( TestRemoteObjectSpecifier.TEST_TYPE, createOperation.getType() );
+    assertEquals( TestRemoteObjectSpecification.TEST_TYPE, createOperation.getType() );
   }
   
   public void testRendersDestroyOperation() {
@@ -105,31 +105,31 @@
     
     RemoteObjects.render();
     
-    List<RemoteObjectAdapter> adapters = RemoteObjectAdapterRegistry.getInstance().getAdapters();
+    List<RemoteObject> adapters = RemoteObjectRegistry.getInstance().getRemoteObjects();
     assertFalse( adapters.contains( adapter ) );
   }
   
   public void testRendersRenderQueue() {
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
     adapter.setInitialized( true );
-    adapter.set( TestRemoteObjectSpecifier.TEST_PROPERTY, "hmpf" );
+    adapter.set( TestRemoteObjectSpecification.TEST_PROPERTY, "hmpf" );
     
     RemoteObjects.render();
     
     Object property = Fixture.getProtocolMessage().findSetProperty( adapter.getId(), 
-                                                                    TestRemoteObjectSpecifier.TEST_PROPERTY );
+                                                                    TestRemoteObjectSpecification.TEST_PROPERTY );
     assertNotNull( property );
     assertEquals( "hmpf", property );
   }
   
   public void testRendersInitialValue() {
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    adapter.set( TestRemoteObjectSpecifier.TEST_PROPERTY, "foo" );
+    adapter.set( TestRemoteObjectSpecification.TEST_PROPERTY, "foo" );
     
     RemoteObjects.render();
     
     CreateOperation createOperation = Fixture.getProtocolMessage().findCreateOperation( adapter.getId() );
-    Object property = createOperation.getProperty( TestRemoteObjectSpecifier.TEST_PROPERTY );
+    Object property = createOperation.getProperty( TestRemoteObjectSpecification.TEST_PROPERTY );
     assertEquals( "foo", property );
   }
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteUtil_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteUtil_Test.java
index 6f86dd3..8b8765d 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteUtil_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/protocol/RemoteUtil_Test.java
@@ -10,21 +10,13 @@
  ******************************************************************************/
 package org.eclipse.rap.rwt.internal.protocol;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import java.util.HashMap;
-import java.util.Map;
-
 import junit.framework.TestCase;
 
-import org.eclipse.rap.rwt.remote.Call;
-import org.eclipse.rap.rwt.remote.EventNotification;
-import org.eclipse.rap.rwt.remote.Property;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;
+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;
+import org.eclipse.rap.rwt.remote.PropertyHandler;
 import org.eclipse.rap.rwt.remote.RemoteUtil;
-import org.eclipse.rap.rwt.remote.RemoteUtil.CallHandler;
-import org.eclipse.rap.rwt.remote.RemoteUtil.EventNotificationHandler;
-import org.eclipse.rap.rwt.remote.RemoteUtil.PropertyHandler;
+import org.eclipse.rap.rwt.testfixture.Fixture;
 
 
 public class RemoteUtil_Test extends TestCase {
@@ -33,184 +25,176 @@
 
   @Override
   protected void setUp() throws Exception {
+    Fixture.setUp();
     testObject = new TestObject();
   }
   
-  public void testSetsBooleanProperty() {
-    Property<TestObject> property = RemoteUtil.createBooleanProperty( TestObject.class, "boolProperty" );
+  @Override
+  protected void tearDown() throws Exception {
+    Fixture.tearDown();
+  }
+  
+  public void testCreateRemoteObject() {
+    RemoteObjectImpl<TestRemoteObject> remoteObject 
+      = RemoteUtil.createRemoteObject( new TestRemoteObject(), TestRemoteObjectSpecification.class );
     
-    property.set( testObject, Boolean.TRUE );
+    assertNotNull( remoteObject );
+  }
+  
+  public void testCreateRemoteObjectFailsWithNullObject() {
+    try {
+      RemoteUtil.createRemoteObject( null, TestRemoteObjectSpecification.class );
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testCreateRemoteObjectFailsWithNullSpecification() {
+    try {
+      RemoteUtil.createRemoteObject( new TestRemoteObject(), null);
+    } catch( NullPointerException expected ) {}
+  }
+  
+  public void testSetsBooleanPropertyHandler() {
+    PropertyHandler<TestObject> handler = RemoteUtil.createBooleanPropertyHandler( TestObject.class, "boolProperty" );
+    
+    handler.set( testObject, Boolean.TRUE );
     
     assertTrue( testObject.boolProperty );
   }
   
-  public void testSetsStringProperty() {
-    Property<TestObject> property = RemoteUtil.createStringProperty( TestObject.class, "stringProperty" );
+  public void testSetsStringPropertyHandler() {
+    PropertyHandler<TestObject> handler = RemoteUtil.createStringPropertyHandler( TestObject.class, "stringProperty" );
     
-    property.set( testObject, "foo" );
+    handler.set( testObject, "foo" );
     
     assertEquals( "foo", testObject.stringProperty );
   }
   
-  public void testSetsIntProperty() {
-    Property<TestObject> property = RemoteUtil.createIntProperty( TestObject.class, "intProperty" );
+  public void testSetsIntPropertyHandler() {
+    PropertyHandler<TestObject> handler = RemoteUtil.createIntPropertyHandler( TestObject.class, "intProperty" );
     
-    property.set( testObject, Integer.valueOf( 42 ) );
+    handler.set( testObject, Integer.valueOf( 42 ) );
     
     assertEquals( 42, testObject.intProperty );
   }
   
-  public void testSetsDoubleProperty() {
-    Property<TestObject> property = RemoteUtil.createDoubleProperty( TestObject.class, "doubleProperty" );
+  public void testSetsDoublePropertyHandler() {
+    PropertyHandler<TestObject> handler = RemoteUtil.createDoublePropertyHandler( TestObject.class, "doubleProperty" );
     
-    property.set( testObject, Double.valueOf( 42.42 ) );
+    handler.set( testObject, Double.valueOf( 42.42 ) );
     
     assertEquals( 42.42, testObject.doubleProperty, 0 );
   }
   
-  public void testSetsCustomTypeProperty() {
+  public void testSetsCustomTypePropertyHandler() {
     TestObject paramObject = new TestObject();
-    Property<TestObject> property = RemoteUtil.createObjectProperty( TestObject.class, "objectProperty" );
+    PropertyHandler<TestObject> handler = RemoteUtil.createObjectPropertyHandler( TestObject.class, "objectProperty" );
     
-    property.set( testObject, paramObject );
+    handler.set( testObject, paramObject );
     
     assertEquals( paramObject, testObject.objectProperty );
   }
   
-  @SuppressWarnings( "unchecked" )
-  public void testSetsCustomProperty() {
-    TestObject paramObject = new TestObject();
-    PropertyHandler<TestObject> customPropertyHandler = mock( PropertyHandler.class );
-    Property<TestObject> property = RemoteUtil.createProperty( "objectProperty", customPropertyHandler );
-    
-    property.set( testObject, paramObject );
-    
-    verify( customPropertyHandler ).set( testObject, paramObject );
-  }
-  
-  @SuppressWarnings( "unchecked" )
-  public void testNotifiesCustomEventNotification() {
-    EventNotificationHandler<TestObject> handler = mock( EventNotificationHandler.class );
-    EventNotification<TestObject> notification = RemoteUtil.createEventNotification( "foo", handler );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    
-    notification.notify( testObject, properties );
-    
-    verify( handler ).notify( testObject, properties );
-  }
-  
-  @SuppressWarnings( "unchecked" )
-  public void testCallsCustomCall() {
-    CallHandler<TestObject> handler = mock( CallHandler.class );
-    Call<TestObject> call = RemoteUtil.createCall( "foo", handler );
-    Map<String, Object> properties = new HashMap<String, Object>();
-    
-    call.call( testObject, properties );
-    
-    verify( handler ).call( testObject, properties );
-  }
-  
-  public void testCreateBooleanPropertyFailsWithNullPropertyName() {
+  public void testCreateBooleanPropertyHandlerFailsWithNullPropertyName() {
     try {
-      RemoteUtil.createBooleanProperty( TestObject.class, null );
+      RemoteUtil.createBooleanPropertyHandler( TestObject.class, null );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateStringPropertyFailsWithNullPropertyName() {
+  public void testCreateStringPropertyHandlerFailsWithNullPropertyName() {
     try {
-      RemoteUtil.createStringProperty( TestObject.class, null );
+      RemoteUtil.createStringPropertyHandler( TestObject.class, null );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateIntPropertyFailsWithNullPropertyName() {
+  public void testCreateIntPropertyHandlerFailsWithNullPropertyName() {
     try {
-      RemoteUtil.createIntProperty( TestObject.class, null );
+      RemoteUtil.createIntPropertyHandler( TestObject.class, null );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateDoublePropertyFailsWithNullPropertyName() {
+  public void testCreateDoublePropertyHandlerFailsWithNullPropertyName() {
     try {
-      RemoteUtil.createDoubleProperty( TestObject.class, null );
+      RemoteUtil.createDoublePropertyHandler( TestObject.class, null );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateObjectPropertyFailsWithNullPropertyName() {
+  public void testCreateObjectPropertyHandlerFailsWithNullPropertyName() {
     try {
-      RemoteUtil.createObjectProperty( TestObject.class, null );
+      RemoteUtil.createObjectPropertyHandler( TestObject.class, null );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateBooleanPropertyFailsWithNullType() {
+  public void testCreateBooleanPropertyHandlerFailsWithNullType() {
     try {
-      RemoteUtil.createBooleanProperty( null, "test" );
+      RemoteUtil.createBooleanPropertyHandler( null, "test" );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateStringPropertyFailsWithNullType() {
+  public void testCreateStringPropertyHandlerFailsWithNullType() {
     try {
-      RemoteUtil.createStringProperty( null, "test" );
+      RemoteUtil.createStringPropertyHandler( null, "test" );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateIntPropertyFailsWithNullType() {
+  public void testCreateIntPropertyHandlerFailsWithNullType() {
     try {
-      RemoteUtil.createIntProperty( null, "test" );
+      RemoteUtil.createIntPropertyHandler( null, "test" );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateDoublePropertyFailsWithNullType() {
+  public void testCreateDoublePropertyHandlerFailsWithNullType() {
     try {
-      RemoteUtil.createDoubleProperty( null, "test" );
+      RemoteUtil.createDoublePropertyHandler( null, "test" );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateObjectPropertyFailsWithNullType() {
+  public void testCreateObjectPropertyHandlerFailsWithNullType() {
     try {
-      RemoteUtil.createObjectProperty( null, "test" );
+      RemoteUtil.createObjectPropertyHandler( null, "test" );
       fail();
     } catch( NullPointerException expected ) {}
   }
   
-  public void testCreateBooleanPropertyFailsWithEmptyPropertyName() {
+  public void testCreateBooleanPropertyHandlerFailsWithEmptyPropertyName() {
     try {
-      RemoteUtil.createBooleanProperty( TestObject.class, "" );
+      RemoteUtil.createBooleanPropertyHandler( TestObject.class, "" );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
   
-  public void testCreateStringPropertyFailsWithEmptyPropertyName() {
+  public void testCreateStringPropertyHandlerFailsWithEmptyPropertyName() {
     try {
-      RemoteUtil.createStringProperty( TestObject.class, "" );
+      RemoteUtil.createStringPropertyHandler( TestObject.class, "" );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
   
-  public void testCreateIntPropertyFailsWithEmptyPropertyName() {
+  public void testCreateIntPropertyHandlerFailsWithEmptyPropertyName() {
     try {
-      RemoteUtil.createIntProperty( TestObject.class, "" );
+      RemoteUtil.createIntPropertyHandler( TestObject.class, "" );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
   
-  public void testCreateDoublePropertyFailsWithEmptyPropertyName() {
+  public void testCreateDoublePropertyHandlerFailsWithEmptyPropertyName() {
     try {
-      RemoteUtil.createDoubleProperty( TestObject.class, "" );
+      RemoteUtil.createDoublePropertyHandler( TestObject.class, "" );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
   
-  public void testCreateObjectPropertyFailsWithEmptyPropertyName() {
+  public void testCreateObjectPropertyHandlerFailsWithEmptyPropertyName() {
     try {
-      RemoteUtil.createObjectProperty( TestObject.class, "" );
+      RemoteUtil.createObjectPropertyHandler( TestObject.class, "" );
       fail();
     } catch( IllegalArgumentException expected ) {}
   }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/WidgetAdapter_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/WidgetAdapter_Test.java
index c69dd9b..107a667 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/WidgetAdapter_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/WidgetAdapter_Test.java
@@ -20,7 +20,7 @@
 import org.eclipse.rap.rwt.internal.lifecycle.*;
 import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.*;
@@ -197,7 +197,7 @@
     WidgetAdapter adapter = new WidgetAdapter();
     Adaptable gc = adapter.getGCForClient();
 
-    assertNotNull( gc.getAdapter( RemoteObjectAdapter.class ) );
+    assertNotNull( gc.getAdapter( RemoteObject.class ) );
   }
 
   public void testGetGCForClientAdapterWithInvalidClass() {
@@ -211,7 +211,7 @@
     WidgetAdapter adapter = new WidgetAdapter();
     Adaptable gc = adapter.getGCForClient();
 
-    String id = gc.getAdapter( RemoteObjectAdapter.class ).getId();
+    String id = gc.getAdapter( RemoteObject.class ).getId();
 
     assertTrue( id.startsWith( "gc" ) );
   }
@@ -220,8 +220,8 @@
     WidgetAdapter adapter = new WidgetAdapter();
     Adaptable gc = adapter.getGCForClient();
 
-    String id1 = gc.getAdapter( RemoteObjectAdapter.class ).getId();
-    String id2 = gc.getAdapter( RemoteObjectAdapter.class ).getId();
+    String id1 = gc.getAdapter( RemoteObject.class ).getId();
+    String id2 = gc.getAdapter( RemoteObject.class ).getId();
 
     assertEquals( id1, id2 );
   }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/canvaskit/CanvasLCA_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/canvaskit/CanvasLCA_Test.java
index 41715dc..54b5ffb 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/canvaskit/CanvasLCA_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/canvaskit/CanvasLCA_Test.java
@@ -18,7 +18,7 @@
 import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
-import org.eclipse.rap.rwt.remote.RemoteObjectAdapter;
+import org.eclipse.rap.rwt.remote.RemoteObject;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.rap.rwt.testfixture.Message;
 import org.eclipse.rap.rwt.testfixture.Message.CallOperation;
@@ -337,7 +337,7 @@
   static String getGcId( Widget widget ) {
     WidgetAdapter adapter = ( WidgetAdapter )widget.getAdapter( IWidgetAdapter.class );
     Adaptable gcForClient = adapter.getGCForClient();
-    return gcForClient.getAdapter( RemoteObjectAdapter.class ).getId();
+    return gcForClient.getAdapter( RemoteObject.class ).getId();
   }
 
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DisplayLCA_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DisplayLCA_Test.java
index 9984a23..48d9f88 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DisplayLCA_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DisplayLCA_Test.java
@@ -37,9 +37,9 @@
 import org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle;

 import org.eclipse.rap.rwt.internal.lifecycle.UITestUtil;

 import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObject;

-import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecifier;

-import org.eclipse.rap.rwt.internal.protocol.RemoteObjectAdapterImpl;

-import org.eclipse.rap.rwt.internal.protocol.RemoteObjectAdapterRegistry;

+import org.eclipse.rap.rwt.internal.protocol.ProtocolTestUtil.TestRemoteObjectSpecification;

+import org.eclipse.rap.rwt.internal.protocol.RemoteObjectImpl;

+import org.eclipse.rap.rwt.internal.protocol.RemoteObjectRegistry;

 import org.eclipse.rap.rwt.internal.uicallback.UICallBackManager;

 import org.eclipse.rap.rwt.lifecycle.AbstractWidgetLCA;

 import org.eclipse.rap.rwt.lifecycle.IEntryPoint;

@@ -412,34 +412,34 @@
   }

 

   public void testReadDataForRemoteObject() {

-    RemoteObjectAdapterImpl adapter = createRemoteObject();

+    RemoteObjectImpl adapter = createRemoteObject();

     Map<String, Object> parameters = new HashMap<String, Object>();

-    parameters.put( TestRemoteObjectSpecifier.TEST_PROPERTY, "bar" );

+    parameters.put( TestRemoteObjectSpecification.TEST_PROPERTY, "bar" );

     Fixture.fakeSetOperation( adapter.getId(), parameters );

     

     displayLCA.readData( display );

     

-    assertEquals( "bar", ( ( TestRemoteObject )adapter.getRemoteObject() ).getTest() );

+    assertEquals( "bar", ( ( TestRemoteObject )adapter.getObject() ).getTest() );

   }

 

   public void testRendersRemoteObject() throws IOException {

     Fixture.fakePhase( PhaseId.PROCESS_ACTION );

-    RemoteObjectAdapterImpl adapter = createRemoteObject();

-    adapter.set( TestRemoteObjectSpecifier.TEST_PROPERTY, "foo" );

+    RemoteObjectImpl adapter = createRemoteObject();

+    adapter.set( TestRemoteObjectSpecification.TEST_PROPERTY, "foo" );

     

     displayLCA.render( display );

     

     CreateOperation operation = Fixture.getProtocolMessage().findCreateOperation( adapter.getId() );

     assertNotNull( operation );

-    assertEquals( "foo", operation.getProperty( TestRemoteObjectSpecifier.TEST_PROPERTY ) );

+    assertEquals( "foo", operation.getProperty( TestRemoteObjectSpecification.TEST_PROPERTY ) );

   }

 

-  private RemoteObjectAdapterImpl createRemoteObject() {

+  private RemoteObjectImpl createRemoteObject() {

     TestRemoteObject remoteObject = new TestRemoteObject();

     remoteObject.setTest( "foo" );

-    RemoteObjectAdapterImpl<TestRemoteObject> adapter 

-      = new RemoteObjectAdapterImpl<TestRemoteObject>( remoteObject, TestRemoteObjectSpecifier.class, "o" );

-    RemoteObjectAdapterRegistry.getInstance().register( adapter );

+    RemoteObjectImpl<TestRemoteObject> adapter 

+      = new RemoteObjectImpl<TestRemoteObject>( remoteObject, TestRemoteObjectSpecification.class, "o" );

+    RemoteObjectRegistry.getInstance().register( adapter );

     return adapter;

   }