diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               0.52.2
+version:               1.0.0
 synopsis:              SwiftNav's SBP Library
 homepage:              https://github.com/swift-nav/libsbp
 license:               LGPL-3
diff --git a/src/SwiftNav/SBP.hs b/src/SwiftNav/SBP.hs
--- a/src/SwiftNav/SBP.hs
+++ b/src/SwiftNav/SBP.hs
@@ -72,6 +72,7 @@
    | SBPMsgEphemeris MsgEphemeris Msg
    | SBPMsgEphemerisDepA MsgEphemerisDepA Msg
    | SBPMsgEphemerisDepB MsgEphemerisDepB Msg
+   | SBPMsgEphemerisDepC MsgEphemerisDepC Msg
    | SBPMsgExtEvent MsgExtEvent Msg
    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg
    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg
@@ -96,6 +97,7 @@
    | SBPMsgNapDeviceDnaResp MsgNapDeviceDnaResp Msg
    | SBPMsgObs MsgObs Msg
    | SBPMsgObsDepA MsgObsDepA Msg
+   | SBPMsgObsDepB MsgObsDepB Msg
    | SBPMsgPosEcef MsgPosEcef Msg
    | SBPMsgPosLlh MsgPosLlh Msg
    | SBPMsgPrintDep MsgPrintDep Msg
@@ -120,6 +122,7 @@
    | SBPMsgTrackingStateDepA MsgTrackingStateDepA Msg
    | SBPMsgTweet MsgTweet Msg
    | SBPMsgUartState MsgUartState Msg
+   | SBPMsgUartStateDepa MsgUartStateDepa Msg
    | SBPMsgUserData MsgUserData Msg
    | SBPMsgVelEcef MsgVelEcef Msg
    | SBPMsgVelNed MsgVelNed Msg
