diff --git a/MathHubWorker/pom.xml b/MathHubWorker/pom.xml
index 971061e23fad1e03e474b4a98821bd885bf7a88f..e37ff619e9548136a90ba54faef14f7f03346585 100644
--- a/MathHubWorker/pom.xml
+++ b/MathHubWorker/pom.xml
@@ -46,7 +46,7 @@
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-core</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 
 		<dependency>
@@ -68,6 +68,12 @@
 			<version>${sally4.version}</version>
 		</dependency>
 
+		<dependency>
+			<groupId>info.kwarc.sally4</groupId>
+			<artifactId>servlet</artifactId>
+			<version>${sally4.version}</version>
+		</dependency>
+
 	</dependencies>
 
 	<build>
@@ -81,7 +87,7 @@
 					<instructions>
 						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
 						<Private-Package>info.kwarc.sally4.mathhubworker.impl*</Private-Package>
-						<Export-Package>info.kwarc.sally4.mathhubworker*;info.kwarc.sally.comm.mathhubworker*</Export-Package>
+						<Export-Package>info.kwarc.sally4.mathhubworker*;info.kwarc.sally.comm.mathhubworker*;libs*</Export-Package>
 					</instructions>
 				</configuration>
 			</plugin>
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorker.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorker.java
deleted file mode 100644
index cca57cf30b373ea73ac5b304d521fc4801caea11..0000000000000000000000000000000000000000
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorker.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package info.kwarc.sally4.mathhubworker;
-
-
-public interface MathHubWorker {
-}
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorkerManager.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorkerManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..6807809ccc2bd3b6029c546e0dea2577d632dca0
--- /dev/null
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorkerManager.java
@@ -0,0 +1,8 @@
+package info.kwarc.sally4.mathhubworker;
+
+import info.kwarc.sally4.docmanager.AlexRoute;
+
+
+public interface MathHubWorkerManager {
+	void addNewWorker(AlexRoute route);
+}
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/WorkerWorkflow.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/LMHWorkflow.java
similarity index 53%
rename from MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/WorkerWorkflow.java
rename to MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/LMHWorkflow.java
index 2542a9016d55bf04e2ee370e517eb61dd4b62722..c97e6b97c474340874571f5c7fb265bed79293b2 100644
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/WorkerWorkflow.java
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/LMHWorkflow.java
@@ -1,9 +1,14 @@
 package info.kwarc.sally4.mathhubworker.impl;
 
 import info.kwarc.sally4.core.CamelContextProvider;
+import info.kwarc.sally4.core.SallyInteractionResultAcceptor;
+import info.kwarc.sally4.core.SallyService;
+import info.kwarc.sally4.core.SallyServiceProvider;
 import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.IDocWorkflow;
-import info.kwarc.sally4.mathhubworker.routes.WorkerRoute;
+import info.kwarc.sally4.mathhubworker.MathHubWorkerManager;
+import info.kwarc.sally4.mathhubworker.internal.comm.GetLMHWorkers;
+import info.kwarc.sally4.mathhubworker.routes.LMHRoute;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -21,22 +26,38 @@ import org.slf4j.LoggerFactory;
 @Component
 @Instantiate
 @Provides
