Index: java/main/src/main/java/com/framsticks/remote/RemoteTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 97)
+++ java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 98)
@@ -8,7 +8,5 @@
 import com.framsticks.core.AbstractTree;
 import com.framsticks.core.Mode;
-import com.framsticks.core.TreeOperations;
 import com.framsticks.core.ListChange;
-import com.framsticks.core.Node;
 import com.framsticks.core.Path;
 import com.framsticks.params.*;
@@ -22,4 +20,5 @@
 import com.framsticks.util.*;
 import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.Dispatching.DispatcherWaiter;
 import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.FutureHandler;
@@ -27,4 +26,5 @@
 import com.framsticks.util.dispatching.JoinableParent;
 import com.framsticks.util.dispatching.JoinableState;
+import com.framsticks.util.dispatching.ThrowExceptionHandler;
 import com.framsticks.util.lang.Casting;
 import com.framsticks.util.lang.Pair;
@@ -52,5 +52,5 @@
 	public Pair<Path, Subscription<?>> getSubscription(Path path) {
 		for (Pair<Path, Subscription<?>> s : subscriptions) {
-			if (s.first.matches(path)) {
+			if (s.first.isTheSameObjects(path)) {
 				return s;
 			}
@@ -75,14 +75,8 @@
 	public void setConnection(final ClientSideManagedConnection connection) {
 		this.connection = connection;
-		// final ExceptionResultHandler failure = new ExceptionResultHandler() {
-		// 	@Override
-		// 	public void handle(FramsticksException exception) {
-		// 		log.fatal("failed to establish connection: ", exception);
-		// 		// log.fatal("unsupported protocol version!\n minimal version is: " + "\nmanager protocol is: " + connection.getProtocolVersion());
-		// 		Dispatching.drop(connection, RemoteTree.this);
-		// 		fireRun(exception);
-		// 	}
-		// };
-
+	}
+
+	public final ClientSideManagedConnection getConnection() {
+		return connection;
 	}
 
@@ -93,13 +87,9 @@
 	}
 
-	public final ClientSideManagedConnection getConnection() {
-		return connection;
-	}
-
-	@Override
-	public void get(final Path path, final PrimitiveParam<?> param, Mode mode, final Future<Object> future) {
+	@Override
+	public void get(final Path path, final ValueParam param, Mode mode, final Future<Object> future) {
 		assert isActive();
 		assert param != null;
-		assert path.isResolved();
+		// assert path.isResolved();
 		//TODO only do that if needed
 		connection.send(new GetRequest().field(param.getId()).path(path.getTextual()), this, new ClientSideResponseFuture(future) {
@@ -107,6 +97,6 @@
 			protected void processOk(Response response) {
 				assert isActive();
-				TreeOperations.processFetchedValues(path, response.getFiles());
-				future.pass(bindAccess(path).get(param, Object.class));
+				processFetchedValues(path, response.getFiles());
+				future.pass(bindAccess(path.tryResolveIfNeeded()).get(param, Object.class));
 			}
 		});
@@ -164,5 +154,5 @@
 					throw new FramsticksException().msg("path mismatch").arg("returned path", response.getFiles().get(0).getPath());
 				}
-				FramsClass framsClass = TreeOperations.processFetchedInfo(RemoteTree.this, response.getFiles().get(0));
+				FramsClass framsClass = processFetchedInfo(RemoteTree.this, response.getFiles().get(0));
 
 				CompositeParam thisParam = path.getTop().getParam();
@@ -176,28 +166,30 @@
 
 	@Override
-	public void get(final Path path, Mode mode, final Future<Object> future) {
-		assert isActive();
-		assert path.getTop().getObject() != null;
+	public void get(final Path path, final Mode mode, final Future<Path> future) {
+		assert isActive();
 
 		log.trace("fetching values for " + path);
-		connection.send(new GetRequest().path(path.getTextual()), this, new ClientSideResponseFuture(future) {
-			@Override
-			protected void processOk(Response response) {
-				assert isActive();
-				TreeOperations.processFetchedValues(path, response.getFiles());
-				future.pass(path.getTopObject());
-			}
-		});
-	}
-
-	@Override
-	public void resolve(final Path path, final Future<Path> future) {
-		TreeOperations.resolve(path, future);
-	}
+		findInfo(path, new FutureHandler<FramsClass>(future) {
+			@Override
+			protected void result(FramsClass result) {
+
+				connection.send(new GetRequest().path(path.getTextual()), RemoteTree.this, new ClientSideResponseFuture(future) {
+					@Override
+					protected void processOk(Response response) {
+						assert isActive();
+						Path p = path.tryResolveIfNeeded();
+						processFetchedValues(p, response.getFiles());
+						future.pass(p.tryResolveIfNeeded().assureResolved());
+					}
+				});
+			}
+		});
+	}
+
 
 	@Override
 	protected void tryRegisterOnChangeEvents(final Path path) {
 		assert isActive();
-		AccessInterface access = TreeOperations.bindAccess(path);
+		AccessInterface access = bindAccess(path);
 		if (!(access instanceof ListAccess)) {
 			return;
@@ -274,5 +266,4 @@
 			protected void result(Path result) {
 				log.debug(listChange + ": " + result);
-				fireListChange(result, listChange);
 			}
 		};
@@ -282,10 +273,10 @@
 		assert isActive();
 		log.debug("reacting to change " + listChange + " in " + path);
-		AccessInterface access = TreeOperations.bindAccess(path);
+		AccessInterface access = bindAccess(path);
 		assert access != null;
 
 		if ((listChange.getAction() == ListChange.Action.Modify) && (listChange.getPosition() == -1)) {
 			final String p = path.getTextual();
-			TreeOperations.resolveAndGet(this, p, futureListChanger(listChange, p));
+			tryGet(this, p, futureListChanger(listChange, p));
 			return;
 		}
@@ -296,15 +287,14 @@
 			case Add: {
 				final String p = path.getTextual() + "/" + childParam.getId();
-				TreeOperations.resolveAndGet(this, p, futureListChanger(listChange, p));
+				tryGet(this, p, futureListChanger(listChange, p));
 				break;
 			}
 			case Remove: {
 				access.set(childParam, null);
-				fireListChange(path, listChange);
 				break;
 			}
 			case Modify: {
 				final String p = path.getTextual() + "/" + childParam.getId();
-				TreeOperations.resolveAndGet(this, p, futureListChanger(listChange, p));
+				tryGet(this, p, futureListChanger(listChange, p));
 				break;
 			}
@@ -315,5 +305,5 @@
 	public void set(final Path path, final PrimitiveParam<?> param, final Object value, final Future<Integer> future) {
 		assert isActive();
-		final Integer flag = TreeOperations.bindAccess(path).set(param, value);
+		final Integer flag = bindAccess(path).set(param, value);
 
 		log.trace("storing value " + param + " for " + path);
@@ -331,4 +321,21 @@
 		Dispatching.use(connection, this);
 		super.joinableStart();
+
+		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) {
+					@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));
+					}
+				});
+
+				waiter.waitFor();
+			}
+		});
 	}
 
