diff --git a/geronimo-opentracing-common/pom.xml b/geronimo-opentracing-common/pom.xml
index ce93630..9fe0c60 100644
--- a/geronimo-opentracing-common/pom.xml
+++ b/geronimo-opentracing-common/pom.xml
@@ -35,15 +35,4 @@
   <properties>
     <geronimo-opentracing.Automatic-Module-Name>org.apache.geronimo.opentracing.common</geronimo-opentracing.Automatic-Module-Name>
   </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <version>4.0.0</version>
-        <extensions>true</extensions>
-      </plugin>
-    </plugins>
-  </build>
 </project>
diff --git a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
index 5f5f749..34d18ee 100644
--- a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/config/GeronimoOpenTracingConfig.java
@@ -55,8 +55,7 @@
 
     static GeronimoOpenTracingConfig create() {
         try {
-            final Iterator<GeronimoOpenTracingConfig> iterator = ServiceLoader.load(GeronimoOpenTracingConfig.class)
-                                                                              .iterator();
+            final Iterator<GeronimoOpenTracingConfig> iterator = ServiceLoader.load(GeronimoOpenTracingConfig.class).iterator();
             if (iterator.hasNext()) {
                 return new PrefixedConfig(iterator.next());
             }
diff --git a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
index 7da58ca..33597b6 100644
--- a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/GeronimoOpenTracingFeature.java
@@ -17,8 +17,13 @@
 package org.apache.geronimo.microprofile.opentracing.common.microprofile.server;
 
 import static java.util.Optional.ofNullable;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Optional;
+import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
 import javax.ws.rs.HttpMethod;
@@ -40,6 +45,7 @@
     private Tracer tracer;
     private GeronimoOpenTracingConfig config;
     private Container container;
+    private Collection<Pattern> skipPatterns;
 
     public void setTracer(final Tracer tracer) {
         this.tracer = tracer;
@@ -64,22 +70,32 @@
         if (config == null) {
             config = container.lookup(GeronimoOpenTracingConfig.class);
         }
+        if (skipPatterns == null) {
+            skipPatterns = ofNullable(config.read("mp.opentracing.server.skip-pattern", null))
+                .map(it -> Stream.of(it.split("\\|")).map(String::trim).filter(p -> !p.isEmpty()).map(Pattern::compile).collect(toList()))
+                .orElseGet(Collections::emptyList);
+        }
 
         final Optional<Traced> traced = ofNullable(ofNullable(resourceInfo.getResourceMethod().getAnnotation(Traced.class))
                 .orElseGet(() -> resourceInfo.getResourceClass().getAnnotation(Traced.class)));
         if (!traced.map(Traced::value).orElse(true)) {
             return;
         }
+        final String path = Stream.of(
+                ofNullable(resourceInfo.getResourceClass().getAnnotation(Path.class)).map(Path::value).orElse(""),
+                ofNullable(resourceInfo.getResourceMethod().getAnnotation(Path.class)).map(Path::value).orElse(""))
+                .map(it -> it.substring(it.startsWith("/") ? 1 : 0, it.endsWith("/") ? it.length() - 1 : it.length()))
+                .filter(it -> !it.isEmpty())
+                .collect(joining("/", "/", ""));
+        if (skipPatterns.stream().anyMatch(it -> it.matcher(path).matches())) {
+            return;
+        }
 
         final String operationName = traced.map(Traced::operationName).filter(v -> !v.trim().isEmpty()).orElseGet(() -> {
-            final boolean usePath = Boolean.parseBoolean(config.read("server.filter.request.operationName.usePath", "false"));
-            if (usePath) {
-                final String classPath = ofNullable(resourceInfo.getResourceClass().getAnnotation(Path.class)).map(Path::value)
-                        .orElse("");
-                final String methodPath = ofNullable(resourceInfo.getResourceMethod().getAnnotation(Path.class)).map(Path::value)
-                        .orElse("");
-                return getHttpMethod(resourceInfo) + ':' + classPath
-                        + (!classPath.isEmpty() && !methodPath.isEmpty() && !classPath.endsWith("/") ? "/" : "") + methodPath;
+            if (Boolean.parseBoolean(config.read("server.filter.request.operationName.usePath", "false"))) {
+                return getHttpMethod(resourceInfo) + ':' + getMethodPath(resourceInfo);
+            } else if ("http-path".equals(config.read("mp.opentracing.server.operation-name-provider", null))) {
+                return getMethodPath(resourceInfo);
             }
             return buildDefaultName(resourceInfo);
         });
@@ -92,6 +108,17 @@
                         Boolean.parseBoolean(config.read("server.filter.request.skipDefaultTags", "false"))));
     }
 
+    private String getMethodPath(final ResourceInfo resourceInfo) {
+        final String classPath = ofNullable(resourceInfo.getResourceClass().getAnnotation(Path.class))
+                .map(Path::value).orElse("");
+        final String methodPath = ofNullable(resourceInfo.getResourceMethod().getAnnotation(Path.class))
+                .map(Path::value).orElse("");
+        return Stream.of(classPath, methodPath)
+                     .map(it -> it.substring(it.startsWith("/") ? 1 : 0, it.length() - (it.endsWith("/") ? 1 : 0)))
+                     .filter(it -> !it.isEmpty())
+                     .collect(joining("/", "/", ""));
+    }
+
     private String buildDefaultName(final ResourceInfo resourceInfo) {
         return getHttpMethod(resourceInfo) + ':' + resourceInfo.getResourceClass().getName() + "."
                 + resourceInfo.getResourceMethod().getName();
diff --git a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
index 0504a6f..8de9dd2 100644
--- a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/server/OpenTracingFilter.java
@@ -4,9 +4,13 @@
 import static java.util.stream.Collectors.toList;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -30,6 +34,7 @@
 import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
 
 import io.opentracing.Scope;
+import io.opentracing.ScopeManager;
 import io.opentracing.Span;
 import io.opentracing.Tracer;
 import io.opentracing.propagation.Format;
@@ -38,7 +43,7 @@
 public class OpenTracingFilter implements Filter {
     private Tracer tracer;
     private GeronimoOpenTracingConfig config;
-    private ScopeManagerImpl manager;
+    private ScopeManager manager;
     private Container container;
 
     private Collection<Predicate<String>> forcedUrls;
@@ -46,6 +51,7 @@
     private List<Predicate<String>> skipUrls;
 
     private boolean skipDefaultTags;
+    private boolean forceStackLog;
 
     public void setTracer(final Tracer tracer) {
         this.tracer = tracer;
@@ -55,7 +61,7 @@
         this.config = config;
     }
 
-    public void setManager(final ScopeManagerImpl manager) {
+    public void setManager(final ScopeManager manager) {
         this.manager = manager;
     }
 
@@ -72,12 +78,13 @@
             tracer = container.lookup(Tracer.class);
         }
         if (manager == null) {
-            manager = container.lookup(ScopeManagerImpl.class);
+            manager = container.lookup(ScopeManager.class);
         }
         if (config == null) {
             config = container.lookup(GeronimoOpenTracingConfig.class);
         }
         skipDefaultTags = Boolean.parseBoolean(config.read("filter.forcedTracing.skipDefaultTags", "false"));
+        forceStackLog = Boolean.parseBoolean(config.read("filter.error.forceStackLog", "false"));
         forcedUrls = ofNullable(config.read("filter.forcedTracing.urls", null))
                 .map(String::trim).filter(v -> !v.isEmpty())
                 .map(v -> toMatchingPredicates(v, "forcedTracing"))
@@ -153,14 +160,13 @@
                         final Span span = scope.span();
                         Tags.HTTP_STATUS.set(span,
                                 status == HttpServletResponse.SC_OK ? HttpServletResponse.SC_INTERNAL_SERVER_ERROR : status);
-                        Tags.ERROR.set(span, true);
-                        span.log(new HashMap<String, Object>() {
-
-                            {
-                                put("event", Tags.ERROR.getKey());
-                                put("event.object", ex);
-                            }
-                        });
+                        if (forceStackLog) {
+                            Tags.ERROR.set(span, true);
+                            final Map<String, Object> logs = new LinkedHashMap<>();
+                            logs.put("event", Tags.ERROR.getKey());
+                            logs.put("error.object", ex);
+                            span.log(logs);
+                        }
                     });
             throw ex;
         } finally {
@@ -188,7 +194,17 @@
                             // no-op
                         }
                     });