-public class WorkerWorkflow extends WorkflowCommon implements IDocWorkflow{
+public class LMHWorkflow extends WorkflowCommon implements IDocWorkflow, SallyServiceProvider {
 	@Requires
 	CamelContextProvider camelContextProvider;
 
-	Map<String, CamelContext> routeContexts;
+	@Requires
+	MathHubWorkerManager workerManager;
 
+	Map<String, CamelContext> routeContexts;
+	Map<String, String> routeWorkerIDs;
+	
 	Logger log;
 
-	public WorkerWorkflow() {
+	public LMHWorkflow() {
 		log = LoggerFactory.getLogger(getClass());
 		routeContexts = new HashMap<String, CamelContext>();
+		routeWorkerIDs = new HashMap<String, String>();
 	}
 
+	public void setWorkerKey(String AlexRouteID, String workerID) {
+		routeWorkerIDs.put(AlexRouteID, workerID);
+	}
+	
+	@SallyService
+	public void getLMHWorkers(GetLMHWorkers click, SallyInteractionResultAcceptor acceptor, Exchange context) {
+		for (String s : routeWorkerIDs.values()) {
+			acceptor.acceptResult(s);
+		}
+	}
+	
 	@Override
 	public String[] getInterfaceRequirements() {
-		return new String[]{"mathhubworker"};
+		return new String[]{"lmhworker"};
 	}
 
 	@Override
@@ -45,21 +66,28 @@ public class WorkerWorkflow extends WorkflowCommon implements IDocWorkflow{
 	}
 
 	@Override
-	public boolean handleMessage(String namespace, String type,
+	public boolean handleMessage(AlexRoute route, String namespace, String type,
 			Exchange exchange) {
 		
 		return false;
 	}
 
 	@Override
-	public void startRoutes(CamelContext camelContext, AlexRoute route) {
-		
+	public void startRoutes(CamelContext camelContext, final AlexRoute route) {
+		workerManager.addNewWorker(route);
 		try {
-			camelContext.addRoutes(new WorkerRoute());
-			log.info("MWH available at "+route.getAlexQueue()+ " and state "+route.getAlexStateQueue());
+			camelContext.addRoutes(new LMHRoute(route, this));
 			camelContext.addComponent("mhw", route.getAlexComponent());
 			camelContext.start();
 			camelContext.createProducerTemplate().sendBody("direct:start", "");
+			
+			route.addOnStopHandler(new Runnable() {
+				
+				@Override
+				public void run() {
+					routeWorkerIDs.remove(route.getID());
+				}
+			});
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/PlanetaryClientWorkflow.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/PlanetaryClientWorkflow.java
index 241630d8885701dc703fecb08e7f9d655613fd0e..82ebce787e221a117ae5f86272d5de4a6b802605 100644
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/PlanetaryClientWorkflow.java
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/PlanetaryClientWorkflow.java
@@ -1,13 +1,27 @@
 package info.kwarc.sally4.mathhubworker.impl;
 
+import info.kwarc.sally.comm.planetaryclient.NewService;
 import info.kwarc.sally4.core.CamelContextProvider;
+import info.kwarc.sally4.core.SallyInteraction;
 import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.IDocWorkflow;
-import info.kwarc.sally4.mathhubworker.routes.MathHubRoute;
+import info.kwarc.sally4.marshalling.MarshallUtils;
+import info.kwarc.sally4.mathhubworker.internal.comm.GetLMHWorkers;
+import info.kwarc.sally4.mathhubworker.routes.PlanetaryClientRoute;
 import info.kwarc.sally4.planetary.PlanetaryConnection;
+import info.kwarc.sally4.servlet.SallyServlet;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.xml.ws.RequestWrapper;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.Property;
+import org.apache.camel.RecipientList;
 import org.apache.felix.ipojo.annotations.Component;
 import org.apache.felix.ipojo.annotations.Instantiate;
 import org.apache.felix.ipojo.annotations.Invalidate;
@@ -19,13 +33,20 @@ import org.apache.felix.ipojo.annotations.Validate;
 @Instantiate
 @Provides
 public class PlanetaryClientWorkflow extends WorkflowCommon implements IDocWorkflow {
+	String planetaryClientNamespace = "http://kwarc.info/sally/comm/planetaryclient";
 	
 	@Requires
 	PlanetaryConnection conn;
+	
+	@Requires
+	SallyInteraction interact;
 
 	@Requires
 	CamelContextProvider camelContextProvider;
 	
+	@Requires
+	SallyServlet t;
+	
 	@Validate
 	public void start() {		
 	}
@@ -45,7 +66,7 @@ public class PlanetaryClientWorkflow extends WorkflowCommon implements IDocWorkf
 		
 		try {
 			camelContext.start();
-			camelContext.addRoutes(new MathHubRoute());
+			camelContext.addRoutes(new PlanetaryClientRoute(this));
 			camelContext.createProducerTemplate().sendBody("direct:start", route);
 		} catch (Exception e) {
 			log.error(e.getMessage());
@@ -58,11 +79,56 @@ public class PlanetaryClientWorkflow extends WorkflowCommon implements IDocWorkf
 	}
 
 	public String[] getHandlingNamespaces() {
-		return new String[] {"http://kwarc.info/sally/comm/planetaryclient"};
+		return new String[] { planetaryClientNamespace };
+	}
+	
+	public List<String> getFreeAvailableKeys(Exchange e) {
+		@SuppressWarnings("unchecked")
+		List<HashMap<String, String>> takenKeys = (List<HashMap<String, String>>) e.getIn().getBody(List.class);
+		HashSet<String> taken = new HashSet<String>();
+		for (HashMap<String, String> takenKey : takenKeys) {
+			taken.add(takenKey.get("key"));
+		}
+		List<String> result = new ArrayList<String>();
+		List<String> availableKeys = interact.getPossibleInteractions(new GetLMHWorkers(), String.class, e);
+		for (String aKey : availableKeys) {
+			if (taken.contains(result))
+				continue;
+			availableKeys.add(aKey);
+		}
+		return result;
 	}
 
-	public boolean handleMessage(String namespace, String type, Exchange body) {
+	// very simple 
+	public String getNewMHW(List<String> availableKeys, @Property("uid") Long uid) {
+		if (availableKeys.size()==0)
+			return null;
+		return availableKeys.get(0);
+	}
+	
+	public void addService(AlexRoute route, NewService serviceDesk) {
 		
+	}
+	
+	public boolean handleMessage(AlexRoute route, String namespace, String type, Exchange exchange) {
+		CamelContext context = this.routeContexts.get(route.getID());
+		if (context == null) // should not really happen
+			return false;
+
+		log.info("responding to "+type);
+		if (type.equals("GetServices")) {
+			NewService serv = new NewService();
+			String host = "http://localhost:8181/sally";
+			serv.setIcon(host+"/planetary/libs/mhwsettings.png");
+			serv.setId("mhwsettings");
+			serv.setName("Math Hub Worker Settings");
+			serv.setType("toolbar");
+			serv.setUrl(host+"/planetary/mhwsettings?id="+route.getID());
+			String xml = MarshallUtils.marshallToXML("planetaryclient", serv, getClass().getClassLoader());
+			log.info("sending back"+xml);
+			exchange.getIn().setBody(xml);
+			return true;
+		}
 		return false;
 	}
 
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/model/GetLMHFile.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/model/GetLMHFile.java
deleted file mode 100644
index bf4d9aed9c8135854b4a8c103de7abb94ec27bb8..0000000000000000000000000000000000000000
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/model/GetLMHFile.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package info.kwarc.sally4.mathhubworker.model;
-
-public class GetLMHFile {
-	String session_id;
-	String filePath;
-}
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/WorkerRoute.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/LMHRoute.java
similarity index 59%
rename from MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/WorkerRoute.java
rename to MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/LMHRoute.java
index 19c7ed508355eed4919fd7d412a720bb611f5f45..cde74a9dc2d17ba207711cb7b991b1b9f1fc2eb9 100644
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/WorkerRoute.java
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/LMHRoute.java
@@ -1,17 +1,28 @@
 package info.kwarc.sally4.mathhubworker.routes;
 
-import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.mathhubworker.GetAuthKeyRequest;
+import info.kwarc.sally.comm.mathhubworker.GetAuthKeyResponse;
+import info.kwarc.sally4.docmanager.AlexRoute;
+import info.kwarc.sally4.marshalling.CommUtils;
+import info.kwarc.sally4.mathhubworker.impl.LMHWorkflow;
 
 import org.apache.camel.ExchangeTimedOutException;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.DataFormat;
 
-public class WorkerRoute extends RouteBuilder {
+public class LMHRoute extends RouteBuilder {
 
-	public WorkerRoute() {
-		
+	AlexRoute thisRoute;
+	LMHWorkflow thisWorklow;
+	
+	public LMHRoute(AlexRoute thisRoute, LMHWorkflow thisWorkflow) {		
+		this.thisRoute = thisRoute;
+		this.thisWorklow = thisWorkflow;
+	}
+	
+	public void setWorkerKey(GetAuthKeyResponse response) {
+		thisWorklow.setWorkerKey(thisRoute.getID(), response.getAuthkey());
 	}
 	
 	
@@ -33,7 +44,7 @@ public class WorkerRoute extends RouteBuilder {
 					.stop()
 				.doFinally()
 			.unmarshal(worker)
-			.to("log:test>>>>");
+			.bean(method(this, "setWorkerKey"));
 	}
 
 }
diff --git a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/PlanetaryClientRoute.java
similarity index 69%
rename from MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java
rename to MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/PlanetaryClientRoute.java
index a0a092ce15f6c90b39c7eeb63faa00e0b1de1ce1..38f73f6306d78be5ba26b08d8dda7a8c4b0df5c5 100644
--- a/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/MathHubRoute.java
+++ b/MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/PlanetaryClientRoute.java
@@ -1,18 +1,22 @@
 package info.kwarc.sally4.mathhubworker.routes;
 
-import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.planetaryclient.GetSessionIDRequest;
 import info.kwarc.sally.comm.planetaryclient.GetSessionIDResponse;
+import info.kwarc.sally4.marshalling.CommUtils;
+import info.kwarc.sally4.mathhubworker.impl.PlanetaryClientWorkflow;
+import info.kwarc.sally4.processors.FileServeProcessor;
 
 import org.apache.camel.ExchangeTimedOutException;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spi.DataFormat;
 
-public class MathHubRoute extends RouteBuilder {
+public class PlanetaryClientRoute extends RouteBuilder {
 
-	public MathHubRoute() {
-		
+	PlanetaryClientWorkflow thisWorkflow;
+	
+	public PlanetaryClientRoute(PlanetaryClientWorkflow thisWorkflow) {
+		this.thisWorkflow = thisWorkflow;
 	}
 	
 	public String getSessionID(GetSessionIDResponse response) {
@@ -57,12 +61,22 @@ public class MathHubRoute extends RouteBuilder {
 			.inOut("planetary:select 'key' from mhw_assignment where uid=#?outputType=SelectOne")
 			.choice()
 				.when(simple("${body} == null"))
-					.log(LoggingLevel.INFO, "MathHubRoute", ">>>> Need to assign a new MathHubWorker")
-					.to("direct:getNewMWH")
+//					.to("direct:getNewMHW")
 				.endChoice();
-		
-		from("direct:getNewMWH")
-			.log("Need to get some MathHubWorker .... ");
+	
+		/*
+		from("direct:getNewMHW")
+		// get already taken keys
+			.inOut("planetary:select 'key' from mhw_assignment")
+		// compute list of free and available keys
+			.bean(thisWorkflow, "getFreeAvailableKeys")
+		// choose one key based on user info
+			.bean(thisWorkflow, "getNewMHW")
+			.choice()
+			.when(simple("${body} == null"))
+				.end()
+			.endChoice()
+		*/
 	}
 
 }
diff --git a/MathHubWorker/src/main/resources/mathhubworker.xsd b/MathHubWorker/src/main/resources/mathhubworker.xsd
index f511a6d2ade8c5c910a2d2814204167531fd3cfa..2f6b4d57192a4e1a89fff732351e92775240c91c 100644
--- a/MathHubWorker/src/main/resources/mathhubworker.xsd
+++ b/MathHubWorker/src/main/resources/mathhubworker.xsd
@@ -2,20 +2,4 @@
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 	targetNamespace="http://kwarc.info/sally/comm/mathhubworker" elementFormDefault="qualified">
 
-	<xs:element name="GetAuthKeyRequest">
-		<xs:complexType>
-			<xs:sequence>
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-
-
-	<xs:element name="GetAuthKeyResponse">
-		<xs:complexType>
-			<xs:sequence>
-				<xs:element name="authkey" type="xs:string" />
-			</xs:sequence>
-		</xs:complexType>
-	</xs:element>
-
 </xs:schema>
\ No newline at end of file
diff --git a/activemq/pom.xml b/activemq/pom.xml
index ebcda8c0ca916bba1676d01dac5c230c986a86d7..82d88f45eb19bfc82321e8468a08ca8ef129a0d6 100644
--- a/activemq/pom.xml
+++ b/activemq/pom.xml
@@ -30,7 +30,6 @@
 	<properties>
 		<maven-bundle-plugin.version>2.4.0</maven-bundle-plugin.version>
 		<osgi.version>5.0.0</osgi.version>
-		<camel.version>2.12.3</camel.version>
 	</properties>
 
 	<dependencies>
diff --git a/core/pom.xml b/core/pom.xml
index 4b36a5790de2e6a45929dd45663f3ceca407feb4..2dc6034557bf576922014c75521c3b1a97e5c97e 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -17,21 +17,9 @@
 	<properties>
 		<maven-bundle-plugin.version>2.4.0</maven-bundle-plugin.version>
 		<osgi.version>5.0.0</osgi.version>
-		<camel.version>2.12.3</camel.version>
 	</properties>
 
 	<dependencies>
-		<dependency>
-			<groupId>org.apache.camel</groupId>
-			<artifactId>camel-freemarker</artifactId>
-			<version>${camel.version}</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.apache.camel</groupId>
-			<artifactId>camel-jaxb</artifactId>
-			<version>${camel.version}</version>
-		</dependency>
 
 		<dependency>
 			<groupId>org.apache.felix</groupId>
@@ -46,6 +34,11 @@
 			<scope>provided</scope>
 		</dependency>
 
+	<dependency>
+		<groupId>info.kwarc.sally4</groupId>
+		<artifactId>utils</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</dependency>
 
 	</dependencies>
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatrequest.java b/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatrequest.java
index 6b83f96f8ac0c3c6dc7d58429d213860b6581dfe..8b226e056a980a36649a7a87cb8e14f35375656e 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatrequest.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatrequest.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatresponse.java b/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatresponse.java
index 22c3c3f21432747f32f4c8ebc374239117bb29ac..eac507c9b883d5e4d1093949fc77b14bf29ada6d 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatresponse.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/Heartbeatresponse.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/ObjectFactory.java b/core/src/main/java/info/kwarc/sally/comm/core/ObjectFactory.java
index 0e6586a5305c229af5251d7adbf63d2c84792737..1469041bb77e14ae4adf6ec41e034e0890b1be50 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/ObjectFactory.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/ObjectFactory.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/Onsallyframe.java b/core/src/main/java/info/kwarc/sally/comm/core/Onsallyframe.java
index 7df42101fc26919aebc8af2082009f8353d5a87f..1a288bb1f548e3271ec4c1920b106cfd412b9512 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/Onsallyframe.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/Onsallyframe.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/Registerdocument.java b/core/src/main/java/info/kwarc/sally/comm/core/Registerdocument.java
index 9814854c64e86ef57f37f9343d725ea45b93ab1a..bf4a06f5ee3b378ee1f9de0f586111672cfe75f1 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/Registerdocument.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/Registerdocument.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
@@ -29,7 +29,8 @@ import javax.xml.bind.annotation.XmlType;
  *       &lt;sequence>
  *         &lt;element name="documentqueue" type="{http://www.w3.org/2001/XMLSchema}string"/>
  *         &lt;element name="interfaces" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded"/>
- *         &lt;element name="theoqueue" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="environmentid" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="userid" type="{http://www.w3.org/2001/XMLSchema}string"/>
  *       &lt;/sequence>
  *     &lt;/restriction>
  *   &lt;/complexContent>
@@ -42,7 +43,8 @@ import javax.xml.bind.annotation.XmlType;
 @XmlType(name = "", propOrder = {
     "documentqueue",
     "interfaces",
-    "theoqueue"
+    "environmentid",
+    "userid"
 })
 @XmlRootElement(name = "registerdocument")
 public class Registerdocument {
@@ -52,7 +54,9 @@ public class Registerdocument {
     @XmlElement(required = true)
     protected List<String> interfaces;
     @XmlElement(required = true)
-    protected String theoqueue;
+    protected String environmentid;
+    @XmlElement(required = true)
+    protected String userid;
 
     /**
      * Gets the value of the documentqueue property.
@@ -108,27 +112,51 @@ public class Registerdocument {
     }
 
     /**
-     * Gets the value of the theoqueue property.
+     * Gets the value of the environmentid property.
+     * 
+     * @return
+     *     possible object is
+     *     {@link String }
+     *     
+     */
+    public String getEnvironmentid() {
+        return environmentid;
+    }
+
+    /**
+     * Sets the value of the environmentid property.
+     * 
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *     
+     */
+    public void setEnvironmentid(String value) {
+        this.environmentid = value;
+    }
+
+    /**
+     * Gets the value of the userid property.
      * 
      * @return
      *     possible object is
      *     {@link String }
      *     
      */
-    public String getTheoqueue() {
-        return theoqueue;
+    public String getUserid() {
+        return userid;
     }
 
     /**
-     * Sets the value of the theoqueue property.
+     * Sets the value of the userid property.
      * 
      * @param value
      *     allowed object is
      *     {@link String }
      *     
      */
-    public void setTheoqueue(String value) {
-        this.theoqueue = value;
+    public void setUserid(String value) {
+        this.userid = value;
     }
 
 }
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/Registerdocumentresponse.java b/core/src/main/java/info/kwarc/sally/comm/core/Registerdocumentresponse.java
index 9defce7abc31e4c7ad5151b0a676f0e4d088c285..34e07e52d38889b2dedcd96331e5761e561a0a21 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/Registerdocumentresponse.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/Registerdocumentresponse.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 
diff --git a/core/src/main/java/info/kwarc/sally/comm/core/package-info.java b/core/src/main/java/info/kwarc/sally/comm/core/package-info.java
index 434b0e10a9662d19db6b012e8e3640f5a9379504..266de15f4d00aefe675e229b806ecdd802f476f2 100644
--- a/core/src/main/java/info/kwarc/sally/comm/core/package-info.java
+++ b/core/src/main/java/info/kwarc/sally/comm/core/package-info.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.13 at 10:53:19 PM CEST 
+// Generated on: 2014.04.17 at 03:49:09 PM CEST 
 //
 
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://kwarc.info/sally/comm/core", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
diff --git a/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProcessor.java b/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProcessor.java
deleted file mode 100644
index 721299ebae42c4dfa223da6415316ca51e0d4a61..0000000000000000000000000000000000000000
--- a/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProcessor.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package info.kwarc.sally4.core;
-
-import org.apache.camel.Processor;
-
-public interface FreeMarkerProcessor {
-	Processor template(String path);
-}
diff --git a/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProvider.java b/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProvider.java
deleted file mode 100644
index fe2457a6d349d2382e601c120cfcf267840a3a42..0000000000000000000000000000000000000000
--- a/core/src/main/java/info/kwarc/sally4/core/FreeMarkerProvider.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package info.kwarc.sally4.core;
-
-
-public interface FreeMarkerProvider {
-	FreeMarkerProcessor createFreeMarkerProcessor(ClassLoader classLoader, String prefix);
-}
diff --git a/core/src/main/java/info/kwarc/sally4/core/impl/ClassLoaderTemplateLoader.java b/core/src/main/java/info/kwarc/sally4/core/impl/ClassLoaderTemplateLoader.java
deleted file mode 100644
index 4b6e9bedb016e059a3bb028b0fd8200dbc9fbc4c..0000000000000000000000000000000000000000
--- a/core/src/main/java/info/kwarc/sally4/core/impl/ClassLoaderTemplateLoader.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package info.kwarc.sally4.core.impl;
-
-import java.net.URL;
-
-import freemarker.cache.URLTemplateLoader;
-
-public class ClassLoaderTemplateLoader extends URLTemplateLoader {
-
-	ClassLoader classLoader;
-	String path;
-	
-    public ClassLoaderTemplateLoader(ClassLoader classLoader, String path)
-    {
-    	this.classLoader = classLoader;
-    	this.path = path;
-    }
-    
-    private static boolean isSchemeless(String fullPath) {
-        int i = 0;
-        int ln = fullPath.length();
-        
-        // Skip a single initial /, as things like "/file:/..." might work:
-        if (i < ln && fullPath.charAt(i) == '/') i++;
-        
-        // Check if there's no ":" earlier than a '/', as the URLClassLoader
-        // could interpret that as an URL scheme:
-        while (i < ln) {
-            char c = fullPath.charAt(i);
-            if (c == '/') return true;
-            if (c == ':') return false;
-            i++;
-        }
-        return true;
-    }
-	
-	@Override
-	protected URL getURL(String name) {
-		String fullPath = path + name;
-
-		// Block java.net.URLClassLoader exploits:
-		if (path.equals("/") && !isSchemeless(fullPath)) {
-			return null;
-		}
-
-		return classLoader.getResource(fullPath);
-	}
-
-}
diff --git a/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProcessorImpl.java b/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProcessorImpl.java
deleted file mode 100644
index 4debecec308c6711eee02c395ddcd55a68d457ff..0000000000000000000000000000000000000000
--- a/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProcessorImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package info.kwarc.sally4.core.impl;
-
-import java.io.StringWriter;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import info.kwarc.sally4.core.FreeMarkerProcessor;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-
-class FreeMarkerProcessorImpl implements FreeMarkerProcessor {
-	Configuration freeMarkerConfig;
-	String prefix;
-	
-	public FreeMarkerProcessorImpl(ClassLoader loader, String prefix) {
-		freeMarkerConfig = new Configuration();
-		freeMarkerConfig .setTemplateLoader(new ClassLoaderTemplateLoader(loader, prefix));
-	}
-
-	public Processor template(final String path) {
-		return new Processor() {
-			
-			public void process(Exchange exchange) throws Exception {
-				Template template = freeMarkerConfig.getTemplate(path);
-				StringWriter writer = new StringWriter();
-				template.process(exchange.getIn().getBody(), writer);
-				exchange.getOut().setBody(writer);
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProviderImpl.java b/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProviderImpl.java
deleted file mode 100644
index 452af079b5f33d78726ad58fa7fcbca16f289900..0000000000000000000000000000000000000000
--- a/core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProviderImpl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package info.kwarc.sally4.core.impl;
-
-import info.kwarc.sally4.core.FreeMarkerProcessor;
-import info.kwarc.sally4.core.FreeMarkerProvider;
-
-import org.apache.felix.ipojo.annotations.Component;
-import org.apache.felix.ipojo.annotations.Instantiate;
-import org.apache.felix.ipojo.annotations.Provides;
-
-@Component
-@Provides
-@Instantiate
-public class FreeMarkerProviderImpl implements FreeMarkerProvider{
-
-	public FreeMarkerProviderImpl() {
-	}
-
-	public FreeMarkerProcessor createFreeMarkerProcessor(ClassLoader classLoader, String prefix) {
-		return new FreeMarkerProcessorImpl(classLoader, prefix);
-	}
-
-}
diff --git a/core/src/main/resources/core.xsd b/core/src/main/resources/core.xsd
index fe2373f4446fca2c8f055abf80dabb6aee051687..fbfdd0ead40918f577836a2cd130ceac0014c1ac 100644
--- a/core/src/main/resources/core.xsd
+++ b/core/src/main/resources/core.xsd
@@ -8,7 +8,8 @@
 				<xs:element name="documentqueue" type="xs:string" />
 				<xs:element name="interfaces" type="xs:string" maxOccurs="unbounded"
 					minOccurs="1"></xs:element>
-				<xs:element name="theoqueue" type="xs:string" />
+				<xs:element name="environmentid" type="xs:string" />
+				<xs:element name="userid" type="xs:string" />
 			</xs:sequence>
 		</xs:complexType>
 	</xs:element>
diff --git a/docmanager/pom.xml b/docmanager/pom.xml
index a1d1e5c876a25e4be96c1f3e2e5a9d85c37365da..c9303c21a576834f3143d3dd4538de4bd8f4ea18 100644
--- a/docmanager/pom.xml
+++ b/docmanager/pom.xml
@@ -42,6 +42,12 @@
 			<artifactId>activemq</artifactId>
 			<version>${sally4.version}</version>
 		</dependency>
+		
+		<dependency>
+			<groupId>info.kwarc.sally4</groupId>
+			<artifactId>utils</artifactId>
+			<version>${sally4.version}</version>
+		</dependency>
 
 		<dependency>
 			<groupId>org.apache.felix</groupId>
@@ -52,13 +58,13 @@
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-core</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-test</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 
 		<dependency>
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
index 75912bdb07517c2b8701cc9374e0f400187897a8..b41d18c2521459f18cfafc3178ce50fa89649d54 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/AlexRoute.java
@@ -1,12 +1,14 @@
 package info.kwarc.sally4.docmanager;
 
-import info.kwarc.sally4.core.ProducerConsumerSplitterComponent;
+import info.kwarc.sally4.components.ProducerConsumerSplitterComponent;
 
 
 public interface AlexRoute {
 	public String getID();
 	public String getAlexStateQueue();
 	public String getAlexQueue();
+	public String getEnvironmentID();
+	public String getUserID();
 	public ProducerConsumerSplitterComponent getAlexComponent();
 	
 	public void addOnStopHandler(Runnable r);
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
index b7e435b3949c838233d8519e876ff946374e2dd8..009763aef063b4ae363f0866b3a38d7f030cc099 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/IDocWorkflow.java
@@ -6,6 +6,6 @@ public interface IDocWorkflow {
 	String [] getInterfaceRequirements();
 	String [] getHandlingNamespaces();
 	
-	boolean handleMessage(String namespace, String type, Exchange exchange);
+	boolean handleMessage(AlexRoute route, String namespace, String type, Exchange exchange);
 	void onNewDocument(AlexRoute route);
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TT.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TT.java
index bead3411bd2763140aadcbfc7dabf79533fb33bb..6b9263b7edd01b3c3bf75f33331595da2004fcc0 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TT.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TT.java
@@ -1,7 +1,7 @@
 package info.kwarc.sally4.docmanager;
 
 import info.kwarc.sally.comm.core.Registerdocument;
-import info.kwarc.sally4.core.ProducerConsumerSplitterComponent;
+import info.kwarc.sally4.components.ProducerConsumerSplitterComponent;
 
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.activemq.camel.component.ActiveMQComponent;
@@ -41,7 +41,7 @@ public class TT extends RouteBuilder {
 		System.out.println("starting my stuff");
 		Registerdocument reg = new Registerdocument();
 		reg.setDocumentqueue("client123");
-		reg.setTheoqueue("theo");
+		reg.setEnvironmentid("theo");
 		reg.getInterfaces().add("test");
 		temp.sendBody("direct:client-register", reg);
 	}
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
index a5f852608a6aa6e8b10172352710e31314f44eed..4563d6a20c83d75bc1523268a351d44ada5a27af 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/TestMain.java
@@ -1,12 +1,12 @@
 package info.kwarc.sally4.docmanager;
 
-import info.kwarc.sally.comm.BodyHasType;
-import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.core.Heartbeatrequest;
 import info.kwarc.sally.comm.core.Heartbeatresponse;
 import info.kwarc.sally.comm.core.Registerdocument;
 import info.kwarc.sally.comm.core.Registerdocumentresponse;
 import info.kwarc.sally4.docmanager.routes.SallyRegisterRoute;
+import info.kwarc.sally4.marshalling.CommUtils;
+import info.kwarc.sally4.predicates.BodyHasType;
 
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.activemq.camel.component.ActiveMQComponent;
@@ -47,7 +47,8 @@ public class TestMain extends RouteBuilder {
 		System.out.println("starting my stuff");
 		Registerdocument reg = new Registerdocument();
 		reg.setDocumentqueue("client123");
-		reg.setTheoqueue("theo");
+		reg.setEnvironmentid("1234");
+		reg.setUserid("myuser");
 		reg.getInterfaces().add("planetaryclient");
 		temp.sendBody("direct:client-register", reg);
 	}
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
index 9a74e0436855c4a6055ae483e82d501d23d566b3..51bac57e6aa13cf5044a07e026e2f206f1b7679e 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteImpl.java
@@ -1,8 +1,9 @@
 package info.kwarc.sally4.docmanager.impl;
 
-import info.kwarc.sally4.core.ProducerConsumerSplitterComponent;
+import info.kwarc.sally4.components.ProducerConsumerSplitterComponent;
 import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.IDocWorkflow;
+import info.kwarc.sally4.processors.EnrichMessageProperties;
 
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -14,6 +15,7 @@ import java.util.Queue;
 import java.util.UUID;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Header;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,11 +23,14 @@ import org.slf4j.LoggerFactory;
 public class AlexRouteImpl implements AlexRoute {
 
 	String alexQueue;
-	String theoQueue;
+	String environmentid;
+	String userid;
+	
 	HashSet<String> interfaces;
 	List<Runnable> stopHandlers;
 	
 	Queue<IDocWorkflow> workflows;
+	String ID;
 	
 	Logger log;
 	
@@ -35,14 +40,25 @@ public class AlexRouteImpl implements AlexRoute {
 		//"/queue/sally_doc_"+UUID.randomUUID().toString()
 		return "sally_doc_"+doc_queue;
 	}
+
+	public String getEnvironmentid() {
+		return environmentid;
+	}
 	
-	protected void forwardMessage(String namespace, String msgType, Exchange e) {
+	public String getUserid() {
+		return userid;
+	}
+	
+	public void forwardMessage(Exchange e, 
+			@Header(EnrichMessageProperties.MessageNamespace) String namespace, 
+			@Header(EnrichMessageProperties.MessageType) String msgType) {
+
 		Iterator<IDocWorkflow> iter = workflows.iterator();
 		while (iter.hasNext()) {
 			IDocWorkflow work = iter.next();
 			for (String s : work.getHandlingNamespaces()) {
 				if (s.equals(namespace)) {
-					if (work.handleMessage(namespace, msgType, e)) {
+					if (work.handleMessage(this, namespace, msgType, e)) {
 						return;
 					}
 				}
@@ -50,14 +66,17 @@ public class AlexRouteImpl implements AlexRoute {
 		}
 	}
 	
-	public AlexRouteImpl(String alexQueue, String theoQueue, Collection<String> interfaces) {
+	public AlexRouteImpl(String alexQueue, String environmentid, String userid, Collection<String> interfaces) {
 		log = LoggerFactory.getLogger(getClass());
 		this.alexQueue = alexQueue;
-		this.theoQueue = theoQueue;
+		this.environmentid = environmentid;
+		this.userid = userid;
+		
 		this.interfaces = new HashSet<String>(interfaces);
 		this.alexStateQueue = generateUUID(alexQueue);
 		stopHandlers = new ArrayList<Runnable>();
 		workflows = new ArrayDeque<IDocWorkflow>();
+		ID = UUID.randomUUID().toString();
 	}	
 	
 	public void addDocumentWorkflow(IDocWorkflow workflow) {
@@ -97,11 +116,23 @@ public class AlexRouteImpl implements AlexRoute {
 
 	@Override
 	public String getID() {
-		return UUID.randomUUID().toString();
+		return ID;
 	}
 
 	@Override
 	public ProducerConsumerSplitterComponent getAlexComponent() {
 		return new ProducerConsumerSplitterComponent("activemq:queue:"+alexStateQueue, "activemq:queue:"+alexQueue);
 	}
+
+	@Override
+	public String getEnvironmentID() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getUserID() {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
index 1ccf4c6d6ba6b6c2d6d8c2f2bd1d409c937b6a8d..90edf9894c00e452426661ac5534e9b8f9c5f41d 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DocumentManagerImpl.java
@@ -6,6 +6,7 @@ import info.kwarc.sally4.core.CamelContextProvider;
 import info.kwarc.sally4.docmanager.AlexRoute;
 import info.kwarc.sally4.docmanager.DocumentManager;
 import info.kwarc.sally4.docmanager.IDocWorkflow;
+import info.kwarc.sally4.docmanager.routes.DocumentManagementRoute;
 import info.kwarc.sally4.docmanager.routes.SallyRegisterRoute;
 
 import java.util.Arrays;
@@ -31,7 +32,7 @@ import org.slf4j.LoggerFactory;
 @Provides
 public class DocumentManagerImpl implements DocumentManager {
 
-	@Requires
+	@Requires(optional=true)
 	IDocWorkflow[] workflows;
 
 	@Requires
@@ -58,8 +59,14 @@ public class DocumentManagerImpl implements DocumentManager {
 		if (docs.containsKey(doc.getDocumentqueue()))
 			return docs.get(doc.getDocumentqueue());
 
-		AlexRouteImpl route = new AlexRouteImpl(doc.getDocumentqueue(), doc.getTheoqueue(), doc.getInterfaces());
-				
+		final AlexRouteImpl route = new AlexRouteImpl(doc.getDocumentqueue(), doc.getEnvironmentid(), doc.getUserid(), doc.getInterfaces());
+		route.addOnStopHandler(new Runnable() {
+			
+			@Override
+			public void run() {
+				docs.remove(route.getAlexQueue());
+			}
+		});
 		docs.put(doc.getDocumentqueue(), route);
 				
 		return route;
@@ -73,9 +80,15 @@ public class DocumentManagerImpl implements DocumentManager {
 			}
 		}
 	}
+	
+	public HashMap<String, Object> prepareDocManagement() {
+		HashMap<String, Object> result = new HashMap<String, Object>();
+		result.put("routes", docs.values());
+		return result;
+	}
 
 
-	@Bind(aggregate=true)
+	@Bind(aggregate=true, optional=true)
 	private void bindWorkflow(IDocWorkflow workflow) 
 	{ 
 		HashSet<String> required = new HashSet<String>(Arrays.asList(workflow.getInterfaceRequirements()));
@@ -86,7 +99,7 @@ public class DocumentManagerImpl implements DocumentManager {
 		}
 	}
 
-	@Unbind
+	@Unbind(aggregate=true, optional=true)
 	private void unbindWorkflow(IDocWorkflow workflow) 
 	{ 
 		for (AlexRouteImpl route : docs.values()) {
@@ -100,7 +113,9 @@ public class DocumentManagerImpl implements DocumentManager {
 		try {
 			camelContext = new DefaultCamelContext();
 			camelContext.addComponent("activemq", camelContextProvider.getComponent("activemq"));
+			camelContext.addComponent("sallyservlet", camelContextProvider.getComponent("sallyservlet"));
 			camelContext.addRoutes(registerRoute);
+			camelContext.addRoutes(new DocumentManagementRoute(this));
 			camelContext.start();
 		} catch (Exception e) {
 			log.info(e.getMessage());
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DummyWorkflow.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DummyWorkflow.java
deleted file mode 100644
index 4178bcc0bb0f0d16b04ef2eaa73fe6fc34430e0e..0000000000000000000000000000000000000000
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DummyWorkflow.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package info.kwarc.sally4.docmanager.impl;
-
-import info.kwarc.sally4.docmanager.AlexRoute;
-import info.kwarc.sally4.docmanager.IDocWorkflow;
-
-import org.apache.camel.Exchange;
-import org.apache.felix.ipojo.annotations.Component;
-import org.apache.felix.ipojo.annotations.Instantiate;
-import org.apache.felix.ipojo.annotations.Provides;
-
-@Component
-@Instantiate
-@Provides
-public class DummyWorkflow implements IDocWorkflow {
-
-	@Override
-	public String[] getInterfaceRequirements() {
-		return new String[]{"SomeNearlyImpossibleInterfaceRequirement"};
-	}
-
-	@Override
-	public String[] getHandlingNamespaces() {
-		return new String[]{};
-	}
-
-	@Override
-	public boolean handleMessage(String namespace, String type,
-			Exchange exchange) {
-		return false;
-	}
-
-	@Override
-	public void onNewDocument(AlexRoute route) {		
-	}
-
-}
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
index edb9724f72964f6a166b1d3ae1ddf9f0412a467a..b7251f4676e26f476e293c565daca4024b5edac9 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyAlexRoute.java
@@ -1,10 +1,10 @@
 package info.kwarc.sally4.docmanager.routes;
 
-import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.core.Heartbeatrequest;
 import info.kwarc.sally4.docmanager.impl.AlexRouteImpl;
-import info.kwarc.sally4.docmanager.impl.AlexRouteMessageProcessor;
 import info.kwarc.sally4.docmanager.impl.DocumentManagerImpl;
+import info.kwarc.sally4.marshalling.CommUtils;
+import info.kwarc.sally4.processors.EnrichMessageProperties;
 
 import org.apache.camel.ExchangeTimedOutException;
 import org.apache.camel.builder.RouteBuilder;
@@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory;
 public class SallyAlexRoute extends RouteBuilder  {
 
 	Logger log;
-	AlexRouteImpl route;
+	AlexRouteImpl thisAlexRoute;
 	DocumentManagerImpl docManager;
 	
 	public Heartbeatrequest generateHeartbeat() {
@@ -23,17 +23,17 @@ public class SallyAlexRoute extends RouteBuilder  {
 	}
 	
 	public void stopSallyRoute() {
-		route.stop();
+		thisAlexRoute.stop();
 	}
 	
-	SallyAlexRoute(AlexRouteImpl route) {
+	SallyAlexRoute(AlexRouteImpl thisAlexRoute) {
 		log = LoggerFactory.getLogger(getClass());
-		this.route = route;
+		this.thisAlexRoute = thisAlexRoute;
 	}
 	
 	@Override
 	public void configure() throws Exception {
-		DataFormat core = CommUtils.getDataFormat("core");
+		DataFormat core = CommUtils.getDataFormat("core", getClass().getClassLoader());
 
 		/**
 		 * Sends a Heartbeat message to the Alex. if it does not respond after 20sec, this route will shutdown.
@@ -51,8 +51,9 @@ public class SallyAlexRoute extends RouteBuilder  {
 		 */
 		from("alex:defaultin")
 			.convertBodyTo(String.class)
-			.process(new AlexRouteMessageProcessor(route))
-			.to("alex:defaultout");		
+			.process(new EnrichMessageProperties())
+			.bean(thisAlexRoute, "forwardMessage");
+			//.to("alex:defaultout");		
 	}
 	
 	
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
index 70e671ca3815d8e2529708279ba24622436b9a3e..446b9a4fa71f8313969331ad09344ba4e39d3e9b 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
+++ b/docmanager/src/main/java/info/kwarc/sally4/docmanager/routes/SallyRegisterRoute.java
@@ -1,9 +1,9 @@
 package info.kwarc.sally4.docmanager.routes;
 
-import info.kwarc.sally.comm.CommUtils;
 import info.kwarc.sally.comm.core.Registerdocumentresponse;
 import info.kwarc.sally4.docmanager.impl.AlexRouteImpl;
 import info.kwarc.sally4.docmanager.impl.DocumentManagerImpl;
+import info.kwarc.sally4.marshalling.CommUtils;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ExchangePattern;
@@ -50,7 +50,7 @@ public class SallyRegisterRoute extends RouteBuilder {
 
 	@Override
 	public void configure() throws Exception {
-		DataFormat core = CommUtils.getDataFormat("core");
+		DataFormat core = CommUtils.getDataFormat("core", getClass().getClassLoader());
 		
 		from("activemq:queue:"+sallyRegisterQueue)
 			.unmarshal(core)
diff --git a/docmanager/src/main/resources/templates/test.html b/docmanager/src/main/resources/templates/test.html
index c2f9c04f51487c7041c02c1f296dcdbdbff7e81d..7aae485c80c5adb707456880417421c1f88ef0ef 100644
--- a/docmanager/src/main/resources/templates/test.html
+++ b/docmanager/src/main/resources/templates/test.html
@@ -1 +1,28 @@
-Hello from template
\ No newline at end of file
+<h1>Document Manager</h1>
+
+List of Alexes
+<table>
+	<thead>
+		<tr><th>AlexQueue</th><th>Interfaces</th><th>environment id</th><th>user id</th></tr>
+	</thead>
+	<tbody>	
+		<#list body.routes as route> 
+			<tr>
+				<td>
+					${route.getAlexQueue()} 
+				</td>
+				<td>
+					<#list route.getInterfaces() as iface>
+						${iface}
+					</#list>
+				</td>
+				<td>
+					${route.getEnvironmentid()!"missing environment"} 
+				</td>
+				<td>
+					${route.getUserid()!"missing user id"} 
+				</td>
+			</tr>
+		</#list>		
+	</tbody>
+</table>
diff --git a/mmt/pom.xml b/mmt/pom.xml
index adddee541687acc27a446bccd0e3ed07e3e302ee..a8f4ffe777d793e7432a750c6900ebf9486b819b 100644
--- a/mmt/pom.xml
+++ b/mmt/pom.xml
@@ -39,7 +39,7 @@
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-core</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 
 		<dependency>
diff --git a/planetary/pom.xml b/planetary/pom.xml
index a0c22c8af16151932ed4f754269db989858b2915..5a1bd54aaa0381dc3f294d6c5771e7176e35eb99 100644
--- a/planetary/pom.xml
+++ b/planetary/pom.xml
@@ -45,7 +45,7 @@
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-core</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 
 		<dependency>
@@ -63,7 +63,7 @@
 		<dependency>
 			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-sql</artifactId>
-			<version>2.12.3</version>
+			<version>${camel.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>org.slf4j</groupId>
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
index e1bd8d3b63413f2e86c66cb4a60982a3ddd585f6..d76cdb4d10b30effdc077057f71c1e807d4c9700 100644
--- a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetServices.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+// Generated on: 2014.04.17 at 11:52:15 AM CEST 
 //
 
 
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
index 80fe5284f4a332f6fe44608cb58373d3a7ca35ae..bfabeb09cb9e90fd6f5cc4d85447f860449b0ffb 100644
--- a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDRequest.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+// Generated on: 2014.04.17 at 11:52:15 AM CEST 
 //
 
 
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
index a232d3d29036cdae1f46cbfd54d2f01f05f0d4f6..a3e4540aca15f4f5c14987742235fe92851c3085 100644
--- a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/GetSessionIDResponse.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+// Generated on: 2014.04.17 at 11:52:15 AM CEST 
 //
 
 
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
index a8893b7aae3824700c2aca42eb02ef497812e69d..ff4bd416ccf3738f5ccbb1f9f89b22438356127d 100644
--- a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/ObjectFactory.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+// Generated on: 2014.04.17 at 11:52:15 AM CEST 
 //
 
 
@@ -52,6 +52,14 @@ public class ObjectFactory {
         return new GetSessionIDRequest();
     }
 
+    /**
+     * Create an instance of {@link NewService }
+     * 
+     */
+    public NewService createNewService() {
+        return new NewService();
+    }
+
     /**
      * Create an instance of {@link GetServices }
      * 
diff --git a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
index 0655923e04b4829a7dbc5d06e302bd27f6fdfd22..a1f87af04a92f21603565140175e3cc0efdee428 100644
--- a/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
+++ b/planetary/src/main/java/info/kwarc/sally/comm/planetaryclient/package-info.java
@@ -2,7 +2,7 @@
 // This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
 // Any modifications to this file will be lost upon recompilation of the source schema. 
-// Generated on: 2014.04.14 at 11:27:21 PM CEST 
+// Generated on: 2014.04.17 at 11:52:15 AM CEST 
 //
 
 @javax.xml.bind.annotation.XmlSchema(namespace = "http://kwarc.info/sally/comm/planetaryclient", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
diff --git a/planetary/src/main/resources/planetaryclient.xsd b/planetary/src/main/resources/planetaryclient.xsd
index 6139dd48440599a50c2ac332f73d5e32bb49ed59..4812246922d6c6694921c14bccd033277815a240 100644
--- a/planetary/src/main/resources/planetaryclient.xsd
+++ b/planetary/src/main/resources/planetaryclient.xsd
@@ -1,6 +1,7 @@
 <?xml version="1.0"?>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-	targetNamespace="http://kwarc.info/sally/comm/planetaryclient" elementFormDefault="qualified">
+	targetNamespace="http://kwarc.info/sally/comm/planetaryclient"
+	elementFormDefault="qualified">
 
 	<xs:element name="GetSessionIDRequest">
 		<xs:complexType>
@@ -23,5 +24,16 @@
 		</xs:complexType>
 	</xs:element>
 
+	<xs:element name="NewService">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="id" type="xs:string"></xs:element>
+				<xs:element name="type" type="xs:string"></xs:element>
+				<xs:element name="name" type="xs:string"></xs:element>
+				<xs:element name="icon" type="xs:string"></xs:element>
+				<xs:element name="url" type="xs:string"></xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
 
 </xs:schema>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index fd93a17a8c460a1e61143aa97d953a36c45cd2d0..609728856f6827f94d00d5e2728f2dc4041a09f9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,10 +10,12 @@
 	<name>Sally Project</name>
 	
 	<properties>
-		<sally4.version>0.0.2-SNAPSHOT</sally4.version>
+		<sally4.version>0.0.3-SNAPSHOT</sally4.version>
+		<camel.version>2.12.3</camel.version>
 	</properties>
 	
 	<modules>
+		<module>utils</module>
 		<module>core</module>
 		<module>docmanager</module>
 		<module>planetary</module>
diff --git a/servlet/pom.xml b/servlet/pom.xml
index 8e66f8ff86f10b096045cedf32d0ac883da3245e..e14766bface298a8b76d7518fea0f7f9751e6ad7 100644
--- a/servlet/pom.xml
+++ b/servlet/pom.xml
@@ -32,7 +32,6 @@
 	<properties>
 		<maven-bundle-plugin.version>2.4.0</maven-bundle-plugin.version>
 		<osgi.version>5.0.0</osgi.version>
-		<camel.version>2.12.3</camel.version>
 	</properties>
 
 	<dependencies>
diff --git a/servlet/src/main/java/info/kwarc/sally4/servlet/impl/ServletImpl.java b/servlet/src/main/java/info/kwarc/sally4/servlet/impl/ServletImpl.java
index abfa7876de7bc27556a8741543894da7a3b39c5d..a9fab6c4f7166b29552237b1f5ef8e90f5ef423c 100644
--- a/servlet/src/main/java/info/kwarc/sally4/servlet/impl/ServletImpl.java
+++ b/servlet/src/main/java/info/kwarc/sally4/servlet/impl/ServletImpl.java
@@ -34,6 +34,7 @@ public class ServletImpl implements SallyServlet {
 		ServletComponent servletComponent = new ServletComponent();
 		servletComponent.setServletName(srvlet.getServletName());
 		camelContextProvider.registerGlobalComponent("sallyservlet", servletComponent);
+		
 	}
 
 	@Invalidate
diff --git a/utils/.classpath b/utils/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..efcf778ba09971dc34cdd589c088c9710e5a5ad4
--- /dev/null
+++ b/utils/.classpath
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/utils/.project b/utils/.project
new file mode 100644
index 0000000000000000000000000000000000000000..e941e834aa95991d954f101f4a4e38150f46e35a
--- /dev/null
+++ b/utils/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>utils</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/utils/.settings/org.eclipse.jdt.core.prefs b/utils/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..60105c1b9516ec7dc540970605e57f7ffe09e368
--- /dev/null
+++ b/utils/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/utils/.settings/org.eclipse.m2e.core.prefs b/utils/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..f897a7f1cb2389f85fe6381425d29f0a9866fb65
--- /dev/null
+++ b/utils/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/utils/pom.xml b/utils/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..129f33e855fdd17387c7aeda3baf0e2cb0519298
--- /dev/null
+++ b/utils/pom.xml
@@ -0,0 +1,66 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>info.kwarc.sally4</groupId>
+	<artifactId>utils</artifactId>
+	<version>${sally4.version}</version>
+	<packaging>bundle</packaging>
+
+	<parent>
+		<groupId>info.kwarc.sally</groupId>
+		<artifactId>sally</artifactId>
+		<version>1.0</version>
+		<relativePath>..</relativePath>
+	</parent>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-freemarker</artifactId>
+			<version>${camel.version}</version>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.7.7</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-jaxb</artifactId>
+			<version>${camel.version}</version>
+		</dependency>
+
+	</dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>2.4.0</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+						<Export-Package>info.kwarc.sally4*</Export-Package>
+						<Import-Package>*;</Import-Package>
+					</instructions>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-ipojo-plugin</artifactId>
+				<version>1.11.2</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>ipojo-bundle</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/core/src/main/java/info/kwarc/sally4/core/ProducerConsumerSplitterComponent.java b/utils/src/main/java/info/kwarc/sally4/components/ProducerConsumerSplitterComponent.java
similarity index 98%
rename from core/src/main/java/info/kwarc/sally4/core/ProducerConsumerSplitterComponent.java
rename to utils/src/main/java/info/kwarc/sally4/components/ProducerConsumerSplitterComponent.java
index 68662fde27bffddeb9d060c170878b8e6634bfa6..f0746da09b3015a41552a37a5b589dad1254265e 100644
--- a/core/src/main/java/info/kwarc/sally4/core/ProducerConsumerSplitterComponent.java
+++ b/utils/src/main/java/info/kwarc/sally4/components/ProducerConsumerSplitterComponent.java
@@ -1,4 +1,4 @@
-package info.kwarc.sally4.core;
+package info.kwarc.sally4.components;
 
 import java.util.Map;
 
diff --git a/utils/src/main/java/info/kwarc/sally4/components/TemplatingComponent.java b/utils/src/main/java/info/kwarc/sally4/components/TemplatingComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..32820a187454cb0105c3461e37fd78d235984b8e
--- /dev/null
+++ b/utils/src/main/java/info/kwarc/sally4/components/TemplatingComponent.java
@@ -0,0 +1,76 @@
+package info.kwarc.sally4.components;
+
+import java.net.URL;
+
+import org.apache.camel.component.freemarker.FreemarkerComponent;
+
+import freemarker.cache.URLTemplateLoader;
+import freemarker.template.Configuration;
+
+public class TemplatingComponent extends FreemarkerComponent {
+	String prefix;
+	ClassLoader classLoader;
+	Configuration freeMarkerConfig;
+	
+	public static class ClassLoaderTemplateLoader extends URLTemplateLoader {
+
+		ClassLoader classLoader;
+		String path;
+		
+	    public ClassLoaderTemplateLoader(ClassLoader classLoader, String path)
+	    {
+	    	this.classLoader = classLoader;
+	    	this.path = path;
+	    }
+	    
+	    private static boolean isSchemeless(String fullPath) {
+	        int i = 0;
+	        int ln = fullPath.length();
+	        
+	        // Skip a single initial /, as things like "/file:/..." might work:
+	        if (i < ln && fullPath.charAt(i) == '/') i++;
+	        
+	        // Check if there's no ":" earlier than a '/', as the URLClassLoader
+	        // could interpret that as an URL scheme:
+	        while (i < ln) {
+	            char c = fullPath.charAt(i);
+	            if (c == '/') return true;
+	            if (c == ':') return false;
+	            i++;
+	        }
+	        return true;
+	    }
+		
+		@Override
+		protected URL getURL(String name) {
+			String fullPath = path + name;
+
+			// Block java.net.URLClassLoader exploits:
+			if (path.equals("/") && !isSchemeless(fullPath)) {
+				return null;
+			}
+
+			return classLoader.getResource(fullPath);
+		}
+
+	}
+	
+	public TemplatingComponent(String prefix, ClassLoader classLoader) {
+		this.prefix = prefix;
+		this.classLoader = classLoader;
+		init();
+	}
+
+	public TemplatingComponent(String prefix) {
+		this.prefix = prefix;
+		this.classLoader = getClass().getClassLoader();
+		init();
+	}
+
+	private void init() {
+		freeMarkerConfig = new Configuration();
+		freeMarkerConfig .setTemplateLoader(new ClassLoaderTemplateLoader(classLoader, prefix));
+		setConfiguration(freeMarkerConfig);
+	}
+	
+}
diff --git a/core/src/main/java/info/kwarc/sally/comm/CommUtils.java b/utils/src/main/java/info/kwarc/sally4/marshalling/CommUtils.java
similarity index 95%
rename from core/src/main/java/info/kwarc/sally/comm/CommUtils.java
rename to utils/src/main/java/info/kwarc/sally4/marshalling/CommUtils.java
index f8f7ebfa1825f0797ed0ec83ac946dd956fc57c1..fb0993098e0adaa1be84c5b6c5b291fa3a9a1440 100644
--- a/core/src/main/java/info/kwarc/sally/comm/CommUtils.java
+++ b/utils/src/main/java/info/kwarc/sally4/marshalling/CommUtils.java
@@ -1,4 +1,4 @@
-package info.kwarc.sally.comm;
+package info.kwarc.sally4.marshalling;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
diff --git a/core/src/main/java/info/kwarc/sally/comm/MarshallUtils.java b/utils/src/main/java/info/kwarc/sally4/marshalling/MarshallUtils.java
similarity index 82%
rename from core/src/main/java/info/kwarc/sally/comm/MarshallUtils.java
rename to utils/src/main/java/info/kwarc/sally4/marshalling/MarshallUtils.java
index 3911b9796d46e6cdce704e3f78ef4156bfc05e4a..749784052fc0024025e43283d8ecb731b6cad052 100644
--- a/core/src/main/java/info/kwarc/sally/comm/MarshallUtils.java
+++ b/utils/src/main/java/info/kwarc/sally4/marshalling/MarshallUtils.java
@@ -1,4 +1,4 @@
-package info.kwarc.sally.comm;
+package info.kwarc.sally4.marshalling;
 
 
 import java.io.StringReader;
@@ -15,10 +15,10 @@ public class MarshallUtils  {
 	public MarshallUtils() {
 	}
 	
-	public static String marshallToXML(String iFace, Object obj) {
+	public static String marshallToXML(String iFace, Object obj, ClassLoader loader) {
 		try {
 			StringWriter writer = new StringWriter();
-			JAXBContext jc = JAXBContext.newInstance( "info.kwarc.sally.comm."+iFace );
+			JAXBContext jc = JAXBContext.newInstance( "info.kwarc.sally.comm."+iFace, loader);
 			Marshaller m = jc.createMarshaller();
 			m.marshal(obj, writer);
 			return writer.toString();
@@ -28,10 +28,10 @@ public class MarshallUtils  {
 		}
 	}
 
-	public static Object unmarshallFromXML(String iFace, String xml) {
+	public static Object unmarshallFromXML(String iFace, String xml, ClassLoader loader) {
 		try {
 			StringReader reader = new StringReader(xml);
-			JAXBContext jc = JAXBContext.newInstance( "info.kwarc.sally.comm."+iFace );
+			JAXBContext jc = JAXBContext.newInstance( "info.kwarc.sally.comm."+iFace, loader);
 			Unmarshaller m = jc.createUnmarshaller();
 			return m.unmarshal(reader);
 		} catch (JAXBException e) {
diff --git a/core/src/main/java/info/kwarc/sally/comm/BodyHasType.java b/utils/src/main/java/info/kwarc/sally4/predicates/BodyHasType.java
similarity index 91%
rename from core/src/main/java/info/kwarc/sally/comm/BodyHasType.java
rename to utils/src/main/java/info/kwarc/sally4/predicates/BodyHasType.java
index 344b033c17cfaad01a46aa2961969f75bcdffbe6..cca5ad645577f808076a72a2bb2de51d1fc669a5 100644
--- a/core/src/main/java/info/kwarc/sally/comm/BodyHasType.java
+++ b/utils/src/main/java/info/kwarc/sally4/predicates/BodyHasType.java
@@ -1,4 +1,4 @@
-package info.kwarc.sally.comm;
+package info.kwarc.sally4.predicates;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Predicate;
diff --git a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java b/utils/src/main/java/info/kwarc/sally4/processors/EnrichMessageProperties.java
similarity index 63%
rename from docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java
rename to utils/src/main/java/info/kwarc/sally4/processors/EnrichMessageProperties.java
index 31c965caf1034c4c26b573ac637dda0515000d6e..f56a3550bc591e5cae7391e9548a3380ad58f7fd 100644
--- a/docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java
+++ b/utils/src/main/java/info/kwarc/sally4/processors/EnrichMessageProperties.java
@@ -1,4 +1,4 @@
-package info.kwarc.sally4.docmanager.impl;
+package info.kwarc.sally4.processors;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -6,26 +6,23 @@ import java.util.regex.Pattern;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class AlexRouteMessageProcessor implements Processor {
-	AlexRouteImpl route;
+public class EnrichMessageProperties implements Processor {
+	
+	static final public String MessageType = "XMLMessageType";
+	static final public String MessageNamespace = "XMLMessageNamespace";
 	
 	Logger log;
 	
 	Pattern xmlNamespace = Pattern.compile("<(\\w+)\\s+xmlns=\"([\\w/:.]+)\"/>");
-	
-	public AlexRouteMessageProcessor(AlexRouteImpl route) {
-		this.route = route;
-		log = LoggerFactory.getLogger(getClass());
-	}
-	
+		
 	public void process(Exchange exchange) throws Exception {
 		Matcher m = xmlNamespace.matcher(exchange.getIn().getBody(String.class));
 		if (m.find()) {
 			String msgType = m.group(1);
 			String namespace = m.group(2);
-			route.forwardMessage(namespace, msgType, exchange);
+			exchange.getIn().setHeader(MessageType, msgType);
+			exchange.getIn().setHeader(MessageNamespace, namespace);
 		} else {
 			exchange.setException(new Exception("Could not detect namespace in incoming message"));
 		}
diff --git a/utils/src/main/java/info/kwarc/sally4/processors/FileServeProcessor.java b/utils/src/main/java/info/kwarc/sally4/processors/FileServeProcessor.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d5fb610dcadfd4aafd7d7b4dd1cfa39d72da1fe
--- /dev/null
+++ b/utils/src/main/java/info/kwarc/sally4/processors/FileServeProcessor.java
@@ -0,0 +1,45 @@
+package info.kwarc.sally4.processors;
+
+import java.io.InputStream;
+import java.net.URLConnection;
+import java.util.regex.Pattern;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FileServeProcessor implements Processor {
+	ClassLoader loader;
+	Pattern p = Pattern.compile("[\\w_/]+\\.[\\w_]+");
+	String prefix;
+	Logger log;
+	
+	public FileServeProcessor(String prefix, ClassLoader loader) {
+		this.loader = loader;
+		this.prefix = prefix;
+		log = LoggerFactory.getLogger(getClass());
+	}
+	
+	void setFileNotfound(Exchange exchange) {
+		exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "text/plain; charset=UTF-8");
+        exchange.getOut().setBody("File not found");		
+	}
+	
+	@Override
+	public void process(Exchange exchange) throws Exception {
+		String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
+		if (p.matcher(path).matches()) {
+			String resContentType = URLConnection.guessContentTypeFromName(prefix+path);
+			InputStream stream = loader.getResourceAsStream(prefix+path);
+			if (stream == null) {
+				setFileNotfound(exchange);
+				return;
+			}
+			exchange.getOut().setHeader(Exchange.CONTENT_TYPE, resContentType);
+	        exchange.getOut().setBody(stream);
+		} else {
+			setFileNotfound(exchange);
+		}
+	}
+}