diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
+0.5.1 Enzo Haussecker <enzo@dfinity.org> Fri Oct 19 2018
+
+ * Expose lens-based interface to radix tree data structures.
+
 0.5.0 Enzo Haussecker <enzo@dfinity.org> Fri Oct 19 2018
 
  * Implement Merkle proofs.
+ * Reduce memory footprint of parallel download combinators.
 
 0.4.0 Enzo Haussecker <enzo@dfinity.org> Tue Sep 25 2018
 
diff --git a/dfinity-radix-tree.cabal b/dfinity-radix-tree.cabal
--- a/dfinity-radix-tree.cabal
+++ b/dfinity-radix-tree.cabal
@@ -1,5 +1,5 @@
 Name:               dfinity-radix-tree
-Version:            0.5.0
+Version:            0.5.1
 Synopsis:           A generic data integrity layer.
 Description:
    This library allows you to construct a Merkle tree on top of any underlying
diff --git a/src/DFINITY/RadixTree.hs b/src/DFINITY/RadixTree.hs
--- a/src/DFINITY/RadixTree.hs
+++ b/src/DFINITY/RadixTree.hs
@@ -22,10 +22,15 @@
 
    -- ** Types
    , RadixError(..)
-   , RadixProof(_radixValue)
+   , RadixProof
    , RadixRoot
    , RadixTree
 
+   -- ** Getters
+   , getCheckpoint
+   , getRoot
+   , getValue
+
    -- ** Create
    , createRadixTree
 
@@ -43,6 +48,8 @@
 
    -- ** Prove
    , createRadixProof
+
+   -- ** Verify
    , verifyRadixProof
 
    -- ** Test
@@ -50,11 +57,13 @@
    , isValidRadixRoot
 
    -- ** Debug
+
+   -- *** Contents
    , contentsRadixTree
    , contentsMerkleizedRadixTree
    , contentsNonMerkleizedRadixTree
 
-   -- ** Print
+   -- *** Print
    , printRadixTree
    , printMerkleizedRadixTree
    , printNonMerkleizedRadixTree
@@ -203,7 +212,7 @@
 {-# SPECIALISE searchRadixTree
                :: Bool
                -> (RadixTree LevelDB.DB
-                   -> ResourceT IO (Maybe (RadixNode, RadixCache)))
+                  -> ResourceT IO (Maybe (RadixNode, RadixCache)))
                -> ByteString
                -> RadixTree LevelDB.DB
                -> ResourceT IO (Either RadixError RadixSearchResult) #-}
@@ -635,7 +644,7 @@
     (validateKey, validateHashes) = maybe (False, False) id $ do
       keyBits <- recoverKey
       let root = NonEmpty.last _radixPath
-      pure $ (keyBits == toBits key, hashNode root == rootHash)
+      pure $ (keyBits == toBits key, createRoot root == rootHash)
 
     recoverKey = do
       let childParents =
@@ -653,7 +662,7 @@
     -- decide if the implicit bit is 0 or 1
     recoverBits (child, parent) = do
       let prefixBits = maybe [] toBits (_radixPrefix parent)
-          childHash = hashNode child
+          childHash = createRoot child
           implicit0 = mfilter (== childHash) (_radixLeft parent) $> False
           implicit1 = mfilter (== childHash) (_radixRight parent) $> True
 
@@ -767,7 +776,7 @@
 {-# SPECIALISE contentsRadixTree'
                :: Bool
                -> (RadixTree LevelDB.DB
-                   -> ResourceT IO (Maybe (RadixNode, RadixCache)))
+                  -> ResourceT IO (Maybe (RadixNode, RadixCache)))
                -> RadixTree LevelDB.DB
                -> ResourceT IO [(ByteString, ByteString)] #-}
 
@@ -846,7 +855,7 @@
 {-# SPECIALISE printRadixTree'
                :: Bool
                -> (RadixTree LevelDB.DB
-                   -> ResourceT IO (Maybe (RadixNode, RadixCache)))
+                  -> ResourceT IO (Maybe (RadixNode, RadixCache)))
                -> RadixTree LevelDB.DB
                -> ResourceT IO () #-}
 
diff --git a/src/DFINITY/RadixTree/Lenses.hs b/src/DFINITY/RadixTree/Lenses.hs
--- a/src/DFINITY/RadixTree/Lenses.hs
+++ b/src/DFINITY/RadixTree/Lenses.hs
@@ -12,6 +12,8 @@
    , getChild
    , getChildren
    , getLeaf
+   , getPath
+   , getValue
    , getBloom
    , getBuffer
    , getCache
@@ -34,11 +36,13 @@
 
 import Data.Bool (bool)
 import Data.ByteString (ByteString)
+import Data.List.NonEmpty (NonEmpty)
 import Lens.Simple (makeLenses, set, view)
 
 import DFINITY.RadixTree.Types
 
 makeLenses ''RadixNode
+makeLenses ''RadixProof
 makeLenses ''RadixTree
 
 getPrefix :: RadixNode -> Maybe RadixPrefix
@@ -59,6 +63,12 @@
 getLeaf :: RadixNode -> Maybe ByteString
 getLeaf = view radixLeaf
 
+getPath :: RadixProof -> NonEmpty RadixNode
+getPath = view radixPath
+
+getValue :: RadixProof -> ByteString
+getValue = view radixValue
+
 getBloom :: RadixTree database -> RadixBloom
 getBloom = view radixBloom
 
@@ -94,6 +104,12 @@
 
 setLeaf :: Maybe ByteString -> RadixNode -> RadixNode
 setLeaf = set radixLeaf
+
+setPath :: NonEmpty RadixNode -> RadixProof -> RadixProof
+setPath = set radixPath
+
+setValue :: ByteString -> RadixProof -> RadixProof
+setValue = set radixValue
 
 setBloom :: RadixBloom -> RadixTree database -> RadixTree database
 setBloom = set radixBloom
diff --git a/src/DFINITY/RadixTree/Utilities.hs b/src/DFINITY/RadixTree/Utilities.hs
--- a/src/DFINITY/RadixTree/Utilities.hs
+++ b/src/DFINITY/RadixTree/Utilities.hs
@@ -7,7 +7,6 @@
    , createRootFromNonce
    , defaultRoot
    , ignoreIOErrors
-   , hashNode
    ) where
 
 import Codec.Serialise (serialise)
@@ -45,6 +44,3 @@
 
 ignoreIOErrors :: IO () -> IO ()
 ignoreIOErrors = handle $ (const $ pure () :: IOError -> IO ())
-
-hashNode :: RadixNode -> RadixRoot
-hashNode = toShort . hash 20 mempty . toStrict . serialise
diff --git a/test/Properties.hs b/test/Properties.hs
--- a/test/Properties.hs
+++ b/test/Properties.hs
@@ -156,7 +156,7 @@
       tree <- initTree
       tree' <- insertRadixTree k (mappend k "suffix") tree
       (_, mTree) <- merkleizeRadixTree tree'
-      fmap (_radixValue . fst) <$> createRadixProof k mTree 
+      fmap (getValue . fst) <$> createRadixProof k mTree 
 
     lookupRadix k = run $ do
       tree <- initTree
