Index: java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java
===================================================================
--- java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java	(revision 105)
+++ java/main/src/main/java/com/framsticks/experiment/SimulatorConnector.java	(revision 107)
@@ -7,30 +7,75 @@
 import com.framsticks.communication.Address;
 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.Future;
-import com.framsticks.util.lang.Casting;
-import com.framsticks.util.lang.Strings;
+import com.framsticks.util.dispatching.FutureHandler;
+import com.framsticks.util.dispatching.Joinable;
+import com.framsticks.util.dispatching.JoinableParent;
+import com.framsticks.util.dispatching.JoinableState;
 
 import static com.framsticks.structure.TreeOperations.*;
 
 @FramsClassAnnotation
-public class SimulatorConnector implements AutoAttacher {
+public class SimulatorConnector extends SingleSimulatorProvider implements JoinableParent {
 	private static final Logger log = LogManager.getLogger(SimulatorConnector.class);
 
+	protected Experiment experiment;
+	protected RemoteTree remoteTree;
+	protected Simulator simulator;
+	protected Address address;
+	protected boolean provided = false;
 
-	protected Experiment experiment;
-	protected Address address;
-	protected RemoteTree remoteTree;
+	public boolean hasProvided() {
+		return provided;
+	}
+
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+
+	public Address getAddress() {
+		return address;
+	}
+
+
+	@Override
+	public String getName() {
+		return "simulator connector";
+	}
+
+	@Override
+	protected void joinableStart() {
+
+	}
+
+	@Override
+	protected void joinableInterrupt() {
+		Dispatching.drop(remoteTree, this);
+		finishJoinable();
+	}
+
+	@Override
+	protected void joinableFinish() {
+
+	}
+
+	@Override
+	protected void joinableJoin() throws InterruptedException {
+		Dispatching.join(remoteTree);
+	}
 
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	@Override
-	public void attachTo(Object parent) {
-		experiment = Casting.throwCast(Experiment.class, parent);
+	public void provideSimulator(final SimulatorSpecification specification, final FutureHandler<Simulator> future) {
+		if (hasProvided()) {
+			future.pass(null);
+			return;
+		}
+		provided = true;
+		experiment = specification.getExperiment();
 
 		Misc.throwIfNull(address);
@@ -41,6 +86,6 @@
 		remoteTree.setDispatcher((Dispatcher) experiment.getDispatcher());
 
-
 		experiment.getSimulatorCandidates().add(remoteTree);
+		Dispatching.use(remoteTree, this);
 
 		Dispatching.dispatchLog(remoteTree, log, Level.DEBUG, "first task in remote tree");
@@ -51,27 +96,16 @@
 			protected void result(Path result) {
 				log.debug("resolved simulator path: {}", result);
-				Misc.checkEquals(experiment.getExpdef(), bindAccess(result).get("expdef", String.class), "expdef mismatch in connected simulator", this);
+				Misc.checkEquals(specification.getDefinition(), bindAccess(result).get("expdef", String.class), "expdef mismatch in connected simulator", SimulatorConnector.this);
 
-				Simulator simulator = new Simulator(experiment, remoteTree, result);
-				experiment.addSimulator(simulator);
-				experiment.getSimulatorCandidates().remove(remoteTree);
+				simulator = experiment.createSimulator(remoteTree, result);
+
+				future.pass(simulator);
 			}
 		});
 	}
 
-	@ParamAnnotation
-	public void setAddress(String address) {
-		this.address = new Address(address);
+	@Override
+	public void childChangedState(Joinable joinable, JoinableState state) {
+		log.debug("child {} changed state to {}", joinable, state);
 	}
-
-	@ParamAnnotation
-	public String getAddress() {
-		return Strings.toStringNullProof(address, "");
-	}
-
-	@Override
-	public String toString() {
-		return "simulator connector to: " + Strings.toStringNullProof(address, "<null>");
-	}
-
 }
