diff --git a/platform/tools/mixed-osgi-over-slf4j/pom.xml b/platform/tools/mixed-osgi-over-slf4j/pom.xml
new file mode 100644
index 0000000..7a8f568
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+  <parent>
+	   <groupId>org.eclipse.sensinact.gateway.tools</groupId>
+	   <artifactId>platform.tools</artifactId>
+       <version>2.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>mixed-osgi-over-slf4j</artifactId>
+
+  <packaging>bundle</packaging>
+  <name>sensiNact IoT Gateway - Felix SCR compatible LogService over SLF4J</name>
+
+  <dependencies>
+	 <dependency>
+	     <groupId>org.slf4j</groupId>
+	     <artifactId>slf4j-simple</artifactId>
+	     <scope>provided</scope>
+	 </dependency>
+	 <dependency>
+		 <groupId>org.osgi</groupId>
+		 <artifactId>org.osgi.annotation.versioning</artifactId>
+		 <version>1.0.0</version>
+		 <scope>provided</scope>
+	  </dependency>
+	  <dependency>
+		 <groupId>org.eclipse.sensinact.gateway</groupId>
+		 <artifactId>sensinact-utils</artifactId>
+		 <scope>provided</scope>
+	  </dependency>
+  </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                    	<Bundle-Activator>org.slf4j.osgi.logservice.impl.Activator</Bundle-Activator>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+  
+</project>
diff --git a/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/Logger.java b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/Logger.java
new file mode 100644
index 0000000..7d03e09
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/Logger.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2020 Kentyou.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Kentyou - initial API and implementation
+ */
+package org.osgi.service.log;
+
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * This is a stripped down copy of the LogService 1.4 API (R7). It's
+ * trimmed down to the methods used by the optional support for
+ * R7 logging.
+ */
+@ProviderType
+public interface Logger {
+
+    String ROOT_LOGGER_NAME = "ROOT";
+
+	boolean isDebugEnabled();
+
+	void debug(String message);
+
+	void debug(String format, Object arg);
+
+	boolean isInfoEnabled();
+
+	void info(String message);
+
+	void info(String format, Object arg);
+
+	boolean isWarnEnabled();
+
+	void warn(String message);
+
+	void warn(String format, Object arg);
+
+	boolean isErrorEnabled();
+
+	void error(String message);
+
+	void error(String format, Object arg);
+}
diff --git a/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/LoggerFactory.java b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/LoggerFactory.java
new file mode 100644
index 0000000..f6651cd
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/osgi/service/log/LoggerFactory.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2020 Kentyou.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Kentyou - initial API and implementation
+ */
+package org.osgi.service.log;
+
+import org.osgi.annotation.versioning.ProviderType;
+
+/**
+ * This is a stripped down copy of the LogService 1.4 API (R7). It's
+ * trimmed down to the methods used by the optional support for
+ * R7 logging.
+ */
+@ProviderType
+public interface LoggerFactory {
+    <L extends Logger> L getLogger(String name, Class<L> loggerType);
+}
diff --git a/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/Activator.java b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/Activator.java
new file mode 100644
index 0000000..6e2795a
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/Activator.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020 Kentyou.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Kentyou - initial API and implementation
+ */
+package org.slf4j.osgi.logservice.impl;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.service.log.LogService;
+
+/**
+ * Handles activation/deactivation of the bundle
+ */
+public class Activator implements BundleActivator {
+    /**
+     *
+     * Registers a LogServiceFactory.
+     *
+     * @param bundleContext the framework context for the bundle
+     * @throws Exception
+     */
+    public void start(BundleContext bundleContext) throws Exception {
+
+        Dictionary<String,Object> props = new Hashtable<String, Object>();
+        props.put("description", "An SLF4J LogService implementation.");
+        ServiceFactory factory = new LogServiceFactory();
+        bundleContext.registerService(LogService.class.getName(), factory, props);
+    }
+
+    /**
+     *
+     * Implements <code>BundleActivator.stop()</code>.
+     *
+     * @param bundleContext the framework context for the bundle
+     * @throws Exception
+     */
+    public void stop(BundleContext bundleContext) throws Exception {
+
+        // Note: It is not required that we remove the service here, since
+        // the framework will do it automatically.
+    }
+}
diff --git a/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceFactory.java b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceFactory.java
new file mode 100644
index 0000000..6035a4b
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2020 Kentyou.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Kentyou - initial API and implementation
+ */
+package org.slf4j.osgi.logservice.impl;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * <code>LogServiceFactory</code> creates LogService implementations.
+ */
+public class LogServiceFactory implements ServiceFactory {
+
+	@Override
+    public Object getService(Bundle bundle, ServiceRegistration arg1) {
+        return new LogServiceImpl(bundle);
+    }
+
+	@Override
+    public void ungetService(Bundle bundle, ServiceRegistration arg1, Object arg2) {
+        // nothing to do.
+    }
+}
diff --git a/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceImpl.java b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceImpl.java
new file mode 100644
index 0000000..56007ef
--- /dev/null
+++ b/platform/tools/mixed-osgi-over-slf4j/src/main/java/org/slf4j/osgi/logservice/impl/LogServiceImpl.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2020 Kentyou.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Kentyou - initial API and implementation
+ */
+package org.slf4j.osgi.logservice.impl;
+
+import org.eclipse.sensinact.gateway.util.ReflectUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>LogServiceImpl</code> is a simple OSGi LogService implementation that delegates to a slf4j
+ * Logger.
+ */
+public class LogServiceImpl implements LogService {
+
+    private static final String UNKNOWN = "[Unknown]";
+
+    private final Logger delegate;
+
+    /**
+     * Creates a new instance of LogServiceImpl.
+     *
+     * @param bundle The bundle to create a new LogService for.
+     */
+    public LogServiceImpl(Bundle bundle) {
+
+        String name = bundle.getSymbolicName();
+        Version version = bundle.getVersion();
+        if (version == null) {
+            version = Version.emptyVersion;
+        }
+        delegate = LoggerFactory.getLogger(name + '.' + version);
+    }
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public <L extends org.osgi.service.log.Logger> L getLogger(String name, Class<L> loggerType) {
+		if(loggerType == org.osgi.service.log.Logger.class) {
+			return (L) new org.osgi.service.log.Logger(){
+				private Logger delegate = LoggerFactory.getLogger(name);
+				
+				@Override
+				public boolean isDebugEnabled() {
+					return delegate.isDebugEnabled();
+				}
+
+				@Override
+				public void debug(String message) {
+					delegate.debug(message);
+				}
+
+				@Override
+				public void debug(String format, Object arg) {
+					delegate.debug(format, arg);
+				}
+
+				@Override
+				public boolean isInfoEnabled() {
+					return delegate.isInfoEnabled();
+				}
+
+				@Override
+				public void info(String message) {
+					delegate.info(message);
+				}
+
+				@Override
+				public void info(String format, Object arg) {
+					delegate.info(format, arg);
+				}
+
+				@Override
+				public boolean isWarnEnabled() {
+					return delegate.isWarnEnabled();
+				}
+
+				@Override
+				public void warn(String message) {
+					delegate.warn(message);
+				}
+
+				@Override
+				public void warn(String format, Object arg) {
+					delegate.warn(format,arg);
+				}
+
+				@Override
+				public boolean isErrorEnabled() {
+					return delegate.isErrorEnabled();
+				}
+
+				@Override
+				public void error(String message) {
+					delegate.error(message);
+				}
+
+				@Override
+				public void error(String format, Object arg) {
+					delegate.error(format, arg);
+				}
+			};
+		}
+		if(loggerType.isInterface())
+			return null;
+		return ReflectUtils.getTheBestInstance(loggerType, new Object[] {name});
+	}
+	
+	@Override
+    public void log(int level, String message) {
+
+        switch (level) {
+        case LOG_DEBUG:
+            delegate.debug(message);
+            break;
+        case LOG_ERROR:
+            delegate.error(message);
+            break;
+        case LOG_INFO:
+            delegate.info(message);
+            break;
+        case LOG_WARNING:
+            delegate.warn(message);
+            break;
+        default:
+            break;
+        }
+    }
+
+	@Override
+    public void log(int level, String message, Throwable exception) {
+
+        switch (level) {
+        case LOG_DEBUG:
+            delegate.debug(message, exception);
+            break;
+        case LOG_ERROR:
+            delegate.error(message, exception);
+            break;
+        case LOG_INFO:
+            delegate.info(message, exception);
+            break;
+        case LOG_WARNING:
+            delegate.warn(message, exception);
+            break;
+        default:
+            break;
+        }
+    }
+
+	@Override
+    public void log(ServiceReference sr, int level, String message) {
+
+        switch (level) {
+        case LOG_DEBUG:
+            if (delegate.isDebugEnabled()) {
+                delegate.debug(createMessage(sr, message));
+            }
+            break;
+        case LOG_ERROR:
+            if (delegate.isErrorEnabled()) {
+                delegate.error(createMessage(sr, message));
+            }
+            break;
+        case LOG_INFO:
+            if (delegate.isInfoEnabled()) {
+                delegate.info(createMessage(sr, message));
+            }
+            break;
+        case LOG_WARNING:
+            if (delegate.isWarnEnabled()) {
+                delegate.warn(createMessage(sr, message));
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+    /**
+     * Formats the log message to indicate the service sending it, if known.
+     *
+     * @param sr the ServiceReference sending the message.
+     * @param message The message to log.
+     * @return The formatted log message.
+     */
+    private String createMessage(ServiceReference sr, String message) {
+
+        StringBuilder output = new StringBuilder();
+        if (sr != null) {
+            output.append('[').append(sr.toString()).append(']');
+        } else {
+            output.append(UNKNOWN);
+        }
+        output.append(message);
+
+        return output.toString();
+    }
+
+	@Override
+    public void log(ServiceReference sr, int level, String message, Throwable exception) {
+
+        switch (level) {
+        case LOG_DEBUG:
+            if (delegate.isDebugEnabled()) {
+                delegate.debug(createMessage(sr, message), exception);
+            }
+            break;
+        case LOG_ERROR:
+            if (delegate.isErrorEnabled()) {
+                delegate.error(createMessage(sr, message), exception);
+            }
+            break;
+        case LOG_INFO:
+            if (delegate.isInfoEnabled()) {
+                delegate.info(createMessage(sr, message), exception);
+            }
+            break;
+        case LOG_WARNING:
+            if (delegate.isWarnEnabled()) {
+                delegate.warn(createMessage(sr, message), exception);
+            }
+            break;
+        default:
+            break;
+        }
+    }
+}
diff --git a/platform/tools/pom.xml b/platform/tools/pom.xml
index 57b8302..7c58b34 100644
--- a/platform/tools/pom.xml
+++ b/platform/tools/pom.xml
@@ -34,5 +34,7 @@
 		<module>swagger</module>
 		<module>mqtt-server</module>
 		<module>influxdb-connector</module>
+		<module>mongodb-connector</module>
+		<module>mixed-osgi-over-slf4j</module>
 	</modules>
 </project>
