diff --git a/just-some-usage-code-that-must-compile/SomeUsageOfExplicitApi.hs b/just-some-usage-code-that-must-compile/SomeUsageOfExplicitApi.hs
deleted file mode 100644
--- a/just-some-usage-code-that-must-compile/SomeUsageOfExplicitApi.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
-module SomeUsageOfExplicitApi where
-
-import Control.Concurrent
-import OpenTelemetry.Explicit
-import OpenTelemetry.FileExporter
-
-main :: IO ()
-main = do
-  exporter <- createFileSpanExporter "helloworld.trace"
-  ot <- createOpenTelemetryClient exporter
-  --
-  mainSpan <- startRootSpan ot "main"
-  threadDelay 10000
-  warmUpSpan <- startChildSpan ot mainSpan "warm up the cache"
-  threadDelay 5000
-  addEvent ot warmUpSpan "still cold"
-  threadDelay 10000
-  addEvent ot warmUpSpan "warm now"
-  setTag ot warmUpSpan "size" 9001
-  endSpan ot warmUpSpan
-  dataScienceSpan <- startChildSpan ot mainSpan "perform data science"
-  threadDelay 100000
-  setTag ot dataScienceSpan "reviews" 0
-  endSpan ot dataScienceSpan
-  threadDelay 10000
-  endSpan ot mainSpan
diff --git a/just-some-usage-code-that-must-compile/SomeUsageOfImplicitApi.hs b/just-some-usage-code-that-must-compile/SomeUsageOfImplicitApi.hs
--- a/just-some-usage-code-that-must-compile/SomeUsageOfImplicitApi.hs
+++ b/just-some-usage-code-that-must-compile/SomeUsageOfImplicitApi.hs
@@ -43,7 +43,7 @@
   addEvent "log" "rpc roundtrip end"
   withSpan "project" $ do
     -- Connecting spans across threads requires some manual plumbing
-    sp <- getCurrentActiveSpan
+    Just sp <- getCurrentActiveSpan
     asyncWork <- async $ withChildSpanOf sp "data science" $ do
       threadDelay 1000000
       pure 42
diff --git a/opentelemetry.cabal b/opentelemetry.cabal
--- a/opentelemetry.cabal
+++ b/opentelemetry.cabal
@@ -2,7 +2,7 @@
 name:                opentelemetry
 description:         The OpenTelemetry Haskell Client https://opentelemetry.io
 category:            OpenTelemetry
-version:             0.1.0
+version:             0.2.0
 license-file:        LICENSE
 license:             Apache-2.0
 author:              Dmitry Ivanov
@@ -63,7 +63,6 @@
   exposed-modules:
     OpenTelemetry.Common
     OpenTelemetry.Debug
-    OpenTelemetry.Explicit
     OpenTelemetry.FileExporter
     OpenTelemetry.Implicit
     OpenTelemetry.Propagation
@@ -74,7 +73,6 @@
   main-is:    Main.hs
   other-modules:
     SomeUsageOfImplicitApi
-    SomeUsageOfExplicitApi
   hs-source-dirs: just-some-usage-code-that-must-compile
   build-depends:
     base,
diff --git a/src/OpenTelemetry/Common.hs b/src/OpenTelemetry/Common.hs
--- a/src/OpenTelemetry/Common.hs
+++ b/src/OpenTelemetry/Common.hs
@@ -80,6 +80,9 @@
 instance ToTagValue String where
   toTagValue = StringTagValue . T.pack
 
+instance ToTagValue T.Text where
+  toTagValue = StringTagValue
+
 instance ToTagValue Bool where
   toTagValue = BoolTagValue
 
@@ -98,9 +101,6 @@
         spanParentId :: Maybe SpanId
       }
   deriving (Show, Eq)
-
-emptySpan :: Span
-emptySpan = Span (SpanContext (SId 0) (TId 0)) "" 0 0 mempty mempty OK Nothing
 
 spanTraceId :: Span -> TraceId
 spanTraceId Span {spanContext = SpanContext _ tid} = tid
