diff --git a/app/Main.hs b/app/Main.hs
deleted file mode 100644
--- a/app/Main.hs
+++ /dev/null
@@ -1,4 +0,0 @@
-module Main where
-
-main :: IO ()
-main = putStrLn "Hello world"
diff --git a/hw-conduit.cabal b/hw-conduit.cabal
--- a/hw-conduit.cabal
+++ b/hw-conduit.cabal
@@ -1,5 +1,5 @@
 name:                   hw-conduit
-version:                0.1.0.0
+version:                0.2.0.0
 synopsis:               Conduits for tokenizing streams.
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-conduit#readme
@@ -13,25 +13,15 @@
 extra-source-files:     README.md
 cabal-version:          >= 1.22
 
-executable hw-conduit-example
-  hs-source-dirs:       app
-  main-is:              Main.hs
-  ghc-options:          -threaded -rtsopts -with-rtsopts=-N -O2 -Wall -msse4.2
-  build-depends:        base                          >= 4          && < 5
-                      , criterion
-                      , hw-conduit
-  default-language:     Haskell2010
-
 library
   hs-source-dirs:       src
   exposed-modules:      HaskellWorks.Data.Conduit.ByteString
+                      , HaskellWorks.Data.Conduit.Combinator
                       , HaskellWorks.Data.Conduit.List
   build-depends:        base                          >= 4          && < 5
                       , array
                       , bytestring
                       , conduit
-                      , hw-bits                       >= 0.4.0.0
-                      , resourcet
                       , word8
 
   default-language:     Haskell2010
@@ -42,8 +32,10 @@
   hs-source-dirs:       test
   main-is:              Spec.hs
   other-modules:        HaskellWorks.Data.Conduit.ByteStringSpec
+                      , HaskellWorks.Data.Conduit.CombinatorSpec
   build-depends:        base                          >= 4          && < 5
                       , bytestring
+                      , conduit
                       , hspec
                       , hw-conduit
   ghc-options:          -threaded -rtsopts -with-rtsopts=-N -Wall
diff --git a/src/HaskellWorks/Data/Conduit/Combinator.hs b/src/HaskellWorks/Data/Conduit/Combinator.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Conduit/Combinator.hs
@@ -0,0 +1,10 @@
+module HaskellWorks.Data.Conduit.Combinator where
+
+import           Data.Conduit
+import           Data.Conduit.List as L
+import           Data.Maybe
+
+inJust :: Monad m => Conduit a m c -> Conduit (Maybe a) m (Maybe c)
+inJust c = getZipConduit
+      $   ZipConduit (L.filter isNothing  .|      L.map (const Nothing))
+      <*  ZipConduit (L.concat            .| c .| L.map Just           )
diff --git a/test/HaskellWorks/Data/Conduit/CombinatorSpec.hs b/test/HaskellWorks/Data/Conduit/CombinatorSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/HaskellWorks/Data/Conduit/CombinatorSpec.hs
@@ -0,0 +1,21 @@
+module HaskellWorks.Data.Conduit.CombinatorSpec (spec) where
+
+import           Data.Conduit
+import           Data.Conduit.List                    as L
+import           Data.Maybe
+import           HaskellWorks.Data.Conduit.Combinator
+
+import           Test.Hspec
+
+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
+
+spec :: Spec
+spec = describe "HaskellWorks.Data.Conduit.CombinatorSpec" $ do
+  describe "inJust" $ do
+    it "should map when Just and propagate Nothing" $ do
+      let input = [Just 1, Just 2, Nothing, Nothing, Just 4, Nothing] :: [Maybe Int]
+      let results = runConduitPure $
+                L.sourceList input
+            .|  inJust (L.map (+1))
+            .|  L.consume
+      results `shouldBe` [Just 2, Just 3, Nothing, Nothing, Just 5, Nothing]
