Index: java/main/pom.xml
===================================================================
--- java/main/pom.xml	(revision 103)
+++ java/main/pom.xml	(revision 105)
@@ -57,7 +57,7 @@
 		</dependency>
 		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-			<version>2.3</version>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.1</version>
 		</dependency>
 		<dependency>
Index: java/main/src/main/java/com/framsticks/communication/ClientSideManagedConnection.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/ClientSideManagedConnection.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/ClientSideManagedConnection.java	(revision 105)
@@ -9,13 +9,12 @@
 import com.framsticks.communication.queries.UseRequest;
 import com.framsticks.communication.queries.VersionRequest;
-import com.framsticks.core.Path;
 import com.framsticks.params.ListSource;
+import com.framsticks.structure.Path;
 import com.framsticks.util.*;
 import com.framsticks.util.dispatching.AtOnceDispatcher;
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.JoinableState;
 import com.framsticks.util.lang.Casting;
@@ -195,5 +194,5 @@
 	}
 
-	private void sendNextUseRequest(final Iterator<String> featuresIterator, final Future<Void> future) {
+	private void sendNextUseRequest(final Iterator<String> featuresIterator, final FutureHandler<Void> future) {
 		if (!featuresIterator.hasNext()) {
 			future.pass(null);
@@ -214,5 +213,5 @@
 	}
 
-	private void sendQueryVersion(final int version, final Future<Void> future) {
+	private void sendQueryVersion(final int version, final FutureHandler<Void> future) {
 		send(new VersionRequest().version(version), new ClientSideResponseFuture(future) {
 			@Override
@@ -335,5 +334,5 @@
 		}
 
-		final Future<File> future = new Future<File>() {
+		final FutureHandler<File> future = new FutureHandler<File>() {
 
 			protected void send(final File result) {
@@ -415,5 +414,5 @@
 	}
 
-	protected final ExceptionResultHandler closeOnFailure = new ExceptionResultHandler() {
+	protected final ExceptionHandler closeOnFailure = new ExceptionHandler() {
 
 		@Override
@@ -428,5 +427,5 @@
 		startClientConnection(this);
 
-		sendQueryVersion(1, new FutureHandler<Void>(closeOnFailure) {
+		sendQueryVersion(1, new Future<Void>(closeOnFailure) {
 
 			@Override
@@ -451,5 +450,5 @@
 	protected final Map<String, EventListener<File>> registeredListeners = new HashMap<>();
 
-	public <C> void addListener(String path, final EventListener<File> listener, final Dispatcher<C> dispatcher, final Future<Void> future) {
+	public <C> void addListener(String path, final EventListener<File> listener, final Dispatcher<C> dispatcher, final FutureHandler<Void> future) {
 		send(new RegisterRequest().path(path), dispatcher, new ClientSideResponseFuture(future) {
 			@Override
@@ -463,5 +462,5 @@
 	}
 
-	public <C> void removeListener(EventListener<File> listener, final Dispatcher<C> dispatcher, final Future<Void> future) {
+	public <C> void removeListener(EventListener<File> listener, final Dispatcher<C> dispatcher, final FutureHandler<Void> future) {
 		String eventPath = null;
 		synchronized (registeredListeners) {
Index: java/main/src/main/java/com/framsticks/communication/ClientSideRawConnection.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/ClientSideRawConnection.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/ClientSideRawConnection.java	(revision 105)
@@ -2,5 +2,5 @@
 
 import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.dispatching.RunAt;
 
@@ -23,5 +23,5 @@
 	}
 
-	public void send(final String line, ExceptionResultHandler handler) {
+	public void send(final String line, ExceptionHandler handler) {
 
 		senderThread.dispatch(new RunAt<ClientSideRawConnection>(handler) {
Index: java/main/src/main/java/com/framsticks/communication/ClientSideResponseFuture.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/ClientSideResponseFuture.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/ClientSideResponseFuture.java	(revision 105)
@@ -1,11 +1,11 @@
 package com.framsticks.communication;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 
-public abstract class ClientSideResponseFuture extends FutureHandler<Response> {
+public abstract class ClientSideResponseFuture extends Future<Response> {
 
-	public ClientSideResponseFuture(ExceptionResultHandler handler) {
+	public ClientSideResponseFuture(ExceptionHandler handler) {
 		super(handler);
 	}
Index: java/main/src/main/java/com/framsticks/communication/Connection.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/Connection.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/Connection.java	(revision 105)
@@ -5,4 +5,5 @@
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.io.Encoding;
@@ -25,5 +26,4 @@
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableCollection;
@@ -35,5 +35,5 @@
 
 @FramsClassAnnotation
-public abstract class Connection extends AbstractJoinable implements JoinableParent, ExceptionResultHandler {
+public abstract class Connection extends AbstractJoinable implements JoinableParent, ExceptionHandler {
 
 	protected final static Logger log = LogManager.getLogger(Connection.class);
@@ -52,5 +52,5 @@
 	protected final Set<ConnectionListener> listeners = new HashSet<>();
 
-	protected ExceptionResultHandler exceptionHandler = ThrowExceptionHandler.getInstance();
+	protected ExceptionHandler exceptionHandler = ThrowExceptionHandler.getInstance();
 
 	/**
@@ -301,5 +301,5 @@
 	 * @return the handler
 	 */
-	public ExceptionResultHandler getExceptionHandler() {
+	public ExceptionHandler getExceptionHandler() {
 		return exceptionHandler;
 	}
@@ -308,5 +308,5 @@
 	 * @param handler the handler to set
 	 */
-	public void setExceptionHandler(ExceptionResultHandler handler) {
+	public void setExceptionHandler(ExceptionHandler handler) {
 		this.exceptionHandler = handler;
 	}
@@ -346,5 +346,5 @@
 	}
 
-	public final void sendFile(final String header, final File file, final Integer id, ExceptionResultHandler handler) {
+	public final void sendFile(final String header, final File file, final Integer id, ExceptionHandler handler) {
 		senderThread.dispatch(new RunAt<Connection>(handler) {
 			@Override
Index: java/main/src/main/java/com/framsticks/communication/File.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/File.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/File.java	(revision 105)
@@ -1,6 +1,4 @@
 package com.framsticks.communication;
 
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -31,10 +29,4 @@
 	}
 
-	public static List<File> single(File file) {
-		List<File> result = new ArrayList<File>();
-		result.add(file);
-		return result;
-	}
-
 	@Override
 	public String toString() {
Index: java/main/src/main/java/com/framsticks/communication/RequestHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/RequestHandler.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/RequestHandler.java	(revision 105)
@@ -2,10 +2,10 @@
 
 import com.framsticks.communication.queries.ApplicationRequest;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.ExceptionHandler;
 
 /**
  * @author Piotr Sniegowski
  */
-public interface RequestHandler extends ExceptionResultHandler {
+public interface RequestHandler extends ExceptionHandler {
 	public void handle(ApplicationRequest request, ServerSideResponseFuture responseCallback);
 }
Index: java/main/src/main/java/com/framsticks/communication/Response.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/Response.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/Response.java	(revision 105)
@@ -1,4 +1,5 @@
 package com.framsticks.communication;
 
+import java.util.Arrays;
 import java.util.List;
 
@@ -10,4 +11,8 @@
 	protected final String comment;
 	protected final List<File> files;
+
+	public Response(boolean ok, String comment, File... files) {
+		this(ok, comment, (files.length == 0 ? null : Arrays.asList(files)));
+	}
 
 	public Response(boolean ok, String comment, List<File> files) {
Index: java/main/src/main/java/com/framsticks/communication/ServerSideManagedConnection.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/ServerSideManagedConnection.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/ServerSideManagedConnection.java	(revision 105)
@@ -46,5 +46,5 @@
 		if (request instanceof ProtocolRequest) {
 			if (request instanceof VersionRequest) {
-				responseCallback.pass(new Response(true, null, null));
+				responseCallback.pass(new Response(true, null));
 				return;
 			}
@@ -53,16 +53,16 @@
 				if (feature.equals("request_id")) {
 					requestIdEnabled = true;
-					responseCallback.pass(new Response(true, null, null));
+					responseCallback.pass(new Response(true, null));
 					return;
 				}
 				if (feature.equals("call_empty_result")) {
-					responseCallback.pass(new Response(true, null, null));
+					responseCallback.pass(new Response(true, null));
 					return;
 				}
 				if (feature.equals("needfile_id")) {
-					responseCallback.pass(new Response(true, null, null));
+					responseCallback.pass(new Response(true, null));
 					return;
 				}
-				responseCallback.pass(new Response(false, "unknown feature: " + feature, null));
+				responseCallback.pass(new Response(false, "unknown feature: " + feature));
 				return;
 			}
@@ -70,5 +70,5 @@
 		}
 		log.error("unhandled request: {}", request);
-		responseCallback.pass(new Response(false, "unhandled", null));
+		responseCallback.pass(new Response(false, "unhandled"));
 	}
 
@@ -120,5 +120,5 @@
 			e.arg("id", id.get()).arg("line", line);
 			log.error("error: ", e);
-			respond(new Response(false, "invalid input: " + e.getMsg(), null), id.get());
+			respond(new Response(false, "invalid input: " + e.getMsg()), id.get());
 			return;
 		}
Index: java/main/src/main/java/com/framsticks/communication/ServerSideResponseFuture.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/ServerSideResponseFuture.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/ServerSideResponseFuture.java	(revision 105)
@@ -2,14 +2,14 @@
 
 import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 
 /**
  * @author Piotr Sniegowski
  */
-public abstract class ServerSideResponseFuture extends Future<Response> {
+public abstract class ServerSideResponseFuture extends FutureHandler<Response> {
 
 	@Override
 	public final void handle(FramsticksException e) {
-		result(new Response(false, e.getClass().getCanonicalName() + ": " + e.getMessage(), null));
+		result(new Response(false, e.getClass().getCanonicalName() + ": " + e.getMessage()));
 	}
 
Index: java/main/src/main/java/com/framsticks/communication/queries/NeedFile.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/queries/NeedFile.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/queries/NeedFile.java	(revision 105)
@@ -2,5 +2,5 @@
 
 import com.framsticks.communication.File;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.lang.Strings;
 
@@ -9,5 +9,5 @@
 	protected final String suggestedName;
 	protected final String description;
-	protected final Future<File> future;
+	protected final FutureHandler<File> future;
 
 	/**
@@ -16,5 +16,5 @@
 	 * @param future
 	 */
-	public NeedFile(String suggestedName, String description, Future<File> future) {
+	public NeedFile(String suggestedName, String description, FutureHandler<File> future) {
 		this.suggestedName = suggestedName;
 		this.description = description;
@@ -39,5 +39,5 @@
 	 * @return the future
 	 */
-	public Future<File> getFuture() {
+	public FutureHandler<File> getFuture() {
 		return future;
 	}
Index: java/main/src/main/java/com/framsticks/communication/queries/RegisterRequest.java
===================================================================
--- java/main/src/main/java/com/framsticks/communication/queries/RegisterRequest.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/communication/queries/RegisterRequest.java	(revision 105)
@@ -1,5 +1,5 @@
 package com.framsticks.communication.queries;
 
-import com.framsticks.core.Path;
+import com.framsticks.structure.Path;
 import com.framsticks.util.lang.Pair;
 
Index: java/main/src/main/java/com/framsticks/core/AbstractTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/AbstractTree.java	(revision 103)
+++ 	(revision )
@@ -1,341 +1,0 @@
-package com.framsticks.core;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.PriorityQueue;
-
-import javax.annotation.Nonnull;
-
-import org.apache.commons.collections.map.ReferenceIdentityMap;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
-import com.framsticks.communication.queries.NeedFile;
-import com.framsticks.communication.queries.NeedFileAcceptor;
-import com.framsticks.params.Access;
-import com.framsticks.params.CompositeParam;
-import com.framsticks.params.FramsClass;
-import com.framsticks.params.ParamFlags;
-import com.framsticks.params.ParamsPackage;
-import com.framsticks.params.Registry;
-import com.framsticks.params.annotations.AutoAppendAnnotation;
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.annotations.ParamAnnotation;
-import com.framsticks.util.FramsticksException;
-import com.framsticks.util.Misc;
-import com.framsticks.util.dispatching.AbstractJoinable;
-import com.framsticks.util.dispatching.BufferedDispatcher;
-import com.framsticks.util.dispatching.Dispatcher;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.Joinable;
-import com.framsticks.util.dispatching.JoinableParent;
-import com.framsticks.util.dispatching.JoinableState;
-import com.framsticks.util.dispatching.RunAt;
-import com.framsticks.util.dispatching.ThrowExceptionHandler;
-import com.framsticks.util.lang.Pair;
-
-/**
- * @author Piotr Sniegowski
- */
-@FramsClassAnnotation
-public abstract class AbstractTree extends AbstractJoinable implements Tree, JoinableParent, NeedFileAcceptor {
-
-	private static final Logger log = LogManager.getLogger(AbstractTree.class);
-
-	private Node root = null;
-	private ExceptionResultHandler handler = ThrowExceptionHandler.getInstance();
-
-	protected final BufferedDispatcher<Tree> bufferedDispatcher = new BufferedDispatcher<>(this);
-
-	protected final PriorityQueue<Pair<Integer, NeedFileAcceptor>> needFileAcceptors = new PriorityQueue<>(32, new Comparator<Pair<Integer, NeedFileAcceptor>>() {
-
-		@Override
-		public int compare(Pair<Integer, NeedFileAcceptor> arg0, Pair<Integer, NeedFileAcceptor> arg1) {
-			if (arg0.first < arg1.first) {
-				return -1;
-			}
-			if (arg0.first > arg1.first) {
-				return 1;
-			}
-			return 0;
-		}
-	});
-
-	@Override
-	public void assignRootParam(CompositeParam param) {
-		if (root != null) {
-			throw new FramsticksException().msg("root has already specified type");
-		}
-		root = new Node(this, param, null);
-		log.debug("assigned root type: {}", root);
-	}
-
-	@Override
-	public void assignRootObject(Object object) {
-		if (root == null) {
-			throw new FramsticksException().msg("root has no type specified");
-		}
-		if (root.getObject() != null) {
-			throw new FramsticksException().msg("root has already object assigned").arg("current", root.getObject()).arg("candidate", object);
-		}
-		root = new Node(this, root.getParam(), object);
-		log.debug("assigned root object: {}", root);
-	}
-
-	@Override
-	public @Nonnull Node getAssignedRoot() {
-		if (root == null) {
-			throw new FramsticksException().msg("root has no type specified yet").arg("in", this);
-		}
-		return root;
-	}
-
-	public boolean isRootAssigned() {
-		// assert isActive();
-		return root != null;
-	}
-
-	protected String name;
-
-	public AbstractTree() {
-		setName("tree");
-
-		registry.registerAndBuild(Result.class);
-		registry.registerAndBuild(ValueChange.class);
-		registry.registerAndBuild(ListChange.class);
-		registry.registerAndBuild(Message.class);
-	}
-
-	protected void tryRegisterOnChangeEvents(Path path) {
-
-	}
-
-	@Override
-	public final FramsClass getInfoFromCache(String id) {
-		assert isActive();
-		return registry.getFramsClass(id);
-	}
-
-	protected Registry registry = new Registry();
-
-
-	@Override
-	public @Nonnull Access prepareAccess(CompositeParam param) {
-		return registry.prepareAccess(param);
-	}
-
-	@Override
-	public void takeAllFrom(Registry source) {
-		registry.takeAllFrom(source);
-	}
-
-	@AutoAppendAnnotation
-	public void usePackage(ParamsPackage paramsPackage) {
-		log.debug("using package {} in tree {}", paramsPackage, this);
-		paramsPackage.register(registry);
-	}
-
-	@AutoAppendAnnotation
-	public void takeFromRegistry(Registry registry) {
-		log.debug("taking from registry {} in tree {}", registry, this);
-		this.registry.takeAllFrom(registry);
-	}
-
-
-	@Override
-	public void putInfoIntoCache(FramsClass framclass) {
-		registry.putFramsClass(framclass);
-	}
-
-
-	/**
-	 * @return the handler
-	 */
-	@Override
-	public ExceptionResultHandler getExceptionHandler() {
-		return handler;
-	}
-
-	/**
-	 * @param handler the handler to set
-	 */
-	@Override
-	public void setExceptionHandler(ExceptionResultHandler handler) {
-		this.handler = handler;
-	}
-
-	@Override
-	public void handle(FramsticksException exception) {
-		handler.handle(exception);
-	}
-
-	/**
-	 * @return the dispatcher
-	 */
-	@Override
-	public Dispatcher<Tree> getDispatcher() {
-		return bufferedDispatcher;
-	}
-
-	/**
-	 * @param dispatcher the dispatcher to set
-	 */
-	@Override
-	public void setDispatcher(Dispatcher<Tree> dispatcher) {
-		bufferedDispatcher.setTargetDispatcher(dispatcher);
-	}
-
-	/**
-	 * @return the name
-	 */
-	@ParamAnnotation(flags = ParamFlags.USERREADONLY)
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param name the name to set
-	 */
-	@ParamAnnotation
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * @return the registry
-	 */
-	@Override
-	public Registry getRegistry() {
-		return registry;
-	}
-
-	@Override
-	protected void joinableStart() {
-		bufferedDispatcher.createThreadIfNeeded();
-		Dispatching.use(bufferedDispatcher, this);
-	}
-
-	@Override
-	protected void joinableInterrupt() {
-		Dispatching.drop(bufferedDispatcher, this);
-	}
-
-	@Override
-	protected void joinableFinish() {
-
-	}
-
-	@Override
-	protected void joinableJoin() throws InterruptedException {
-		Dispatching.join(bufferedDispatcher);
-	}
-
-	@Override
-	public void childChangedState(Joinable joinable, JoinableState state) {
-		if (joinable == bufferedDispatcher) {
-			proceedToState(state);
-		}
-	}
-
-	@Override
-	public boolean isActive() {
-		return bufferedDispatcher.isActive();
-	}
-
-	@Override
-	public void dispatch(RunAt<? extends Tree> runnable) {
-		bufferedDispatcher.dispatch(runnable);
-	}
-
-
-	@SuppressWarnings("unchecked")
-	protected final Map<Object, Object> sideNotes = (Map<Object, Object>) new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
-
-	@Override
-	public <T> void putSideNote(Object object, SideNoteKey<T> key, T value) {
-		assert isActive();
-		Misc.throwIfNull(object);
-		Misc.throwIfNull(key);
-		Misc.throwIfNull(value);
-		Object sideNote = sideNotes.get(object);
-		if (sideNote == null) {
-			sideNote = new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
-			sideNotes.put(object, sideNote);
-		}
-		@SuppressWarnings("unchecked")
-		Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
-		sideNotesMap.put(key, value);
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public <T> T getSideNote(Object object, SideNoteKey<T> key) {
-		assert isActive();
-		Misc.throwIfNull(object);
-		Misc.throwIfNull(key);
-		Object sideNote = sideNotes.get(object);
-		if (sideNote == null) {
-			return null;
-		}
-		Object value = ((Map<SideNoteKey<?>, Object>) sideNote).get(key);
-		if (value == null) {
-			return null;
-		}
-		return (T) value;
-	}
-
-	@Override
-	public boolean removeSideNote(Object object, SideNoteKey<?> key) {
-		assert isActive();
-		Object sideNote = sideNotes.get(object);
-		if (sideNote == null) {
-			return false;
-		}
-		@SuppressWarnings("unchecked")
-		Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
-		boolean result = (sideNotesMap.remove(key) != null);
-		if (sideNotesMap.isEmpty()) {
-			sideNotes.remove(object);
-		}
-		return result;
-	}
-
-	@Override
-	public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor) {
-		assert isActive();
-		needFileAcceptors.add(Pair.make(priority, acceptor));
-	}
-
-	@Override
-	public void removeNeedFileAcceptor(NeedFileAcceptor acceptor) {
-		assert isActive();
-		Iterator<Pair<Integer, NeedFileAcceptor>> i = needFileAcceptors.iterator();
-		while (i.hasNext()) {
-			if (i.next().second == acceptor) {
-				i.remove();
-				break;
-			}
-		}
-	}
-
-	@Override
-	public boolean acceptNeed(final NeedFile needFile) {
-		Dispatching.dispatchIfNotActive(this, new RunAt<AbstractTree>(needFile.getFuture()) {
-
-			@Override
-			protected void runAt() {
-				for (Pair<Integer, NeedFileAcceptor> acceptor : needFileAcceptors) {
-					if (acceptor.second.acceptNeed(needFile)) {
-						return;
-					}
-				}
-				throw new FramsticksException().msg("failed to find need file acceptor in tree").arg("tree", AbstractTree.this).arg("needfile", needFile);
-			}
-		});
-		return true;
-	}
-
-}
-
Index: java/main/src/main/java/com/framsticks/core/ListChange.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/ListChange.java	(revision 103)
+++ 	(revision )
@@ -1,120 +1,0 @@
-package com.framsticks.core;
-
-import java.util.Arrays;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.annotations.ParamAnnotation;
-import com.framsticks.util.Misc;
-import com.framsticks.util.lang.Strings;
-
-/**
- * @author Piotr Sniegowski
- */
-@FramsClassAnnotation(order = {"type", "pos", "id", "hint"})
-public class ListChange {
-
-	public static enum Action {
-		Add,
-		Remove,
-		Modify
-	}
-
-
-	public ListChange(Action action, Integer position, String identifier, Object... hints) {
-		this.action = action;
-		this.position = position;
-		this.identifier = identifier;
-		if (hints.length != 0) {
-			this.hints = new TreeSet<>();
-			for (Object h : hints) {
-				this.hints.add(h.toString());
-			}
-		}
-	}
-
-	/**
-	 *
-	 */
-	public ListChange() {
-	}
-
-	public Action getAction() {
-		return action;
-	}
-
-	public Integer getPosition() {
-		return position;
-	}
-
-	public String getIdentifier() {
-		return identifier;
-	}
-
-
-	public boolean hasHint(String hint) {
-		if (hints == null) {
-			return false;
-		}
-		return hints.contains(hint);
-	}
-
-
-	public Action action = Action.Add;
-	@ParamAnnotation(id = "pos", def = "-1")
-	public Integer position;
-	@ParamAnnotation(id = "id")
-	public String identifier;
-
-	protected Set<String> hints;
-
-	@ParamAnnotation
-	public String getHints() {
-		return StringUtils.join(hints, ",");
-	}
-
-	@ParamAnnotation
-	public void setHints(String hints) {
-		if (!Strings.notEmpty(hints)) {
-			this.hints = null;
-			return;
-		}
-		this.hints = new TreeSet<>();
-		this.hints.addAll(Arrays.asList(StringUtils.split(hints, ",")));
-	}
-
-	@ParamAnnotation
-	public Integer getType() { return action.ordinal(); }
-	@ParamAnnotation
-	public void setType(Integer type) { action = Action.values()[type]; }
-
-	public String getBestIdentifier() {
-		if (Strings.notEmpty(identifier)) {
-			return identifier;
-		}
-		return position.toString();
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder b = new StringBuilder();
-		b.append(action).append(" ").append(identifier).append(" ").append(position);
-		if (hints != null && !hints.isEmpty()) {
-			b.append(" ").append(getHints());
-		}
-		return b.toString();
-	}
-
-	@Override
-	public boolean equals(Object object) {
-		if (object instanceof ListChange) {
-			ListChange r = (ListChange) object;
-			return Misc.equals(action, r.action) && Misc.equals(position, r.position) && Misc.equals(identifier, r.identifier) && Misc.equals(hints, r.hints);
-		}
-		return false;
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/LocalTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/LocalTree.java	(revision 103)
+++ 	(revision )
@@ -1,194 +1,0 @@
-package com.framsticks.core;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
-import com.framsticks.params.Access;
-import com.framsticks.params.CompositeParam;
-import com.framsticks.params.EventListener;
-import com.framsticks.params.FramsClass;
-import com.framsticks.params.ParamBuilder;
-import com.framsticks.params.PrimitiveParam;
-import com.framsticks.params.annotations.AutoAppendAnnotation;
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.types.EventParam;
-import com.framsticks.params.types.ProcedureParam;
-import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.Dispatcher;
-import com.framsticks.util.dispatching.DispatcherSetable;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.Joinable;
-import com.framsticks.util.dispatching.JoinableState;
-import com.framsticks.util.lang.Casting;
-
-import static com.framsticks.core.TreeOperations.*;
-
-@FramsClassAnnotation
-public final class LocalTree extends AbstractTree {
-	private static final Logger log = LogManager.getLogger(LocalTree.class);
-
-	protected Joinable joinableRootObject;
-
-	/**
-	 *
-	 */
-	public LocalTree() {
-		super();
-		bufferedDispatcher.setBuffer(false);
-	}
-
-	@SuppressWarnings({ "rawtypes", "unchecked" })
-	@AutoAppendAnnotation
-	public void setRootObject(Object object) {
-		final Class<?> javaClass = object.getClass();
-		registry.registerAndBuild(javaClass);
-
-		Access access = registry.createAccess(javaClass);
-
-		assignRootParam(access.buildParam(new ParamBuilder()).id(getName()).finish(CompositeParam.class));
-		assignRootObject(object);
-
-		if (object instanceof Joinable) {
-			joinableRootObject = (Joinable) object;
-		}
-		if (object instanceof DispatcherSetable) {
-			DispatcherSetable<?> setable = (DispatcherSetable<?>) object;
-			setable.setDispatcher((Dispatcher) this);
-		}
-	}
-
-	public Object getRootObject() {
-		Object result = getAssignedRoot().getObject();
-		if (result == null) {
-			throw new FramsticksException().msg("object tree is empty").arg("tree", this);
-		}
-		return result;
-	}
-
-	public <T> T getRootObject(Class<T> type) {
-		Object result = getRootObject();
-		if (!type.isInstance(result)) {
-			throw new FramsticksException().msg("object tree holds object of different kind").arg("object", result).arg("requested", type).arg("tree", this);
-		}
-		return type.cast(result);
-	}
-
-	@Override
-	public void get(Path path, Future<Path> future) {
-		assert isActive();
-		log.debug("requesting: {}", path);
-		path = resolveTopSync(path);
-		future.pass(path);
-	}
-
-	// @Override
-	// public void get(Path path, ValueParam param, Future<Object> future) {
-	//	assert isActive();
-	//	path = resolveTopSync(path);
-	//	future.pass(bindAccess(path).get(param, Object.class));
-	// }
-
-	@Override
-	public <R> void call(Path path, ProcedureParam param, Object[] arguments, Class<R> resultType, Future<R> future) {
-		assert isActive();
-		try {
-			Object result = bindAccess(path).call(param, arguments);
-			future.pass(Casting.nullOrThrowCast(resultType, result));
-		} catch (FramsticksException e) {
-			future.handle(e);
-		}
-	}
-
-	@Override
-	public void info(Path path, Future<FramsClass> future) {
-		assert isActive();
-		Path p = path.tryResolveIfNeeded();
-		Class<?> javaClass = p.getTopObject().getClass();
-		FramsClass framsClass = registry.registerReflectedIfNeeded(javaClass);
-		if (framsClass != null) {
-			future.pass(framsClass);
-		} else {
-			future.handle(new FramsticksException().msg("failed to find info for class").arg("java class", javaClass));
-		}
-	}
-
-	protected Path resolveTopSync(Path path) {
-		assert isActive();
-		assert path.isOwner(this);
-		if (path.getTop().getObject() != null) {
-			return path;
-		}
-		Access access = bindAccess(path.getUnder());
-		Object object = access.get(path.getTop().getParam(), Object.class);
-		if (object == null) {
-			throw new FramsticksException().msg("failed to resolve").arg("path", path);
-		}
-		return path.appendResolution(object);
-	}
-
-
-	@Override
-	public void set(Path path, PrimitiveParam<?> param, Object value, final Future<Integer> future) {
-		assert isActive();
-		future.pass(bindAccess(path).set(param, value));
-	}
-
-	public <A> void addListener(Path path, EventParam param, EventListener<A> listener, Class<A> argumentType, Future<Void> future) {
-		assert isActive();
-		try {
-			bindAccess(path).reg(param, listener);
-			future.pass(null);
-		} catch (FramsticksException e) {
-			future.handle(e);
-		}
-	}
-
-	public void removeListener(Path path, EventParam param, EventListener<?> listener, Future<Void> future) {
-		assert isActive();
-		try {
-			bindAccess(path).regRemove(param, listener);
-			future.pass(null);
-		} catch (FramsticksException e) {
-			future.handle(e);
-		}
-	}
-
-	@Override
-	protected void joinableStart() {
-		super.joinableStart();
-		if (joinableRootObject != null) {
-			Dispatching.use(joinableRootObject, this);
-		}
-	}
-
-	@Override
-	protected void joinableInterrupt() {
-		if (joinableRootObject != null) {
-			Dispatching.drop(joinableRootObject, this);
-		}
-		super.joinableInterrupt();
-	}
-
-	@Override
-	protected void joinableFinish() {
-		super.joinableFinish();
-	}
-
-	@Override
-	protected void joinableJoin() throws InterruptedException {
-		if (joinableRootObject != null) {
-			Dispatching.join(joinableRootObject);
-		}
-		super.joinableJoin();
-	}
-
-	@Override
-	public void childChangedState(Joinable joinable, JoinableState state) {
-		super.childChangedState(joinable, state);
-		if (joinable == joinableRootObject) {
-			proceedToState(state);
-		}
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/Message.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/Message.java	(revision 103)
+++ 	(revision )
@@ -1,48 +1,0 @@
-package com.framsticks.core;
-
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.annotations.ParamAnnotation;
-
-@FramsClassAnnotation(id = "Msg", name = "Msg")
-public class Message {
-
-	@ParamAnnotation(id = "class", name = "class")
-	public String className;
-
-	@ParamAnnotation
-	public String function;
-
-	@ParamAnnotation
-	public String message;
-
-	@ParamAnnotation
-	public int level;
-
-	/**
-	 *
-	 */
-	public Message() {
-	}
-
-
-	/**
-	 * @param function
-	 * @param message
-	 * @param level
-	 */
-	public Message(String className, String function, String message, int level) {
-		this.className = className;
-		this.function = function;
-		this.message = message;
-		this.level = level;
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder b = new StringBuilder();
-		b.append("[").append(level).append("] ");
-		b.append(className).append(".").append(function);
-		b.append(": ").append(message);
-		return b.toString();
-	}
-}
Index: java/main/src/main/java/com/framsticks/core/Node.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/Node.java	(revision 103)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package com.framsticks.core;
-
-import javax.annotation.Nonnull;
-import javax.annotation.concurrent.Immutable;
-
-import com.framsticks.params.CompositeParam;
-import com.framsticks.util.FramsticksException;
-// import com.framsticks.params.ParamBuilder;
-import com.framsticks.util.lang.Strings;
-
-/**
- * @author Piotr Sniegowski
- */
-@Immutable
-public class Node {
-
-	protected final Tree tree;
-	protected final CompositeParam param;
-	protected final Object object;
-
-	public Node(Tree tree, @Nonnull CompositeParam param, Object object) {
-		assert param != null;
-		assert tree != null;
-		this.tree = tree;
-		this.param = param;
-		this.object = object;
-	}
-
-
-	public final Tree getTree() {
-		return tree;
-	}
-
-	public final CompositeParam getParam() {
-		return param;
-	}
-
-	public final Object getObject() {
-		return object;
-	}
-
-	@Override
-	public String toString() {
-		return param.toString() + ":" + Strings.toStringNullProof(object, "<null>");
-	}
-
-	public final boolean isResolved() {
-		return object != null;
-	}
-
-	public Node assureResolved() {
-		if (!isResolved()) {
-			throw new FramsticksException().msg("path is not resolved").arg("node", this);
-		}
-		return this;
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/Path.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/Path.java	(revision 103)
+++ 	(revision )
@@ -1,361 +1,0 @@
-package com.framsticks.core;
-
-import com.framsticks.params.Access;
-import com.framsticks.params.CompositeParam;
-import com.framsticks.params.Param;
-import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.IgnoreExceptionHandler;
-import com.framsticks.util.lang.Pair;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.annotation.Nonnull;
-import javax.annotation.concurrent.Immutable;
-
-import org.apache.commons.collections.ListUtils;
-
-/**
- * @author Piotr Sniegowski
- */
-@Immutable
-public final class Path {
-	// private final static Logger log = LogManager.getLogger(Path.class.getName());
-
-	final Tree tree;
-	final String textual;
-	final LinkedList<Node> nodes;
-
-	public static final SideNoteKey<CompositeParam> OBJECT_PARAM_KEY = SideNoteKey.make(CompositeParam.class);
-
-	protected static Object getKnownChild(Tree tree, Access access, CompositeParam param, ExceptionResultHandler handler) {
-		Object child = access.get(param, Object.class);
-		if (child == null) {
-			return null;
-		}
-		try {
-			tree.prepareAccess(param);
-			tree.putSideNote(child, OBJECT_PARAM_KEY, param);
-			return child;
-		} catch (FramsticksException e) {
-			handler.handle(e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param tree
-	 * @param textual
-	 * @param nodes
-	 */
-	Path(Tree tree, String textual, LinkedList<Node> nodes) {
-		this.tree = tree;
-		this.textual = textual;
-		this.nodes = nodes;
-	}
-
-	public Path appendNode(Node node) {
-		assert isResolved();
-		return new PathBuilder().tree(tree).textual(textual + ((size() == 1) ? "" : "/") + node.getParam().getId()).add(nodes).add(node).finish();
-	}
-
-	public Path appendParam(CompositeParam param) {
-		assert isResolved();
-		return appendNode(new Node(tree, param, null));
-	}
-
-	public static class PathBuilder {
-
-		Tree tree;
-		String textual;
-		final LinkedList<Node> nodes = new LinkedList<Node>();
-
-		public Path finish() {
-			assert tree != null;
-			assert textual != null;
-			return new Path(tree, textual, nodes);
-		}
-
-		public PathBuilder()
-		{
-		}
-
-		public PathBuilder tree(Tree tree) {
-			this.tree = tree;
-			return this;
-		}
-
-		public PathBuilder textual(String textual) {
-			this.textual = textual;
-			return this;
-		}
-
-		public PathBuilder add(List<Node> nodes) {
-			this.nodes.addAll(nodes);
-			return this;
-		}
-
-		public PathBuilder add(Node node) {
-			this.nodes.add(node);
-			return this;
-		}
-
-		public PathBuilder setLast(Object object) {
-			Node n = nodes.pollLast();
-			nodes.add(new Node(n.getTree(), n.getParam(), object));
-			return this;
-		}
-
-		public PathBuilder buildUpTo(List<Node> nodes, Node node) {
-			StringBuilder b = new StringBuilder();
-			boolean add = false;
-			for (Node n : nodes) {
-				this.nodes.add(n);
-				if (add) {
-					b.append("/").append(n.getParam().getId());
-				}
-				add = true;
-				if (n == node) {
-					break;
-				}
-			}
-			this.textual = (nodes.size() == 1) ? "/" : b.toString();
-			return this;
-		}
-
-		public static Iterator<String> splitPath(String path) {
-			List<String> list = new LinkedList<String>();
-			for (String s : path.split("/")) {
-				if (!s.isEmpty()) {
-					list.add(s);
-				}
-			}
-			return list.iterator();
-		}
-
-		public PathBuilder resolve(@Nonnull Tree tree, String textual) {
-			return resolve(tree, textual, IgnoreExceptionHandler.getInstance());
-		}
-
-		public PathBuilder resolve(@Nonnull Tree tree, String textual, ExceptionResultHandler handler) {
-
-			assert nodes.isEmpty();
-			assert tree.isActive();
-			this.tree = tree;
-
-			Node current = tree.getAssignedRoot();
-			nodes.add(current);
-
-			StringBuilder b = new StringBuilder();
-			Iterator<String> i = splitPath(textual);
-			while (i.hasNext() && current.getObject() != null) {
-				Access access = TreeOperations.bindAccess(current);// tree.prepareAccess(current.getParam());
-				String e = i.next();
-				Param p = access.getParam(e);
-				if (p == null) {
-					break;
-				}
-				if (!(p instanceof CompositeParam)) {
-					throw new FramsticksException().msg("param is not a composite").arg("param", p).arg("tree", tree).arg("textual", textual).arg("access", access);
-				}
-				CompositeParam c = (CompositeParam) p;
-				b.append("/").append(e);
-				access.select(current.getObject());
-				tree.putSideNote(current.getObject(), OBJECT_PARAM_KEY, current.getParam());
-				current = new Node(current.getTree(), c, getKnownChild(tree, access, c, handler));
-				nodes.add(current);
-			}
-			this.textual = (nodes.size() == 1) ? "/" : b.toString();
-
-			return this;
-		}
-	}
-
-	public static PathBuilder build() {
-		return new PathBuilder();
-	}
-
-	public Path appendResolution(Object object) {
-		assert !isResolved();
-		Path result = new PathBuilder().textual(textual).tree(tree).add(nodes).setLast(object).finish();
-		assert size() == result.size();
-		return result;
-	}
-
-	public final Object getTopObject() {
-		return getTop().getObject();
-	}
-
-	public final Node getTop() {
-		return nodes.getLast();
-	}
-
-	public final Node getUnder() {
-		assert nodes.size() >= 2;
-		return nodes.get(nodes.size() - 2);
-	}
-
-	public final String getTextual() {
-		return textual;
-	}
-
-	public String toString() {
-		return tree + textual + (!isResolved() ? "!" : "");
-	}
-
-	public String getFullTextual() {
-		return tree.getName() + textual;
-	}
-
-	public final int size() {
-		assert Dispatching.isThreadSafe();
-		return nodes.size();
-	}
-
-	public final boolean isResolved() {
-		assert Dispatching.isThreadSafe();
-		return getTop().getObject() != null;
-	}
-
-	public final boolean isResolved(String textual) {
-		assert Dispatching.isThreadSafe();
-		return isTheSame(textual) && isResolved();
-	}
-
-	public final boolean isTheSame(String textual) {
-		assert Dispatching.isThreadSafe();
-		return this.textual.equals(textual);
-	}
-
-	public final boolean isTheSameTextually(Path path) {
-		assert Dispatching.isThreadSafe();
-		return (tree == path.getTree()) && textual.equals(path.getTextual());
-	}
-
-	public final @Nonnull Tree getTree() {
-		assert Dispatching.isThreadSafe();
-		return tree;
-	}
-
-	public Path tryResolveIfNeeded() {
-		if (isResolved()) {
-			return this;
-		}
-		return tryFindResolution();
-	}
-
-	/** Attach resolution at end, if available.
-	 *
-	 * @return Modified path, if resolution was available, this otherwise.
-	 */
-	public Path tryFindResolution() {
-		assert tree.isActive();
-		assert !isResolved();
-		if (size() == 1) {
-			return Path.build().resolve(tree, "/").finish();
-		}
-		Object child = getKnownChild(tree, TreeOperations.bindAccess(getUnder()), getTop().getParam(), IgnoreExceptionHandler.getInstance());
-		if (child == null) {
-			return this;
-		}
-		return appendResolution(child);
-	}
-
-
-	public String getLastElement() {
-		return getTop().getParam().getId();
-	}
-
-	public final boolean isOwner(Tree tree) {
-		return this.tree == tree;
-	}
-
-	@SuppressWarnings("unchecked")
-	public
-	List<Node> getNodes() {
-		return ListUtils.unmodifiableList(nodes);
-	}
-
-	public Path assureResolved() {
-		if (!isResolved()) {
-			throw new FramsticksException().msg("path is not resolved").arg("path", this);
-		}
-		return this;
-	}
-
-	public static Path tryTo(@Nonnull Tree tree, String textual) {
-		return Path.build().resolve(tree, textual).finish();
-	}
-
-	public static Path to(@Nonnull Tree tree, String textual) {
-		Path path = tryTo(tree, textual);
-		if (path.getTextual().equals(textual)) {
-			return path;
-		}
-		throw new FramsticksException().msg("failed to create path").arg("textual", textual).arg("result", path).arg("tree", tree);
-	}
-
-	public boolean isTheSameObjects(Path path) {
-		if (tree != path.getTree()) {
-			return false;
-		}
-		if (size() != path.size()) {
-			return false;
-		}
-		if (!getTextual().equals(path.getTextual())) {
-			return false;
-		}
-		Iterator<Node> a = nodes.iterator();
-		Iterator<Node> b = path.getNodes().iterator();
-		while (a.hasNext()) {
-			assert b.hasNext();
-			if (a.next() != b.next()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public static final Pattern pathPattern = Pattern.compile("(\\/)|((\\/[^/]+)+)");
-
-	public static boolean isValidString(String path) {
-		return pathPattern.matcher(path).matches();
-	}
-
-	public static String appendString(String path, String element) {
-		if (path.equals("/")) {
-			return path + element;
-		}
-		return path + "/" + element;
-	}
-
-	public static Pair<String, String> removeLastElement(String path) {
-		assert isValidString(path);
-		if (path.equals("/")) {
-			throw new FramsticksException().msg("cannot remove last element from root path");
-		}
-		int index = path.lastIndexOf('/');
-		assert index != -1;
-		if (index == 0) {
-			return new Pair<String, String>("/", path.substring(1));
-		}
-		return new Pair<String, String>(path.substring(0, index), path.substring(index + 1));
-	}
-
-	public static String validateString(String path) {
-		if (!isValidString(path)) {
-			throw new FramsticksException().msg("path string validation failured").arg("path", path);
-		}
-		return path;
-	}
-
-
-	// public boolean isEmpty() {
-	// 	return nodes.isEmpty();
-	// }
-}
-
Index: java/main/src/main/java/com/framsticks/core/Result.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/Result.java	(revision 103)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package com.framsticks.core;
-
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.annotations.ParamAnnotation;
-import com.framsticks.util.lang.Strings;
-
-@FramsClassAnnotation
-public class Result {
-
-	@ParamAnnotation
-	public Object value;
-
-
-	/**
-	 * @param value
-	 */
-	public Result(Object value) {
-		this.value = value;
-	}
-
-	/**
-	 *
-	 */
-	public Result() {
-	}
-
-	@Override
-	public String toString() {
-		return Strings.toStringNullProof(value, "<null>");
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/SideNoteKey.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/SideNoteKey.java	(revision 103)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package com.framsticks.core;
-
-import com.framsticks.util.FramsticksException;
-
-public class SideNoteKey<T> {
-
-	protected final Class<T> type;
-
-	/**
-	 * @param type
-	 */
-	public SideNoteKey(Class<T> type) {
-		this.type = type;
-	}
-
-	public static <T2> SideNoteKey<T2> make(Class<T2> type) {
-		return new SideNoteKey<T2>(type);
-	}
-
-	public T newValue() {
-		try {
-			return type.newInstance();
-		} catch (InstantiationException | IllegalAccessException e) {
-			throw new FramsticksException().msg("failed to create side note value").arg("type", type).cause(e);
-		}
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/Tree.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/Tree.java	(revision 103)
+++ 	(revision )
@@ -1,77 +1,0 @@
-package com.framsticks.core;
-
-import javax.annotation.Nonnull;
-
-import com.framsticks.communication.queries.NeedFileAcceptor;
-import com.framsticks.params.Access;
-import com.framsticks.params.CompositeParam;
-import com.framsticks.params.EventListener;
-import com.framsticks.params.FramsClass;
-import com.framsticks.params.PrimitiveParam;
-import com.framsticks.params.Registry;
-import com.framsticks.params.types.EventParam;
-import com.framsticks.params.types.ProcedureParam;
-import com.framsticks.util.dispatching.Dispatcher;
-import com.framsticks.util.dispatching.DispatcherSetable;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.Joinable;
-
-public interface Tree extends Dispatcher<Tree>, DispatcherSetable<Tree>, Joinable, ExceptionResultHandler {
-
-	public @Nonnull Node getAssignedRoot();
-	public void assignRootParam(CompositeParam param);
-	public void assignRootObject(Object object);
-
-	public @Nonnull Access prepareAccess(CompositeParam param);
-	public void takeAllFrom(Registry source);
-
-	public FramsClass getInfoFromCache(String id);
-
-	public void putInfoIntoCache(FramsClass framclass);
-
-	// /**
-	//  *
-	//  * Functions accepts ValueParam, because it is also possible to get number of List elements.
-	//  *
-	//  */
-	// public void get(Path path, ValueParam param, Future<Object> future);
-
-	public void get(Path path, Future<Path> future);
-
-	public <R> void call(Path path, ProcedureParam param, Object[] arguments, Class<R> resultType, Future<R> future);
-
-	/**
-	 *
-	 * Functions accepts PrimitiveParam<?>, because it is not possible to set number of List elements.
-	 *
-	 */
-	public void set(Path path, PrimitiveParam<?> param, Object value, Future<Integer> future);
-
-	public void info(Path path, Future<FramsClass> future);
-
-	public void setExceptionHandler(ExceptionResultHandler handler);
-
-	public ExceptionResultHandler getExceptionHandler();
-
-	// public void setDispatcher(Dispatcher<Tree> dispatcher);
-
-	// public Dispatcher<Tree> getDispatcher();
-
-	public <A> void addListener(Path path, EventParam param, EventListener<A> listener, Class<A> argumentType, Future<Void> future);
-
-	public void removeListener(Path path, EventParam param, EventListener<?> listener, Future<Void> future);
-
-	public Registry getRegistry();
-
-	public <T> void putSideNote(Object object, SideNoteKey<T> key, T value);
-
-	public boolean removeSideNote(Object object, SideNoteKey<?> key);
-
-	public <T> T getSideNote(Object object, SideNoteKey<T> key);
-
-	public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor);
-
-	public void removeNeedFileAcceptor(NeedFileAcceptor acceptor);
-
-}
Index: java/main/src/main/java/com/framsticks/core/TreeOperations.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/TreeOperations.java	(revision 103)
+++ 	(revision )
@@ -1,384 +1,0 @@
-package com.framsticks.core;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.annotation.Nonnull;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
-import com.framsticks.communication.File;
-import com.framsticks.params.Access;
-import com.framsticks.params.CompositeParam;
-import com.framsticks.params.EventListener;
-import com.framsticks.params.FramsClass;
-import com.framsticks.params.ListAccess;
-import com.framsticks.params.Param;
-import com.framsticks.params.ParamBuilder;
-import com.framsticks.params.PrimitiveParam;
-import com.framsticks.params.PropertiesAccess;
-import com.framsticks.params.UniqueListAccess;
-import com.framsticks.params.ParamsUtil;
-import com.framsticks.params.types.EventParam;
-import com.framsticks.params.types.ObjectParam;
-import com.framsticks.params.types.ProcedureParam;
-import com.framsticks.parsers.Loaders;
-import com.framsticks.parsers.MultiParamLoader;
-import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
-import com.framsticks.util.dispatching.RunAt;
-
-import static com.framsticks.util.dispatching.Dispatching.*;
-
-public final class TreeOperations {
-
-	private static final Logger log = LogManager.getLogger(TreeOperations.class);
-
-	private TreeOperations() {
-	}
-
-	public static final SideNoteKey<Boolean> FETCHED_MARK = SideNoteKey.make(Boolean.class);
-
-	public static @Nonnull FramsClass processFetchedInfo(Tree tree, File file) {
-		assert tree.isActive();
-		FramsClass framsClass = Loaders.loadFramsClass(file.getContent());
-		log.debug("process fetched info for {}: {}", tree, framsClass);
-		tree.putInfoIntoCache(framsClass);
-		return framsClass;
-	}
-
-	public static Path create(Path path) {
-		assert !path.isResolved();
-
-		Access access = path.getTree().prepareAccess(path.getTop().getParam());
-		Object child = createAccessee(path.getTree(), access);
-		assert child != null;
-		if (path.size() == 1) {
-			path.getTree().assignRootObject(child);
-		} else {
-			Access parentAccess = bindAccess(path.getUnder());
-
-			/** this special case is not very good - maybe hide it in createAccessee? */
-			if (parentAccess instanceof UniqueListAccess) {
-				access.select(child);
-				access.set(((UniqueListAccess) parentAccess).getUidName(), path.getTop().getParam().getId());
-			}
-
-			parentAccess.set(path.getTop().getParam(), child);
-		}
-		path = path.appendResolution(child);
-		return path;
-	}
-
-	public static void processFetchedValues(final Path path, final List<File> files, final Access access, final Future<Path> future) {
-		assert files.size() == 1;
-		assert path.isTheSame(files.get(0).getPath());
-
-		try {
-			log.debug("process fetched values: {}", path);
-			final Access parsingAccess = new PropertiesAccess(access.getFramsClass());
-			final List<Object> results = MultiParamLoader.loadAll(files.get(0).getContent(), parsingAccess);
-
-			Dispatching.dispatchIfNotActive(path.getTree(), new RunAt<Tree>(future) {
-				@Override
-				protected void runAt() {
-
-					Path result = path.tryResolveIfNeeded();
-
-					if (!result.isResolved()) {
-						result = create(result);
-					}
-
-					if (path.getTop().getParam() instanceof ObjectParam) {
-						assert results.size() == 1;
-						ParamsUtil.takeAllNonNullValues(bindAccess(result), parsingAccess.select(results.get(0)));
-						mark(result.getTree(), result.getTopObject(), FETCHED_MARK, true);
-						future.pass(result);
-						return;
-					}
-
-					final ListAccess listAccess = (ListAccess) access;
-
-					listAccess.select(result.getTopObject());
-					Set<String> oldValuesIds = new HashSet<>();
-					for (Param p : listAccess.getParams()) {
-						oldValuesIds.add(p.getId());
-					}
-
-					Access targetAccess = listAccess.getElementAccess();//.cloneAccess();
-
-					int number = 0;
-					for (Object r : results) {
-
-						parsingAccess.select(r);
-						String id;
-						if (listAccess instanceof UniqueListAccess) {
-							id = parsingAccess.get(((UniqueListAccess) listAccess).getUidName(), String.class);
-						} else {
-							id = Integer.toString(number);
-						}
-						++number;
-
-						Object childTo = listAccess.get(id, Object.class);
-						boolean newOne;
-						if (childTo == null) {
-							childTo = createAccessee(result.getTree(), targetAccess);
-							newOne = true;
-						} else {
-							assert oldValuesIds.contains(id);
-							newOne = false;
-						}
-						oldValuesIds.remove(id);
-
-						targetAccess.select(childTo);
-						ParamsUtil.takeAllNonNullValues(targetAccess, parsingAccess);
-						if (newOne) {
-							listAccess.set(id, childTo);
-						}
-						mark(result.getTree(), childTo, FETCHED_MARK, true);
-
-					}
-					mark(result.getTree(), result.getTopObject(), FETCHED_MARK, true);
-
-					/** It looks tricky for ArrayListAccess but should also work.
-					 *
-					 * They should be sorted.
-					 */
-					for (String id : oldValuesIds) {
-						listAccess.set(id, null);
-					}
-					future.pass(result);
-				}
-			});
-
-		} catch (FramsticksException e) {
-			throw new FramsticksException().msg("exception occurred while loading").cause(e);
-		}
-	}
-
-	public static FramsClass getInfo(Path path) {
-		Tree tree = path.getTree();
-		assert tree.isActive();
-		log.debug("get info for: {}", path);
-		final String name = path.getTop().getParam().getContainedTypeName();
-		return tree.getInfoFromCache(name);
-	}
-
-	public static void findInfo(final Path path, final Future<FramsClass> future) {
-		log.debug("find info for: {}", path);
-		try {
-			Tree tree = path.getTree();
-			assert tree.isActive();
-			final FramsClass framsClass = getInfo(path);
-			if (framsClass != null) {
-				future.pass(framsClass);
-				return;
-			}
-			tree.info(path, future);
-		} catch (FramsticksException e) {
-			future.handle(e);
-		}
-	}
-
-	public static @Nonnull
-	Access bindAccessFromSideNote(Tree tree, Object object) {
-		CompositeParam param = tree.getSideNote(object, Path.OBJECT_PARAM_KEY);
-		if (param == null) {
-			throw new FramsticksException().msg("failed to bind access from side node").arg("tree", tree).arg("object", object).arg("type", object.getClass());
-		}
-		return tree.prepareAccess(param).select(object);
-	}
-
-	public static @Nonnull
-	Access bindAccess(Tree tree, String path) {
-		log.debug("bind access for textual: {} in {}", path, tree);
-		return bindAccess(Path.to(tree, path));
-	}
-
-	public static @Nonnull
-	Access bindAccess(Node node) {
-		Tree tree = node.getTree();
-		assert tree.isActive();
-		assert node.getObject() != null;
-
-		try {
-			Access access = tree.prepareAccess(node.getParam());
-			tree.putSideNote(node.getObject(), Path.OBJECT_PARAM_KEY, node.getParam());
-
-			return access.select(node.getObject());
-		} catch (FramsticksException e) {
-			throw new FramsticksException().msg("failed to prepare access for param").arg("param", node.getParam()).cause(e);
-			// log.error("failed to bind access for {}: ", node.getParam(), e);
-		}
-	}
-
-	public static @Nonnull
-	Access bindAccess(Path path) {
-		assert path.getTree().isActive();
-		path.assureResolved();
-		log.debug("bind access for: {}", path);
-		return bindAccess(path.getTop());
-	}
-
-	public static void set(final Path path, final PrimitiveParam<?> param, final Object value, final Future<Integer> future) {
-		final Tree tree = path.getTree();
-
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-			@Override
-			protected void runAt() {
-				tree.set(path, param, value, future);
-			}
-		});
-	}
-
-	public static <R> void call(final Path path, final String procedureName, final Object[] arguments, final Class<R> resultType, final Future<R> future) {
-		final Tree tree = path.getTree();
-
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-			@Override
-			protected void runAt() {
-				path.assureResolved();
-				tree.call(path, tree.getRegistry().getFramsClass(path.getTop().getParam()).getParamEntry(procedureName, ProcedureParam.class), arguments, resultType, future);
-			}
-		});
-	}
-
-	public static <R> void call(final Path path, final ProcedureParam param, final Object[] arguments, final Class<R> resultType, final Future<R> future) {
-		final Tree tree = path.getTree();
-
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-			@Override
-			protected void runAt() {
-				tree.call(path, param, arguments, resultType, future);
-			}
-		});
-	}
-
-	public static <A> void addListener(final Path path, final EventParam param, final EventListener<A> listener, final Class<A> argument, final Future<Void> future) {
-		final Tree tree = path.getTree();
-
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-			@Override
-			protected void runAt() {
-				tree.addListener(path, param, listener, argument, future);
-			}
-		});
-	}
-
-	public static void removeListener(final Path path, final EventParam param, final EventListener<?> listener, final Future<Void> future) {
-		final Tree tree = path.getTree();
-
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-			@Override
-			protected void runAt() {
-				tree.removeListener(path, param, listener, future);
-			}
-		});
-	}
-
-	/**
-	 *
-	 * If StackOverflow occurs in that loop in LocalTree it is probably caused
-	 * the by the fact, that get operation may find the object, but Path resolution
-	 * cannot.
-	 * */
-	public static void tryGet(final Tree tree, final String targetPath, final Future<Path> future) {
-		log.debug("resolve textual: {} for {}", targetPath, tree);
-		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
-
-			@Override
-			protected void runAt() {
-				final Path path = Path.tryTo(tree, targetPath).tryResolveIfNeeded();
-				log.debug("found: {}", path);
-				if (path.isResolved()) {
-					future.pass(path);
-					return;
-				}
-
-				tree.get(path, new FutureHandler<Path>(future) {
-					@Override
-					protected void result(Path result) {
-						// if (result.isResolved(targetPath)) {
-						//	future.pass(result);
-						//	return;
-						// }
-						log.debug("retrying resolve textual: {} for {} with {}", targetPath, tree, result);
-						tryGet(tree, targetPath, future);
-					}
-				});
-			}
-		});
-	}
-
-	public static FramsClass getInfoFromCache(Path path) {
-		assert path.getTree().isActive();
-		return path.getTree().getInfoFromCache(path.getTop().getParam().getContainedTypeName());
-	}
-
-	public static Object createAccessee(Tree tree, CompositeParam param) {
-		Object object = tree.prepareAccess(param).createAccessee();
-		tree.putSideNote(object, Path.OBJECT_PARAM_KEY, param);
-		return object;
-	}
-
-	public static Object createAccessee(Tree tree, Access access) {
-		Object object = access.createAccessee();
-		tree.putSideNote(object, Path.OBJECT_PARAM_KEY, access.buildParam(new ParamBuilder()).finish(CompositeParam.class));
-		return object;
-	}
-
-	public static boolean isMarked(Tree tree, Object object, SideNoteKey<Boolean> mark, boolean defValue) {
-		assert tree.isActive();
-		Boolean v = tree.getSideNote(object, mark);
-		return (v != null ? v : defValue);
-	}
-
-	public static void mark(Tree tree, Object object, SideNoteKey<Boolean> mark, boolean value) {
-		assert tree.isActive();
-		tree.putSideNote(object, mark, value);
-	}
-
-	public static FramsClass getFramsClass(Path path) {
-		return path.getTree().getRegistry().getFramsClass(path.getTop().getParam());
-	}
-
-	public static <T extends Param> T getParam(Path path, String id, Class<T> type) {
-		return getFramsClass(path).getParamEntry(id, type);
-	}
-
-	public static <T> T getOrCreateSideNote(Tree tree, Object object, SideNoteKey<T> key) {
-		T result = tree.getSideNote(object, key);
-		if (result == null) {
-			result = key.newValue();
-			tree.putSideNote(object, key, result);
-		}
-		return result;
-	}
-
-	public static <T> boolean hasSideNotes(Tree tree, Object object, SideNoteKey<T> key) {
-		return tree.getSideNote(object, key) != null;
-	}
-
-	public static <T> boolean hasSideNote(Path path, SideNoteKey<T> key) {
-		return path.getTree().getSideNote(path.getTopObject(), key) != null;
-	}
-
-	public static <T> T getSideNote(Path path, SideNoteKey<T> key) {
-		assert path.isResolved();
-		return path.getTree().getSideNote(path.getTopObject(), key);
-	}
-
-	public static <T> void putSideNote(Path path, SideNoteKey<T> key, T value) {
-		path.getTree().putSideNote(path.getTopObject(), key, value);
-	}
-
-	public static boolean removeSideNote(Path path, SideNoteKey<?> key) {
-		assert path.isResolved();
-		return path.getTree().removeSideNote(path.getTopObject(), key);
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/core/ValueChange.java
===================================================================
--- java/main/src/main/java/com/framsticks/core/ValueChange.java	(revision 103)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package com.framsticks.core;
-
-import com.framsticks.params.annotations.FramsClassAnnotation;
-import com.framsticks.params.annotations.ParamAnnotation;
-import com.framsticks.util.lang.Strings;
-
-@FramsClassAnnotation
-public class ValueChange {
-
-	@ParamAnnotation
-	public Object value;
-
-
-	/**
-	 * @param value
-	 */
-	public ValueChange(Object value) {
-		this.value = value;
-	}
-
-	/**
-	 *
-	 */
-	public ValueChange() {
-	}
-
-	@Override
-	public String toString() {
-		return Strings.toStringNullProof(value, "<null>");
-	}
-
-}
Index: java/main/src/main/java/com/framsticks/dumping/LoadStream.java
===================================================================
--- java/main/src/main/java/com/framsticks/dumping/LoadStream.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/dumping/LoadStream.java	(revision 105)
@@ -2,10 +2,10 @@
 
 import com.framsticks.communication.File;
-import com.framsticks.core.TreeOperations;
-import com.framsticks.core.Path;
 import com.framsticks.params.ListSource;
-import com.framsticks.core.Tree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.TreeOperations;
 import com.framsticks.util.*;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.lang.Pair;
 import com.framsticks.util.lang.Strings;
@@ -28,9 +28,9 @@
 	protected final Path mountPath;
 	protected final BufferedReader stream;
-	protected final Future<Path> future;
+	protected final FutureHandler<Path> future;
 	protected final Stopwatch stopwatch = new Stopwatch();
 
 
-	public LoadStream(Path mountPath, BufferedReader stream, Tree tree, Future<Path> future) {
+	public LoadStream(Path mountPath, BufferedReader stream, Tree tree, FutureHandler<Path> future) {
 		this.tree = tree;
 		this.mountPath = mountPath;
Index: java/main/src/main/java/com/framsticks/dumping/SaveStream.java
===================================================================
--- java/main/src/main/java/com/framsticks/dumping/SaveStream.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/dumping/SaveStream.java	(revision 105)
@@ -1,8 +1,5 @@
 package com.framsticks.dumping;
 
-import static com.framsticks.core.TreeOperations.*;
 import static com.framsticks.params.AccessOperations.*;
-import com.framsticks.core.Node;
-import com.framsticks.core.Path;
 import com.framsticks.params.Access;
 import com.framsticks.params.CompositeParam;
@@ -11,8 +8,10 @@
 import com.framsticks.params.Sink;
 import com.framsticks.parsers.Savers;
-import com.framsticks.core.Tree;
+import com.framsticks.structure.Node;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.*;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 
 import org.apache.logging.log4j.Logger;
@@ -22,4 +21,6 @@
 import java.util.HashSet;
 import java.util.Set;
+
+import static com.framsticks.structure.TreeOperations.*;
 import static com.framsticks.util.lang.Containers.filterInstanceof;
 
@@ -33,5 +34,5 @@
 	protected final Sink sink;
 	protected final Tree tree;
-	protected final Future<Void> future;
+	protected final FutureHandler<Void> future;
 	protected final Stopwatch stopwatch = new Stopwatch();
 	protected final Set<FramsClass> storedInfo = new HashSet<FramsClass>();
@@ -39,5 +40,5 @@
 	private int dispatched = 0;
 
-	public SaveStream(Sink sink, Tree tree, Path root, Future<Void> future) {
+	public SaveStream(Sink sink, Tree tree, Path root, FutureHandler<Void> future) {
 		assert Dispatching.isThreadSafe();
 		this.sink = sink;
Index: java/main/src/main/java/com/framsticks/experiment/Experiment.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/Experiment.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/experiment/Experiment.java	(revision 105)
@@ -7,5 +7,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ListChange;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.ParamFlags;
@@ -16,4 +15,6 @@
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.AbstractJoinable;
@@ -22,5 +23,4 @@
 import com.framsticks.util.dispatching.DispatcherSetable;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableCollection;
@@ -30,5 +30,5 @@
 
 @FramsClassAnnotation
-public class Experiment extends AbstractJoinable implements Dispatcher<Experiment>, DispatcherSetable<Experiment>, JoinableParent, ExceptionResultHandler {
+public class Experiment extends AbstractJoinable implements Dispatcher<Experiment>, DispatcherSetable<Experiment>, JoinableParent, ExceptionHandler {
 	private static final Logger log = LogManager.getLogger(Experiment.class);
 
Index: java/main/src/main/java/com/framsticks/experiment/NetLoadSaveLogic.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/NetLoadSaveLogic.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/experiment/NetLoadSaveLogic.java	(revision 105)
@@ -5,12 +5,12 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ListChange;
-import com.framsticks.core.Message;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.MessageLogger;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.Message;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 
 @FramsClassAnnotation
@@ -50,5 +50,5 @@
 
 				log.debug("issuing netsave to: {}", simulator);
-				simulator.netsave(netJavaClass, new FutureHandler<NF>(simulator) {
+				simulator.netsave(netJavaClass, new Future<NF>(simulator) {
 
 					@Override
@@ -68,5 +68,5 @@
 		}
 		log.debug("issuing netload to: {}", simulator);
-		netload(simulator, new FutureHandler<NF>(simulator) {
+		netload(simulator, new Future<NF>(simulator) {
 
 			@Override
@@ -77,5 +77,5 @@
 				}
 
-				simulator.netload(net, new FutureHandler<Object>(this) {
+				simulator.netload(net, new Future<Object>(this) {
 
 					@Override
@@ -90,5 +90,5 @@
 	}
 
-	public abstract void netload(Simulator simulator, Future<NF> net);
+	public abstract void netload(Simulator simulator, FutureHandler<NF> net);
 
 	public abstract void netsave(Simulator simulator, NF net);
Index: java/main/src/main/java/com/framsticks/experiment/Simulator.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/Simulator.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/experiment/Simulator.java	(revision 105)
@@ -4,8 +4,4 @@
 import com.framsticks.communication.queries.NeedFile;
 import com.framsticks.communication.queries.NeedFileAcceptor;
-import com.framsticks.core.ListChange;
-import com.framsticks.core.Path;
-import com.framsticks.core.Tree;
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.AccessOperations;
 import com.framsticks.params.CastFailure;
@@ -19,11 +15,15 @@
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.ValueChange;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.AbstractJoinable;
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableParent;
@@ -35,8 +35,10 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.params.ParamsUtil.arguments;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
 @FramsClassAnnotation
-public final class Simulator extends AbstractJoinable implements Dispatcher<Simulator>, JoinableParent, UniqueObject, ExceptionResultHandler {
+public final class Simulator extends AbstractJoinable implements Dispatcher<Simulator>, JoinableParent, UniqueObject, ExceptionHandler {
 
 	private static final Logger log = LogManager.getLogger(Simulator.class);
@@ -69,5 +71,5 @@
 			public void action(ValueChange argument) {
 				try {
-					boolean running = simulatorClass.getParamEntry("running", BooleanParam.class).reassign(argument.value, null).getValue();
+					boolean running = getParam(simulatorClass, "running", BooleanParam.class).reassign(argument.value, null).getValue();
 					log.debug("running state of {} changed: {}", Simulator.this, running);
 					if (!running) {
@@ -80,5 +82,5 @@
 		};
 
-		addListener(simulatorPath, simulatorClass.getParamEntry("running_changed", EventParam.class), runningListener, ValueChange.class, new FutureHandler<Void>(this) {
+		addListener(simulatorPath, getParam(simulatorClass, "running_changed", EventParam.class), runningListener, ValueChange.class, new Future<Void>(this) {
 			@Override
 			protected void result(Void result) {
@@ -160,5 +162,5 @@
 	public void start() {
 		log.debug("starting simulator {}", this);
-		call(simulatorPath, "start", new Object[] {}, Object.class, FutureHandler.doNothing(Object.class, this));
+		call(simulatorPath, "start", arguments(), Object.class, Future.doNothing(Object.class, this));
 	}
 
@@ -199,5 +201,5 @@
 	protected final AtomicInteger netloadIdCounter = new AtomicInteger();
 
-	public <N> void netload(final N net, final Future<Object> future) {
+	public <N> void netload(final N net, final FutureHandler<Object> future) {
 		final String netloadId = "NetLoadSaveLogic" + netloadIdCounter.getAndIncrement();
 
@@ -231,9 +233,9 @@
 		simulatorPath.getTree().addNeedFileAcceptor(Integer.MIN_VALUE, acceptor.get());
 
-		call(simulatorPath, getFramsClass(simulatorPath).getParamEntry("netload_id", ProcedureParam.class), new Object[] { netloadId }, Object.class, new FutureHandler<Object>(future) {
+		call(simulatorPath, getParam(simulatorPath, "netload_id", ProcedureParam.class), arguments(netloadId), Object.class, new Future<Object>(future) {
 
 			@Override
 			protected void result(Object result) {
-				log.debug("upload of {} done", file);
+				log.debug("netload of {} done", file);
 				future.pass(result);
 			}
@@ -242,14 +244,13 @@
 	}
 
-	public <N> void netsave(Class<N> netJavaClass, final Future<N> futureNet) {
-		call(simulatorPath, getFramsClass(simulatorPath).getParamEntry("netsave", ProcedureParam.class), new Object[] { }, netJavaClass, new FutureHandler<N>(futureNet) {
+	public <N> void netsave(Class<N> netJavaClass, final FutureHandler<N> futureNet) {
+		call(simulatorPath, getParam(simulatorPath, "netsave", ProcedureParam.class), arguments(), netJavaClass, new Future<N>(futureNet) {
 
 			@Override
 			protected void result(N net) {
-				log.debug("download of {} done", net);
+				log.debug("netsave of {} done", net);
 				futureNet.pass(net);
 			}
 		});
-
 	}
 }
Index: java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java	(revision 105)
@@ -6,17 +6,17 @@
 
 import com.framsticks.communication.Address;
-import com.framsticks.core.Path;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.Path;
 import com.framsticks.util.AutoAttacher;
 import com.framsticks.util.Misc;
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.lang.Casting;
 import com.framsticks.util.lang.Strings;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
 
 @FramsClassAnnotation
@@ -46,5 +46,5 @@
 		Dispatching.dispatchLog(remoteTree, log, Level.DEBUG, "first task in remote tree");
 
-		tryGet(remoteTree, "/simulator", new FutureHandler<Path>(experiment) {
+		tryGet(remoteTree, "/simulator", new Future<Path>(experiment) {
 
 			@Override
Index: java/main/src/main/java/com/framsticks/experiment/StandardNetFile.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/StandardNetFile.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/experiment/StandardNetFile.java	(revision 105)
@@ -0,0 +1,9 @@
+package com.framsticks.experiment;
+
+public class StandardNetFile implements NetFile {
+
+	@Override
+	public String getShortDescription() {
+		return "standard.expdef netfile";
+	}
+}
Index: java/main/src/main/java/com/framsticks/experiment/WorkPackageLogic.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/WorkPackageLogic.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/experiment/WorkPackageLogic.java	(revision 105)
@@ -8,6 +8,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.Message;
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.MessageLogger;
@@ -15,6 +13,8 @@
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.structure.messages.Message;
+import com.framsticks.structure.messages.ValueChange;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 
 @FramsClassAnnotation(order = {"netLoadSaveLogic", "newestTaskScheduled", "newestResultReceived"})
@@ -47,9 +47,9 @@
 
 			@Override
-			public void netload(final Simulator simulator, final Future<WP> netFuture) {
+			public void netload(final Simulator simulator, final FutureHandler<WP> netFuture) {
 				assert experiment.isActive();
 				log.debug("providing netload file for {}", simulator);
 
-				findNextPackage(new FutureHandler<WP> (netFuture) {
+				findNextPackage(new Future<WP> (netFuture) {
 
 					@Override
@@ -106,5 +106,5 @@
 
 
-	protected void findNextPackage(final Future<WP> future) {
+	protected void findNextPackage(final FutureHandler<WP> future) {
 		if (!queuedPackages.isEmpty()) {
 			WP workPackage = queuedPackages.pollFirst();
@@ -113,5 +113,5 @@
 		}
 
-		generateNextPackage(new FutureHandler<WP>(experiment) {
+		generateNextPackage(new Future<WP>(experiment) {
 
 			@Override
@@ -127,5 +127,5 @@
 	}
 
-	protected abstract void generateNextPackage(Future<WP> future);
+	protected abstract void generateNextPackage(FutureHandler<WP> future);
 	protected abstract void returnPackage(WP workPackage);
 
Index: java/main/src/main/java/com/framsticks/gui/Browser.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/Browser.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/Browser.java	(revision 105)
@@ -4,5 +4,4 @@
 import com.framsticks.communication.queries.NeedFile;
 import com.framsticks.communication.queries.NeedFileAcceptor;
-import com.framsticks.core.*;
 import com.framsticks.gui.console.Console;
 import com.framsticks.gui.console.DirectConsole;
@@ -16,10 +15,12 @@
 import com.framsticks.parsers.FileSource;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.AbstractJoinable;
 import com.framsticks.util.dispatching.Dispatcher;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableCollection;
@@ -54,5 +55,5 @@
  */
 @FramsClassAnnotation
-public class Browser extends AbstractJoinable implements Dispatcher<Browser>, JoinableParent, ExceptionResultHandler {
+public class Browser extends AbstractJoinable implements Dispatcher<Browser>, JoinableParent, ExceptionHandler {
 
 	private static final Logger log = LogManager.getLogger(Browser.class);
@@ -213,5 +214,5 @@
 								file = new File("", new FileSource(filename));
 							} catch (IOException e) {
-								needFile.getFuture().handle(new FramsticksException().msg("failed to open choosed file").arg("filename", filename).cause(e));
+								needFile.getFuture().handle(new FramsticksException().msg("failed to open chosen file").arg("filename", filename).cause(e));
 							}
 							if (file != null) {
@@ -239,5 +240,5 @@
 	}
 
-	public void autoResolvePath(final String path, final Future<Path> future) {
+	public void autoResolvePath(final String path, final FutureHandler<Path> future) {
 		// final Tree i = trees.get("localhost");
 		// i.dispatch(new RunAt<Tree>(future) {
@@ -277,9 +278,9 @@
 			protected void runAt() {
 
-				for (final Tree i : trees) {
-					i.dispatch(new RunAt<Tree>(this) {
+				for (final Tree tree : trees) {
+					tree.dispatch(new RunAt<Tree>(this) {
 						@Override
 						protected void runAt() {
-							final Path p = Path.to(i, "/");
+							final Path p = Path.to(tree, "/");
 							log.debug("adding path: {}", p);
 							dispatch(new RunAt<Browser>(this) {
Index: java/main/src/main/java/com/framsticks/gui/Frame.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/Frame.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/Frame.java	(revision 105)
@@ -39,6 +39,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.Path;
-import com.framsticks.core.Tree;
 import com.framsticks.gui.tree.AbstractNode;
 import com.framsticks.gui.tree.MetaNode;
@@ -46,6 +44,8 @@
 import com.framsticks.gui.tree.TreeModel;
 import com.framsticks.gui.tree.TreeNode;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableCollection;
@@ -269,5 +269,5 @@
 		if (!tree.getAssignedRoot().isResolved()) {
 			log.debug("root not yet assigned, geting root");
-			tree.get(path, new FutureHandler<Path>(this) {
+			tree.get(path, new Future<Path>(this) {
 
 				@Override
@@ -329,5 +329,5 @@
 	public void updatePanelIfIsLeadSelection(Path path) {
 		assert isActive();
-		TreePath treePath = treeModel.convertToTreePath(path, true);
+		TreePath treePath = treeModel.convertToTreePath(path);
 		if (treePath == null) {
 			return;
Index: java/main/src/main/java/com/framsticks/gui/FrameJoinable.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/FrameJoinable.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/FrameJoinable.java	(revision 105)
@@ -13,10 +13,10 @@
 import org.apache.logging.log4j.LogManager;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 import com.framsticks.util.dispatching.RunAt;
 import com.framsticks.util.dispatching.ThrowExceptionHandler;
 
-public abstract class FrameJoinable extends SwingJoinable<JFrame> implements ExceptionResultHandler {
+public abstract class FrameJoinable extends SwingJoinable<JFrame> implements ExceptionHandler {
 	private static final Logger log =
 		LogManager.getLogger(FrameJoinable.class);
Index: java/main/src/main/java/com/framsticks/gui/ModifiablePanel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/ModifiablePanel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/ModifiablePanel.java	(revision 105)
@@ -9,5 +9,6 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import static com.framsticks.core.TreeOperations.*;
+
+import static com.framsticks.structure.TreeOperations.*;
 
 /**
Index: java/main/src/main/java/com/framsticks/gui/MultiPanel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/MultiPanel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/MultiPanel.java	(revision 105)
@@ -1,6 +1,6 @@
 package com.framsticks.gui;
 
-import com.framsticks.core.Path;
 import com.framsticks.params.Access;
+import com.framsticks.structure.Path;
 
 import javax.swing.*;
Index: java/main/src/main/java/com/framsticks/gui/ObjectPanel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/ObjectPanel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/ObjectPanel.java	(revision 105)
@@ -1,5 +1,4 @@
 package com.framsticks.gui;
 
-import com.framsticks.core.Path;
 import com.framsticks.gui.controls.Control;
 import com.framsticks.gui.controls.ControlOwner;
@@ -16,9 +15,11 @@
 import java.util.HashMap;
 import java.util.Map;
+
+import static com.framsticks.structure.TreeOperations.*;
 import static com.framsticks.util.lang.Containers.filterInstanceof;
 
+import com.framsticks.structure.Path;
 import com.framsticks.util.FramsticksException;
 
-import static com.framsticks.core.TreeOperations.*;
 
 @SuppressWarnings("serial")
Index: java/main/src/main/java/com/framsticks/gui/PopupMenuEntryProvider.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/PopupMenuEntryProvider.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/PopupMenuEntryProvider.java	(revision 105)
@@ -3,5 +3,5 @@
 import javax.swing.JPopupMenu;
 
-import com.framsticks.core.Path;
+import com.framsticks.structure.Path;
 
 public interface PopupMenuEntryProvider {
Index: java/main/src/main/java/com/framsticks/gui/StandardPanelProvider.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/StandardPanelProvider.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/StandardPanelProvider.java	(revision 105)
@@ -19,9 +19,6 @@
 	public TreePanel providePanel(TreePanel.Parameters parameters) {
 		if (parameters.param instanceof ObjectParam) {
-			return new ObjectPanel(parameters, CollectionUtils.select(parameters.framsClass.getParamEntries(), new NotPredicate(new InstanceofPredicate(CompositeParam.class))));
+			return new ObjectPanel(parameters, CollectionUtils.select(parameters.framsClass.getParams(), new NotPredicate(new InstanceofPredicate(CompositeParam.class))));
 		}
-//		if (param instanceof ListParam) {
-//			return new ListPanel();
-//		}
 		return null;
 	}
Index: java/main/src/main/java/com/framsticks/gui/StatusBar.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/StatusBar.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/StatusBar.java	(revision 105)
@@ -13,16 +13,16 @@
 
 import com.framsticks.gui.controls.Control;
+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.ExceptionResultHandler;
 import com.framsticks.util.dispatching.RunAt;
 
-public class StatusBar implements ExceptionResultHandler {
+public class StatusBar implements ExceptionHandler {
 	private static final Logger log = LogManager.getLogger(StatusBar.class);
 
 	protected JTextField statusBar;
 	protected JPanel swing;
-	protected ExceptionResultHandler exceptionHandler;
+	protected ExceptionHandler exceptionHandler;
 	protected final Dispatcher<?> dispatcher;
 
@@ -86,5 +86,5 @@
 	 * @return the exceptionHandler
 	 */
-	public ExceptionResultHandler getExceptionHandler() {
+	public ExceptionHandler getExceptionHandler() {
 		return exceptionHandler;
 	}
@@ -93,5 +93,5 @@
 	 * @param exceptionHandler the exceptionHandler to set
 	 */
-	public void setExceptionHandler(ExceptionResultHandler exceptionHandler) {
+	public void setExceptionHandler(ExceptionHandler exceptionHandler) {
 		this.exceptionHandler = exceptionHandler;
 	}
Index: java/main/src/main/java/com/framsticks/gui/TreeAtFrame.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/TreeAtFrame.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/TreeAtFrame.java	(revision 105)
@@ -4,9 +4,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.SideNoteKey;
-import com.framsticks.core.Tree;
-import com.framsticks.core.Node;
-import com.framsticks.core.Path;
-import static com.framsticks.core.TreeOperations.*;
 import com.framsticks.gui.controls.ValueControl;
 import com.framsticks.params.CompositeParam;
@@ -15,8 +10,12 @@
 
 import java.util.*;
+import static com.framsticks.params.ParamsUtil.getParam;
+import static com.framsticks.structure.TreeOperations.*;
 
-
-
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.structure.Node;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.SideNoteKey;
+import com.framsticks.structure.Tree;
+import com.framsticks.util.dispatching.Future;
 
 /**
@@ -114,5 +113,5 @@
 
 		for (final Map.Entry<String, Object> e : userChanges.changes.entrySet()) {
-			set(path, getParam(path, e.getKey(), PrimitiveParam.class), e.getValue(), new FutureHandler<Integer>(frame) {
+			set(path, getParam(path, e.getKey(), PrimitiveParam.class), e.getValue(), new Future<Integer>(frame) {
 				@Override
 				protected void result(Integer flag) {
Index: java/main/src/main/java/com/framsticks/gui/TreePanel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/TreePanel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/TreePanel.java	(revision 105)
@@ -1,7 +1,6 @@
 package com.framsticks.gui;
 
-import com.framsticks.core.Path;
-import com.framsticks.core.Tree;
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
+
 import com.framsticks.gui.tree.AbstractNode;
 import com.framsticks.gui.tree.TreeNode;
@@ -9,4 +8,6 @@
 import com.framsticks.params.CompositeParam;
 import com.framsticks.params.FramsClass;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.lang.Casting;
 
Index: java/main/src/main/java/com/framsticks/gui/console/Console.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/console/Console.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/console/Console.java	(revision 105)
@@ -15,7 +15,7 @@
 import com.framsticks.gui.FrameJoinable;
 import com.framsticks.params.annotations.FramsClassAnnotation;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableParent;
@@ -89,6 +89,6 @@
 	}
 
-	protected ExceptionResultHandler getExceptionHandler() {
-		return new ExceptionResultHandler() {
+	protected ExceptionHandler getExceptionHandler() {
+		return new ExceptionHandler() {
 
 			@Override
Index: java/main/src/main/java/com/framsticks/gui/console/ManagedConsole.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/console/ManagedConsole.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/console/ManagedConsole.java	(revision 105)
@@ -10,6 +10,7 @@
 import com.framsticks.communication.Response;
 import com.framsticks.communication.queries.ApplicationRequest;
-import com.framsticks.core.Path;
-import static com.framsticks.core.TreeOperations.*;
+
+import static com.framsticks.structure.TreeOperations.*;
+
 import com.framsticks.gui.SwingDispatcher;
 import com.framsticks.params.CompositeParam;
@@ -18,7 +19,8 @@
 import com.framsticks.params.types.ListParam;
 import com.framsticks.remote.RemoteTree;
+import com.framsticks.structure.Path;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.RunAt;
 import com.framsticks.util.lang.Casting;
@@ -98,5 +100,5 @@
 		// final Iterator<String> iterator = Path.splitPath(textual);
 
-		tryGet(tree, textual, new FutureHandler<Path>(this) {
+		tryGet(tree, textual, new Future<Path>(this) {
 
 			@Override
@@ -143,5 +145,5 @@
 
 				if (path.getTop().getParam() instanceof ListParam) {
-					tree.get(path, new FutureHandler<Path>(ManagedConsole.this) {
+					tree.get(path, new Future<Path>(ManagedConsole.this) {
 						@Override
 						protected void result(Path result) {
Index: java/main/src/main/java/com/framsticks/gui/controls/Control.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/controls/Control.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/controls/Control.java	(revision 105)
@@ -1,15 +1,12 @@
 package com.framsticks.gui.controls;
-
-// import java.awt.BorderLayout;
-
 
 import javax.swing.JPanel;
 
-import com.framsticks.core.Path;
 import com.framsticks.params.ParamFlags;
 import com.framsticks.params.Param;
+import com.framsticks.structure.Path;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.Misc;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 
 /**
@@ -17,5 +14,5 @@
  */
 @SuppressWarnings("serial")
-public abstract class Control extends JPanel implements ExceptionResultHandler {
+public abstract class Control extends JPanel implements ExceptionHandler {
 
 	public static final int LINE_HEIGHT = 36;
Index: java/main/src/main/java/com/framsticks/gui/controls/ControlOwner.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/controls/ControlOwner.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/controls/ControlOwner.java	(revision 105)
@@ -2,9 +2,9 @@
 
 
-import com.framsticks.core.Path;
 import com.framsticks.gui.Frame;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.structure.Path;
+import com.framsticks.util.ExceptionHandler;
 
-public interface ControlOwner extends ExceptionResultHandler {
+public interface ControlOwner extends ExceptionHandler {
 
 	public Path getCurrentPath();
Index: java/main/src/main/java/com/framsticks/gui/controls/EventControl.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/controls/EventControl.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/controls/EventControl.java	(revision 105)
@@ -10,6 +10,4 @@
 
 
-import com.framsticks.core.Path;
-import com.framsticks.core.SideNoteKey;
 import com.framsticks.gui.Frame;
 import com.framsticks.gui.Gui;
@@ -17,11 +15,13 @@
 import com.framsticks.params.EventListener;
 import com.framsticks.params.types.EventParam;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.SideNoteKey;
 import com.framsticks.util.FramsticksUnsupportedOperationException;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.RunAt;
 import com.framsticks.util.lang.Pair;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
 
 /**
@@ -59,5 +59,5 @@
 					removeSideNote(path, listenerKey);
 					refreshState();
-					path.getTree().removeListener(path, getParam(), listener, FutureHandler.doNothing(Void.class, owner.getFrame()));
+					path.getTree().removeListener(path, getParam(), listener, Future.doNothing(Void.class, owner.getFrame()));
 					return;
 				}
@@ -79,5 +79,5 @@
 				};
 
-				path.getTree().addListener(path, getParam(), newListener, Object.class, new FutureHandler<Void>(owner.getFrame()) {
+				addListener(path, getParam(), newListener, Object.class, new Future<Void>(owner.getFrame()) {
 
 					@Override
Index: java/main/src/main/java/com/framsticks/gui/controls/ProcedureControl.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/controls/ProcedureControl.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/controls/ProcedureControl.java	(revision 105)
@@ -1,10 +1,10 @@
 package com.framsticks.gui.controls;
 
-import com.framsticks.core.Path;
 import com.framsticks.gui.Frame;
 import com.framsticks.gui.Gui;
 import com.framsticks.params.Param;
 import com.framsticks.params.types.ProcedureParam;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.structure.Path;
+import com.framsticks.util.dispatching.Future;
 
 import javax.swing.*;
@@ -73,5 +73,5 @@
 		assert path.getTree().isActive();
 
-		path.getTree().call(path, param, arguments, Object.class, new FutureHandler<Object>(frame) {
+		path.getTree().call(path, param, arguments, Object.class, new Future<Object>(frame) {
 
 			@Override
Index: java/main/src/main/java/com/framsticks/gui/table/ListPanel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/table/ListPanel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/table/ListPanel.java	(revision 105)
@@ -44,5 +44,5 @@
 			}
 		} else {
-			for (Param param : framsClass.getParamEntries()) {
+			for (Param param : framsClass.getParams()) {
 				if (provider.getMaximumColumnNumber() != null && tableModel.getColumnCount() >= provider.getMaximumColumnNumber()) {
 					break;
Index: java/main/src/main/java/com/framsticks/gui/table/ProcedureColumn.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/table/ProcedureColumn.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/table/ProcedureColumn.java	(revision 105)
@@ -1,9 +1,10 @@
 package com.framsticks.gui.table;
 
-
-import com.framsticks.core.Path;
 import com.framsticks.gui.controls.ProcedureControl;
 import com.framsticks.params.CompositeParam;
 import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.structure.Path;
+
+import static com.framsticks.params.ParamsUtil.arguments;
 
 public class ProcedureColumn extends Column {
@@ -38,5 +39,5 @@
 			return 0;
 		}
-		ProcedureControl.callProcedure(path, getParam(), new Object[] {}, tableModel.getFrame());
+		ProcedureControl.callProcedure(path, getParam(), arguments(), tableModel.getFrame());
 		return 0;
 	}
Index: java/main/src/main/java/com/framsticks/gui/tree/TreeModel.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/tree/TreeModel.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/tree/TreeModel.java	(revision 105)
@@ -14,10 +14,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ListChange;
-import com.framsticks.core.Node;
-import com.framsticks.core.Path;
-import com.framsticks.core.SideNoteKey;
-import com.framsticks.core.TreeOperations;
-import com.framsticks.core.ValueChange;
 import com.framsticks.gui.Frame;
 import com.framsticks.params.Access;
@@ -29,11 +23,16 @@
 import com.framsticks.params.ValueParam;
 import com.framsticks.params.types.EventParam;
-import com.framsticks.util.FramsticksException;
+import com.framsticks.structure.Node;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.SideNoteKey;
+import com.framsticks.structure.TreeOperations;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.util.Misc;
 import com.framsticks.util.FramsticksUnsupportedOperationException;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.lang.Casting;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
 
 public class TreeModel implements javax.swing.tree.TreeModel {
@@ -42,5 +41,4 @@
 
 	protected List<TreeModelListener> listeners = new LinkedList<>();
-
 
 	protected final Frame frame;
@@ -208,5 +206,5 @@
 	}
 
-	public TreePath convertToTreePath(Path path, boolean forceComplete) {
+	public TreePath convertToTreePath(Path path) {
 		assert frame.isActive();
 
@@ -271,8 +269,8 @@
 			return;
 		}
-		path.getTree().get(path, new FutureHandler<Path>(frame) {
+		path.getTree().get(path, new Future<Path>(frame) {
 			@Override
 			protected void result(Path result) {
-				final TreePath treePath = convertToTreePath(result, true);
+				final TreePath treePath = convertToTreePath(result);
 
 
@@ -358,8 +356,5 @@
 
 					log.debug("reacting to change {} in {}", listChange, listPath);
-					final TreePath treeListPath = convertToTreePath(listPath, true);
-					if (treeListPath == null) {
-						throw new FramsticksException().msg("path was not fully converted").arg("path", listPath);
-					}
+					final TreePath treeListPath = convertToTreePath(listPath);
 
 					if ((listChange.getAction().equals(ListChange.Action.Modify)) && (listChange.getPosition() == -1)) {
@@ -387,5 +382,5 @@
 							}
 
-							listPath.getTree().get(childPath, new FutureHandler<Path>(frame) {
+							listPath.getTree().get(childPath, new Future<Path>(frame) {
 								@Override
 								protected void result(Path result) {
@@ -394,5 +389,5 @@
 									}
 									assert frame.isActive();
-									final TreePath treePath = Misc.throwIfNull(frame.getTreeModel().convertToTreePath(result, true));
+									final TreePath treePath = Misc.throwIfNull(frame.getTreeModel().convertToTreePath(result));
 
 									// treeModel.nodeStructureChanged(treePath);
@@ -420,5 +415,5 @@
 						case Modify: {
 							Path childPath = listPath.appendParam(access.prepareParamFor(id)).tryResolveIfNeeded();
-							listPath.getTree().get(childPath, new FutureHandler<Path>(frame) {
+							listPath.getTree().get(childPath, new Future<Path>(frame) {
 								@Override
 								protected void result(Path result) {
Index: java/main/src/main/java/com/framsticks/gui/tree/TreeNode.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/tree/TreeNode.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/gui/tree/TreeNode.java	(revision 105)
@@ -8,8 +8,4 @@
 import org.apache.logging.log4j.Logger;
 
-import com.framsticks.core.Node;
-import com.framsticks.core.Path;
-import com.framsticks.core.SideNoteKey;
-import com.framsticks.core.Tree;
 import com.framsticks.gui.Frame;
 import com.framsticks.gui.ImageProvider;
@@ -19,16 +15,19 @@
 import com.framsticks.params.CompositeParam;
 import com.framsticks.params.EventListener;
-import com.framsticks.params.FramsClass;
 import com.framsticks.params.ValueParam;
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.ObjectParam;
 import com.framsticks.params.types.StringParam;
+import com.framsticks.structure.Node;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.SideNoteKey;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.lang.Casting;
 import com.framsticks.util.lang.Containers;
 import com.framsticks.util.swing.TooltipConstructor;
 
-import static com.framsticks.core.TreeOperations.*;
+import static com.framsticks.structure.TreeOperations.*;
 
 public class TreeNode extends AbstractNode {
@@ -69,11 +68,10 @@
 		if (path.getTop().getParam() instanceof ObjectParam) {
 			Access access = bindAccess(path);
-			FramsClass framsClass = access.getFramsClass();
-			for (EventParam eventParam : Containers.filterInstanceof(framsClass.getParamEntries(), EventParam.class)) {
+			for (EventParam eventParam : Containers.filterInstanceof(access.getParams(), EventParam.class)) {
 				if (!eventParam.getId().endsWith("_changed")) {
 					continue;
 				}
 				String valueId = eventParam.getId().substring(0, eventParam.getId().length() - 8);
-				final ValueParam valueParam = Casting.tryCast(ValueParam.class, framsClass.getParam(valueId));
+				final ValueParam valueParam = Casting.tryCast(ValueParam.class, access.getParam(valueId));
 				if (valueParam == null) {
 					continue;
@@ -249,5 +247,5 @@
 
 		renderer.setToolTipText(new TooltipConstructor()
-				.append("frams", access.getId())
+				.append("frams", access.getTypeId())
 				.append("java", child.getClass().getCanonicalName())
 				.append("access", access.getClass().getSimpleName())
@@ -271,5 +269,5 @@
 
 	protected <A> void tryAddListener(final Path path, final EventParam eventParam, Class<A> argumentType, final EventListener<A> listener) {
-		getTree().addListener(path, eventParam, listener, argumentType, new FutureHandler<Void>(getFrame()) {
+		addListener(path, eventParam, listener, argumentType, new Future<Void>(getFrame()) {
 			@SuppressWarnings("unchecked")
 			@Override
Index: java/main/src/main/java/com/framsticks/hosting/Cli.java
===================================================================
--- java/main/src/main/java/com/framsticks/hosting/Cli.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/hosting/Cli.java	(revision 105)
@@ -9,11 +9,12 @@
 import com.framsticks.communication.Response;
 import com.framsticks.communication.ServerSideResponseFuture;
-import com.framsticks.core.Path;
-import com.framsticks.core.Tree;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
 import com.framsticks.params.types.EventParam;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.structure.TreeOperations;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.ThrowExceptionHandler;
 
@@ -69,8 +70,8 @@
 
 		// SyncedFuture handler = new SyncedFuture<Void>(ThrowExceptionHandler.getInstance());
-		path.getTree().addListener(path, param, event.listener, Object.class, FutureHandler.doNothing(Void.class, ThrowExceptionHandler.getInstance()));
+		TreeOperations.addListener(path, param, event.listener, Object.class, Future.doNothing(Void.class, ThrowExceptionHandler.getInstance()));
 
 		events.put(event.id, event);
-		responseFuture.pass(new Response(true, event.pathToEvent, null));
+		responseFuture.pass(new Response(true, event.pathToEvent));
 		// handler
 	}
Index: java/main/src/main/java/com/framsticks/hosting/CliEvent.java
===================================================================
--- java/main/src/main/java/com/framsticks/hosting/CliEvent.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/hosting/CliEvent.java	(revision 105)
@@ -1,5 +1,4 @@
 package com.framsticks.hosting;
 
-import com.framsticks.core.Path;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.annotations.FramsClassAnnotation;
@@ -7,5 +6,6 @@
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.ProcedureParam;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.structure.Path;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.ThrowExceptionHandler;
 
@@ -32,5 +32,5 @@
 
 		//it should happen now
-		path.getTree().removeListener(path, param, listener, FutureHandler.doNothing(Void.class, ThrowExceptionHandler.getInstance()));
+		path.getTree().removeListener(path, param, listener, Future.doNothing(Void.class, ThrowExceptionHandler.getInstance()));
 		cli.events.remove(id);
 	}
Index: java/main/src/main/java/com/framsticks/hosting/ClientAtServer.java
===================================================================
--- java/main/src/main/java/com/framsticks/hosting/ClientAtServer.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/hosting/ClientAtServer.java	(revision 105)
@@ -1,4 +1,5 @@
 package com.framsticks.hosting;
 
+import static com.framsticks.structure.TreeOperations.*;
 import static com.framsticks.util.lang.Strings.assureNotEmpty;
 
@@ -10,17 +11,17 @@
 import com.framsticks.communication.queries.RegisterRequest;
 import com.framsticks.communication.queries.SetRequest;
-import com.framsticks.core.LocalTree;
-import com.framsticks.core.Tree;
-import com.framsticks.core.Path;
 import com.framsticks.params.*;
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.parsers.Savers;
+import com.framsticks.structure.LocalTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.Misc;
 import com.framsticks.util.dispatching.AbstractJoinable;
 import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
-import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableParent;
@@ -29,6 +30,6 @@
 import com.framsticks.util.lang.Strings;
 
-import static com.framsticks.core.TreeOperations.*;
 import static com.framsticks.params.AccessOperations.*;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 import java.net.Socket;
@@ -37,5 +38,5 @@
  * @author Piotr Sniegowski
  */
-public class ClientAtServer extends AbstractJoinable implements RequestHandler, JoinableParent, ExceptionResultHandler {
+public class ClientAtServer extends AbstractJoinable implements RequestHandler, JoinableParent, ExceptionHandler {
 
 	protected final Server server;
@@ -126,5 +127,5 @@
 	protected void handleInTree(final Tree tree, final ApplicationRequest request, final ServerSideResponseFuture responseCallback, final String usedPrefix) {
 
-		tryGet(tree, request.getActualPath(), new FutureHandler<Path>(responseCallback) {
+		tryGet(tree, request.getActualPath(), new Future<Path>(responseCallback) {
 			@Override
 			protected void result(final Path path) {
@@ -142,5 +143,5 @@
 						throw new FramsticksException().msg("mismatch objects during fetch").arg("path", path);
 					}
-					responseCallback.pass(new Response(true, "", File.single(printToFile(path.getTextual(), access))));
+					responseCallback.pass(new Response(true, "", printToFile(path.getTextual(), access)));
 
 					return;
@@ -149,9 +150,8 @@
 				if (request instanceof SetRequest) {
 					SetRequest setRequest = (SetRequest) request;
-					tree.set(path, access.getFramsClass().getParamEntry(setRequest.getField(), PrimitiveParam.class), setRequest.getValue(), new FutureHandler<Integer>(responseCallback) {
+					tree.set(path, getParam(access, setRequest.getField(), PrimitiveParam.class), setRequest.getValue(), new Future<Integer>(responseCallback) {
 						@Override
 						protected void result(Integer flag) {
-							responseCallback.pass(new Response(true, FlagsUtil.write(SetStateFlags.class, flag, null), null));
-
+							responseCallback.pass(new Response(true, FlagsUtil.write(SetStateFlags.class, flag, null)));
 						}
 					});
@@ -161,17 +161,15 @@
 				if (request instanceof CallRequest) {
 					final CallRequest callRequest = (CallRequest) request;
-					tree.call(path, access.getFramsClass().getParamEntry(callRequest.getProcedure(), ProcedureParam.class), callRequest.getArguments().toArray(), Object.class, new FutureHandler<Object>(responseCallback) {
+					tree.call(path, getParam(access, callRequest.getProcedure(), ProcedureParam.class), callRequest.getArguments().toArray(), Object.class, new Future<Object>(responseCallback) {
 						@Override
-						protected void result(Object result) {
-							ListSink sink = new ListSink();
-							sink.print("Result:").breakLine();
-							sink.print("value:");
-							sink.print("[");
-							if (result != null) {
-								sink.print(result);
+						protected void result(final Object result) {
+							if (result == null) {
+								responseCallback.pass(new Response(true, ""));
+								return;
 							}
-							sink.print("]");
-
-							responseCallback.pass(new Response(true, "", File.single(new File("", new ListSource(sink.getOut())))));
+							final Object wrapped = AccessOperations.wrapValueInResultIfPrimitive(result);
+							final File file = AccessOperations.convert(File.class, wrapped, tree.getRegistry());
+							responseCallback.pass(new Response(true, "", file));
+
 						}
 					});
@@ -184,5 +182,5 @@
 						throw new FramsticksException().msg("info should be available");
 					}
-					responseCallback.pass(new Response(true, null, File.single(new File(path.getTextual(), new ListSource(Savers.saveFramsClass(new ListSink(), framsClass).getOut())))));
+					responseCallback.pass(new Response(true, null, new File(path.getTextual(), new ListSource(Savers.saveFramsClass(new ListSink(), framsClass).getOut()))));
 					return;
 				}
@@ -191,5 +189,5 @@
 					RegisterRequest register = (RegisterRequest) request;
 
-					cliObject.addListener(path, access.getFramsClass().getParamEntry(register.getEventName(), EventParam.class), usedPrefix, responseCallback);
+					cliObject.addListener(path, getParam(access, register.getEventName(), EventParam.class), usedPrefix, responseCallback);
 					return;
 				}
Index: java/main/src/main/java/com/framsticks/hosting/Server.java
===================================================================
--- java/main/src/main/java/com/framsticks/hosting/Server.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/hosting/Server.java	(revision 105)
@@ -5,9 +5,9 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.Tree;
 import com.framsticks.params.ParamFlags;
 import com.framsticks.params.annotations.AutoAppendAnnotation;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.structure.Tree;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.AbstractJoinable;
Index: java/main/src/main/java/com/framsticks/model/Part.java
===================================================================
--- java/main/src/main/java/com/framsticks/model/Part.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/model/Part.java	(revision 105)
@@ -12,10 +12,15 @@
 public class Part extends BasePart implements ModelComponent {
 
-	@ParamAnnotation
-	public double rx, ry, rz;
+	@ParamAnnotation(id = "rx")
+	public double rotationX;
 
+	@ParamAnnotation(id = "ry")
+	public double rotationY;
 
-	public Point3d getRotation() { return new Point3d(rx, ry, rz); }
-	public void setRotation(Point3d r) { rx = r.x; ry = r.y; rz = r.z; }
+	@ParamAnnotation(id = "rz")
+	public double rotationZ;
+
+	public Point3d getRotation() { return new Point3d(rotationX, rotationY, rotationZ); }
+	public void setRotation(Point3d r) { rotationX = r.x; rotationY = r.y; rotationZ = r.z; }
 
 	@ParamAnnotation(id = "dn")
Index: java/main/src/main/java/com/framsticks/model/f0/VisualHints.java
===================================================================
--- java/main/src/main/java/com/framsticks/model/f0/VisualHints.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/model/f0/VisualHints.java	(revision 105)
@@ -8,20 +8,20 @@
 	/** don't draw class name label below the neuron. */
 	public static final int DONT_SHOW_CLASS = 2;
-	
+
 	/** draw the neuron at the first part when attached to joint (default is in the middle). */
 	public static final int AT_FIRST_PART = 4;
-	
+
 	/** draw the neuron at the second part when attached to joint (default is in the middle). */
 	public static final int AT_SECOND_PART = 8;
-	
+
 	/** use effector color for this neuro unit. */
 	public static final int EFFECTOR_CLASS = 16;
-	
+
 	/** use receptor color for this neuro unit. */
 	public static final int RECEPTOR_CLASS = 32;
-	
+
 	/** The Constant V1_BEND_MUSCLE. */
 	public static final int V1_BEND_MUSCLE = 64;
-	
+
 	/** The Constant V1_ROT_MUSCLE. */
 	public static final int V1_ROT_MUSCLE = 128;
Index: java/main/src/main/java/com/framsticks/params/Access.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/Access.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/Access.java	(revision 105)
@@ -14,17 +14,11 @@
  *         surname with my personal data)
  */
-public interface Access {
+public interface Access extends ParamCollection {
 
-	Param getParam(int i);
+	String getTypeId();
 
-	Param getParam(String id);
+	Object call(String id, Object... arguments);
 
-	String getId();
-
-	int getParamCount();
-
-	Object call(String id, Object[] arguments);
-
-	Object call(ProcedureParam param, Object[] arguments);
+	Object call(ProcedureParam param, Object... arguments);
 
 	<T> T get(int i, Class<T> type);
@@ -57,6 +51,4 @@
 	Object createAccessee();
 
-	Iterable<Param> getParams();
-
 	FramsClass getFramsClass();
 
Index: java/main/src/main/java/com/framsticks/params/AccessOperations.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/AccessOperations.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/AccessOperations.java	(revision 105)
@@ -6,4 +6,5 @@
 import javax.annotation.Nullable;
 
+import org.apache.commons.lang3.ClassUtils;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
@@ -12,4 +13,5 @@
 import com.framsticks.params.types.ListParam;
 import com.framsticks.parsers.MultiParamLoader;
+import com.framsticks.structure.messages.Result;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.FramsticksUnsupportedOperationException;
@@ -114,5 +116,5 @@
 					first.set(false);
 					if (rootAccess != null) {
-						if (name.equals(rootAccess.getId())) {
+						if (name.equals(rootAccess.getTypeId())) {
 							needAdd.set(false);
 							currentAccess.set(rootAccess);
@@ -224,9 +226,7 @@
 		if (access instanceof ObjectAccess) {
 			ObjectAccess objectAccess = (ObjectAccess) access;
-			FramsClass framsClass = access.getFramsClass();
-			assert framsClass != null;
 			boolean headerNeeded = true;
 			// sink.print(framsClass.getId()).print(":").breakLine();
-			for (PrimitiveParam<?> p : filterInstanceof(framsClass.getParamEntries(), PrimitiveParam.class)) {
+			for (PrimitiveParam<?> p : filterInstanceof(access.getParams(), PrimitiveParam.class)) {
 
 				Object value = objectAccess.get(p, Object.class);
@@ -236,10 +236,12 @@
 
 				if (headerNeeded) {
-					sink.print(framsClass.getId()).print(":").breakLine();
+					sink.print(access.getTypeId()).print(":").breakLine();
 					headerNeeded = false;
 				}
 
-				sink.print(p.getId()).print(":");
-				p.save(sink, value);
+				String stringValue = p.serialize(value);
+
+				sink.print(p.getId()).print(":").print(stringValue);
+				// p.save(sink, stringValue);
 				sink.breakLine();
 			}
@@ -414,4 +416,14 @@
 	}
 
+	public static Object wrapValueInResultIfPrimitive(Object object) {
+		Class<?> javaClass = object.getClass();
+		if (ClassUtils.isPrimitiveOrWrapper(javaClass)) {
+			return new Result(object);
+		}
+		if (javaClass.equals(String.class)) {
+			return new Result(object);
+		}
+		return object;
+	}
 
 	/**
Index: java/main/src/main/java/com/framsticks/params/ArrayListAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ArrayListAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ArrayListAccess.java	(revision 105)
@@ -48,6 +48,6 @@
 
 	@Override
-	public String getId() {
-		return "l " + elementAccess.getId();
+	public String getTypeId() {
+		return "l " + elementAccess.getTypeId();
 	}
 
Index: java/main/src/main/java/com/framsticks/params/FramsClass.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/FramsClass.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/FramsClass.java	(revision 105)
@@ -3,5 +3,4 @@
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
-import com.framsticks.util.FramsticksException;
 import com.framsticks.util.lang.Containers;
 import com.framsticks.util.lang.Strings;
@@ -10,5 +9,4 @@
 import java.util.*;
 
-import javax.annotation.Nonnull;
 import javax.annotation.concurrent.Immutable;
 
@@ -30,5 +28,5 @@
 @Immutable
 @FramsClassAnnotation(id = "class", name = "class")
-public class FramsClass {
+public class FramsClass implements ParamCollection {
 
 	private final static Logger log = LogManager.getLogger(FramsClass.class);
@@ -55,5 +53,5 @@
 
 	@ParamAnnotation(id = "props", name = "props")
-	public List<Param> getParamEntries() {
+	public List<Param> getParams() {
 		return Collections.unmodifiableList(paramList);
 	}
@@ -135,38 +133,4 @@
 	}
 
-	public @Nonnull <T extends Param> T castedParam(@Nonnull final Param param, @Nonnull final Class<T> type, Object name) {
-		if (param == null) {
-			// return null;
-			throw new FramsticksException().msg("param is missing").arg("name", name).arg("in", this);
-		}
-		if (!type.isInstance(param)) {
-			// return null;
-			throw new FramsticksException().msg("wrong type of param").arg("actual", param.getClass()).arg("requested", type).arg("in", this);
-		}
-		return type.cast(param);
-	}
-
-	/**
-	 * Gets the param entry.
-	 *
-	 * @param i
-	 *            the offset of parameter
-	 * @return the param entry
-	 */
-	public @Nonnull <T extends Param> T getParamEntry(final int i, @Nonnull final Class<T> type) {
-		return castedParam(getParam(i), type, i);
-	}
-
-	/**
-	 * Gets the param entry.
-	 *
-	 * @param id
-	 *            the getId of parameter
-	 * @return the param entry
-	 */
-	public @Nonnull <T extends Param> T getParamEntry(@Nonnull final String id, @Nonnull final Class<T> type) {
-		return castedParam(getParam(id), type, id);
-	}
-
 	public Param getParam(int i) {
 		if (i < 0 || i >= paramList.size()) {
Index: java/main/src/main/java/com/framsticks/params/ListAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ListAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ListAccess.java	(revision 105)
@@ -19,5 +19,5 @@
 	public ListAccess(Access elementAccess) {
 		this.elementAccess = elementAccess;
-		this.containedTypeName = elementAccess.getId();
+		this.containedTypeName = elementAccess.getTypeId();
 		paramBuilder = elementAccess.buildParam(new ParamBuilder());
 	}
@@ -51,10 +51,10 @@
 
 	@Override
-	public Object call(String id, Object[] arguments) {
+	public Object call(String id, Object... arguments) {
 		throw new InvalidOperationException().msg("list access does not support calling methods").arg("id", id).arg("access", this);
 	}
 
 	@Override
-	public Object call(ProcedureParam param, Object[] arguments) {
+	public Object call(ProcedureParam param, Object... arguments) {
 		throw new InvalidOperationException().msg("list access does not support calling methods").arg("param", param).arg("access", this);
 	}
Index: java/main/src/main/java/com/framsticks/params/MessageLogger.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/MessageLogger.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/MessageLogger.java	(revision 105)
@@ -1,5 +1,5 @@
 package com.framsticks.params;
 
-import com.framsticks.core.Message;
+import com.framsticks.structure.messages.Message;
 
 public class MessageLogger extends EventListeners<Message> {
Index: java/main/src/main/java/com/framsticks/params/Param.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/Param.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/Param.java	(revision 105)
@@ -85,10 +85,4 @@
 	}
 
-	public boolean isNumeric() {
-		return false;
-	}
-
-	public abstract Class<?> getStorageType();
-
 	public boolean hasFlag(int flag) {
 		return (flags & flag) != 0;
Index: java/main/src/main/java/com/framsticks/params/ParamCandidate.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ParamCandidate.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ParamCandidate.java	(revision 105)
@@ -79,4 +79,6 @@
 	protected final OneTime<Method> adder = new OneTime<>("adder");
 	protected final OneTime<Method> remover = new OneTime<>("remover");
+	protected final OneTime<Class<? extends Param>> paramType = new OneTime<>("paramType");
+
 	protected int flags = 0;
 
@@ -262,8 +264,19 @@
 	}
 
+	// public static <T extends Param> boolean isParamAnnorationOfTypeOrUnspecified(ParamAnnotation paramAnnotation, Class<T> paramType) {
+	// 	return paramAnnotation.paramType().equals(Param.class) || paramAnnotation.paramType().equals(paramType);
+	// }
+
+	// public static <T extends Param> boolean isParamAnnorationOfType(ParamAnnotation paramAnnotation, Class<T> paramType) {
+	// 	return paramAnnotation.paramType().equals(paramType);
+	// }
+
 	void add(ParamAnnotation paramAnnotation, Member member, String name) {
 		this.name.set(name);
 		annotations.add(paramAnnotation);
 		flags |= paramAnnotation.flags();
+		if (!paramAnnotation.paramType().equals(Param.class)) {
+			paramType.set(paramAnnotation.paramType());
+		}
 		if (member instanceof Field) {
 			field.set((Field) member);
@@ -273,10 +286,7 @@
 		if (member instanceof Method) {
 			Method m = (Method) member;
-			if (!paramAnnotation.paramType().equals(Param.class)) {
-				if (paramAnnotation.paramType().equals(ProcedureParam.class)) {
-					caller.set(m);
-					return;
-				}
-				throw new ConstructionException().msg("explicit set of paramType different than ProcedureParam is not yet supported").arg("name", name).arg("method", m).arg("in", this);
+			if (paramAnnotation.paramType().equals(ProcedureParam.class)) {
+				caller.set(m);
+				return;
 			}
 			Type[] ps = m.getGenericParameterTypes();
@@ -392,5 +402,5 @@
 	protected static final Map<Class<?>, Set> setsCache = Collections.synchronizedMap(new IdentityHashMap<Class<?>, Set>());
 
-	public static Set getAllCandidates(Class<?> javaClass) throws ConstructionException {
+	public static Set getAllCandidates(final Class<?> javaClass) throws ConstructionException {
 		Set result = setsCache.get(javaClass);
 		if (result != null) {
@@ -399,7 +409,8 @@
 
 		List<Class<?>> javaClasses = new LinkedList<>();
-		while (javaClass != null) {
-			javaClasses.add(0, javaClass);
-			javaClass = javaClass.getSuperclass();
+		Class<?> jc = javaClass;
+		while (jc != null) {
+			javaClasses.add(0, jc);
+			jc = jc.getSuperclass();
 		}
 
@@ -473,4 +484,5 @@
 		// 	throw new ConstructionException().msg("void is not a valid type");
 		// }
+
 
 		if (type instanceof ParameterizedType) {
@@ -562,8 +574,10 @@
 	}
 
-
 	public ParamBuilder induceParamType(ParamBuilder builder) {
 		Method method = getCaller();
 		if (method == null) {
+			if (paramType.has()) {
+				return builder.type(paramType.get());
+			}
 			return induceParamType(builder, getType());
 		}
Index: java/main/src/main/java/com/framsticks/params/ParamCollection.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ParamCollection.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/params/ParamCollection.java	(revision 105)
@@ -0,0 +1,14 @@
+package com.framsticks.params;
+
+public interface ParamCollection {
+
+	public Param getParam(int i);
+
+	public Param getParam(String id);
+
+	public int getParamCount();
+
+	public Iterable<Param> getParams();
+
+
+}
Index: java/main/src/main/java/com/framsticks/params/ParamsUtil.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ParamsUtil.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ParamsUtil.java	(revision 105)
@@ -3,4 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
 
 import com.framsticks.util.FramsticksException;
@@ -29,5 +32,5 @@
 			Object object = a.getSelected();
 			if (!type.isInstance(object)) {
-				throw new FramsticksException().msg("extracted object is of invalid type").arg("object", object).arg("desired", type).arg("actual", object.getClass()).arg("framsclass", a.getFramsClass());
+				throw new FramsticksException().msg("extracted object is of invalid type").arg("object", object).arg("desired", type).arg("actual", object.getClass()).arg("access", a);
 			}
 			result.add(type.cast(object));
@@ -88,3 +91,149 @@
 	}
 
+	public static Object[] arguments(Object... args) {
+		return args;
+	}
+
+	public static Param getParam(ParamCollection collection, int i) {
+		return collection.getParam(i);
+	}
+
+	public static Param getParam(ParamCollection collection, String id) {
+		return collection.getParam(id);
+	}
+
+	public static @Nonnull <T extends Param> T castedParam(ParamCollection collection, @Nonnull final Param param, @Nonnull final Class<T> type, Object name) {
+		if (param == null) {
+			// return null;
+			throw new FramsticksException().msg("param is missing").arg("name", name).arg("in", collection);
+		}
+		if (!type.isInstance(param)) {
+			// return null;
+			throw new FramsticksException().msg("wrong type of param").arg("actual", param.getClass()).arg("requested", type).arg("in", collection);
+		}
+		return type.cast(param);
+	}
+
+	/**
+	 * Gets the param entry.
+	 *
+	 * @param i
+	 *            the offset of parameter
+	 * @return the param entry
+	 */
+	public static @Nonnull <T extends Param> T getParam(ParamCollection collection, final int i, @Nonnull final Class<T> type) {
+		return castedParam(collection, collection.getParam(i), type, i);
+	}
+
+	/**
+	 * Gets the param entry.
+	 *
+	 * @param id
+	 *            the getId of parameter
+	 * @return the param entry
+	 */
+	public static @Nonnull <T extends Param> T getParam(ParamCollection collection, @Nonnull final String id, @Nonnull final Class<T> type) {
+		return castedParam(collection, collection.getParam(id), type, id);
+	}
+
+	public static final String SERIALIZED = "@Serialized:";
+
+	public static class SerializationContext {
+		protected final StringBuilder builder = new StringBuilder();
+		protected final ArrayList<Object> objects = new ArrayList<>();
+
+		protected void appendString(String value) {
+			builder.append('"').append(value).append('"');
+		}
+
+		protected boolean serializeInternal(Object value) {
+			if (value == null) {
+				builder.append("null");
+				return true;
+			}
+			/** indexOf is not used here, because it uses equals() internally, which results in StackOverflowError */
+			Class<?> type = value.getClass();
+			if (type.equals(String.class)) {
+				String stringValue = (String) value;
+				appendString(stringValue);
+				return stringValue.startsWith(SERIALIZED);
+			}
+			if (type.equals(Boolean.class)) {
+				builder.append(((Boolean) value) ? "1" : "0");
+				return false;
+			}
+			if (type.equals(Double.class) || type.equals(Integer.class)) {
+				builder.append(value.toString());
+				return false;
+			}
+
+			for (int i = 0; i < objects.size(); ++i) {
+				if (objects.get(i) == value) {
+					builder.append("^").append(i);
+					return true;
+				}
+			}
+
+			if (List.class.isAssignableFrom(type)) {
+				objects.add(value);
+				List<?> list = (List<?>) value;
+				boolean placeComma = false;
+				builder.append("[");
+				for (Object element : list) {
+					if (placeComma) {
+						builder.append(",");
+					} else {
+						placeComma = true;
+					}
+					serializeInternal(element);
+				}
+				builder.append("]");
+				return true;
+			}
+			if (Map.class.isAssignableFrom(type)) {
+				objects.add(value);
+				Map<?, ?> map = (Map<?, ?>) value;
+				boolean placeComma = false;
+				builder.append("{");
+				for (Map.Entry<?, ?> entry : map.entrySet()) {
+					if (placeComma) {
+						builder.append(",");
+					} else {
+						placeComma = true;
+					}
+					if (!(entry.getKey() instanceof String)) {
+						throw new FramsticksException().msg("non string keys are not allowed in serialization").arg("key type", entry.getKey().getClass());
+					}
+					appendString((String) entry.getKey());
+					builder.append(":");
+					serializeInternal(entry.getValue());
+				}
+				builder.append("}");
+				return true;
+			}
+			throw new FramsticksException().msg("invalid type for serialization").arg("type", type);
+		}
+
+		public String serialize(Object value) {
+			if (value instanceof String) {
+				String stringValue = (String) value;
+				if (!stringValue.startsWith(SERIALIZED)) {
+					return stringValue;
+				}
+			}
+			boolean complex = serializeInternal(value);
+			return (complex ? SERIALIZED : "") + builder.toString();
+		}
+
+	}
+
+
+	public static <T> String serialize(T value) {
+		return new SerializationContext().serialize(value);
+	}
+
+	public static <T> T deserialize(String value, Class<T> type) {
+		return null;
+	}
+
 }
Index: java/main/src/main/java/com/framsticks/params/PrimitiveParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/PrimitiveParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/PrimitiveParam.java	(revision 105)
@@ -3,5 +3,7 @@
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.Misc;
+import com.framsticks.util.lang.Casting;
 import com.framsticks.util.lang.Numbers;
+import com.framsticks.util.lang.Strings;
 
 import javax.annotation.concurrent.Immutable;
@@ -33,7 +35,7 @@
 	}
 
-	public void save(Sink sink, Object value) {
-		sink.print(value);
-	}
+	// public void save(Sink sink, Object value) {
+	// 	sink.print(value);
+	// }
 
 	protected <T> T tryCastAndReturn(Object value, Class<T> type) {
@@ -97,3 +99,16 @@
 	}
 
+	@Override
+	public <T> String serialize(T value) {
+		return Strings.toStringNullProof(value);
+	}
+
+	@Override
+	public <T> T deserialize(String text, T currentValue, Class<T> type) {
+		try {
+			return Casting.nullOrThrowCast(type, reassign(text, currentValue).getValue());
+		} catch (CastFailure e) {
+			return null;
+		}
+	}
 }
Index: java/main/src/main/java/com/framsticks/params/PropertiesAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/PropertiesAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/PropertiesAccess.java	(revision 105)
@@ -1,10 +1,6 @@
 package com.framsticks.params;
-
-import java.util.HashMap;
-import java.util.Map;
 
 import com.framsticks.params.types.EventParam;
 import com.framsticks.params.types.ProcedureParam;
-
 
 /**
@@ -18,13 +14,9 @@
 public class PropertiesAccess extends SimpleAbstractAccess {
 
-	public Map<String, Object> properties;
+	protected PropertiesObject properties;
 
 	@Override
-	public Map<String, Object> createAccessee() {
-		return PropertiesAccess.createPropertiesMap();
-	}
-
-	public static Map<String, Object> createPropertiesMap() {
-		return new HashMap<String, Object>();
+	public PropertiesObject createAccessee() {
+		return new PropertiesObject(framsClass.getId());
 	}
 
@@ -43,23 +35,18 @@
 		assert properties != null;
 		assert param != null;
-		Object object = properties.get(param.getId());
-		if (object != null) {
-			try {
-				return type.cast(object);
-			} catch (ClassCastException e) {
-				throw (ClassCastException) new ClassCastException("property " + param + " type is " + object.getClass().getName() + ", not " + type.getName()).initCause(e);
-			}
+		Object object = properties.get(param.getId(), Object.class);
+		if (object == null) {
+			return null;
 		}
 		try {
-			return param.getDef(type);
+			return type.cast(object);
 		} catch (ClassCastException e) {
-			throw (ClassCastException) new ClassCastException("default value of property " + param + " is not of type " + type.getName()).initCause(e);
+			throw (ClassCastException) new ClassCastException("property " + param + " type is " + object.getClass().getName() + ", not " + type.getName()).initCause(e);
 		}
-
 	}
 
 	@Override
 	protected <T> void internalSet(ValueParam param, T value) {
-		properties.put(param.getId(), value);
+		properties.set(param.getId(), value);
 	}
 
@@ -73,8 +60,7 @@
 	 *            the properties with parameters values
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
 	public PropertiesAccess select(Object object) {
-		properties = ParamsUtil.selectObjectForAccess(this, object, Map.class);
+		properties = ParamsUtil.selectObjectForAccess(this, object, PropertiesObject.class);
 		return this;
 	}
@@ -82,5 +68,5 @@
 	/** covariant */
 	@Override
-	public Map<String, Object> getSelected() {
+	public PropertiesObject getSelected() {
 		return properties;
 	}
@@ -97,10 +83,10 @@
 
 	@Override
-	public Object call(String id, Object[] arguments) {
+	public Object call(String id, Object... arguments) {
 		throw new InvalidOperationException().msg("properties access does not support calling methods").arg("id", id);
 	}
 
 	@Override
-	public Object call(ProcedureParam param, Object[] arguments) {
+	public Object call(ProcedureParam param, Object... arguments) {
 		throw new InvalidOperationException().msg("properties access does not support calling methods").arg("param", param);
 	}
Index: java/main/src/main/java/com/framsticks/params/PropertiesObject.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/PropertiesObject.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/params/PropertiesObject.java	(revision 105)
@@ -0,0 +1,47 @@
+package com.framsticks.params;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+import com.framsticks.util.lang.Casting;
+
+public class PropertiesObject {
+
+	protected final String framsTypeName;
+	protected final Map<String, Object> values = new TreeMap<>();
+
+	/**
+	 * @param framsTypeName
+	 */
+	public PropertiesObject(String framsTypeName) {
+		this.framsTypeName = framsTypeName;
+	}
+
+	public <T> void set(String id, T value) {
+		values.put(id, value);
+	}
+
+	public <T> T get(String id, Class<T> type) {
+		return Casting.nullOrThrowCast(type, values.get(id));
+	}
+
+	public void clear() {
+		values.clear();
+	}
+
+	public int size() {
+		return values.size();
+	}
+
+	@Override
+	public String toString() {
+		return values.toString();
+	}
+
+	/**
+	 * @return the framsTypeName
+	 */
+	public String getFramsTypeName() {
+		return framsTypeName;
+	}
+}
Index: java/main/src/main/java/com/framsticks/params/ReflectionAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ReflectionAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ReflectionAccess.java	(revision 105)
@@ -131,5 +131,5 @@
 
 	@Override
-	public Object call(String id, Object[] arguments) {
+	public Object call(String id, Object... arguments) {
 		try {
 			try {
@@ -151,5 +151,5 @@
 
 	@Override
-	public Object call(ProcedureParam param, Object[] arguments) {
+	public Object call(ProcedureParam param, Object... arguments) {
 		return call(param.getId(), arguments);
 	}
@@ -162,5 +162,5 @@
 
 		try {
-			for (ValueParam p : filterInstanceof(framsClass.getParamEntries(), ValueParam.class)) {
+			for (ValueParam p : filterInstanceof(framsClass.getParams(), ValueParam.class)) {
 				setValue(p, p.getDef(Object.class));
 			}
Index: java/main/src/main/java/com/framsticks/params/ReflectionAccessBackend.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ReflectionAccessBackend.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ReflectionAccessBackend.java	(revision 105)
@@ -81,5 +81,5 @@
 
 		try {
-			for (final ProcedureParam pp : filterInstanceof(framsClass.getParamEntries(), ProcedureParam.class)) {
+			for (final ProcedureParam pp : filterInstanceof(framsClass.getParams(), ProcedureParam.class)) {
 				if (!candidates.containsKey(pp.getId())) {
 					log.trace("java class does implement method {}", pp);
@@ -99,5 +99,5 @@
 			}
 
-			for (final EventParam ep : filterInstanceof(framsClass.getParamEntries(), EventParam.class)) {
+			for (final EventParam ep : filterInstanceof(framsClass.getParams(), EventParam.class)) {
 				if (!candidates.containsKey(ep.getId())) {
 					log.trace("java class does not implement the event param {}", ep);
@@ -125,5 +125,5 @@
 			}
 
-			for (final ValueParam vp : filterInstanceof(framsClass.getParamEntries(), ValueParam.class)) {
+			for (final ValueParam vp : filterInstanceof(framsClass.getParams(), ValueParam.class)) {
 				if (!candidates.containsKey(vp.getId())) {
 					throw new ConstructionException().msg("missing candidate for param").arg("param", vp);
@@ -228,5 +228,5 @@
 		}
 		if (!a.isPrimitive()) {
-			return a.equals(b);
+			return b.isAssignableFrom(a);//equals(b);
 		}
 
Index: java/main/src/main/java/com/framsticks/params/SimpleAbstractAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/SimpleAbstractAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/SimpleAbstractAccess.java	(revision 105)
@@ -1,6 +1,3 @@
 package com.framsticks.params;
-
-
-
 
 import com.framsticks.params.types.ObjectParam;
@@ -36,5 +33,5 @@
 
 	@Override
-	public String getId() {
+	public String getTypeId() {
 		return framsClass.getId();
 	}
@@ -62,20 +59,20 @@
 	@Override
 	public <T> T get(int i, Class<T> type) {
-		return get(framsClass.getParamEntry(i, ValueParam.class), type);
+		return get(ParamsUtil.getParam(framsClass, i, ValueParam.class), type);
 	}
 
 	@Override
 	public <T> T get(String id, Class<T> type) {
-		return get(framsClass.getParamEntry(id, ValueParam.class), type);
+		return get(ParamsUtil.getParam(framsClass, id, ValueParam.class), type);
 	}
 
 	@Override
 	public <T> int set(int i, T value) {
-		return set(framsClass.getParamEntry(i, ValueParam.class), value);
+		return set(ParamsUtil.getParam(framsClass, i, ValueParam.class), value);
 	}
 
 	@Override
 	public <T> int set(String id, T value) {
-		return set(framsClass.getParamEntry(id, ValueParam.class), value);
+		return set(ParamsUtil.getParam(framsClass, id, ValueParam.class), value);
 	}
 
@@ -107,5 +104,5 @@
 	@Override
 	public Iterable<Param> getParams() {
-		return framsClass.getParamEntries();
+		return framsClass.getParams();
 	}
 
@@ -122,5 +119,5 @@
 	@Override
 	public ParamBuilder buildParam(ParamBuilder builder) {
-		return builder.name(getId()).type(ObjectParam.class).containedTypeName(getId());
+		return builder.name(getTypeId()).type(ObjectParam.class).containedTypeName(getTypeId());
 	}
 
Index: java/main/src/main/java/com/framsticks/params/SimplePrimitive.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/SimplePrimitive.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/SimplePrimitive.java	(revision 105)
@@ -1,5 +1,5 @@
 package com.framsticks.params;
 
-import com.framsticks.core.ValueChange;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.util.lang.Strings;
 
Index: java/main/src/main/java/com/framsticks/params/SimpleUniqueList.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/SimpleUniqueList.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/SimpleUniqueList.java	(revision 105)
@@ -5,5 +5,5 @@
 import java.util.Map;
 
-import com.framsticks.core.ListChange;
+import com.framsticks.structure.messages.ListChange;
 
 public class SimpleUniqueList<T extends UniqueObject> implements Iterable<T> {
Index: java/main/src/main/java/com/framsticks/params/UniqueListAccess.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/UniqueListAccess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/UniqueListAccess.java	(revision 105)
@@ -140,6 +140,6 @@
 
 	@Override
-	public String getId() {
-		return "l " + elementAccess.getId() + " " + uidName;
+	public String getTypeId() {
+		return "l " + elementAccess.getTypeId() + " " + uidName;
 	}
 
Index: java/main/src/main/java/com/framsticks/params/ValueParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/ValueParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/ValueParam.java	(revision 105)
@@ -1,4 +1,3 @@
 package com.framsticks.params;
-
 
 import javax.annotation.concurrent.Immutable;
@@ -23,3 +22,13 @@
 	public abstract <T> T getDef(Class<T> type);
 
+	public abstract Class<?> getStorageType();
+
+	public boolean isNumeric() {
+		return false;
+	}
+
+	public abstract <T> String serialize(T value);
+
+	public abstract <T> T deserialize(String text, T currentValue, Class<T> type);
+
 }
Index: java/main/src/main/java/com/framsticks/params/types/ArrayListParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/ArrayListParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/ArrayListParam.java	(revision 105)
@@ -49,10 +49,10 @@
 			// List<?> list;
 			// if (oldValue == null) {
-			// 	list = new ArrayList<Object>();
+			//	list = new ArrayList<Object>();
 			// } else {
-			// 	list = Casting.tryCast(List.class, oldValue);
-			// 	if (list == null) {
-			// 		throw new CastFailure();
-			// 	}
+			//	list = Casting.tryCast(List.class, oldValue);
+			//	if (list == null) {
+			//		throw new CastFailure();
+			//	}
 			// }
 			// Containers.resizeList(list, size);
@@ -61,5 +61,5 @@
 		}
 		// if (oldValue != null) {
-		// 	return new ReassignResult<List<?>>(Casting.throwCast(List.class, oldValue));
+		//	return new ReassignResult<List<?>>(Casting.throwCast(List.class, oldValue));
 		// }
 		return new ReassignResult<List<?>>(Casting.throwCast(List.class, newValue));
@@ -70,3 +70,5 @@
 		return "l " + getContainedTypeName();
 	}
+
+		// return (value == null) ? "0" : Integer.toString(Casting.throwCast(List.class, value).size());
 }
Index: java/main/src/main/java/com/framsticks/params/types/BooleanParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/BooleanParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/BooleanParam.java	(revision 105)
@@ -7,5 +7,4 @@
 import com.framsticks.params.PrimitiveParam;
 import com.framsticks.params.ReassignResult;
-import com.framsticks.params.Sink;
 import com.framsticks.util.lang.Numbers;
 
@@ -58,7 +57,7 @@
 
 	@Override
-	public void save(Sink sink, Object value) {
+	public String serialize(Object value) {
 		assert value instanceof Boolean;
-		sink.print(((Boolean)value) ? "1" : "0");
+		return ((Boolean)value) ? "1" : "0";
 	}
 }
Index: java/main/src/main/java/com/framsticks/params/types/EventParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/EventParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/EventParam.java	(revision 105)
@@ -24,9 +24,4 @@
 
 	@Override
-	public Class<?> getStorageType() {
-		return Void.TYPE;
-	}
-
-	@Override
 	public String getFramsTypeName() {
 		return eventArgumentTypeName != null ? "e " + eventArgumentTypeName : "e";
Index: java/main/src/main/java/com/framsticks/params/types/ListParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/ListParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/ListParam.java	(revision 105)
@@ -16,3 +16,12 @@
 	}
 
+	@Override
+	public <T> String serialize(T value) {
+		return null;
+	}
+
+	@Override
+	public <T> T deserialize(String text, T currentValue, Class<T> type) {
+		return null;
+	}
 }
Index: java/main/src/main/java/com/framsticks/params/types/ObjectParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/ObjectParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/ObjectParam.java	(revision 105)
@@ -5,4 +5,5 @@
 import com.framsticks.params.CompositeParam;
 import com.framsticks.params.ParamBuilder;
+import com.framsticks.params.ParamsUtil;
 import com.framsticks.params.ReassignResult;
 
@@ -50,4 +51,13 @@
 	}
 
+	@Override
+	public <T> String serialize(T value) {
+		return ParamsUtil.serialize(value);
+	}
+
+	@Override
+	public <T> T deserialize(String text, T currentValue, Class<T> type) {
+		return ParamsUtil.deserialize(text, type);
+	}
 
 }
Index: java/main/src/main/java/com/framsticks/params/types/ProcedureParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/ProcedureParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/ProcedureParam.java	(revision 105)
@@ -52,9 +52,4 @@
 	}
 
-	@Override
-	public Class<?> getStorageType() {
-		return Void.TYPE;
-	}
-
 	public @Nullable ValueParam getResultType() {
 		return resultType;
Index: java/main/src/main/java/com/framsticks/params/types/StringParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/StringParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/StringParam.java	(revision 105)
@@ -5,5 +5,4 @@
 import com.framsticks.params.PrimitiveParam;
 import com.framsticks.params.ReassignResult;
-import com.framsticks.params.Sink;
 
 import javax.annotation.concurrent.Immutable;
@@ -49,8 +48,8 @@
 
 	@Override
-	public void save(Sink sink, Object value) {
+	public String serialize(Object value) {
 		assert value instanceof String;
-		String s = (String)value;
-		sink.print((s.contains(SEPARATOR) ? (s = "~" + SEPARATOR + s + "~") : s));
+		String s = (String) value;
+		return (s.contains(SEPARATOR) ? (s = "~" + SEPARATOR + s + "~") : s);
 	}
 }
Index: java/main/src/main/java/com/framsticks/params/types/UniversalParam.java
===================================================================
--- java/main/src/main/java/com/framsticks/params/types/UniversalParam.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/params/types/UniversalParam.java	(revision 105)
@@ -3,4 +3,5 @@
 import com.framsticks.params.CastFailure;
 import com.framsticks.params.ParamBuilder;
+import com.framsticks.params.ParamsUtil;
 import com.framsticks.params.PrimitiveParam;
 import com.framsticks.params.ReassignResult;
@@ -37,3 +38,13 @@
 	}
 
+	@Override
+	public <T> String serialize(T value) {
+		return ParamsUtil.serialize(value);
+	}
+
+	@Override
+	public <T> T deserialize(String text, T currentValue, Class<T> type) {
+		return ParamsUtil.deserialize(text, type);
+	}
+
 }
Index: java/main/src/main/java/com/framsticks/parsers/AccessStash.java
===================================================================
--- java/main/src/main/java/com/framsticks/parsers/AccessStash.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/parsers/AccessStash.java	(revision 105)
@@ -18,5 +18,5 @@
 	public AccessStash add(Access access) {
 		/**TODO: by id or by name? rather by id, because from file is always lowercase*/
-		accesses.put(access.getId(), access);
+		accesses.put(access.getTypeId(), access);
 		return this;
 	}
Index: java/main/src/main/java/com/framsticks/parsers/F0Parser.java
===================================================================
--- java/main/src/main/java/com/framsticks/parsers/F0Parser.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/parsers/F0Parser.java	(revision 105)
@@ -233,5 +233,5 @@
 							throw (new Exception("tried to set a read-only attribute \""
 								+ currentParam.getId()
-								+ "\" in class \"" + access.getId() + "\""));
+								+ "\" in class \"" + access.getTypeId() + "\""));
 						}
 					}
@@ -258,5 +258,5 @@
 				+ param.getId()
 				+ "\" in class \""
-				+ access.getId()
+				+ access.getTypeId()
 				+ "\" to value which exceeds " + name + " ("
 				+ value
Index: java/main/src/main/java/com/framsticks/parsers/F0Writer.java
===================================================================
--- java/main/src/main/java/com/framsticks/parsers/F0Writer.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/parsers/F0Writer.java	(revision 105)
@@ -38,5 +38,5 @@
 		}
 		StringBuilder line = new StringBuilder();
-		line.append(access.getId()).append(":");
+		line.append(access.getTypeId()).append(":");
 		boolean placeComma = false;
 		boolean contiguous = true;
Index: java/main/src/main/java/com/framsticks/parsers/Savers.java
===================================================================
--- java/main/src/main/java/com/framsticks/parsers/Savers.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/parsers/Savers.java	(revision 105)
@@ -19,5 +19,5 @@
 
 		save(framsClassAccess, sink);
-		for (Param p : framsClass.getParamEntries()) {
+		for (Param p : framsClass.getParams()) {
 			save(paramAccess.select(p), sink);
 		}
Index: java/main/src/main/java/com/framsticks/parsers/XmlLoader.java
===================================================================
--- java/main/src/main/java/com/framsticks/parsers/XmlLoader.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/parsers/XmlLoader.java	(revision 105)
@@ -27,4 +27,5 @@
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.lang.Strings;
+import static com.framsticks.params.ParamsUtil.getParam;
 
 public class XmlLoader {
@@ -110,5 +111,5 @@
 		for (int i = 0; i < attributes.getLength(); ++i) {
 			Node attributeNode = attributes.item(i);
-			PrimitiveParam<?> param = access.getFramsClass().getParamEntry(mangleAttribute(attributeNode.getNodeName()), PrimitiveParam.class);
+			PrimitiveParam<?> param = getParam(access, mangleAttribute(attributeNode.getNodeName()), PrimitiveParam.class);
 			if (param.hasFlag(ParamFlags.READONLY)) {
 				throw new FramsticksException().msg("cannot configure readonly param").arg("param", param).arg("in", access);
Index: java/main/src/main/java/com/framsticks/remote/RecursiveFetcher.java
===================================================================
--- java/main/src/main/java/com/framsticks/remote/RecursiveFetcher.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/remote/RecursiveFetcher.java	(revision 105)
@@ -1,14 +1,12 @@
 package com.framsticks.remote;
 
-import static com.framsticks.core.TreeOperations.*;
 
-import com.framsticks.core.Node;
-import com.framsticks.core.Path;
 import com.framsticks.params.Access;
 import com.framsticks.params.CompositeParam;
-import com.framsticks.params.FramsClass;
-import com.framsticks.core.Tree;
+import com.framsticks.structure.Node;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.Tree;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.ThrowExceptionHandler;
 import com.framsticks.util.FramsticksException;
@@ -17,4 +15,6 @@
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
+
+import static com.framsticks.structure.TreeOperations.*;
 import static com.framsticks.util.lang.Containers.filterInstanceof;
 import com.framsticks.util.dispatching.RunAt;
@@ -28,9 +28,9 @@
 
 	protected final Tree tree;
-	protected final Future<Void> future;
+	protected final FutureHandler<Void> future;
 	protected int dispatched;
 	protected final Stopwatch stopwatch = new Stopwatch();
 
-	public RecursiveFetcher(Tree tree, final Path path, Future<Void> future) {
+	public RecursiveFetcher(Tree tree, final Path path, FutureHandler<Void> future) {
 		this.tree = tree;
 		this.future = future;
@@ -51,6 +51,4 @@
 		} else {
 			Access access = bindAccess(path);
-			FramsClass framsClass = access.getFramsClass();
-			assert framsClass != null;
 			for (CompositeParam p : filterInstanceof(access.getParams(), CompositeParam.class)) {
 				Object child = access.get(p, Object.class);
@@ -67,5 +65,5 @@
 				}
 				++dispatched;
-				tree.get(childPath, new FutureHandler<Path>(Logging.logger(log, "resolve", RecursiveFetcher.this)) {
+				tree.get(childPath, new Future<Path>(Logging.logger(log, "resolve", RecursiveFetcher.this)) {
 					@Override
 					protected void result(Path result) {
@@ -83,5 +81,5 @@
 
 	protected void fetch(final Path path) {
-		tree.get(path, new Future<Path>() {
+		tree.get(path, new FutureHandler<Path>() {
 
 			@Override
Index: java/main/src/main/java/com/framsticks/remote/RemoteTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/remote/RemoteTree.java	(revision 105)
@@ -6,8 +6,4 @@
 import com.framsticks.communication.queries.InfoRequest;
 import com.framsticks.communication.queries.SetRequest;
-import com.framsticks.core.AbstractTree;
-import com.framsticks.core.ListChange;
-import com.framsticks.core.Path;
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.*;
 import com.framsticks.params.EventListener;
@@ -17,11 +13,14 @@
 import com.framsticks.params.types.ProcedureParam;
 import com.framsticks.parsers.Loaders;
+import com.framsticks.structure.AbstractTree;
+import com.framsticks.structure.Path;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.util.*;
 import com.framsticks.util.dispatching.AtOnceDispatcher;
 import com.framsticks.util.dispatching.Dispatching;
 import com.framsticks.util.dispatching.DispatchingFuture;
-import com.framsticks.util.dispatching.ExceptionResultHandler;
+import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Future;
-import com.framsticks.util.dispatching.FutureHandler;
 import com.framsticks.util.dispatching.Joinable;
 import com.framsticks.util.dispatching.JoinableParent;
@@ -29,5 +28,6 @@
 import com.framsticks.util.dispatching.ThrowExceptionHandler;
 import com.framsticks.util.dispatching.RunAt;
-import static com.framsticks.core.TreeOperations.*;
+
+import static com.framsticks.structure.TreeOperations.*;
 
 import java.util.*;
@@ -80,6 +80,6 @@
 	}
 
-	protected ExceptionResultHandler pathRemoveHandler(final Path path, final ExceptionResultHandler handler) {
-		return new ExceptionResultHandler() {
+	protected ExceptionHandler pathRemoveHandler(final Path path, final ExceptionHandler handler) {
+		return new ExceptionHandler() {
 
 			@Override
@@ -114,5 +114,5 @@
 	// }
 
-	protected final Map<String, Set<Future<FramsClass>>> infoRequests = new HashMap<String, Set<Future<FramsClass>>>();
+	protected final Map<String, Set<FutureHandler<FramsClass>>> infoRequests = new HashMap<String, Set<FutureHandler<FramsClass>>>();
 
 
@@ -124,5 +124,5 @@
 	 * */
 	@Override
-	public void info(final Path path, final Future<FramsClass> future) {
+	public void info(final Path path, final FutureHandler<FramsClass> future) {
 
 		final String name = path.getTop().getParam().getContainedTypeName();
@@ -134,9 +134,9 @@
 
 		log.debug("issuing info request for {}", name);
-		final Set<Future<FramsClass>> futures = new HashSet<Future<FramsClass>>();
+		final Set<FutureHandler<FramsClass>> futures = new HashSet<FutureHandler<FramsClass>>();
 		futures.add(future);
 		infoRequests.put(name, futures);
 
-		final Future<FramsClass> compositeFuture = DispatchingFuture.create(this, new Future<FramsClass>() {
+		final FutureHandler<FramsClass> compositeFuture = DispatchingFuture.create(this, new FutureHandler<FramsClass>() {
 
 			@Override
@@ -144,5 +144,5 @@
 				assert isActive();
 				infoRequests.remove(name);
-				for (Future<FramsClass> f : futures) {
+				for (FutureHandler<FramsClass> f : futures) {
 					f.handle(exception);
 				}
@@ -154,5 +154,5 @@
 				putInfoIntoCache(framsClass);
 				infoRequests.remove(name);
-				for (Future<FramsClass> f : futures) {
+				for (FutureHandler<FramsClass> f : futures) {
 					f.pass(framsClass);
 				}
@@ -183,10 +183,10 @@
 
 	@Override
-	public void get(final Path path, final Future<Path> future) {
-		assert isActive();
-		final ExceptionResultHandler remover = pathRemoveHandler(path, future);
+	public void get(final Path path, final FutureHandler<Path> future) {
+		assert isActive();
+		final ExceptionHandler remover = pathRemoveHandler(path, future);
 
 		log.trace("fetching values for {}", path);
-		findInfo(path, new FutureHandler<FramsClass>(remover) {
+		findInfo(path, new Future<FramsClass>(remover) {
 			@Override
 			protected void result(FramsClass result) {
@@ -204,5 +204,5 @@
 
 	@Override
-	public void set(final Path path, final PrimitiveParam<?> param, final Object value, final Future<Integer> future) {
+	public void set(final Path path, final PrimitiveParam<?> param, final Object value, final FutureHandler<Integer> future) {
 		assert isActive();
 		final Integer flag = bindAccess(path).set(param, value);
@@ -267,5 +267,5 @@
 
 	@Override
-	public <R> void call(@Nonnull final Path path, @Nonnull final ProcedureParam procedure, @Nonnull Object[] arguments, final Class<R> resultType, final Future<R> future) {
+	public <R> void call(@Nonnull final Path path, @Nonnull final ProcedureParam procedure, @Nonnull Object[] arguments, final Class<R> resultType, final FutureHandler<R> future) {
 		assert isActive();
 		assert path.isResolved();
@@ -294,5 +294,5 @@
 	protected final Map<EventListener<?>, EventListener<File>> proxyListeners = new IdentityHashMap<>();
 
-	public <A> void addListener(Path path, EventParam param, final EventListener<A> listener, final Class<A> argumentType, final Future<Void> future) {
+	public <A> void addListener(Path path, EventParam param, final EventListener<A> listener, final Class<A> argumentType, final FutureHandler<Void> future) {
 		assert isActive();
 		assert path.isResolved();
@@ -322,5 +322,5 @@
 	}
 
-	public void removeListener(Path path, EventParam param, EventListener<?> listener, Future<Void> future) {
+	public void removeListener(Path path, EventParam param, EventListener<?> listener, FutureHandler<Void> future) {
 		assert isActive();
 		EventListener<File> proxyListener = proxyListeners.get(listener);
Index: java/main/src/main/java/com/framsticks/running/ExternalProcess.java
===================================================================
--- java/main/src/main/java/com/framsticks/running/ExternalProcess.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/running/ExternalProcess.java	(revision 105)
@@ -14,5 +14,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.EventListeners;
@@ -21,4 +20,5 @@
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.dispatching.AbstractJoinable;
Index: java/main/src/main/java/com/framsticks/running/LoggingOutputListener.java
===================================================================
--- java/main/src/main/java/com/framsticks/running/LoggingOutputListener.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/running/LoggingOutputListener.java	(revision 105)
@@ -4,7 +4,7 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.annotations.FramsClassAnnotation;
+import com.framsticks.structure.messages.ValueChange;
 
 @FramsClassAnnotation
Index: java/main/src/main/java/com/framsticks/structure/AbstractTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/AbstractTree.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/AbstractTree.java	(revision 105)
@@ -0,0 +1,345 @@
+package com.framsticks.structure;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.PriorityQueue;
+
+import javax.annotation.Nonnull;
+
+import org.apache.commons.collections.map.ReferenceIdentityMap;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+
+import com.framsticks.communication.queries.NeedFile;
+import com.framsticks.communication.queries.NeedFileAcceptor;
+import com.framsticks.params.Access;
+import com.framsticks.params.CompositeParam;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.ParamFlags;
+import com.framsticks.params.ParamsPackage;
+import com.framsticks.params.Registry;
+import com.framsticks.params.annotations.AutoAppendAnnotation;
+import com.framsticks.params.annotations.FramsClassAnnotation;
+import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.Message;
+import com.framsticks.structure.messages.Result;
+import com.framsticks.structure.messages.ValueChange;
+import com.framsticks.util.ExceptionHandler;
+import com.framsticks.util.FramsticksException;
+import com.framsticks.util.Misc;
+import com.framsticks.util.dispatching.AbstractJoinable;
+import com.framsticks.util.dispatching.BufferedDispatcher;
+import com.framsticks.util.dispatching.Dispatcher;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.Joinable;
+import com.framsticks.util.dispatching.JoinableParent;
+import com.framsticks.util.dispatching.JoinableState;
+import com.framsticks.util.dispatching.RunAt;
+import com.framsticks.util.dispatching.ThrowExceptionHandler;
+import com.framsticks.util.lang.Pair;
+
+/**
+ * @author Piotr Sniegowski
+ */
+@FramsClassAnnotation
+public abstract class AbstractTree extends AbstractJoinable implements Tree, JoinableParent, NeedFileAcceptor {
+
+	private static final Logger log = LogManager.getLogger(AbstractTree.class);
+
+	private Node root = null;
+	private ExceptionHandler handler = ThrowExceptionHandler.getInstance();
+
+	protected final BufferedDispatcher<Tree> bufferedDispatcher = new BufferedDispatcher<>(this);
+
+	protected final Registry registry = new Registry();
+
+	protected final PriorityQueue<Pair<Integer, NeedFileAcceptor>> needFileAcceptors = new PriorityQueue<>(32, new Comparator<Pair<Integer, NeedFileAcceptor>>() {
+
+		@Override
+		public int compare(Pair<Integer, NeedFileAcceptor> arg0, Pair<Integer, NeedFileAcceptor> arg1) {
+			if (arg0.first < arg1.first) {
+				return -1;
+			}
+			if (arg0.first > arg1.first) {
+				return 1;
+			}
+			return 0;
+		}
+	});
+
+	@Override
+	public void assignRootParam(CompositeParam param) {
+		if (root != null) {
+			throw new FramsticksException().msg("root has already specified type");
+		}
+		root = new Node(this, param, null);
+		log.debug("assigned root type: {}", root);
+	}
+
+	@Override
+	public void assignRootObject(Object object) {
+		if (root == null) {
+			throw new FramsticksException().msg("root has no type specified");
+		}
+		if (root.getObject() != null) {
+			throw new FramsticksException().msg("root has already object assigned").arg("current", root.getObject()).arg("candidate", object);
+		}
+		root = new Node(this, root.getParam(), object);
+		log.debug("assigned root object: {}", root);
+	}
+
+	@Override
+	public @Nonnull Node getAssignedRoot() {
+		if (root == null) {
+			throw new FramsticksException().msg("root has no type specified yet").arg("in", this);
+		}
+		return root;
+	}
+
+	public boolean isRootAssigned() {
+		// assert isActive();
+		return root != null;
+	}
+
+	protected String name;
+
+	public AbstractTree() {
+		setName("tree");
+
+		registry.registerAndBuild(Result.class);
+		registry.registerAndBuild(ValueChange.class);
+		registry.registerAndBuild(ListChange.class);
+		registry.registerAndBuild(Message.class);
+	}
+
+	protected void tryRegisterOnChangeEvents(Path path) {
+
+	}
+
+	@Override
+	public final FramsClass getInfoFromCache(String id) {
+		assert isActive();
+		return registry.getFramsClass(id);
+	}
+
+
+	@Override
+	public @Nonnull Access prepareAccess(CompositeParam param) {
+		return registry.prepareAccess(param);
+	}
+
+	@Override
+	public void takeAllFrom(Registry source) {
+		registry.takeAllFrom(source);
+	}
+
+	@AutoAppendAnnotation
+	public void usePackage(ParamsPackage paramsPackage) {
+		log.debug("using package {} in tree {}", paramsPackage, this);
+		paramsPackage.register(registry);
+	}
+
+	@AutoAppendAnnotation
+	public void takeFromRegistry(Registry registry) {
+		log.debug("taking from registry {} in tree {}", registry, this);
+		this.registry.takeAllFrom(registry);
+	}
+
+
+	@Override
+	public void putInfoIntoCache(FramsClass framclass) {
+		registry.putFramsClass(framclass);
+	}
+
+
+	/**
+	 * @return the handler
+	 */
+	@Override
+	public ExceptionHandler getExceptionHandler() {
+		return handler;
+	}
+
+	/**
+	 * @param handler the handler to set
+	 */
+	@Override
+	public void setExceptionHandler(ExceptionHandler handler) {
+		this.handler = handler;
+	}
+
+	@Override
+	public void handle(FramsticksException exception) {
+		handler.handle(exception);
+	}
+
+	/**
+	 * @return the dispatcher
+	 */
+	@Override
+	public Dispatcher<Tree> getDispatcher() {
+		return bufferedDispatcher;
+	}
+
+	/**
+	 * @param dispatcher the dispatcher to set
+	 */
+	@Override
+	public void setDispatcher(Dispatcher<Tree> dispatcher) {
+		bufferedDispatcher.setTargetDispatcher(dispatcher);
+	}
+
+	/**
+	 * @return the name
+	 */
+	@ParamAnnotation(flags = ParamFlags.USERREADONLY)
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * @param name the name to set
+	 */
+	@ParamAnnotation
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	/**
+	 * @return the registry
+	 */
+	@Override
+	public Registry getRegistry() {
+		return registry;
+	}
+
+	@Override
+	protected void joinableStart() {
+		bufferedDispatcher.createThreadIfNeeded();
+		Dispatching.use(bufferedDispatcher, this);
+	}
+
+	@Override
+	protected void joinableInterrupt() {
+		Dispatching.drop(bufferedDispatcher, this);
+	}
+
+	@Override
+	protected void joinableFinish() {
+
+	}
+
+	@Override
+	protected void joinableJoin() throws InterruptedException {
+		Dispatching.join(bufferedDispatcher);
+	}
+
+	@Override
+	public void childChangedState(Joinable joinable, JoinableState state) {
+		if (joinable == bufferedDispatcher) {
+			proceedToState(state);
+		}
+	}
+
+	@Override
+	public boolean isActive() {
+		return bufferedDispatcher.isActive();
+	}
+
+	@Override
+	public void dispatch(RunAt<? extends Tree> runnable) {
+		bufferedDispatcher.dispatch(runnable);
+	}
+
+
+	@SuppressWarnings("unchecked")
+	protected final Map<Object, Object> sideNotes = (Map<Object, Object>) new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
+
+	@Override
+	public <T> void putSideNote(Object object, SideNoteKey<T> key, T value) {
+		assert isActive();
+		Misc.throwIfNull(object);
+		Misc.throwIfNull(key);
+		Misc.throwIfNull(value);
+		Object sideNote = sideNotes.get(object);
+		if (sideNote == null) {
+			sideNote = new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
+			sideNotes.put(object, sideNote);
+		}
+		@SuppressWarnings("unchecked")
+		Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
+		sideNotesMap.put(key, value);
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public <T> T getSideNote(Object object, SideNoteKey<T> key) {
+		assert isActive();
+		Misc.throwIfNull(object);
+		Misc.throwIfNull(key);
+		Object sideNote = sideNotes.get(object);
+		if (sideNote == null) {
+			return null;
+		}
+		Object value = ((Map<SideNoteKey<?>, Object>) sideNote).get(key);
+		if (value == null) {
+			return null;
+		}
+		return (T) value;
+	}
+
+	@Override
+	public boolean removeSideNote(Object object, SideNoteKey<?> key) {
+		assert isActive();
+		Object sideNote = sideNotes.get(object);
+		if (sideNote == null) {
+			return false;
+		}
+		@SuppressWarnings("unchecked")
+		Map<SideNoteKey<?>, Object> sideNotesMap = (Map<SideNoteKey<?>, Object>) sideNote;
+		boolean result = (sideNotesMap.remove(key) != null);
+		if (sideNotesMap.isEmpty()) {
+			sideNotes.remove(object);
+		}
+		return result;
+	}
+
+	@Override
+	public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor) {
+		assert isActive();
+		needFileAcceptors.add(Pair.make(priority, acceptor));
+	}
+
+	@Override
+	public void removeNeedFileAcceptor(NeedFileAcceptor acceptor) {
+		assert isActive();
+		Iterator<Pair<Integer, NeedFileAcceptor>> i = needFileAcceptors.iterator();
+		while (i.hasNext()) {
+			if (i.next().second == acceptor) {
+				i.remove();
+				break;
+			}
+		}
+	}
+
+	@Override
+	public boolean acceptNeed(final NeedFile needFile) {
+		Dispatching.dispatchIfNotActive(this, new RunAt<AbstractTree>(needFile.getFuture()) {
+
+			@Override
+			protected void runAt() {
+				for (Pair<Integer, NeedFileAcceptor> acceptor : needFileAcceptors) {
+					if (acceptor.second.acceptNeed(needFile)) {
+						return;
+					}
+				}
+				throw new FramsticksException().msg("failed to find need file acceptor in tree").arg("tree", AbstractTree.this).arg("needfile", needFile);
+			}
+		});
+		return true;
+	}
+
+}
+
Index: java/main/src/main/java/com/framsticks/structure/LocalTree.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/LocalTree.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/LocalTree.java	(revision 105)
@@ -0,0 +1,194 @@
+package com.framsticks.structure;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+
+import com.framsticks.params.Access;
+import com.framsticks.params.CompositeParam;
+import com.framsticks.params.EventListener;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.ParamBuilder;
+import com.framsticks.params.PrimitiveParam;
+import com.framsticks.params.annotations.AutoAppendAnnotation;
+import com.framsticks.params.annotations.FramsClassAnnotation;
+import com.framsticks.params.types.EventParam;
+import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.util.FramsticksException;
+import com.framsticks.util.dispatching.Dispatcher;
+import com.framsticks.util.dispatching.DispatcherSetable;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Joinable;
+import com.framsticks.util.dispatching.JoinableState;
+import com.framsticks.util.lang.Casting;
+
+import static com.framsticks.structure.TreeOperations.*;
+
+@FramsClassAnnotation
+public final class LocalTree extends AbstractTree {
+	private static final Logger log = LogManager.getLogger(LocalTree.class);
+
+	protected Joinable joinableRootObject;
+
+	/**
+	 *
+	 */
+	public LocalTree() {
+		super();
+		bufferedDispatcher.setBuffer(false);
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	@AutoAppendAnnotation
+	public void setRootObject(Object object) {
+		final Class<?> javaClass = object.getClass();
+		registry.registerAndBuild(javaClass);
+
+		Access access = registry.createAccess(javaClass);
+
+		assignRootParam(access.buildParam(new ParamBuilder()).id(getName()).finish(CompositeParam.class));
+		assignRootObject(object);
+
+		if (object instanceof Joinable) {
+			joinableRootObject = (Joinable) object;
+		}
+		if (object instanceof DispatcherSetable) {
+			DispatcherSetable<?> setable = (DispatcherSetable<?>) object;
+			setable.setDispatcher((Dispatcher) this);
+		}
+	}
+
+	public Object getRootObject() {
+		Object result = getAssignedRoot().getObject();
+		if (result == null) {
+			throw new FramsticksException().msg("object tree is empty").arg("tree", this);
+		}
+		return result;
+	}
+
+	public <T> T getRootObject(Class<T> type) {
+		Object result = getRootObject();
+		if (!type.isInstance(result)) {
+			throw new FramsticksException().msg("object tree holds object of different kind").arg("object", result).arg("requested", type).arg("tree", this);
+		}
+		return type.cast(result);
+	}
+
+	@Override
+	public void get(Path path, FutureHandler<Path> future) {
+		assert isActive();
+		log.debug("requesting: {}", path);
+		path = resolveTopSync(path);
+		future.pass(path);
+	}
+
+	// @Override
+	// public void get(Path path, ValueParam param, Future<Object> future) {
+	//	assert isActive();
+	//	path = resolveTopSync(path);
+	//	future.pass(bindAccess(path).get(param, Object.class));
+	// }
+
+	@Override
+	public <R> void call(Path path, ProcedureParam param, Object[] arguments, Class<R> resultType, FutureHandler<R> future) {
+		assert isActive();
+		try {
+			Object result = bindAccess(path).call(param, arguments);
+			future.pass(Casting.nullOrThrowCast(resultType, result));
+		} catch (FramsticksException e) {
+			future.handle(e);
+		}
+	}
+
+	@Override
+	public void info(Path path, FutureHandler<FramsClass> future) {
+		assert isActive();
+		Path p = path.tryResolveIfNeeded();
+		Class<?> javaClass = p.getTopObject().getClass();
+		FramsClass framsClass = registry.registerReflectedIfNeeded(javaClass);
+		if (framsClass != null) {
+			future.pass(framsClass);
+		} else {
+			future.handle(new FramsticksException().msg("failed to find info for class").arg("java class", javaClass));
+		}
+	}
+
+	protected Path resolveTopSync(Path path) {
+		assert isActive();
+		assert path.isOwner(this);
+		if (path.getTop().getObject() != null) {
+			return path;
+		}
+		Access access = bindAccess(path.getUnder());
+		Object object = access.get(path.getTop().getParam(), Object.class);
+		if (object == null) {
+			throw new FramsticksException().msg("failed to resolve").arg("path", path);
+		}
+		return path.appendResolution(object);
+	}
+
+
+	@Override
+	public void set(Path path, PrimitiveParam<?> param, Object value, final FutureHandler<Integer> future) {
+		assert isActive();
+		future.pass(bindAccess(path).set(param, value));
+	}
+
+	public <A> void addListener(Path path, EventParam param, EventListener<A> listener, Class<A> argumentType, FutureHandler<Void> future) {
+		assert isActive();
+		try {
+			bindAccess(path).reg(param, listener);
+			future.pass(null);
+		} catch (FramsticksException e) {
+			future.handle(e);
+		}
+	}
+
+	public void removeListener(Path path, EventParam param, EventListener<?> listener, FutureHandler<Void> future) {
+		assert isActive();
+		try {
+			bindAccess(path).regRemove(param, listener);
+			future.pass(null);
+		} catch (FramsticksException e) {
+			future.handle(e);
+		}
+	}
+
+	@Override
+	protected void joinableStart() {
+		super.joinableStart();
+		if (joinableRootObject != null) {
+			Dispatching.use(joinableRootObject, this);
+		}
+	}
+
+	@Override
+	protected void joinableInterrupt() {
+		if (joinableRootObject != null) {
+			Dispatching.drop(joinableRootObject, this);
+		}
+		super.joinableInterrupt();
+	}
+
+	@Override
+	protected void joinableFinish() {
+		super.joinableFinish();
+	}
+
+	@Override
+	protected void joinableJoin() throws InterruptedException {
+		if (joinableRootObject != null) {
+			Dispatching.join(joinableRootObject);
+		}
+		super.joinableJoin();
+	}
+
+	@Override
+	public void childChangedState(Joinable joinable, JoinableState state) {
+		super.childChangedState(joinable, state);
+		if (joinable == joinableRootObject) {
+			proceedToState(state);
+		}
+	}
+
+}
Index: java/main/src/main/java/com/framsticks/structure/Node.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/Node.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/Node.java	(revision 105)
@@ -0,0 +1,58 @@
+package com.framsticks.structure;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.Immutable;
+
+import com.framsticks.params.CompositeParam;
+import com.framsticks.util.FramsticksException;
+// import com.framsticks.params.ParamBuilder;
+import com.framsticks.util.lang.Strings;
+
+/**
+ * @author Piotr Sniegowski
+ */
+@Immutable
+public class Node {
+
+	protected final Tree tree;
+	protected final CompositeParam param;
+	protected final Object object;
+
+	public Node(Tree tree, @Nonnull CompositeParam param, Object object) {
+		assert param != null;
+		assert tree != null;
+		this.tree = tree;
+		this.param = param;
+		this.object = object;
+	}
+
+
+	public final Tree getTree() {
+		return tree;
+	}
+
+	public final CompositeParam getParam() {
+		return param;
+	}
+
+	public final Object getObject() {
+		return object;
+	}
+
+	@Override
+	public String toString() {
+		return param.toString() + ":" + Strings.toStringNullProof(object, "<null>");
+	}
+
+	public final boolean isResolved() {
+		return object != null;
+	}
+
+	public Node assureResolved() {
+		if (!isResolved()) {
+			throw new FramsticksException().msg("path is not resolved").arg("node", this);
+		}
+		return this;
+	}
+
+}
Index: java/main/src/main/java/com/framsticks/structure/Path.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/Path.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/Path.java	(revision 105)
@@ -0,0 +1,381 @@
+package com.framsticks.structure;
+
+import com.framsticks.params.Access;
+import com.framsticks.params.CompositeParam;
+import com.framsticks.params.Param;
+import com.framsticks.params.ParamCollection;
+import com.framsticks.util.ExceptionHandler;
+import com.framsticks.util.FramsticksException;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.IgnoreExceptionHandler;
+import com.framsticks.util.lang.Pair;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.annotation.Nonnull;
+import javax.annotation.concurrent.Immutable;
+
+import org.apache.commons.collections.ListUtils;
+
+/**
+ * @author Piotr Sniegowski
+ */
+@Immutable
+public final class Path implements ParamCollection {
+	// private final static Logger log = LogManager.getLogger(Path.class.getName());
+
+	final Tree tree;
+	final String textual;
+	final LinkedList<Node> nodes;
+
+	public static final SideNoteKey<CompositeParam> OBJECT_PARAM_KEY = SideNoteKey.make(CompositeParam.class);
+
+	protected static Object getKnownChild(Tree tree, Access access, CompositeParam param, ExceptionHandler handler) {
+		Object child = access.get(param, Object.class);
+		if (child == null) {
+			return null;
+		}
+		try {
+			tree.prepareAccess(param);
+			tree.putSideNote(child, OBJECT_PARAM_KEY, param);
+			return child;
+		} catch (FramsticksException e) {
+			handler.handle(e);
+		}
+		return null;
+	}
+
+	/**
+	 * @param tree
+	 * @param textual
+	 * @param nodes
+	 */
+	Path(Tree tree, String textual, LinkedList<Node> nodes) {
+		this.tree = tree;
+		this.textual = textual;
+		this.nodes = nodes;
+	}
+
+	public Path appendNode(Node node) {
+		assert isResolved();
+		return new PathBuilder().tree(tree).textual(textual + ((size() == 1) ? "" : "/") + node.getParam().getId()).add(nodes).add(node).finish();
+	}
+
+	public Path appendParam(CompositeParam param) {
+		assert isResolved();
+		return appendNode(new Node(tree, param, null));
+	}
+
+	public static class PathBuilder {
+
+		Tree tree;
+		String textual;
+		final LinkedList<Node> nodes = new LinkedList<Node>();
+
+		public Path finish() {
+			assert tree != null;
+			assert textual != null;
+			return new Path(tree, textual, nodes);
+		}
+
+		public PathBuilder()
+		{
+		}
+
+		public PathBuilder tree(Tree tree) {
+			this.tree = tree;
+			return this;
+		}
+
+		public PathBuilder textual(String textual) {
+			this.textual = textual;
+			return this;
+		}
+
+		public PathBuilder add(List<Node> nodes) {
+			this.nodes.addAll(nodes);
+			return this;
+		}
+
+		public PathBuilder add(Node node) {
+			this.nodes.add(node);
+			return this;
+		}
+
+		public PathBuilder setLast(Object object) {
+			Node n = nodes.pollLast();
+			nodes.add(new Node(n.getTree(), n.getParam(), object));
+			return this;
+		}
+
+		public PathBuilder buildUpTo(List<Node> nodes, Node node) {
+			StringBuilder b = new StringBuilder();
+			boolean add = false;
+			for (Node n : nodes) {
+				this.nodes.add(n);
+				if (add) {
+					b.append("/").append(n.getParam().getId());
+				}
+				add = true;
+				if (n == node) {
+					break;
+				}
+			}
+			this.textual = (nodes.size() == 1) ? "/" : b.toString();
+			return this;
+		}
+
+		public static Iterator<String> splitPath(String path) {
+			List<String> list = new LinkedList<String>();
+			for (String s : path.split("/")) {
+				if (!s.isEmpty()) {
+					list.add(s);
+				}
+			}
+			return list.iterator();
+		}
+
+		public PathBuilder resolve(@Nonnull Tree tree, String textual) {
+			return resolve(tree, textual, IgnoreExceptionHandler.getInstance());
+		}
+
+		public PathBuilder resolve(@Nonnull Tree tree, String textual, ExceptionHandler handler) {
+
+			assert nodes.isEmpty();
+			assert tree.isActive();
+			this.tree = tree;
+
+			Node current = tree.getAssignedRoot();
+			nodes.add(current);
+
+			StringBuilder b = new StringBuilder();
+			Iterator<String> i = splitPath(textual);
+			while (i.hasNext() && current.getObject() != null) {
+				Access access = TreeOperations.bindAccess(current);// tree.prepareAccess(current.getParam());
+				String e = i.next();
+				Param p = access.getParam(e);
+				if (p == null) {
+					break;
+				}
+				if (!(p instanceof CompositeParam)) {
+					throw new FramsticksException().msg("param is not a composite").arg("param", p).arg("tree", tree).arg("textual", textual).arg("access", access);
+				}
+				CompositeParam c = (CompositeParam) p;
+				b.append("/").append(e);
+				access.select(current.getObject());
+				tree.putSideNote(current.getObject(), OBJECT_PARAM_KEY, current.getParam());
+				current = new Node(current.getTree(), c, getKnownChild(tree, access, c, handler));
+				nodes.add(current);
+			}
+			this.textual = (nodes.size() == 1) ? "/" : b.toString();
+
+			return this;
+		}
+	}
+
+	public static PathBuilder build() {
+		return new PathBuilder();
+	}
+
+	public Path appendResolution(Object object) {
+		assert !isResolved();
+		Path result = new PathBuilder().textual(textual).tree(tree).add(nodes).setLast(object).finish();
+		assert size() == result.size();
+		return result;
+	}
+
+	public final Object getTopObject() {
+		return getTop().getObject();
+	}
+
+	public final Node getTop() {
+		return nodes.getLast();
+	}
+
+	public final Node getUnder() {
+		assert nodes.size() >= 2;
+		return nodes.get(nodes.size() - 2);
+	}
+
+	public final String getTextual() {
+		return textual;
+	}
+
+	public String toString() {
+		return tree + textual + (!isResolved() ? "!" : "");
+	}
+
+	public String getFullTextual() {
+		return tree.getName() + textual;
+	}
+
+	public final int size() {
+		assert Dispatching.isThreadSafe();
+		return nodes.size();
+	}
+
+	public final boolean isResolved() {
+		assert Dispatching.isThreadSafe();
+		return getTop().getObject() != null;
+	}
+
+	public final boolean isResolved(String textual) {
+		assert Dispatching.isThreadSafe();
+		return isTheSame(textual) && isResolved();
+	}
+
+	public final boolean isTheSame(String textual) {
+		assert Dispatching.isThreadSafe();
+		return this.textual.equals(textual);
+	}
+
+	public final boolean isTheSameTextually(Path path) {
+		assert Dispatching.isThreadSafe();
+		return (tree == path.getTree()) && textual.equals(path.getTextual());
+	}
+
+	public final @Nonnull Tree getTree() {
+		assert Dispatching.isThreadSafe();
+		return tree;
+	}
+
+	public Path tryResolveIfNeeded() {
+		if (isResolved()) {
+			return this;
+		}
+		return tryFindResolution();
+	}
+
+	/** Attach resolution at end, if available.
+	 *
+	 * @return Modified path, if resolution was available, this otherwise.
+	 */
+	public Path tryFindResolution() {
+		assert tree.isActive();
+		assert !isResolved();
+		if (size() == 1) {
+			return Path.build().resolve(tree, "/").finish();
+		}
+		Object child = getKnownChild(tree, TreeOperations.bindAccess(getUnder()), getTop().getParam(), IgnoreExceptionHandler.getInstance());
+		if (child == null) {
+			return this;
+		}
+		return appendResolution(child);
+	}
+
+
+	public String getLastElement() {
+		return getTop().getParam().getId();
+	}
+
+	public final boolean isOwner(Tree tree) {
+		return this.tree == tree;
+	}
+
+	@SuppressWarnings("unchecked")
+	public
+	List<Node> getNodes() {
+		return ListUtils.unmodifiableList(nodes);
+	}
+
+	public Path assureResolved() {
+		if (!isResolved()) {
+			throw new FramsticksException().msg("path is not resolved").arg("path", this);
+		}
+		return this;
+	}
+
+	public static Path tryTo(@Nonnull Tree tree, String textual) {
+		return Path.build().resolve(tree, textual).finish();
+	}
+
+	public static Path to(@Nonnull Tree tree, String textual) {
+		Path path = tryTo(tree, textual);
+		if (path.getTextual().equals(textual)) {
+			return path;
+		}
+		throw new FramsticksException().msg("failed to create path").arg("textual", textual).arg("result", path).arg("tree", tree);
+	}
+
+	public boolean isTheSameObjects(Path path) {
+		if (tree != path.getTree()) {
+			return false;
+		}
+		if (size() != path.size()) {
+			return false;
+		}
+		if (!getTextual().equals(path.getTextual())) {
+			return false;
+		}
+		Iterator<Node> a = nodes.iterator();
+		Iterator<Node> b = path.getNodes().iterator();
+		while (a.hasNext()) {
+			assert b.hasNext();
+			if (a.next() != b.next()) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public static final Pattern pathPattern = Pattern.compile("(\\/)|((\\/[^/]+)+)");
+
+	public static boolean isValidString(String path) {
+		return pathPattern.matcher(path).matches();
+	}
+
+	public static String appendString(String path, String element) {
+		if (path.equals("/")) {
+			return path + element;
+		}
+		return path + "/" + element;
+	}
+
+	public static Pair<String, String> removeLastElement(String path) {
+		assert isValidString(path);
+		if (path.equals("/")) {
+			throw new FramsticksException().msg("cannot remove last element from root path");
+		}
+		int index = path.lastIndexOf('/');
+		assert index != -1;
+		if (index == 0) {
+			return new Pair<String, String>("/", path.substring(1));
+		}
+		return new Pair<String, String>(path.substring(0, index), path.substring(index + 1));
+	}
+
+	public static String validateString(String path) {
+		if (!isValidString(path)) {
+			throw new FramsticksException().msg("path string validation failured").arg("path", path);
+		}
+		return path;
+	}
+
+	@Override
+	public Param getParam(int i) {
+		return TreeOperations.getFramsClass(this).getParam(i);
+	}
+
+	@Override
+	public Param getParam(String id) {
+		return TreeOperations.getFramsClass(this).getParam(id);
+	}
+
+	@Override
+	public int getParamCount() {
+		return TreeOperations.getFramsClass(this).getParamCount();
+	}
+
+	@Override
+	public Iterable<Param> getParams() {
+		return TreeOperations.getFramsClass(this).getParams();
+	}
+	// public boolean isEmpty() {
+	//	return nodes.isEmpty();
+	// }
+
+}
+
Index: java/main/src/main/java/com/framsticks/structure/SideNoteKey.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/SideNoteKey.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/SideNoteKey.java	(revision 105)
@@ -0,0 +1,28 @@
+package com.framsticks.structure;
+
+import com.framsticks.util.FramsticksException;
+
+public class SideNoteKey<T> {
+
+	protected final Class<T> type;
+
+	/**
+	 * @param type
+	 */
+	public SideNoteKey(Class<T> type) {
+		this.type = type;
+	}
+
+	public static <T2> SideNoteKey<T2> make(Class<T2> type) {
+		return new SideNoteKey<T2>(type);
+	}
+
+	public T newValue() {
+		try {
+			return type.newInstance();
+		} catch (InstantiationException | IllegalAccessException e) {
+			throw new FramsticksException().msg("failed to create side note value").arg("type", type).cause(e);
+		}
+	}
+
+}
Index: java/main/src/main/java/com/framsticks/structure/Tree.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/Tree.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/Tree.java	(revision 105)
@@ -0,0 +1,77 @@
+package com.framsticks.structure;
+
+import javax.annotation.Nonnull;
+
+import com.framsticks.communication.queries.NeedFileAcceptor;
+import com.framsticks.params.Access;
+import com.framsticks.params.CompositeParam;
+import com.framsticks.params.EventListener;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.PrimitiveParam;
+import com.framsticks.params.Registry;
+import com.framsticks.params.types.EventParam;
+import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.util.ExceptionHandler;
+import com.framsticks.util.dispatching.Dispatcher;
+import com.framsticks.util.dispatching.DispatcherSetable;
+import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Joinable;
+
+public interface Tree extends Dispatcher<Tree>, DispatcherSetable<Tree>, Joinable, ExceptionHandler {
+
+	public @Nonnull Node getAssignedRoot();
+	public void assignRootParam(CompositeParam param);
+	public void assignRootObject(Object object);
+
+	public @Nonnull Access prepareAccess(CompositeParam param);
+	public void takeAllFrom(Registry source);
+
+	public FramsClass getInfoFromCache(String id);
+
+	public void putInfoIntoCache(FramsClass framclass);
+
+	// /**
+	//  *
+	//  * Functions accepts ValueParam, because it is also possible to get number of List elements.
+	//  *
+	//  */
+	// public void get(Path path, ValueParam param, Future<Object> future);
+
+	public void get(Path path, FutureHandler<Path> future);
+
+	public <R> void call(Path path, ProcedureParam param, Object[] arguments, Class<R> resultType, FutureHandler<R> future);
+
+	/**
+	 *
+	 * Functions accepts PrimitiveParam<?>, because it is not possible to set number of List elements.
+	 *
+	 */
+	public void set(Path path, PrimitiveParam<?> param, Object value, FutureHandler<Integer> future);
+
+	public void info(Path path, FutureHandler<FramsClass> future);
+
+	public void setExceptionHandler(ExceptionHandler handler);
+
+	public ExceptionHandler getExceptionHandler();
+
+	// public void setDispatcher(Dispatcher<Tree> dispatcher);
+
+	// public Dispatcher<Tree> getDispatcher();
+
+	public <A> void addListener(Path path, EventParam param, EventListener<A> listener, Class<A> argumentType, FutureHandler<Void> future);
+
+	public void removeListener(Path path, EventParam param, EventListener<?> listener, FutureHandler<Void> future);
+
+	public Registry getRegistry();
+
+	public <T> void putSideNote(Object object, SideNoteKey<T> key, T value);
+
+	public <T> T getSideNote(Object object, SideNoteKey<T> key);
+
+	public boolean removeSideNote(Object object, SideNoteKey<?> key);
+
+	public void addNeedFileAcceptor(int priority, NeedFileAcceptor acceptor);
+
+	public void removeNeedFileAcceptor(NeedFileAcceptor acceptor);
+
+}
Index: java/main/src/main/java/com/framsticks/structure/TreeOperations.java
===================================================================
--- java/main/src/main/java/com/framsticks/structure/TreeOperations.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/structure/TreeOperations.java	(revision 105)
@@ -0,0 +1,386 @@
+package com.framsticks.structure;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+
+import com.framsticks.communication.File;
+import com.framsticks.params.Access;
+import com.framsticks.params.CompositeParam;
+import com.framsticks.params.EventListener;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.ListAccess;
+import com.framsticks.params.Param;
+import com.framsticks.params.ParamBuilder;
+import com.framsticks.params.PrimitiveParam;
+import com.framsticks.params.PropertiesAccess;
+import com.framsticks.params.UniqueListAccess;
+import com.framsticks.params.ParamsUtil;
+import com.framsticks.params.types.EventParam;
+import com.framsticks.params.types.ObjectParam;
+import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.parsers.Loaders;
+import com.framsticks.parsers.MultiParamLoader;
+import com.framsticks.util.FramsticksException;
+import com.framsticks.util.dispatching.Dispatching;
+import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.RunAt;
+
+import static com.framsticks.params.ParamsUtil.getParam;
+
+import static com.framsticks.util.dispatching.Dispatching.*;
+
+public final class TreeOperations {
+
+	private static final Logger log = LogManager.getLogger(TreeOperations.class);
+
+	private TreeOperations() {
+	}
+
+	public static final SideNoteKey<Boolean> FETCHED_MARK = SideNoteKey.make(Boolean.class);
+
+	public static @Nonnull FramsClass processFetchedInfo(Tree tree, File file) {
+		assert tree.isActive();
+		FramsClass framsClass = Loaders.loadFramsClass(file.getContent());
+		log.debug("process fetched info for {}: {}", tree, framsClass);
+		tree.putInfoIntoCache(framsClass);
+		return framsClass;
+	}
+
+	public static Path create(Path path) {
+		assert !path.isResolved();
+
+		Access access = path.getTree().prepareAccess(path.getTop().getParam());
+		Object child = createAccessee(path.getTree(), access);
+		assert child != null;
+		if (path.size() == 1) {
+			path.getTree().assignRootObject(child);
+		} else {
+			Access parentAccess = bindAccess(path.getUnder());
+
+			/** this special case is not very good - maybe hide it in createAccessee? */
+			if (parentAccess instanceof UniqueListAccess) {
+				access.select(child);
+				access.set(((UniqueListAccess) parentAccess).getUidName(), path.getTop().getParam().getId());
+			}
+
+			parentAccess.set(path.getTop().getParam(), child);
+		}
+		path = path.appendResolution(child);
+		return path;
+	}
+
+	public static void processFetchedValues(final Path path, final List<File> files, final Access access, final FutureHandler<Path> future) {
+		assert files.size() == 1;
+		assert path.isTheSame(files.get(0).getPath());
+
+		try {
+			log.debug("process fetched values: {}", path);
+			final Access parsingAccess = new PropertiesAccess(access.getFramsClass());
+			final List<Object> results = MultiParamLoader.loadAll(files.get(0).getContent(), parsingAccess);
+
+			Dispatching.dispatchIfNotActive(path.getTree(), new RunAt<Tree>(future) {
+				@Override
+				protected void runAt() {
+
+					Path result = path.tryResolveIfNeeded();
+
+					if (!result.isResolved()) {
+						result = create(result);
+					}
+
+					if (path.getTop().getParam() instanceof ObjectParam) {
+						assert results.size() == 1;
+						ParamsUtil.takeAllNonNullValues(bindAccess(result), parsingAccess.select(results.get(0)));
+						mark(result.getTree(), result.getTopObject(), FETCHED_MARK, true);
+						future.pass(result);
+						return;
+					}
+
+					final ListAccess listAccess = (ListAccess) access;
+
+					listAccess.select(result.getTopObject());
+					Set<String> oldValuesIds = new HashSet<>();
+					for (Param p : listAccess.getParams()) {
+						oldValuesIds.add(p.getId());
+					}
+
+					Access targetAccess = listAccess.getElementAccess();//.cloneAccess();
+
+					int number = 0;
+					for (Object r : results) {
+
+						parsingAccess.select(r);
+						String id;
+						if (listAccess instanceof UniqueListAccess) {
+							id = parsingAccess.get(((UniqueListAccess) listAccess).getUidName(), String.class);
+						} else {
+							id = Integer.toString(number);
+						}
+						++number;
+
+						Object childTo = listAccess.get(id, Object.class);
+						boolean newOne;
+						if (childTo == null) {
+							childTo = createAccessee(result.getTree(), targetAccess);
+							newOne = true;
+						} else {
+							assert oldValuesIds.contains(id);
+							newOne = false;
+						}
+						oldValuesIds.remove(id);
+
+						targetAccess.select(childTo);
+						ParamsUtil.takeAllNonNullValues(targetAccess, parsingAccess);
+						if (newOne) {
+							listAccess.set(id, childTo);
+						}
+						mark(result.getTree(), childTo, FETCHED_MARK, true);
+
+					}
+					mark(result.getTree(), result.getTopObject(), FETCHED_MARK, true);
+
+					/** It looks tricky for ArrayListAccess but should also work.
+					 *
+					 * They should be sorted.
+					 */
+					for (String id : oldValuesIds) {
+						listAccess.set(id, null);
+					}
+					future.pass(result);
+				}
+			});
+
+		} catch (FramsticksException e) {
+			throw new FramsticksException().msg("exception occurred while loading").cause(e);
+		}
+	}
+
+	public static FramsClass getInfo(Path path) {
+		Tree tree = path.getTree();
+		assert tree.isActive();
+		log.debug("get info for: {}", path);
+		final String name = path.getTop().getParam().getContainedTypeName();
+		return tree.getInfoFromCache(name);
+	}
+
+	public static void findInfo(final Path path, final FutureHandler<FramsClass> future) {
+		log.debug("find info for: {}", path);
+		try {
+			Tree tree = path.getTree();
+			assert tree.isActive();
+			final FramsClass framsClass = getInfo(path);
+			if (framsClass != null) {
+				future.pass(framsClass);
+				return;
+			}
+			tree.info(path, future);
+		} catch (FramsticksException e) {
+			future.handle(e);
+		}
+	}
+
+	public static @Nonnull
+	Access bindAccessFromSideNote(Tree tree, Object object) {
+		CompositeParam param = tree.getSideNote(object, Path.OBJECT_PARAM_KEY);
+		if (param == null) {
+			throw new FramsticksException().msg("failed to bind access from side node").arg("tree", tree).arg("object", object).arg("type", object.getClass());
+		}
+		return tree.prepareAccess(param).select(object);
+	}
+
+	public static @Nonnull
+	Access bindAccess(Tree tree, String path) {
+		log.debug("bind access for textual: {} in {}", path, tree);
+		return bindAccess(Path.to(tree, path));
+	}
+
+	public static @Nonnull
+	Access bindAccess(Node node) {
+		Tree tree = node.getTree();
+		assert tree.isActive();
+		assert node.getObject() != null;
+
+		try {
+			Access access = tree.prepareAccess(node.getParam());
+			tree.putSideNote(node.getObject(), Path.OBJECT_PARAM_KEY, node.getParam());
+
+			return access.select(node.getObject());
+		} catch (FramsticksException e) {
+			throw new FramsticksException().msg("failed to prepare access for param").arg("param", node.getParam()).cause(e);
+			// log.error("failed to bind access for {}: ", node.getParam(), e);
+		}
+	}
+
+	public static @Nonnull
+	Access bindAccess(Path path) {
+		assert path.getTree().isActive();
+		path.assureResolved();
+		log.debug("bind access for: {}", path);
+		return bindAccess(path.getTop());
+	}
+
+	public static void set(final Path path, final PrimitiveParam<?> param, final Object value, final FutureHandler<Integer> future) {
+		final Tree tree = path.getTree();
+
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				tree.set(path, param, value, future);
+			}
+		});
+	}
+
+	public static <R> void call(final Path path, final String procedureName, final Object[] arguments, final Class<R> resultType, final FutureHandler<R> future) {
+		final Tree tree = path.getTree();
+
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				path.assureResolved();
+				tree.call(path, getParam(path, procedureName, ProcedureParam.class), arguments, resultType, future);
+			}
+		});
+	}
+
+	public static <R> void call(final Path path, final ProcedureParam param, final Object[] arguments, final Class<R> resultType, final FutureHandler<R> future) {
+		final Tree tree = path.getTree();
+
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				tree.call(path, param, arguments, resultType, future);
+			}
+		});
+	}
+
+	public static <A> void addListener(final Path path, final EventParam param, final EventListener<A> listener, final Class<A> argument, final FutureHandler<Void> future) {
+		final Tree tree = path.getTree();
+
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				tree.addListener(path, param, listener, argument, future);
+			}
+		});
+	}
+
+	public static void removeListener(final Path path, final EventParam param, final EventListener<?> listener, final FutureHandler<Void> future) {
+		final Tree tree = path.getTree();
+
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				tree.removeListener(path, param, listener, future);
+			}
+		});
+	}
+
+	/**
+	 *
+	 * If StackOverflow occurs in that loop in LocalTree it is probably caused
+	 * the by the fact, that get operation may find the object, but Path resolution
+	 * cannot.
+	 * */
+	public static void tryGet(final Tree tree, final String targetPath, final FutureHandler<Path> future) {
+		log.debug("resolve textual: {} for {}", targetPath, tree);
+		dispatchIfNotActive(tree, new RunAt<Tree>(future) {
+
+			@Override
+			protected void runAt() {
+				final Path path = Path.tryTo(tree, targetPath).tryResolveIfNeeded();
+				log.debug("found: {}", path);
+				if (path.isResolved()) {
+					future.pass(path);
+					return;
+				}
+
+				tree.get(path, new Future<Path>(future) {
+					@Override
+					protected void result(Path result) {
+						// if (result.isResolved(targetPath)) {
+						//	future.pass(result);
+						//	return;
+						// }
+						log.debug("retrying resolve textual: {} for {} with {}", targetPath, tree, result);
+						tryGet(tree, targetPath, future);
+					}
+				});
+			}
+		});
+	}
+
+	public static FramsClass getInfoFromCache(Path path) {
+		assert path.getTree().isActive();
+		return path.getTree().getInfoFromCache(path.getTop().getParam().getContainedTypeName());
+	}
+
+	public static Object createAccessee(Tree tree, CompositeParam param) {
+		Object object = tree.prepareAccess(param).createAccessee();
+		tree.putSideNote(object, Path.OBJECT_PARAM_KEY, param);
+		return object;
+	}
+
+	public static Object createAccessee(Tree tree, Access access) {
+		Object object = access.createAccessee();
+		tree.putSideNote(object, Path.OBJECT_PARAM_KEY, access.buildParam(new ParamBuilder()).finish(CompositeParam.class));
+		return object;
+	}
+
+	public static boolean isMarked(Tree tree, Object object, SideNoteKey<Boolean> mark, boolean defValue) {
+		assert tree.isActive();
+		Boolean v = tree.getSideNote(object, mark);
+		return (v != null ? v : defValue);
+	}
+
+	public static void mark(Tree tree, Object object, SideNoteKey<Boolean> mark, boolean value) {
+		assert tree.isActive();
+		tree.putSideNote(object, mark, value);
+	}
+
+	public static FramsClass getFramsClass(Path path) {
+		return path.getTree().getRegistry().getFramsClass(path.getTop().getParam());
+	}
+
+	// public static <T extends Param> T getParam(Path path, String id, Class<T> type) {
+	// 	return getFramsClass(path).getParamEntry(id, type);
+	// }
+
+	public static <T> T getOrCreateSideNote(Tree tree, Object object, SideNoteKey<T> key) {
+		T result = tree.getSideNote(object, key);
+		if (result == null) {
+			result = key.newValue();
+			tree.putSideNote(object, key, result);
+		}
+		return result;
+	}
+
+	public static <T> boolean hasSideNotes(Tree tree, Object object, SideNoteKey<T> key) {
+		return tree.getSideNote(object, key) != null;
+	}
+
+	public static <T> boolean hasSideNote(Path path, SideNoteKey<T> key) {
+		return path.getTree().getSideNote(path.getTopObject(), key) != null;
+	}
+
+	public static <T> T getSideNote(Path path, SideNoteKey<T> key) {
+		assert path.isResolved();
+		return path.getTree().getSideNote(path.getTopObject(), key);
+	}
+
+	public static <T> void putSideNote(Path path, SideNoteKey<T> key, T value) {
+		path.getTree().putSideNote(path.getTopObject(), key, value);
+	}
+
+	public static boolean removeSideNote(Path path, SideNoteKey<?> key) {
+		assert path.isResolved();
+		return path.getTree().removeSideNote(path.getTopObject(), key);
+	}
+
+}
Index: java/main/src/main/java/com/framsticks/test/PrimeExperiment.java
===================================================================
--- java/main/src/main/java/com/framsticks/test/PrimeExperiment.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/test/PrimeExperiment.java	(revision 105)
@@ -8,5 +8,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ValueChange;
 import com.framsticks.experiment.Experiment;
 import com.framsticks.experiment.WorkPackageLogic;
@@ -15,8 +14,10 @@
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.structure.messages.ValueChange;
 import com.framsticks.test.prime.ExpParams;
 import com.framsticks.test.prime.PrimePackage;
 import com.framsticks.util.FramsticksException;
-import com.framsticks.util.dispatching.Future;
+import com.framsticks.util.dispatching.FutureHandler;
 
 @FramsClassAnnotation
@@ -33,5 +34,5 @@
 	protected int nextWaitNumber = 1;
 	protected List<PrimePackage> waitingPackages = new LinkedList<>();
-	protected List<Integer> primes = new LinkedList<>();
+	// protected List<Integer> primes = new LinkedList<>();
 
 	protected final EventListeners<ValueChange> primesListeners = new EventListeners<>();
@@ -50,5 +51,5 @@
 
 			@Override
-			protected void generateNextPackage(Future<PrimePackage> future) {
+			protected void generateNextPackage(FutureHandler<PrimePackage> future) {
 				assert isActive();
 				if (task.state.current_number > task.params.to_number) {
@@ -84,8 +85,12 @@
 					return;
 				}
-				log.info("experiment is done, {} primes found", primes.size());
-				log.debug("primes: {}", primes);
+				log.info("experiment is done, {} primes found", getPrimes().size());
+				log.debug("primes: {}", getPrimes());
 			}
 		};
+	}
+
+	public List<Integer> getPrimes() {
+		return task.state.getResultList();
 	}
 
@@ -98,5 +103,5 @@
 		}
 
-		primes.addAll(result.state.getResultList());
+		getPrimes().addAll(result.state.getResultList());
 		nextWaitNumber = result.params.to_number + 1;
 
@@ -141,5 +146,5 @@
 	@ParamAnnotation
 	public String getDescription() {
-		return primes.size() + " found in range " + new ExpParams(task.params.from_number, nextWaitNumber - 1);
+		return getPrimes().size() + " found in range " + new ExpParams(task.params.from_number, nextWaitNumber - 1);
 	}
 
@@ -154,3 +159,8 @@
 	}
 
+	@ParamAnnotation(paramType = ProcedureParam.class)
+	public PrimePackage experimentNetsave() {
+		return task;
+	}
+
 }
Index: java/main/src/main/java/com/framsticks/test/TestClass.java
===================================================================
--- java/main/src/main/java/com/framsticks/test/TestClass.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/test/TestClass.java	(revision 105)
@@ -6,6 +6,4 @@
 import org.apache.logging.log4j.LogManager;
 
-import com.framsticks.core.ListChange;
-import com.framsticks.core.ValueChange;
 import com.framsticks.params.EventListener;
 import com.framsticks.params.SimplePrimitive;
@@ -15,4 +13,6 @@
 import com.framsticks.params.annotations.ParamAnnotation;
 import com.framsticks.params.types.ProcedureParam;
+import com.framsticks.structure.messages.ListChange;
+import com.framsticks.structure.messages.ValueChange;
 
 @FramsClassAnnotation(
@@ -135,3 +135,4 @@
 	}
 
+
 }
Index: java/main/src/main/java/com/framsticks/test/TestSerializedClass.java
===================================================================
--- java/main/src/main/java/com/framsticks/test/TestSerializedClass.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/test/TestSerializedClass.java	(revision 105)
@@ -0,0 +1,26 @@
+package com.framsticks.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.framsticks.params.annotations.FramsClassAnnotation;
+import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.params.types.UniversalParam;
+
+@FramsClassAnnotation(order = {"theArray"})
+public class TestSerializedClass {
+
+	protected List<Object> theArray = new ArrayList<>();
+
+	@ParamAnnotation(paramType = UniversalParam.class)
+	public List<Object> getTheArray() {
+		return theArray;
+	}
+
+	@ParamAnnotation(paramType = UniversalParam.class)
+	public void setTheArray(List<Object> theArray) {
+		this.theArray = theArray;
+	}
+
+		// assertThat(framsClass.getParam("theArray")).isInstanceOf(UniversalParam.class);
+}
Index: java/main/src/main/java/com/framsticks/test/prime/ExpState.java
===================================================================
--- java/main/src/main/java/com/framsticks/test/prime/ExpState.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/test/prime/ExpState.java	(revision 105)
@@ -4,5 +4,5 @@
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import com.framsticks.params.annotations.FramsClassAnnotation;
Index: java/main/src/main/java/com/framsticks/util/ExceptionHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/ExceptionHandler.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/util/ExceptionHandler.java	(revision 105)
@@ -0,0 +1,6 @@
+package com.framsticks.util;
+
+
+public interface ExceptionHandler {
+	public void handle(FramsticksException exception);
+}
Index: java/main/src/main/java/com/framsticks/util/FramsticksException.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/FramsticksException.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/FramsticksException.java	(revision 105)
@@ -4,5 +4,4 @@
 import java.util.List;
 
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 import com.framsticks.util.lang.Delimeted;
 import com.framsticks.util.lang.Pair;
@@ -77,6 +76,6 @@
 
 
-	public static ExceptionResultHandler addArgumentHandler(final ExceptionResultHandler innerHandler, final String header, final Object argument) {
-		return new ExceptionResultHandler() {
+	public static ExceptionHandler addArgumentHandler(final ExceptionHandler innerHandler, final String header, final Object argument) {
+		return new ExceptionHandler() {
 			@Override
 			public void handle(FramsticksException exception) {
Index: java/main/src/main/java/com/framsticks/util/Logging.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/Logging.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/Logging.java	(revision 105)
@@ -3,5 +3,4 @@
 import org.apache.logging.log4j.Logger;
 
-import com.framsticks.util.dispatching.ExceptionResultHandler;
 
 /**
@@ -20,6 +19,6 @@
 	}
 
-	public static ExceptionResultHandler logger(final Logger logger, final String action, final Object subject) {
-		return new ExceptionResultHandler() {
+	public static ExceptionHandler logger(final Logger logger, final String action, final Object subject) {
+		return new ExceptionHandler() {
 			@Override
 			public void handle(FramsticksException e) {
Index: java/main/src/main/java/com/framsticks/util/dispatching/BufferedDispatcher.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/BufferedDispatcher.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/BufferedDispatcher.java	(revision 105)
@@ -92,6 +92,8 @@
 
 	public void createThreadIfNeeded() {
-		if (targetDispatcher != null) {
-			return;
+		synchronized (this) {
+			if (targetDispatcher != null) {
+				return;
+			}
 		}
 		this.setTargetDispatcher(new Thread<C>().setName(parent.getName()));
@@ -104,10 +106,10 @@
 
 	@Override
-	protected void joinableStart() {
+	protected synchronized void joinableStart() {
 		Dispatching.use(targetDispatcher, this);
 	}
 
 	@Override
-	protected void joinableInterrupt() {
+	protected synchronized void joinableInterrupt() {
 		Dispatching.drop(targetDispatcher, this);
 
@@ -121,5 +123,5 @@
 
 	@Override
-	protected void joinableJoin() throws InterruptedException {
+	protected synchronized void joinableJoin() throws InterruptedException {
 		Dispatching.join(targetDispatcher);
 	}
Index: java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java	(revision 105)
@@ -7,4 +7,5 @@
 import org.apache.logging.log4j.LogManager;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 import com.framsticks.util.Misc;
@@ -141,15 +142,15 @@
 	}
 
-	public interface Query<T> extends ExceptionResultHandler {
+	public interface Query<T> extends ExceptionHandler {
 		T get();
 	}
 
 	public static abstract class QueryHandler<T> implements Query<T> {
-		ExceptionResultHandler handler;
+		ExceptionHandler handler;
 
 		/**
 		 * @param handler
 		 */
-		public QueryHandler(ExceptionResultHandler handler) {
+		public QueryHandler(ExceptionHandler handler) {
 			this.handler = handler;
 		}
@@ -244,10 +245,10 @@
 
 		protected final double timeOut;
-		protected final ExceptionResultHandler handler;
+		protected final ExceptionHandler handler;
 
 		/**
 		 * @param timeOut
 		 */
-		public Waiter(double timeOut, ExceptionResultHandler handler) {
+		public Waiter(double timeOut, ExceptionHandler handler) {
 			this.timeOut = timeOut;
 			this.handler = handler;
@@ -273,6 +274,6 @@
 		}
 
-		public <T> Future<T> passInFuture(Class<T> type) {
-			return new FutureHandler<T>(handler) {
+		public <T> FutureHandler<T> passInFuture(Class<T> type) {
+			return new Future<T>(handler) {
 				@Override
 				protected void result(T result) {
Index: java/main/src/main/java/com/framsticks/util/dispatching/DispatchingExceptionHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/DispatchingExceptionHandler.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/DispatchingExceptionHandler.java	(revision 105)
@@ -1,10 +1,11 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-public class DispatchingExceptionHandler implements ExceptionResultHandler {
+public class DispatchingExceptionHandler implements ExceptionHandler {
 
 	protected final Dispatcher<?> dispatcher;
-	protected final ExceptionResultHandler handler;
+	protected final ExceptionHandler handler;
 
 	/**
@@ -12,5 +13,5 @@
 	 * @param handler
 	 */
-	public DispatchingExceptionHandler(Dispatcher<?> dispatcher, ExceptionResultHandler handler) {
+	public DispatchingExceptionHandler(Dispatcher<?> dispatcher, ExceptionHandler handler) {
 		this.dispatcher = dispatcher;
 		this.handler = handler;
Index: java/main/src/main/java/com/framsticks/util/dispatching/DispatchingFuture.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/DispatchingFuture.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/DispatchingFuture.java	(revision 105)
@@ -3,8 +3,8 @@
 import com.framsticks.util.FramsticksException;
 
-public class DispatchingFuture<C, T> extends Future<T> {
+public class DispatchingFuture<C, T> extends FutureHandler<T> {
 
 	protected final Dispatcher<? super C> dispatcher;
-	protected final Future<T> future;
+	protected final FutureHandler<T> future;
 
 	/**
@@ -12,5 +12,5 @@
 	 * @param future
 	 */
-	public DispatchingFuture(Dispatcher<? super C> dispatcher, Future<T> future) {
+	public DispatchingFuture(Dispatcher<? super C> dispatcher, FutureHandler<T> future) {
 		this.dispatcher = dispatcher;
 		this.future = future;
@@ -37,5 +37,5 @@
 	}
 
-	public static <Ca, Ta> Future<Ta> create(Dispatcher<Ca> dispatcher, Future<Ta> future) {
+	public static <Ca, Ta> FutureHandler<Ta> create(Dispatcher<Ca> dispatcher, FutureHandler<Ta> future) {
 		return new DispatchingFuture<Ca, Ta>(dispatcher, future);
 	}
Index: java/main/src/main/java/com/framsticks/util/dispatching/ExceptionDispatcherHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/ExceptionDispatcherHandler.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/util/dispatching/ExceptionDispatcherHandler.java	(revision 105)
@@ -0,0 +1,6 @@
+package com.framsticks.util.dispatching;
+
+public interface ExceptionDispatcherHandler {
+	public boolean handle(Dispatcher<?> dispatcher, Throwable throwable);
+
+}
Index: java/main/src/main/java/com/framsticks/util/dispatching/ExceptionHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/ExceptionHandler.java	(revision 103)
+++ 	(revision )
@@ -1,6 +1,0 @@
-package com.framsticks.util.dispatching;
-
-public interface ExceptionHandler {
-	public boolean handle(Dispatcher<?> dispatcher, Throwable throwable);
-
-}
Index: java/main/src/main/java/com/framsticks/util/dispatching/ExceptionResultHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/ExceptionResultHandler.java	(revision 103)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.framsticks.util.dispatching;
-
-import com.framsticks.util.FramsticksException;
-
-public interface ExceptionResultHandler {
-	public void handle(FramsticksException exception);
-}
Index: java/main/src/main/java/com/framsticks/util/dispatching/Future.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/Future.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/Future.java	(revision 105)
@@ -1,21 +1,30 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-/**
- * @author Piotr Sniegowski
- */
-public abstract class Future<T> implements ExceptionResultHandler {
+public abstract class Future<T> extends FutureHandler<T> {
 
-	protected abstract void result(T result);
+	protected final ExceptionHandler handler;
 
-	public final void pass(T result) {
-		try {
-			result(result);
-		} catch (FramsticksException e) {
-			handle(e);
-		}
+	public Future(ExceptionHandler handler) {
+		assert handler != null;
+		this.handler = handler;
 	}
 
+	@Override
+	public final void handle(FramsticksException exception) {
+		handler.handle(exception);
+	}
+
+	public static <T> Future<T> doNothing(Class<T> type, ExceptionHandler handler) {
+		return new Future<T>(handler) {
+
+			@Override
+			protected void result(T result) {
+
+			}
+		};
+	}
 
 }
Index: java/main/src/main/java/com/framsticks/util/dispatching/FutureHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/FutureHandler.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/FutureHandler.java	(revision 105)
@@ -1,29 +1,20 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-public abstract class FutureHandler<T> extends Future<T> {
+/**
+ * @author Piotr Sniegowski
+ */
+public abstract class FutureHandler<T> implements ExceptionHandler {
 
-	protected final ExceptionResultHandler handler;
+	protected abstract void result(T result);
 
-	public FutureHandler(ExceptionResultHandler handler) {
-		assert handler != null;
-		this.handler = handler;
+	public final void pass(T result) {
+		try {
+			result(result);
+		} catch (FramsticksException e) {
+			handle(e);
+		}
 	}
-
-	@Override
-	public final void handle(FramsticksException exception) {
-		handler.handle(exception);
-	}
-
-	public static <T> FutureHandler<T> doNothing(Class<T> type, ExceptionResultHandler handler) {
-		return new FutureHandler<T>(handler) {
-
-			@Override
-			protected void result(T result) {
-
-			}
-		};
-	}
-
 }
Index: java/main/src/main/java/com/framsticks/util/dispatching/IgnoreExceptionHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/IgnoreExceptionHandler.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/IgnoreExceptionHandler.java	(revision 105)
@@ -1,7 +1,8 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-public class IgnoreExceptionHandler implements ExceptionResultHandler {
+public class IgnoreExceptionHandler implements ExceptionHandler {
 
 	private static final IgnoreExceptionHandler instance = new IgnoreExceptionHandler();
Index: java/main/src/main/java/com/framsticks/util/dispatching/Monitor.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/Monitor.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/Monitor.java	(revision 105)
@@ -104,10 +104,10 @@
 	}
 
-	protected ExceptionHandler taskExceptionHandler;
+	protected ExceptionDispatcherHandler taskExceptionHandler;
 
 	/**
 	 * @return the taskExceptionHandler
 	 */
-	public ExceptionHandler getTaskExceptionHandler() {
+	public ExceptionDispatcherHandler getTaskExceptionHandler() {
 		return taskExceptionHandler;
 	}
@@ -116,5 +116,5 @@
 	 * @param taskExceptionHandler the taskExceptionHandler to set
 	 */
-	public void setTaskExceptionHandler(ExceptionHandler taskExceptionHandler) {
+	public void setTaskExceptionHandler(ExceptionDispatcherHandler taskExceptionHandler) {
 		this.taskExceptionHandler = taskExceptionHandler;
 	}
Index: java/main/src/main/java/com/framsticks/util/dispatching/RunAt.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/RunAt.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/RunAt.java	(revision 105)
@@ -1,11 +1,12 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-public abstract class RunAt<C> implements ExceptionResultHandler, Runnable {
+public abstract class RunAt<C> implements ExceptionHandler, Runnable {
 
-	protected final ExceptionResultHandler handler;
+	protected final ExceptionHandler handler;
 
-	public RunAt(ExceptionResultHandler handler) {
+	public RunAt(ExceptionHandler handler) {
 		assert handler != null;
 		this.handler = handler;
Index: java/main/src/main/java/com/framsticks/util/dispatching/Thread.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/Thread.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/Thread.java	(revision 105)
@@ -46,5 +46,4 @@
 		log.debug("starting thread {}", this);
 		assert getMonitor() != null;
-		ExceptionHandler exceptionHandler = getMonitor().getTaskExceptionHandler();
 		while (!java.lang.Thread.interrupted()) {
 			RunAt<? extends C> runnable;
@@ -64,4 +63,5 @@
 					runnable.run();
 				} catch (Exception e) {
+					final ExceptionDispatcherHandler exceptionHandler = getMonitor().getTaskExceptionHandler();
 					if (exceptionHandler != null) {
 						if (exceptionHandler.handle(this, e)) {
@@ -122,5 +122,5 @@
 	// @Override
 	// public String toString() {
-	// 	return getName();
+	//	return getName();
 	// }
 
Index: java/main/src/main/java/com/framsticks/util/dispatching/ThrowExceptionHandler.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/ThrowExceptionHandler.java	(revision 103)
+++ java/main/src/main/java/com/framsticks/util/dispatching/ThrowExceptionHandler.java	(revision 105)
@@ -1,7 +1,8 @@
 package com.framsticks.util.dispatching;
 
+import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
 
-public class ThrowExceptionHandler implements ExceptionResultHandler {
+public class ThrowExceptionHandler implements ExceptionHandler {
 
 	private static final ThrowExceptionHandler instance = new ThrowExceptionHandler();
Index: java/main/src/main/resources/bash-gui-runner.xml
===================================================================
--- java/main/src/main/resources/bash-gui-runner.xml	(revision 103)
+++ java/main/src/main/resources/bash-gui-runner.xml	(revision 105)
@@ -2,5 +2,5 @@
 <Framsticks>
 	<import class="com.framsticks.gui.Browser" />
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<import class="com.framsticks.running.LoggingOutputListener" />
 	<import class="com.framsticks.running.FramsServer" />
Index: java/main/src/main/resources/framsticks.xml
===================================================================
--- java/main/src/main/resources/framsticks.xml	(revision 103)
+++ java/main/src/main/resources/framsticks.xml	(revision 105)
@@ -6,5 +6,5 @@
 	<import class="com.framsticks.model.ModelBuilder" />
 	<import class="com.framsticks.model.f0.SchemaBuilder" />
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<import class="com.framsticks.hosting.Server" />
 	<import class="com.framsticks.test.TestClass" />
Index: java/main/src/main/resources/prime.xml
===================================================================
--- java/main/src/main/resources/prime.xml	(revision 103)
+++ java/main/src/main/resources/prime.xml	(revision 105)
@@ -3,10 +3,9 @@
 	<import class="com.framsticks.hosting.Server" />
 	<import class="com.framsticks.test.PrimeExperiment" />
-	<!-- <import class="com.framsticks.experiment.Simulator" /> -->
 	<import class="com.framsticks.experiment.SimulatorConnector" />
-	<import class="com.framsticks.core.LocalTree" />
+	<import class="com.framsticks.structure.LocalTree" />
 	<Server port="9007">
 		<LocalTree name="prime-local-tree">
-			<PrimeExperiment maxNumber="30000">
+			<PrimeExperiment maxNumber="3000">
 				<SimulatorConnector address="localhost:9100" />
 				<SimulatorConnector address="localhost:9101" />
@@ -16,3 +15,2 @@
 	</Server>
 </Framsticks>
-
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
+
