adding parent span id support
diff --git a/README.adoc b/README.adoc
index d8359e7..44c3757 100644
--- a/README.adoc
+++ b/README.adoc
@@ -23,6 +23,7 @@
 |geronimo.opentracing.client.filter.request.skip|Should client instrumentation be ignored|false
 |geronimo.opentracing.client.filter.request.skipDefaultTags|Should `HTTP_METHOD`, `HTTP_URL` not be added to tags|false
 |geronimo.opentracing.client.filter.request.skipPeerTags|Should `PEER_HOSTNAME`, `PEER_PORT` not be added to tags|false
+|geronimo.opentracing.propagation.headers.parentSpanId|Name of the header used to host the parent spanId value|`X-B3-ParentSpanId`
 |geronimo.opentracing.propagation.headers.spanId|Name of the header used to host the spanId value|`X-B3-SpanId`
 |geronimo.opentracing.propagation.headers.traceId|Name of the header used to host the traceId value|`X-B3-TraceId`
 |geronimo.opentracing.propagation.headers.baggagePrefix|Prefix of headers used to host the baggage values|`baggage-`
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java
index 24f8ab0..d15b3b3 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/GeronimoTracer.java
@@ -32,6 +32,8 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MultivaluedMap;
 
+import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
+
 import io.opentracing.Scope;
 import io.opentracing.ScopeManager;
 import io.opentracing.Span;
@@ -40,8 +42,6 @@
 import io.opentracing.propagation.Format;
 import io.opentracing.propagation.TextMap;
 
