diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for describe
 
+## 0.2.0.5 -- 2019-10-07
+
+* Added the `Remaining` combinator.
+* Added `deserializeEx`.
+
 ## 0.2.0.4 -- 2019-10-06
 
 * Made Vec instance for Equals overlapping. 
diff --git a/describe.cabal b/describe.cabal
--- a/describe.cabal
+++ b/describe.cabal
@@ -3,7 +3,7 @@
 --   For further documentation, see http://haskell.org/cabal/users-guide/
 
 name:                describe
-version:             0.2.0.4
+version:             0.2.0.5
 synopsis:            Combinators for describing binary data structures
 description:         Combinators for describing binary data structures, which eliminate the boilerplate of having to write isomorphic Get and Put instances. Please see the Github page for examples.
 homepage:            https://github.com/riugabachi/describe
@@ -26,6 +26,7 @@
                       TypeFamilies,
                       TypeOperators,
                       OverlappingInstances,
+                      GeneralizedNewtypeDeriving,
                       FlexibleContexts,
                       DefaultSignatures,
                       DataKinds,
diff --git a/src/Data/Serialize/Describe/Combinators.hs b/src/Data/Serialize/Describe/Combinators.hs
--- a/src/Data/Serialize/Describe/Combinators.hs
+++ b/src/Data/Serialize/Describe/Combinators.hs
@@ -1,5 +1,6 @@
 -- | Various type-level combinators to ease generic derivation of 'Describe'
 module Data.Serialize.Describe.Combinators(
+  Remaining(..),
   Optional(..),
   Predicate(..),
   Equals
@@ -8,11 +9,19 @@
 import GHC.TypeNats
 import Data.Proxy
 import Data.Maybe
+import Data.ByteString
 import Data.Serialize.Describe.Descriptor
 import Data.Serialize.Describe.Class
 import qualified Data.Vector.Fixed as V
 import Data.Vector.Fixed.Boxed (Vec)
 import qualified Data.Serialize.Get as G
+import qualified Data.Serialize.Put as P
+
+-- | A  'Remaining' represents the rest of the buffer. Upon serialization, the entire wrapped ByteString will be written.
+newtype Remaining = Remaining { unwrapRemaining :: ByteString }
+
+instance Describe Remaining where
+  describe f = Descriptor (fmap Remaining . G.getByteString =<< G.remaining, \s -> P.putByteString (unwrapRemaining (f s)) >> pure (f s))
 
 -- | An 'Optional' represents a field which is optionally-serializable. The field will be parsed via a lookAhead and, if the value matches the 'Predicate' p, then the field exists. If not, it is assumed as though the field was never serialized in the first place and the value will be set to 'Nothing'; parsing will then continue on as usual.
 newtype Optional p t = Optional { unwrapOptional :: Maybe t }
diff --git a/src/Data/Serialize/Describe/Descriptor.hs b/src/Data/Serialize/Describe/Descriptor.hs
--- a/src/Data/Serialize/Describe/Descriptor.hs
+++ b/src/Data/Serialize/Describe/Descriptor.hs
@@ -3,8 +3,11 @@
   unwrapGet,
   unwrapPut,
   serialize,
-  deserialize
+  deserialize,
+  deserializeEx
 ) where
+
+import Control.Exception
 import Data.ByteString (ByteString)
 import Data.Serialize.Get
 import Data.Serialize.Put
@@ -29,6 +32,17 @@
 -- | Convenience function for @flip runGet bs . unwrapGet@
 deserialize :: ByteString -> Descriptor s s -> Either String s
 deserialize bs = flip runGet bs . unwrapGet
+
+newtype ParserException = ParserException String
+                        deriving (Show)
+
+instance Exception ParserException
+
+-- | Like 'deserialize', but throw a 'ParserException' upon failure rather than an `Either`.
+deserializeEx :: ByteString -> Descriptor s s -> s
+deserializeEx bs d = case deserialize bs d of
+  Left err -> throw $ ParserException err
+  Right a -> a
 
 instance Functor (Descriptor s) where
   fmap f (Descriptor (g, p)) = Descriptor (f <$> g, (f <$>) . p)
