diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index f6fc20befc6697e63ff4c4bbac16c852c898b78d..1c2c4af4a40db2ff7ffb0bf962716d515553fd97 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -61,4 +61,11 @@ aspect Navigation {
   // --- isDefaultMappingDefinition ---
   syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
   eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
+
+  // --- mragconnect ---
+  inh MRagConnect MHandler.mragconnect();
+  eq MRagConnect.getHandler().mragconnect() = this;
+
+  // --- rootTypeComponents ---
+  syn JastAddList<MTypeComponent> MHandler.rootTypeComponents() = mragconnect().getRootTypeComponents();
 }
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index 6b6399287f4d657087cc45d5c905917ac54fea7a..607f96066832b1f788d0d1d6e5d0a18552f11337 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -136,6 +136,11 @@ aspect AttributesForMustache {
         result.addRootTypeComponent(child.asTypeComponent().toMustache());
       }
     }
+    // MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
+    result.addHandler(new MHandler("MqttServerHandler", "new MqttServerHandler(\"RagConnectMQTT\")",
+                                   result.mqttHandlerAttribute(), result.mqttHandlerField(), usesMqtt));
+    result.addHandler(new MHandler("RestServerHandler", "new RestServerHandler(\"RagConnectREST\")",
+                                   result.restHandlerAttribute(), result.restHandlerField(), usesRest));
     return result;
   }
 
diff --git a/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
index 62ecdb6166a783e125cefef2826d550b73ab9e1b..06843177098ba889b665257c9ba2f965f5ecda88 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
+++ b/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
@@ -1,4 +1,4 @@
-MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*;
+MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent* Handler:MHandler*;
 abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
 MReceiveDefinition : MEndpointDefinition;
 MSendDefinition : MEndpointDefinition;
@@ -7,6 +7,7 @@ MInnerMappingDefinition;
 MDependencyDefinition;
 MTypeComponent;
 MTokenComponent;
+MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boolean>;
 
 rel MRagConnect.RagConnect -> RagConnect;
 rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition;
diff --git a/ragconnect.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd
index d9f99fba5be35110b645fe976ae594853d66d213..b6750261d9f4ad06d92721c95aa7aa6e7971849b 100644
--- a/ragconnect.base/src/main/resources/MqttHandler.jadd
+++ b/ragconnect.base/src/main/resources/MqttHandler.jadd
@@ -1,5 +1,7 @@
 import java.io.IOException;
-import java.util.concurrent.TimeUnit;aspect MqttHandler {
+import java.util.concurrent.TimeUnit;
+
+aspect MqttHandler {
 public class MqttServerHandler {
   private final java.util.Map<String, MqttHandler> handlers = new java.util.HashMap<>();
   private long time;
diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache
index e89c451007ff309a77297b9b66fe0e20dece73b8..796f76027fd22899b60e02a2fdd08fbf0dc9ebdb 100644
--- a/ragconnect.base/src/main/resources/handler.mustache
+++ b/ragconnect.base/src/main/resources/handler.mustache
@@ -1,7 +1,17 @@
 aspect RagConnectHandler {
-interface RagConnectHandler<T> {
-  boolean connectReceive(String path, java.util.function.Consumer<T> callback);
-  boolean sendPush(String path, T value);
-  boolean connectSendPull(String path, SupplierWithException<T> supplier);
-}
+{{#Handlers}}
+  {{#InUse}}
+  private {{ClassName}} {{rootNodeName}}.{{FieldName}} = {{{Construction}}};
+  {{#rootTypeComponents}}
+  {{#first}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/first}}
+  eq {{rootNodeName}}.get{{name}}().{{AttributeName}}() = {{FieldName}};
+  {{/rootTypeComponents}}
+  syn {{ClassName}} {{rootNodeName}}.{{AttributeName}}() = {{FieldName}};
+  {{/InUse}}
+{{/Handlers}}
+  public void {{rootNodeName}}.{{closeMethod}}() {
+    {{#Handlers}}
+    {{#InUse}}{{FieldName}}.close();{{/InUse}}
+    {{/Handlers}}
+  }
 }
diff --git a/ragconnect.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache
index 8de0b5a32d8696b597feaf03fd361a5b5ef00bf8..f12cb8982443f01dd6195e2c86a0ae55f1485811 100644
--- a/ragconnect.base/src/main/resources/mqtt.mustache
+++ b/ragconnect.base/src/main/resources/mqtt.mustache
@@ -1,14 +1,5 @@
 aspect MQTT {
-  private String {{rootNodeName}}.MqttName() { return "RagConnectMQTT"; }
-  private MqttServerHandler {{rootNodeName}}.{{mqttHandlerField}} = new MqttServerHandler(MqttName());
-
   public void {{rootNodeName}}.{{mqttSetupWaitUntilReadyMethod}}(long time, java.util.concurrent.TimeUnit unit) {
     {{mqttHandlerField}}.setupWaitUntilReady(time, unit);
   }
-
-  {{#RootTypeComponents}}
-  {{#first}}inh MqttServerHandler ASTNode.{{mqttHandlerAttribute}}();{{/first}}
-  eq {{rootNodeName}}.get{{name}}().{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
-  {{/RootTypeComponents}}
-  syn MqttServerHandler {{rootNodeName}}.{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
 }
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index a39510d73854301efb1f05fe7f9c1fd476916ef7..49d1721cbf0cf0131fe2248fe4e736906448bccf 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -1,10 +1,6 @@
 {{#usesMqtt}}{{> mqtt}}{{/usesMqtt}}
-{{#usesRest}}{{> rest}}{{/usesRest}}
+{{> handler}}
 aspect ROS2RAG {
-  public void {{rootNodeName}}.{{closeMethod}}() {
-    {{#usesMqtt}}{{mqttHandlerField}}.close();{{/usesMqtt}}
-    {{#usesRest}}{{restHandlerField}}.close();{{/usesRest}}
-  }
   {{#ReceiveDefinitions}}
   {{> receiveDefinition}}
   {{/ReceiveDefinitions}}
diff --git a/ragconnect.base/src/main/resources/rest.mustache b/ragconnect.base/src/main/resources/rest.mustache
deleted file mode 100644
index 6bbde2be4d26e519635c85a6f39f9a18514bfb19..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/rest.mustache
+++ /dev/null
@@ -1,12 +0,0 @@
-aspect REST {
-  private String {{rootNodeName}}.RestName() { return "RagConnectREST"; }
-  private RestServerHandler {{rootNodeName}}.{{restHandlerField}} = new RestServerHandler(RestName());
-
-  {{#getRootTypeComponents}}
-  {{#first}}inh RestServerHandler ASTNode.{{restHandlerAttribute}}();{{/first}}
-  eq {{rootNodeName}}.get{{name}}().{{restHandlerAttribute}}() = {{restHandlerField}};
-  {{/getRootTypeComponents}}
-  {{^getRootTypeComponents}}
-  syn RestServerHandler {{rootNodeName}}.{{restHandlerAttribute}}() = {{restHandlerField}};
-  {{/getRootTypeComponents}}
-}