diff --git a/README b/README
--- a/README
+++ b/README
@@ -12,5 +12,5 @@
   >                      <*> optionMaybePerm (char 'C' >> char 'D')
 
 This parser will return ('A', "BBB", Just 'D') when parsing for example
-the strings "BCDABB", "CDBBAB", &etc.
+the strings "BCDABB", "CDBBAB", etc.
 
diff --git a/Text/Parsec/Permutation.hs b/Text/Parsec/Permutation.hs
--- a/Text/Parsec/Permutation.hs
+++ b/Text/Parsec/Permutation.hs
@@ -27,10 +27,11 @@
 ----------------------------------------------------------------------------
 
 module Text.Parsec.Permutation
-  (PermParser, runPermParser, oncePerm, manyPerm, many1Perm,
+  (PermParser, runPermParser, runPermParserTill, oncePerm, manyPerm, many1Perm,
    optionPerm, optionMaybePerm)
 where
 
+import Control.Monad (void)
 import Control.Applicative ((<*>), (<$>), Applicative, pure)
 import Text.Parsec ((<|>), ParsecT, Stream, parserZero, optionMaybe, unexpected)
 
@@ -60,8 +61,26 @@
 runPermParser (PermParser value parser) =
     do result <- optionMaybe parser
        case result of
-         Nothing -> maybe (fail "Could not parse all permutations") return value
+         Nothing -> fromJustOrFail value
          Just permParser -> runPermParser permParser
+
+-- | Similar to runPermParser, but attempts parsing permutations only until the
+--   given @untilParser@ succeeds (similar to @manyTill@ in Text.Parsec).
+runPermParserTill :: Stream s m t
+                  => ParsecT s u m end -> PermParser s u m a -> ParsecT s u m a
+runPermParserTill untilParser (PermParser value parser) =
+    do void $ untilParser
+       fromJustOrFail value
+    <|>
+    do result <- optionMaybe parser
+       case result of
+         Nothing -> unexpected "end of permutation parser"
+         Just permParser -> runPermParserTill untilParser permParser
+
+-- Similar to "Data.Maybe.fromJust" but fails with an appropriate error message
+fromJustOrFail :: Maybe a -> ParsecT s u m a
+fromJustOrFail value =
+  maybe (fail "Could not parse all permutations") return value
 
 -- | Attempt parsing a value once. Fails if parsing the value succeeds multiple
 --   times.
diff --git a/parsec-permutation.cabal b/parsec-permutation.cabal
--- a/parsec-permutation.cabal
+++ b/parsec-permutation.cabal
@@ -1,5 +1,5 @@
 name:                parsec-permutation
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Applicative permutation parser for Parsec intended as
                      a replacement for Text.Parsec.Perm.
 license:             BSD3
diff --git a/tests/PermutationTest.hs b/tests/PermutationTest.hs
--- a/tests/PermutationTest.hs
+++ b/tests/PermutationTest.hs
@@ -26,6 +26,27 @@
        Left _ -> False
        Right x -> x == ("qwer", "asdf")
 
+prop_oncePermTill :: Property
+prop_oncePermTill = once $
+  (requireParse "sdfxa" $ (runPermParserTill (char 'x') $
+    (,,,,,) <$> pure 'n'
+            <*> oncePerm (char 's')
+            <*> oncePerm (char 'f')
+            <*> oncePerm (char 'd')
+            <*> optionMaybePerm (char 'a')
+            <*> optionMaybePerm (char 'x')) <* char 'a')
+      == ('n','s','f','d',Nothing,Nothing)
+
+prop_oncePermTill2 :: Property
+prop_oncePermTill2 = once $
+  (requireParse "sdfax" $ runPermParserTill (char 'x') $
+    (,,,,,) <$> pure 'n'
+            <*> oncePerm (char 's')
+            <*> oncePerm (char 'f')
+            <*> oncePerm (char 'd')
+            <*> optionMaybePerm (char 'a')
+            <*> optionMaybePerm (char 'x')) == ('n','s','f','d',Just 'a',Nothing)
+
 prop_oncePerm :: Property
 prop_oncePerm = once $
   case parse (runPermParser $ oncePerm $ char 'A') "" "A" of