@@ -154,6 +157,7 @@
           | _msgSBPType == msgEphemeris = SBPMsgEphemeris (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisDepA = SBPMsgEphemerisDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisDepB = SBPMsgEphemerisDepB (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisDepC = SBPMsgEphemerisDepC (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgExtEvent = SBPMsgExtEvent (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFileioReadDirReq = SBPMsgFileioReadDirReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFileioReadDirResp = SBPMsgFileioReadDirResp (decode (fromStrict _msgSBPPayload)) m
@@ -178,6 +182,7 @@
           | _msgSBPType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgObs = SBPMsgObs (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgObsDepA = SBPMsgObsDepA (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgObsDepB = SBPMsgObsDepB (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgPosEcef = SBPMsgPosEcef (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgPosLlh = SBPMsgPosLlh (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgPrintDep = SBPMsgPrintDep (decode (fromStrict _msgSBPPayload)) m
@@ -202,6 +207,7 @@
           | _msgSBPType == msgTrackingStateDepA = SBPMsgTrackingStateDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTweet = SBPMsgTweet (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgUartState = SBPMsgUartState (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgUartStateDepa = SBPMsgUartStateDepa (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgUserData = SBPMsgUserData (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgVelEcef = SBPMsgVelEcef (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgVelNed = SBPMsgVelNed (decode (fromStrict _msgSBPPayload)) m
@@ -228,6 +234,7 @@
       encode' (SBPMsgEphemeris _ m) = put m
       encode' (SBPMsgEphemerisDepA _ m) = put m
       encode' (SBPMsgEphemerisDepB _ m) = put m
+      encode' (SBPMsgEphemerisDepC _ m) = put m
       encode' (SBPMsgExtEvent _ m) = put m
       encode' (SBPMsgFileioReadDirReq _ m) = put m
       encode' (SBPMsgFileioReadDirResp _ m) = put m
@@ -252,6 +259,7 @@
       encode' (SBPMsgNapDeviceDnaResp _ m) = put m
       encode' (SBPMsgObs _ m) = put m
       encode' (SBPMsgObsDepA _ m) = put m
+      encode' (SBPMsgObsDepB _ m) = put m
       encode' (SBPMsgPosEcef _ m) = put m
       encode' (SBPMsgPosLlh _ m) = put m
       encode' (SBPMsgPrintDep _ m) = put m
@@ -276,6 +284,7 @@
       encode' (SBPMsgTrackingStateDepA _ m) = put m
       encode' (SBPMsgTweet _ m) = put m
       encode' (SBPMsgUartState _ m) = put m
+      encode' (SBPMsgUartStateDepa _ m) = put m
       encode' (SBPMsgUserData _ m) = put m
       encode' (SBPMsgVelEcef _ m) = put m
       encode' (SBPMsgVelNed _ m) = put m
@@ -305,6 +314,7 @@
         | msgType == msgEphemeris = SBPMsgEphemeris <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisDepA = SBPMsgEphemerisDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisDepB = SBPMsgEphemerisDepB <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisDepC = SBPMsgEphemerisDepC <$> parseJSON obj <*> parseJSON obj
         | msgType == msgExtEvent = SBPMsgExtEvent <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFileioReadDirReq = SBPMsgFileioReadDirReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFileioReadDirResp = SBPMsgFileioReadDirResp <$> parseJSON obj <*> parseJSON obj
@@ -329,6 +339,7 @@
         | msgType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgObs = SBPMsgObs <$> parseJSON obj <*> parseJSON obj
         | msgType == msgObsDepA = SBPMsgObsDepA <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgObsDepB = SBPMsgObsDepB <$> parseJSON obj <*> parseJSON obj
         | msgType == msgPosEcef = SBPMsgPosEcef <$> parseJSON obj <*> parseJSON obj
         | msgType == msgPosLlh = SBPMsgPosLlh <$> parseJSON obj <*> parseJSON obj
         | msgType == msgPrintDep = SBPMsgPrintDep <$> parseJSON obj <*> parseJSON obj
@@ -353,6 +364,7 @@
         | msgType == msgTrackingStateDepA = SBPMsgTrackingStateDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTweet = SBPMsgTweet <$> parseJSON obj <*> parseJSON obj
         | msgType == msgUartState = SBPMsgUartState <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgUartStateDepa = SBPMsgUartStateDepa <$> parseJSON obj <*> parseJSON obj
         | msgType == msgUserData = SBPMsgUserData <$> parseJSON obj <*> parseJSON obj
         | msgType == msgVelEcef = SBPMsgVelEcef <$> parseJSON obj <*> parseJSON obj
         | msgType == msgVelNed = SBPMsgVelNed <$> parseJSON obj <*> parseJSON obj
@@ -384,6 +396,7 @@
   toJSON (SBPMsgEphemeris n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisDepB n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisDepC n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgExtEvent n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgFileioReadDirReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgFileioReadDirResp n m) = toJSON n `mergeValues` toJSON m
@@ -408,6 +421,7 @@
   toJSON (SBPMsgNapDeviceDnaResp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgObs n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgObsDepA n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgObsDepB n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgPosEcef n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgPosLlh n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgPrintDep n m) = toJSON n `mergeValues` toJSON m
@@ -432,6 +446,7 @@
   toJSON (SBPMsgTrackingStateDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTweet n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgUartState n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgUartStateDepa n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgUserData n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgVelEcef n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgVelNed n m) = toJSON n `mergeValues` toJSON m
@@ -457,6 +472,7 @@
   msg f (SBPMsgEphemeris n m) = SBPMsgEphemeris n <$> f m
   msg f (SBPMsgEphemerisDepA n m) = SBPMsgEphemerisDepA n <$> f m
   msg f (SBPMsgEphemerisDepB n m) = SBPMsgEphemerisDepB n <$> f m
+  msg f (SBPMsgEphemerisDepC n m) = SBPMsgEphemerisDepC n <$> f m
   msg f (SBPMsgExtEvent n m) = SBPMsgExtEvent n <$> f m
   msg f (SBPMsgFileioReadDirReq n m) = SBPMsgFileioReadDirReq n <$> f m
   msg f (SBPMsgFileioReadDirResp n m) = SBPMsgFileioReadDirResp n <$> f m
@@ -481,6 +497,7 @@
   msg f (SBPMsgNapDeviceDnaResp n m) = SBPMsgNapDeviceDnaResp n <$> f m
   msg f (SBPMsgObs n m) = SBPMsgObs n <$> f m
   msg f (SBPMsgObsDepA n m) = SBPMsgObsDepA n <$> f m
+  msg f (SBPMsgObsDepB n m) = SBPMsgObsDepB n <$> f m
   msg f (SBPMsgPosEcef n m) = SBPMsgPosEcef n <$> f m
   msg f (SBPMsgPosLlh n m) = SBPMsgPosLlh n <$> f m
   msg f (SBPMsgPrintDep n m) = SBPMsgPrintDep n <$> f m
@@ -505,6 +522,7 @@
   msg f (SBPMsgTrackingStateDepA n m) = SBPMsgTrackingStateDepA n <$> f m
   msg f (SBPMsgTweet n m) = SBPMsgTweet n <$> f m
   msg f (SBPMsgUartState n m) = SBPMsgUartState n <$> f m
+  msg f (SBPMsgUartStateDepa n m) = SBPMsgUartStateDepa n <$> f m
   msg f (SBPMsgUserData n m) = SBPMsgUserData n <$> f m
   msg f (SBPMsgVelEcef n m) = SBPMsgVelEcef n <$> f m
   msg f (SBPMsgVelNed n m) = SBPMsgVelNed n <$> f m
diff --git a/src/SwiftNav/SBP/Observation.hs b/src/SwiftNav/SBP/Observation.hs
--- a/src/SwiftNav/SBP/Observation.hs
+++ b/src/SwiftNav/SBP/Observation.hs
@@ -56,7 +56,7 @@
 --
 -- Carrier phase measurement in cycles represented as a 40-bit fixed point
 -- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of
--- fractional cycles.
+-- fractional cycles.  This phase has the  same sign as the pseudorange.
 data CarrierPhase = CarrierPhase
   { _carrierPhase_i :: Int32
     -- ^ Carrier phase whole cycles
@@ -103,12 +103,14 @@
 
 -- | PackedObsContent.
 --
--- Pseudorange and carrier phase observation for a satellite being tracked.
+-- Pseudorange and carrier phase observation for a satellite being tracked. The
+-- observations should be interoperable with 3rd party  receivers and conform
+-- with typical RTCMv3 GNSS observations.
 data PackedObsContent = PackedObsContent
   { _packedObsContent_P  :: Word32
     -- ^ Pseudorange observation
   , _packedObsContent_L  :: CarrierPhase
-    -- ^ Carrier phase observation
+    -- ^ Carrier phase observation with typical sign convention.
   , _packedObsContent_cn0 :: Word8
     -- ^ Carrier-to-Noise density
   , _packedObsContent_lock :: Word16
@@ -139,14 +141,16 @@
 $(makeLenses ''PackedObsContent)
 
 msgObs :: Word16
-msgObs = 0x0043
+msgObs = 0x0049
 
--- | SBP class for message MSG_OBS (0x0043).
+-- | SBP class for message MSG_OBS (0x0049).
 --
 -- The GPS observations message reports all the raw pseudorange and carrier
 -- phase observations for the satellites being tracked by the device. Carrier
 -- phase observation here is represented as a 40-bit fixed point number with
 -- Q32.8 layout (i.e. 32-bits of whole cycles and 8-bits of fractional cycles).
+-- The observations  should be interoperable with 3rd party receivers and
+-- conform  with typical RTCMv3 GNSS observations.
 data MsgObs = MsgObs
   { _msgObs_header :: ObservationHeader
     -- ^ Header of a GPS observation message
@@ -244,9 +248,9 @@
 $(makeLenses ''MsgBasePosEcef)
 
 msgEphemeris :: Word16
-msgEphemeris = 0x0047
+msgEphemeris = 0x0080
 
--- | SBP class for message MSG_EPHEMERIS (0x0047).
+-- | SBP class for message MSG_EPHEMERIS (0x0080).
 --
 -- The ephemeris message returns a set of satellite orbit parameters that is
 -- used to calculate GPS satellite position, velocity, and clock offset. Please
@@ -649,14 +653,184 @@
              ''MsgEphemerisDepB)
 $(makeLenses ''MsgEphemerisDepB)
 
+msgEphemerisDepC :: Word16
+msgEphemerisDepC = 0x0047
+
+-- | SBP class for message MSG_EPHEMERIS_DEP_C (0x0047).
+--
+-- The ephemeris message returns a set of satellite orbit parameters that is
+-- used to calculate GPS satellite position, velocity, and clock offset. Please
+-- see the Navstar GPS Space Segment/Navigation user interfaces (ICD-GPS-200,
+-- Table 20-III) for more details.
+data MsgEphemerisDepC = MsgEphemerisDepC
+  { _msgEphemerisDepC_tgd    :: Double
+    -- ^ Group delay differential between L1 and L2
+  , _msgEphemerisDepC_c_rs   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the orbit radius
+  , _msgEphemerisDepC_c_rc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
+  , _msgEphemerisDepC_c_uc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisDepC_c_us   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisDepC_c_ic   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisDepC_c_is   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisDepC_dn     :: Double
+    -- ^ Mean motion difference
+  , _msgEphemerisDepC_m0     :: Double
+    -- ^ Mean anomaly at reference time
+  , _msgEphemerisDepC_ecc    :: Double
+    -- ^ Eccentricity of satellite orbit
+  , _msgEphemerisDepC_sqrta  :: Double
+    -- ^ Square root of the semi-major axis of orbit
+  , _msgEphemerisDepC_omega0 :: Double
+    -- ^ Longitude of ascending node of orbit plane at weekly epoch
+  , _msgEphemerisDepC_omegadot :: Double
+    -- ^ Rate of right ascension
+  , _msgEphemerisDepC_w      :: Double
+    -- ^ Argument of perigee
+  , _msgEphemerisDepC_inc    :: Double
+    -- ^ Inclination
+  , _msgEphemerisDepC_inc_dot :: Double
+    -- ^ Inclination first derivative
+  , _msgEphemerisDepC_af0    :: Double
+    -- ^ Polynomial clock correction coefficient (clock bias)
+  , _msgEphemerisDepC_af1    :: Double
+    -- ^ Polynomial clock correction coefficient (clock drift)
+  , _msgEphemerisDepC_af2    :: Double
+    -- ^ Polynomial clock correction coefficient (rate of clock drift)
+  , _msgEphemerisDepC_toe_tow :: Double
+    -- ^ Time of week
+  , _msgEphemerisDepC_toe_wn :: Word16
+    -- ^ Week number
+  , _msgEphemerisDepC_toc_tow :: Double
+    -- ^ Clock reference time of week
+  , _msgEphemerisDepC_toc_wn :: Word16
+    -- ^ Clock reference week number
+  , _msgEphemerisDepC_valid  :: Word8
+    -- ^ Is valid?
+  , _msgEphemerisDepC_healthy :: Word8
+    -- ^ Satellite is healthy?
+  , _msgEphemerisDepC_sid    :: GnssSignal
+    -- ^ GNSS signal identifier
+  , _msgEphemerisDepC_iode   :: Word8
+    -- ^ Issue of ephemeris data
+  , _msgEphemerisDepC_iodc   :: Word16
+    -- ^ Issue of clock data
+  , _msgEphemerisDepC_reserved :: Word32
+    -- ^ Reserved field
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisDepC where
+  get = do
+    _msgEphemerisDepC_tgd <- getFloat64le
+    _msgEphemerisDepC_c_rs <- getFloat64le
+    _msgEphemerisDepC_c_rc <- getFloat64le
+    _msgEphemerisDepC_c_uc <- getFloat64le
+    _msgEphemerisDepC_c_us <- getFloat64le
+    _msgEphemerisDepC_c_ic <- getFloat64le
+    _msgEphemerisDepC_c_is <- getFloat64le
+    _msgEphemerisDepC_dn <- getFloat64le
+    _msgEphemerisDepC_m0 <- getFloat64le
+    _msgEphemerisDepC_ecc <- getFloat64le
+    _msgEphemerisDepC_sqrta <- getFloat64le
+    _msgEphemerisDepC_omega0 <- getFloat64le
+    _msgEphemerisDepC_omegadot <- getFloat64le
+    _msgEphemerisDepC_w <- getFloat64le
+    _msgEphemerisDepC_inc <- getFloat64le
+    _msgEphemerisDepC_inc_dot <- getFloat64le
+    _msgEphemerisDepC_af0 <- getFloat64le
+    _msgEphemerisDepC_af1 <- getFloat64le
+    _msgEphemerisDepC_af2 <- getFloat64le
+    _msgEphemerisDepC_toe_tow <- getFloat64le
+    _msgEphemerisDepC_toe_wn <- getWord16le
+    _msgEphemerisDepC_toc_tow <- getFloat64le
+    _msgEphemerisDepC_toc_wn <- getWord16le
+    _msgEphemerisDepC_valid <- getWord8
+    _msgEphemerisDepC_healthy <- getWord8
+    _msgEphemerisDepC_sid <- get
+    _msgEphemerisDepC_iode <- getWord8
+    _msgEphemerisDepC_iodc <- getWord16le
+    _msgEphemerisDepC_reserved <- getWord32le
+    return MsgEphemerisDepC {..}
+
+  put MsgEphemerisDepC {..} = do
+    putFloat64le _msgEphemerisDepC_tgd
+    putFloat64le _msgEphemerisDepC_c_rs
+    putFloat64le _msgEphemerisDepC_c_rc
+    putFloat64le _msgEphemerisDepC_c_uc
+    putFloat64le _msgEphemerisDepC_c_us
+    putFloat64le _msgEphemerisDepC_c_ic
+    putFloat64le _msgEphemerisDepC_c_is
+    putFloat64le _msgEphemerisDepC_dn
+    putFloat64le _msgEphemerisDepC_m0
+    putFloat64le _msgEphemerisDepC_ecc
+    putFloat64le _msgEphemerisDepC_sqrta
+    putFloat64le _msgEphemerisDepC_omega0
+    putFloat64le _msgEphemerisDepC_omegadot
+    putFloat64le _msgEphemerisDepC_w
+    putFloat64le _msgEphemerisDepC_inc
+    putFloat64le _msgEphemerisDepC_inc_dot
+    putFloat64le _msgEphemerisDepC_af0
+    putFloat64le _msgEphemerisDepC_af1
+    putFloat64le _msgEphemerisDepC_af2
+    putFloat64le _msgEphemerisDepC_toe_tow
+    putWord16le _msgEphemerisDepC_toe_wn
+    putFloat64le _msgEphemerisDepC_toc_tow
+    putWord16le _msgEphemerisDepC_toc_wn
+    putWord8 _msgEphemerisDepC_valid
+    putWord8 _msgEphemerisDepC_healthy
+    put _msgEphemerisDepC_sid
+    putWord8 _msgEphemerisDepC_iode
+    putWord16le _msgEphemerisDepC_iodc
+    putWord32le _msgEphemerisDepC_reserved
+
+$(deriveSBP 'msgEphemerisDepC ''MsgEphemerisDepC)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisDepC_" . stripPrefix "_msgEphemerisDepC_"}
+             ''MsgEphemerisDepC)
+$(makeLenses ''MsgEphemerisDepC)
+
+-- | CarrierPhaseDepA.
+--
+-- Carrier phase measurement in cycles represented as a 40-bit fixed point
+-- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of
+-- fractional cycles. This has the opposite sign convention than a typical GPS
+-- receiver and the phase has the opposite sign as the pseudorange.
+data CarrierPhaseDepA = CarrierPhaseDepA
+  { _carrierPhaseDepA_i :: Int32
+    -- ^ Carrier phase whole cycles
+  , _carrierPhaseDepA_f :: Word8
+    -- ^ Carrier phase fractional part
+  } deriving ( Show, Read, Eq )
+
+instance Binary CarrierPhaseDepA where
+  get = do
+    _carrierPhaseDepA_i <- liftM fromIntegral getWord32le
+    _carrierPhaseDepA_f <- getWord8
+    return CarrierPhaseDepA {..}
+
+  put CarrierPhaseDepA {..} = do
+    putWord32le $ fromIntegral _carrierPhaseDepA_i
+    putWord8 _carrierPhaseDepA_f
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_carrierPhaseDepA_" . stripPrefix "_carrierPhaseDepA_"}
+             ''CarrierPhaseDepA)
+$(makeLenses ''CarrierPhaseDepA)
+
 -- | PackedObsContentDepA.
 --
 -- Deprecated.
 data PackedObsContentDepA = PackedObsContentDepA
   { _packedObsContentDepA_P  :: Word32
     -- ^ Pseudorange observation
-  , _packedObsContentDepA_L  :: CarrierPhase
-    -- ^ Carrier phase observation
+  , _packedObsContentDepA_L  :: CarrierPhaseDepA
+    -- ^ Carrier phase observation with opposite sign from typical convention
   , _packedObsContentDepA_cn0 :: Word8
     -- ^ Carrier-to-Noise density
   , _packedObsContentDepA_lock :: Word16
@@ -686,6 +860,44 @@
              ''PackedObsContentDepA)
 $(makeLenses ''PackedObsContentDepA)
 
+-- | PackedObsContentDepB.
+--
+-- Pseudorange and carrier phase observation for a satellite being tracked.
+-- Pseudoranges are referenced to a nominal pseudorange.
+data PackedObsContentDepB = PackedObsContentDepB
+  { _packedObsContentDepB_P  :: Word32
+    -- ^ Pseudorange observation
+  , _packedObsContentDepB_L  :: CarrierPhaseDepA
+    -- ^ Carrier phase observation with opposite sign from typical convention.
+  , _packedObsContentDepB_cn0 :: Word8
+    -- ^ Carrier-to-Noise density
+  , _packedObsContentDepB_lock :: Word16
+    -- ^ Lock indicator. This value changes whenever a satellite signal has lost
+    -- and regained lock, indicating that the carrier phase ambiguity may have
+    -- changed.
+  , _packedObsContentDepB_sid :: GnssSignal
+    -- ^ GNSS signal identifier
+  } deriving ( Show, Read, Eq )
+
+instance Binary PackedObsContentDepB where
+  get = do
+    _packedObsContentDepB_P <- getWord32le
+    _packedObsContentDepB_L <- get
+    _packedObsContentDepB_cn0 <- getWord8
+    _packedObsContentDepB_lock <- getWord16le
+    _packedObsContentDepB_sid <- get
+    return PackedObsContentDepB {..}
+
+  put PackedObsContentDepB {..} = do
+    putWord32le _packedObsContentDepB_P
+    put _packedObsContentDepB_L
+    putWord8 _packedObsContentDepB_cn0
+    putWord16le _packedObsContentDepB_lock
+    put _packedObsContentDepB_sid
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_packedObsContentDepB_" . stripPrefix "_packedObsContentDepB_"}
+             ''PackedObsContentDepB)
+$(makeLenses ''PackedObsContentDepB)
+
 msgObsDepA :: Word16
 msgObsDepA = 0x0045
 
@@ -714,3 +926,35 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepA_" . stripPrefix "_msgObsDepA_"}
              ''MsgObsDepA)
 $(makeLenses ''MsgObsDepA)
+
+msgObsDepB :: Word16
+msgObsDepB = 0x0043
+
+-- | SBP class for message MSG_OBS_DEP_B (0x0043).
+--
+-- This observation message has been deprecated in favor of  observations that
+-- are more interoperable. This message should be used for observations
+-- referenced to  a nominal pseudorange which are not interoperable with most
+-- 3rd party GNSS receievers or typical RTCMv3  observations.
+data MsgObsDepB = MsgObsDepB
+  { _msgObsDepB_header :: ObservationHeader
+    -- ^ Header of a GPS observation message
+  , _msgObsDepB_obs  :: [PackedObsContentDepB]
+    -- ^ Pseudorange and carrier phase observation for a satellite being tracked.
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgObsDepB where
+  get = do
+    _msgObsDepB_header <- get
+    _msgObsDepB_obs <- whileM (liftM not isEmpty) get
+    return MsgObsDepB {..}
+
+  put MsgObsDepB {..} = do
+    put _msgObsDepB_header
+    mapM_ put _msgObsDepB_obs
+
+$(deriveSBP 'msgObsDepB ''MsgObsDepB)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepB_" . stripPrefix "_msgObsDepB_"}
+             ''MsgObsDepB)
+$(makeLenses ''MsgObsDepB)
diff --git a/src/SwiftNav/SBP/Piksi.hs b/src/SwiftNav/SBP/Piksi.hs
--- a/src/SwiftNav/SBP/Piksi.hs
+++ b/src/SwiftNav/SBP/Piksi.hs
@@ -273,6 +273,41 @@
              ''UARTChannel)
 $(makeLenses ''UARTChannel)
 
+-- | Period.
+--
+-- Statistics on the period of observations received from the base station. As
+-- complete observation sets are received, their time of reception is compared
+-- with the prior set''s time of reception. This measurement provides a proxy
+-- for link quality as incomplete or missing sets will increase the period.
+-- Long periods can cause momentary RTK solution outages.
+data Period = Period
+  { _period_avg   :: Int32
+    -- ^ Average period
+  , _period_pmin  :: Int32
+    -- ^ Minimum period
+  , _period_pmax  :: Int32
+    -- ^ Maximum period
+  , _period_current :: Int32
+    -- ^ Smoothed estimate of the current period
+  } deriving ( Show, Read, Eq )
+
+instance Binary Period where
+  get = do
+    _period_avg <- liftM fromIntegral getWord32le
+    _period_pmin <- liftM fromIntegral getWord32le
+    _period_pmax <- liftM fromIntegral getWord32le
+    _period_current <- liftM fromIntegral getWord32le
+    return Period {..}
+
+  put Period {..} = do
+    putWord32le $ fromIntegral _period_avg
+    putWord32le $ fromIntegral _period_pmin
+    putWord32le $ fromIntegral _period_pmax
+    putWord32le $ fromIntegral _period_current
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_period_" . stripPrefix "_period_"}
+             ''Period)
+$(makeLenses ''Period)
+
 -- | Latency.
 --
 -- Statistics on the latency of observations received from the base station. As
@@ -308,24 +343,29 @@
 $(makeLenses ''Latency)
 
 msgUartState :: Word16
-msgUartState = 0x0018
+msgUartState = 0x001D
 
--- | SBP class for message MSG_UART_STATE (0x0018).
+-- | SBP class for message MSG_UART_STATE (0x001D).
 --
 -- The UART message reports data latency and throughput of the UART channels
 -- providing SBP I/O. On the default Piksi configuration, UARTs A and B are
 -- used for telemetry radios, but can also be host access ports for embedded
 -- hosts, or other interfaces in future. The reported percentage values must be
--- normalized.
+-- normalized. Observations latency and period can be used to assess the
+-- health of the differential corrections link. Latency provides the timeliness
+-- of received base observations while the  period indicates their likelihood
+-- of transmission.
 data MsgUartState = MsgUartState
-  { _msgUartState_uart_a  :: UARTChannel
+  { _msgUartState_uart_a   :: UARTChannel
     -- ^ State of UART A
-  , _msgUartState_uart_b  :: UARTChannel
+  , _msgUartState_uart_b   :: UARTChannel
     -- ^ State of UART B
   , _msgUartState_uart_ftdi :: UARTChannel
     -- ^ State of UART FTDI (USB logger)
-  , _msgUartState_latency :: Latency
+  , _msgUartState_latency  :: Latency
     -- ^ UART communication latency
+  , _msgUartState_obs_period :: Period
+    -- ^ Observation receipt period
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgUartState where
@@ -334,6 +374,7 @@
     _msgUartState_uart_b <- get
     _msgUartState_uart_ftdi <- get
     _msgUartState_latency <- get
+    _msgUartState_obs_period <- get
     return MsgUartState {..}
 
   put MsgUartState {..} = do
@@ -341,12 +382,50 @@
     put _msgUartState_uart_b
     put _msgUartState_uart_ftdi
     put _msgUartState_latency
+    put _msgUartState_obs_period
 
 $(deriveSBP 'msgUartState ''MsgUartState)
 
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgUartState_" . stripPrefix "_msgUartState_"}
              ''MsgUartState)
 $(makeLenses ''MsgUartState)
+
+msgUartStateDepa :: Word16
+msgUartStateDepa = 0x0018
+
+-- | SBP class for message MSG_UART_STATE_DEPA (0x0018).
+--
+-- Deprecated
+data MsgUartStateDepa = MsgUartStateDepa
+  { _msgUartStateDepa_uart_a  :: UARTChannel
+    -- ^ State of UART A
+  , _msgUartStateDepa_uart_b  :: UARTChannel
+    -- ^ State of UART B
+  , _msgUartStateDepa_uart_ftdi :: UARTChannel
+    -- ^ State of UART FTDI (USB logger)
+  , _msgUartStateDepa_latency :: Latency
+    -- ^ UART communication latency
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgUartStateDepa where
+  get = do
+    _msgUartStateDepa_uart_a <- get
+    _msgUartStateDepa_uart_b <- get
+    _msgUartStateDepa_uart_ftdi <- get
+    _msgUartStateDepa_latency <- get
+    return MsgUartStateDepa {..}
+
+  put MsgUartStateDepa {..} = do
+    put _msgUartStateDepa_uart_a
+    put _msgUartStateDepa_uart_b
+    put _msgUartStateDepa_uart_ftdi
+    put _msgUartStateDepa_latency
+
+$(deriveSBP 'msgUartStateDepa ''MsgUartStateDepa)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgUartStateDepa_" . stripPrefix "_msgUartStateDepa_"}
+             ''MsgUartStateDepa)
+$(makeLenses ''MsgUartStateDepa)
 
 msgIarState :: Word16
 msgIarState = 0x0019
