diff --git a/Data/ZoomCache/PCM/IEEE754.hs b/Data/ZoomCache/PCM/IEEE754.hs
--- a/Data/ZoomCache/PCM/IEEE754.hs
+++ b/Data/ZoomCache/PCM/IEEE754.hs
@@ -73,7 +73,6 @@
 import Control.Applicative ((<$>))
 import Data.ByteString (ByteString)
 import Data.Iteratee (Iteratee)
-import Data.Word
 import Text.Printf
 
 import Data.ZoomCache.Codec
@@ -99,7 +98,8 @@
     prettyRaw         = prettyPacketPCMFloat
     prettySummaryData = prettySummaryPCMFloat
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Float)) #-}
+    deltaDecodeRaw    = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Float)) #-}
 
 instance ZoomWrite (PCM Float) where
@@ -111,6 +111,7 @@
 instance ZoomWritable (PCM Float) where
     data SummaryWork (PCM Float) = SummaryWorkPCMFloat
         { swPCMFloatTime  :: {-# UNPACK #-}!TimeStamp
+        , swPCMFloatLast  :: {-# UNPACK #-}!Float
         , swPCMFloatMin   :: {-# UNPACK #-}!Float
         , swPCMFloatMax   :: {-# UNPACK #-}!Float
         , swPCMFloatSum   :: {-# UNPACK #-}!Double
@@ -123,6 +124,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Float where
     pcmFromRaw = fromFloat
@@ -133,6 +135,7 @@
     pcmRMS = summaryPCMFloatRMS
 
     pcmWorkTime = swPCMFloatTime
+    pcmWorkLast = swPCMFloatLast
     pcmWorkMin = swPCMFloatMin
     pcmWorkMax = swPCMFloatMax
     pcmWorkSum = swPCMFloatSum
@@ -165,7 +168,8 @@
     prettyRaw         = prettyPacketPCMFloat
     prettySummaryData = prettySummaryPCMFloat
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Double)) #-}
+    deltaDecodeRaw    = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Double)) #-}
 
 instance ZoomWrite (PCM Double) where
@@ -177,6 +181,7 @@
 instance ZoomWritable (PCM Double) where
     data SummaryWork (PCM Double) = SummaryWorkPCMDouble
         { swPCMDoubleTime  :: {-# UNPACK #-}!TimeStamp
+        , swPCMDoubleLast  :: {-# UNPACK #-}!Double
         , swPCMDoubleMin   :: {-# UNPACK #-}!Double
         , swPCMDoubleMax   :: {-# UNPACK #-}!Double
         , swPCMDoubleSum   :: {-# UNPACK #-}!Double
@@ -189,6 +194,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Double where
     pcmFromRaw = fromDouble
@@ -199,6 +205,7 @@
     pcmRMS = summaryPCMDoubleRMS
 
     pcmWorkTime = swPCMDoubleTime
+    pcmWorkLast = swPCMDoubleLast
     pcmWorkMin = swPCMDoubleMin
     pcmWorkMax = swPCMDoubleMax
     pcmWorkSum = swPCMDoubleSum
@@ -229,6 +236,7 @@
                     => TimeStamp -> SummaryWork (PCM a)
 initSummaryPCMFloat entry = pcmMkSummaryWork
     entry
+    0.0
     floatMax
     (negate floatMax)
     0.0
diff --git a/Data/ZoomCache/PCM/Int.hs b/Data/ZoomCache/PCM/Int.hs
--- a/Data/ZoomCache/PCM/Int.hs
+++ b/Data/ZoomCache/PCM/Int.hs
@@ -99,7 +99,6 @@
 import Data.ByteString (ByteString)
 import Data.Int
 import Data.Iteratee (Iteratee)
-import Data.Word
 import Text.Printf
 
 import Data.ZoomCache.Codec
@@ -125,7 +124,8 @@
     prettyRaw         = prettyPacketPCMInt
     prettySummaryData = prettySummaryPCMInt
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Int)) #-}
+    deltaDecodeRaw = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int)) #-}
 
 instance ZoomWrite (PCM Int) where
@@ -137,6 +137,7 @@
 instance ZoomWritable (PCM Int) where
     data SummaryWork (PCM Int) = SummaryWorkPCMInt
         { swPCMIntTime  :: {-# UNPACK #-}!TimeStamp
+        , swPCMIntLast  :: {-# UNPACK #-}!Int
         , swPCMIntMin   :: {-# UNPACK #-}!Int
         , swPCMIntMax   :: {-# UNPACK #-}!Int
         , swPCMIntSum   :: {-# UNPACK #-}!Double
@@ -150,6 +151,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Int where
     pcmFromRaw = fromIntegral32be
@@ -160,6 +162,7 @@
     pcmRMS = summaryIntRMS
 
     pcmWorkTime = swPCMIntTime
+    pcmWorkLast = swPCMIntLast
     pcmWorkMin = swPCMIntMin
     pcmWorkMax = swPCMIntMax
     pcmWorkSum = swPCMIntSum
@@ -193,7 +196,8 @@
     prettyRaw         = prettyPacketPCMInt
     prettySummaryData = prettySummaryPCMInt
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Int8)) #-}
+    deltaDecodeRaw = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int8)) #-}
 
 instance ZoomWrite (PCM Int8) where
@@ -205,6 +209,7 @@
 instance ZoomWritable (PCM Int8) where
     data SummaryWork (PCM Int8) = SummaryWorkPCMInt8
         { swPCMInt8Time  :: {-# UNPACK #-}!TimeStamp
+        , swPCMInt8Last  :: {-# UNPACK #-}!Int8
         , swPCMInt8Min   :: {-# UNPACK #-}!Int8
         , swPCMInt8Max   :: {-# UNPACK #-}!Int8
         , swPCMInt8Sum   :: {-# UNPACK #-}!Double
@@ -218,6 +223,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Int8 where
     pcmFromRaw = fromInt8
@@ -228,6 +234,7 @@
     pcmRMS = summaryInt8RMS
 
     pcmWorkTime = swPCMInt8Time
+    pcmWorkLast = swPCMInt8Last
     pcmWorkMin = swPCMInt8Min
     pcmWorkMax = swPCMInt8Max
     pcmWorkSum = swPCMInt8Sum
@@ -261,7 +268,8 @@
     prettyRaw         = prettyPacketPCMInt
     prettySummaryData = prettySummaryPCMInt
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Int16)) #-}
+    deltaDecodeRaw = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int16)) #-}
 
 instance ZoomWrite (PCM Int16) where
@@ -273,6 +281,7 @@
 instance ZoomWritable (PCM Int16) where
     data SummaryWork (PCM Int16) = SummaryWorkPCMInt16
         { swPCMInt16Time  :: {-# UNPACK #-}!TimeStamp
+        , swPCMInt16Last  :: {-# UNPACK #-}!Int16
         , swPCMInt16Min   :: {-# UNPACK #-}!Int16
         , swPCMInt16Max   :: {-# UNPACK #-}!Int16
         , swPCMInt16Sum   :: {-# UNPACK #-}!Double
@@ -286,6 +295,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Int16 where
     pcmFromRaw = fromInt16be
@@ -296,6 +306,7 @@
     pcmRMS = summaryInt16RMS
 
     pcmWorkTime = swPCMInt16Time
+    pcmWorkLast = swPCMInt16Last
     pcmWorkMin = swPCMInt16Min
     pcmWorkMax = swPCMInt16Max
     pcmWorkSum = swPCMInt16Sum
@@ -329,7 +340,8 @@
     prettyRaw         = prettyPacketPCMInt
     prettySummaryData = prettySummaryPCMInt
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Int32)) #-}
+    deltaDecodeRaw = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int32)) #-}
 
 instance ZoomWrite (PCM Int32) where
@@ -341,6 +353,7 @@
 instance ZoomWritable (PCM Int32) where
     data SummaryWork (PCM Int32) = SummaryWorkPCMInt32
         { swPCMInt32Time  :: {-# UNPACK #-}!TimeStamp
+        , swPCMInt32Last  :: {-# UNPACK #-}!Int32
         , swPCMInt32Min   :: {-# UNPACK #-}!Int32
         , swPCMInt32Max   :: {-# UNPACK #-}!Int32
         , swPCMInt32Sum   :: {-# UNPACK #-}!Double
@@ -354,6 +367,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Int32 where
     pcmFromRaw = fromIntegral32be
@@ -364,6 +378,7 @@
     pcmRMS = summaryInt32RMS
 
     pcmWorkTime = swPCMInt32Time
+    pcmWorkLast = swPCMInt32Last
     pcmWorkMin = swPCMInt32Min
     pcmWorkMax = swPCMInt32Max
     pcmWorkSum = swPCMInt32Sum
@@ -397,7 +412,8 @@
     prettyRaw         = prettyPacketPCMInt
     prettySummaryData = prettySummaryPCMInt
 
-{-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee [Word8] m (SummaryData (PCM Int64)) #-}
+    deltaDecodeRaw = deltaDecodePCM
+
 {-# SPECIALIZE readSummaryPCM :: (Functor m, Monad m) => Iteratee ByteString m (SummaryData (PCM Int64)) #-}
 
 instance ZoomWrite (PCM Int64) where
@@ -409,6 +425,7 @@
 instance ZoomWritable (PCM Int64) where
     data SummaryWork (PCM Int64) = SummaryWorkPCMInt64
         { swPCMInt64Time  :: {-# UNPACK #-}!TimeStamp
+        , swPCMInt64Last  :: {-# UNPACK #-}!Int64
         , swPCMInt64Min   :: {-# UNPACK #-}!Int64
         , swPCMInt64Max   :: {-# UNPACK #-}!Int64
         , swPCMInt64Sum   :: {-# UNPACK #-}!Double
@@ -422,6 +439,7 @@
     toSummaryData     = mkSummaryPCM
     updateSummaryData = updateSummaryPCM
     appendSummaryData = appendSummaryPCM
+    deltaEncodeRaw    = deltaEncodePCM
 
 instance ZoomPCM Int64 where
     pcmFromRaw = fromInt64be
@@ -432,6 +450,7 @@
     pcmRMS = summaryInt64RMS
 
     pcmWorkTime = swPCMInt64Time
+    pcmWorkLast = swPCMInt64Last
     pcmWorkMin = swPCMInt64Min
     pcmWorkMax = swPCMInt64Max
     pcmWorkSum = swPCMInt64Sum
diff --git a/Data/ZoomCache/PCM/Internal.hs b/Data/ZoomCache/PCM/Internal.hs
--- a/Data/ZoomCache/PCM/Internal.hs
+++ b/Data/ZoomCache/PCM/Internal.hs
@@ -10,26 +10,24 @@
     , mkSummaryPCM
     , appendSummaryPCM
     , updateSummaryPCM
+    , deltaDecodePCM
+    , deltaEncodePCM
 ) where
 
 import Blaze.ByteString.Builder
 import Control.Applicative ((<$>))
 import Control.Monad (replicateM)
+import Data.ByteString (ByteString)
 import Data.Iteratee (Iteratee)
-import qualified Data.Iteratee as I
-import qualified Data.ListLike as LL
 import Data.Monoid
-import Data.Word
 
 import Data.ZoomCache.Codec
 import Data.ZoomCache.PCM.Types
 
 ----------------------------------------------------------------------
 
-readSummaryPCM :: (I.Nullable s, LL.ListLike s Word8,
-                   Functor m, Monad m,
-                   ZoomPCM a)
-               => Iteratee s m (SummaryData (PCM a))
+readSummaryPCM :: (Functor m, Monad m, ZoomPCM a)
+               => Iteratee ByteString m (SummaryData (PCM a))
 readSummaryPCM = do
     [mn,mx] <- replicateM 2 (unPCM <$> readRaw)
     [avg,rms] <- replicateM 2 readDouble64be
@@ -45,7 +43,7 @@
 
 initSummaryPCMBounded :: (Bounded a, ZoomPCM a)
                       => TimeStamp -> SummaryWork (PCM a)
-initSummaryPCMBounded entry = pcmMkSummaryWork entry maxBound minBound 0.0 0.0
+initSummaryPCMBounded entry = pcmMkSummaryWork entry 0 maxBound minBound 0.0 0.0
 {-# INLINEABLE initSummaryPCMBounded #-}
 
 mkSummaryPCM :: ZoomPCM a
@@ -77,10 +75,19 @@
                  -> SummaryWork (PCM a)
                  -> SummaryWork (PCM a)
 updateSummaryPCM t (PCM d) sw =
-    pcmMkSummaryWork t (min (pcmWorkMin sw) d)
-                       (max (pcmWorkMax sw) d)
-                       ((pcmWorkSum sw) + realToFrac (d * dur))
-                       ((pcmWorkSumSq sw) + realToFrac (d*d * dur))
+    pcmMkSummaryWork t d
+                     (min (pcmWorkMin sw) d)
+                     (max (pcmWorkMax sw) d)
+                     ((pcmWorkSum sw) + realToFrac (d * dur))
+                     ((pcmWorkSumSq sw) + realToFrac (d*d * dur))
     where
         !dur = fromIntegral $ (unTS t) - (unTS (pcmWorkTime sw))
 {-# INLINEABLE updateSummaryPCM #-}
+
+deltaDecodePCM :: ZoomPCM a => [PCM a] -> [PCM a]
+deltaDecodePCM = map PCM . deltaDecode . map unPCM
+{-# INLINE deltaDecodePCM #-}
+
+deltaEncodePCM :: ZoomPCM a => SummaryWork (PCM a) -> PCM a -> PCM a
+deltaEncodePCM sw (PCM d) = PCM (d - pcmWorkLast sw)
+{-# INLINE deltaEncodePCM #-}
diff --git a/Data/ZoomCache/PCM/Types.hs b/Data/ZoomCache/PCM/Types.hs
--- a/Data/ZoomCache/PCM/Types.hs
+++ b/Data/ZoomCache/PCM/Types.hs
@@ -32,12 +32,13 @@
     pcmRMS :: SummaryData (PCM a) -> Double
 
     pcmWorkTime :: SummaryWork (PCM a) -> TimeStamp
+    pcmWorkLast :: SummaryWork (PCM a) -> a
     pcmWorkMin :: SummaryWork (PCM a) -> a
     pcmWorkMax :: SummaryWork (PCM a) -> a
     pcmWorkSum :: SummaryWork (PCM a) -> Double
     pcmWorkSumSq :: SummaryWork (PCM a) -> Double
 
     pcmMkSummary :: a -> a -> Double -> Double -> SummaryData (PCM a)
-    pcmMkSummaryWork :: TimeStamp -> a -> a -> Double -> Double
+    pcmMkSummaryWork :: TimeStamp -> a -> a -> a -> Double -> Double
                      -> SummaryWork (PCM a)
 
diff --git a/zoom-cache-pcm.cabal b/zoom-cache-pcm.cabal
--- a/zoom-cache-pcm.cabal
+++ b/zoom-cache-pcm.cabal
@@ -3,7 +3,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.1.1.0
+Version:             0.2.0.0
 
 Synopsis:            Library for zoom-cache PCM audio codecs
 
@@ -48,7 +48,7 @@
     containers                >= 0.2     && < 0.5,
     iteratee                  >= 0.8.6.0 && < 0.9,
     ListLike                  >= 1.0     && < 4,
-    zoom-cache                >= 0.6.0.0 && < 0.7
+    zoom-cache                >= 0.7.0.0 && < 0.8
 
   Exposed-modules:
     Data.ZoomCache.PCM