diff --git a/src/OpenTelemetry/Explicit.hs b/src/OpenTelemetry/Explicit.hs
deleted file mode 100644
--- a/src/OpenTelemetry/Explicit.hs
+++ /dev/null
@@ -1,49 +0,0 @@
-module OpenTelemetry.Explicit
-  ( startRootSpan,
-    startChildSpan,
-    endSpan,
-    setTag,
-    addEvent,
-    createOpenTelemetryClient,
-  )
-where
-
-import qualified Data.Text as T
-import GHC.Conc
-import OpenTelemetry.Common
-import System.Random
-
-data Client
-  = Client
-      { cTracer :: Tracer ThreadId,
-        cSpanExporter :: Exporter Span
-      }
-
-startRootSpan :: Client -> T.Text -> IO Span
-startRootSpan _tracer name = do
-  timestamp <- now64
-  sid <- randomIO
-  pure $! Span (SpanContext (SId sid) (TId sid)) name timestamp 0 mempty mempty OK Nothing
-
-startChildSpan :: Client -> Span -> T.Text -> IO Span
-startChildSpan _tracer parent name = do
-  timestamp <- now64
-  sid <- randomIO
-  pure $! Span (SpanContext (SId sid) (spanTraceId parent)) name timestamp 0 mempty mempty OK (Just $ spanId parent)
-
-endSpan :: Client -> Span -> IO ()
-endSpan _tracer sp = do
-  timestamp <- now64
-  pure $! sp {spanFinishedAt = timestamp}
-  pure ()
-
-setTag :: Monad m => Client -> Span -> T.Text -> value -> m ()
-setTag _tracer _span _key _value = pure ()
-
-addEvent :: Monad m => Client -> Span -> T.Text -> m ()
-addEvent _tracer _span _name = pure ()
-
-createOpenTelemetryClient :: Exporter Span -> IO Client
-createOpenTelemetryClient e = do
-  t <- createTracer
-  pure $ Client t e
diff --git a/src/OpenTelemetry/Implicit.hs b/src/OpenTelemetry/Implicit.hs
--- a/src/OpenTelemetry/Implicit.hs
+++ b/src/OpenTelemetry/Implicit.hs
@@ -8,7 +8,6 @@
 import Control.Monad.IO.Class
 import qualified Data.HashMap.Strict as HM
 import Data.List.NonEmpty (NonEmpty ((:|)))
-import Data.Maybe
 import qualified Data.Text as T
 import OpenTelemetry.Common
 import OpenTelemetry.FileExporter
@@ -122,11 +121,11 @@
   GlobalSharedMutableState {..} <- liftIO $ readMVar globalSharedMutableState
   pure $ spanContext <$> tracerGetCurrentActiveSpan gTracer tid
 
-getCurrentActiveSpan :: MonadIO m => m Span
+getCurrentActiveSpan :: MonadIO m => m (Maybe Span)
 getCurrentActiveSpan = do
   tid <- liftIO myThreadId
   GlobalSharedMutableState {..} <- liftIO $ readMVar globalSharedMutableState
-  pure $ fromMaybe emptySpan $ tracerGetCurrentActiveSpan gTracer tid
+  pure $ tracerGetCurrentActiveSpan gTracer tid
 
 modifyCurrentSpan :: MonadIO m => (Span -> Span) -> m ()
 modifyCurrentSpan f = liftIO $ do
diff --git a/src/OpenTelemetry/Propagation.hs b/src/OpenTelemetry/Propagation.hs
--- a/src/OpenTelemetry/Propagation.hs
+++ b/src/OpenTelemetry/Propagation.hs
@@ -19,8 +19,7 @@
 extractSpanContextFromHeaders :: (IsString key, Eq key) => [(key, BS.ByteString)] -> Maybe SpanContext
 extractSpanContextFromHeaders headers =
   case find ((== "traceparent") . fst) headers of
-    Just (_, value) -> case parseSpanContext value of
-      Just c -> Just c
+    Just (_, (parseSpanContext -> mctx)) -> mctx
     _ -> Nothing
 
 parseSpanContext :: BS.ByteString -> Maybe SpanContext
diff --git a/unit-tests/TestCommon.hs b/unit-tests/TestCommon.hs
--- a/unit-tests/TestCommon.hs
+++ b/unit-tests/TestCommon.hs
@@ -1,19 +1,34 @@
+{-# LANGUAGE OverloadedStrings #-}
+
 module TestCommon where
 
 import Data.Word
 import OpenTelemetry.Common
 
+mkTestSpan :: Word64 -> Word64 -> Span
+mkTestSpan sid tid =
+  Span
+    { spanContext = SpanContext (SId sid) (TId tid),
+      spanStartedAt = 0,
+      spanFinishedAt = 10,
+      spanTags = mempty,
+      spanEvents = mempty,
+      spanStatus = OK,
+      spanOperation = "foo",
+      spanParentId = Nothing
+    }
+
 prop_tracer_push_does_something :: Word64 -> Word64 -> Int -> Bool
 prop_tracer_push_does_something sid tid threadid =
   let tracer0 = Tracer mempty
-      sp0 = emptySpan {spanContext = SpanContext (SId sid) (TId tid)}
+      sp0 = mkTestSpan sid tid
       tracer1 = tracerPushSpan tracer0 threadid sp0
    in tracer0 /= tracer1
 
 prop_tracer_push_pop :: Word64 -> Word64 -> Int -> Bool
 prop_tracer_push_pop sid tid threadid =
   let tracer0 = Tracer mempty
-      sp0 = emptySpan {spanContext = SpanContext (SId sid) (TId tid)}
+      sp0 = mkTestSpan sid tid
       tracer1 = tracerPushSpan tracer0 threadid sp0
       (Just sp1, tracer2) = tracerPopSpan tracer1 threadid
    in tracer0 == tracer2 && sp0 == sp1
