diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -2,3 +2,7 @@
 
 * Initial version.
 
+0.0.3
+
+* Add folds, getters, traversals.
+
diff --git a/foscam-filename.cabal b/foscam-filename.cabal
--- a/foscam-filename.cabal
+++ b/foscam-filename.cabal
@@ -1,12 +1,12 @@
 name:               foscam-filename
-version:            0.0.1
+version:            0.0.3
 license:            BSD3
 license-file:       LICENSE
 author:             Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ> <dibblego>
 maintainer:         Tony Morris <ʇǝu˙sıɹɹoɯʇ@ןןǝʞsɐɥ> <dibblego>
 copyright:          Copyright (C) 2015 Tony Morris
 synopsis:           Foscam File format
-category:           Data
+category:           Data, Parsing, File
 description:        
   Foscam File format
 
diff --git a/src/Data/Foscam/File/DeviceId.hs b/src/Data/Foscam/File/DeviceId.hs
--- a/src/Data/Foscam/File/DeviceId.hs
+++ b/src/Data/Foscam/File/DeviceId.hs
@@ -1,17 +1,20 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
 
 module Data.Foscam.File.DeviceId(
   DeviceId(..)
 , AsDeviceId(..)
 , deviceId
+, getDeviceIdCharacters
 ) where
 
 import Control.Applicative(Applicative((<*>)), (<$>))
-import Control.Category(id)
-import Control.Lens(Optic', Choice, prism', (^?), ( # ))
+import Control.Category(id, (.))
+import Control.Lens(Optic', Choice, Fold, prism', (^?), ( # ))
 import Control.Monad(Monad)
+import Data.Char(Char)
 import Data.Eq(Eq)
 import Data.Foscam.File.DeviceIdCharacter
 import Data.Functor(fmap)
@@ -22,7 +25,6 @@
 import Text.Parser.Combinators((<?>))
 import Prelude(Show)
 
-
 -- $setup
 -- >>> import Text.Parsec
 
@@ -50,6 +52,10 @@
   _DeviceId =
     id
 
+instance (p ~ (->), Applicative f) => AsDeviceIdCharacter p f DeviceId where
+  _DeviceIdCharacter f (DeviceId d01 d02 d03 d04 d05 d06 d07 d08 d09 d10 d11 d12) =
+    DeviceId <$> f d01 <*> f d02 <*> f d03 <*> f d04 <*> f d05 <*> f d06 <*> f d07 <*> f d08 <*> f d09 <*> f d10 <*> f d11 <*> f d12
+
 instance (Choice p, Applicative f) => AsDeviceId p f String where
   _DeviceId =
     prism'
@@ -72,6 +78,12 @@
                       f c12
                _ ->
                  Nothing)
+
+getDeviceIdCharacters :: 
+  Fold DeviceId Char
+getDeviceIdCharacters =
+  _DeviceIdCharacter . getDeviceIdCharacter
+
 
 -- |
 --
diff --git a/src/Data/Foscam/File/DeviceIdCharacter.hs b/src/Data/Foscam/File/DeviceIdCharacter.hs
--- a/src/Data/Foscam/File/DeviceIdCharacter.hs
+++ b/src/Data/Foscam/File/DeviceIdCharacter.hs
@@ -1,16 +1,18 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
 
 module Data.Foscam.File.DeviceIdCharacter(
   DeviceIdCharacter
 , AsDeviceIdCharacter(..)
 , deviceIdCharacter
+, getDeviceIdCharacter
 ) where
 
 import Control.Applicative(Applicative(pure))
 import Control.Category(id, (.))
-import Control.Lens(Optic', Choice, prism')
+import Control.Lens(Optic', Choice, Getter, prism', re)
 import Control.Monad(Monad(fail))
 import Data.Char(Char)
 import Data.Eq(Eq)
@@ -18,11 +20,12 @@
 import Data.Foscam.File.Internal(boolj, charP)
 import Data.List(elem, (++))
 import Data.Ord(Ord)
+import Data.String(String)
+import Data.Traversable(traverse)
 import Text.Parser.Char(CharParsing)
 import Text.Parser.Combinators((<?>))
 import Prelude(Show)
 
-
 -- $setup
 -- >>> import Text.Parsec
 
@@ -43,6 +46,15 @@
     prism'
       (\(DeviceIdCharacter c) -> c)
       (fmap DeviceIdCharacter . boolj (`elem` (['A'..'F'] ++ ['0'..'9'])))
+
+instance (p ~ (->), Applicative f) => AsDeviceIdCharacter p f String where
+  _DeviceIdCharacter =
+    traverse . _DeviceIdCharacter
+
+getDeviceIdCharacter ::
+  Getter DeviceIdCharacter Char
+getDeviceIdCharacter =
+  re _DeviceIdCharacter
 
 -- |
 --