-                    manager.clear();
+
+                    ScopeManager managerImpl = manager;
+                    if (!ScopeManagerImpl.class.isInstance(managerImpl) && Proxy.isProxyClass(manager.getClass())) {
+                        final InvocationHandler handler = Proxy.getInvocationHandler(manager);
+                        if (Container.Unwrappable.class.isInstance(handler)) {
+                            managerImpl = ScopeManager.class.cast(Container.Unwrappable.class.cast(handler).unwrap());
+                        }
+                    }
+                    if (ScopeManagerImpl.class.isInstance(managerImpl)) {
+                        ScopeManagerImpl.class.cast(managerImpl).clear();
+                    }
                 } else {
                     scope.close();
                 }
diff --git a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
index 7acf2e2..ae73637 100644
--- a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/microprofile/zipkin/ZipkinLogger.java
@@ -18,7 +18,6 @@
 
 import java.util.logging.Logger;
 
-import javax.inject.Inject;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
 
@@ -31,7 +30,6 @@
 
     private final Logger spanLogger = Logger.getLogger("org.apache.geronimo.opentracing.zipkin");
 
-    @Inject
     private GeronimoOpenTracingConfig config;
 
     private Jsonb jsonb;
@@ -53,6 +51,10 @@
         wrapAsList = Boolean.parseBoolean(config.read("span.converter.zipkin.logger.wrapAsList", "true"));
     }
 
