GERONIMO-6648 ensure the common code is extracted in a common module
diff --git a/geronimo-opentracing-common/pom.xml b/geronimo-opentracing-common/pom.xml
new file mode 100644
index 0000000..491229d
--- /dev/null
+++ b/geronimo-opentracing-common/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<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">
+  <parent>
+    <artifactId>geronimo-opentracing-parent</artifactId>
+    <groupId>org.apache.geronimo</groupId>
+    <version>1.0.1-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>geronimo-opentracing-common</artifactId>
+  <name>Geronimo OpenTracing :: Common</name>
+  <description>Implementation environment independent (no CDI).</description>
+
+  <properties>
+    <geronimo-opentracing.Automatic-Module-Name>org.apache.geronimo.opentracing.common</geronimo-opentracing.Automatic-Module-Name>
+  </properties>
+</project>
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/DefaultOpenTracingConfig.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
similarity index 61%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/config/DefaultOpenTracingConfig.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
index 3eaf8a3..5f5f749 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/DefaultOpenTracingConfig.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
@@ -1,12 +1,12 @@
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
+ * contributor license agreements. See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
+ * the License. You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.config;
+package org.apache.geronimo.microprofile.opentracing.common.config;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
 
-import javax.enterprise.inject.Vetoed;
-
-@Vetoed
 class DefaultOpenTracingConfig implements GeronimoOpenTracingConfig {
     private final Map<String, String> configuration = new HashMap<>();
 
@@ -47,3 +47,22 @@
         return configuration.getOrDefault(value, def);
     }
 }
