moving to an intializer for the filter + closing properly the scope for client
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java
index b97ee0f..07036ff 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/ReferenceImpl.java
@@ -34,4 +34,12 @@
     public SpanContextImpl getValue() {
         return value;
     }
+
+    @Override
+    public String toString() {
+        return "ReferenceImpl{" +
+                "type='" + type + '\'' +
+                ", value=" + value +
+                '}';
+    }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java
index bc71855..7f76311 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanContextImpl.java
@@ -51,13 +51,24 @@
         return baggageItems.entrySet();
     }
 
+    @Override
+    public String toString() {
+        return "SpanContextImpl{" +
+                "traceId=" + traceId +
+                ", spanId=" + spanId +
+                ", baggageItems=" + baggageItems +
+                '}';
+    }
+
     @Deprecated // TCK
     public Object traceId() {
-        return getTraceId();
+        final Object traceId = getTraceId();
+        return traceId == null ? 0L : Long.parseLong(traceId.toString());
     }
 
     @Deprecated // TCK
     public Object spanId() {
-        return getSpanId();
+        final Object spanId = getSpanId();
+        return spanId == null ? 0L : Long.parseLong(spanId.toString());
     }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java
index 573e4bb..e8220ca 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanImpl.java
@@ -84,6 +84,9 @@
 
     @Override
     public void finish(final long finishMicros) {
+        if (finishTimestamp != 0) {
+            return;
+        }
         finishTimestamp = finishMicros;
         onFinish.accept(this);
     }
@@ -133,6 +136,20 @@
         return this;
     }
 
+    @Override
+    public String toString() {
+        return "SpanImpl{" +
+                " id=" + context.getSpanId() +
+                ", parentId=" + parentId +
+                ", operationName='" + operationName + '\'' +
+                ", references=" + references +
+                ", tags=" + tags +
+                ", startTimestamp=" + startTimestamp +
+                ", finishTimestamp=" + finishTimestamp +
+                ", logs=" + logs +
+                '}';
+    }
+
     @Deprecated // TCK compat
     public long startMicros() {
         return startTimestamp;
@@ -150,7 +167,7 @@
 
     @Deprecated // TCK compat
     public Object parentId() {
-        return parentId == null ? 0L : parentId;
+        return parentId == null ? 0L : Long.parseLong(parentId.toString());
     }
 
     @Deprecated // TCK compat
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java
index 309a3dd..cefeb30 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/GeronimoClientTracingRegistrarProvider.java
@@ -42,16 +42,23 @@
 
     @Override
     public ClientBuilder configure(final ClientBuilder builder) {
-        return builder.register(requestFilter).register(responseFilter);
+        return configure(builder, new SyncExecutor());
     }
 
     @Override
     public ClientBuilder configure(final ClientBuilder builder, final ExecutorService executorService) {
-        final ExecutorService executor = wrapExecutor(executorService);
-        return configure(builder).property("executorService" /* cxf */, executor);
+        if (builder.getConfiguration().getInstances().stream().anyMatch(it -> requestFilter == it)) {
+            return builder;
+        }
+        return builder.register(requestFilter).register(responseFilter)
+                // todo: reflection for jersey+resteasy to do the same or PR to support that property
+                .property("executorService" /* cxf */, wrapExecutor(executorService));
     }
 
     private ExecutorService wrapExecutor(final ExecutorService executorService) {
+        if (OpenTracingExecutorService.class.isInstance(executorService)) {
+            return executorService;
+        }
         return new OpenTracingExecutorService(executorService, tracer);
     }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java
index e009e90..637ab74 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientRequestFilter.java
@@ -28,6 +28,7 @@
 
 import org.apache.geronimo.microprofile.opentracing.impl.HeaderTextMap;
 
+import io.opentracing.Scope;
 import io.opentracing.Span;
 import io.opentracing.SpanContext;
 import io.opentracing.Tracer;
@@ -54,16 +55,15 @@
         ofNullable(SpanContext.class.cast(context.getProperty(CHILD_OF)))
                 .ifPresent(parent -> builder.ignoreActiveSpan().asChildOf(parent));
 
-        final Span span = builder.start();
-        if (span == null) {
-            return;
-        }
-
-        span.setOperationName(context.getUri().getPath());
+        final Scope scope = builder.startActive(true);
+        final Span span = scope.span();
         if (!"true".equalsIgnoreCase(
                 String.valueOf(context.getProperty("org.apache.geronimo.microprofile.opentracing.client.skipDefaultSpanTags")))) {
             Tags.HTTP_METHOD.set(span, context.getMethod());
             Tags.HTTP_URL.set(span, context.getUri().toASCIIString());
+        }
+        if ("true".equalsIgnoreCase(
+                String.valueOf(context.getProperty("org.apache.geronimo.microprofile.opentracing.client.addPeerTags")))) {
             Tags.PEER_HOSTNAME.set(span, context.getUri().getHost());
             Tags.PEER_PORT.set(span, context.getUri().getPort());
         }
@@ -72,7 +72,7 @@
                 .ifPresent(consumer -> Consumer.class.cast(consumer).accept(span));
 
         tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new HeaderTextMap<>(context.getHeaders()));
-        context.setProperty(OpenTracingClientRequestFilter.class.getName(), span);
+        context.setProperty(OpenTracingClientRequestFilter.class.getName(), scope);
 
     }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java
index 4f9a528..8b56c4d 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/OpenTracingClientResponseFilter.java
@@ -25,7 +25,7 @@
 import javax.ws.rs.client.ClientResponseContext;
 import javax.ws.rs.client.ClientResponseFilter;
 