+    public Jsonb getJsonb() {
+        return jsonb;
+    }
+
     public void destroy() {
         try {
             jsonb.close();
diff --git a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
index 6a379f4..991b6f1 100644
--- a/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
+++ b/geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/spi/Container.java
@@ -29,4 +29,9 @@
         }
         return iterator.next();
     }
+
+    @FunctionalInterface
+    interface Unwrappable {
+        Object unwrap();
+    }
 }
diff --git a/geronimo-opentracing-osgi/pom.xml b/geronimo-opentracing-osgi/pom.xml
new file mode 100644
index 0000000..d5b1fa7
--- /dev/null
+++ b/geronimo-opentracing-osgi/pom.xml
@@ -0,0 +1,91 @@
+<?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-osgi</artifactId>
+  <packaging>bundle</packaging>
+  <name>Geronimo OpenTracing :: OSGi</name>
+
+  <properties>
+    <geronimo-opentracing.Automatic-Module-Name>org.apache.geronimo.opentracing.osgi</geronimo-opentracing.Automatic-Module-Name>
+
+    <pax.exam.version>4.12.0</pax.exam.version>
+    <slf4j.version>1.7.25</slf4j.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <version>6.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>osgi.cmpn</artifactId>
+      <version>6.0.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.ops4j.pax.exam</groupId>
+      <artifactId>pax-exam-junit4</artifactId>
+      <version>${pax.exam.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.ops4j.pax.exam</groupId>
+      <artifactId>pax-exam-container-karaf</artifactId>
+      <version>${pax.exam.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.ops4j.pax.url</groupId>
+      <artifactId>pax-url-aether</artifactId>
+      <version>1.6.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>${slf4j.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/ConfigAdminOpenTracingConfig.java b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/ConfigAdminOpenTracingConfig.java
new file mode 100644
index 0000000..fc4bfe9
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/ConfigAdminOpenTracingConfig.java
@@ -0,0 +1,46 @@
+/*
+ * 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.osgi;
+
+import static java.util.Optional.ofNullable;
+
+import java.io.IOException;
+
+import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class ConfigAdminOpenTracingConfig implements GeronimoOpenTracingConfig {
+    private volatile Configuration delegate;
+
+    public ConfigAdminOpenTracingConfig() {
+        ofNullable(OpenTracingActivator.INSTANCES.get(ConfigurationAdmin.class))
+                .map(ConfigurationAdmin.class::cast)
+                .ifPresent(admin -> {
+                    try {
+                        delegate = admin.getConfiguration("geronimo.opentracing");
+                    } catch (final IOException e) {
+                        throw new IllegalArgumentException(e);
+                    }
+                });
+    }
+
+    @Override
+    public String read(final String value, final String def) {
+        return ofNullable(delegate).map(c -> c.getProperties().get(value)).map(String::valueOf).orElse(def);
+    }
+}
diff --git a/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OSGiContainer.java b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OSGiContainer.java
new file mode 100644
index 0000000..54c4a83
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OSGiContainer.java
@@ -0,0 +1,27 @@
+/*
+ * 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.osgi;
+
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
+
+public class OSGiContainer implements Container {
+    @Override
+    public <T> T lookup(final Class<T> type) {
+        return type.cast(OpenTracingActivator.INSTANCES.get(type).getInstance());
+    }
+}
diff --git a/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OpenTracingActivator.java b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OpenTracingActivator.java
new file mode 100644
index 0000000..c143d7a
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/OpenTracingActivator.java
@@ -0,0 +1,189 @@
+/*
+ * 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.osgi;
+
+import static java.util.Collections.singletonMap;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.function.BiConsumer;
+
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.container.DynamicFeature;
+
+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 org.apache.geronimo.microprofile.opentracing.common.impl.ScopeManagerImpl;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientResponseFilter;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.server.GeronimoOpenTracingFeature;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinConverter;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinLogger;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.zipkin.ZipkinSpan;
+import org.apache.geronimo.microprofile.opentracing.common.spi.Container;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventConstants;
+import org.osgi.service.event.EventHandler;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+import io.opentracing.ScopeManager;
+import io.opentracing.Tracer;
+
+public class OpenTracingActivator implements BundleActivator {
+    // not sure we can avoid that :(
+    static final Map<Class<?>, Tracked<?>> INSTANCES = new HashMap<>();
+
+    private final Collection<ServiceRegistration<?>> registrations = new ArrayList<>();
+    private ZipkinLogger logger;
+
+    @Override
+    public void start(final BundleContext context) {
+        INSTANCES.put(Container.class, new Tracked<>(context, Container.class, this::register));
+        INSTANCES.put(Tracer.class, new Tracked<>(context, Tracer.class, this::register));
+        INSTANCES.put(GeronimoOpenTracingConfig.class, new Tracked<>(context, GeronimoOpenTracingConfig.class, this::register));
+        INSTANCES.put(ScopeManager.class, new Tracked<>(context, ScopeManager.class, this::register));
+        INSTANCES.put(OpenTracingClientRequestFilter.class, new Tracked<>(context, OpenTracingClientRequestFilter.class, this::register));
+        INSTANCES.put(OpenTracingClientResponseFilter.class, new Tracked<>(context, OpenTracingClientResponseFilter.class, this::register));
+        INSTANCES.put(EventAdmin.class, new Tracked<>(context, EventAdmin.class, this::register));
+        INSTANCES.put(ConfigurationAdmin.class, new Tracked<>(context, ConfigurationAdmin.class, this::register));
+
+        final OSGiContainer container = new OSGiContainer();
+
+        final GeronimoOpenTracingConfig config = new ConfigAdminOpenTracingConfig();
+        final ScopeManager scopeManager = new ScopeManagerImpl();
+
+        final IdGenerator idGenerator = new IdGenerator();
+        idGenerator.setConfig(config);
+        idGenerator.init();
+
+        final GeronimoTracer tracer = new GeronimoTracer();
+        tracer.setConfig(config);
+        tracer.setIdGenerator(idGenerator);
+        tracer.setScopeManager(scopeManager);
+        tracer.setFinishedSpanEvent(span -> container
+                .lookup(EventAdmin.class)
+                .postEvent(new Event("geronimo/microprofile/opentracing/finishedSpan", singletonMap("span", span))));
+        tracer.init();
+
+        final ZipkinConverter zipkinConverter = new ZipkinConverter();
+        zipkinConverter.setConfig(config);
+        zipkinConverter.setIdGenerator(idGenerator);
+        zipkinConverter.setZipkinSpanEvent(span -> container
+                .lookup(EventAdmin.class)
+                .postEvent(new Event("geronimo/microprofile/opentracing/zipkinSpan", singletonMap("span", span))));
+        zipkinConverter.init();
+
+        logger = new ZipkinLogger();
+        logger.setConfig(config);
+        logger.init();
+
+        final OpenTracingClientRequestFilter requestFilter = new OpenTracingClientRequestFilter();
+        requestFilter.setTracer(tracer);
+        requestFilter.setConfig(config);
+        requestFilter.init();
+
+        final OpenTracingClientResponseFilter responseFilter = new OpenTracingClientResponseFilter();
+
+        final GeronimoOpenTracingFeature tracingFeature = new GeronimoOpenTracingFeature();
+        tracingFeature.setConfig(config);
+        tracingFeature.setContainer(container);
+        tracingFeature.setTracer(tracer);
+
+        registrations.add(context.registerService(GeronimoOpenTracingConfig.class, config, new Hashtable<>()));
+        registrations.add(context.registerService(Container.class, container, new Hashtable<>()));
+        registrations.add(context.registerService(IdGenerator.class, idGenerator, new Hashtable<>()));
+        registrations.add(context.registerService(ScopeManager.class, scopeManager, new Hashtable<>()));
+        registrations.add(context.registerService(Tracer.class, tracer, new Hashtable<>()));
+        registrations.add(context.registerService(ClientRequestFilter.class, requestFilter, newJaxRsExtensionProps()));
+        registrations.add(context.registerService(ClientResponseFilter.class, responseFilter, newJaxRsExtensionProps()));
+        registrations.add(context.registerService(DynamicFeature.class, tracingFeature, newJaxRsExtensionProps()));
+        registrations.add(context.registerService(EventHandler.class,
+                event -> zipkinConverter.onEvent(FinishedSpan.class.cast(event.getProperty("span"))),
+                newEventHandlerProps("geronimo/microprofile/opentracing/finishedSpan")));
+        registrations.add(context.registerService(EventHandler.class,
+                event -> logger.onEvent(ZipkinSpan.class.cast(event.getProperty("span"))),
+                newEventHandlerProps("geronimo/microprofile/opentracing/zipkinSpan")));
+    }
+
+    @Override
+    public void stop(final BundleContext context) {
+        INSTANCES.values().forEach(ServiceTracker::close);
+        INSTANCES.clear();
+        registrations.forEach(ServiceRegistration::unregister);
+        logger.destroy();
+    }
+
+    private Dictionary<String, Object> newEventHandlerProps(final String topic) {
+        final Dictionary<String, Object> props = new Hashtable<>();
+        props.put(EventConstants.EVENT_TOPIC, topic);
+        return props;
+    }
+
+    private Dictionary<String, Object> newJaxRsExtensionProps() {
+        final Dictionary<String, Object> props = new Hashtable<>();
+        props.put("osgi.jaxrs.extension", "true");
+        return props;
+    }
+
+    private void register(final Class<?> tClass, final Object t) {
+        final Tracked tracked = INSTANCES.get(tClass);
+        tracked.instance = t;
+    }
+
+    public static class Tracked<T> extends ServiceTracker<T, T> implements ServiceTrackerCustomizer<T, T> {
+        private volatile T instance;
+
+        private Tracked(final BundleContext context, final Class<T> clazz, final BiConsumer<Class<T>, T> onInstance) {
+            super(context, clazz, new ServiceTrackerCustomizer<T, T>() {
+                @Override
+                public T addingService(final ServiceReference<T> reference) {
+                    final T service = context.getService(reference);
+                    onInstance.accept(clazz, service);
+                    return service;
+                }
+
+                @Override
+                public void modifiedService(final ServiceReference<T> reference, final T service) {
+                    addingService(reference);
+                }
+
+                @Override
+                public void removedService(final ServiceReference<T> reference, final T service) {
+                    addingService(reference);
+                }
+            });
+        }
+
+        T getInstance() {
+            return instance;
+        }
+    }
+}
diff --git a/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/package-info.java b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/package-info.java
new file mode 100644
index 0000000..5a00bbc
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/java/org/apache/geronimo/microprofile/opentracing/osgi/package-info.java
@@ -0,0 +1,17 @@
+/*
+ * 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.osgi;
diff --git a/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig b/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig
new file mode 100644
index 0000000..e79f8cc
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.osgi.ConfigAdminOpenTracingConfig
diff --git a/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container b/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container
new file mode 100644
index 0000000..7ae90bd
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/main/resources/META-INF/services/org.apache.geronimo.microprofile.opentracing.common.spi.Container
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.osgi.OSGiContainer
diff --git a/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/KarafTest.java b/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/KarafTest.java
new file mode 100644
index 0000000..d66ac43
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/KarafTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.osgi;
+
+import static org.ops4j.pax.exam.CoreOptions.maven;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.url;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.File;
+import java.net.MalformedURLException;
+
+import javax.inject.Inject;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+
+import io.opentracing.Tracer;
+
+@Ignore("likely need more love to work")
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class KarafTest {
+    @Inject
+    private Tracer tracer;
+
+    @Configuration
+    public Option[] config() throws MalformedURLException {
+        final String karafVersion = "4.2.1";
+        return options(
+                karafDistributionConfiguration()
+                    .frameworkUrl(maven()
+                            .groupId("org.apache.karaf")
+                            .artifactId("apache-karaf")
+                            .version(karafVersion)
+                            .type("tar.gz"))
+                    .unpackDirectory(new File("target/karaf"))
+                    .useDeployFolder(false)
+                    .runEmbedded(true),
+                keepRuntimeFolder(),
+                features(url(new File("src/test/resources/features.xml").toURI().toURL().toExternalForm()), "test")
+        );
+    }
+
+    @Test
+    public void ensureServicesAreRegistered() {
+        assertNotNull(tracer);
+    }
+}
diff --git a/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/endpoint/HiWorld.java b/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/endpoint/HiWorld.java
new file mode 100644
index 0000000..946b0ac
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/test/java/org/apache/geronimo/microprofile/opentracing/osgi/endpoint/HiWorld.java
@@ -0,0 +1,28 @@
+/*
+ * 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.osgi.endpoint;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+@Path("hi")
+public class HiWorld {
+    @GET
+    public String get() {
+        return "world";
+    }
+}
diff --git a/geronimo-opentracing-osgi/src/test/resources/features.xml b/geronimo-opentracing-osgi/src/test/resources/features.xml
new file mode 100644
index 0000000..ae0ed22
--- /dev/null
+++ b/geronimo-opentracing-osgi/src/test/resources/features.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+
+      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.
+-->
+<features name="test-1.0.0"
+          xmlns="http://karaf.apache.org/xmlns/features/v1.3.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="
+            http://karaf.apache.org/xmlns/features/v1.3.0
+            http://karaf.apache.org/xmlns/features/v1.3.0">
+  <repository>mvn:org.ops4j.pax.cdi/pax-cdi-features/1.0.0/xml/features</repository>
+
+  <feature name="test" version="1.0.0" description="Test setup">
+    <feature prerequisite="true">wrap</feature>
+    <feature prerequisite="true">http-whiteboard</feature>
+    <!-- todo placeholders -->
+    <bundle>mvn:org.apache.servicemix.specs:org.apache.servicemix.specs.jaxrs-api-2.1:2.9.1</bundle>
+    <bundle>wrap:mvn:io.opentracing/opentracing-api/0.31.0</bundle>
+    <bundle>mvn:http://repo.apache.maven.org/maven2/!org.eclipse.microprofile.opentracing:microprofile-opentracing-api:1.1</bundle>
+    <bundle start="true">mvn:org.apache.aries.jax.rs/org.apache.aries.jax.rs.whiteboard/1.0.1</bundle>
+  </feature>
+</features>
diff --git a/geronimo-opentracing/pom.xml b/geronimo-opentracing/pom.xml
index 0bcbfda..89e175a 100644
--- a/geronimo-opentracing/pom.xml
+++ b/geronimo-opentracing/pom.xml
@@ -45,6 +45,12 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-atinject_1.0_spec</artifactId>
+      <version>1.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.geronimo</groupId>
       <artifactId>geronimo-opentracing-common</artifactId>
       <version>${project.version}</version>
@@ -61,7 +67,7 @@
     <dependency>
       <groupId>org.apache.openwebbeans</groupId>
       <artifactId>openwebbeans-impl</artifactId>
-      <version>2.0.5</version>
+      <version>2.0.7</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -73,7 +79,7 @@
     <dependency>
       <groupId>org.apache.meecrowave</groupId>
       <artifactId>meecrowave-arquillian</artifactId>
-      <version>1.2.1</version>
+      <version>1.2.3</version>
       <scope>test</scope>
       <exclusions>
         <exclusion>
@@ -85,7 +91,7 @@
     <dependency>
       <groupId>org.eclipse.microprofile.opentracing</groupId>
       <artifactId>microprofile-opentracing-tck</artifactId>
-      <version>1.1</version>
+      <version>1.2</version>
       <scope>test</scope>
       <exclusions>
         <exclusion>
@@ -110,6 +116,12 @@
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.config</groupId>
+      <artifactId>geronimo-config-impl</artifactId>
+      <version>1.2</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/geronimo-opentracing/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
index f9c1e0d..dfd4e1d 100644
--- a/geronimo-opentracing/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
@@ -36,11 +36,16 @@
 import javax.ws.rs.Path;
 
 import org.apache.geronimo.microprofile.opentracing.common.config.GeronimoOpenTracingConfig;
+import org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter;
+import org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientResponseFilter;
 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;
 
+import io.opentracing.ScopeManager;
+
 public class OpenTracingExtension implements Extension {
 
     private GeronimoOpenTracingConfig config;
@@ -54,6 +59,41 @@
         useZipkinLogger = useZipkin && Boolean.parseBoolean(config.read("span.converter.zipkin.logger.active", "true"));
     }
 
+    void vetoDefaultConfigIfScanned(@Observes final ProcessAnnotatedType<GeronimoOpenTracingConfig> config) {
+        if (config.getAnnotatedType().getJavaClass().getName()
+                  .equals("org.apache.geronimo.microprofile.opentracing.common.config.DefaultOpenTracingConfig")) {
+            config.veto();
+        }
+    }
+
+    void vetoDefaultScopeManagerIfScanned(@Observes final ProcessAnnotatedType<ScopeManager> manager) {
+        if (manager.getAnnotatedType().getJavaClass().getName()
+                  .equals("org.apache.geronimo.microprofile.opentracing.common.impl.ScopeManagerImpl")) {
+            manager.veto();
+        }
+    }
+
+    void vetoDefaultIdGeneratorIfScanned(@Observes final ProcessAnnotatedType<IdGenerator> generator) {
+        if (generator.getAnnotatedType().getJavaClass().getName()
+                  .equals("org.apache.geronimo.microprofile.opentracing.common.impl.IdGenerator")) {
+            generator.veto();
+        }
+    }
+
+    void vetoClientRequestTracingIfScanned(@Observes final ProcessAnnotatedType<OpenTracingClientRequestFilter> clientFilter) {
+        if (clientFilter.getAnnotatedType().getJavaClass().getName()
+                  .equals("org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientRequestFilter")) {
+            clientFilter.veto();
+        }
+    }
+
+    void vetoClientResponseTracingIfScanned(@Observes final ProcessAnnotatedType<OpenTracingClientResponseFilter> clientFilter) {
+        if (clientFilter.getAnnotatedType().getJavaClass().getName()
+                  .equals("org.apache.geronimo.microprofile.opentracing.common.microprofile.client.OpenTracingClientResponseFilter")) {
+            clientFilter.veto();
+        }
+    }
+
     void zipkinConverterToggle(@Observes final ProcessAnnotatedType<CdiZipkinConverter> onZipkinConverter) {
         if (!useZipkin) {
             onZipkinConverter.veto();
diff --git a/geronimo-opentracing/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
index 80d3f1a..917946f 100644
--- a/geronimo-opentracing/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
@@ -16,10 +16,14 @@
  */
 package org.apache.geronimo.microprofile.opentracing.microprofile.cdi;
 
+import static java.util.Collections.singletonMap;
 import static java.util.Objects.requireNonNull;
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -37,7 +41,9 @@
 import org.eclipse.microprofile.opentracing.Traced;
 
 import io.opentracing.Scope;
+import io.opentracing.Span;
 import io.opentracing.Tracer;
+import io.opentracing.tag.Tags;
 
 @Traced
 @Interceptor
@@ -81,8 +87,24 @@
         if (parent != null) {
             spanBuilder.asChildOf(parent.span());
         }
-        try (final Scope scope = spanBuilder.startActive(true)) {
+        Scope scope = null;
+        try {
+            scope = spanBuilder.startActive(true);
             return context.proceed();
+        } catch (final RuntimeException re) {
+            if (scope != null) {
+                final Span span = scope.span();
+                Tags.ERROR.set(span, true);
+                final Map<String, Object> logs = new LinkedHashMap<>();
+                logs.put("event", Tags.ERROR.getKey());
+                logs.put("error.object", re);
+                span.log(logs);
+            }
+            throw re;
+        } finally {
+            if (scope != null) {
+                scope.close();
+            }
         }
     }
 
diff --git a/geronimo-opentracing/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
deleted file mode 100644
index d43eec7..0000000
--- a/geronimo-opentracing/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/CxfCdiWorkaround.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.apache.geronimo.microprofile.opentracing.tck.setup;
-
-import static java.util.stream.Collectors.toMap;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-
-import javax.enterprise.context.ApplicationScoped;
-
-import org.apache.cxf.cdi.extension.JAXRSServerFactoryCustomizationExtension;
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
-import org.apache.cxf.message.Message;
-
-@ApplicationScoped
-public class CxfCdiWorkaround implements JAXRSServerFactoryCustomizationExtension {
-    @Override
-    public void customize(final JAXRSServerFactoryBean bean) {
-        final Map<Class<?>, ResourceProvider> providers = getProviders(bean);
-        final Map<Class<?>, ResourceProvider> workaround = providers.entrySet().stream()
-                .collect(toMap(Map.Entry::getKey, e -> new WorkaroundProvider(e.getValue())));
-        providers.clear();
-        providers.putAll(workaround);
-    }
-
-    private Map<Class<?>, ResourceProvider> getProviders(final JAXRSServerFactoryBean bean) {
-        try {
-            final Field f = JAXRSServerFactoryBean.class.getDeclaredField("resourceProviders");
-            f.setAccessible(true);
-            return (Map<Class<?>, ResourceProvider>) f.get(bean);
-        } catch (final Exception e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
-    private static class WorkaroundProvider implements ResourceProvider {
-        private final ResourceProvider delegate;
-
-        private WorkaroundProvider(final ResourceProvider value) {
-            this.delegate = value;
-        }
-
-        @Override
-        public Object getInstance(final Message m) {
-            return delegate.getInstance(m);
-        }
-
-        @Override
-        public void releaseInstance(final Message m, final Object o) {
-            // no-op: don't release otherwise we are not thread safe for @Dependent, this leaks but ok in *this* context
-        }
-
-        @Override
-        public Class<?> getResourceClass() {
-            return delegate.getResourceClass();
-        }
-
-        @Override
-        public boolean isSingleton() {
-            return true;
-        }
-    }
-}
diff --git a/geronimo-opentracing/src/test/resources/tck-dev.xml b/geronimo-opentracing/src/test/resources/tck-dev.xml
index d79e780..98e5909 100644
--- a/geronimo-opentracing/src/test/resources/tck-dev.xml
+++ b/geronimo-opentracing/src/test/resources/tck-dev.xml
@@ -16,11 +16,10 @@
     limitations under the License.
 -->
 <suite name="microprofile-opentracing-TCK" verbose="2" configfailurepolicy="continue">
-  <test name="microprofile-opentracing 1.0 TCK">
+  <test name="microprofile-opentracing TCK">
     <classes>
-      <class name="org.eclipse.microprofile.opentracing.tck.OpentracingClientTests">
+      <class name="org.eclipse.microprofile.opentracing.tck.OpenTracingHTTPPathNameTests">
         <methods>
-          <include name="testMultithreadedNestedSpans"/>
         </methods>
       </class>
     </classes>
diff --git a/pom.xml b/pom.xml
index 6a5f53e..32d243f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
     <dependency>
       <groupId>org.eclipse.microprofile.opentracing</groupId>
       <artifactId>microprofile-opentracing-api</artifactId>
-      <version>1.1</version>
+      <version>1.2</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
@@ -92,11 +92,18 @@
   <modules>
     <module>geronimo-opentracing-common</module>
     <module>geronimo-opentracing</module>
+    <module>geronimo-opentracing-osgi</module>
   </modules>
 
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>4.1.0</version>
+        <extensions>true</extensions>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.0</version>
