diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for kafka-client-sync
 
+## 0.1.1.1 -- 2020-01-17
+
+* Fix concurrency issue causing deadlock in callback handler
+
 ## 0.1.1.0 -- 2019-11-12
 
 * Add `closeSyncProducer` function
diff --git a/kafka-client-sync.cabal b/kafka-client-sync.cabal
--- a/kafka-client-sync.cabal
+++ b/kafka-client-sync.cabal
@@ -1,7 +1,7 @@
 name:
   kafka-client-sync
 version:
-  0.1.1.0
+  0.1.1.1
 synopsis:
   Synchronous Kafka Client
 description:
@@ -66,7 +66,13 @@
     Main.hs
 
   ghc-options:
-    -Wall -Wredundant-constraints -fhide-source-paths -threaded
+    -Wall
+    -Wredundant-constraints
+    -fhide-source-paths
+    -threaded
+    -with-rtsopts=-N
+    -with-rtsopts=-qg
+    -O2
 
   hs-source-dirs:
     test
diff --git a/src/Kafka/Producer/Sync.hs b/src/Kafka/Producer/Sync.hs
--- a/src/Kafka/Producer/Sync.hs
+++ b/src/Kafka/Producer/Sync.hs
@@ -49,7 +49,9 @@
 
 import           Prelude
 
+import           Control.Concurrent (forkIO)
 import           Control.Concurrent.MVar (MVar, newMVar, takeMVar, newEmptyMVar, putMVar)
+import           Control.Monad (void)
 import           Control.Monad.IO.Class (MonadIO(..))
 import           Data.Foldable (find)
 import           Data.Functor ((<&>))
@@ -186,7 +188,7 @@
 
 handleDeliveryReport :: MVar Requests -> (DeliveryReport -> IO ())
 handleDeliveryReport mvarRequests = \case
-  DeliverySuccess record _offset -> do
+  DeliverySuccess record _offset -> void . forkIO $ do
     reqs <- takeMVar mvarRequests
     case getAndRemove record (sent reqs) of
       Just (mvar, rest) -> do
@@ -196,7 +198,7 @@
         error
           $ "Illegal state ocurred, record was not in sent: "
           <> show reqs
-  DeliveryFailure record err -> do
+  DeliveryFailure record err -> void . forkIO $ do
     reqs <- takeMVar mvarRequests
     case getAndRemove record (sent reqs) of
       Just (mvar, rest) -> do
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -13,7 +13,7 @@
 
 producerProps :: ProducerProperties
 producerProps = brokersList [BrokerAddress "localhost:9092"]
-  <> sendTimeout (Timeout 10000)
+  <> sendTimeout (Timeout 1000)
   <> logLevel KafkaLogDebug
 
 message :: Int -> ProducerRecord
@@ -41,9 +41,17 @@
     putStrLn "Running Kafka sync tests"
 
     let action = produceRecord producer . message
+
+    -- Produces 15k messages and waits for them all to be delivered to the
+    -- broker
     res <- sequence $
-      fmap action [1..100] ++
-      fmap action (replicate 1 100)
+      fmap action [1..10000] ++
+      fmap action (replicate 1 1000) ++
+      fmap action (replicate 2 1000) ++
+      fmap action (replicate 3 1000) ++
+      fmap action (replicate 4 1000) ++
+      fmap action (replicate 5 1000) ++
+      []
 
     for_ res $
       either (putStrLn . (<>) "got error: " . show) pure
