Index: java/main/src/test/java/com/framsticks/core/ObjectInstanceTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/core/ObjectInstanceTest.java	(revision 96)
+++ 	(revision )
@@ -1,91 +1,0 @@
-package com.framsticks.core;
-
-import java.util.ArrayList;
-
-import org.testng.annotations.BeforeClass;
-// import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.framsticks.model.Joint;
-import com.framsticks.model.Model;
-import com.framsticks.model.ModelBuilder;
-import com.framsticks.model.f0.Schema;
-import com.framsticks.model.f0.SchemaBuilder;
-import com.framsticks.test.TestConfiguration;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.Monitor;
-import com.framsticks.util.dispatching.RunAt;
-import com.framsticks.params.AccessInterface;
-import com.framsticks.params.ReflectionAccess;
-import com.framsticks.params.types.FloatParam;
-
-import static com.framsticks.core.InstanceUtils.*;
-
-
-import static org.fest.assertions.Assertions.*;
-
-@Test
-public class ObjectInstanceTest extends TestConfiguration {
-
-	private Model model;
-	private Schema schema;
-	private ObjectInstance instance;
-	private Monitor monitor;
-
-	@BeforeClass
-	public void setUp() {
-		schema = new SchemaBuilder().stream(Schema.getDefaultDefinitionAsStream()).finish();
-		assertThat(schema.getFramsClasses().size()).isEqualTo(5);
-		assertThat(schema.getNeuroClasses().size()).isEqualTo(21);
-	}
-
-	@Test
-	public void loadModel() {
-		model = new ModelBuilder().schema(schema).stream(ObjectInstanceTest.class.getResourceAsStream("/parsers/f0_example.txt")).finish();
-
-		assertThat(model.getJoints().size()).isEqualTo(2);
-	}
-
-
-	@Test(dependsOnMethods = "loadModel", timeOut = 2000)
-	public void startInstance() {
-		instance = new ObjectInstance();
-		instance.takeAllFrom(schema.getRegistry());
-
-		instance.setRootObject(model);
-
-		monitor = new Monitor(instance);
-		monitor.use();
-
-		assertThat(Dispatching.get(instance, new Dispatching.Query<String>() {
-				@Override
-				public String get() {
-					return instance.getRootObject(Model.class).getParts().get(2).info;
-				}
-			})).isEqualTo("bla");
-
-		instance.dispatch(new RunAt<Instance>() {
-			@Override
-			public void run() {
-				assertThat(instance.getRootObject(Model.class).getNeuroDefinitions().get(2).details).isEqualTo("G");
-
-				Path path = Path.to(instance, "/");
-				assertThat(path.isResolved());
-				AccessInterface access = InstanceUtils.bindAccess(path);
-				assertThat(access.get("se", Double.class)).isEqualTo(1.0);
-
-				assertThat(bindAccess(instance, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getDef(Double.class)).isEqualTo(1.0);
-				assertThat(bindAccess(instance, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getMax(Double.class)).isEqualTo(999.0);
-				assertThat(bindAccess(instance, "/parts/2")).isInstanceOf(ReflectionAccess.class);
-				assertThat(Path.to(instance, "/neurodefs").getTopObject()).isInstanceOf(ArrayList.class);
-				assertThat(Path.to(instance, "/joints/1").getTopObject()).isInstanceOf(Joint.class);
-				assertThat(bindAccess(instance, "/parts/2").get("i", String.class)).isEqualTo("bla");
-			}
-		});
-	}
-
-	@Test(dependsOnMethods = "startInstance", timeOut = 2000)
-	public void stoptInstance() {
-		monitor.useFor(1.0).drop().join();
-	}
-}
Index: java/main/src/test/java/com/framsticks/core/ObjectTreeTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/core/ObjectTreeTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/core/ObjectTreeTest.java	(revision 97)
@@ -0,0 +1,91 @@
+package com.framsticks.core;
+
+import java.util.ArrayList;
+
+import org.testng.annotations.BeforeClass;
+// import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.framsticks.model.Joint;
+import com.framsticks.model.Model;
+import com.framsticks.model.ModelBuilder;
+import com.framsticks.model.f0.Schema;
+import com.framsticks.model.f0.SchemaBuilder;
+import com.framsticks.test.TestConfiguration;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.Monitor;
+import com.framsticks.util.dispatching.RunAt;
+import com.framsticks.params.AccessInterface;
+import com.framsticks.params.ReflectionAccess;
+import com.framsticks.params.types.FloatParam;
+
+import static com.framsticks.core.TreeOperations.*;
+
+
+import static org.fest.assertions.Assertions.*;
+
+@Test
+public class ObjectTreeTest extends TestConfiguration {
+
+	private Model model;
+	private Schema schema;
+	private ObjectTree tree;
+	private Monitor monitor;
+
+	@BeforeClass
+	public void setUp() {
+		schema = new SchemaBuilder().stream(Schema.getDefaultDefinitionAsStream()).finish();
+		assertThat(schema.getFramsClasses().size()).isEqualTo(5);
+		assertThat(schema.getNeuroClasses().size()).isEqualTo(21);
+	}
+
+	@Test
+	public void loadModel() {
+		model = new ModelBuilder().schema(schema).stream(ObjectTreeTest.class.getResourceAsStream("/parsers/f0_example.txt")).finish();
+
+		assertThat(model.getJoints().size()).isEqualTo(2);
+	}
+
+
+	@Test(dependsOnMethods = "loadModel", timeOut = 2000)
+	public void startTree() {
+		tree = new ObjectTree();
+		tree.takeAllFrom(schema.getRegistry());
+
+		tree.setRootObject(model);
+
+		monitor = new Monitor(tree);
+		monitor.use();
+
+		assertThat(Dispatching.get(tree, new Dispatching.Query<String>() {
+				@Override
+				public String get() {
+					return tree.getRootObject(Model.class).getParts().get(2).info;
+				}
+			})).isEqualTo("bla");
+
+		tree.dispatch(new RunAt<Tree>(failOnException) {
+			@Override
+			protected void runAt() {
+				assertThat(tree.getRootObject(Model.class).getNeuroDefinitions().get(2).details).isEqualTo("G");
+
+				Path path = Path.to(tree, "/");
+				assertThat(path.isResolved());
+				AccessInterface access = TreeOperations.bindAccess(path);
+				assertThat(access.get("se", Double.class)).isEqualTo(1.0);
+
+				assertThat(bindAccess(tree, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getDef(Double.class)).isEqualTo(1.0);
+				assertThat(bindAccess(tree, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getMax(Double.class)).isEqualTo(999.0);
+				assertThat(bindAccess(tree, "/parts/2")).isInstanceOf(ReflectionAccess.class);
+				assertThat(Path.to(tree, "/neurodefs").getTopObject()).isInstanceOf(ArrayList.class);
+				assertThat(Path.to(tree, "/joints/1").getTopObject()).isInstanceOf(Joint.class);
+				assertThat(bindAccess(tree, "/parts/2").get("i", String.class)).isEqualTo("bla");
+			}
+		});
+	}
+
+	@Test(dependsOnMethods = "startTree", timeOut = 2000)
+	public void stopTree() {
+		monitor.useFor(1.0).drop().join();
+	}
+}
Index: java/main/src/test/java/com/framsticks/dumping/StreamTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/dumping/StreamTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/dumping/StreamTest.java	(revision 97)
@@ -16,9 +16,9 @@
 		// 				public void result(Path result, Exception e) {
 		// 					if (e != null) {
-		// 						log.error("failed to load file instance " + FileInstance.this + ": " + e);
+		// 						log.error("failed to load file: " + e);
 		// 						fireRun(e);
 		// 						return;
 		// 					}
-		// 					log.info("loaded file instance " + FileInstance.this);
+		// 					log.info("loaded file");
 		// 					fireRun(null);
 		// 				}
Index: java/main/src/test/java/com/framsticks/gui/BrowserBaseTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/BrowserBaseTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/gui/BrowserBaseTest.java	(revision 97)
@@ -4,6 +4,4 @@
 
 import org.apache.log4j.Logger;
-import org.fest.swing.core.Robot;
-import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
 import org.fest.swing.edt.GuiQuery;
 import org.fest.swing.fixture.FrameFixture;
@@ -11,28 +9,17 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.test.MonitorBasedTest;
+
+import org.fest.swing.edt.GuiActionRunner;
+
 import com.framsticks.util.dispatching.Joinable;
 
-import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.swing.edt.GuiActionRunner.executeInEDT;
-import static org.fest.swing.core.BasicRobot.robotWithNewAwtHierarchy;
-import org.fest.swing.edt.GuiActionRunner;
-
 @Test
-public abstract class BrowserBaseTest extends MonitorBasedTest {
+public abstract class BrowserBaseTest extends GuiTest {
 
 	private static final Logger log = Logger.getLogger(BrowserTest.class);
 
 	protected Browser browser;
-	protected static Robot robot;
 	protected FrameFixture frame;
 	protected JTreeFixture tree;
-
-	static {
-		FailOnThreadViolationRepaintManager.install();
-		assertThat(executeInEDT()).isTrue();
-
-		robot = robotWithNewAwtHierarchy();
-	}
 
 	@Override
@@ -64,7 +51,4 @@
 	}
 
-	protected void waitForIdle() {
-		robot.waitForIdle();
-	}
 
 }
Index: java/main/src/test/java/com/framsticks/gui/BrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/BrowserTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/gui/BrowserTest.java	(revision 97)
@@ -3,4 +3,6 @@
 import static org.fest.assertions.Assertions.assertThat;
 import static org.fest.swing.edt.GuiActionRunner.execute;
+
+import java.awt.event.KeyEvent;
 
 
@@ -10,5 +12,6 @@
 
 import com.framsticks.model.ModelPackage;
-import com.framsticks.remote.SimulatorInstance;
+import com.framsticks.remote.SimulatorTree;
+import com.framsticks.util.dispatching.Dispatching;
 
 public class BrowserTest extends BrowserBaseTest {
@@ -16,5 +19,5 @@
 	private static final Logger log = Logger.getLogger(BrowserTest.class);
 
-	SimulatorInstance localhost;
+	SimulatorTree localhost;
 
 	@Override
@@ -22,18 +25,19 @@
 		browser = new Browser();
 
-		localhost = new SimulatorInstance();
+		localhost = new SimulatorTree();
 		localhost.setName("localhost");
 		localhost.setAddress("localhost:9009");
 		localhost.usePackage(new ModelPackage());
 
-		browser.addInstance(localhost);
+		browser.addTree(localhost);
 
 	}
 
-	@Test(timeOut = 10000)
+	@Test(timeOut = 30000)
 	public void testShow() {
 		log.info("testing");
 		tree.clickRow(0).expandRow(0);
 		robot.waitForIdle();
+
 		tree.clickRow(1).expandRow(1);
 		robot.waitForIdle();
@@ -47,7 +51,19 @@
 		});
 
+
 		clickAndExpandPath("localhost/simulator/genepools");
 		clickAndExpandPath("localhost/simulator/genepools/groups");
 		clickAndExpandPath("localhost/simulator/genepools/groups/Genotypes");
+		clickAndExpandPath("localhost/simulator/genepools/groups/Genotypes/genotypes");
+		Dispatching.sleep(2.0);
+		clickAndExpandPath("localhost/simulator/genepools/groups/Genotypes/genotypes");
+		robot.pressAndReleaseKey(KeyEvent.VK_J);
+		waitForIdle();
+		Dispatching.sleep(2.0);
+
+		frame.panel("Genotype").panel("name").textBox("value").enterText("-Żółw");
+		clickButton(frame.panel("Genotype").button("apply"));
+
+		Dispatching.sleep(1.0);
 	}
 
Index: java/main/src/test/java/com/framsticks/gui/GuiTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/GuiTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/gui/GuiTest.java	(revision 97)
@@ -0,0 +1,42 @@
+package com.framsticks.gui;
+
+import org.fest.swing.core.Robot;
+import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
+import org.fest.swing.edt.GuiActionRunner;
+import org.fest.swing.edt.GuiTask;
+import org.fest.swing.fixture.JButtonFixture;
+import org.testng.annotations.Test;
+
+import com.framsticks.test.MonitorBasedTest;
+import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.swing.edt.GuiActionRunner.executeInEDT;
+import static org.fest.swing.core.BasicRobot.robotWithNewAwtHierarchy;
+
+@Test
+public abstract class GuiTest extends MonitorBasedTest {
+
+	protected static Robot robot;
+
+	static {
+		FailOnThreadViolationRepaintManager.install();
+		assertThat(executeInEDT()).isTrue();
+
+		robot = robotWithNewAwtHierarchy();
+	}
+
+	protected void waitForIdle() {
+		robot.waitForIdle();
+	}
+
+	protected void clickButton(final JButtonFixture button) {
+
+		// button.click();
+
+		GuiActionRunner.execute(new GuiTask() {
+			@Override
+			protected void executeInEDT() throws Throwable {
+				button.component().doClick();
+			}
+		});
+	}
+}
Index: java/main/src/test/java/com/framsticks/gui/ObjectInstanceBrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/ObjectInstanceBrowserTest.java	(revision 96)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package com.framsticks.gui;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-import org.testng.annotations.Test;
-
-import com.framsticks.core.Instance;
-import com.framsticks.core.ObjectInstance;
-import com.framsticks.model.Model;
-import com.framsticks.params.types.FloatParam;
-import com.framsticks.parsers.XmlLoader;
-import com.framsticks.util.dispatching.RunAt;
-
-import static com.framsticks.core.InstanceUtils.*;
-
-@Test
-public class ObjectInstanceBrowserTest extends BrowserBaseTest {
-
-	ObjectInstance instance;
-
-	@Override
-	protected void configureBrowser() {
-		browser = new XmlLoader().load(Browser.class, getClass().getResourceAsStream("/configs/ObjectInstanceBrowserTest.xml"));
-
-		assertThat(browser.getInstances().size()).isEqualTo(1);
-		assertThat(browser.getInstances().get("model")).isInstanceOf(ObjectInstance.class);
-
-		instance = (ObjectInstance) browser.getInstances().get("model");
-	}
-
-	@Test(timeOut = 10000)
-	public void testShow() {
-		instance.dispatch(new RunAt<Instance>() {
-			@Override
-			public void run() {
-				assertThat(instance.getRootObject()).isInstanceOf(Model.class);
-			}
-		});
-
-		clickAndExpandPath("model");
-		clickAndExpandPath("model/parts");
-		clickAndExpandPath("model/parts/2");
-
-		instance.dispatch(new RunAt<Instance>() {
-			@Override
-			public void run() {
-				assertThat(bindAccess(instance, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getMax(Double.class)).isEqualTo(999.0);
-			}
-		});
-
-	}
-
-
-}
Index: java/main/src/test/java/com/framsticks/gui/ObjectTreeBrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/ObjectTreeBrowserTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/gui/ObjectTreeBrowserTest.java	(revision 97)
@@ -0,0 +1,54 @@
+package com.framsticks.gui;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.core.Tree;
+import com.framsticks.core.ObjectTree;
+import com.framsticks.model.Model;
+import com.framsticks.params.types.FloatParam;
+import com.framsticks.parsers.XmlLoader;
+import com.framsticks.util.dispatching.RunAt;
+
+import static com.framsticks.core.TreeOperations.*;
+
+@Test
+public class ObjectTreeBrowserTest extends BrowserBaseTest {
+
+	ObjectTree tree;
+
+	@Override
+	protected void configureBrowser() {
+		browser = new XmlLoader().load(Browser.class, getClass().getResourceAsStream("/configs/ObjectTreeBrowserTest.xml"));
+
+		assertThat(browser.getTrees().size()).isEqualTo(1);
+		assertThat(browser.getTrees().get("model")).isInstanceOf(ObjectTree.class);
+
+		tree = (ObjectTree) browser.getTrees().get("model");
+	}
+
+	@Test(timeOut = 10000)
+	public void testShow() {
+		tree.dispatch(new RunAt<Tree>(failOnException) {
+			@Override
+			protected void runAt() {
+				assertThat(tree.getRootObject()).isInstanceOf(Model.class);
+			}
+		});
+
+		clickAndExpandPath("model");
+		clickAndExpandPath("model/parts");
+		clickAndExpandPath("model/parts/2");
+
+		tree.dispatch(new RunAt<Tree>(failOnException) {
+			@Override
+			protected void runAt() {
+				assertThat(bindAccess(tree, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getMax(Double.class)).isEqualTo(999.0);
+			}
+		});
+
+	}
+
+
+}
Index: java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java	(revision 97)
@@ -7,6 +7,6 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.Instance;
-import com.framsticks.core.ObjectInstance;
+import com.framsticks.core.Tree;
+import com.framsticks.core.ObjectTree;
 import com.framsticks.params.AccessInterface;
 import com.framsticks.params.FramsClass;
@@ -15,11 +15,12 @@
 import com.framsticks.parsers.XmlLoader;
 import com.framsticks.test.TestClass;
+// import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.util.dispatching.RunAt;
-import static com.framsticks.core.InstanceUtils.*;
+import static com.framsticks.core.TreeOperations.*;
 
 @Test
 public class ProcedureBrowserTest extends BrowserBaseTest {
 
-	ObjectInstance instance;
+	ObjectTree tree;
 
 	@Override
@@ -27,16 +28,16 @@
 		browser = new XmlLoader().load(Browser.class, getClass().getResourceAsStream("/configs/ProcedureBrowserTest.xml"));
 
-		assertThat(browser.getInstances().size()).isEqualTo(1);
-		assertThat(browser.getInstances().get("test")).isInstanceOf(ObjectInstance.class);
+		assertThat(browser.getTrees().size()).isEqualTo(1);
+		assertThat(browser.getTrees().get("test")).isInstanceOf(ObjectTree.class);
 
-		instance = (ObjectInstance) browser.getInstances().get("test");
+		tree = (ObjectTree) browser.getTrees().get("test");
 	}
 
 	@Test(timeOut = 10000)
 	public void testShow() {
-		instance.dispatch(new RunAt<Instance>() {
+		tree.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				assertThat(instance.getRootObject()).isInstanceOf(TestClass.class);
+			protected void runAt() {
+				assertThat(tree.getRootObject()).isInstanceOf(TestClass.class);
 			}
 		});
@@ -44,8 +45,8 @@
 		clickAndExpandPath("test");
 
-		instance.dispatch(new RunAt<Instance>() {
+		tree.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				assertThat(bindAccess(instance, "/").getFramsClass().getParam("history")).isInstanceOf(StringParam.class);
+			protected void runAt() {
+				assertThat(bindAccess(tree, "/").getFramsClass().getParam("history")).isInstanceOf(StringParam.class);
 			}
 		});
@@ -53,8 +54,8 @@
 		// monitor.useFor(4.0);
 
-		instance.dispatch(new RunAt<Instance>() {
+		tree.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				AccessInterface access = bindAccess(instance, "/");
+			protected void runAt() {
+				AccessInterface access = bindAccess(tree, "/");
 				assertThat(access).isInstanceOf(ReflectionAccess.class);
 				FramsClass framsClass = access.getFramsClass();
@@ -65,28 +66,30 @@
 				assertThat(framsClass.getParam(3).getId()).isEqualTo("resetHistory");
 
-				assertThat(access.get("history", String.class)).isEqualTo("");
+				assertThat(access.get("history", String.class)).isEqualTo("initial|");
 			}
 		});
 
 		// frame.panel("TestClass");
-		JPanelFixture appendHistory = frame.panel("TestClass").panel("appendHistory");
-		appendHistory.panel("arg0").textBox("value").enterText("argument");
-		appendHistory.button("call").click();
+		final JPanelFixture appendHistory = frame.panel("TestClass").panel("appendHistory");
+		appendHistory.panel("arg0").textBox("value").enterText("Żółw");
+		assertThat(appendHistory.panel("arg0").textBox("value").text()).isEqualTo("Żółw");
+		clickButton(appendHistory.button("call"));
 		waitForIdle();
 
-		instance.dispatch(new RunAt<Instance>() {
+
+		tree.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				assertThat(bindAccess(instance, "/").get("history", String.class)).isEqualTo("argument|");
+			protected void runAt() {
+				assertThat(bindAccess(tree, "/").get("history", String.class)).isEqualTo("initial|Żółw|");
 			}
 		});
 
-		frame.panel("TestClass").panel("resetHistory").button("call").click();
+		clickButton(frame.panel("TestClass").panel("resetHistory").button("call"));
 		waitForIdle();
 
-		instance.dispatch(new RunAt<Instance>() {
+		tree.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				assertThat(bindAccess(instance, "/").get("history", String.class)).isEqualTo("");
+			protected void runAt() {
+				assertThat(bindAccess(tree, "/").get("history", String.class)).isEqualTo("");
 			}
 		});
Index: java/main/src/test/java/com/framsticks/gui/console/DirectConsoleTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/console/DirectConsoleTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/gui/console/DirectConsoleTest.java	(revision 97)
@@ -0,0 +1,41 @@
+package com.framsticks.gui.console;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.communication.Address;
+import com.framsticks.communication.ClientSideRawConnection;
+import com.framsticks.gui.GuiTest;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.Joinable;
+import com.framsticks.util.dispatching.JoinableCollection;
+
+@Test
+public class DirectConsoleTest extends GuiTest {
+
+	ClientSideRawConnection connection;
+	DirectConsole console;
+	JoinableCollection<Joinable> joinables;
+
+	@Override
+	protected Joinable createSubject() {
+
+		connection = new ClientSideRawConnection();
+		connection.setAddress(new Address("localhost:9009"));
+
+		console = new DirectConsole().setConnection(connection);
+		joinables = new JoinableCollection<>();
+		joinables.setObservableName("connection and console");
+		joinables.add(console);
+		joinables.add(connection);
+
+		return joinables;
+	}
+
+	@Test
+	public void testCommunication() {
+		Dispatching.sleep(2.0);
+		// final Waiter waiter = produceWaiter(1.0);
+
+	}
+
+}
Index: java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java	(revision 97)
@@ -0,0 +1,61 @@
+package com.framsticks.gui.console;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.communication.Address;
+import com.framsticks.communication.ClientSideManagedConnection;
+import com.framsticks.communication.Connection;
+import com.framsticks.core.Path;
+import com.framsticks.gui.GuiTest;
+import com.framsticks.remote.RemoteTree;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.Dispatching.Waiter;
+import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Joinable;
+import com.framsticks.util.dispatching.JoinableCollection;
+
+import static com.framsticks.core.TreeOperations.*;
+
+@Test
+public class TrackConsoleTest extends GuiTest {
+
+	RemoteTree tree;
+	TrackConsole console;
+	JoinableCollection<Joinable> joinables;
+
+	@Override
+	protected Joinable createSubject() {
+		tree = new RemoteTree();
+
+		tree.setConnection(Connection.to(new ClientSideManagedConnection(), new Address("localhost:9009")));
+
+		console = new TrackConsole().setConnection(tree.getConnection());
+		joinables = new JoinableCollection<>();
+		joinables.setObservableName("tree and console");
+		joinables.add(tree);
+		joinables.add(console);
+
+		return joinables;
+	}
+
+	@Test
+	public void testCommunication() {
+		// Dispatching.sleep(2.0);
+		final Waiter waiter = produceWaiter(1.0);
+
+		resolveAndGet(tree, "/simulator/genepools/groups/0", new FutureHandler<Path>(failOnException) {
+
+			@Override
+			protected void result(Path result) {
+				waiter.pass();
+
+			}
+		});
+		Dispatching.sleep(2.0);
+	}
+
+	@Test(dependsOnMethods = "testCommunication")
+	public void justWait() {
+		Dispatching.sleep(2.0);
+	}
+}
Index: java/main/src/test/java/com/framsticks/hosting/ServerTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 97)
@@ -4,23 +4,23 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.ObjectInstance;
+import com.framsticks.core.Mode;
+import com.framsticks.core.ObjectTree;
 import com.framsticks.core.Path;
 import com.framsticks.core.XmlBasedTest;
-import com.framsticks.remote.RemoteInstance;
+import com.framsticks.remote.RemoteTree;
 
 import com.framsticks.test.TestClass;
-import com.framsticks.core.Instance;
+import com.framsticks.core.Tree;
 import com.framsticks.params.FramsClass;
-import com.framsticks.util.AbstractStateFunctor;
 import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.params.AccessInterface;
+import com.framsticks.params.PrimitiveParam;
 import com.framsticks.params.PropertiesAccess;
-import com.framsticks.params.ValueParam;
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.util.dispatching.Dispatching.Waiter;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.RunAt;
 
-import static com.framsticks.core.InstanceUtils.*;
+import static com.framsticks.core.TreeOperations.*;
 
 import static org.fest.assertions.Assertions.*;
@@ -29,10 +29,10 @@
 public class ServerTest extends XmlBasedTest {
 
-	protected RemoteInstance remote;
+	protected RemoteTree remote;
 	protected FramsClass remoteTestFramsClass;
 	protected Path remotePath;
 
 	protected Server server;
-	protected ObjectInstance hosted;
+	protected ObjectTree hosted;
 	protected TestClass hostedObject;
 
@@ -46,10 +46,10 @@
 		assertThat(framsticks.size()).isEqualTo(2);
 		assertThat(framsticks.get("test")).isInstanceOf(Server.class);
-		assertThat(framsticks.get("remote")).isInstanceOf(RemoteInstance.class);
+		assertThat(framsticks.get("remote")).isInstanceOf(RemoteTree.class);
 
 		server = (Server) framsticks.get("test");
-		remote = (RemoteInstance) framsticks.get("remote");
-		assertThat(server.getHosted()).isInstanceOf(ObjectInstance.class);
-		hosted = (ObjectInstance) server.getHosted();
+		remote = (RemoteTree) framsticks.get("remote");
+		assertThat(server.getHosted()).isInstanceOf(ObjectTree.class);
+		hosted = (ObjectTree) server.getHosted();
 		assertThat(hosted.getRootObject()).isInstanceOf(TestClass.class);
 		hostedObject = hosted.getRootObject(TestClass.class);
@@ -58,8 +58,8 @@
 	@Test(dependsOnMethods = "runServer")
 	public void fetchInfo() {
-		remote.dispatch(new RunAt<Instance>() {
+		remote.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
-				remote.fetchInfo(Path.to(remote, "/"), new Future<FramsClass>(failOnException()) {
+			protected void runAt() {
+				remote.info(Path.to(remote, "/"), new FutureHandler<FramsClass>(failOnException) {
 					@Override
 					protected void result(FramsClass result) {
@@ -78,18 +78,18 @@
 		final Waiter waiter = produceWaiter(1.0);
 
-		remote.dispatch(new RunAt<Instance>() {
+		remote.dispatch(new RunAt<Tree>(failOnException) {
 			@Override
-			public void run() {
+			protected void runAt() {
 				final Path path = Path.to(remote, "/");
 				assertThat(path.isResolved()).isFalse();
 
-				remote.resolve(path, new Future<Path>(failOnException()) {
+				remote.resolve(path, new FutureHandler<Path>(failOnException) {
 					@Override
 					protected void result(final Path result) {
 						assertThat(result.isResolved()).isTrue();
 						remotePath = result;
-						remote.fetchValues(result, new AbstractStateFunctor(failOnException()) {
+						remote.get(result, Mode.FETCH, new FutureHandler<Object>(failOnException) {
 							@Override
-							public void call() {
+							protected void result(Object object) {
 								AccessInterface access = bindAccess(result);
 								assertThat(access).isInstanceOf(PropertiesAccess.class);
@@ -108,11 +108,12 @@
 		final Waiter waiter = produceWaiter(2.0);
 
-		storeValue(remotePath, remoteTestFramsClass.getParamEntry("name", ValueParam.class), "new name", new AbstractStateFunctor(failOnException()) {
+		set(remotePath, remoteTestFramsClass.getParamEntry("name", PrimitiveParam.class), "new name", new FutureHandler<Integer>(failOnException) {
 			@Override
-			public void call() {
+			protected void result(Integer flags) {
+				// assertThat(flags).isEqualTo(0);
 				/** And now check directly whether it was really set. */
-				hosted.dispatch(new RunAt<Instance>() {
+				hosted.dispatch(new RunAt<Tree>(failOnException) {
 					@Override
-					public void run() {
+					protected void runAt() {
 						assertThat(hostedObject.getName()).isEqualTo("new name");
 						waiter.pass();
@@ -128,5 +129,5 @@
 		final Waiter waiter = produceWaiter(2.0);
 
-		call(remotePath, remoteTestFramsClass.getParamEntry("resetHistory", ProcedureParam.class), new Object[] {}, new Future<Object>(failOnException()) {
+		call(remotePath, remoteTestFramsClass.getParamEntry("resetHistory", ProcedureParam.class), new Object[] {}, new FutureHandler<Object>(failOnException) {
 			@Override
 			protected void result(Object result) {
@@ -135,10 +136,10 @@
 		});
 
-		call(remotePath, remoteTestFramsClass.getParamEntry("appendHistory", ProcedureParam.class), new Object[] {"next word"}, new Future<Object>(failOnException()) {
+		call(remotePath, remoteTestFramsClass.getParamEntry("appendHistory", ProcedureParam.class), new Object[] {"next word"}, new FutureHandler<Object>(failOnException) {
 			@Override
 			protected void result(Object result) {
-				hosted.dispatch(new RunAt<Instance>() {
+				hosted.dispatch(new RunAt<Tree>(failOnException) {
 					@Override
-					public void run() {
+					protected void runAt() {
 						assertThat(hostedObject.getHistory()).isEqualTo("next word|");
 						waiter.pass();
Index: java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java	(revision 97)
@@ -20,4 +20,6 @@
 		assertThat(schema.getNeuroClasses().size()).isEqualTo(21);
 
+		assertThat(schema.getFramsClass("m").getName()).isEqualTo("Model");
+
 		assertThat(schema.getNeuroClass("|").getName()).isEqualTo("Bend muscle");
 		assertThat(schema.getNeuroClass("VEye").getParam("p")).isInstanceOf(FloatParam.class);
Index: java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 97)
@@ -82,10 +82,10 @@
 		access.select(test);
 
-		assertThat(access.get("history", String.class)).isEqualTo("first|");
+		assertThat(access.get("history", String.class)).isEqualTo("initial|first|");
 		Object result = access.call("appendHistory", new Object[] {"second"});
 
 		assertThat(result).isInstanceOf(Integer.class);
-		assertThat(result).isEqualTo(13);
-		assertThat(access.get("history", String.class)).isEqualTo("first|second|");
+		assertThat(result).isEqualTo(21);
+		assertThat(access.get("history", String.class)).isEqualTo("initial|first|second|");
 
 		result = access.call("resetHistory", null);
Index: java/main/src/test/java/com/framsticks/test/TestConfiguration.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 96)
+++ java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 97)
@@ -88,12 +88,9 @@
 	}
 
-	public static ExceptionResultHandler failOnException() {
-		return new ExceptionResultHandler() {
-			@Override
-			public void handle(FramsticksException e) {
-				assertThat(e).isNull();
-			}
-		};
-
-	}
+	public static final ExceptionResultHandler failOnException = new ExceptionResultHandler() {
+		@Override
+		public void handle(FramsticksException e) {
+			assertThat(e).isNull();
+		}
+	};
 }
Index: java/main/src/test/java/com/framsticks/util/lang/StringsTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/util/lang/StringsTest.java	(revision 97)
+++ java/main/src/test/java/com/framsticks/util/lang/StringsTest.java	(revision 97)
@@ -0,0 +1,20 @@
+package com.framsticks.util.lang;
+
+
+import org.testng.annotations.Test;
+
+import com.framsticks.test.TestConfiguration;
+import static org.fest.assertions.Assertions.*;
+
+@Test
+public class StringsTest extends TestConfiguration {
+
+	@Test
+	public void testStrings() {
+		assertThat(Strings.splitIntoPair("test 2", ' ', null)).isEqualTo(Pair.make("test", "2"));
+		assertThat(Strings.splitIntoPair("tes", ' ', "other")).isEqualTo(Pair.make("tes", "other"));
+		assertThat(Strings.splitIntoPair("xx yy zz", ' ', null)).isEqualTo(Pair.make("xx", "yy zz"));
+		assertThat(Strings.splitIntoPair(" empty", ' ', null)).isEqualTo(Pair.make("", "empty"));
+	}
+
+}
Index: java/main/src/test/resources/configs/FramsServerTest.xml
===================================================================
--- java/main/src/test/resources/configs/FramsServerTest.xml	(revision 96)
+++ java/main/src/test/resources/configs/FramsServerTest.xml	(revision 97)
@@ -2,9 +2,9 @@
 <Framsticks>
 	<import class="com.framsticks.running.FramsServer" />
-	<import class="com.framsticks.remote.RemoteInstance" />
+	<import class="com.framsticks.remote.RemoteTree" />
 	<import class="com.framsticks.running.LoggingOutputListener" />
 	<FramsServer name="frams" port="9008">
 		<LoggingOutputListener />
 	</FramsServer>
-	<!-- <RemoteInstance name="remote" address="localhost:9008" /> -->
+	<!-- <RemoteTree name="remote" address="localhost:9008" /> -->
 </Framsticks>
Index: java/main/src/test/resources/configs/ObjectInstanceBrowserTest.xml
===================================================================
--- java/main/src/test/resources/configs/ObjectInstanceBrowserTest.xml	(revision 96)
+++ 	(revision )
@@ -1,9 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Browser>
-	<import class="com.framsticks.model.ModelBuilder" />
-	<import class="com.framsticks.core.ObjectInstance" />
-	<import class="com.framsticks.model.ModelPackage" />
-	<ObjectInstance name="model">
-		<ModelBuilder resource="/examples/f0_example.txt" />
-	</ObjectInstance>
-</Browser>
Index: java/main/src/test/resources/configs/ObjectTreeBrowserTest.xml
===================================================================
--- java/main/src/test/resources/configs/ObjectTreeBrowserTest.xml	(revision 97)
+++ java/main/src/test/resources/configs/ObjectTreeBrowserTest.xml	(revision 97)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Browser>
+	<import class="com.framsticks.model.ModelBuilder" />
+	<import class="com.framsticks.core.ObjectTree" />
+	<import class="com.framsticks.model.ModelPackage" />
+	<ObjectTree name="model">
+		<ModelBuilder resource="/examples/f0_example.txt" />
+	</ObjectTree>
+</Browser>
Index: java/main/src/test/resources/configs/ProcedureBrowserTest.xml
===================================================================
--- java/main/src/test/resources/configs/ProcedureBrowserTest.xml	(revision 96)
+++ java/main/src/test/resources/configs/ProcedureBrowserTest.xml	(revision 97)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Browser>
-	<import class="com.framsticks.core.ObjectInstance" />
+	<import class="com.framsticks.core.ObjectTree" />
 	<import class="com.framsticks.test.TestClass" />
-	<ObjectInstance name="test">
+	<ObjectTree name="test">
 		<TestClass />
-	</ObjectInstance>
+	</ObjectTree>
 </Browser>
Index: java/main/src/test/resources/configs/ServerTest.xml
===================================================================
--- java/main/src/test/resources/configs/ServerTest.xml	(revision 96)
+++ java/main/src/test/resources/configs/ServerTest.xml	(revision 97)
@@ -2,13 +2,13 @@
 <Framsticks>
 	<import class="com.framsticks.hosting.Server" />
-	<import class="com.framsticks.remote.RemoteInstance" />
-	<import class="com.framsticks.core.ObjectInstance" />
+	<import class="com.framsticks.remote.RemoteTree" />
+	<import class="com.framsticks.core.ObjectTree" />
 	<import class="com.framsticks.test.TestClass" />
 	<import class="com.framsticks.running.LoggingOutputListener" />
 	<Server name="server" port="9007">
-		<ObjectInstance name="test">
+		<ObjectTree name="test">
 			<TestClass name="a test name" />
-		</ObjectInstance>
+		</ObjectTree>
 	</Server>
-	<RemoteInstance name="remote" address="localhost:9007" />
+	<RemoteTree name="remote" address="localhost:9007" />
 </Framsticks>
Index: java/main/src/test/resources/configs/test.xml
===================================================================
--- java/main/src/test/resources/configs/test.xml	(revision 96)
+++ java/main/src/test/resources/configs/test.xml	(revision 97)
@@ -2,7 +2,7 @@
 <Framsticks>
 	<import class="com.framsticks.gui.Browser" />
-	<import class="com.framsticks.remote.SimulatorInstance" />
+	<import class="com.framsticks.remote.SimulatorTree" />
 	<Browser name="browser">
-		<SimulatorInstance name="localhost:9009" address="localhost:9009" />
+		<SimulatorTree name="localhost:9009" address="localhost:9009" />
 	</Browser>
 </Framsticks>
Index: java/main/src/test/resources/log4j.properties
===================================================================
--- java/main/src/test/resources/log4j.properties	(revision 96)
+++ java/main/src/test/resources/log4j.properties	(revision 97)
@@ -26,11 +26,12 @@
 log4j.appender.STDOUT.layout.ConversionPattern=%d{ABSOLUTE} [%-5p] [%t] %c -- %m%n
 
-log4j.logger.com.framsticks=INFO
-# log4j.logger.com.framsticks.hosting.Server=DEBUG
+log4j.logger.com.framsticks=WARN
+log4j.logger.com.framsticks.test.TestConfiguration=INFO
+# log4j.logger.com.framsticks.gui.console.TrackConsole=DEBUG
+# log4j.logger.com.framsticks.gui.controls.ProcedureControl=DEBUG
+# log4j.logger.com.framsticks.test.TestClass=DEBUG
 # log4j.logger.com.framsticks.communication.ServerConnection=TRACE
-# log4j.logger.com.framsticks.util.dispatching.AbstractJoinable=DEBUG
+# log4j.logger.com.framsticks.util.dispatching.Dispatching=DEBUG
 # log4j.logger.com.framsticks.parsers.F0Writer=TRACE
-# log4j.logger.com.framsticks.core.ObjectInstance=DEBUG
-# log4j.logger.com.framsticks.core.Instance=DEBUG
 # log4j.logger.com.framsticks.running=DEBUG
 # log4j.logger.com.framsticks.parsers.XmlLoader=DEBUG
