Index: java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java	(revision 102)
+++ java/main/src/test/java/com/framsticks/gui/ProcedureBrowserTest.java	(revision 103)
@@ -10,4 +10,5 @@
 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;
@@ -17,5 +18,4 @@
 import com.framsticks.params.types.StringParam;
 import com.framsticks.parsers.XmlLoader;
-import com.framsticks.test.TestChangeEvent;
 import com.framsticks.test.TestClass;
 import com.framsticks.util.dispatching.FutureHandler;
@@ -82,9 +82,9 @@
 		waitForIdle();
 
-		final EventListener<TestChangeEvent> listener = new EventListener<TestChangeEvent>() {
+		final EventListener<ValueChange> listener = new EventListener<ValueChange>() {
 
 			@Override
-			public void action(TestChangeEvent argument) {
-				assertThat(argument.history).isEqualTo("");
+			public void action(ValueChange argument) {
+				assertThat(argument.value).isEqualTo("");
 			}
 		};
@@ -96,5 +96,5 @@
 				assertThat(access.get("history", String.class)).isEqualTo("initial|Żółw|");
 
-				tree.addListener(Path.to(tree, "/"), access.getFramsClass().getParamEntry("history_changed", EventParam.class), listener, TestChangeEvent.class, FutureHandler.doNothing(Void.class, failOnException));
+				tree.addListener(Path.to(tree, "/"), access.getFramsClass().getParamEntry("history_changed", EventParam.class), listener, ValueChange.class, FutureHandler.doNothing(Void.class, failOnException));
 			}
 		});
Index: java/main/src/test/java/com/framsticks/hosting/ServerTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 102)
+++ java/main/src/test/java/com/framsticks/hosting/ServerTest.java	(revision 103)
@@ -11,9 +11,10 @@
 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.test.TestChangeEvent;
 import com.framsticks.test.TestClass;
 import com.framsticks.core.Tree;
@@ -45,5 +46,5 @@
 	protected LocalTree hosted;
 	protected TestClass hostedObject;
-	protected EventListener<TestChangeEvent> listener;
+	protected EventListener<ValueChange> listener;
 	protected EventListener<ListChange> childListener;
 
@@ -123,9 +124,9 @@
 	public void registerListener() {
 		final Waiter waiter = produceWaiter(1.0);
-		listener = new EventListener<TestChangeEvent>() {
-
-			@Override
-			public void action(TestChangeEvent argument) {
-				listenerArguments.add(argument.history);
+		listener = new EventListener<ValueChange>() {
+
+			@Override
+			public void action(ValueChange argument) {
+				listenerArguments.add(argument.value.toString());
 			}
 		};
@@ -138,5 +139,5 @@
 		});
 
-		addListener(remotePath, remoteTestFramsClass.getParamEntry("history_changed", EventParam.class), listener, TestChangeEvent.class, produceWaiter(1.0).passInFuture(Void.class));
+		addListener(remotePath, remoteTestFramsClass.getParamEntry("history_changed", EventParam.class), listener, ValueChange.class, produceWaiter(1.0).passInFuture(Void.class));
 	}
 
@@ -145,12 +146,14 @@
 		final Waiter waiter = produceWaiter(2.0);
 
