Index: java/main/src/main/java/com/framsticks/gui/Browser.java
===================================================================
--- java/main/src/main/java/com/framsticks/gui/Browser.java	(revision 96)
+++ java/main/src/main/java/com/framsticks/gui/Browser.java	(revision 97)
@@ -2,11 +2,17 @@
 
 import com.framsticks.core.*;
+import com.framsticks.gui.console.Console;
+import com.framsticks.gui.console.TrackConsole;
 import com.framsticks.params.annotations.AutoAppendAnnotation;
 import com.framsticks.params.annotations.FramsClassAnnotation;
 import com.framsticks.params.annotations.ParamAnnotation;
+import com.framsticks.remote.RemoteTree;
+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;
@@ -19,5 +25,9 @@
 
 import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import com.framsticks.util.dispatching.RunAt;
@@ -27,13 +37,16 @@
  */
 @FramsClassAnnotation
-public class Browser extends AbstractJoinable implements Dispatcher<Browser>, JoinableParent {
-
-	private static final Logger log = Logger.getLogger(Browser.class.getName());
-
-	protected JoinableCollection<Frame> frames = new JoinableCollection<Frame>().setObservableName("frames");
-	protected JoinableCollection<Instance> instances = new JoinableCollection<Instance>().setObservableName("instances");
-
-	protected MainFrame mainFrame;
-	public List<PanelProvider> panelProviders = new ArrayList<PanelProvider>();
+public class Browser extends AbstractJoinable implements Dispatcher<Browser>, JoinableParent, ExceptionResultHandler {
+
+	private static final Logger log = Logger.getLogger(Browser.class);
+
+	protected final JoinableCollection<Frame> frames = new JoinableCollection<Frame>().setObservableName("frames");
+	protected final JoinableCollection<Tree> trees = new JoinableCollection<Tree>().setObservableName("trees");
+	protected final JoinableCollection<Console> consoles = new JoinableCollection<Console>().setObservableName("consoles");
+
+	protected final List<PopupMenuEntryProvider> popupMenuEntryProviders = new LinkedList<>();
+
+	protected final MainFrame mainFrame;
+	protected final List<PanelProvider> panelProviders = new ArrayList<PanelProvider>();
 	protected Dimension defaultFrameDimension;
 
@@ -51,4 +64,44 @@
 		mainFrame = new MainFrame(Browser.this);
 		addFrame(mainFrame);
+
+		addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
+			@Override
+			public void provide(JPopupMenu menu, Path path) {
+				menu.add(new JMenuItem(path.getFullTextual()));
+				menu.addSeparator();
+			}
+		});
+
+		addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
+			@SuppressWarnings("serial")
+			@Override
+			public void provide(JPopupMenu menu, final Path path) {
+				menu.add(new AbstractAction("Copy path to clipboard") {
+					@Override
+					public void actionPerformed(ActionEvent e) {
+						Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(path.getFullTextual()), null);
+					}
+				});
+			}
+		});
+
+		addPopupMenuEntryProvider(new PopupMenuEntryProvider() {
+			@SuppressWarnings("serial")
+			@Override
+			public void provide(JPopupMenu menu, final Path path) {
+				if (!(path.getTree() instanceof RemoteTree)) {
+					return;
+				}
+				final RemoteTree remoteTree = (RemoteTree) path.getTree();
+				menu.add(new AbstractAction("Open tracking console") {
+					@Override
+					public void actionPerformed(ActionEvent e) {
+						consoles.add(new TrackConsole().setConnection(remoteTree.getConnection()));
+					}
+				});
+			}
+		});
+		// addNodeActionToTreePopupMenu("", new NodeAction() )
+
 	}
 
@@ -60,21 +113,26 @@
 
 	@AutoAppendAnnotation
