diff --git a/Text/Boomerang/Prim.hs b/Text/Boomerang/Prim.hs
--- a/Text/Boomerang/Prim.hs
+++ b/Text/Boomerang/Prim.hs
@@ -12,8 +12,9 @@
 
 import Prelude             hiding ((.), id)
 import Control.Arrow       (first)
+import Control.Applicative (Applicative(..), Alternative(..))
 import Control.Category    (Category((.), id))
-import Control.Monad       (MonadPlus(mzero, mplus))
+import Control.Monad       (MonadPlus(mzero, mplus), ap)
 import Control.Monad.Error (Error(..))
 import Data.Either         (partitionEithers)
 import Data.Function       (on)
@@ -54,6 +55,10 @@
         Parser $ \tok pos ->
             map (fmap (first (first f))) (p tok pos)
 
+instance Applicative (Parser e tok) where
+    pure  = return
+    (<*>) = ap
+
 instance Monad (Parser e tok) where
     return a =
         Parser $ \tok pos ->
@@ -64,6 +69,10 @@
               ([], []) -> []
               (errs,[]) -> map Left errs
               (_,as) -> concat [ runParser (f a) tok' pos' | ((a, tok'), pos') <- as ]
+
+instance Alternative (Parser e tok) where
+    empty = mzero
+    (<|>) = mplus
 
 instance MonadPlus (Parser e tok) where
     mzero = Parser $ \tok pos -> []
diff --git a/Text/Boomerang/TH.hs b/Text/Boomerang/TH.hs
--- a/Text/Boomerang/TH.hs
+++ b/Text/Boomerang/TH.hs
@@ -54,7 +54,7 @@
       let outT = AppT (AppT (ConT ''(:-))
                             (foldl AppT (ConT tName) (map (VarT . takeName) tParams)))
                       (VarT r')
-      runIO $ putStrLn $ "Introducing router " ++ nameBase name' ++ "."
+      -- runIO $ putStrLn $ "Introducing router " ++ nameBase name' ++ "."
       expr <- [| xpure $(deriveConstructor name (length tys))
                      $(deriveDestructor name tys) |]
       return [ SigD name'
diff --git a/boomerang.cabal b/boomerang.cabal
--- a/boomerang.cabal
+++ b/boomerang.cabal
@@ -1,5 +1,5 @@
 Name:             boomerang
-Version:          1.4.3
+Version:          1.4.4
 License:          BSD3
 License-File:     LICENSE
 Author:           jeremy@seereason.com