-		call(remotePath, remoteTestFramsClass.getParamEntry("resetHistory", ProcedureParam.class), new Object[] {}, produceWaiter(2.0).passInFuture(Object.class));
-
-		call(remotePath, remoteTestFramsClass.getParamEntry("appendHistory", ProcedureParam.class), new Object[] {"next word"}, new FutureHandler<Object>(failOnException) {
-			@Override
-			protected void result(Object result) {
+		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) {
+			@Override
+			protected void result(final Result result) {
 				hosted.dispatch(new RunAt<Tree>(failOnException) {
 					@Override
 					protected void runAt() {
+						// assert
+
 						assertThat(hostedObject.getHistory()).isEqualTo("next word|");
 						waiter.pass();
@@ -186,6 +189,6 @@
 	public void createChild() {
 		final Waiter waiter = produceWaiter(2.0);
-		call(remotePath, "createChild", new Object[] { "a child" }, produceWaiter(2.0).passInFuture(Object.class));
-		call(remotePath, "createChild", new Object[] { "another child" }, produceWaiter(2.0).passInFuture(Object.class));
+		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) {
Index: java/main/src/test/java/com/framsticks/params/AccessOperationsTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/AccessOperationsTest.java	(revision 103)
+++ java/main/src/test/java/com/framsticks/params/AccessOperationsTest.java	(revision 103)
@@ -0,0 +1,79 @@
+package com.framsticks.params;
+
+import static org.fest.assertions.Assertions.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.framsticks.test.TestClass;
+import com.framsticks.test.TestConfiguration;
+import static com.framsticks.params.AccessOperations.*;
+
+@Test
+public class AccessOperationsTest extends TestConfiguration {
+
+	Registry registry;
+
+	TestClass testObject;
+
+	List<String> printResult;
+
+	List<String> printed = Arrays.asList(
+		"TestClass:",
+		"name:just a test",
+		"history:a very, very long history...",
+		"",
+		"TestChild:",
+		"name:first child",
+		"uid:c0",
+		"",
+		"TestChild:",
+		"name:second child",
+		"uid:c1",
+		""
+	);
+
+	@BeforeClass
+	public void setUp() {
+		registry = new Registry();
+		registry.registerAndBuild(TestClass.class);
+
+		testObject = new TestClass();
+		testObject.setName("just a test");
+		testObject.setHistory("a very, very long history...");
+
+		testObject.createChild("first child");
+		testObject.createChild("second child");
+	}
+
+	@Test
+	public void testEquals() {
+		assertThat(areEqual(registry.bindAccessFor(testObject), registry.bindAccessFor(testObject), registry)).isTrue();
+	}
+
+	@Test
+	public void testSaveAll() {
+
+		ListSink sink = new ListSink();
+		saveAll(registry.bindAccessFor(testObject), sink, registry);
+		printResult = sink.getOut();
+
+		assertThat(printResult).isEqualTo(printed);
+	}
+
+	@Test
+	public void testLoadAll() {
+		TestClass testLoad = new TestClass();
+		loadAll(registry.bindAccessFor(testLoad), new ListSource(printed), registry);
+		assertThat(areEqual(registry.bindAccessFor(testLoad), registry.bindAccessFor(testObject), registry)).isTrue();
+
+		ListSink sink = new ListSink();
+		saveAll(registry.bindAccessFor(testLoad), sink, registry);
+
+		assertThat(sink.getOut()).isEqualTo(printed);
+	}
+
+}
Index: java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 102)
+++ java/main/src/test/java/com/framsticks/params/FramsClassBuilderTest.java	(revision 103)
@@ -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.test.TestChangeEvent;
 import com.framsticks.test.TestClass;
 import com.framsticks.test.TestConfiguration;
@@ -69,5 +69,5 @@
 					"id:history_changed",
 					"name:HistoryListener",
-					"type:e TestChangeEvent",
+					"type:e ValueChange",
 					"",
 					"prop:",
@@ -128,9 +128,9 @@
 		final Holder<String> called = new Holder<>();
 
-		final EventListener<TestChangeEvent> listener = new EventListener<TestChangeEvent>() {
+		final EventListener<ValueChange> listener = new EventListener<ValueChange>() {
 
 			@Override
-			public void action(TestChangeEvent argument) {
-				called.set(argument.history);
+			public void action(ValueChange argument) {
+				called.set(argument.value.toString());
 			}
 		};
Index: java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java	(revision 102)
+++ java/main/src/test/java/com/framsticks/params/ParamBuilderTest.java	(revision 103)
@@ -5,4 +5,5 @@
 import com.framsticks.params.types.FloatParam;
 import com.framsticks.params.types.StringParam;
+import com.framsticks.parsers.AccessStash;
 import com.framsticks.parsers.MultiParamLoader;
 import com.framsticks.test.TestConfiguration;
@@ -34,5 +35,5 @@
 		MultiParamLoader loader = new MultiParamLoader();
 		loader.setNewSource(source);
-		loader.addAccess(access);
+		loader.setAccessProvider(new AccessStash().add(access));
 		loader.addBreakCondition(MultiParamLoader.Status.AfterObject);
 
Index: java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java	(revision 102)
+++ java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java	(revision 103)
@@ -1,8 +1,19 @@
 package com.framsticks.test.prime;
 
-// import static org.fest.assertions.Assertions.*;
+import static org.fest.assertions.Assertions.*;
 
+import java.util.Arrays;
+import java.util.List;
+
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.framsticks.params.AccessOperations;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.ListSink;
+import com.framsticks.params.ListSource;
+// import com.framsticks.params.ListSource;
+import com.framsticks.params.Registry;
+import com.framsticks.params.types.ObjectParam;
 import com.framsticks.test.TestConfiguration;
 
@@ -10,16 +21,67 @@
 public class PrimePackageTest extends TestConfiguration {
 
+	Registry registry;
 
+	protected final List<String> printedPrimePackage = Arrays.asList(
+		"ExpParams:",
+		"from_number:100",
+		"to_number:200",
+		"",
+		"ExpState:",
+		"current_number:201",
+		"result:151,157,163,167,173,179,181,191,193,197,199",
+		""
+	);
 
+	@BeforeClass
+	public void setupRegistry() {
+		registry = new Registry();
+		registry.registerAndBuild(PrimePackage.class);
+	}
 
 	@Test
+	public void primePackageFramsClass() {
+		FramsClass framsClass = registry.getFramsClassForJavaClass(PrimePackage.class);
+		assertThat(framsClass).isNotNull();
+		assertThat(framsClass.getParamCount()).isEqualTo(2);
+		assertThat(framsClass.getParam(0)).isInstanceOf(ObjectParam.class);
+		assertThat(framsClass.getParam(1)).isInstanceOf(ObjectParam.class);
+	}
+
+	@Test(dependsOnMethods = "primePackageFramsClass")
 	public void printPrimePackage() {
+		PrimePackage primePackage = new PrimePackage();
+		primePackage.params.from_number = 100;
+		primePackage.params.to_number = 200;
+
+		primePackage.state.current_number = 201;
+		primePackage.state.getResultList().addAll(Arrays.asList(151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199));
+
+		assertThat(primePackage.state.getResult()).isEqualTo("151,157,163,167,173,179,181,191,193,197,199");
+
+		ListSink sink = new ListSink();
+
+		AccessOperations.saveAll(registry.createAccess(PrimePackage.class).select(primePackage), sink, registry);
+
+		assertThat(sink.getOut()).isEqualTo(printedPrimePackage);
 	}
-	// ExpParams:
-	// from_number:100
-	// to_number:200
 
-	// ExpState:
-	// current_number:201
-	// result:151,157,163,167,173,179,181,191,193,197,199
+	@Test(dependsOnMethods = "printPrimePackage")
+	public void loadPrimePackage() {
+
+		// PrimePackage primePackage = new PrimePackage();
+
+		ListSource source = new ListSource(printedPrimePackage);
+
+		Object result = AccessOperations.loadAll(registry.createAccess(PrimePackage.class), source, registry).getSelected();
+		assertThat(result).isInstanceOf(PrimePackage.class);
+		PrimePackage primePackage = (PrimePackage) result;
+
+		assertThat(primePackage.params.from_number).isEqualTo(100);
+		assertThat(primePackage.params.to_number).isEqualTo(200);
+
+		assertThat(primePackage.state.current_number).isEqualTo(201);
+		assertThat(primePackage.state.getResultList()).isEqualTo(Arrays.asList(151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199));
+
+	}
 }
Index: java/main/src/test/resources/log4j2.xml
===================================================================
--- java/main/src/test/resources/log4j2.xml	(revision 102)
+++ java/main/src/test/resources/log4j2.xml	(revision 103)
@@ -8,8 +8,12 @@
 	<loggers>
 		<logger name="com.framsticks" level="info" />
-		<logger name="com.framsticks.running.ExternalProcess" level="debug" />
 		<logger name="com.framsticks.test.TestConfiguration" level="info" />
-		<logger name="com.framsticks.experiment" level="debug" />
-		<logger name="com.framsticks.test.PrimeExperiment" level="debug" />
+
+		<!-- <logger name="com.framsticks.running.ExternalProcess" level="debug" /> -->
+		<!-- <logger name="com.framsticks.experiment" level="debug" /> -->
+		<!-- <logger name="com.framsticks.test.PrimeExperiment" level="debug" /> -->
+		<!-- <logger name="com.framsticks.experiment.NetLoadSaveLogic" level="debug" /> -->
+		<!-- <logger name="com.framsticks.experiment.WorkPackageLogic" level="debug" /> -->
+		<!-- <logger name="com.framsticks.params.AccessOperations" level="debug" /> -->
 		<!-- <logger name="com.framsticks.util.dispatching.AbstractJoinable" level="debug" /> -->
 		<!-- <logger name="com.framsticks.util.dispatching.AbstractJoinable.Report" level="info" /> -->
