diff --git a/geronimo-opentracing-impl/pom.xml b/geronimo-opentracing-impl/pom.xml
deleted file mode 100644
index 08060c9..0000000
--- a/geronimo-opentracing-impl/pom.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?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</artifactId>
-    <groupId>org.apache.geronimo</groupId>
-    <version>1.0.1-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>geronimo-opentracing-impl</artifactId>
-  <name>Geronimo OpenTracing :: Impl</name>
-
-  <properties>
-    <geronimo.jpms.name>org.apache.geronimo.opentracing</geronimo.jpms.name>
-
-    <tck.version>1.1-SNAPSHOT</tck.version>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-microprofile-opentracing-spec</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo</groupId>
-      <artifactId>geronimo-opentracing-spec</artifactId>
-      <version>${project.version}</version>
-      <scope>provided</scope>
-    </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>
-      <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.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>${tck.version}</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.21.0</version>
-        <configuration>
-          <suiteXmlFiles>
-            <suiteXmlFile>${project.basedir}/src/test/resources/tck.xml</suiteXmlFile>
-          </suiteXmlFiles>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/geronimo-opentracing-spec/pom.xml b/geronimo-opentracing-spec/pom.xml
deleted file mode 100644
index acd05fe..0000000
--- a/geronimo-opentracing-spec/pom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>geronimo-opentracing</artifactId>
-    <groupId>org.apache.geronimo</groupId>
-    <version>1.0.1-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
-
-  <artifactId>geronimo-opentracing-spec</artifactId>
-  <name>Geronimo OpenTracing :: OpenTracing Spec</name>
-
-  <properties>
-    <geronimo.jpms.name>io.opentracing.api</geronimo.jpms.name>
-  </properties>
-</project>
\ No newline at end of file
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/References.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/References.java
deleted file mode 100644
index 1091e19..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/References.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 io.opentracing;
-
-public final class References {
-
-    public static final String CHILD_OF = "child_of";
-    public static final String FOLLOWS_FROM = "follows_from";
-
-    private References() {
-        // no-op
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/Scope.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/Scope.java
deleted file mode 100644
index e46a5ed..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/Scope.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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 io.opentracing;
-
-import java.io.Closeable;
-
-/**
- * Abstract a span life.
- */
-public interface Scope extends Closeable {
-
-    /**
-     * remove the span from the manager (active() will not return it anymore).
-     */
-    @Override
-    void close();
-
-    /**
-     * @return the related span.
-     */
-    Span span();
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/ScopeManager.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/ScopeManager.java
deleted file mode 100644
index 7aa512a..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/ScopeManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 io.opentracing;
-
-/**
- * Abstracts span contextuality.
- */
-public interface ScopeManager {
-
-    /**
-     * Set the active span.
-     */
-    Scope activate(Span span, boolean finishSpanOnClose);
-
-    /**
-     * @return current active span.
-     */
-    Scope active();
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/Span.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/Span.java
deleted file mode 100644
index 14778c6..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/Span.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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 io.opentracing;
-
-import java.util.Map;
-
-public interface Span {
-
-    /**
-     * @return the context related to this span.
-     */
-    SpanContext context();
-
-    Span setTag(String key, String value);
-
-    Span setTag(String key, boolean value);
-
-    Span setTag(String key, Number value);
-
-    Span log(Map<String, ?> fields);
-
-    Span log(long timestampMicroseconds, Map<String, ?> fields);
-
-    Span log(String event);
-
-    Span log(long timestampMicroseconds, String event);
-
-    Span setBaggageItem(String key, String value);
-
-    String getBaggageItem(String key);
-
-    Span setOperationName(String operationName);
-
-    void finish();
-
-    void finish(long finishMicros);
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/SpanContext.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/SpanContext.java
deleted file mode 100644
index 2210079..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/SpanContext.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 io.opentracing;
-
-import java.util.Map;
-
-public interface SpanContext {
-
-    /**
-     * @return baggage items related to current span.
-     */
-    Iterable<Map.Entry<String, String>> baggageItems();
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/Tracer.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/Tracer.java
deleted file mode 100644
index 4477984..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/Tracer.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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 io.opentracing;
-
-import io.opentracing.propagation.Format;
-
-public interface Tracer {
-
-    /**
-     * @return current {@link ScopeManager}.
-     */
-    ScopeManager scopeManager();
-
-    /**
-     * @return current {@link Span}.
-     */
-    Span activeSpan();
-
-    /**
-     * @return a new span builder.
-     */
-    SpanBuilder buildSpan(String operationName);
-
-    /**
-     * Inject a span context into a carrier.
-     */
-    <C> void inject(SpanContext spanContext, Format<C> format, C carrier);
-
-    /**
-     * @return the span context from the carrier.
-     */
-    <C> SpanContext extract(Format<C> format, C carrier);
-
-    interface SpanBuilder {
-
-        /**
-         * @return this span builder after having added CHILD_OFF reference.
-         */
-        SpanBuilder asChildOf(SpanContext parent);
-
-        /**
-         * @return this span builder after having added CHILD_OFF reference from the parent.
-         */
-        SpanBuilder asChildOf(Span parent);
-
-        /**
-         * @return this span builder after having added a reference.
-         */
-        SpanBuilder addReference(String referenceType, SpanContext referencedContext);
-
-        /**
-         * @return this span builder flag to ignore implicit CHILD_OFF reference.
-         */
-        SpanBuilder ignoreActiveSpan();
-
-        SpanBuilder withTag(String key, String value);
-
-        SpanBuilder withTag(String key, boolean value);
-
-        SpanBuilder withTag(String key, Number value);
-
-        SpanBuilder withStartTimestamp(long microseconds);
-
-        /**
-         * @return a new scope registered in the scope manager.
-         */
-        Scope startActive(boolean finishSpanOnClose);
-
-        /**
-         * @deprecated replaced by {@link #start} and {@link #startActive}.
-         */
-        @Deprecated
-        Span startManual();
-
-        /**
-         * @return a new scope not registered in the manager.
-         */
-        Span start();
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/log/Fields.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/log/Fields.java
deleted file mode 100644
index 8be899f..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/log/Fields.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 io.opentracing.log;
-
-public final class Fields {
-
-    private Fields() {
-        // no-op
-    }
-
-    public static final String ERROR_KIND = "error.kind";
-
-    public static final String ERROR_OBJECT = "error.object";
-
-    public static final String EVENT = "event";
-
-    public static final String MESSAGE = "message";
-
-    public static final String STACK = "stack";
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/Format.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/Format.java
deleted file mode 100644
index a461c77..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/Format.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 io.opentracing.propagation;
-
-import java.nio.ByteBuffer;
-
-/**
- * Tracer interaction abstraction.
- */
-public interface Format<C> {
-
-    final class Builtin<C> implements Format<C> {
-
-        public final static Format<TextMap> TEXT_MAP = new Builtin<TextMap>("TEXT_MAP");
-
-        public final static Format<TextMap> HTTP_HEADERS = new Builtin<TextMap>("HTTP_HEADERS");
-
-        public final static Format<ByteBuffer> BINARY = new Builtin<ByteBuffer>("BINARY");
-
-        private final String name;
-
-        private Builtin(final String name) {
-            this.name = name;
-        }
-
-        @Override
-        public String toString() {
-            return Builtin.class.getSimpleName() + "." + name;
-        }
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMap.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMap.java
deleted file mode 100644
index 0b26473..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMap.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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 io.opentracing.propagation;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Default carrier (kind of limited map).
- */
-public interface TextMap extends Iterable<Map.Entry<String, String>> {
-
-    Iterator<Map.Entry<String, String>> iterator();
-
-    void put(String key, String value);
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapExtractAdapter.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapExtractAdapter.java
deleted file mode 100644
index 05a07c7..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapExtractAdapter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 io.opentracing.propagation;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Read only TextMap adapter from a map.
- */
-public final class TextMapExtractAdapter implements TextMap {
-
-    private final Map<String, String> map;
-
-    public TextMapExtractAdapter(final Map<String, String> map) {
-        this.map = map;
-    }
-
-    @Override
-    public Iterator<Map.Entry<String, String>> iterator() {
-        return map.entrySet().iterator();
-    }
-
-    @Override
-    public void put(final String key, final String value) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapInjectAdapter.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapInjectAdapter.java
deleted file mode 100644
index e8b611b..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/propagation/TextMapInjectAdapter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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 io.opentracing.propagation;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Write only TextMap adapter from a map.
- */
-public class TextMapInjectAdapter implements TextMap {
-
-    private final Map<String, String> map;
-
-    public TextMapInjectAdapter(final Map<String, String> map) {
-        this.map = map;
-    }
-
-    @Override
-    public Iterator<Map.Entry<String, String>> iterator() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void put(final String key, final String value) {
-        this.map.put(key, value);
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/AbstractTag.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/AbstractTag.java
deleted file mode 100644
index dcac609..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/AbstractTag.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-import io.opentracing.Span;
-
-public abstract class AbstractTag<T> {
-
-    protected final String key;
-
-    public AbstractTag(final String tagKey) {
-        this.key = tagKey;
-    }
-
-    protected abstract void set(Span span, T tagValue);
-
-    public String getKey() {
-        return key;
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/BooleanTag.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/BooleanTag.java
deleted file mode 100644
index ac5f788..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/BooleanTag.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-import io.opentracing.Span;
-
-public class BooleanTag extends AbstractTag<Boolean> {
-
-    public BooleanTag(final String key) {
-        super(key);
-    }
-
-    @Override
-    public void set(final Span span, final Boolean tagValue) {
-        span.setTag(key, tagValue);
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntOrStringTag.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntOrStringTag.java
deleted file mode 100644
index 37f712c..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntOrStringTag.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-import io.opentracing.Span;
-
-public class IntOrStringTag extends IntTag {
-
-    public IntOrStringTag(final String key) {
-        super(key);
-    }
-
-    public void set(final Span span, final String tagValue) {
-        span.setTag(key, tagValue);
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntTag.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntTag.java
deleted file mode 100644
index 53c1ede..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/IntTag.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-import io.opentracing.Span;
-
-public class IntTag extends AbstractTag<Integer> {
-
-    public IntTag(final String key) {
-        super(key);
-    }
-
-    @Override
-    public void set(final Span span, final Integer tagValue) {
-        span.setTag(key, tagValue);
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/StringTag.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/StringTag.java
deleted file mode 100644
index ce2a703..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/StringTag.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-import io.opentracing.Span;
-
-public class StringTag extends AbstractTag<String> {
-
-    public StringTag(final String key) {
-        super(key);
-    }
-
-    @Override
-    public void set(final Span span, final String tagValue) {
-        span.setTag(key, tagValue);
-    }
-}
diff --git a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/Tags.java b/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/Tags.java
deleted file mode 100644
index f482a38..0000000
--- a/geronimo-opentracing-spec/src/main/java/io/opentracing/tag/Tags.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 io.opentracing.tag;
-
-public final class Tags {
-
-    public static final String SPAN_KIND_SERVER = "server";
-    public static final String SPAN_KIND_CLIENT = "client";
-    public static final String SPAN_KIND_PRODUCER = "producer";
-    public static final String SPAN_KIND_CONSUMER = "consumer";
-    public static final StringTag HTTP_URL = new StringTag("http.url");
-    public static final IntTag HTTP_STATUS = new IntTag("http.status_code");
-    public static final StringTag HTTP_METHOD = new StringTag("http.method");
-    public static final IntOrStringTag PEER_HOST_IPV4 = new IntOrStringTag("peer.ipv4");
-    public static final StringTag PEER_HOST_IPV6 = new StringTag("peer.ipv6");
-    public static final StringTag PEER_SERVICE = new StringTag("peer.service");
-    public static final StringTag PEER_HOSTNAME = new StringTag("peer.hostname");
-    public static final IntTag PEER_PORT = new IntTag("peer.port");
-    public static final IntTag SAMPLING_PRIORITY = new IntTag("sampling.priority");
-    public static final StringTag SPAN_KIND = new StringTag("span.kind");
-    public static final StringTag COMPONENT = new StringTag("component");
-    public static final BooleanTag ERROR = new BooleanTag("error");
-    public static final StringTag DB_TYPE = new StringTag("db.type");
-    public static final StringTag DB_INSTANCE = new StringTag("db.instance");
-    public static final StringTag DB_USER = new StringTag("db.user");
-    public static final StringTag DB_STATEMENT = new StringTag("db.statement");
-    public static final StringTag MESSAGE_BUS_DESTINATION = new StringTag("message_bus.destination");
-
-    private Tags() {
-        // no-op
-    }
-}
