Index: java/main/src/test/java/com/framsticks/core/ListChangeTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/core/ListChangeTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/core/ListChangeTest.java	(revision 105)
@@ -6,5 +6,4 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.ListChange.Action;
 import static com.framsticks.params.AccessOperations.*;
 import com.framsticks.params.FramsClass;
@@ -12,4 +11,6 @@
 import com.framsticks.params.ListSource;
 import com.framsticks.params.ReflectionAccess;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.ListChange.Action;
 import com.framsticks.test.TestConfiguration;
 
Index: java/main/src/test/java/com/framsticks/core/LocalTreeTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/core/LocalTreeTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/core/LocalTreeTest.java	(revision 105)
@@ -12,4 +12,8 @@
 import com.framsticks.model.f0.Schema;
 import com.framsticks.model.f0.SchemaBuilder;
+import com.framsticks.structure.LocalTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.TreeOperations;
 import com.framsticks.test.TestConfiguration;
 import com.framsticks.util.dispatching.Dispatching;
@@ -20,8 +24,9 @@
 import com.framsticks.params.types.FloatParam;
 
-import static com.framsticks.core.TreeOperations.*;
 
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
 @Test
@@ -75,6 +80,6 @@
 				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(getParam(bindAccess(tree, "/parts/2"), "m", FloatParam.class).getDef(Double.class)).isEqualTo(1.0);
+				assertThat(getParam(bindAccess(tree, "/parts/2"), "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);
Index: java/main/src/test/java/com/framsticks/core/PathTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/core/PathTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/core/PathTest.java	(revision 105)
@@ -11,4 +11,5 @@
 import org.testng.annotations.Test;
 
+import com.framsticks.structure.Path;
 import com.framsticks.test.TestConfiguration;
 import com.framsticks.util.lang.Pair;
Index: java/main/src/test/java/com/framsticks/gui/LocalTreeBrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/LocalTreeBrowserTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/gui/LocalTreeBrowserTest.java	(revision 105)
@@ -5,12 +5,13 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.Tree;
-import com.framsticks.core.LocalTree;
 import com.framsticks.model.Model;
 import com.framsticks.params.types.FloatParam;
 import com.framsticks.parsers.XmlLoader;
+import com.framsticks.structure.LocalTree;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.dispatching.RunAt;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
 @Test
@@ -45,5 +46,5 @@
 			@Override
 			protected void runAt() {
-				assertThat(bindAccess(tree, "/parts/2").getFramsClass().getParamEntry("m", FloatParam.class).getMax(Double.class)).isEqualTo(999.0);
+				assertThat(getParam(bindAccess(tree, "/parts/2"), "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 103)
+++ java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java	(revision 105)
@@ -7,20 +7,20 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.Path;
-import com.framsticks.core.Tree;
-import com.framsticks.core.LocalTree;
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.Access;
 import com.framsticks.params.EventListener;
-import com.framsticks.params.FramsClass;
 import com.framsticks.params.ReflectionAccess;
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.StringParam;
 import com.framsticks.parsers.XmlLoader;
+import com.framsticks.structure.LocalTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.test.TestClass;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 // import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.util.dispatching.RunAt;
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
 @Test
@@ -53,5 +53,5 @@
 			@Override
 			protected void runAt() {
-				assertThat(bindAccess(tree, "/").getFramsClass().getParam("history")).isInstanceOf(StringParam.class);
+				assertThat(getParam(bindAccess(tree, "/"), "history")).isInstanceOf(StringParam.class);
 			}
 		});
@@ -64,10 +64,9 @@
 				Access access = bindAccess(tree, "/");
 				assertThat(access).isInstanceOf(ReflectionAccess.class);
-				FramsClass framsClass = access.getFramsClass();
-				assertThat(framsClass.getParam(0).getId()).isEqualTo("name");
-				assertThat(framsClass.getParam(1).getId()).isEqualTo("history");
-				assertThat(framsClass.getParam(2).getId()).isEqualTo("history_changed");
-				assertThat(framsClass.getParam(3).getId()).isEqualTo("appendHistory");
-				assertThat(framsClass.getParam(4).getId()).isEqualTo("resetHistory");
+				assertThat(getParam(access, 0).getId()).isEqualTo("name");
+				assertThat(getParam(access, 1).getId()).isEqualTo("history");
+				assertThat(getParam(access, 2).getId()).isEqualTo("history_changed");
+				assertThat(getParam(access, 3).getId()).isEqualTo("appendHistory");
+				assertThat(getParam(access, 4).getId()).isEqualTo("resetHistory");
 
 				assertThat(access.get("history", String.class)).isEqualTo("initial|");
@@ -96,5 +95,5 @@
 				assertThat(access.get("history", String.class)).isEqualTo("initial|Żółw|");
 
-				tree.addListener(Path.to(tree, "/"), access.getFramsClass().getParamEntry("history_changed", EventParam.class), listener, ValueChange.class, FutureHandler.doNothing(Void.class, failOnException));
+				tree.addListener(Path.to(tree, "/"), getParam(access, "history_changed", EventParam.class), listener, ValueChange.class, Future.doNothing(Void.class, failOnException));
 			}
 		});
@@ -109,5 +108,5 @@
 				assertThat(access.get("history", String.class)).isEqualTo("");
 
-				tree.removeListener(Path.to(tree, "/"), access.getFramsClass().getParamEntry("history_changed", EventParam.class), listener, FutureHandler.doNothing(Void.class, failOnException));
+				tree.removeListener(Path.to(tree, "/"), getParam(access, "history_changed", EventParam.class), listener, Future.doNothing(Void.class, failOnException));
 			}
 		});
