diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@
 
 * Switching from list-based parsing to `TokenStream`
 
+### 0.2.3
+
+* Added `nParse` (cParse for single token) and `try` (parse with Maybe) Transformers, `sInteger` (signed integers) Atomic
+
 ### 0.2.2
 
 * Added Either instance for `TokenStream`
diff --git a/LParse.cabal b/LParse.cabal
--- a/LParse.cabal
+++ b/LParse.cabal
@@ -1,5 +1,5 @@
 name:                LParse
-version:             0.2.2.2
+version:             0.2.3.0
 synopsis:            A continuation-based parser library
 description:         A parser library using continuations with a possibility for failure to build parsers in a clear and concise manner.
 homepage:            https://github.com/MarcusVoelker/LParse#readme
@@ -7,7 +7,7 @@
 license-file:        LICENSE
 author:              Marcus Völker
 maintainer:          marcus.voelker@rwth-aachen.de
-copyright:           (c) 2017 Marcus Völker
+copyright:           (c) 2017-2018 Marcus Völker
 category:            Parsing
 build-type:          Simple
 extra-source-files:  README.md CHANGELOG.md
diff --git a/src/Text/LParse/Atomics.hs b/src/Text/LParse/Atomics.hs
--- a/src/Text/LParse/Atomics.hs
+++ b/src/Text/LParse/Atomics.hs
@@ -66,6 +66,10 @@
 integer :: Parser r String Integer
 integer = foldl (\x y -> x*10+y) 0 <$> some digit
 
+-- | Extracts the first signed integer (i.e. contiguous string of digits) from the input and returns it
+sInteger :: Parser r String Integer
+sInteger = (\m i -> case m of (Just _) -> -i; Nothing -> i) <$> try (consumeSingle '-') <*> integer
+
 -- | Succeeds if the first token matches the given function, without consuming it
 peek :: (TokenStream s) => (t -> Bool) -> String -> Parser r (s t) ()
 peek c = cParse (c . top) noop
diff --git a/src/Text/LParse/Transformers.hs b/src/Text/LParse/Transformers.hs
--- a/src/Text/LParse/Transformers.hs
+++ b/src/Text/LParse/Transformers.hs
@@ -24,6 +24,10 @@
 cParse :: (t -> Bool) -> Parser r t a -> String -> Parser r t a
 cParse c p err = Parser (\s -> if c s then pFunc p s else throw err)
 
+-- | Takes a condition the next token has to fulfil in order for the parser to succeed
+nParse :: (TokenStream s, Eq (s t)) => (t -> Bool) -> Parser r (s t) a -> String -> Parser r (s t) a
+nParse c p err = cParse (\s -> not (nil == s) && c (top s)) p err
+
 -- | Transforms the input before applying the parser
 pParse :: (t -> t) -> Parser r t a -> Parser r t a
 pParse f p = Parser (pFunc p . f)
@@ -52,3 +56,7 @@
 -- | Replaces the first token by applying the given function
 replace :: (TokenStream s) => (t -> t) -> Parser r (s t) a -> Parser r (s t) a
 replace f p = Parser (pFunc p . (\x -> f (top x) `cons` rest x))
+
+-- | Tries to run the given parser, giving back Just result or Nothing
+try :: (TokenStream s) => Parser r (s t) a -> Parser r (s t) (Maybe a)
+try p = (Just <$> p) <|> return Nothing
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -33,7 +33,9 @@
     (letter >> eoi, "b"),
     (digit >> eoi, "4"),
     (word >> eoi, "banana"),
-    (nesting >> eoi, "({()}[])")
+    (nesting >> eoi, "({()}[])"),
+    (try word >> integer >> eoi, "123"),
+    (try word >> integer >> eoi, "super123")
     ]
 
 failCases :: [(Parser r String (),String)]
@@ -44,7 +46,8 @@
     (letter >> eoi, "banana"),
     (digit >> eoi, "42"),
     (word >> eoi, "banana bread"),
-    (nesting >> eoi, "({(})[])")
+    (nesting >> eoi, "({(})[])"),
+    (void $ nParse (=='1') integer "Expected '1'", "234")
     ]
 
 stringCases :: [(Parser r String String, String, String)]
@@ -59,14 +62,16 @@
     (digit,"123 is a nice number",1),
     (sum <$> sepMany (consume " ") integer,"1 4 12 61 192",1+4+12+61+192),
     (integer >>> (sum <$> bDigits 2), "19", 3),
-    (integer >>> (foldr (\x y -> x + y * 2) 0 <$> bDigits 2), "19", 19)
+    (integer >>> (foldr (\x y -> x + y * 2) 0 <$> bDigits 2), "19", 19),
+    ((\x y -> x*10+y) <$> sInteger <*> ((consumeSingle ' ') >> sInteger), "-123 123", (-123*10) + 123),
+    (nParse (=='1') integer "Expected '1'", "123", 123)
     ]
 
 runTests :: [(Parser (Either String a) t a,t)] -> [Either String a]
 runTests = map (uncurry doParse)
 
 eqTest :: (Eq a, Show a) => (Parser (Either String ()) t a, t, a) -> Either String ()
-eqTest (p,i,e) = parse p i (\r -> if r == e then Right () else Left ("Expected " ++ show e ++ ", but got " ++ show r)) (const $ Left "Parser error")
+eqTest (p,i,e) = parse p i (\r -> if r == e then Right () else Left ("Expected " ++ show e ++ ", but got " ++ show r)) (\e -> Left $ "Parser error: " ++ e)
 
 succTest :: [Either String a] -> IO ()
 succTest res = if all isRight res then return () else putStrLn (head $ lefts res) >> exitFailure
