diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fb3a5ccb5f43a8339f349324f764d3648b58f1e7..893df192c063bb957d18edd52c7eed8465a934ca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,7 @@ variables:
 
 stages:
 - build
-- publish
+# - publish
 
 before_script:
   - export GRADLE_USER_HOME=`pwd`/.gradle
diff --git a/ragconnect.base/src/main/resources/JavaHandler.jadd b/ragconnect.base/src/main/resources/JavaHandler.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..86a81b7b9ca7aede273612d8fd737829f2a632ea
--- /dev/null
+++ b/ragconnect.base/src/main/resources/JavaHandler.jadd
@@ -0,0 +1,70 @@
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
+
+aspect JavaHandler {
+
+    /**
+     * Singleton class providing routing functionality for byte[] based message calls.
+     */
+    public class CallBackRouter {
+
+        public static org.jastadd.ragconnect.jrouter.CallBackRouter ROUTER_INSTANCE = null;
+
+        private final org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(org.jastadd.ragconnect.jrouter.CallBackRouter.class);
+
+        private Map<String, List<Consumer<byte[]>>> callbackList = new ConcurrentHashMap<>();
+
+        private CallBackRouter() {
+
+        }
+
+        public synchronized static org.jastadd.ragconnect.jrouter.CallBackRouter getInstance() {
+            if(ROUTER_INSTANCE == null) {
+                ROUTER_INSTANCE = new org.jastadd.ragconnect.jrouter.CallBackRouter();
+            }
+            return ROUTER_INSTANCE;
+        }
+
+        public void registerCallback(Consumer<byte[]> callback, String topic) {
+
+            logger.debug("[ROUTER] Registering new callback.");
+
+            List<Consumer<byte[]>> registeredCallbacks = getAllCallbacks().get(topic);
+
+            if(registeredCallbacks == null){
+                List<Consumer<byte[]>> newCallbackList = Collections.synchronizedList(new ArrayList<>());
+                newCallbackList.add(callback);
+                callbackList.put(topic, newCallbackList);
+            } else {
+                registeredCallbacks.add(callback);
+            }
+        }
+
+        public boolean push(String topic, byte[] data) {
+
+            logger.debug("[ROUTER] Pushing a message.");
+
+            List<Consumer<byte[]>> callbacks = getAllCallbacks().get(topic);
+
+            if(callbacks == null){
+                logger.error("[ROUTER] Could not publish message. No callback registered for topic " + topic);
+                return false;
+            }
+
+            for(Consumer<byte[]> callback : callbacks){
+                logger.debug("[ROUTER] Calling callback: " + callback.toString());
+                callback.accept(data);
+            }
+
+            return true;
+        }
+
+        public Map<String, List<Consumer<byte[]>>> getAllCallbacks() {
+            return callbackList;
+        }
+    }
+}
\ No newline at end of file