Index: java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/gui/console/TrackConsoleTest.java	(revision 105)
@@ -3,14 +3,14 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.Path;
 import com.framsticks.gui.GuiTest;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.Path;
 import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.util.dispatching.Dispatching.Waiter;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableCollection;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
 
 @Test
@@ -41,5 +41,5 @@
 		final Waiter waiter = produceWaiter(1.0);
 
-		tryGet(tree, "/simulator/genepools/groups/0", new FutureHandler<Path>(failOnException) {
+		tryGet(tree, "/simulator/genepools/groups/0", new Future<Path>(failOnException) {
 
 			@Override
Index: java/main/src/test/java/com/framsticks/hosting/ServerTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 105)
@@ -8,15 +8,15 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.ListChange;
-import com.framsticks.core.LocalTree;
-import com.framsticks.core.Path;
-import com.framsticks.core.Result;
-import com.framsticks.core.TreeOperations;
-import com.framsticks.core.ValueChange;
 import com.framsticks.core.XmlBasedTest;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.LocalTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.TreeOperations;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.Result;
+import com.framsticks.structure.messages.ValueChange;
 
 import com.framsticks.test.TestClass;
-import com.framsticks.core.Tree;
 import com.framsticks.params.FramsClass;
 import com.framsticks.params.Access;
@@ -29,10 +29,12 @@
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.util.dispatching.Dispatching.Waiter;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.RunAt;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.params.ParamsUtil.arguments;
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
 @Test
@@ -72,5 +74,5 @@
 		final Waiter waiter = produceWaiter(1.0);
 
-		TreeOperations.tryGet(remote, "/testClass", new FutureHandler<Path>(failOnException) {
+		TreeOperations.tryGet(remote, "/testClass", new Future<Path>(failOnException) {
 			@Override
 			protected void result(Path path) {
@@ -88,5 +90,5 @@
 		final Waiter waiter = produceWaiter(1.0);
 
-		TreeOperations.tryGet(remote, "/testClass", new FutureHandler<Path>(failOnException) {
+		TreeOperations.tryGet(remote, "/testClass", new Future<Path>(failOnException) {
 			@Override
 			protected void result(Path path) {
@@ -105,5 +107,5 @@
 		final Waiter waiter = produceWaiter(2.0);
 
-		set(remotePath, remoteTestFramsClass.getParamEntry("name", PrimitiveParam.class), "new name", new FutureHandler<Integer>(failOnException) {
+		set(remotePath, getParam(remoteTestFramsClass, "name", PrimitiveParam.class), "new name", new Future<Integer>(failOnException) {
 			@Override
 			protected void result(Integer flags) {
@@ -132,5 +134,5 @@
 		};
 
-		TreeOperations.tryGet(remote, "/cli/events", new FutureHandler<Path>(failOnException) {
+		TreeOperations.tryGet(remote, "/cli/events", new Future<Path>(failOnException) {
 			@Override
 			protected void result(Path path) {
@@ -139,5 +141,5 @@
 		});
 
-		addListener(remotePath, remoteTestFramsClass.getParamEntry("history_changed", EventParam.class), listener, ValueChange.class, produceWaiter(1.0).passInFuture(Void.class));
+		addListener(remotePath, getParam(remoteTestFramsClass, "history_changed", EventParam.class), listener, ValueChange.class, produceWaiter(1.0).passInFuture(Void.class));
 	}
 
@@ -146,7 +148,7 @@
 		final Waiter waiter = produceWaiter(2.0);
 
-		call(remotePath, remoteTestFramsClass.getParamEntry("resetHistory", ProcedureParam.class), new Object[] {}, Object.class, produceWaiter(2.0).passInFuture(Object.class));
-
-		call(remotePath, remoteTestFramsClass.getParamEntry("appendHistory", ProcedureParam.class), new Object[] {"next word"}, Result.class, new FutureHandler<Result>(failOnException) {
+		call(remotePath, getParam(remoteTestFramsClass, "resetHistory", ProcedureParam.class), arguments(), Object.class, produceWaiter(2.0).passInFuture(Object.class));
+
+		call(remotePath, getParam(remoteTestFramsClass, "appendHistory", ProcedureParam.class), arguments("next word"), Result.class, new Future<Result>(failOnException) {
 			@Override
 			protected void result(final Result result) {
@@ -167,5 +169,5 @@
 	@Test(dependsOnMethods = "callMethod")
 	public void deregisterListener() {
-		removeListener(remotePath, remoteTestFramsClass.getParamEntry("history_changed", EventParam.class), listener, produceWaiter(1.0).passInFuture(Void.class));
+		removeListener(remotePath, getParam(remoteTestFramsClass, "history_changed", EventParam.class), listener, produceWaiter(1.0).passInFuture(Void.class));
 
 		assertThat(listenerArguments).isEqualTo(Arrays.asList("", "next word|"));
@@ -183,5 +185,5 @@
 		};
 
-		addListener(remotePath, remoteTestFramsClass.getParamEntry("children_changed", EventParam.class), childListener, ListChange.class, produceWaiter(1.0).passInFuture(Void.class));
+		addListener(remotePath, getParam(remoteTestFramsClass, "children_changed", EventParam.class), childListener, ListChange.class, produceWaiter(1.0).passInFuture(Void.class));
 	}
 
@@ -189,12 +191,12 @@
 	public void createChild() {
 		final Waiter waiter = produceWaiter(2.0);
-		call(remotePath, "createChild", new Object[] { "a child" }, Object.class, produceWaiter(2.0).passInFuture(Object.class));
-		call(remotePath, "createChild", new Object[] { "another child" }, Object.class, produceWaiter(2.0).passInFuture(Object.class));
-
-		tryGet(remote, "/testClass/children/c0", new FutureHandler<Path>(failOnException) {
+		call(remotePath, "createChild", arguments("a child"), Object.class, produceWaiter(2.0).passInFuture(Object.class));
+		call(remotePath, "createChild", arguments("another child"), Object.class, produceWaiter(2.0).passInFuture(Object.class));
+
+		tryGet(remote, "/testClass/children/c0", new Future<Path>(failOnException) {
 
 			@Override
 			protected void result(Path result) {
-				set(result, getFramsClass(result).getParamEntry("name", StringParam.class), "new_name", new FutureHandler<Integer>(failOnException) {
+				set(result, getParam(result, "name", StringParam.class), "new_name", new Future<Integer>(failOnException) {
 
 					@Override
@@ -209,5 +211,5 @@
 	@Test(dependsOnMethods = "createChild")
 	public void deregisterChildListener() {
-		removeListener(remotePath, remoteTestFramsClass.getParamEntry("children_changed", EventParam.class), childListener, produceWaiter(1.0).passInFuture(Void.class));
+		removeListener(remotePath, getParam(remoteTestFramsClass, "children_changed", EventParam.class), childListener, produceWaiter(1.0).passInFuture(Void.class));
 	}
 
Index: java/main/src/test/java/com/framsticks/model/CreatureTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/model/CreatureTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/model/CreatureTest.java	(revision 105)
@@ -11,4 +11,5 @@
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 @Test
@@ -27,5 +28,5 @@
 		assertThat(framsClass.getParam("name")).describedAs("name").isInstanceOf(StringParam.class);
 		assertThat(framsClass.getParam("parts")).describedAs("parts").isInstanceOf(ArrayListParam.class);
-		partsParam = framsClass.getParamEntry("parts", ArrayListParam.class);
+		partsParam = getParam(framsClass, "parts", ArrayListParam.class);
 		assertThat(partsParam).describedAs("partsParam").isNotNull();
 		assertThat(partsParam).isInstanceOf(ArrayListParam.class);
Index: java/main/src/test/java/com/framsticks/model/ModelPackageTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/model/ModelPackageTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/model/ModelPackageTest.java	(revision 105)
@@ -15,4 +15,5 @@
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 @Test
@@ -41,5 +42,5 @@
 				Object defaultValue = args[1];
 
-				ValueParam param = framsClass.getParamEntry(paramName, ValueParam.class);
+				ValueParam param = getParam(framsClass, paramName, ValueParam.class);
 				assertThat(param.getDef(Object.class)).isEqualTo(defaultValue);
 
Index: java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/model/f0/SchemaTest.java	(revision 105)
@@ -11,4 +11,5 @@
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 public class SchemaTest extends TestConfiguration {
@@ -23,10 +24,10 @@
 
 		assertThat(schema.getNeuroClass("|").getName()).isEqualTo("Bend muscle");
-		assertThat(schema.getNeuroClass("VEye").getParam("p")).isInstanceOf(FloatParam.class);
-		assertThat(schema.getNeuroClass("VEye").getParamEntry("p", FloatParam.class).getMax(Double.class)).isEqualTo(10.0, delta(0.0));
+		assertThat(getParam(schema.getNeuroClass("VEye"), "p")).isInstanceOf(FloatParam.class);
+		assertThat(getParam(schema.getNeuroClass("VEye"), "p", FloatParam.class).getMax(Double.class)).isEqualTo(10.0, delta(0.0));
 
 		FramsClass partClass = schema.getFramsClass("p");
 		assertThat(partClass).isNotNull();
-		assertThat(partClass.getParamEntry("as", FloatParam.class).getDef(Double.class)).isEqualTo(0.25, delta(0.0));
+		assertThat(getParam(partClass, "as", FloatParam.class).getDef(Double.class)).isEqualTo(0.25, delta(0.0));
 		assertThat(partClass.getGroupCount()).isEqualTo(3);
 		assertThat(partClass.getGroup(1).getName()).isEqualTo("Other properties");
Index: java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 105)
@@ -6,9 +6,9 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.params.types.StringParam;
 import com.framsticks.parsers.Savers;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.test.TestClass;
 import com.framsticks.test.TestConfiguration;
@@ -16,4 +16,6 @@
 
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.arguments;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 @Test
@@ -43,5 +45,6 @@
 		assertThat(framsClass.getParam("resetHistory")).isInstanceOf(ProcedureParam.class);
 
-		ProcedureParam appendHistory = framsClass.getParamEntry("appendHistory", ProcedureParam.class);
+
+		ProcedureParam appendHistory = getParam(framsClass, "appendHistory", ProcedureParam.class);
 		assertThat(appendHistory.getArgumentsType().size()).isEqualTo(1);
 		assertThat(appendHistory.getArgumentsType().get(0).getId()).isEqualTo("arg0");
@@ -111,5 +114,5 @@
 
 		assertThat(access.get("history", String.class)).isEqualTo("initial|first|");
-		Object result = access.call("appendHistory", new Object[] {"second"});
+		Object result = access.call("appendHistory", arguments("second"));
 
 		assertThat(result).isInstanceOf(Integer.class);
@@ -117,5 +120,5 @@
 		assertThat(access.get("history", String.class)).isEqualTo("initial|first|second|");
 
-		result = access.call("resetHistory", null);
+		result = access.call("resetHistory");
 		assertThat(result).isNull();
 
@@ -136,5 +139,5 @@
 		};
 
-		final EventParam eventParam = access.getFramsClass().getParamEntry("history_changed", EventParam.class);
+		final EventParam eventParam = getParam(access, "history_changed", EventParam.class);
 		access.reg(eventParam, listener);
 
@@ -142,5 +145,5 @@
 		final String addition = "test";
 
-		access.call("appendHistory", new Object[] { addition });
+		access.call("appendHistory", arguments(addition));
 
 		String expected = currentHistory + addition + "|";
Index: java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java	(revision 105)
@@ -9,4 +9,5 @@
 import com.framsticks.test.TestConfiguration;
 import static org.fest.assertions.Assertions.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 @Test
@@ -24,6 +25,6 @@
 		assertThat(builderFramsClass.getName()).isEqualTo("prop");
 		assertThat(builderFramsClass.getId()).isEqualTo("prop");
-		assertThat(builderFramsClass.getParamEntry("flags", ValueParam.class).getDef(Object.class)).isEqualTo(new Integer(0));
-		assertThat(builderFramsClass.getParamEntry("id", Param.class)).isInstanceOf(StringParam.class);
+		assertThat(getParam(builderFramsClass, "flags", ValueParam.class).getDef(Object.class)).isEqualTo(new Integer(0));
+		assertThat(getParam(builderFramsClass, "id", Param.class)).isInstanceOf(StringParam.class);
 	}
 
Index: java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java	(revision 105)
@@ -0,0 +1,88 @@
+package com.framsticks.params;
+
+import static org.fest.assertions.Assertions.*;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.params.AccessOperations;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.ListSink;
+import com.framsticks.params.ReflectionAccess;
+import com.framsticks.params.types.UniversalParam;
+import com.framsticks.parsers.Savers;
+import com.framsticks.test.TestConfiguration;
+import com.framsticks.test.TestSerializedClass;
+
+
+public class ParamsUtilTest extends TestConfiguration {
+
+	@Test
+	public void testSerialization() {
+		FramsClass framsClass;
+		ReflectionAccess access;
+
+		framsClass = FramsClass.build().forClass(TestSerializedClass.class);
+		assertThat(framsClass.getParamCount()).isEqualTo(1);
+		assertThat(framsClass.getParam("theArray")).isInstanceOf(UniversalParam.class);
+
+		access = new ReflectionAccess(TestSerializedClass.class, framsClass);
+
+		assertThat(Savers.saveFramsClass(new ListSink(), framsClass).getOut()).isEqualTo(
+				Arrays.asList(
+					"class:",
+					"name:TestSerializedClass",
+					"id:TestSerializedClass",
+					"",
+					"prop:",
+					"id:theArray",
+					"name:TheArray",
+					"type:x",
+					""
+				)
+			);
+
+		TestSerializedClass test = new TestSerializedClass();
+		test.getTheArray().add(1);
+		test.getTheArray().add(3.0);
+		test.getTheArray().add("word");
+
+		ListSink sink = new ListSink();
+		AccessOperations.savePrimitives(access.select(test), sink);
+		assertThat(sink.getOut()).isEqualTo(Arrays.asList(
+				"TestSerializedClass:",
+				"theArray:@Serialized:[1,3.0,\"word\"]",
+				""
+			));
+
+
+		assertThat(ParamsUtil.serialize("@Serialized:")).isEqualTo("@Serialized:\"@Serialized:\"");
+		assertThat(ParamsUtil.serialize(Arrays.asList(12, null, "abc"))).isEqualTo("@Serialized:[12,null,\"abc\"]");
+		assertThat(ParamsUtil.serialize(Arrays.asList(Arrays.asList(Arrays.asList())))).isEqualTo("@Serialized:[[[]]]");
+
+		Map<String, Object> f12 = new TreeMap<String, Object>();
+		f12.put("a", 123);
+		f12.put("b", Arrays.asList(7, 8, 9));
+		assertThat(ParamsUtil.serialize(f12)).isEqualTo("@Serialized:{\"a\":123,\"b\":[7,8,9]}");
+
+		// List<Object> f18 = new ArrayList<>();
+		// List<Object> f18_0 = new ArrayList<>();
+		// List<Object> f18_1 = Arrays.asList("x", f18);
+		// List<Object> f18_2 = new ArrayList<>();
+		// f18_2.add(f18_0);
+		// f18_0.add(f18_2);
+		// f18.add(f18_0);
+		// f18.add(f18_1);
+		// f18.add(f18_2);
+
+		// root[0] is f18_0
+		// root[0]==root[2][0], root[1][1]==root, root[1][1][1][1][0]=="x".
+
+		// assertThat(ParamsUtil.serialize(f18)).isEqualTo("@Serialized:[[^3],[\"x\",^0],[^1]]");
+
+	}
+
+}
Index: java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java	(revision 105)
@@ -17,4 +17,5 @@
 import static org.fest.assertions.Assertions.*;
 import static org.fest.assertions.Delta.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 /**
@@ -48,5 +49,5 @@
 	public void primitiveParam() {
 		FramsClass joint = schema.getFramsClass("j");
-		PrimitiveParam<?> dx = joint.getParamEntry("dx", PrimitiveParam.class);
+		PrimitiveParam<?> dx = getParam(joint, "dx", PrimitiveParam.class);
 		assertThat(dx).isInstanceOf(FloatParam.class);
 		assertThat(schema.getNeuroClasses().size()).isEqualTo(21);
@@ -54,5 +55,5 @@
 		assertThat(dx.getMin(Double.class)).isEqualTo(-2.0, delta(0.0));
 
-		assertThat(schema.getRegistry().getFramsClass("n").getParamEntry("d", StringParam.class).getDef(String.class)).isEqualTo("N");
+		assertThat(getParam(schema.getRegistry().getFramsClass("n"), "d", StringParam.class).getDef(String.class)).isEqualTo("N");
 	}
 
@@ -60,5 +61,5 @@
 	public void readF0() throws IOException, ParseException {
 		assertThat(schema.getFramsClass("p")).isInstanceOf(FramsClass.class);
-		assertThat(schema.getRegistry().getFramsClass("p").getParamEntry("as", FloatParam.class).getDef(Double.class)).isEqualTo(0.25, delta(0.0));
+		assertThat(getParam(schema.getRegistry().getFramsClass("p"), "as", FloatParam.class).getDef(Double.class)).isEqualTo(0.25, delta(0.0));
 
 		accesses = new F0Parser(schema, F0ParserTest.class.getResourceAsStream("/parsers/f0_example.txt")).parse();
@@ -91,5 +92,5 @@
 
 		assertThat(model.getParts().get(1).getPosition().x).isEqualTo(2.0, delta(0.0));
-		assertThat(model.getParts().get(2).getPosition().sub(new Point3d(2.27236, -0.0792596, -0.958924)).length()).isLessThan(0.0001);
+		assertThat(model.getParts().get(2).getPosition().sub(new Point3d(2.27236, -0.0792596, -0.958924)).length()).describedAs("position error").isLessThan(0.0001);
 		assertThat(model.getParts().get(2).getOrientation().y.sub(new Point3d(0.870277, -0.404792, 0.280644)).length()).isLessThan(0.0001);
 
Index: java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java	(revision 105)
@@ -9,6 +9,6 @@
 import org.testng.annotations.Test;
 
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.EventListener;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.test.TestConfiguration;
 import com.framsticks.util.dispatching.Monitor;
Index: java/main/src/test/java/com/framsticks/test/TestConfiguration.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 105)
@@ -10,10 +10,10 @@
 import org.testng.annotations.*;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.util.dispatching.Dispatching.Waiter;
-import com.framsticks.util.dispatching.ExceptionHandler;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.dispatching.ExceptionDispatcherHandler;
 
 // import static org.fest.assertions.Assertions.*;
@@ -46,6 +46,6 @@
 	}
 
-	public ExceptionHandler createExceptionHandler() {
-		return new ExceptionHandler() {
+	public ExceptionDispatcherHandler createExceptionHandler() {
+		return new ExceptionDispatcherHandler() {
 			@Override
 			public boolean handle(Dispatcher<?> dispatcher, Throwable throwable) {
@@ -98,5 +98,5 @@
 	}
 
-	public final ExceptionResultHandler failOnException = new ExceptionResultHandler() {
+	public final ExceptionHandler failOnException = new ExceptionHandler() {
 		@Override
 		public void handle(FramsticksException e) {
Index: java/main/src/test/resources/configs/LocalTreeBrowserTest.xml
===================================================================
--- java/main/src/test/resources/configs/LocalTreeBrowserTest.xml	(revision 103)
+++ java/main/src/test/resources/configs/LocalTreeBrowserTest.xml	(revision 105)
@@ -2,5 +2,5 @@
 <Browser>
 	<import class="com.framsticks.model.ModelBuilder" />
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<!-- <import class="com.framsticks.model.ModelPackage" /> -->
 	<LocalTree name="model">
Index: java/main/src/test/resources/configs/ProcedureBrowserTest.xml
===================================================================
--- java/main/src/test/resources/configs/ProcedureBrowserTest.xml	(revision 103)
+++ java/main/src/test/resources/configs/ProcedureBrowserTest.xml	(revision 105)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Browser>
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<import class="com.framsticks.test.TestClass" />
 	<LocalTree name="test">
Index: java/main/src/test/resources/configs/ServerTest.xml
===================================================================
--- java/main/src/test/resources/configs/ServerTest.xml	(revision 103)
+++ java/main/src/test/resources/configs/ServerTest.xml	(revision 105)
@@ -3,5 +3,5 @@
 	<import class="com.framsticks.hosting.Server" />
 	<import class="com.framsticks.remote.RemoteTree" />
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<import class="com.framsticks.test.TestClass" />
 	<import class="com.framsticks.running.LoggingOutputListener" />
Index: java/main/src/test/resources/info/GenePool.info
===================================================================
--- java/main/src/test/resources/info/GenePool.info	(revision 105)
+++ java/main/src/test/resources/info/GenePool.info	(revision 105)
@@ -0,0 +1,103 @@
+class:
+id:GenePool
+
+prop:
+id:name
+name:Group name
+type:s
+
+prop:
+id:index
+name:group index
+type:d
+flags:35
+
+prop:
+id:size
+name:Number of items in the group
+type:d
+flags:3
+help:In standard.expdef, this is equivalent to the number of unique genotypes. Standard experiment definition uses the Genotype.instances field to indicate that some genotypes exist in multiple instances despite having only one item in the group. Other experiment definitions may create multiple copies of the same genotype.
+
+prop:
+id:totalpop
+name:Number of genotype instances
+type:d
+flags:3
+help:Takes into account the Genotype.instances field (which may give the total number of instances depending on the experiment definition).
+
+prop:
+id:fitness
+name:Fitness formula
+type:s 1
+help:(intended for advanced users)
+
+prop:
+id:fitfun
+name:Scale fitness?
+type:d 0 1 0
+help:Enables fitness scaling.
+
+prop:
+id:fitm
+name:Shift coefficient
+type:f 0 10 2
+help:~
+Lower threshold: how many standard deviations below average?
+(avg - n * stddev) - used for fitness shifting~
+
+prop:
+id:fitma
+name:Scaling coefficient
+type:f 1 10 2
+help:~
+The best genotype is as many times
+better than the average one.~
+
+prop:
+id:get
+name:get Genotype object
+type:p oGenotype(d index)
+flags:34
+
+prop:
+id:findGeno
+name:find Genotype index
+type:p d(oGeno)
+flags:34
+help:~
+Finds the Genotype matching the supplied Geno object.
+returns genotype index or -1 if not found.~
+
+prop:
+id:findUID
+name:find Genotype by UID
+type:p d(s uid)
+flags:34
+
+prop:
+id:addGeno
+name:make Genotype from Geno
+type:p oGenotype(oGeno)
+flags:34
+help:~
+Creates a new Genotype from the supplied Geno object.
+Returns the created Genotype.~
+
+prop:
+id:delete
+name:
+type:p(d genotype index)
+flags:34
+help:Deletes a genotype.
+
+prop:
+id:genotypes
+name:Genotypes
+type:l Genotype uid
+
+prop:
+id:genotypes_changed
+name:genotype list changed
+type:e ListChange
+
Index: java/main/src/test/resources/info/Population.info
===================================================================
--- java/main/src/test/resources/info/Population.info	(revision 105)
+++ java/main/src/test/resources/info/Population.info	(revision 105)
@@ -0,0 +1,232 @@
+class:
+id:Population
+
+prop:
+id:index
+name:group index
+type:d
+flags:35
+
+prop:
+id:name
+name:Group name
+type:s
+
+prop:
+id:size
+name:Number of creatures
+type:d
+flags:3
+
+prop:
+id:energy
+name:Energy calculation
+type:d 0 1 1
+help:If turned off, creature's energy will be constant.
+
+prop:
+id:death
+name:Death
+type:d 0 1 1
+help:Do creatures die when no energy?
+
+prop:
+id:nnsim
+name:Neural net simulation
+type:d 0 2 1 ~Off~Immediate~After stabilization
+help:Stabilization means no significant movement during a specified period of time.
+
+prop:
+id:perfperiod
+name:Performance sampling period
+type:d 0 1000000 100
+help:Defines how often onUpdate() events are called. Also used to compute partial performance of creatures (distance, speed, etc.) and to determine stabilization.
+
+prop:
+id:stabilperiod
+name:Sampling period while waiting
+type:d 0 1000000 100
+help:"Performance sampling period" for the stabilization phase.
+
+prop:
+id:killnostable
+name:Kill if no stabilization after
+type:d 0 10000000 1000000
+help:Creatures that fail to stabilize after the specified waiting period (e.g. because they are continuously rolling) will be killed. 0 disables this feature.
+
+prop:
+id:stabledist
+name:Allowed distance to be stable
+type:f 0 1 0.01
+help:A creature is considered stabilized when its center of gravity stays within the specified distance after the "Sampling period while waiting" has elapsed.
+
+prop:
+id:enableperf
+name:Performance calculation
+type:d 0 2 1 ~Off~Immediate~After stabilization
+help:Stabilization means no significant movement during a specified period of time.
+
+prop:
+id:colmask
+name:Collision mask (deprecated)
+type:db 0 65535 0
+flags:32
+help:DEPRECATED. You should use selfmask and othermask (these masks are also much easier to understand than the old colmask field).
+
+prop:
+id:selfmask
+name:Collision mask (self)
+type:db 0 2147483647 0
+flags:32
+help:~
+Collisions between objects can be handled in two ways:
+ - standard 'mechanical' collision (simple 'rebound' effect)
+ - special script handler (On[GROUPNAME]Collision function)
+
+In the script handler function, use the Collision object to access the two colliding parts of two creatures.
+The first part in the Collision object (i.e. Collision.Creature1) always concerns the creature that belongs to [GROUPNAME].
+The handler is called once for each creature that collides with the creature from [GROUPNAME].
+
+Collision masks determine which one will be used (none and both are also possible). On each collision, selfmask and othermask of the colliding objects are logically ANDed. 16 lower bits (0xffff) enable the standard handler. 16 higher bits (0xffff0000) enable the custom handler.
+Examples:
+
+1.With one group, all possible combinations of the collision handlers are as follows:
+  - ignore collisions (e.g. selfmask=othermask=0)
+  - use standard handling (e.g. selfmask=othermask=1)
+  - use custom handling (e.g. selfmask=othermask=0x10000)
+  - use standard and custom handling (e.g. selfmask=othermask=0x10001)
+
+2.Two groups yield more interesting cases. Let us consider the 'standard.expdef' setting:
+  Creatures: selfmask=0x10001, othermask=0x20001
+  Food colmask = selfmask=0x20002, othermask=0x10002
+There are three possible scenarios:
+- creature and creature: collision value = 0x10001 & 0x20001 = 1 -> Standard handling will be used (1 is one of the lower 16 bits)
+- food and food: collision value = 0x20002 & 0x10002 = 2 -> As above.
+- creature and food: collision value = (0x10001 & 0x10002) or (0x20002 & 0x20001) = 0x10000 or 0x20000 -> Custom handling will be used (higher 16 bits).
+~
+
+prop:
+id:othermask
+name:Collision mask (other)
+type:db 0 2147483647 0
+flags:32
+help:See selfmask.
+
+prop:
+id:bodysim
+name:Body simulation
+type:d 0 1 1
+help:Enable/disable physical body simulation. This is the initial value of Creature.bodysim for all objects created in this group. For details, see the documentation of Creature.bodysim.
+
+prop:
+id:selfcol
+name:Detect self-collisions
+type:d 0 1 0
+help:Detect collisions within creature bodies (only applicable for the ODE simulation engine). This is the initial value of Creature.selfcol for all objects created in this group. If enabled, creatures with self-colliding genotypes are not born, and others will have their sticks collide during lifespan.
+
+prop:
+id:em_stat
+name:Muscle static work
+type:f 0 1 0
+help:~
+Energy requirements for a muscle
+resisting an external force~
+
+prop:
+id:em_dyn
+name:Muscle dynamic work
+type:f 0 1 0
+help:~
+Energy requirements for a muscle
+moving a stick~
+
+prop:
+id:en_assim
+name:Assimilation productivity
+type:f 0 1 0
+help:~
+Maximal energy gain produced by a vertical specialized stick.
+Horizontal specialized sticks get half of this value.~
+
+prop:
+id:createFromGenotype
+name:
+type:p oCreature()
+flags:34
+help:Uses the selected Genotype object
+
+prop:
+id:createFromString
+name:
+type:p oCreature(s genotype)
+flags:34
+help:Uses the supplied string argument
+
+prop:
+id:createFromGeno
+name:
+type:p oCreature(oGeno)
+flags:34
+help:Uses the supplied Geno object
+
+prop:
+id:findUID
+name:find creature by UID
+type:p d(s uid)
+flags:34
+
+prop:
+id:get
+name:get creature object
+type:p oCreature(d index)
+flags:34
+
+prop:
+id:senseCreaturesProperty
+name:senseCreaturesProperty
+type:p f(f x,f y,f z,s propertyname,oCreature exclude)
+flags:34
+help:~
+arguments:
+ - x,y,z (sensor position)
+ - property (name, name[index] or Class:id). name[index] can be used for Vector objects inside the user fields, eg "user2[10]"
+ - exclude (creature object)
+works like a smell sensor for a given property (for all creatures in this group except "exclude").
+The following function reproduces the "classic" framsticks "S" sensor:
+function smellReceptorValue(x,y,z,exclude)
+{
+var i,s=0; for(i=0;i<Populations.size;i++)
+	s+=Populations[0].senseCreaturesProperty(x,y,z,"energy",exclude);
+return s;
+}~
+
+prop:
+id:findCreatureAt
+name:
+type:p oCreature(oVector point,oVector vector)
+flags:34
+
+prop:
+id:delete
+name:
+type:p(d creature index)
+flags:34
+help:delete creature
+
+prop:
+id:kill
+name:
+type:p(d creature index)
+flags:34
+help:kill creature
+
+prop:
+id:creatures
+name:Creatures
+type:l Creature uid
+
+prop:
+id:creatures_changed
+name:creatures list changed
+type:e ListChange
+
Index: java/main/src/test/resources/netfiles/standard.expt
===================================================================
--- java/main/src/test/resources/netfiles/standard.expt	(revision 105)
+++ java/main/src/test/resources/netfiles/standard.expt	(revision 105)
@@ -0,0 +1,328 @@
+sim_params:
+expdef:standard
+usercode:
+autosaveperiod:0
+overwrite:1
+filecomm:1
+createrr:1
+creatwarnfail:0
+importchk:0
+loadchk:0
+groupchk:0
+resetonexpdef:1
+initialgen:X
+capacity:200
+MaxCreated:1
+placement:0
+rotation:0
+creath:0.1
+p_nop:20
+evalcount:0
+p_mut:64
+p_xov:16
+xov_mins:0
+selrule:2
+delrule:0
+cr_c:0
+cr_life:0
+cr_v:1
+cr_gl:0
+cr_joints:0
+cr_nnsiz:0
+cr_nncon:0
+cr_di:0
+cr_vpos:0
+cr_vvel:0
+cr_norm:0
+cr_simi:0
+Energy0:5000
+e_meta:1
+feed:0
+feede0:200
+foodgen:
+feedtrans:1
+aging:0
+stagnation:0
+minfitness:0
+boostphase:1
+makesound:0
+savebest:0
+log:0
+notes:
+totaltestedcr:36
+totaltests:36
+wrldtyp:0
+wrldsiz:20
+wrldmap:
+wrldwat:-1
+wrldbnd:0
+wrldg:1
+simtype:0
+nnspeed:1
+odeshape:0
+odestep:0.05
+odemusclemin:0
+odemusclemax:10
+odemusclespeed:1
+odeairdrag:0.01
+odewaterdrag:0.5
+odewaterbuoy:1
+odeseed:0
+odesepsticks:0
+odeworlderp:0.2
+odeworldcfm:1e-05
+odecolmumin:0.1
+odecolmumax:5
+odecolbounce:0.1
+odecolbouncevel:0.01
+odecolsoftcfm:0
+odecolsofterp:0
+odecol2mumin:0.1
+odecol2mumax:1
+odecol2bounce:0.1
+odecol2bouncevel:0.01
+odecol2softcfm:0
+odecol2softerp:0
+gen_hilite:1
+gen_extmutinfo:0
+genoper_f0:0
+genoper_f1:0
+genoper_f2:0
+genoper_f3:0
+genoper_f4:0
+neuadd_N:1
+neuadd_Nu:0
+neuadd_G:1
+neuadd_T:1
+neuadd_S:1
+neuadd_Constant:1
+neuadd_Bend_muscle:1
+neuadd_Rotation_muscle:1
+neuadd_D:0
+neuadd_Fuzzy:0
+neuadd_VEye:0
+neuadd_VMotor:0
+neuadd_Sti:0
+neuadd_LMu:0
+neuadd_Water:0
+neuadd_Energy:0
+neuadd_Ch:0
+neuadd_ChMux:0
+neuadd_ChSel:0
+neuadd_Rnd:0
+neuadd_Sin:0
+neuadd_Delay:0
+neuadd_PIDV:0
+neuadd_Sf:0
+neuadd_Thr:0
+neuadd_Nn:0
+neuadd_SeeLight:0
+neuadd_PIDP:0
+neuadd_Light:0
+neuadd_SeeLight2:0
+f0_nodel_tag:1
+f0_nomod_tag:1
+f0_p_new:5
+f0_p_del:5
+f0_p_swp:10
+f0_p_pos:10
+f0_p_mas:10
+f0_p_frc:10
+f0_p_ing:10
+f0_p_asm:10
+f0_p_vsiz:0
+f0_j_new:5
+f0_j_del:5
+f0_j_stm:10
+f0_j_stf:10
+f0_j_rsf:10
+f0_j_vred:0
+f0_j_vgrn:0
+f0_j_vblu:0
+f0_n_new:5
+f0_n_del:5
+f0_n_prp:10
+f0_c_new:5
+f0_c_del:5
+f0_c_wei:10
+f1_xo_propor:0
+f1_smX:0.05
+f1_smJunct:0.02
+f1_smComma:0.02
+f1_smModif:0.1
+f1_mut_exmod:EeAaSsDdGgBbHh
+f1_nmNeu:0.05
+f1_nmConn:0.1
+f1_nmProp:0.1
+f1_nmWei:1
+f1_nmVal:0.05
+f2_mutAddOper:0.4
+f2_mutJointElem:0.33
+f2_mutNeuroElem:0.33
+f2_mutConnElem:0.33
+f2_mutDelOper:0.1
+f2_mutHandleOper:0.3
+f2_mutPropOper:0.2
+f3_mutSubstitution:0.6
+f3_mutSubstPerChar:0.1
+f3_mutDelIns:0.1
+f3_mutDelInsPerChar:0.05
+f3_mutDelInsLength:5
+f3_mutDuplication:0.05
+f3_mutTranslocation:0.15
+f3_xovGeneTransfer:0.8
+f3_xovCrossingOver:0.2
+f4_mut_add:50
+f4_mut_add_div:20
+f4_mut_add_conn:15
+f4_mut_add_neupar:5
+f4_mut_add_rep:10
+f4_mut_add_simp:50
+f4_mut_del:20
+f4_mut_mod:30
+genkonw0:1
+genkonw1:1
+genkonw2:1
+genkonw3:1
+genkonw4:1
+randinit:0.01
+nnoise:0
+touchrange:1
+bnoise_struct:0
+bnoise_vel:0
+ncl_N:1
+ncl_Nu:1
+ncl_G:1
+ncl_T:1
+ncl_S:1
+ncl_Constant:1
+ncl_Bend_muscle:1
+ncl_Rotation_muscle:1
+ncl_D:1
+ncl_Fuzzy:1
+ncl_VEye:1
+ncl_VMotor:1
+ncl_Sti:1
+ncl_LMu:1
+ncl_Water:1
+ncl_Energy:1
+ncl_Ch:1
+ncl_ChMux:1
+ncl_ChSel:1
+ncl_Rnd:1
+ncl_Sin:1
+ncl_Delay:1
+ncl_PIDV:1
+ncl_Sf:1
+ncl_Thr:1
+ncl_Nn:1
+ncl_SeeLight:1
+ncl_PIDP:1
+ncl_Light:1
+ncl_SeeLight2:1
+simil_method:0
+simil_parts:0
+simil_partdeg:1
+simil_neuro:0.5
+symPosSteps:10
+symAlphaSteps:20
+symBetaSteps:20
+minjoint:0
+maxjoint:2
+
+GenePool:
+name:Genotypes
+fitness:return 0.0+this.velocity*1.0;
+fitfun:0
+fitm:2
+fitma:2
+
+org:
+name:Uwuwit Si
+genotype:X
+info:
+num:1
+gnum:50
+popsiz:4
+lifespan:5000
+velocity:0
+distance:0
+vertvel:0
+vertpos:-0.01
+user1:null
+user2:null
+user3:null
+uid:g6501
+
+org:
+name:Igoras Sy
+genotype:X[*]
+info:300.00% mutation of 'Uwuwit Si'
+num:2
+gnum:51
+popsiz:3
+lifespan:5000
+velocity:0
+distance:0
+vertvel:0
+vertpos:-0.01
+user1:null
+user2:null
+user3:null
+uid:g6502
+
+org:
+name:Emofuf Sy
+genotype:wX[*]
+info:25.00% mutation of 'Igoras Sy'
+num:3
+gnum:52
+popsiz:3
+lifespan:5000
+velocity:0
+distance:0
+vertvel:0
+vertpos:-0.01
+user1:null
+user2:null
+user3:null
+uid:g6503
+
+Population:
+name:Creatures
+energy:1
+death:1
+nnsim:2
+perfperiod:100
+stabilperiod:100
+killnostable:1000000
+stabledist:0.01
+enableperf:2
+colmask:13
+selfmask:65537
+othermask:131073
+bodysim:1
+selfcol:0
+em_stat:0
+em_dyn:0
+en_assim:0
+
+Population:
+name:Food
+energy:1
+death:1
+nnsim:0
+perfperiod:100
+stabilperiod:100
+killnostable:1000000
+stabledist:0.01
+enableperf:0
+colmask:148
+selfmask:131074
+othermask:65538
+bodysim:1
+selfcol:0
+em_stat:0
+em_dyn:0
+en_assim:0
+