-	public void addInstance(Instance instance) {
-		log.info("adding instance: " + instance);
-		instances.add(instance);
+	public void addPopupMenuEntryProvider(PopupMenuEntryProvider popupMenuEntryProvider) {
+		popupMenuEntryProviders.add(popupMenuEntryProvider);
+	}
+
+	@AutoAppendAnnotation
+	public void addTree(Tree tree) {
+		log.info("adding tree: " + tree);
+		trees.add(tree);
 	}
 
 	public void autoResolvePath(final String path, final Future<Path> future) {
-		final Instance i = instances.get("localhost");
-		i.dispatch(new RunAt<Instance>() {
-			@Override
-			public void run() {
-				InstanceUtils.resolveAndFetch(i, path, new Future<Path>(future) {
+		final Tree i = trees.get("localhost");
+		i.dispatch(new RunAt<Tree>(future) {
+			@Override
+			protected void runAt() {
+				TreeOperations.resolveAndGet(i, path, new FutureHandler<Path>(future) {
 					@Override
 					protected void result(final Path p) {
 						future.pass(p);
-						mainFrame.dispatch(new RunAt<Frame>() {
+						mainFrame.dispatch(new RunAt<Frame>(future) {
 							@Override
-							public void run() {
+							protected void runAt() {
 								mainFrame.goTo(p);
 							}
@@ -93,58 +151,7 @@
 	}
 
-	protected void initializeGUI() {
-		assert isActive();
-		log.debug("executing first task");
-
-		try {
-			boolean found = false;
-			// for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
-			//	log.info("look and feel available: " + info.getName());
-			//	if ("Nimbus".equals(info.getName())) {
-			//		UIManager.setLookAndFeel(info.getClassName());
-			//		found = true;
-			//		break;
-			//	}
-			// }
-			if (!found) {
-				UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
-			}
-		} catch (Exception ex) {
-			log.warn("failed loading Look&Feel: ", ex);
-		}
-
-		javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
-
-
-		for (Frame f : frames) {
-			f.configure();
-		}
-
-		for (final Instance i : instances) {
-			i.dispatch(new RunAt<Instance>() {
-				@Override
-				public void run() {
-					final Path p = Path.to(i, "/");
-					dispatch(new RunAt<Browser>() {
-						@Override
-						public void run() {
-							mainFrame.addRootPath(p);
-						}
-					});
-				}
-			});
-		}
-
-		for (Frame f : frames) {
-			f.getSwing().setVisible(true);
-		}
-
-		// autoResolvePath("/simulator/genepools/groups/0", null);
-		// autoResolvePath("/", null);
-	}
-
 	public void createTreeNodeForChild(final Path path) {
 		assert !isActive();
-		//assert instance.isActive();
+		//assert tree.isActive();
 
 		/*
@@ -174,19 +181,34 @@
 	protected void joinableStart() {
 		Dispatching.use(frames, this);
-		Dispatching.use(instances, this);
-
-		dispatch(new RunAt<Browser>() {
-			@Override
-			public void run() {
-				initializeGUI();
-			}
-		});
-	}
-
-	/**
-	 * @return the instances
-	 */
-	public JoinableCollection<Instance> getInstances() {
-		return instances;
+		Dispatching.use(trees, this);
+		Dispatching.use(consoles, this);
+
+		dispatch(new RunAt<Browser>(this) {
+			@Override
+			protected void runAt() {
+
+				for (final Tree i : trees) {
+					i.dispatch(new RunAt<Tree>(this) {
+						@Override
+						protected void runAt() {
+							final Path p = Path.to(i, "/");
+							dispatch(new RunAt<Browser>(this) {
+								@Override
+								protected void runAt() {
+									mainFrame.addRootPath(p);
+								}
+							});
+						}
+					});
+				}
+			}
+		});
+	}
+
+	/**
+	 * @return the tree
+	 */
+	public JoinableCollection<Tree> getTrees() {
+		return trees;
 	}
 
@@ -227,5 +249,6 @@
 	protected void joinableJoin() throws InterruptedException {
 		Dispatching.join(frames);
-		Dispatching.join(instances);
+		Dispatching.join(trees);
+		Dispatching.join(consoles);
 		// super.join();
 	}
@@ -233,6 +256,7 @@
 	@Override
 	protected void joinableInterrupt() {
+		Dispatching.drop(consoles, this);
 		Dispatching.drop(frames, this);
-		Dispatching.drop(instances, this);
+		Dispatching.drop(trees, this);
 	}
 
@@ -255,8 +279,12 @@
 	}
 
+	@Override
+	public void handle(FramsticksException exception) {
+		mainFrame.handle(exception);
+	}
 
 	// @Override
 	// public boolean isDone() {
-	//	return frames.isDone() && instances.isDone();
+	//	return frames.isDone() && trees.isDone();
 	// }
 }