-import org.apache.geronimo.microprofile.opentracing.config.GeronimoOpenTracingConfig;
-
 @ApplicationScoped
 public class GeronimoTracer implements Tracer {
 
@@ -57,12 +57,14 @@
     @Inject
     private GeronimoOpenTracingConfig config;
 
+    private String parentSpanIdHeader;
     private String spanIdHeader;
     private String traceIdHeader;
     private String baggageHeaderPrefix;
 
     @PostConstruct
     private void init() {
+        parentSpanIdHeader = config.read("propagation.headers.parentSpanId", "X-B3-ParentSpanId");
         spanIdHeader = config.read("propagation.headers.spanId", "X-B3-SpanId");
         traceIdHeader = config.read("propagation.headers.traceId", "X-B3-TraceId");
         baggageHeaderPrefix = config.read("propagation.headers.baggagePrefix", "baggage-");
@@ -81,7 +83,7 @@
     @Override
     public SpanBuilder buildSpan(final String operationName) {
         return new SpanBuilderImpl(
-                this, (traceId, baggages) -> newContext(traceId, idGenerator.next(), baggages),
+                this,
                 span -> finishedSpanEvent.fire(new FinishedSpan(processNewSpan(span))), operationName, idGenerator);
     }
 
@@ -103,8 +105,9 @@
             final MultivaluedMap<String, ?> map = JaxRsHeaderTextMap.class.cast(carrier).getMap();
             final String traceid = (String) map.getFirst(traceIdHeader);
             final String spanid = (String) map.getFirst(spanIdHeader);
+            final String parentspanid = (String) map.getFirst(parentSpanIdHeader);
             if (traceid != null && spanid != null) {
-                return newContext(traceid, spanid, map.keySet().stream().filter(it -> it.startsWith(baggageHeaderPrefix))
+                return newContext(traceid, parentspanid, spanid, map.keySet().stream().filter(it -> it.startsWith(baggageHeaderPrefix))
                         .collect(toMap(identity(), k -> String.valueOf(map.getFirst(k)))));
             }
             return null;
@@ -113,8 +116,10 @@
             final HttpServletRequest req = ServletHeaderTextMap.class.cast(carrier).getRequest();
             final String traceid = req.getHeader(traceIdHeader);
             final String spanid = req.getHeader(spanIdHeader);
+            final String parentspanid = req.getHeader(parentSpanIdHeader);
             if (traceid != null && spanid != null) {
-                return newContext(traceid, spanid, list(req.getHeaderNames()).stream().filter(it -> it.startsWith(baggageHeaderPrefix))
+                return newContext(traceid, parentspanid, spanid, list(req.getHeaderNames()).stream()
+                        .filter(it -> it.startsWith(baggageHeaderPrefix))
                         .collect(toMap(identity(), k -> String.valueOf(req.getHeader(k)))));
             }
             return null;
@@ -125,6 +130,7 @@
         final Iterator<Map.Entry<String, String>> textMap = TextMap.class.cast(carrier).iterator();
         String traceId = null;
         String spanId = null;
+        String parentSpanId = null;
         final Map<String, String> baggages = new HashMap<>();
         while (textMap.hasNext()) {
             final Map.Entry<String, String> next = textMap.next();
@@ -134,10 +140,12 @@
                 spanId = next.getValue();
             } else if (traceIdHeader.equals(next.getKey())) {
                 traceId = next.getValue();
+            } else if (parentSpanIdHeader.equals(next.getKey())) {
+                parentSpanId = next.getValue();
             }
         }
         if (traceId != null && spanId != null) {
-            return newContext(traceId, spanId, baggages);
+            return newContext(traceId, parentSpanId, spanId, baggages);
         }
         return null;
     }
@@ -146,7 +154,8 @@
         return span;
     }
 
-    protected SpanContextImpl newContext(final Object traceId, final Object spanId, final Map<String, String> baggages) {
-        return new SpanContextImpl(traceId, spanId, baggages);
+    protected SpanContextImpl newContext(final Object traceId, final Object parentSpanId,
+                                         final Object spanId, final Map<String, String> baggages) {
+        return new SpanContextImpl(traceId, parentSpanId, spanId, baggages);
     }
 }
diff --git a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java
index 5992bfa..999bda4 100644
--- a/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java
+++ b/geronimo-opentracing-impl/src/main/java/org/apache/geronimo/microprofile/opentracing/impl/SpanBuilderImpl.java
@@ -25,7 +25,6 @@
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.concurrent.TimeUnit;
-import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.stream.StreamSupport;
 
@@ -37,7 +36,7 @@
 
 public class SpanBuilderImpl implements Tracer.SpanBuilder {
 
-    private final Tracer tracer;
+    private final GeronimoTracer tracer;
 
     private final Consumer<SpanImpl> onFinish;
 
@@ -49,18 +48,14 @@
 
     private final IdGenerator idGenerator;
 
-    private final BiFunction<Object, Map<String, String>, SpanContextImpl> contextFactory;
-
     private boolean ignoreActiveSpan;
 
     private long timestamp = -1;
 
-    public SpanBuilderImpl(final Tracer tracer,
-                           final BiFunction<Object, Map<String, String>, SpanContextImpl> contextFactory,
+    public SpanBuilderImpl(final GeronimoTracer tracer,
                            final Consumer<SpanImpl> onFinish, final String operationName,
                            final IdGenerator idGenerator) {
         this.tracer = tracer;
-        this.contextFactory = contextFactory;
         this.onFinish = onFinish;
         this.operationName = operationName;
         this.idGenerator = idGenerator;
@@ -139,14 +134,9 @@
                         false))
                 .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
         final SpanContextImpl context = parent == null ?
-                newSpanContext(baggages, idGenerator.next()) :
-                newSpanContext(baggages, parent.getValue().getTraceId());
-        final Object parentId = parent == null ? null : parent.getValue().getSpanId();
-        return new SpanImpl(operationName, timestamp, references, tags, onFinish, context, parentId);
-    }
-
-    private SpanContextImpl newSpanContext(final Map<String, String> baggages, final Object parent) {
-        return contextFactory.apply(parent, baggages);
+                tracer.newContext(idGenerator.next(), null, idGenerator.next(), baggages) :
+                tracer.newContext(parent.getValue().getTraceId(), parent.getValue().getSpanId(), idGenerator.next(), baggages);
+        return new SpanImpl(operationName, timestamp, references, tags, onFinish, context);
     }
 
     @Override
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 243a9b9..1b61d3d 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
@@ -24,12 +24,15 @@
 
     private final Object traceId;
 
+    private final Object parentSpanId;
+
     private final Object spanId;
 
     private final Map<String, String> baggageItems;
 
-    public SpanContextImpl(final Object traceId, final Object spanId, final Map<String, String> baggageItems) {
+    public SpanContextImpl(final Object traceId, final Object parentSpanId, final Object spanId, final Map<String, String> baggageItems) {
         this.traceId = traceId;
+        this.parentSpanId = parentSpanId;
         this.spanId = spanId;
         this.baggageItems = baggageItems;
     }
@@ -42,6 +45,10 @@
         return traceId;
     }
 
+    public Object getParentSpanId() {
+        return parentSpanId;
+    }
+
     public Object getSpanId() {
         return spanId;
     }
@@ -55,6 +62,7 @@
     public String toString() {
         return "SpanContextImpl{" +
                 "traceId=" + traceId +
+                ", parentSpanId=" + parentSpanId +
                 ", spanId=" + spanId +
                 ", baggageItems=" + baggageItems +
                 '}';
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 d68acfc..3614d4f 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
@@ -40,8 +40,6 @@
 
     private final long startTimestamp;
 
-    private final Object parentId;
-
     private String operationName;
 
     private long finishTimestamp;
@@ -49,13 +47,12 @@
     private final Collection<Log> logs = new ArrayList<>();
 
     public SpanImpl(final String operationName, final long startTimestamp, final Collection<ReferenceImpl> references,
-                    final Map<String, Object> tags, final Consumer<SpanImpl> onFinish, final SpanContextImpl context, final Object parentId) {
+                    final Map<String, Object> tags, final Consumer<SpanImpl> onFinish, final SpanContextImpl context) {
         this.operationName = operationName;
         this.startTimestamp = startTimestamp;
         this.references = references;
         this.tags = tags;
         this.context = context;
-        this.parentId = parentId;
         this.onFinish = onFinish;
     }
 
@@ -141,7 +138,6 @@
     public String toString() {
         return "SpanImpl{" +
                 " id=" + context.getSpanId() +
-                ", parentId=" + parentId +
                 ", operationName='" + operationName + '\'' +
                 ", references=" + references +
                 ", tags=" + tags +
@@ -160,7 +156,7 @@
     }
 
     public Object getParentId() {
-        return parentId;
+        return context.getParentSpanId();
     }
 
     public String getName() {
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 ac47be2..741cb92 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
@@ -54,8 +54,9 @@
     }
 
     @Override
-    protected SpanContextImpl newContext(final Object traceId, final Object spanId, final Map<String, String> baggages) {
-        return new TckSpanContext(traceId, spanId, baggages);
+    protected SpanContextImpl newContext(final Object traceId, final Object parentSpanId,
+                                         final Object spanId, final Map<String, String> baggages) {
+        return new TckSpanContext(traceId, parentSpanId, spanId, baggages);
     }
 
     @Override
@@ -173,8 +174,8 @@
     }
 
     public static class TckSpanContext extends SpanContextImpl {
-        private TckSpanContext(final Object traceId, final Object spanId, final Map<String, String> baggages) {
-            super(traceId, spanId, baggages);
+        private TckSpanContext(final Object traceId, final Object parentSpanId, final Object spanId, final Map<String, String> baggages) {
+            super(traceId, parentSpanId, spanId, baggages);
         }
 
         public Object traceId() {
@@ -182,6 +183,11 @@
             return traceId == null ? 0L : Long.parseLong(traceId.toString());
         }
 
+        public Object parentSpanId() {
+            final Object spanId = getParentSpanId();
+            return spanId == null ? 0L : Long.parseLong(spanId.toString());
+        }
+
         public Object spanId() {
             final Object spanId = getSpanId();
             return spanId == null ? 0L : Long.parseLong(spanId.toString());