From f2014ec4ad0c991692141c16635933e89ffac5d5 Mon Sep 17 00:00:00 2001
From: Constantin Jucovschi <jucovschi@gmail.com>
Date: Thu, 17 Apr 2014 16:35:33 +0200
Subject: [PATCH] refactoring util classes into a separate project

---
 MathHubWorker/pom.xml                         | 10 ++-
 .../sally4/mathhubworker/MathHubWorker.java   |  5 --
 .../mathhubworker/MathHubWorkerManager.java   |  8 ++
 .../{WorkerWorkflow.java => LMHWorkflow.java} | 48 +++++++++---
 .../impl/PlanetaryClientWorkflow.java         | 74 +++++++++++++++++-
 .../mathhubworker/model/GetLMHFile.java       |  6 --
 .../{WorkerRoute.java => LMHRoute.java}       | 21 +++--
 ...ubRoute.java => PlanetaryClientRoute.java} | 32 +++++---
 .../src/main/resources/mathhubworker.xsd      | 16 ----
 activemq/pom.xml                              |  1 -
 core/pom.xml                                  | 17 ++---
 .../sally/comm/core/Heartbeatrequest.java     |  2 +-
 .../sally/comm/core/Heartbeatresponse.java    |  2 +-
 .../kwarc/sally/comm/core/ObjectFactory.java  |  2 +-
 .../kwarc/sally/comm/core/Onsallyframe.java   |  2 +-
 .../sally/comm/core/Registerdocument.java     | 48 +++++++++---
 .../comm/core/Registerdocumentresponse.java   |  2 +-
 .../kwarc/sally/comm/core/package-info.java   |  2 +-
 .../sally4/core/FreeMarkerProcessor.java      |  7 --
 .../kwarc/sally4/core/FreeMarkerProvider.java |  6 --
 .../core/impl/ClassLoaderTemplateLoader.java  | 48 ------------
 .../core/impl/FreeMarkerProcessorImpl.java    | 32 --------
 .../core/impl/FreeMarkerProviderImpl.java     | 22 ------
 core/src/main/resources/core.xsd              |  3 +-
 docmanager/pom.xml                            | 10 ++-
 .../kwarc/sally4/docmanager/AlexRoute.java    |  4 +-
 .../kwarc/sally4/docmanager/IDocWorkflow.java |  2 +-
 .../java/info/kwarc/sally4/docmanager/TT.java |  4 +-
 .../kwarc/sally4/docmanager/TestMain.java     |  7 +-
 .../sally4/docmanager/impl/AlexRouteImpl.java | 45 +++++++++--
 .../docmanager/impl/DocumentManagerImpl.java  | 25 ++++--
 .../sally4/docmanager/impl/DummyWorkflow.java | 36 ---------
 .../docmanager/routes/SallyAlexRoute.java     | 19 ++---
 .../docmanager/routes/SallyRegisterRoute.java |  4 +-
 .../src/main/resources/templates/test.html    | 29 ++++++-
 mmt/pom.xml                                   |  2 +-
 planetary/pom.xml                             |  4 +-
 .../comm/planetaryclient/GetServices.java     |  2 +-
 .../planetaryclient/GetSessionIDRequest.java  |  2 +-
 .../planetaryclient/GetSessionIDResponse.java |  2 +-
 .../comm/planetaryclient/ObjectFactory.java   | 10 ++-
 .../comm/planetaryclient/package-info.java    |  2 +-
 .../src/main/resources/planetaryclient.xsd    | 14 +++-
 pom.xml                                       |  4 +-
 servlet/pom.xml                               |  1 -
 .../sally4/servlet/impl/ServletImpl.java      |  1 +
 utils/.classpath                              | 36 +++++++++
 utils/.project                                | 23 ++++++
 utils/.settings/org.eclipse.jdt.core.prefs    |  5 ++
 utils/.settings/org.eclipse.m2e.core.prefs    |  4 +
 utils/pom.xml                                 | 66 ++++++++++++++++
 .../ProducerConsumerSplitterComponent.java    |  2 +-
 .../components/TemplatingComponent.java       | 76 +++++++++++++++++++
 .../kwarc/sally4/marshalling}/CommUtils.java  |  2 +-
 .../sally4/marshalling}/MarshallUtils.java    | 10 +--
 .../kwarc/sally4/predicates}/BodyHasType.java |  2 +-
 .../processors/EnrichMessageProperties.java   | 19 ++---
 .../sally4/processors/FileServeProcessor.java | 45 +++++++++++
 58 files changed, 634 insertions(+), 301 deletions(-)
 delete mode 100644 MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorker.java
 create mode 100644 MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/MathHubWorkerManager.java
 rename MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/impl/{WorkerWorkflow.java => LMHWorkflow.java} (53%)
 delete mode 100644 MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/model/GetLMHFile.java
 rename MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/{WorkerRoute.java => LMHRoute.java} (59%)
 rename MathHubWorker/src/main/java/info/kwarc/sally4/mathhubworker/routes/{MathHubRoute.java => PlanetaryClientRoute.java} (69%)
 delete mode 100644 core/src/main/java/info/kwarc/sally4/core/FreeMarkerProcessor.java
 delete mode 100644 core/src/main/java/info/kwarc/sally4/core/FreeMarkerProvider.java
 delete mode 100644 core/src/main/java/info/kwarc/sally4/core/impl/ClassLoaderTemplateLoader.java
 delete mode 100644 core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProcessorImpl.java
 delete mode 100644 core/src/main/java/info/kwarc/sally4/core/impl/FreeMarkerProviderImpl.java
 delete mode 100644 docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/DummyWorkflow.java
 create mode 100644 utils/.classpath
 create mode 100644 utils/.project
 create mode 100644 utils/.settings/org.eclipse.jdt.core.prefs
 create mode 100644 utils/.settings/org.eclipse.m2e.core.prefs
 create mode 100644 utils/pom.xml
 rename {core/src/main/java/info/kwarc/sally4/core => utils/src/main/java/info/kwarc/sally4/components}/ProducerConsumerSplitterComponent.java (98%)
 create mode 100644 utils/src/main/java/info/kwarc/sally4/components/TemplatingComponent.java
 rename {core/src/main/java/info/kwarc/sally/comm => utils/src/main/java/info/kwarc/sally4/marshalling}/CommUtils.java (95%)
 rename {core/src/main/java/info/kwarc/sally/comm => utils/src/main/java/info/kwarc/sally4/marshalling}/MarshallUtils.java (82%)
 rename {core/src/main/java/info/kwarc/sally/comm => utils/src/main/java/info/kwarc/sally4/predicates}/BodyHasType.java (91%)
 rename docmanager/src/main/java/info/kwarc/sally4/docmanager/impl/AlexRouteMessageProcessor.java => utils/src/main/java/info/kwarc/sally4/processors/EnrichMessageProperties.java (63%)
 create mode 100644 utils/src/main/java/info/kwarc/sally4/processors/FileServeProcessor.java

