diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for essence-of-live-coding-warp
 
+## 0.2.2
+
+* Made backend nonblocking
+
 ## 0.2.1
 
 * Simple single-threaded version
diff --git a/essence-of-live-coding-warp.cabal b/essence-of-live-coding-warp.cabal
--- a/essence-of-live-coding-warp.cabal
+++ b/essence-of-live-coding-warp.cabal
@@ -1,5 +1,5 @@
 name:                essence-of-live-coding-warp
-version:             0.2.1
+version:             0.2.2
 synopsis: General purpose live coding framework
 description:
   essence-of-live-coding is a general purpose and type safe live coding framework.
@@ -33,7 +33,7 @@
 source-repository this
   type:     git
   location: git@github.com:turion/essence-of-live-coding.git
-  tag:      v0.2.1
+  tag:      v0.2.2
 
 library
   exposed-modules:
@@ -44,7 +44,7 @@
     , http-types >= 0.12.3
     , wai >= 3.2.2.1
     , warp >= 3.3.13
-    , essence-of-live-coding >= 0.2.1
+    , essence-of-live-coding >= 0.2.2
   hs-source-dirs:      src
   default-language:    Haskell2010
   default-extensions:  StrictData
@@ -56,6 +56,6 @@
   build-depends:
       base >= 4.11 && < 5
     , http-client >= 0.7.1
-    , essence-of-live-coding >= 0.2.1
+    , essence-of-live-coding >= 0.2.2
     , essence-of-live-coding-warp
   default-language:    Haskell2010
diff --git a/src/LiveCoding/Warp.hs b/src/LiveCoding/Warp.hs
--- a/src/LiveCoding/Warp.hs
+++ b/src/LiveCoding/Warp.hs
@@ -46,28 +46,27 @@
 {- | Run a 'Cell' as a WARP application.
 
 1. Starts a WARP application on the given port in a background thread
-2. Block until the next request arrives
+2. Waits until the next request arrives, outputting 'Nothing' in the meantime
 3. Supplies the cell with the input and the current request
 4. Serve the response and return the output
-
-Keep in mind that the resulting cell is blocking.
-For a non-blocking cell, use 'LiveCoding.NonBlocking'.
 -}
 
 runWarpC
   :: Port
   -> Cell IO (a, Request) (b, Response)
-  -> Cell (HandlingStateT IO) a b
+  -> Cell (HandlingStateT IO) a (Maybe b)
 runWarpC port cell = proc a -> do
   WaiHandle { .. } <- handling $ waiHandle port -< ()
-  request <- arrM $ liftIO . takeMVar           -< requestVar
-  (b, response) <- liftCell cell                     -< (a, request)
-  arrM $ liftIO . uncurry putMVar               -< (responseVar, response)
-  returnA                                       -< b
-
+  requestMaybe <- arrM $ liftIO . tryTakeMVar   -< requestVar
+  case requestMaybe of
+    Just request -> do
+      (b, response) <- liftCell cell  -< (a, request)
+      arrM $ liftIO . uncurry putMVar -< (responseVar, response)
+      returnA                         -< Just b
+    Nothing -> returnA -< Nothing
 
 runWarpC_
   :: Port
   -> Cell IO Request Response
   -> Cell (HandlingStateT IO) () ()
-runWarpC_ port cell = runWarpC port $ arr snd >>> cell >>> arr ((), )
+runWarpC_ port cell = runWarpC port (arr snd >>> cell >>> arr ((), )) >>> arr (const ())
