Index: java/main/src/test/java/com/framsticks/gui/BrowserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/gui/BrowserTest.java	(revision 84)
+++ java/main/src/test/java/com/framsticks/gui/BrowserTest.java	(revision 84)
@@ -0,0 +1,114 @@
+package com.framsticks.gui;
+
+import javax.swing.JFrame;
+
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.log4j.Logger;
+import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
+import org.fest.swing.edt.GuiActionRunner;
+import org.fest.swing.edt.GuiQuery;
+import org.fest.swing.edt.GuiTask;
+import org.fest.swing.fixture.FrameFixture;
+import org.fest.swing.fixture.JTreeFixture;
+// import static org.fest.swing.edt.GuiActionRunner.*;
+import org.testng.annotations.*;
+
+import com.framsticks.communication.ClientConnection;
+import com.framsticks.remote.RemoteInstance;
+import com.framsticks.test.TestConfiguration;
+
+import static org.fest.assertions.Assertions.*;
+import static org.fest.swing.core.BasicRobot.robotWithNewAwtHierarchy;
+import static org.fest.swing.edt.GuiActionRunner.*;
+import org.fest.swing.core.Robot;
+
+public class BrowserTest extends TestConfiguration {
+	private static final Logger log = Logger.getLogger(BrowserTest.class);
+
+	Browser browser;
+	Robot robot;
+	FrameFixture frame;
+
+	@BeforeClass
+	public void setUp() {
+		FailOnThreadViolationRepaintManager.install();
+		assertThat(executeInEDT()).isTrue();
+
+		robot = robotWithNewAwtHierarchy();
+
+		browser = new Browser();
+		browser.configure(new PropertiesConfiguration());
+
+		RemoteInstance localhost = new RemoteInstance();
+		localhost.setName("localhost");
+		localhost.setConnection(new ClientConnection("localhost:9009"));
+
+		browser.addEndpointForInstance(localhost);
+
+		browser.start();
+		// robot.waitForIdle();
+		frame = new FrameFixture(robot,
+				GuiActionRunner.execute(new GuiQuery<JFrame>() {
+					@Override
+					protected JFrame executeInEDT() throws Throwable {
+						return browser.getMainFrame();
+					}
+				}));
+
+		log.info("frame fixture done");
+		// frame.show();
+		// log.info("frame fixture shown");
+	}
+
+	public void clickAndExpandPath(JTreeFixture tree, String path) {
+		tree.clickPath(path).expandPath(path);
+		robot.waitForIdle();
+	}
+
+	@Test
+	public void testShow() {
+		log.info("testing");
+		JTreeFixture tree = frame.tree("tree");
+		tree.clickRow(0).expandRow(0);
+		robot.waitForIdle();
+		tree.clickRow(1).expandRow(1);
+		robot.waitForIdle();
+		assertThat(tree.valueAt(1)).isEqualTo("simulator");
+		robot.waitForIdle();
+		execute(new GuiTask() {
+			@Override
+			protected void executeInEDT() throws Throwable {
+				assertThat(frame.panel("o Simulator").component().isVisible())
+						.isTrue();
+			}
+		});
+
+		clickAndExpandPath(tree, "localhost/simulator/genepools");
+		clickAndExpandPath(tree, "localhost/simulator/genepools/groups");
+		clickAndExpandPath(tree, "localhost/simulator/genepools/groups/Genotypes");
+		// tree.clickPath("localhost/simulator/genepools/groups/Genotypes/genotypes");
+		// robot.waitForIdle();
+		// sleep(2);
+		// tree.expandPath("localhost/simulator/genepools/groups/Genotypes/genotypes");
+
+		// tree.expandRow(tree.component().getLeadSelectionRow() + 1);
+		// robot.waitForIdle();
+
+		// sleep(2);
+	}
+
+	public void sleep(int seconds) {
+		try {
+			Thread.sleep(seconds * 1000, 0);
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@AfterClass
+	public void tearDown() {
+		// frame.close();
+		frame.cleanUp();
+	}
+
+}
Index: java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java	(revision 79)
+++ java/main/src/test/java/com/framsticks/parsers/F0ParserTest.java	(revision 84)
@@ -1,74 +1,104 @@
 package com.framsticks.parsers;
 
+import org.testng.annotations.*;
 import com.framsticks.model.*;
 import com.framsticks.model.Package;
 import com.framsticks.params.*;
 import com.framsticks.params.types.FloatParam;
-import com.framsticks.util.Point3d;
-import org.apache.log4j.PropertyConfigurator;
-import org.junit.Test;
+import com.framsticks.test.TestConfiguration;
+import com.framsticks.util.math.Point3d;
 
+import java.io.IOException;
+import java.text.ParseException;
 import java.util.List;
-
-import static org.junit.Assert.*;
+import static org.fest.assertions.Assertions.*;
+import static org.fest.assertions.Delta.*;
 
 /**
  * Author: Piotr Śniegowski
  */
-public class F0ParserTest {
+public class F0ParserTest extends TestConfiguration {
+
+	private Schema schema;
+	private List<AccessInterface> accesses;
+	private List<Object> objects;
+	private Model model;
+
+	@BeforeClass
+	public void setUp() throws Exception {
+		schema = new Schema(Schema.getDefaultDefinitionAsStream());
+		Package.register(schema.getRegistry());
+	}
 
 	@Test
-	public void testParser() throws Exception {
-		PropertyConfigurator.configure(getClass().getResource("/log4j.properties"));
-		//testing schema
-		Schema schema = new Schema(Schema.getDefaultDefinitionAsStream());
+	public void primitiveParam() {
+		FramsClass joint = schema.getRegistry().getInfoFromCache("j");
+		PrimitiveParam dx = joint.getParamEntry("dx", PrimitiveParam.class);
+		assertThat(dx).isInstanceOf(FloatParam.class);
+		assertThat(schema.getNeuroClasses().size()).isEqualTo(21);
+		assertThat(dx.getName()).isEqualTo("delta.x");
+		assertThat(dx.getMin(Double.class)).isEqualTo(-2.0, delta(0.0));
+	}
 
-		{
-			FramsClass joint = schema.getRegistry().getInfoFromCache("j");
-			Param dx = joint.getParamEntry("dx");
-			assertEquals(FloatParam.class, dx.getClass());
-			assertEquals(21, schema.getNeuroClasses().size());
-			assertEquals("delta.x", dx.getName());
-			assertEquals(-2.0, dx.getMin(Double.class), 0.0);
-		}
+	@Test
+	public void readF0() throws IOException, ParseException {
+		accesses = new F0Parser(schema, F0ParserTest.class.getResourceAsStream("/parsers/f0_example.txt")).parse();
 
-		Package.register(schema.getRegistry());
-		//testing parser
-		List<AccessInterface> accesses = new F0Parser(schema, F0ParserTest.class.getResourceAsStream("/parsers/f0_example.txt")).parse();
+		assertThat(accesses.size()).isEqualTo(12);
+		assertThat(accesses.get(0).getSelected()).isInstanceOf(Model.class);
+		assertThat(accesses.get(5).get("i", String.class)).isEqualTo("1,2,3,\"dsadsa,,,,");
+		assertThat(accesses.get(7).get("d", String.class)).isEqualTo("|:p=0.25,r=1");
+		assertThat(accesses.get(10).get("d", String.class)).isEqualTo("@:p=0.25");
+	}
 
-		{
-			assertEquals(12, accesses.size());
-			assertTrue(accesses.get(0).getSelected() instanceof Model);
-			assertEquals("1,2,3,\"dsadsa,,,,", accesses.get(5).get("i", String.class));
-			assertEquals("|:p=0.25,r=1", accesses.get(7).get("d", String.class));
-			assertEquals("@:p=0.25", accesses.get(10).get("d", String.class));
-		}
+	@Test(dependsOnMethods = {"readF0"})
+	public void stripAccessInterface() {
+		objects = Util.stripAccessInterface(accesses);
 
-		List<Object> objects = Util.stripAccessInterface(accesses);
-		{
-			assertEquals(Part.class, objects.get(1).getClass());
-			assertEquals(Joint.class, objects.get(4).getClass());
-			assertEquals(NeuroDef.class, objects.get(6).getClass());
-		}
+		assertThat(objects.get(1)).isInstanceOf(Part.class);
+		assertThat(objects.get(4)).isInstanceOf(Joint.class);
+		assertThat(objects.get(6)).isInstanceOf(NeuroDef.class);
+	}
 
-		Model model = Model.build(objects);
-		{
-			assertEquals(3, model.getParts().size());
-			assertEquals(6, model.getNeuroDefs().size());
-			assertEquals(2, model.getJoints().size());
+	@Test(dependsOnMethods = {"stripAccessInterface"})
+	public void buildModel() {
+		model = Model.build(objects);
 
-			assertEquals(new Integer(0), model.getJoints().get(0).part1);
-			assertEquals(new Integer(1), model.getJoints().get(0).part2);
-			assertEquals(new Integer(1), model.getNeuroDefs().get(0).part);
-			assertEquals(new Integer(-1), model.getNeuroDefs().get(0).joint);
-			assertEquals("|:p=0.25,r=1", model.getNeuroDefs().get(1).details);
-			assertEquals("N", model.getNeuroDefs().get(3).details);
-			assertEquals(new Integer(-1), model.getNeuroDefs().get(4).part);
+		assertThat(model.getParts().size()).isEqualTo(3);
+		assertThat(model.getNeuroDefs().size()).isEqualTo(6);
+		assertThat(model.getJoints().size()).isEqualTo(2);
 
-			assertEquals(2.0, model.getParts().get(1).getPosition().x, 0.0);
-			assertTrue(model.getParts().get(2).getPosition().sub(new Point3d(2.27236, -0.0792596, -0.958924)).length() < 0.0001);
-			assertTrue(model.getParts().get(2).getOrientation().y.sub(new Point3d(0.870277, -0.404792, 0.280644)).length() < 0.0001);
-		}
+		assertThat(model.getJoints().get(0).part1).isEqualTo(0);
+		assertThat(model.getJoints().get(0).part2).isEqualTo(1);
+		assertThat(model.getNeuroDefs().get(0).part).isEqualTo(1);
+		assertThat(model.getNeuroDefs().get(0).joint).isEqualTo(-1);
+		assertThat(model.getNeuroDefs().get(1).details).isEqualTo("|:p=0.25,r=1");
+		assertThat(model.getNeuroDefs().get(3).details).isEqualTo("N");
+		assertThat(model.getNeuroDefs().get(4).part).isEqualTo(-1);
 
+		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).getOrientation().y.sub(new Point3d(0.870277, -0.404792, 0.280644)).length()).isLessThan(0.0001);
+	}
+
+	@Test(dependsOnMethods = {"buildModel"})
+	public void print() throws Exception {
+		ListSink sink = new ListSink();
+		new F0Writer(schema, model, sink).write();
+
+		assertThat(sink.getOut()).containsExactly(
+			"p:",
+			"p:2.0,i=,Vstyle=",
+			"p:2.272364001928095,-0.07925961087140347,-0.9589242746631385,i=bla",
+			"j:0,1,dx=2.0",
+			"j:1,2,rx=8.0,5.0,6.0,dx=1.0,i=\"1,2,3,\\\"dsadsa,,,,\"",
+			"n:p=1",
+			"n:j=0,d=\"|:p=0.25,r=1\"",
+			"n:j=0,d=G",
+			"n:p=1",
+			"n:j=0,d=@:p=0.25",
+			"n:p=1,d=Nu",
+			"m:"
+		);
 
 	}
Index: java/main/src/test/java/com/framsticks/test/TestConfiguration.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 84)
+++ java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 84)
@@ -0,0 +1,18 @@
+package com.framsticks.test;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+import org.testng.annotations.*;
+
+public class TestConfiguration {
+
+	private static final Logger log =
+		Logger.getLogger(TestConfiguration.class);
+
+	@BeforeClass
+	public static void setUpConfiguration() {
+		PropertyConfigurator.configure(TestConfiguration.class.getResource("/log4j.properties"));
+		log.info("logging configured");
+	}
+
+}
Index: java/main/src/test/resources/log4j.properties
===================================================================
--- java/main/src/test/resources/log4j.properties	(revision 79)
+++ java/main/src/test/resources/log4j.properties	(revision 84)
@@ -27,2 +27,4 @@
 
 log4j.logger.com.framsticks=INFO
+# log4j.logger.com.framsticks.gui.controls.SliderControl=TRACE
+# log4j.logger.com.framsticks.communication.ClientConnection=DEBUG