+
+@FunctionalInterface
+public interface GeronimoOpenTracingConfig {
+
+    String read(String value, String def);
+
+    static GeronimoOpenTracingConfig create() {
+        try {
+            final Iterator<GeronimoOpenTracingConfig> iterator = ServiceLoader.load(GeronimoOpenTracingConfig.class)
+                                                                              .iterator();
+            if (iterator.hasNext()) {
+                return new PrefixedConfig(iterator.next());
+            }
+        } catch (final ServiceConfigurationError | ExceptionInInitializerError | NoClassDefFoundError | Exception e) {
+            // no-op
+        }
+        return new PrefixedConfig(new DefaultOpenTracingConfig());
+    }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/PrefixedConfig.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/PrefixedConfig.java
similarity index 84%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/config/PrefixedConfig.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/PrefixedConfig.java
index 0253c2e..f81c610 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/PrefixedConfig.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/PrefixedConfig.java
@@ -14,11 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.config;
+package org.apache.geronimo.microprofile.opentracing.common.config;
 
-import javax.enterprise.inject.Vetoed;
-
-@Vetoed
 class PrefixedConfig implements GeronimoOpenTracingConfig {
     private final GeronimoOpenTracingConfig delegate;
 
@@ -28,6 +25,9 @@
 
     @Override
     public String read(final String value, final String def) {
+        if (value.startsWith("mp.")) {
+            return delegate.read(value, delegate.read("geronimo.opentracing." + value, def));
+        }
         return delegate.read("geronimo.opentracing." + value, def);
     }
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/FinishedSpan.java
similarity index 93%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/FinishedSpan.java
index c707d27..187c4fe 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/FinishedSpan.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import io.opentracing.Span;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/GeronimoTracer.java
similarity index 88%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/GeronimoTracer.java
index d15b3b3..c7e7654 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/GeronimoTracer.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import static java.util.Collections.list;
 import static java.util.Optional.ofNullable;
@@ -25,14 +25,11 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.Event;
-import javax.inject.Inject;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MultivaluedMap;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Bus;
 
 import io.opentracing.Scope;
 import io.opentracing.ScopeManager;
@@ -42,19 +39,10 @@
 import io.opentracing.propagation.Format;
 import io.opentracing.propagation.TextMap;
 
-@ApplicationScoped
 public class GeronimoTracer implements Tracer {
-
-    @Inject
     private ScopeManager scopeManager;
-
-    @Inject
     private IdGenerator idGenerator;
-
-    @Inject
-    private Event<FinishedSpan> finishedSpanEvent;
-
-    @Inject
+    private Bus<FinishedSpan> finishedSpanEvent;
     private GeronimoOpenTracingConfig config;
 
     private String parentSpanIdHeader;
@@ -62,14 +50,29 @@
     private String traceIdHeader;
     private String baggageHeaderPrefix;
 
-    @PostConstruct
-    private void init() {
+    public void init() {
         parentSpanIdHeader = config.read("propagation.headers.parentSpanId", "X-B3-ParentSpanId");
         spanIdHeader = config.read("propagation.headers.spanId", "X-B3-SpanId");
         traceIdHeader = config.read("propagation.headers.traceId", "X-B3-TraceId");
         baggageHeaderPrefix = config.read("propagation.headers.baggagePrefix", "baggage-");
     }
 
+    public void setScopeManager(final ScopeManager scopeManager) {
+        this.scopeManager = scopeManager;
+    }
+
+    public void setIdGenerator(final IdGenerator idGenerator) {
+        this.idGenerator = idGenerator;
+    }
+
+    public void setFinishedSpanEvent(final Bus<FinishedSpan> finishedSpanEvent) {
+        this.finishedSpanEvent = finishedSpanEvent;
+    }
+
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
     @Override
     public ScopeManager scopeManager() {
         return scopeManager;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/IdGenerator.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGenerator.java
similarity index 89%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/IdGenerator.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGenerator.java
index 4a066f0..12692ee 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/IdGenerator.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGenerator.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import java.util.Random;
 import java.util.UUID;
@@ -22,21 +22,17 @@
 import java.util.function.Supplier;
 
 import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
 
-@ApplicationScoped
+// @ApplicationScoped
 public class IdGenerator {
-    @Inject
     protected GeronimoOpenTracingConfig config;
 
     private Supplier<Object> delegate;
     private boolean counter;
 
-    @PostConstruct
-    void createDelegate() {
+    public void init() {
         final String type = config.read("id.generator", "counter");
         counter = "counter".equalsIgnoreCase(type);
         switch (type) {
@@ -72,6 +68,10 @@
         }
     }
 
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
     public boolean isCounter() {
         return counter;
     }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/JaxRsHeaderTextMap.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/JaxRsHeaderTextMap.java
similarity index 96%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/JaxRsHeaderTextMap.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/JaxRsHeaderTextMap.java
index 53d5944..d074248 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/JaxRsHeaderTextMap.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/JaxRsHeaderTextMap.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import java.util.Iterator;
 import java.util.Map;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ReferenceImpl.java
similarity index 94%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ReferenceImpl.java
index 07036ff..46821cf 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ReferenceImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 public class ReferenceImpl {
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeImpl.java
similarity index 95%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeImpl.java
index 8d5851e..3afcf85 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import io.opentracing.Scope;
 import io.opentracing.Span;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeManagerImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeManagerImpl.java
similarity index 92%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeManagerImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeManagerImpl.java
index 4ba677e..05110f3 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ScopeManagerImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ScopeManagerImpl.java
@@ -14,15 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
-
-import javax.enterprise.context.ApplicationScoped;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import io.opentracing.Scope;
 import io.opentracing.ScopeManager;
 import io.opentracing.Span;
 
-@ApplicationScoped
+// @ApplicationScoped
 public class ScopeManagerImpl implements ScopeManager {
 
     private final ThreadLocal<Scope> current = new ThreadLocal<>();
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ServletHeaderTextMap.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ServletHeaderTextMap.java
similarity index 97%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ServletHeaderTextMap.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ServletHeaderTextMap.java
index af135bc..b4d123c 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ServletHeaderTextMap.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/ServletHeaderTextMap.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import java.util.Enumeration;
 import java.util.Iterator;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanBuilderImpl.java
similarity index 98%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanBuilderImpl.java
index 999bda4..9de9c56 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanBuilderImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import static java.util.stream.Collectors.toMap;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanContextImpl.java
similarity index 96%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanContextImpl.java
index 1b61d3d..a1eee17 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanContextImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import java.util.Map;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanImpl.java
similarity index 98%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanImpl.java
index 3614d4f..4565c88 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/SpanImpl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
 import static java.util.Collections.singletonMap;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/GeronimoClientTracingRegistrarProvider.java
similarity index 80%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/GeronimoClientTracingRegistrarProvider.java
index 538e83c..edb7e34 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/GeronimoClientTracingRegistrarProvider.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.client;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.client;
 
 import java.util.concurrent.ExecutorService;
 
-import javax.enterprise.inject.spi.CDI;
 import javax.ws.rs.client.ClientBuilder;
 
-import org.apache.geronimo.microprofile.opentracing.microprofile.thread.OpenTracingExecutorService;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.thread.OpenTracingExecutorService;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
 import org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider;
 
 import io.opentracing.Tracer;
@@ -35,10 +35,10 @@
     private final Tracer tracer;
 
     public GeronimoClientTracingRegistrarProvider() {
-        final CDI<Object> cdi = CDI.current();
-        requestFilter = cdi.select(OpenTracingClientRequestFilter.class).get();
-        responseFilter = cdi.select(OpenTracingClientResponseFilter.class).get();
-        tracer = cdi.select(Tracer.class).get();
+        final Container container = Container.get();
+        requestFilter = container.lookup(OpenTracingClientRequestFilter.class);
+        responseFilter = container.lookup(OpenTracingClientResponseFilter.class);
+        tracer = container.lookup(Tracer.class);
     }
 
     @Override
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientRequestFilter.java
similarity index 86%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientRequestFilter.java
index c02b445..f5653d1 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientRequestFilter.java
@@ -14,21 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.client;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.client;
 
 import static io.opentracing.References.CHILD_OF;
 import static java.util.Optional.ofNullable;
 
 import java.util.function.Consumer;
 
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
 import javax.ws.rs.client.ClientRequestContext;
 import javax.ws.rs.client.ClientRequestFilter;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
-import org.apache.geronimo.microprofile.opentracing.impl.JaxRsHeaderTextMap;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.JaxRsHeaderTextMap;
 
 import io.opentracing.Scope;
 import io.opentracing.Span;
@@ -37,26 +34,30 @@
 import io.opentracing.propagation.Format;
 import io.opentracing.tag.Tags;
 
-@ApplicationScoped
+// @ApplicationScoped
 public class OpenTracingClientRequestFilter implements ClientRequestFilter {
 
-    @Inject
     private Tracer tracer;
-
-    @Inject
     private GeronimoOpenTracingConfig config;
 
     private boolean skip;
     private boolean skipDefaultTags;
     private boolean skipPeerTags;
 
-    @PostConstruct
-    private void init() {
+    public void init() {
         skip = Boolean.parseBoolean(config.read("client.filter.request.skip", "false"));
         skipDefaultTags = Boolean.parseBoolean(config.read("client.filter.request.skipDefaultTags", "false"));
         skipPeerTags = Boolean.parseBoolean(config.read("client.filter.request.skipPeerTags", "false"));
     }
 
+    public void setTracer(final Tracer tracer) {
+        this.tracer = tracer;
+    }
+
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
     @Override
     public void filter(final ClientRequestContext context) {
         if (context.getProperty(OpenTracingClientRequestFilter.class.getName()) != null || skip) {
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientResponseFilter.java
similarity index 91%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientResponseFilter.java
index 8b56c4d..62ac654 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/OpenTracingClientResponseFilter.java
@@ -14,12 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.client;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.client;
 
 import static java.util.Optional.ofNullable;
 
 import javax.annotation.Priority;
-import javax.enterprise.context.ApplicationScoped;
 import javax.ws.rs.Priorities;
 import javax.ws.rs.client.ClientRequestContext;
 import javax.ws.rs.client.ClientResponseContext;
@@ -28,7 +27,7 @@
 import io.opentracing.Scope;
 import io.opentracing.tag.Tags;
 
-@ApplicationScoped
+// @ApplicationScoped
 @Priority(Priorities.HEADER_DECORATOR)
 public class OpenTracingClientResponseFilter implements ClientResponseFilter {
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/SyncExecutor.java
similarity index 95%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/SyncExecutor.java
index 916c4fd..653d9ff 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/client/SyncExecutor.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.client;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.client;
 
 import static java.util.Collections.emptyList;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/GeronimoOpenTracingFeature.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
similarity index 81%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/GeronimoOpenTracingFeature.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
index badbf4f..7da58ca 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/GeronimoOpenTracingFeature.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
@@ -14,16 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import static java.util.Optional.ofNullable;
 
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.enterprise.context.Dependent;
-import javax.enterprise.inject.spi.CDI;
-import javax.inject.Inject;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.Path;
 import javax.ws.rs.container.DynamicFeature;
@@ -31,27 +28,41 @@
 import javax.ws.rs.core.FeatureContext;
 import javax.ws.rs.ext.Provider;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
 import org.eclipse.microprofile.opentracing.Traced;
 
 import io.opentracing.Tracer;
 
 @Provider
-@Dependent
+// @Dependent
 public class GeronimoOpenTracingFeature implements DynamicFeature {
-
-    @Inject
     private Tracer tracer;
-
-    @Inject
     private GeronimoOpenTracingConfig config;
+    private Container container;
+
+    public void setTracer(final Tracer tracer) {
+        this.tracer = tracer;
+    }
+
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
+    public void setContainer(final Container container) {
+        this.container = container;
+    }
 
     @Override
     public void configure(final ResourceInfo resourceInfo, final FeatureContext context) {
+        if ((tracer == null || config == null) && container == null) {
+            container = Container.get();
+        }
         if (tracer == null) { // configured instead of scanned
-            CDI<Object> cdi = CDI.current();
-            tracer = cdi.select(Tracer.class).get();
-            config = cdi.select(GeronimoOpenTracingConfig.class).get();
+            tracer = container.lookup(Tracer.class);
+        }
+        if (config == null) {
+            config = container.lookup(GeronimoOpenTracingConfig.class);
         }
 
         final Optional<Traced> traced = ofNullable(ofNullable(resourceInfo.getResourceMethod().getAnnotation(Traced.class))
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
similarity index 84%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
index 577c12c..0504a6f 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
@@ -1,4 +1,4 @@
-package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import static java.util.Optional.ofNullable;
 import static java.util.stream.Collectors.toList;
@@ -13,7 +13,6 @@
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
-import javax.inject.Inject;
 import javax.servlet.AsyncEvent;
 import javax.servlet.AsyncListener;
 import javax.servlet.Filter;
@@ -25,9 +24,10 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
-import org.apache.geronimo.microprofile.opentracing.impl.ScopeManagerImpl;
-import org.apache.geronimo.microprofile.opentracing.impl.ServletHeaderTextMap;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.ScopeManagerImpl;
+import org.apache.geronimo.microprofile.opentracing.common.impl.ServletHeaderTextMap;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
 
 import io.opentracing.Scope;
 import io.opentracing.Span;
@@ -36,15 +36,10 @@
 import io.opentracing.tag.Tags;
 
 public class OpenTracingFilter implements Filter {
-
-    @Inject
     private Tracer tracer;
-
-    @Inject
     private GeronimoOpenTracingConfig config;
-
-    @Inject
     private ScopeManagerImpl manager;
+    private Container container;
 
     private Collection<Predicate<String>> forcedUrls;
 
@@ -52,8 +47,36 @@
 
     private boolean skipDefaultTags;
 
+    public void setTracer(final Tracer tracer) {
+        this.tracer = tracer;
+    }
+
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
+    public void setManager(final ScopeManagerImpl manager) {
+        this.manager = manager;
+    }
+
+    public void setContainer(final Container container) {
+        this.container = container;
+    }
+
     @Override
-    public void init(final FilterConfig filterConfig) throws ServletException {
+    public void init(final FilterConfig filterConfig) {
+        if (container == null) {
+            container = Container.get();
+        }
+        if (tracer == null) {
+            tracer = container.lookup(Tracer.class);
+        }
+        if (manager == null) {
+            manager = container.lookup(ScopeManagerImpl.class);
+        }
+        if (config == null) {
+            config = container.lookup(GeronimoOpenTracingConfig.class);
+        }
         skipDefaultTags = Boolean.parseBoolean(config.read("filter.forcedTracing.skipDefaultTags", "false"));
         forcedUrls = ofNullable(config.read("filter.forcedTracing.urls", null))
                 .map(String::trim).filter(v -> !v.isEmpty())
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerRequestFilter.java
similarity index 90%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerRequestFilter.java
index 91aaed1..00c9d42 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerRequestFilter.java
@@ -14,15 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import static java.util.Optional.ofNullable;
 
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerRequestFilter;
 
-import org.apache.geronimo.microprofile.opentracing.impl.JaxRsHeaderTextMap;
-import org.apache.geronimo.microprofile.opentracing.microprofile.client.OpenTracingClientRequestFilter;
+import org.apache.geronimo.microprofile.opentracing.common.impl.JaxRsHeaderTextMap;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter;
 
 import io.opentracing.Scope;
 import io.opentracing.Span;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerResponseFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerResponseFilter.java
similarity index 94%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerResponseFilter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerResponseFilter.java
index d31bb82..b67734c 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerResponseFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingServerResponseFilter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import static java.util.Optional.ofNullable;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/ServletTracingSetup.java
similarity index 89%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/ServletTracingSetup.java
index 824525c..cefdbe0 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/ServletTracingSetup.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import java.util.EnumSet;
 import java.util.Set;
@@ -24,7 +24,7 @@
 import javax.servlet.ServletContainerInitializer;
 import javax.servlet.ServletContext;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
 
 public class ServletTracingSetup implements ServletContainerInitializer {
     @Override
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/OpenTracingExecutorService.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/OpenTracingExecutorService.java
similarity index 97%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/OpenTracingExecutorService.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/OpenTracingExecutorService.java
index 9928fb2..159b999 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/OpenTracingExecutorService.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/OpenTracingExecutorService.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.thread;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.thread;
 
 import static java.util.stream.Collectors.toList;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/ScopePropagatingCallable.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/ScopePropagatingCallable.java
similarity index 95%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/ScopePropagatingCallable.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/ScopePropagatingCallable.java
index bd56c7b..ccc05a8 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/thread/ScopePropagatingCallable.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/thread/ScopePropagatingCallable.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.thread;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.thread;
 
 import java.util.concurrent.Callable;
 
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinConverter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinConverter.java
similarity index 89%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinConverter.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinConverter.java
index cab3bd3..195cff8 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinConverter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinConverter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.zipkin;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin;
 
 import static java.util.Collections.emptyList;
 import static java.util.Locale.ROOT;
@@ -31,42 +31,44 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.Event;
-import javax.enterprise.event.Observes;
-import javax.inject.Inject;
-
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
-import org.apache.geronimo.microprofile.opentracing.impl.FinishedSpan;
-import org.apache.geronimo.microprofile.opentracing.impl.IdGenerator;
-import org.apache.geronimo.microprofile.opentracing.impl.SpanImpl;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.FinishedSpan;
+import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
+import org.apache.geronimo.microprofile.opentracing.common.impl.SpanImpl;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Bus;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Listener;
 
 import io.opentracing.Span;
 import io.opentracing.tag.Tags;
 
 // when writing this observer, opentracing has no standard propagation nor exchange format
 // so falling back on zipkin
-@ApplicationScoped
-public class ZipkinConverter {
-
-    @Inject
-    private Event<ZipkinSpan> zipkinSpanEvent;
-
-    @Inject
+// @ApplicationScoped
+public class ZipkinConverter implements Listener<FinishedSpan> {
+    private Bus<ZipkinSpan> zipkinSpanEvent;
     private GeronimoOpenTracingConfig config;
-
-    @Inject
     private IdGenerator idGenerator;
 
     private String serviceName;
 
-    @PostConstruct
-    private void init() {
+    public void setZipkinSpanEvent(final Bus<ZipkinSpan> zipkinSpanEvent) {
+        this.zipkinSpanEvent = zipkinSpanEvent;
+    }
+
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
+    public void setIdGenerator(final IdGenerator idGenerator) {
+        this.idGenerator = idGenerator;
+    }
+
+    public void init() {
         serviceName = config.read("zipkin.serviceName", getHostName() + "_" + getPid());
     }
 
-    public void onSpan(@Observes final FinishedSpan finishedSpan) {
+    @Override
+    public void onEvent(final FinishedSpan finishedSpan) {
         final Span from = finishedSpan.getSpan();
         if (!SpanImpl.class.isInstance(from)) {
             throw new IllegalStateException("Unsupported span type: " + from + ", maybe check your configuration");
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
similarity index 68%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java
copy to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
index 8a38ecb..7acf2e2 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
@@ -14,23 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.zipkin;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin;
 
 import java.util.logging.Logger;
 
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.event.Observes;
 import javax.inject.Inject;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Listener;
 
 // this allows to integrate with any backend using appenders.
-@ApplicationScoped
-public class ZipkinLogger {
+// @ApplicationScoped
+public class ZipkinLogger implements Listener<ZipkinSpan> {
 
     private final Logger spanLogger = Logger.getLogger("org.apache.geronimo.opentracing.zipkin");
 
@@ -41,14 +38,22 @@
 
     private boolean wrapAsList;
 
-    @PostConstruct
-    private void init() {
-        jsonb = JsonbBuilder.create();
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        this.config = config;
+    }
+
+    public void setJsonb(final Jsonb jsonb) {
+        this.jsonb = jsonb;
+    }
+
+    public void init() {
+        if (jsonb == null) {
+            jsonb = JsonbBuilder.create();
+        }
         wrapAsList = Boolean.parseBoolean(config.read("span.converter.zipkin.logger.wrapAsList", "true"));
     }
 
-    @PreDestroy
-    private void destroy() {
+    public void destroy() {
         try {
             jsonb.close();
         } catch (final Exception e) {
@@ -56,7 +61,8 @@
         }
     }
 
-    public void onZipkinSpan(@Observes final ZipkinSpan zipkinSpan) {
+    @Override
+    public void onEvent(final ZipkinSpan zipkinSpan) {
         final String json = jsonb.toJson(zipkinSpan);
         spanLogger.info(wrapAsList ? '[' + json + ']' : json);
     }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinSpan.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinSpan.java
similarity index 98%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinSpan.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinSpan.java
index 895011b..ba1a555 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinSpan.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinSpan.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.zipkin;
+package org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/package-info.java
similarity index 73%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
copy to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/package-info.java
index c707d27..a0370d8 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/package-info.java
@@ -14,18 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
 
-import io.opentracing.Span;
-
-public class FinishedSpan {
-    private final Span span;
-
-    public FinishedSpan(final Span span) {
-        this.span = span;
-    }
-
-    public Span getSpan() {
-        return span;
-    }
-}
+// give a handle to the package, no other usage
+package org.apache.geronimo.microprofile.opentracing.common;
\ No newline at end of file
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Bus.java
similarity index 73%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
copy to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Bus.java
index c707d27..4ea68d2 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Bus.java
@@ -14,18 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.spi;
 
-import io.opentracing.Span;
-
-public class FinishedSpan {
-    private final Span span;
-
-    public FinishedSpan(final Span span) {
-        this.span = span;
-    }
-
-    public Span getSpan() {
-        return span;
-    }
+public interface Bus<T> {
+    void fire(T event);
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/GeronimoOpenTracingConfig.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
similarity index 63%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/config/GeronimoOpenTracingConfig.java
rename to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
index e86e1d2..6a379f4 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/GeronimoOpenTracingConfig.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.config;
+package org.apache.geronimo.microprofile.opentracing.common.spi;
 
-@FunctionalInterface
-public interface GeronimoOpenTracingConfig {
+import java.util.Iterator;
+import java.util.ServiceLoader;
 
-    String read(String value, String def);
+public interface Container {
+    <T> T lookup(Class<T> type);
 
-    static GeronimoOpenTracingConfig create() {
-        try {
-            return new PrefixedConfig(new OpenTracingConfigMpConfigImpl());
-        } catch (final NoClassDefFoundError | ExceptionInInitializerError cnfe) {
-            return new PrefixedConfig(new DefaultOpenTracingConfig());
+    static Container get() {
+        final Iterator<Container> iterator = ServiceLoader.load(Container.class).iterator();
+        if (!iterator.hasNext()) {
+            throw new IllegalArgumentException("No implementation of Container found");
         }
+        return iterator.next();
     }
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Listener.java
similarity index 73%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
copy to geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Listener.java
index c707d27..b67e8c1 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Listener.java
@@ -14,18 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.spi;
 
-import io.opentracing.Span;
-
-public class FinishedSpan {
-    private final Span span;
-
-    public FinishedSpan(final Span span) {
-        this.span = span;
-    }
-
-    public Span getSpan() {
-        return span;
-    }
+public interface Listener<T> {
+    void onEvent(T event);
 }
diff --git a/geronimo-opentracing-common/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/geronimo-opentracing-common/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
new file mode 100644
index 0000000..4b4f1df
--- /dev/null
+++ b/geronimo-opentracing-common/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.common.microprofile.server.ServletTracingSetup
diff --git a/geronimo-opentracing-common/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider b/geronimo-opentracing-common/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider
new file mode 100644
index 0000000..f531863
--- /dev/null
+++ b/geronimo-opentracing-common/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.common.microprofile.client.GeronimoClientTracingRegistrarProvider
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java b/geronimo-opentracing-common/src/test/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGeneratorTest.java
similarity index 80%
rename from src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
rename to geronimo-opentracing-common/src/test/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGeneratorTest.java
index b9ae7ee..c5531c6 100644
--- a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
+++ b/geronimo-opentracing-common/src/test/java/org/apache/geronimo/microprofile/opentracing/common/impl/IdGeneratorTest.java
@@ -14,18 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.common.impl;
 
-import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.Assert.assertEquals;
 
 import org.testng.annotations.Test;
 
 public class IdGeneratorTest {
     @Test
     public void hex() {
-        assertEquals(16, new IdGenerator() {{
+        assertEquals(new IdGenerator() {{
             config = (value, def) -> "hex";
-            createDelegate();
-        }}.next().toString().length());
+            init();
+        }}.next().toString().length(), 16);
     }
 }
diff --git a/geronimo-opentracing/pom.xml b/geronimo-opentracing/pom.xml
new file mode 100644
index 0000000..0bcbfda
--- /dev/null
+++ b/geronimo-opentracing/pom.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.geronimo</groupId>
+    <artifactId>geronimo-opentracing-parent</artifactId>
+    <version>1.0.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>geronimo-opentracing</artifactId>
+  <name>Geronimo OpenTracing :: Impl</name>
+
+  <properties>
+    <geronimo-opentracing.Automatic-Module-Name>org.apache.geronimo.opentracing</geronimo-opentracing.Automatic-Module-Name>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jcdi_2.0_spec</artifactId>
+      <version>1.0.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-interceptor_1.2_spec</artifactId>
+      <version>1.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo</groupId>
+      <artifactId>geronimo-opentracing-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.microprofile.config</groupId>
+      <artifactId>microprofile-config-api</artifactId>
+      <version>1.2</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.openwebbeans</groupId>
+      <artifactId>openwebbeans-impl</artifactId>
+      <version>2.0.5</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.arquillian.testng</groupId>
+      <artifactId>arquillian-testng-container</artifactId>
+      <version>1.1.13.Final</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.meecrowave</groupId>
+      <artifactId>meecrowave-arquillian</artifactId>
+      <version>1.2.1</version>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.inject</groupId>
+          <artifactId>javax.inject</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.microprofile.opentracing</groupId>
+      <artifactId>microprofile-opentracing-tck</artifactId>
+      <version>1.1</version>
+      <scope>test</scope>
+      <exclusions>
+        <exclusion>
+          <groupId>org.eclipse.microprofile.opentracing</groupId>
+          <artifactId>microprofile-opentracing-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.ws.rs</groupId>
+          <artifactId>javax.ws.rs-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>io.opentracing</groupId>
+          <artifactId>opentracing-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.resteasy</groupId>
+          <artifactId>resteasy-client</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jboss.resteasy</groupId>
+          <artifactId>resteasy-jackson-provider</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.22.1</version>
+        <configuration>
+          <suiteXmlFiles>
+            <suiteXmlFile>${project.basedir}/src/test/resources/tck.xml</suiteXmlFile>
+          </suiteXmlFiles>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java
similarity index 84%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java
index a1d735f..3eb9f1b 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/config/OpenTracingConfigMpConfigImpl.java
@@ -18,14 +18,15 @@
 
 import javax.enterprise.inject.Vetoed;
 
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
 import org.eclipse.microprofile.config.Config;
 import org.eclipse.microprofile.config.ConfigProvider;
 
 @Vetoed
-class OpenTracingConfigMpConfigImpl implements GeronimoOpenTracingConfig {
+public class OpenTracingConfigMpConfigImpl implements GeronimoOpenTracingConfig {
     private final Config config;
 
-    OpenTracingConfigMpConfigImpl() {
+    public OpenTracingConfigMpConfigImpl() {
         config = ConfigProvider.getConfig();
     }
 
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiContainer.java
similarity index 70%
copy from src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
copy to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiContainer.java
index b9ae7ee..4ad5128 100644
--- a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiContainer.java
@@ -16,16 +16,19 @@
  */
 package org.apache.geronimo.microprofile.opentracing.impl;
 
-import static org.testng.AssertJUnit.assertEquals;
+import javax.enterprise.inject.spi.CDI;
 
-import org.testng.annotations.Test;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
 
-public class IdGeneratorTest {
-    @Test
-    public void hex() {
-        assertEquals(16, new IdGenerator() {{
-            config = (value, def) -> "hex";
-            createDelegate();
-        }}.next().toString().length());
+public class CdiContainer implements Container {
+    private final CDI<Object> cdi;
+
+    public CdiContainer() {
+        cdi = CDI.current();
+    }
+
+    @Override
+    public <T> T lookup(final Class<T> type) {
+        return cdi.select(type).get();
     }
 }
diff --git a/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiGeronimoTracer.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiGeronimoTracer.java
new file mode 100644
index 0000000..baafc13
--- /dev/null
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiGeronimoTracer.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.geronimo.microprofile.opentracing.impl;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.FinishedSpan;
+import org.apache.geronimo.microprofile.opentracing.common.impl.GeronimoTracer;
+import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
+
+import io.opentracing.ScopeManager;
+
+@ApplicationScoped
+public class CdiGeronimoTracer extends GeronimoTracer {
+
+    @Inject
+    private ScopeManager scopeManager;
+
+    @Inject
+    private IdGenerator idGenerator;
+
+    @Inject
+    private Event<FinishedSpan> finishedSpanEvent;
+
+    @Inject
+    private GeronimoOpenTracingConfig config;
+
+
+    @PostConstruct
+    public void init() {
+        setConfig(config);
+        setIdGenerator(idGenerator);
+        setScopeManager(scopeManager);
+        setFinishedSpanEvent(finishedSpanEvent::fire);
+        super.init();
+    }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiIdGenerator.java
similarity index 62%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
copy to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiIdGenerator.java
index c707d27..68b9c27 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiIdGenerator.java
@@ -16,16 +16,22 @@
  */
 package org.apache.geronimo.microprofile.opentracing.impl;
 
-import io.opentracing.Span;
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
 
-public class FinishedSpan {
-    private final Span span;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
 
-    public FinishedSpan(final Span span) {
-        this.span = span;
-    }
+@ApplicationScoped
+public class CdiIdGenerator extends IdGenerator {
+    @Inject
+    private GeronimoOpenTracingConfig config;
 
-    public Span getSpan() {
-        return span;
+    @Override
+    @PostConstruct
+    public void init() {
+        setConfig(config);
+        super.init();
     }
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiScopeManagerImpl.java
similarity index 79%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
copy to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiScopeManagerImpl.java
index c707d27..f6e8c57 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/FinishedSpan.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/CdiScopeManagerImpl.java
@@ -16,16 +16,10 @@
  */
 package org.apache.geronimo.microprofile.opentracing.impl;
 
-import io.opentracing.Span;
+import javax.enterprise.context.ApplicationScoped;
 
-public class FinishedSpan {
-    private final Span span;
+import org.apache.geronimo.microprofile.opentracing.common.impl.ScopeManagerImpl;
 
-    public FinishedSpan(final Span span) {
-        this.span = span;
-    }
-
-    public Span getSpan() {
-        return span;
-    }
+@ApplicationScoped
+public class CdiScopeManagerImpl extends ScopeManagerImpl {
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java
similarity index 92%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java
index b275a85..f9c1e0d 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/OpenTracingExtension.java
@@ -35,10 +35,10 @@
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.Path;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
-import org.apache.geronimo.microprofile.opentracing.microprofile.thread.OpenTracingExecutorService;
-import org.apache.geronimo.microprofile.opentracing.microprofile.zipkin.ZipkinConverter;
-import org.apache.geronimo.microprofile.opentracing.microprofile.zipkin.ZipkinLogger;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.thread.OpenTracingExecutorService;
+import org.apache.geronimo.microprofile.opentracing.microprofile.zipkin.CdiZipkinConverter;
+import org.apache.geronimo.microprofile.opentracing.microprofile.zipkin.CdiZipkinLogger;
 import org.eclipse.microprofile.opentracing.Traced;
 
 public class OpenTracingExtension implements Extension {
@@ -54,13 +54,13 @@
         useZipkinLogger = useZipkin && Boolean.parseBoolean(config.read("span.converter.zipkin.logger.active", "true"));
     }
 
-    void zipkinConverterToggle(@Observes final ProcessAnnotatedType<ZipkinConverter> onZipkinConverter) {
+    void zipkinConverterToggle(@Observes final ProcessAnnotatedType<CdiZipkinConverter> onZipkinConverter) {
         if (!useZipkin) {
             onZipkinConverter.veto();
         }
     }
 
-    void zipkinLoggerToggle(@Observes final ProcessAnnotatedType<ZipkinLogger> onZipkinLogger) {
+    void zipkinLoggerToggle(@Observes final ProcessAnnotatedType<CdiZipkinLogger> onZipkinLogger) {
         if (!useZipkinLogger) {
             onZipkinLogger.veto();
         }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorService.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorService.java
similarity index 100%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorService.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorService.java
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
similarity index 92%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
index a7470f0..1506649 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
@@ -16,8 +16,6 @@
  */
 package org.apache.geronimo.microprofile.opentracing.microprofile.cdi;
 
-import io.opentracing.Tracer;
-
 import java.io.Serializable;
 
 import javax.annotation.Priority;
@@ -25,7 +23,9 @@
 import javax.interceptor.Interceptor;
 import javax.interceptor.InvocationContext;
 
-import org.apache.geronimo.microprofile.opentracing.microprofile.thread.ScopePropagatingCallable;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.thread.ScopePropagatingCallable;
+
+import io.opentracing.Tracer;
 
 @Interceptor
 @TracedExecutorService
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedInterceptor.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedInterceptor.java
similarity index 100%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedInterceptor.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedInterceptor.java
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientRequestFilter.java
similarity index 61%
copy from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
copy to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientRequestFilter.java
index a7470f0..6898d96 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/cdi/TracedExecutorServiceInterceptor.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientRequestFilter.java
@@ -14,27 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.microprofile.cdi;
+package org.apache.geronimo.microprofile.opentracing.microprofile.client;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter;
 
 import io.opentracing.Tracer;
 
-import java.io.Serializable;
+@ApplicationScoped
+public class CdiOpenTracingClientRequestFilter extends OpenTracingClientRequestFilter {
 
-import javax.annotation.Priority;
-import javax.inject.Inject;
-import javax.interceptor.Interceptor;
-import javax.interceptor.InvocationContext;
-
-import org.apache.geronimo.microprofile.opentracing.microprofile.thread.ScopePropagatingCallable;
-
-@Interceptor
-@TracedExecutorService
-@Priority(Interceptor.Priority.LIBRARY_AFTER)
-public class TracedExecutorServiceInterceptor implements Serializable {
     @Inject
     private Tracer tracer;
 
-    public Object around(final InvocationContext context) throws Exception {
-        return new ScopePropagatingCallable<>(context::proceed, tracer).call();
+    @Inject
+    private GeronimoOpenTracingConfig config;
+
+    @PostConstruct
+    public void init() {
+        setConfig(config);
+        setTracer(tracer);
+        super.init();
     }
 }
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientResponseFilter.java
similarity index 63%
copy from src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
copy to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientResponseFilter.java
index b9ae7ee..68bf90e 100644
--- a/src/test/java/org/apache/geronimo/microprofile/opentracing/impl/IdGeneratorTest.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/CdiOpenTracingClientResponseFilter.java
@@ -14,18 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.geronimo.microprofile.opentracing.impl;
+package org.apache.geronimo.microprofile.opentracing.microprofile.client;
 
-import static org.testng.AssertJUnit.assertEquals;
+import javax.annotation.Priority;
+import javax.enterprise.context.ApplicationScoped;
+import javax.ws.rs.Priorities;
 
-import org.testng.annotations.Test;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientResponseFilter;
 
-public class IdGeneratorTest {
-    @Test
-    public void hex() {
-        assertEquals(16, new IdGenerator() {{
-            config = (value, def) -> "hex";
-            createDelegate();
-        }}.next().toString().length());
-    }
+@ApplicationScoped
+@Priority(Priorities.HEADER_DECORATOR)
+public class CdiOpenTracingClientResponseFilter extends OpenTracingClientResponseFilter {
 }
diff --git a/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/CdiGeronimoOpenTracingFeature.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/CdiGeronimoOpenTracingFeature.java
new file mode 100644
index 0000000..9188c2f
--- /dev/null
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/CdiGeronimoOpenTracingFeature.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.geronimo.microprofile.opentracing.microprofile.server;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.server.GeronimoOpenTracingFeature;
+
+import io.opentracing.Tracer;
+
+@Provider
+@Dependent
+public class CdiGeronimoOpenTracingFeature extends GeronimoOpenTracingFeature {
+    @Inject
+    @Override
+    public void setTracer(final Tracer tracer) {
+        super.setTracer(tracer);
+    }
+
+    @Inject
+    @Override
+    public void setConfig(final GeronimoOpenTracingConfig config) {
+        super.setConfig(config);
+    }
+}
diff --git a/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinConverter.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinConverter.java
new file mode 100644
index 0000000..bd00795
--- /dev/null
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinConverter.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.geronimo.microprofile.opentracing.microprofile.zipkin;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.enterprise.event.Observes;
+import javax.inject.Inject;
+
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.FinishedSpan;
+import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinConverter;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinSpan;
+
+@ApplicationScoped
+public class CdiZipkinConverter extends ZipkinConverter {
+
+    @Inject
+    private Event<ZipkinSpan> zipkinSpanEvent;
+
+    @Inject
+    private GeronimoOpenTracingConfig config;
+
+    @Inject
+    private IdGenerator idGenerator;
+
+    @PostConstruct
+    public void init() {
+        setConfig(config);
+        setIdGenerator(idGenerator);
+        setZipkinSpanEvent(zipkinSpanEvent::fire);
+        super.init();
+    }
+
+    public void onSpan(@Observes final FinishedSpan finishedSpan) {
+        super.onEvent(finishedSpan);
+    }
+}
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinLogger.java
similarity index 70%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinLogger.java
index 8a38ecb..d5eed2a 100644
--- a/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/ZipkinLogger.java
+++ b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/zipkin/CdiZipkinLogger.java
@@ -16,8 +16,6 @@
  */
 package org.apache.geronimo.microprofile.opentracing.microprofile.zipkin;
 
-import java.util.logging.Logger;
-
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.enterprise.context.ApplicationScoped;
@@ -26,13 +24,13 @@
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinLogger;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinSpan;
 
 // this allows to integrate with any backend using appenders.
 @ApplicationScoped
-public class ZipkinLogger {
-
-    private final Logger spanLogger = Logger.getLogger("org.apache.geronimo.opentracing.zipkin");
+public class CdiZipkinLogger extends ZipkinLogger {
 
     @Inject
     private GeronimoOpenTracingConfig config;
@@ -42,22 +40,18 @@
     private boolean wrapAsList;
 
     @PostConstruct
-    private void init() {
+    public void init() {
+        setConfig(config);
         jsonb = JsonbBuilder.create();
-        wrapAsList = Boolean.parseBoolean(config.read("span.converter.zipkin.logger.wrapAsList", "true"));
+        super.init();
     }
 
     @PreDestroy
-    private void destroy() {
-        try {
-            jsonb.close();
-        } catch (final Exception e) {
-            // no-op
-        }
+    public void destroy() {
+        super.destroy();
     }
 
     public void onZipkinSpan(@Observes final ZipkinSpan zipkinSpan) {
-        final String json = jsonb.toJson(zipkinSpan);
-        spanLogger.info(wrapAsList ? '[' + json + ']' : json);
+        super.onEvent(zipkinSpan);
     }
 }
diff --git a/src/main/java/org/apache/geronimo/microprofile/opentracing/package-info.java b/geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/package-info.java
similarity index 100%
rename from src/main/java/org/apache/geronimo/microprofile/opentracing/package-info.java
rename to geronimo-opentracing/src/main/java/org/apache/geronimo/microprofile/opentracing/package-info.java
diff --git a/src/main/resources/META-INF/beans.xml b/geronimo-opentracing/src/main/resources/META-INF/beans.xml
similarity index 100%
rename from src/main/resources/META-INF/beans.xml
rename to geronimo-opentracing/src/main/resources/META-INF/beans.xml
diff --git a/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/geronimo-opentracing/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
similarity index 100%
rename from src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
rename to geronimo-opentracing/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
diff --git a/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig b/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig
new file mode 100644
index 0000000..836fe3d
--- /dev/null
+++ b/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.config.OpenTracingConfigMpConfigImpl
diff --git a/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container b/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container
new file mode 100644
index 0000000..8b6df9c
--- /dev/null
+++ b/geronimo-opentracing/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.impl.CdiContainer
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/CxfCdiWorkaround.java b/geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/CxfCdiWorkaround.java
similarity index 100%
rename from src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/CxfCdiWorkaround.java
rename to geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/CxfCdiWorkaround.java
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/SkipOpentracingApiSetup.java b/geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/SkipOpentracingApiSetup.java
similarity index 100%
rename from src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/SkipOpentracingApiSetup.java
rename to geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/SkipOpentracingApiSetup.java
diff --git a/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java b/geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
similarity index 94%
rename from src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
rename to geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
index d660c95..d607488 100644
--- a/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
+++ b/geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
@@ -27,10 +27,10 @@
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.Specializes;
 
-import org.apache.geronimo.microprofile.opentracing.impl.FinishedSpan;
-import org.apache.geronimo.microprofile.opentracing.impl.GeronimoTracer;
-import org.apache.geronimo.microprofile.opentracing.impl.SpanContextImpl;
-import org.apache.geronimo.microprofile.opentracing.impl.SpanImpl;
+import org.apache.geronimo.microprofile.opentracing.common.impl.FinishedSpan;
+import org.apache.geronimo.microprofile.opentracing.common.impl.SpanContextImpl;
+import org.apache.geronimo.microprofile.opentracing.common.impl.SpanImpl;
+import org.apache.geronimo.microprofile.opentracing.impl.CdiGeronimoTracer;
 
 import io.opentracing.Span;
 import io.opentracing.SpanContext;
@@ -38,7 +38,7 @@
 // compat for TCK which assume the MockTracer impl for validations
 @Specializes
 @ApplicationScoped
-public class TckTracer extends GeronimoTracer {
+public class TckTracer extends CdiGeronimoTracer {
     private final Collection<Span> spans = new LinkedHashSet<>();
 
     synchronized void onSpan(@Observes final FinishedSpan span) {
diff --git a/src/test/resources/META-INF/geronimo/microprofile/opentracing.properties b/geronimo-opentracing/src/test/resources/META-INF/geronimo/microprofile/opentracing.properties
similarity index 100%
rename from src/test/resources/META-INF/geronimo/microprofile/opentracing.properties
rename to geronimo-opentracing/src/test/resources/META-INF/geronimo/microprofile/opentracing.properties
diff --git a/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/geronimo-opentracing/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
similarity index 100%
rename from src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
rename to geronimo-opentracing/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
diff --git a/src/test/resources/arquillian.xml b/geronimo-opentracing/src/test/resources/arquillian.xml
similarity index 97%
rename from src/test/resources/arquillian.xml
rename to geronimo-opentracing/src/test/resources/arquillian.xml
index 9d21c97..0eb6f40 100644
--- a/src/test/resources/arquillian.xml
+++ b/geronimo-opentracing/src/test/resources/arquillian.xml
@@ -23,7 +23,7 @@
       <property name="tempDir">target/meecrowave/temp</property>
       <property name="jaxrsDefaultProviders">
         com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,
-        org.apache.geronimo.microprofile.opentracing.microprofile.server.GeronimoOpenTracingFeature
+        org.apache.geronimo.microprofile.opentracing.microprofile.server.CdiGeronimoOpenTracingFeature
       </property>
       <property name="scanningExcludes">
         arquillian,
diff --git a/src/test/resources/tck-dev.xml b/geronimo-opentracing/src/test/resources/tck-dev.xml
similarity index 100%
rename from src/test/resources/tck-dev.xml
rename to geronimo-opentracing/src/test/resources/tck-dev.xml
diff --git a/src/test/resources/tck.xml b/geronimo-opentracing/src/test/resources/tck.xml
similarity index 100%
rename from src/test/resources/tck.xml
rename to geronimo-opentracing/src/test/resources/tck.xml
diff --git a/pom.xml b/pom.xml
index 8f2ab28..6a5f53e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,9 +25,10 @@
   </parent>
 
   <groupId>org.apache.geronimo</groupId>
-  <artifactId>geronimo-opentracing</artifactId>
+  <artifactId>geronimo-opentracing-parent</artifactId>
   <version>1.0.1-SNAPSHOT</version>
   <name>Geronimo OpenTracing</name>
+  <packaging>pom</packaging>
 
   <description>
     Apache Geronimo implementation of the Microprofile OpenTracing Specification
@@ -54,18 +55,6 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jcdi_2.0_spec</artifactId>
-      <version>1.0.1</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-interceptor_1.2_spec</artifactId>
-      <version>1.0</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
       <groupId>org.apache.tomcat</groupId>
       <artifactId>tomcat-servlet-api</artifactId>
       <version>9.0.8</version>
@@ -85,13 +74,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.eclipse.microprofile.config</groupId>
-      <artifactId>microprofile-config-api</artifactId>
-      <version>1.2</version>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jsonb_1.0_spec</artifactId>
       <version>1.0</version>
@@ -100,94 +82,37 @@
     </dependency>
 
     <dependency>
-      <groupId>org.apache.openwebbeans</groupId>
-      <artifactId>openwebbeans-impl</artifactId>
-      <version>2.0.5</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.jboss.arquillian.testng</groupId>
-      <artifactId>arquillian-testng-container</artifactId>
-      <version>1.1.13.Final</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.testng</groupId>
       <artifactId>testng</artifactId>
       <version>6.8.21</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.meecrowave</groupId>
-      <artifactId>meecrowave-arquillian</artifactId>
-      <version>1.2.1</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.inject</groupId>
-          <artifactId>javax.inject</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.microprofile.opentracing</groupId>
-      <artifactId>microprofile-opentracing-tck</artifactId>
-      <version>1.1</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>org.eclipse.microprofile.opentracing</groupId>
-          <artifactId>microprofile-opentracing-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.ws.rs</groupId>
-          <artifactId>javax.ws.rs-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>io.opentracing</groupId>
-          <artifactId>opentracing-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jboss.resteasy</groupId>
-          <artifactId>resteasy-client</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jboss.resteasy</groupId>
-          <artifactId>resteasy-jackson-provider</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
   </dependencies>
 
+  <modules>
+    <module>geronimo-opentracing-common</module>
+    <module>geronimo-opentracing</module>
+  </modules>
+
   <build>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.7.0</version>
+        <version>3.8.0</version>
         <configuration>
           <source>1.8</source>
           <target>1.8</target>
         </configuration>
       </plugin>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.21.0</version>
-          <configuration>
-            <suiteXmlFiles>
-              <suiteXmlFile>${project.basedir}/src/test/resources/tck.xml</suiteXmlFile>
-            </suiteXmlFiles>
-          </configuration>
-        </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
-        <version>3.0.2</version>
+        <version>3.1.0</version>
         <configuration>
           <archive combine.children="append">
             <manifestEntries>
-              <Automatic-Module-Name>org.apache.geronimo.opentracing</Automatic-Module-Name>
+              <Automatic-Module-Name>${geronimo-opentracing.Automatic-Module-Name}</Automatic-Module-Name>
             </manifestEntries>
           </archive>
         </configuration>
diff --git a/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
deleted file mode 100644
index 86be236..0000000
--- a/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.geronimo.microprofile.opentracing.microprofile.server.ServletTracingSetup
diff --git a/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider b/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider
deleted file mode 100644
index f0f09c0..0000000
--- a/src/main/resources/META-INF/services/org.eclipse.microprofile.opentracing.ClientTracingRegistrarProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.geronimo.microprofile.opentracing.microprofile.client.GeronimoClientTracingRegistrarProvider