@@ -373,25 +380,26 @@
 	}
 
-	@Override
-	public Path create(Path path) {
-		assert isActive();
-		assert !path.isResolved();
-		Path resolved = path.tryFindResolution();
-		if (!resolved.isResolved()) {
-			log.debug("creating: " + path);
-			AccessInterface access = registry.prepareAccess(path.getTop().getParam());
-			assert access != null;
-			Object child = access.createAccessee();
-			assert child != null;
-			if (path.size() == 1) {
-				setRoot(new Node(getRoot().getParam(), child));
-			} else {
-				bindAccess(this, path.getUnder()).set(path.getTop().getParam(), child);
-			}
-			resolved = path.appendResolution(child);
-		}
-		tryRegisterOnChangeEvents(resolved);
-		return resolved;
-	}
+	// @Override
+	// public Path create(Path path) {
+	//	assert isActive();
+	//	assert !path.isResolved();
+	//	Path resolved = path.tryFindResolution();
+	//	if (!resolved.isResolved()) {
+	//		log.debug("creating: " + path);
+	//		//TODO: access parent here, check if it is valid, only then create
+	//		AccessInterface access = registry.prepareAccess(path.getTop().getParam());
+	//		assert access != null;
+	//		Object child = access.createAccessee();
+	//		assert child != null;
+	//		if (path.size() == 1) {
+	//			setRoot(new Node(getRoot().getParam(), child));
+	//		} else {
+	//			bindAccess(this, path.getUnder()).set(path.getTop().getParam(), child);
+	//		}
+	//		resolved = path.appendResolution(child);
+	//	}
+	//	tryRegisterOnChangeEvents(resolved);
+	//	return resolved;
+	// }
 
 }