-import io.opentracing.Span;
+import io.opentracing.Scope;
 import io.opentracing.tag.Tags;
 
 @ApplicationScoped
@@ -34,9 +34,10 @@
 
     @Override
     public void filter(final ClientRequestContext req, final ClientResponseContext resp) {
-        ofNullable(req.getProperty(OpenTracingClientRequestFilter.class.getName())).map(Span.class::cast).map(span -> {
-            Tags.HTTP_STATUS.set(span, resp.getStatus());
-            return span;
-        }).ifPresent(Span::finish);
+        ofNullable(req.getProperty(OpenTracingClientRequestFilter.class.getName())).map(Scope.class::cast)
+                .ifPresent(scope -> {
+                    Tags.HTTP_STATUS.set(scope.span(), resp.getStatus());
+                    scope.close();
+                });
     }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java
new file mode 100644
index 0000000..916c4fd
--- /dev/null
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/client/SyncExecutor.java
@@ -0,0 +1,64 @@
+/*
+ * 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.client;
+
+import static java.util.Collections.emptyList;
+
+import java.util.List;
+import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class SyncExecutor extends AbstractExecutorService {
+    private volatile boolean shutdown;
+    private final CountDownLatch latch = new CountDownLatch(1);
+
+    @Override
+    public void shutdown() {
+        shutdown = true;
+        latch.countDown();
+    }
+
+    @Override
+    public List<Runnable> shutdownNow() {
+        return emptyList();
+    }
+
+    @Override
+    public boolean isShutdown() {
+        return shutdown;
+    }
+
+    @Override
+    public boolean isTerminated() {
+        return shutdown;
+    }
+
+    @Override
+    public boolean awaitTermination(final long timeout, final TimeUnit unit) {
+        try {
+            return latch.await(timeout, unit);
+        } catch (final InterruptedException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public void execute(final Runnable command) {
+        command.run();
+    }
+}
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java
index 4a0476f..a2475ae 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingFilter.java
@@ -5,7 +5,6 @@
 import java.io.IOException;
 import java.util.HashMap;
 
-import javax.enterprise.context.Dependent;
 import javax.inject.Inject;
 import javax.servlet.AsyncEvent;
 import javax.servlet.AsyncListener;
@@ -14,7 +13,6 @@
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
-import javax.servlet.annotation.WebFilter;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -22,8 +20,6 @@
 import io.opentracing.Tracer;
 import io.opentracing.tag.Tags;
 
-@Dependent
-@WebFilter(asyncSupported = true, urlPatterns = "/*") // todo: move to initializer
 public class OpenTracingFilter implements Filter {
 
     @Inject
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java
index 9f642ed..d58fa02 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/OpenTracingServerRequestFilter.java
@@ -53,7 +53,7 @@
 
         ofNullable(ofNullable(tracer.activeSpan()).map(Span::context)
                 .orElseGet(() -> tracer.extract(Format.Builtin.HTTP_HEADERS, new HeaderTextMap<>(context.getHeaders()))))
-                        .ifPresent(builder::asChildOf);
+                .ifPresent(builder::asChildOf);
 
         final Span span = builder.startActive(true).span();
         if (!"true".equalsIgnoreCase(
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java
new file mode 100644
index 0000000..a0e01fd
--- /dev/null
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/microprofile/server/ServletTracingSetup.java
@@ -0,0 +1,34 @@
+/*
+ * 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 java.util.EnumSet;
+import java.util.Set;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.FilterRegistration;
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+
+public class ServletTracingSetup implements ServletContainerInitializer {
+    @Override
+    public void onStartup(final Set<Class<?>> c, final ServletContext ctx) {
+        final FilterRegistration.Dynamic opentracing = ctx.addFilter("opentracing", OpenTracingFilter.class);
+        opentracing.setAsyncSupported(true);
+        opentracing.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
+    }
+}
diff --git a/geronimo-opentracing-impl/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/geronimo-opentracing-impl/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
new file mode 100644
index 0000000..86be236
--- /dev/null
+++ b/geronimo-opentracing-impl/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer
@@ -0,0 +1 @@
+org.apache.geronimo.microprofile.opentracing.microprofile.server.ServletTracingSetup
diff --git a/geronimo-opentracing-impl/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java b/geronimo-opentracing-impl/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
index 43ffc79..32485a9 100644
--- a/geronimo-opentracing-impl/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
+++ b/geronimo-opentracing-impl/src/test/java/org/apache/geronimo/microprofile/opentracing/tck/setup/TckTracer.java
@@ -18,6 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashSet;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.event.Observes;
@@ -32,7 +33,7 @@
 @Specializes
 @ApplicationScoped
 public class TckTracer extends GeronimoTracer {
-    private final Collection<Span> spans = new ArrayList<>();
+    private final Collection<Span> spans = new LinkedHashSet<>();
 
     synchronized void onSpan(@Observes final FinishedSpan span) {
         spans.add(span.getSpan());
diff --git a/geronimo-opentracing-impl/src/test/resources/tck-dev.xml b/geronimo-opentracing-impl/src/test/resources/tck-dev.xml
index 4eaf9f6..d79e780 100644
--- a/geronimo-opentracing-impl/src/test/resources/tck-dev.xml
+++ b/geronimo-opentracing-impl/src/test/resources/tck-dev.xml
@@ -20,7 +20,7 @@
     <classes>
       <class name="org.eclipse.microprofile.opentracing.tck.OpentracingClientTests">
         <methods>
-          <include name="testException" />
+          <include name="testMultithreadedNestedSpans"/>
         </methods>
       </class>
     </classes>