diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for describe
 
+## 0.1.1.0 -- 2019-09-05
+
+* Added Monad instance for Descriptor
+
 ## 0.1.0.0 -- 2019-06-03
 
 * Initial release.
diff --git a/Test.hs b/Test.hs
--- a/Test.hs
+++ b/Test.hs
@@ -1,10 +1,7 @@
 module Main where
 
 import Test.QuickCheck
-import Test.QuickCheck.Monadic
 import Data.Word
-import Data.Either
-import qualified Data.ByteString as B
 import Data.Serialize.Descriptor
 import Data.Serialize.Descriptor.LE
 
diff --git a/describe.cabal b/describe.cabal
--- a/describe.cabal
+++ b/describe.cabal
@@ -3,19 +3,21 @@
 --   For further documentation, see http://haskell.org/cabal/users-guide/
 
 name:                describe
-version:             0.1.0.0
+version:             0.1.1.0
 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
--- bug-reports:
 license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Riuga
 maintainer:          n/a
--- copyright:
 category:            Data
 extra-source-files:  CHANGELOG.md
 
+source-repository head
+  type:     git
+  location: https://github.com/RiugaBachi/describe.git
+
 common deps
   build-depends: base ^>= 4.12.0.0,
                  cereal >= 0.5.8 && < 0.6,
@@ -28,8 +30,6 @@
   exposed-modules:     Data.Serialize.Descriptor,
                        Data.Serialize.Descriptor.LE,
                        Data.Serialize.Descriptor.BE
-  -- other-modules:
-  -- other-extensions:
   hs-source-dirs:      src
 
 test-suite describe-tests
@@ -37,5 +37,3 @@
   type: exitcode-stdio-1.0
   main-is: Test.hs
   build-depends: describe, QuickCheck
-
-
diff --git a/src/Data/Serialize/Descriptor.hs b/src/Data/Serialize/Descriptor.hs
--- a/src/Data/Serialize/Descriptor.hs
+++ b/src/Data/Serialize/Descriptor.hs
@@ -10,24 +10,24 @@
 import Data.Serialize.Get
 import Data.Serialize.Put
 
--- | 'Descriptor s a' is an applicative functor that describes the binary structure for a structure 's' while deserializing value 'a'.
+-- | @Descriptor s a@ is an applicative functor that describes the binary structure for a structure 's' while deserializing value 'a'.
 newtype Descriptor s a = Descriptor {
     unwrapDescriptor :: (Get a, s -> Put)
 }
 
--- | 'unwrapGet desc' takes a 'Descriptor' and returns only the internal 'Get' monad.
+-- | @unwrapGet desc@ takes a 'Descriptor' and returns only the internal 'Get' monad.
 unwrapGet :: Descriptor s a -> Get a
 unwrapGet = fst . unwrapDescriptor
 
--- | 'unwrapPut s desc' takes the structure being described and a 'Descriptor' for it, and returns the internal 'Put' monad.
-unwrapPut :: s -> Descriptor s a -> Put
+-- | @unwrapPut s desc@ takes the structure being described and a 'Descriptor' for it, and returns the internal 'Put' monad.
+unwrapPut :: s -> Descriptor s a -> PutM ()
 unwrapPut s = ($ s) . snd . unwrapDescriptor
 
--- | Convenience function for 'runPut . unwrapPut s'
+-- | Convenience function for @runPut . unwrapPut s@
 serialize :: s -> Descriptor s a -> ByteString
-serialize s = runPut . unwrapPut s
+serialize s = snd . runPutM . unwrapPut s
 
--- | Convenience function for 'flip runGet bs . unwrapGet'
+-- | Convenience function for @flip runGet bs . unwrapGet@
 deserialize :: ByteString -> Descriptor s s -> Either String s
 deserialize bs = flip runGet bs . unwrapGet
 
@@ -38,3 +38,8 @@
   pure a = Descriptor (pure a, \_ -> pure ())
   (Descriptor (f, p)) <*> (Descriptor (g, p')) =
     Descriptor (f <*> g, \s' -> p s' >> p' s')
+
+instance Monad (Descriptor s) where
+  (Descriptor (g, p)) >>= f =
+    Descriptor (g >>= fst . unwrapDescriptor . f, \s -> (p s <>) . ($ s) . snd . unwrapDescriptor . f $ undefined)
+
