Index: java/main/src/main/java/com/framsticks/remote/RemoteTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 100)
+++ java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 101)
@@ -7,8 +7,9 @@
 import com.framsticks.communication.queries.SetRequest;
 import com.framsticks.core.AbstractTree;
+import com.framsticks.core.ListChange;
 import com.framsticks.core.Path;
+import com.framsticks.core.ValueChange;
 import com.framsticks.params.*;
 import com.framsticks.params.EventListener;
-import com.framsticks.params.annotations.AutoAppendAnnotation;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
@@ -17,9 +18,7 @@
 import com.framsticks.parsers.Loaders;
 import com.framsticks.parsers.MultiParamLoader;
-import com.framsticks.core.Tree;
 import com.framsticks.util.*;
 import com.framsticks.util.dispatching.AtOnceDispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.Dispatching.DispatcherWaiter;
 import com.framsticks.util.dispatching.DispatchingFuture;
 import com.framsticks.util.dispatching.ExceptionResultHandler;
@@ -52,20 +51,19 @@
 
 	public RemoteTree() {
+		bufferedDispatcher.setBuffer(true);
+		registry.registerAndBuild(ListChange.class);
+		registry.registerAndBuild(ValueChange.class);
 	}
 
 	@ParamAnnotation
 	public void setAddress(String address) {
-		setConnection(Connection.to(new ClientSideManagedConnection(), new Address(address)));
-	}
-
-	@ParamAnnotation
+		this.connection = Connection.to(new ClientSideManagedConnection(), new Address(address));
+		this.connection.setExceptionHandler(this);
+		this.connection.setNeedFileAcceptor(this);
+	}
+
+	@ParamAnnotation(flags = ParamFlags.USERREADONLY)
 	public String getAddress() {
 		return connection == null ? "<disconnected>" : connection.getAddress().toString();
-	}
-
-	@AutoAppendAnnotation
-	public void setConnection(final ClientSideManagedConnection connection) {
-		this.connection = connection;
-		this.connection.setExceptionHandler(this);
 	}
 
@@ -219,18 +217,17 @@
 		super.joinableStart();
 
-		dispatch(new RunAt<RemoteTree>(ThrowExceptionHandler.getInstance()) {
+		bufferedDispatcher.getTargetDispatcher().dispatch(new RunAt<RemoteTree>(ThrowExceptionHandler.getInstance()) {
 			@Override
 			protected void runAt() {
-				final DispatcherWaiter<Tree, Tree> waiter = new DispatcherWaiter<Tree, Tree>(RemoteTree.this);
-
-				connection.send(new InfoRequest().path("/"), waiter, new ClientSideResponseFuture(this) {
+
+				connection.send(new InfoRequest().path("/"), bufferedDispatcher.getTargetDispatcher(), new ClientSideResponseFuture(this) {
 					@Override
 					protected void processOk(Response response) {
 						FramsClass framsClass = processFetchedInfo(RemoteTree.this, response.getFiles().get(0));
 						assignRootParam(Param.build().name("Tree").id(RemoteTree.this.getName()).type("o " + framsClass.getId()).finish(CompositeParam.class));
+						bufferedDispatcher.setBuffer(false);
 					}
 				});
 
-				waiter.waitFor();
 			}
 		});
@@ -295,15 +292,9 @@
 					protected void runAt() {
 						assert isActive();
-						if (argumentType.equals(Object.class)) {
+						if (argumentType.equals(File.class)) {
 							listener.action(Casting.tryCast(argumentType, file));
 							return;
 						}
-						Access access = registry.createAccess(argumentType);
-						Object argument = access.createAccessee();
-						access.select(argument);
-						if (!argumentType.isInstance(argument)) {
-							throw new FramsticksException().msg("created argument is of wrond type").arg("expected", argumentType).arg("created", argument.getClass());
-						}
-						A typedArgument = argumentType.cast(argument);
+						// Access access = registry.createAccess(argumentType);
 
 						// log.info("executing event with argument {}", argumentType);
@@ -311,8 +302,16 @@
 						loader.setNewSource(file.getContent());
 						loader.addBreakCondition(MultiParamLoader.Status.AfterObject);
-						loader.addAccess(access);
+						loader.setAccessProvider(registry);
+						// loader.addAccess(access);
 						loader.go();
-
-						listener.action(typedArgument);
+						Object argument = loader.getLastAccess().getSelected();
+						// Object argument = access.getSelected();
+						if (argument == null) {
+							listener.action(null);
+						}
+						if (!argumentType.isInstance(argument)) {
+							throw new FramsticksException().msg("created argument is of wrong type").arg("expected", argumentType).arg("created", argument.getClass());
+						}
+						listener.action(argumentType.cast(argument));
 					}
 				});