diff --git a/MathHubWorker/pom.xml b/MathHubWorker/pom.xml
index 971061e..e37ff61 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 cca57cf..0000000
--- 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 0000000..6807809
--- /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 2542a90..c97e6b9 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 241630d..82ebce7 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 bf4d9ae..0000000
--- 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 19c7ed5..cde74a9 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 a0a092c..38f73f6 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 f511a6d..2f6b4d5 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 ebcda8c..82d88f4 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 4b36a57..2dc6034 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 6b83f96..8b226e0 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 22c3c3f..eac507c 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 0e6586a..1469041 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 7df4210..1a288bb 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 9814854..bf4a06f 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 9defce7..34e07e5 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 434b0e1..266de15 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 721299e..0000000
--- 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 fe2457a..0000000
--- 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 4b6e9be..0000000
--- 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 4debece..0000000
--- 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 452af07..0000000
--- 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 fe2373f..fbfdd0e 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 a1d1e5c..c9303c2 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 75912bd..b41d18c 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 b7e435b..009763a 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 bead341..6b9263b 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 a5f8526..4563d6a 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 9a74e04..51bac57 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 1ccf4c6..90edf98 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 4178bcc..0000000
--- 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 edb9724..b7251f4 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 70e671c..446b9a4 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 c2f9c04..7aae485 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 adddee5..a8f4ffe 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 a0c22c8..5a1bd54 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 e1bd8d3..d76cdb4 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 80fe528..bfabeb0 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 a232d3d..a3e4540 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 a8893b7..ff4bd41 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 0655923..a1f87af 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 6139dd4..4812246 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 fd93a17..6097288 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 8e66f8f..e14766b 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 abfa787..a9fab6c 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 0000000..efcf778
--- /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 0000000..e941e83
--- /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 0000000..60105c1
--- /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 0000000..f897a7f
--- /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 0000000..129f33e
--- /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 68662fd..f0746da 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 0000000..32820a1
--- /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 f8f7ebf..fb09930 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 3911b97..7497840 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 344b033..cca5ad6 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 31c965c..f56a355 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 0000000..0d5fb61
--- /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);
+		}
+	}
+}
-- 
GitLab