diff --git a/gpmf.cabal b/gpmf.cabal
--- a/gpmf.cabal
+++ b/gpmf.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 7571cd9d9b95b052897d6f76314c207aa300046dabffcdf8131672c4291a2aee
+-- hash: c6d29ad07f44b26f9f044367be3fffd8ca5de406a6c5228a26d694d5f3127f3a
 
 name:           gpmf
-version:        0.1.1.2
+version:        0.1.2.0
 description:    Please see the README on GitHub at <https://github.com/dustin/gpmf#readme>
 homepage:       https://github.com/dustin/gpmf#readme
 bug-reports:    https://github.com/dustin/gpmf/issues
@@ -30,6 +30,7 @@
       GoPro.Command.DEVCString
       GoPro.DEVC
       GoPro.GPMF
+      GoPro.GPMF.Lenses
   other-modules:
       Paths_gpmf
   hs-source-dirs:
diff --git a/src/GoPro/DEVC.hs b/src/GoPro/DEVC.hs
--- a/src/GoPro/DEVC.hs
+++ b/src/GoPro/DEVC.hs
@@ -29,17 +29,17 @@
   Telemetry(..), tele_stmp, tele_tsmp, tele_name, tele_values
   ) where
 
-import           Control.Lens    hiding (cons)
-import           Control.Monad   (guard)
-import           Data.Foldable   (fold)
-import           Data.List       (transpose)
-import           Data.Map.Strict (Map)
-import qualified Data.Map.Strict as Map
-import           Data.Maybe      (fromMaybe, listToMaybe, mapMaybe)
-import           Data.Time.Clock (UTCTime (..))
-import           Data.Word       (Word64)
+import           Control.Lens      hiding (cons)
+import           Data.Foldable     (fold)
+import           Data.List         (transpose)
+import           Data.Map.Strict   (Map)
+import qualified Data.Map.Strict   as Map
+import           Data.Maybe        (fromMaybe, mapMaybe)
+import           Data.Time.Clock   (UTCTime (..))
+import           Data.Word         (Word64)
 
 import           GoPro.GPMF
+import           GoPro.GPMF.Lenses
 
 data Accelerometer = Accelerometer
     { _acc_temp :: Float
@@ -156,7 +156,7 @@
         updTele _ o                                 = o
 
         tvals :: TVals
-        tvals = (fromMaybe (TVUnknown vals) . ($ vals)) . foldr findGrokker (const Nothing) . concatMap four $ vals
+        tvals = (fromMaybe (TVUnknown vals) . ($ vals)) . foldr findGrokker (const Nothing) . foldMap four $ vals
           where
             four (GNested (x, _)) = [x]
             four _                = []
@@ -172,22 +172,23 @@
 mkDEVC _ = const Nothing
 
 findVal :: FourCC -> [Value] -> Maybe [Value]
-findVal f = listToMaybe . findAll f
+findVal f = exactlyOne . findAll f
 
 findAll :: FourCC -> [Value] -> [[Value]]
-findAll f = mapMaybe g
-  where
-    g (GNested (fc, vs)) | fc == f = Just vs
-    g _                            = Nothing
+findAll f = toListOf (folded . _GNested . filtered (\(d,_) -> d == f) . _2)
 
+exactlyOne :: [a] -> Maybe a
+exactlyOne [a] = Just a
+exactlyOne _   = Nothing
+
 grokSens :: FourCC -> (Float -> [(Float, Float, Float)] -> a) -> [Value] -> Maybe a
 grokSens sens cons vals = do
-  GFloat templ <- listToMaybe =<< findVal "TMPC" vals
-  GInt16 scall <- listToMaybe =<< findVal "SCAL" vals
+  GFloat templ <- exactlyOne =<< findVal "TMPC" vals
+  GInt16 scall <- exactlyOne =<< findVal "SCAL" vals
   readings <- mapMaybe ungint <$> findVal sens vals
 
-  temp <- listToMaybe templ
-  scal <- realToFrac <$> listToMaybe scall
+  temp <- exactlyOne templ
+  scal <- realToFrac <$> exactlyOne scall
   scaled <- traverse (trip . fmap (\x -> realToFrac x / scal)) readings
 
   pure $ cons temp scaled
@@ -215,11 +216,11 @@
 
 grokGPS :: [Value] -> Maybe GPS
 grokGPS vals = do
-  GUint16 [gpsp] <- listToMaybe =<< findVal "GPSP" vals
-  GTimestamp time <- listToMaybe =<< findVal "GPSU" vals
+  GUint16 [gpsp] <- exactlyOne =<< findVal "GPSP" vals
+  GTimestamp time <- exactlyOne =<< findVal "GPSU" vals
   scals <- mapMaybe (fmap realToFrac . anInt) <$> findVal "SCAL" vals
   g5s <- findVal "GPS5" vals
-  rs <- mconcat <$> traverse (readings scals) g5s
+  rs <- fold <$> traverse (readings scals) g5s
 
   pure $ GPS (fromIntegral gpsp) time rs
 
@@ -231,13 +232,12 @@
     readings _ _ = Nothing
 
     anInt (GInt32 [x]) = Just x
-    anInt _ = Nothing
+    anInt _            = Nothing
 
 grokAudioLevel :: [Value] -> Maybe AudioLevel
 grokAudioLevel vals = do
-  alps <- transpose . mapMaybe de <$> findVal "AALP" vals
-  guard $ length alps == 2
-  pure $ AudioLevel (alps !! 0) (alps !! 1)
+  [l1, l2] <- transpose . mapMaybe de <$> findVal "AALP" vals
+  pure $ AudioLevel l1 l2
 
   where de (GInt8 xs)      = Just $ fmap fromIntegral xs
         de (GComplex _ xs) = Just . fold . mapMaybe de $ xs
diff --git a/src/GoPro/GPMF.hs b/src/GoPro/GPMF.hs
--- a/src/GoPro/GPMF.hs
+++ b/src/GoPro/GPMF.hs
@@ -9,8 +9,8 @@
 A low-level parser for <https://github.com/gopro/gpmf-parser GPMF> telemetry data.
 -}
 
-{-# LANGUAGE TupleSections #-}
 {-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE TupleSections #-}
 
 module GoPro.GPMF (parseGPMF, Value(..), FourCC(..)) where
 
@@ -28,7 +28,7 @@
 import           Data.Time.Clock                  (UTCTime)
 import           Data.Time.Format                 (defaultTimeLocale, parseTimeM)
 import           Data.Word                        (Word16, Word32, Word64, Word8)
-import GHC.Generics (Generic)
+import           GHC.Generics                     (Generic)
 
 {-
 Type Char	Definition	typedef	Comment
diff --git a/src/GoPro/GPMF/Lenses.hs b/src/GoPro/GPMF/Lenses.hs
new file mode 100644
--- /dev/null
+++ b/src/GoPro/GPMF/Lenses.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module GoPro.GPMF.Lenses where
+
+import           Control.Lens
+import           GoPro.GPMF
+
+makePrisms ''Value
