diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Changelog for hs-opentelemetry-sdk
 
+## Unreleased
+
+## 0.1.0.1
+
+- Update dependency bounds for hs-opentelemetry-api 0.3.0.0
+
 ## 0.1.0.0
 
 - Support new versions of dependencies.
diff --git a/hs-opentelemetry-sdk.cabal b/hs-opentelemetry-sdk.cabal
--- a/hs-opentelemetry-sdk.cabal
+++ b/hs-opentelemetry-sdk.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.22
 
--- This file has been generated from package.yaml by hpack version 0.36.0.
+-- This file has been generated from package.yaml by hpack version 0.37.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:               hs-opentelemetry-sdk
-version:            0.1.0.0
+version:            0.1.0.1
 synopsis:           OpenTelemetry SDK for use in applications.
 description:        Please see the README on GitHub at <https://github.com/iand675/hs-opentelemetry/tree/main/sdk#readme>
 category:           OpenTelemetry, Telemetry, Monitoring, Observability, Metrics
@@ -81,11 +81,11 @@
       async
     , base >=4.7 && <5
     , bytestring
-    , hs-opentelemetry-api ==0.2.*
+    , hs-opentelemetry-api ==0.3.*
     , hs-opentelemetry-exporter-otlp ==0.1.*
     , hs-opentelemetry-propagator-b3 >=0.0.1 && <0.1
     , hs-opentelemetry-propagator-datadog >=0.0.0 && <0.1
-    , hs-opentelemetry-propagator-w3c >=0.0.1 && <0.1
+    , hs-opentelemetry-propagator-w3c >=0.1.0 && <0.2
     , http-types
     , network-bsd
     , random >=1.2.0
diff --git a/src/OpenTelemetry/Trace.hs b/src/OpenTelemetry/Trace.hs
--- a/src/OpenTelemetry/Trace.hs
+++ b/src/OpenTelemetry/Trace.hs
@@ -291,7 +291,7 @@
 -}
 
 
-knownPropagators :: [(T.Text, Propagator Context RequestHeaders ResponseHeaders)]
+knownPropagators :: [(T.Text, Propagator Context RequestHeaders RequestHeaders)]
 knownPropagators =
   [ ("tracecontext", w3cTraceContextPropagator)
   , ("baggage", w3cBaggagePropagator)
@@ -303,7 +303,7 @@
 
 
 -- TODO, actually implement a registry systme
-readRegisteredPropagators :: IO [(T.Text, Propagator Context RequestHeaders ResponseHeaders)]
+readRegisteredPropagators :: IO [(T.Text, Propagator Context RequestHeaders RequestHeaders)]
 readRegisteredPropagators = pure knownPropagators
 
 
@@ -375,7 +375,7 @@
       pure (processors, providerOpts)
 
 
-detectPropagators :: IO (Propagator Context RequestHeaders ResponseHeaders)
+detectPropagators :: IO (Propagator Context RequestHeaders RequestHeaders)
 detectPropagators = do
   registeredPropagators <- readRegisteredPropagators
   propagatorsInEnv <- fmap (T.splitOn "," . T.pack) <$> lookupEnv "OTEL_PROPAGATORS"
diff --git a/test/OpenTelemetry/TraceSpec.hs b/test/OpenTelemetry/TraceSpec.hs
--- a/test/OpenTelemetry/TraceSpec.hs
+++ b/test/OpenTelemetry/TraceSpec.hs
@@ -252,15 +252,33 @@
       spanAttributes s `shouldSatisfy` \attrs ->
         (lookupAttribute attrs "code.function") == Just (toAttribute @Text "f")
           && (lookupAttribute attrs "code.namespace") == Just (toAttribute @Text "OpenTelemetry.TraceSpec")
+          && (lookupAttribute attrs "code.lineno") == Just (toAttribute @Int 330)
 
-    specify "Source code attributes are added correctly in the presence of frozen call stacks" $ asIO $ do
+    specify "Source code attributes are not added in the presence of frozen call stacks" $ asIO $ do
       p <- getGlobalTracerProvider
       let t = makeTracer p "woo" tracerOptions
       s <- unsafeReadSpan =<< g3 t
       spanAttributes s `shouldSatisfy` \attrs ->
-        (lookupAttribute attrs "code.function") == Just (toAttribute @Text "g")
-          && (lookupAttribute attrs "code.namespace") == Just (toAttribute @Text "OpenTelemetry.TraceSpec")
+        (lookupAttribute attrs "code.function") == Nothing
+          && (lookupAttribute attrs "code.namespace") == Nothing
+          && (lookupAttribute attrs "code.lineno") == Nothing
 
+    specify "Source code attributes are not added if source attributes are already present" $ asIO $ do
+      p <- getGlobalTracerProvider
+      let t = makeTracer p "woo" tracerOptions
+      s <- unsafeReadSpan =<< h t
+      spanAttributes s `shouldSatisfy` \attrs ->
+        (lookupAttribute attrs "code.function") == Just (toAttribute @Text "something")
+          && (lookupAttribute attrs "code.namespace") == Nothing
+          && (lookupAttribute attrs "code.lineno") == Nothing
+
+    specify "Source code attributes can be added for span creation wrappers" $ asIO $ do
+      p <- getGlobalTracerProvider
+      let t = makeTracer p "woo" tracerOptions
+      s <- unsafeReadSpan =<< useSpanHelper t
+      spanAttributes s `shouldSatisfy` \attrs ->
+        (lookupAttribute attrs "code.function") == Just (toAttribute @Text "useSpanHelper")
+
     specify "Attribute length limit is respected" $ asIO $ do
       p <- getGlobalTracerProvider
       let t = makeTracer p "woo" tracerOptions
@@ -312,14 +330,9 @@
   createSpan tracer Context.empty "name" defaultSpanArguments
 
 
-helper :: HasCallStack => Tracer -> IO Span
-helper tracer =
-  createSpan tracer Context.empty "name" defaultSpanArguments
-
-
 g :: HasCallStack => Tracer -> IO Span
 -- block createSpan and callerAttributes from appearing in the call stack
-g tracer = withFrozenCallStack $ helper tracer
+g tracer = withFrozenCallStack $ createSpan tracer Context.empty "name" defaultSpanArguments
 
 
 g2 :: HasCallStack => Tracer -> IO Span
@@ -329,3 +342,18 @@
 -- Make a 3-deep call stack
 g3 :: HasCallStack => Tracer -> IO Span
 g3 tracer = g2 tracer
+
+
+h :: HasCallStack => Tracer -> IO Span
+h tracer =
+  createSpan tracer Context.empty "name" (addAttributesToSpanArguments (HM.singleton "code.function" "something") defaultSpanArguments)
+
+
+myInSpan :: HasCallStack => Tracer -> Text -> IO a -> IO (a, Span)
+myInSpan tracer name act = inSpan' tracer name (addAttributesToSpanArguments callerAttributes defaultSpanArguments) $ \traceSpan -> do
+  res <- act
+  pure (res, traceSpan)
+
+
+useSpanHelper :: HasCallStack => Tracer -> IO Span
+useSpanHelper tracer = snd <$> myInSpan tracer "useSpanHelper" (pure ())
