diff --git a/Text/Shakespeare/Base.hs b/Text/Shakespeare/Base.hs
--- a/Text/Shakespeare/Base.hs
+++ b/Text/Shakespeare/Base.hs
@@ -35,7 +35,6 @@
 import qualified System.IO as SIO
 import qualified Data.Text.Lazy.IO as TIO
 import Control.Monad (when)
-import Control.Applicative ((<*))
 
 newtype Ident = Ident String
     deriving (Show, Eq, Read, Data, Typeable)
@@ -111,7 +110,7 @@
             return $ DerefIdent $ Ident x
     derefInfix x = try $ do
         _ <- delim
-        xs <- many $ try $ derefSingle <* delim
+        xs <- many $ try $ derefSingle >>= \x' -> delim >> return x'
         op <- many1 (satisfy $ \c -> isSymbol c || c `elem` "-") <?> "operator"
         -- special handling for $, which we don't deal with
         when (op == "$") $ fail "don't handle $"
diff --git a/shakespeare.cabal b/shakespeare.cabal
--- a/shakespeare.cabal
+++ b/shakespeare.cabal
@@ -1,5 +1,5 @@
 name:            shakespeare
-version:         1.0.1
+version:         1.0.1.1
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -43,6 +43,8 @@
 test-suite test
     hs-source-dirs: test
     main-is: ../test.hs
+    other-modules:  ShakespeareBaseTest
+
     type: exitcode-stdio-1.0
 
     ghc-options:   -Wall
@@ -50,7 +52,7 @@
                  , base             >= 4       && < 5
                  , parsec           >= 2       && < 4
                  , HUnit
-                 , hspec            >= 0.8     && < 1.2
+                 , hspec            >= 0.8     && < 1.3
                  , text             >= 0.7     && < 0.12
 
 
diff --git a/test.hs b/test.hs
--- a/test.hs
+++ b/test.hs
@@ -2,4 +2,4 @@
 import ShakespeareBaseTest (specs)
 
 main :: IO ()
-main = hspecX $ specs
+main = hspec $ specs
diff --git a/test/ShakespeareBaseTest.hs b/test/ShakespeareBaseTest.hs
new file mode 100644
--- /dev/null
+++ b/test/ShakespeareBaseTest.hs
@@ -0,0 +1,59 @@
+module ShakespeareBaseTest (specs) where
+
+import Test.HUnit hiding (Test)
+import Test.Hspec.Monadic
+import Test.Hspec.HUnit ()
+
+import Text.ParserCombinators.Parsec (parse, ParseError, (<|>))
+import Text.Shakespeare.Base (parseVarString, parseUrlString, parseIntString)
+import Text.Shakespeare (preFilter, defaultShakespeareSettings, ShakespeareSettings(..), PreConvert(..), PreConversion(..))
+
+-- run :: Text.Parsec.Prim.Parsec Text.Parsec.Pos.SourceName () c -> Text.Parsec.Pos.SourceName -> c
+
+specs :: Specs
+specs = describe "shakespeare-js" $ do
+  it "parseStrings" $ do
+    Right "%{var}" @=?  run varString "%{var}"
+    Right "@{url}" @=?  run urlString "@{url}"
+    Right "^{int}" @=?  run intString "^{int}"
+    Right "@{url}" @=?  run (varString <|> urlString <|> intString) "@{url} #{var}"
+
+  it "preFilter off" $ do
+    str <- preFilter defaultShakespeareSettings template
+    str @=? template
+
+  it "preFilter on" $ do
+    str <- preFilter preConversionSettings template
+    "unchanged `#{var}` `@{url}` `^{int}`" @=? str
+
+  it "preFilter ignore quotes" $ do
+    str <- preFilter preConversionSettings templateQuote
+    "unchanged '#{var}' `@{url}` '^{int}'" @=? str
+
+  it "preFilter ignore comments" $ do
+    str <- preFilter preConversionSettings templateCommented
+    "unchanged & '#{var}' @{url} '^{int}'" @=? str
+
+  where
+    varString = parseVarString '%'
+    urlString = parseUrlString '@' '?'
+    intString = parseIntString '^'
+
+    preConversionSettings = defaultShakespeareSettings {
+      preConversion = Just PreConvert {
+          preConvert = Id
+        , preEscapeBegin = "`"
+        , preEscapeEnd = "`"
+        , preEscapeIgnoreBalanced = "'\""
+        , preEscapeIgnoreLine = "&"
+        }
+    }
+    template  = "unchanged #{var} @{url} ^{int}"
+    templateQuote = "unchanged '#{var}' @{url} '^{int}'"
+    templateCommented = "unchanged & '#{var}' @{url} '^{int}'"
+
+    run parser str = eShowErrors $ parse parser str str
+
+    eShowErrors :: Either ParseError c -> c
+    eShowErrors = either (error . show) id
+
