diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,10 @@
 # Revision history for waargonaut
 
+## 0.6.1.0  -- 2019-02-27
+
+* Add `passKeysToValues` decoder for decoding JSON objects where the key should
+  be part of the value.
+
 ## 0.6.0.0  -- 2019-02-19
 
 #### Fixes
diff --git a/src/Waargonaut/Decode.hs b/src/Waargonaut/Decode.hs
--- a/src/Waargonaut/Decode.hs
+++ b/src/Waargonaut/Decode.hs
@@ -87,6 +87,7 @@
   , maybeOrNull
   , either
   , oneOf
+  , passKeysToValues
 
   ) where
 
@@ -599,6 +600,59 @@
     (flip runReaderT p . unDecodeResult . f)
     (DI.Decoder' $ runDecoder elemD p)
     curs
+
+-- | A specialised decoder for moving over a JSON object where the keys are
+-- values that you would like to have as part of the value at the different
+-- keys.
+--
+-- An example of such an input is:
+--
+-- @
+-- { "Collection" : {
+--   "BobsInput_ce43dff22": {
+--     "someValue": "Some data"
+--   },
+--   "FredsInput_a4b32def": {
+--     "someValue": "Some different data"
+--   }
+-- }
+-- @
+--
+-- Where those key values like "XInput_YYYY" are to be included in the object.
+--
+-- Given a type like this:
+--
+-- @
+-- data ContainsItsKey = ContainsItsKey
+--   { _containsItsKey_KeyValue :: Text
+--   , _containsItsKey_SomeValue :: Text
+--   }
+-- @
+-- 
+-- To decode the above you would use this function like so:
+-- 
+-- @
+-- takesKeyDecoder :: Monad f => Text -> Decoder f ContainsItsKey
+-- takesKeyDecoder k = ContainsItsKey k <$> D.atKey "someValue" D.text
+--
+-- collectionDecoder :: Monad f => Decoder f [ContainsItsKey]
+-- collectionDecoder = D.atKey "Collection" $ D.passKeysToValues D.text takesKeyDecoder
+-- @
+--
+passKeysToValues
+  :: ( Snoc c c v v
+     , Monad f
+     )
+  => c 
+  -> Decoder f k
+  -> (k -> Decoder f v)
+  -> Decoder f c
+passKeysToValues empty dK kDV = withCursor $ down >=> foldCursor snoc
+  (moveRightN (successor' (successor' zero'))) empty
+  (withCursor $ \c' -> do
+    k <- focus dK c'
+    moveRight1 c' >>= focus (kDV k)
+  )
 
 -- | Helper function for "pattern matching" on a decoded value to some Haskell
 -- value. The 'Text' argument is used in the error message should this decoder
diff --git a/src/Waargonaut/Encode/Types.hs b/src/Waargonaut/Encode/Types.hs
--- a/src/Waargonaut/Encode/Types.hs
+++ b/src/Waargonaut/Encode/Types.hs
@@ -104,7 +104,7 @@
 type ObjEncoder' a = EncoderFns (JObject WS Json) Identity a
 
 -- | Run any encoder to the 'Json' representation, allowing for some
--- 'Applicative' context @f@.
+-- 'Functor' context @f@.
 runEncoder :: Functor f => EncoderFns i f a -> a -> f Json
 runEncoder e = fmap (finaliseEncoding e) . initialEncoding e
 {-# INLINE runEncoder #-}
diff --git a/test/Decoder.hs b/test/Decoder.hs
--- a/test/Decoder.hs
+++ b/test/Decoder.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE LambdaCase        #-}
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Decoder
@@ -32,6 +31,7 @@
 import           Data.Tagged                (untag)
 import           Data.Text                  (Text)
 import qualified Data.Text                  as T
+import qualified Data.Text.IO               as TIO
 
 import qualified Natural                    as N
 
@@ -67,7 +67,27 @@
   , testCase "Absent Key Decoder" absentKeyDecoder
   , testCase "Either decoding order - Right first" decodeEitherRightFirst
   , testProperty "Unicode codepoint handling regression" unicodeHandlingRegression
+  , testCase "Pass decoded key to the object value decoder" testKeysPassedToValueDecoder
   ]
+
+data ContainsItsKey = ContainsItsKey
+  { _containsItsKeyKey :: Text
+  , _containsItsKeyOtherVal :: Text
+  }
+  deriving (Eq,Show)
+
+testKeysPassedToValueDecoder :: Assertion
+testKeysPassedToValueDecoder =
+  TIO.readFile "test/json-data/keys-in-obj.json"
+  >>= WA.decodeAttoparsecText dec
+  >>= (@?= Either.Right expected)
+  where
+    expected = [
+        ContainsItsKey "ID0" "Some data"
+      , ContainsItsKey "ID1" "Some different data"
+      ]
+    dec = D.atKey "Collection" (D.passKeysToValues [] D.text takesKeyDecoder)
+    takesKeyDecoder k = ContainsItsKey k <$> D.atKey "SomeCommonKeys" D.text
 
 unicodeHandlingRegression :: Property
 unicodeHandlingRegression = withTests 1 . property $ do
diff --git a/test/json-data/keys-in-obj.json b/test/json-data/keys-in-obj.json
new file mode 100644
--- /dev/null
+++ b/test/json-data/keys-in-obj.json
@@ -0,0 +1,8 @@
+{ "Collection" : {
+  "ID0": {
+    "SomeCommonKeys": "Some data"
+  },
+  "ID1": {
+    "SomeCommonKeys": "Some different data"
+  }
+}
diff --git a/waargonaut.cabal b/waargonaut.cabal
--- a/waargonaut.cabal
+++ b/waargonaut.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.6.0.0
+version:             0.6.1.0
 
 -- A short (one-line) description of the package.
 synopsis:            JSON wrangling
@@ -48,6 +48,7 @@
                    , test/json-data/image_obj.json
                    , test/json-data/twitter_with_hex_vals.json
                    , test/json-data/unicode_2705.json
+                   , test/json-data/keys-in-obj.json
 
                    -- Known bad json files
                    , test/json-data/bad-json/no_comma_arr.json
@@ -255,6 +256,6 @@
 
                      , waargonaut
 
-  ghc-options:         -Wall -O2
+  ghc-options:         -Wall
 
   default-language:    Haskell2010
