diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,6 +10,12 @@
 
 Available on [Hackage as `sbp`](http://hackage.haskell.org/package/sbp).
 
+To install from Hackage using `stack`:
+
+    $ stack install --resolver lts-6.25 sbp
+    
+Note that we explicitly specify the `lts-6.25` resolver, `libsbp` may fail to build with more recent resolvers.
+
 ## Setup
 
 To build:
diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               2.1.7
+version:               2.2.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
@@ -64,6 +64,8 @@
    | SBPMsgAcqSvProfile MsgAcqSvProfile Msg
    | SBPMsgAgeCorrections MsgAgeCorrections Msg
    | SBPMsgAlmanac MsgAlmanac Msg
+   | SBPMsgAlmanacGlo MsgAlmanacGlo Msg
+   | SBPMsgAlmanacGps MsgAlmanacGps Msg
    | SBPMsgBasePosEcef MsgBasePosEcef Msg
    | SBPMsgBasePosLlh MsgBasePosLlh Msg
    | SBPMsgBaselineEcef MsgBaselineEcef Msg
@@ -89,9 +91,13 @@
    | SBPMsgEphemerisDepC MsgEphemerisDepC Msg
    | SBPMsgEphemerisDepD MsgEphemerisDepD Msg
    | SBPMsgEphemerisGlo MsgEphemerisGlo Msg
+   | SBPMsgEphemerisGloDepA MsgEphemerisGloDepA Msg
    | SBPMsgEphemerisGps MsgEphemerisGps Msg
+   | SBPMsgEphemerisGpsDepE MsgEphemerisGpsDepE Msg
    | SBPMsgEphemerisSbas MsgEphemerisSbas Msg
+   | SBPMsgEphemerisSbasDepA MsgEphemerisSbasDepA Msg
    | SBPMsgExtEvent MsgExtEvent Msg
+   | SBPMsgFcnsGlo MsgFcnsGlo Msg
    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg
    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg
    | SBPMsgFileioReadReq MsgFileioReadReq Msg
@@ -108,6 +114,7 @@
    | SBPMsgGpsTime MsgGpsTime Msg
    | SBPMsgGpsTimeDepA MsgGpsTimeDepA Msg
    | SBPMsgGroupDelay MsgGroupDelay Msg
+   | SBPMsgGroupDelayDepA MsgGroupDelayDepA Msg
    | SBPMsgHeartbeat MsgHeartbeat Msg
    | SBPMsgIarState MsgIarState Msg
    | SBPMsgImuAux MsgImuAux Msg
@@ -120,6 +127,8 @@
    | SBPMsgNapDeviceDnaReq MsgNapDeviceDnaReq Msg
    | SBPMsgNapDeviceDnaResp MsgNapDeviceDnaResp Msg
    | SBPMsgNdbEvent MsgNdbEvent Msg
+   | SBPMsgNetworkStateReq MsgNetworkStateReq Msg
+   | SBPMsgNetworkStateResp MsgNetworkStateResp Msg
    | SBPMsgObs MsgObs Msg
    | SBPMsgObsDepA MsgObsDepA Msg
    | SBPMsgObsDepB MsgObsDepB Msg
@@ -180,6 +189,8 @@
           | _msgSBPType == msgAcqSvProfile = SBPMsgAcqSvProfile (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgAgeCorrections = SBPMsgAgeCorrections (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgAlmanac = SBPMsgAlmanac (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgAlmanacGlo = SBPMsgAlmanacGlo (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgAlmanacGps = SBPMsgAlmanacGps (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBasePosEcef = SBPMsgBasePosEcef (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBasePosLlh = SBPMsgBasePosLlh (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBaselineEcef = SBPMsgBaselineEcef (decode (fromStrict _msgSBPPayload)) m
@@ -205,9 +216,13 @@
           | _msgSBPType == msgEphemerisDepC = SBPMsgEphemerisDepC (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisDepD = SBPMsgEphemerisDepD (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisGlo = SBPMsgEphemerisGlo (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisGps = SBPMsgEphemerisGps (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGpsDepE = SBPMsgEphemerisGpsDepE (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisSbas = SBPMsgEphemerisSbas (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgExtEvent = SBPMsgExtEvent (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgFcnsGlo = SBPMsgFcnsGlo (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFileioReadDirReq = SBPMsgFileioReadDirReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFileioReadDirResp = SBPMsgFileioReadDirResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFileioReadReq = SBPMsgFileioReadReq (decode (fromStrict _msgSBPPayload)) m
@@ -224,6 +239,7 @@
           | _msgSBPType == msgGpsTime = SBPMsgGpsTime (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgGpsTimeDepA = SBPMsgGpsTimeDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgGroupDelay = SBPMsgGroupDelay (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgGroupDelayDepA = SBPMsgGroupDelayDepA (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgHeartbeat = SBPMsgHeartbeat (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgIarState = SBPMsgIarState (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgImuAux = SBPMsgImuAux (decode (fromStrict _msgSBPPayload)) m
@@ -236,6 +252,8 @@
           | _msgSBPType == msgNapDeviceDnaReq = SBPMsgNapDeviceDnaReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgNdbEvent = SBPMsgNdbEvent (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgNetworkStateReq = SBPMsgNetworkStateReq (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgNetworkStateResp = SBPMsgNetworkStateResp (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
@@ -288,6 +306,8 @@
       encode' (SBPMsgAcqSvProfile _ m) = put m
       encode' (SBPMsgAgeCorrections _ m) = put m
       encode' (SBPMsgAlmanac _ m) = put m
+      encode' (SBPMsgAlmanacGlo _ m) = put m
+      encode' (SBPMsgAlmanacGps _ m) = put m
       encode' (SBPMsgBasePosEcef _ m) = put m
       encode' (SBPMsgBasePosLlh _ m) = put m
       encode' (SBPMsgBaselineEcef _ m) = put m
@@ -313,9 +333,13 @@
       encode' (SBPMsgEphemerisDepC _ m) = put m
       encode' (SBPMsgEphemerisDepD _ m) = put m
       encode' (SBPMsgEphemerisGlo _ m) = put m
+      encode' (SBPMsgEphemerisGloDepA _ m) = put m
       encode' (SBPMsgEphemerisGps _ m) = put m
+      encode' (SBPMsgEphemerisGpsDepE _ m) = put m
       encode' (SBPMsgEphemerisSbas _ m) = put m
+      encode' (SBPMsgEphemerisSbasDepA _ m) = put m
       encode' (SBPMsgExtEvent _ m) = put m
+      encode' (SBPMsgFcnsGlo _ m) = put m
       encode' (SBPMsgFileioReadDirReq _ m) = put m
       encode' (SBPMsgFileioReadDirResp _ m) = put m
       encode' (SBPMsgFileioReadReq _ m) = put m
@@ -332,6 +356,7 @@
       encode' (SBPMsgGpsTime _ m) = put m
       encode' (SBPMsgGpsTimeDepA _ m) = put m
       encode' (SBPMsgGroupDelay _ m) = put m
+      encode' (SBPMsgGroupDelayDepA _ m) = put m
       encode' (SBPMsgHeartbeat _ m) = put m
       encode' (SBPMsgIarState _ m) = put m
       encode' (SBPMsgImuAux _ m) = put m
@@ -344,6 +369,8 @@
       encode' (SBPMsgNapDeviceDnaReq _ m) = put m
       encode' (SBPMsgNapDeviceDnaResp _ m) = put m
       encode' (SBPMsgNdbEvent _ m) = put m
+      encode' (SBPMsgNetworkStateReq _ m) = put m
+      encode' (SBPMsgNetworkStateResp _ m) = put m
       encode' (SBPMsgObs _ m) = put m
       encode' (SBPMsgObsDepA _ m) = put m
       encode' (SBPMsgObsDepB _ m) = put m
@@ -399,6 +426,8 @@
         | msgType == msgAcqSvProfile = SBPMsgAcqSvProfile <$> parseJSON obj <*> parseJSON obj
         | msgType == msgAgeCorrections = SBPMsgAgeCorrections <$> parseJSON obj <*> parseJSON obj
         | msgType == msgAlmanac = SBPMsgAlmanac <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgAlmanacGlo = SBPMsgAlmanacGlo <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgAlmanacGps = SBPMsgAlmanacGps <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBasePosEcef = SBPMsgBasePosEcef <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBasePosLlh = SBPMsgBasePosLlh <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBaselineEcef = SBPMsgBaselineEcef <$> parseJSON obj <*> parseJSON obj
@@ -424,9 +453,13 @@
         | msgType == msgEphemerisDepC = SBPMsgEphemerisDepC <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisDepD = SBPMsgEphemerisDepD <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisGlo = SBPMsgEphemerisGlo <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisGps = SBPMsgEphemerisGps <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGpsDepE = SBPMsgEphemerisGpsDepE <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisSbas = SBPMsgEphemerisSbas <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgExtEvent = SBPMsgExtEvent <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgFcnsGlo = SBPMsgFcnsGlo <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFileioReadDirReq = SBPMsgFileioReadDirReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFileioReadDirResp = SBPMsgFileioReadDirResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFileioReadReq = SBPMsgFileioReadReq <$> parseJSON obj <*> parseJSON obj
@@ -443,6 +476,7 @@
         | msgType == msgGpsTime = SBPMsgGpsTime <$> parseJSON obj <*> parseJSON obj
         | msgType == msgGpsTimeDepA = SBPMsgGpsTimeDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgGroupDelay = SBPMsgGroupDelay <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgGroupDelayDepA = SBPMsgGroupDelayDepA <$> parseJSON obj <*> parseJSON obj
         | msgType == msgHeartbeat = SBPMsgHeartbeat <$> parseJSON obj <*> parseJSON obj
         | msgType == msgIarState = SBPMsgIarState <$> parseJSON obj <*> parseJSON obj
         | msgType == msgImuAux = SBPMsgImuAux <$> parseJSON obj <*> parseJSON obj
@@ -455,6 +489,8 @@
         | msgType == msgNapDeviceDnaReq = SBPMsgNapDeviceDnaReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgNdbEvent = SBPMsgNdbEvent <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgNetworkStateReq = SBPMsgNetworkStateReq <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgNetworkStateResp = SBPMsgNetworkStateResp <$> 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
@@ -512,6 +548,8 @@
   toJSON (SBPMsgAcqSvProfile n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgAgeCorrections n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgAlmanac n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgAlmanacGlo n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgAlmanacGps n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgBasePosEcef n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgBasePosLlh n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgBaselineEcef n m) = toJSON n `mergeValues` toJSON m
@@ -537,9 +575,13 @@
   toJSON (SBPMsgEphemerisDepC n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisDepD n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisGlo n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisGloDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisGps n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisGpsDepE n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgEphemerisSbas n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisSbasDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgExtEvent n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgFcnsGlo 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
   toJSON (SBPMsgFileioReadReq n m) = toJSON n `mergeValues` toJSON m
@@ -556,6 +598,7 @@
   toJSON (SBPMsgGpsTime n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgGpsTimeDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgGroupDelay n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgGroupDelayDepA n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgHeartbeat n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgIarState n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgImuAux n m) = toJSON n `mergeValues` toJSON m
@@ -568,6 +611,8 @@
   toJSON (SBPMsgNapDeviceDnaReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgNapDeviceDnaResp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgNdbEvent n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgNetworkStateReq n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgNetworkStateResp 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
@@ -619,6 +664,8 @@
   msg f (SBPMsgAcqSvProfile n m) = SBPMsgAcqSvProfile n <$> f m
   msg f (SBPMsgAgeCorrections n m) = SBPMsgAgeCorrections n <$> f m
   msg f (SBPMsgAlmanac n m) = SBPMsgAlmanac n <$> f m
+  msg f (SBPMsgAlmanacGlo n m) = SBPMsgAlmanacGlo n <$> f m
+  msg f (SBPMsgAlmanacGps n m) = SBPMsgAlmanacGps n <$> f m
   msg f (SBPMsgBasePosEcef n m) = SBPMsgBasePosEcef n <$> f m
   msg f (SBPMsgBasePosLlh n m) = SBPMsgBasePosLlh n <$> f m
   msg f (SBPMsgBaselineEcef n m) = SBPMsgBaselineEcef n <$> f m
@@ -644,9 +691,13 @@
   msg f (SBPMsgEphemerisDepC n m) = SBPMsgEphemerisDepC n <$> f m
   msg f (SBPMsgEphemerisDepD n m) = SBPMsgEphemerisDepD n <$> f m
   msg f (SBPMsgEphemerisGlo n m) = SBPMsgEphemerisGlo n <$> f m
+  msg f (SBPMsgEphemerisGloDepA n m) = SBPMsgEphemerisGloDepA n <$> f m
   msg f (SBPMsgEphemerisGps n m) = SBPMsgEphemerisGps n <$> f m
+  msg f (SBPMsgEphemerisGpsDepE n m) = SBPMsgEphemerisGpsDepE n <$> f m
   msg f (SBPMsgEphemerisSbas n m) = SBPMsgEphemerisSbas n <$> f m
+  msg f (SBPMsgEphemerisSbasDepA n m) = SBPMsgEphemerisSbasDepA n <$> f m
   msg f (SBPMsgExtEvent n m) = SBPMsgExtEvent n <$> f m
+  msg f (SBPMsgFcnsGlo n m) = SBPMsgFcnsGlo n <$> f m
   msg f (SBPMsgFileioReadDirReq n m) = SBPMsgFileioReadDirReq n <$> f m
   msg f (SBPMsgFileioReadDirResp n m) = SBPMsgFileioReadDirResp n <$> f m
   msg f (SBPMsgFileioReadReq n m) = SBPMsgFileioReadReq n <$> f m
@@ -663,6 +714,7 @@
   msg f (SBPMsgGpsTime n m) = SBPMsgGpsTime n <$> f m
   msg f (SBPMsgGpsTimeDepA n m) = SBPMsgGpsTimeDepA n <$> f m
   msg f (SBPMsgGroupDelay n m) = SBPMsgGroupDelay n <$> f m
+  msg f (SBPMsgGroupDelayDepA n m) = SBPMsgGroupDelayDepA n <$> f m
   msg f (SBPMsgHeartbeat n m) = SBPMsgHeartbeat n <$> f m
   msg f (SBPMsgIarState n m) = SBPMsgIarState n <$> f m
   msg f (SBPMsgImuAux n m) = SBPMsgImuAux n <$> f m
@@ -675,6 +727,8 @@
   msg f (SBPMsgNapDeviceDnaReq n m) = SBPMsgNapDeviceDnaReq n <$> f m
   msg f (SBPMsgNapDeviceDnaResp n m) = SBPMsgNapDeviceDnaResp n <$> f m
   msg f (SBPMsgNdbEvent n m) = SBPMsgNdbEvent n <$> f m
+  msg f (SBPMsgNetworkStateReq n m) = SBPMsgNetworkStateReq n <$> f m
+  msg f (SBPMsgNetworkStateResp n m) = SBPMsgNetworkStateResp 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
diff --git a/src/SwiftNav/SBP/ExtEvents.hs b/src/SwiftNav/SBP/ExtEvents.hs
--- a/src/SwiftNav/SBP/ExtEvents.hs
+++ b/src/SwiftNav/SBP/ExtEvents.hs
@@ -36,16 +36,16 @@
 -- Reports detection of an external event, the GPS time it occurred, which pin
 -- it was and whether it was rising or falling.
 data MsgExtEvent = MsgExtEvent
-  { _msgExtEvent_wn  :: Word16
+  { _msgExtEvent_wn        :: Word16
     -- ^ GPS week number
-  , _msgExtEvent_tow :: Word32
+  , _msgExtEvent_tow       :: Word32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgExtEvent_ns  :: Int32
+  , _msgExtEvent_ns_residual :: Int32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgExtEvent_flags :: Word8
+  , _msgExtEvent_flags     :: Word8
     -- ^ Flags
-  , _msgExtEvent_pin :: Word8
+  , _msgExtEvent_pin       :: Word8
     -- ^ Pin number.  0..9 = DEBUG0..9.
   } deriving ( Show, Read, Eq )
 
@@ -53,7 +53,7 @@
   get = do
     _msgExtEvent_wn <- getWord16le
     _msgExtEvent_tow <- getWord32le
-    _msgExtEvent_ns <- fromIntegral <$> getWord32le
+    _msgExtEvent_ns_residual <- fromIntegral <$> getWord32le
     _msgExtEvent_flags <- getWord8
     _msgExtEvent_pin <- getWord8
     return MsgExtEvent {..}
@@ -61,7 +61,7 @@
   put MsgExtEvent {..} = do
     putWord16le _msgExtEvent_wn
     putWord32le _msgExtEvent_tow
-    putWord32le $ fromIntegral _msgExtEvent_ns
+    putWord32le $ fromIntegral _msgExtEvent_ns_residual
     putWord8 _msgExtEvent_flags
     putWord8 _msgExtEvent_pin
 
diff --git a/src/SwiftNav/SBP/Gnss.hs b/src/SwiftNav/SBP/Gnss.hs
--- a/src/SwiftNav/SBP/Gnss.hs
+++ b/src/SwiftNav/SBP/Gnss.hs
@@ -109,25 +109,25 @@
 -- beginning of the week on the Saturday/Sunday transition. In most cases,
 -- observations are epoch aligned so ns field will be 0.
 data GpsTimeNano = GpsTimeNano
-  { _gpsTimeNano_tow :: Word32
+  { _gpsTimeNano_tow       :: Word32
     -- ^ Milliseconds since start of GPS week
-  , _gpsTimeNano_ns :: Int32
+  , _gpsTimeNano_ns_residual :: Int32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _gpsTimeNano_wn :: Word16
+  , _gpsTimeNano_wn        :: Word16
     -- ^ GPS week number
   } deriving ( Show, Read, Eq )
 
 instance Binary GpsTimeNano where
   get = do
     _gpsTimeNano_tow <- getWord32le
-    _gpsTimeNano_ns <- fromIntegral <$> getWord32le
+    _gpsTimeNano_ns_residual <- fromIntegral <$> getWord32le
     _gpsTimeNano_wn <- getWord16le
     return GpsTimeNano {..}
 
   put GpsTimeNano {..} = do
     putWord32le _gpsTimeNano_tow
-    putWord32le $ fromIntegral _gpsTimeNano_ns
+    putWord32le $ fromIntegral _gpsTimeNano_ns_residual
     putWord16le _gpsTimeNano_wn
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsTimeNano_" . P.stripPrefix "_gpsTimeNano_"}
              ''GpsTimeNano)
diff --git a/src/SwiftNav/SBP/Navigation.hs b/src/SwiftNav/SBP/Navigation.hs
--- a/src/SwiftNav/SBP/Navigation.hs
+++ b/src/SwiftNav/SBP/Navigation.hs
@@ -50,14 +50,14 @@
 -- other navigation messages referenced to the same time (but lacking the ns
 -- field) and indicates a more precise time of these messages.
 data MsgGpsTime = MsgGpsTime
-  { _msgGpsTime_wn  :: Word16
+  { _msgGpsTime_wn        :: Word16
     -- ^ GPS week number
-  , _msgGpsTime_tow :: Word32
+  , _msgGpsTime_tow       :: Word32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgGpsTime_ns  :: Int32
+  , _msgGpsTime_ns_residual :: Int32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgGpsTime_flags :: Word8
+  , _msgGpsTime_flags     :: Word8
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -65,14 +65,14 @@
   get = do
     _msgGpsTime_wn <- getWord16le
     _msgGpsTime_tow <- getWord32le
-    _msgGpsTime_ns <- fromIntegral <$> getWord32le
+    _msgGpsTime_ns_residual <- fromIntegral <$> getWord32le
     _msgGpsTime_flags <- getWord8
     return MsgGpsTime {..}
 
   put MsgGpsTime {..} = do
     putWord16le _msgGpsTime_wn
     putWord32le _msgGpsTime_tow
-    putWord32le $ fromIntegral _msgGpsTime_ns
+    putWord32le $ fromIntegral _msgGpsTime_ns_residual
     putWord8 _msgGpsTime_flags
 
 $(deriveSBP 'msgGpsTime ''MsgGpsTime)
@@ -105,10 +105,9 @@
   , _msgUtcTime_minutes :: Word8
     -- ^ minutes of hour (range 0-59)
   , _msgUtcTime_seconds :: Word8
-    -- ^ seconds of minute (range 0-60)
-  , _msgUtcTime_ns    :: Int32
-    -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
-    -- 500000)
+    -- ^ seconds of minute (range 0-60) rounded down
+  , _msgUtcTime_ns    :: Word32
+    -- ^ nanoseconds of second (range 0-999999999)
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgUtcTime where
@@ -121,7 +120,7 @@
     _msgUtcTime_hours <- getWord8
     _msgUtcTime_minutes <- getWord8
     _msgUtcTime_seconds <- getWord8
-    _msgUtcTime_ns <- fromIntegral <$> getWord32le
+    _msgUtcTime_ns <- getWord32le
     return MsgUtcTime {..}
 
   put MsgUtcTime {..} = do
@@ -133,7 +132,7 @@
     putWord8 _msgUtcTime_hours
     putWord8 _msgUtcTime_minutes
     putWord8 _msgUtcTime_seconds
-    putWord32le $ fromIntegral _msgUtcTime_ns
+    putWord32le _msgUtcTime_ns
 
 $(deriveSBP 'msgUtcTime ''MsgUtcTime)
 
@@ -609,14 +608,14 @@
 -- other navigation messages referenced to the same time (but lacking the ns
 -- field) and indicates a more precise time of these messages.
 data MsgGpsTimeDepA = MsgGpsTimeDepA
-  { _msgGpsTimeDepA_wn  :: Word16
+  { _msgGpsTimeDepA_wn        :: Word16
     -- ^ GPS week number
-  , _msgGpsTimeDepA_tow :: Word32
+  , _msgGpsTimeDepA_tow       :: Word32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgGpsTimeDepA_ns  :: Int32
+  , _msgGpsTimeDepA_ns_residual :: Int32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgGpsTimeDepA_flags :: Word8
+  , _msgGpsTimeDepA_flags     :: Word8
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -624,14 +623,14 @@
   get = do
     _msgGpsTimeDepA_wn <- getWord16le
     _msgGpsTimeDepA_tow <- getWord32le
-    _msgGpsTimeDepA_ns <- fromIntegral <$> getWord32le
+    _msgGpsTimeDepA_ns_residual <- fromIntegral <$> getWord32le
     _msgGpsTimeDepA_flags <- getWord8
     return MsgGpsTimeDepA {..}
 
   put MsgGpsTimeDepA {..} = do
     putWord16le _msgGpsTimeDepA_wn
     putWord32le _msgGpsTimeDepA_tow
-    putWord32le $ fromIntegral _msgGpsTimeDepA_ns
+    putWord32le $ fromIntegral _msgGpsTimeDepA_ns_residual
     putWord8 _msgGpsTimeDepA_flags
 
 $(deriveSBP 'msgGpsTimeDepA ''MsgGpsTimeDepA)
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
@@ -237,8 +237,8 @@
 $(makeLenses ''MsgBasePosEcef)
 
 data EphemerisCommonContent = EphemerisCommonContent
-  { _ephemerisCommonContent_sid        :: GnssSignal
-    -- ^ GNSS signal identifier
+  { _ephemerisCommonContent_sid        :: GnssSignal16
+    -- ^ GNSS signal identifier (16 bit)
   , _ephemerisCommonContent_toe        :: GpsTime
     -- ^ Time of Ephemerides
   , _ephemerisCommonContent_ura        :: Double
@@ -273,10 +273,167 @@
              ''EphemerisCommonContent)
 $(makeLenses ''EphemerisCommonContent)
 
+data EphemerisCommonContentDepA = EphemerisCommonContentDepA
+  { _ephemerisCommonContentDepA_sid        :: GnssSignal
+    -- ^ GNSS signal identifier
+  , _ephemerisCommonContentDepA_toe        :: GpsTime
+    -- ^ Time of Ephemerides
+  , _ephemerisCommonContentDepA_ura        :: Double
+    -- ^ User Range Accuracy
+  , _ephemerisCommonContentDepA_fit_interval :: Word32
+    -- ^ Curve fit interval
+  , _ephemerisCommonContentDepA_valid      :: Word8
+    -- ^ Status of ephemeris, 1 = valid, 0 = invalid
+  , _ephemerisCommonContentDepA_health_bits :: Word8
+    -- ^ Satellite health status. GPS: ICD-GPS-200, chapter 20.3.3.3.1.4 SBAS: 0
+    -- = valid, non-zero = invalid GLO: 0 = valid, non-zero = invalid
+  } deriving ( Show, Read, Eq )
+
+instance Binary EphemerisCommonContentDepA where
+  get = do
+    _ephemerisCommonContentDepA_sid <- get
+    _ephemerisCommonContentDepA_toe <- get
+    _ephemerisCommonContentDepA_ura <- getFloat64le
+    _ephemerisCommonContentDepA_fit_interval <- getWord32le
+    _ephemerisCommonContentDepA_valid <- getWord8
+    _ephemerisCommonContentDepA_health_bits <- getWord8
+    return EphemerisCommonContentDepA {..}
+
+  put EphemerisCommonContentDepA {..} = do
+    put _ephemerisCommonContentDepA_sid
+    put _ephemerisCommonContentDepA_toe
+    putFloat64le _ephemerisCommonContentDepA_ura
+    putWord32le _ephemerisCommonContentDepA_fit_interval
+    putWord8 _ephemerisCommonContentDepA_valid
+    putWord8 _ephemerisCommonContentDepA_health_bits
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_ephemerisCommonContentDepA_" . P.stripPrefix "_ephemerisCommonContentDepA_"}
+             ''EphemerisCommonContentDepA)
+$(makeLenses ''EphemerisCommonContentDepA)
+
+msgEphemerisGpsDepE :: Word16
+msgEphemerisGpsDepE = 0x0081
+
+-- | SBP class for message MSG_EPHEMERIS_GPS_DEP_E (0x0081).
+--
+-- 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 MsgEphemerisGpsDepE = MsgEphemerisGpsDepE
+  { _msgEphemerisGpsDepE_common :: EphemerisCommonContentDepA
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGpsDepE_tgd    :: Double
+    -- ^ Group delay differential between L1 and L2
+  , _msgEphemerisGpsDepE_c_rs   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the orbit radius
+  , _msgEphemerisGpsDepE_c_rc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
+  , _msgEphemerisGpsDepE_c_uc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisGpsDepE_c_us   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisGpsDepE_c_ic   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisGpsDepE_c_is   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisGpsDepE_dn     :: Double
+    -- ^ Mean motion difference
+  , _msgEphemerisGpsDepE_m0     :: Double
+    -- ^ Mean anomaly at reference time
+  , _msgEphemerisGpsDepE_ecc    :: Double
+    -- ^ Eccentricity of satellite orbit
+  , _msgEphemerisGpsDepE_sqrta  :: Double
+    -- ^ Square root of the semi-major axis of orbit
+  , _msgEphemerisGpsDepE_omega0 :: Double
+    -- ^ Longitude of ascending node of orbit plane at weekly epoch
+  , _msgEphemerisGpsDepE_omegadot :: Double
+    -- ^ Rate of right ascension
+  , _msgEphemerisGpsDepE_w      :: Double
+    -- ^ Argument of perigee
+  , _msgEphemerisGpsDepE_inc    :: Double
+    -- ^ Inclination
+  , _msgEphemerisGpsDepE_inc_dot :: Double
+    -- ^ Inclination first derivative
+  , _msgEphemerisGpsDepE_af0    :: Double
+    -- ^ Polynomial clock correction coefficient (clock bias)
+  , _msgEphemerisGpsDepE_af1    :: Double
+    -- ^ Polynomial clock correction coefficient (clock drift)
+  , _msgEphemerisGpsDepE_af2    :: Double
+    -- ^ Polynomial clock correction coefficient (rate of clock drift)
+  , _msgEphemerisGpsDepE_toc    :: GpsTime
+    -- ^ Clock reference
+  , _msgEphemerisGpsDepE_iode   :: Word8
+    -- ^ Issue of ephemeris data
+  , _msgEphemerisGpsDepE_iodc   :: Word16
+    -- ^ Issue of clock data
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGpsDepE where
+  get = do
+    _msgEphemerisGpsDepE_common <- get
+    _msgEphemerisGpsDepE_tgd <- getFloat64le
+    _msgEphemerisGpsDepE_c_rs <- getFloat64le
+    _msgEphemerisGpsDepE_c_rc <- getFloat64le
+    _msgEphemerisGpsDepE_c_uc <- getFloat64le
+    _msgEphemerisGpsDepE_c_us <- getFloat64le
+    _msgEphemerisGpsDepE_c_ic <- getFloat64le
+    _msgEphemerisGpsDepE_c_is <- getFloat64le
+    _msgEphemerisGpsDepE_dn <- getFloat64le
+    _msgEphemerisGpsDepE_m0 <- getFloat64le
+    _msgEphemerisGpsDepE_ecc <- getFloat64le
+    _msgEphemerisGpsDepE_sqrta <- getFloat64le
+    _msgEphemerisGpsDepE_omega0 <- getFloat64le
+    _msgEphemerisGpsDepE_omegadot <- getFloat64le
+    _msgEphemerisGpsDepE_w <- getFloat64le
+    _msgEphemerisGpsDepE_inc <- getFloat64le
+    _msgEphemerisGpsDepE_inc_dot <- getFloat64le
+    _msgEphemerisGpsDepE_af0 <- getFloat64le
+    _msgEphemerisGpsDepE_af1 <- getFloat64le
+    _msgEphemerisGpsDepE_af2 <- getFloat64le
+    _msgEphemerisGpsDepE_toc <- get
+    _msgEphemerisGpsDepE_iode <- getWord8
+    _msgEphemerisGpsDepE_iodc <- getWord16le
+    return MsgEphemerisGpsDepE {..}
+
+  put MsgEphemerisGpsDepE {..} = do
+    put _msgEphemerisGpsDepE_common
+    putFloat64le _msgEphemerisGpsDepE_tgd
+    putFloat64le _msgEphemerisGpsDepE_c_rs
+    putFloat64le _msgEphemerisGpsDepE_c_rc
+    putFloat64le _msgEphemerisGpsDepE_c_uc
+    putFloat64le _msgEphemerisGpsDepE_c_us
+    putFloat64le _msgEphemerisGpsDepE_c_ic
+    putFloat64le _msgEphemerisGpsDepE_c_is
+    putFloat64le _msgEphemerisGpsDepE_dn
+    putFloat64le _msgEphemerisGpsDepE_m0
+    putFloat64le _msgEphemerisGpsDepE_ecc
+    putFloat64le _msgEphemerisGpsDepE_sqrta
+    putFloat64le _msgEphemerisGpsDepE_omega0
+    putFloat64le _msgEphemerisGpsDepE_omegadot
+    putFloat64le _msgEphemerisGpsDepE_w
+    putFloat64le _msgEphemerisGpsDepE_inc
+    putFloat64le _msgEphemerisGpsDepE_inc_dot
+    putFloat64le _msgEphemerisGpsDepE_af0
+    putFloat64le _msgEphemerisGpsDepE_af1
+    putFloat64le _msgEphemerisGpsDepE_af2
+    put _msgEphemerisGpsDepE_toc
+    putWord8 _msgEphemerisGpsDepE_iode
+    putWord16le _msgEphemerisGpsDepE_iodc
+
+$(deriveSBP 'msgEphemerisGpsDepE ''MsgEphemerisGpsDepE)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGpsDepE_" . P.stripPrefix "_msgEphemerisGpsDepE_"}
+             ''MsgEphemerisGpsDepE)
+$(makeLenses ''MsgEphemerisGpsDepE)
+
 msgEphemerisGps :: Word16
-msgEphemerisGps = 0x0081
+msgEphemerisGps = 0x0086
 
--- | SBP class for message MSG_EPHEMERIS_GPS (0x0081).
+-- | SBP class for message MSG_EPHEMERIS_GPS (0x0086).
 --
 -- The ephemeris message returns a set of satellite orbit parameters that is
 -- used to calculate GPS satellite position, velocity, and clock offset. Please
@@ -393,8 +550,98 @@
              ''MsgEphemerisGps)
 $(makeLenses ''MsgEphemerisGps)
 
+msgEphemerisSbasDepA :: Word16
+msgEphemerisSbasDepA = 0x0082
+
+data MsgEphemerisSbasDepA = MsgEphemerisSbasDepA
+  { _msgEphemerisSbasDepA_common :: EphemerisCommonContentDepA
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisSbasDepA_pos  :: [Double]
+    -- ^ Position of the GEO at time toe
+  , _msgEphemerisSbasDepA_vel  :: [Double]
+    -- ^ Velocity of the GEO at time toe
+  , _msgEphemerisSbasDepA_acc  :: [Double]
+    -- ^ Acceleration of the GEO at time toe
+  , _msgEphemerisSbasDepA_a_gf0 :: Double
+    -- ^ Time offset of the GEO clock w.r.t. SBAS Network Time
+  , _msgEphemerisSbasDepA_a_gf1 :: Double
+    -- ^ Drift of the GEO clock w.r.t. SBAS Network Time
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisSbasDepA where
+  get = do
+    _msgEphemerisSbasDepA_common <- get
+    _msgEphemerisSbasDepA_pos <- replicateM 3 getFloat64le
+    _msgEphemerisSbasDepA_vel <- replicateM 3 getFloat64le
+    _msgEphemerisSbasDepA_acc <- replicateM 3 getFloat64le
+    _msgEphemerisSbasDepA_a_gf0 <- getFloat64le
+    _msgEphemerisSbasDepA_a_gf1 <- getFloat64le
+    return MsgEphemerisSbasDepA {..}
+
+  put MsgEphemerisSbasDepA {..} = do
+    put _msgEphemerisSbasDepA_common
+    mapM_ putFloat64le _msgEphemerisSbasDepA_pos
+    mapM_ putFloat64le _msgEphemerisSbasDepA_vel
+    mapM_ putFloat64le _msgEphemerisSbasDepA_acc
+    putFloat64le _msgEphemerisSbasDepA_a_gf0
+    putFloat64le _msgEphemerisSbasDepA_a_gf1
+
+$(deriveSBP 'msgEphemerisSbasDepA ''MsgEphemerisSbasDepA)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisSbasDepA_" . P.stripPrefix "_msgEphemerisSbasDepA_"}
+             ''MsgEphemerisSbasDepA)
+$(makeLenses ''MsgEphemerisSbasDepA)
+
+msgEphemerisGloDepA :: Word16
+msgEphemerisGloDepA = 0x0083
+
+-- | SBP class for message MSG_EPHEMERIS_GLO_DEP_A (0x0083).
+--
+-- The ephemeris message returns a set of satellite orbit parameters that is
+-- used to calculate GLO satellite position, velocity, and clock offset. Please
+-- see the GLO ICD 5.1 "Table 4.5 Characteristics of words of immediate
+-- information (ephemeris parameters)" for more details.
+data MsgEphemerisGloDepA = MsgEphemerisGloDepA
+  { _msgEphemerisGloDepA_common :: EphemerisCommonContentDepA
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGloDepA_gamma :: Double
+    -- ^ Relative deviation of predicted carrier frequency from nominal
+  , _msgEphemerisGloDepA_tau  :: Double
+    -- ^ Correction to the SV time
+  , _msgEphemerisGloDepA_pos  :: [Double]
+    -- ^ Position of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepA_vel  :: [Double]
+    -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepA_acc  :: [Double]
+    -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGloDepA where
+  get = do
+    _msgEphemerisGloDepA_common <- get
+    _msgEphemerisGloDepA_gamma <- getFloat64le
+    _msgEphemerisGloDepA_tau <- getFloat64le
+    _msgEphemerisGloDepA_pos <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepA_vel <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepA_acc <- replicateM 3 getFloat64le
+    return MsgEphemerisGloDepA {..}
+
+  put MsgEphemerisGloDepA {..} = do
+    put _msgEphemerisGloDepA_common
+    putFloat64le _msgEphemerisGloDepA_gamma
+    putFloat64le _msgEphemerisGloDepA_tau
+    mapM_ putFloat64le _msgEphemerisGloDepA_pos
+    mapM_ putFloat64le _msgEphemerisGloDepA_vel
+    mapM_ putFloat64le _msgEphemerisGloDepA_acc
+
+$(deriveSBP 'msgEphemerisGloDepA ''MsgEphemerisGloDepA)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGloDepA_" . P.stripPrefix "_msgEphemerisGloDepA_"}
+             ''MsgEphemerisGloDepA)
+$(makeLenses ''MsgEphemerisGloDepA)
+
 msgEphemerisSbas :: Word16
-msgEphemerisSbas = 0x0082
+msgEphemerisSbas = 0x0084
 
 data MsgEphemerisSbas = MsgEphemerisSbas
   { _msgEphemerisSbas_common :: EphemerisCommonContent
@@ -436,9 +683,9 @@
 $(makeLenses ''MsgEphemerisSbas)
 
 msgEphemerisGlo :: Word16
-msgEphemerisGlo = 0x0083
+msgEphemerisGlo = 0x0085
 
--- | SBP class for message MSG_EPHEMERIS_GLO (0x0083).
+-- | SBP class for message MSG_EPHEMERIS_GLO (0x0085).
 --
 -- The ephemeris message returns a set of satellite orbit parameters that is
 -- used to calculate GLO satellite position, velocity, and clock offset. Please
@@ -1372,17 +1619,60 @@
              ''MsgSvConfigurationGps)
 $(makeLenses ''MsgSvConfigurationGps)
 
+msgGroupDelayDepA :: Word16
+msgGroupDelayDepA = 0x0092
+
+-- | SBP class for message MSG_GROUP_DELAY_DEP_A (0x0092).
+--
+-- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.
+data MsgGroupDelayDepA = MsgGroupDelayDepA
+  { _msgGroupDelayDepA_t_op   :: GpsTime
+    -- ^ Data Predict Time of Week
+  , _msgGroupDelayDepA_prn    :: Word8
+    -- ^ Satellite number
+  , _msgGroupDelayDepA_valid  :: Word8
+    -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
+    -- etc. 1 = value is valid, 0 = value is not valid.
+  , _msgGroupDelayDepA_tgd    :: Int16
+  , _msgGroupDelayDepA_isc_l1ca :: Int16
+  , _msgGroupDelayDepA_isc_l2c :: Int16
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgGroupDelayDepA where
+  get = do
+    _msgGroupDelayDepA_t_op <- get
+    _msgGroupDelayDepA_prn <- getWord8
+    _msgGroupDelayDepA_valid <- getWord8
+    _msgGroupDelayDepA_tgd <- fromIntegral <$> getWord16le
+    _msgGroupDelayDepA_isc_l1ca <- fromIntegral <$> getWord16le
+    _msgGroupDelayDepA_isc_l2c <- fromIntegral <$> getWord16le
+    return MsgGroupDelayDepA {..}
+
+  put MsgGroupDelayDepA {..} = do
+    put _msgGroupDelayDepA_t_op
+    putWord8 _msgGroupDelayDepA_prn
+    putWord8 _msgGroupDelayDepA_valid
+    putWord16le $ fromIntegral _msgGroupDelayDepA_tgd
+    putWord16le $ fromIntegral _msgGroupDelayDepA_isc_l1ca
+    putWord16le $ fromIntegral _msgGroupDelayDepA_isc_l2c
+
+$(deriveSBP 'msgGroupDelayDepA ''MsgGroupDelayDepA)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgGroupDelayDepA_" . P.stripPrefix "_msgGroupDelayDepA_"}
+             ''MsgGroupDelayDepA)
+$(makeLenses ''MsgGroupDelayDepA)
+
 msgGroupDelay :: Word16
-msgGroupDelay = 0x0092
+msgGroupDelay = 0x0093
 
--- | SBP class for message MSG_GROUP_DELAY (0x0092).
+-- | SBP class for message MSG_GROUP_DELAY (0x0093).
 --
 -- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.
 data MsgGroupDelay = MsgGroupDelay
   { _msgGroupDelay_t_op   :: GpsTime
     -- ^ Data Predict Time of Week
-  , _msgGroupDelay_prn    :: Word8
-    -- ^ Satellite number
+  , _msgGroupDelay_sid    :: GnssSignal
+    -- ^ GNSS signal identifier
   , _msgGroupDelay_valid  :: Word8
     -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
     -- etc. 1 = value is valid, 0 = value is not valid.
@@ -1394,7 +1684,7 @@
 instance Binary MsgGroupDelay where
   get = do
     _msgGroupDelay_t_op <- get
-    _msgGroupDelay_prn <- getWord8
+    _msgGroupDelay_sid <- get
     _msgGroupDelay_valid <- getWord8
     _msgGroupDelay_tgd <- fromIntegral <$> getWord16le
     _msgGroupDelay_isc_l1ca <- fromIntegral <$> getWord16le
@@ -1403,7 +1693,7 @@
 
   put MsgGroupDelay {..} = do
     put _msgGroupDelay_t_op
-    putWord8 _msgGroupDelay_prn
+    put _msgGroupDelay_sid
     putWord8 _msgGroupDelay_valid
     putWord16le $ fromIntegral _msgGroupDelay_tgd
     putWord16le $ fromIntegral _msgGroupDelay_isc_l1ca
@@ -1414,3 +1704,206 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgGroupDelay_" . P.stripPrefix "_msgGroupDelay_"}
              ''MsgGroupDelay)
 $(makeLenses ''MsgGroupDelay)
+
+data AlmanacCommonContent = AlmanacCommonContent
+  { _almanacCommonContent_sid        :: GnssSignal
+    -- ^ GNSS signal identifier
+  , _almanacCommonContent_toa        :: GpsTime
+    -- ^ Reference time of almanac
+  , _almanacCommonContent_ura        :: Double
+    -- ^ User Range Accuracy
+  , _almanacCommonContent_fit_interval :: Word32
+    -- ^ Curve fit interval
+  , _almanacCommonContent_valid      :: Word8
+    -- ^ Status of almanac, 1 = valid, 0 = invalid
+  , _almanacCommonContent_health_bits :: Word8
+    -- ^ Satellite health status for GPS:   - bits 5-7: NAV data health status.
+    -- See IS-GPS-200H     Table 20-VII: NAV Data Health Indications.   - bits
+    -- 0-4: Signal health status. See IS-GPS-200H     Table 20-VIII. Codes for
+    -- Health of SV Signal     Components. Satellite health status for GLO:
+    -- See GLO ICD 5.1 table 5.1 for details   - bit 0: C(n), "unhealthy" flag
+    -- that is transmitted within      non-immediate data and indicates overall
+    -- constellation status     at the moment of almanac uploading.     '0'
+    -- indicates malfunction of n-satellite.     '1' indicates that n-satellite
+    -- is operational.   - bit 1: Bn(ln), '0' indicates the satellite is
+    -- operational     and suitable for navigation.
+  } deriving ( Show, Read, Eq )
+
+instance Binary AlmanacCommonContent where
+  get = do
+    _almanacCommonContent_sid <- get
+    _almanacCommonContent_toa <- get
+    _almanacCommonContent_ura <- getFloat64le
+    _almanacCommonContent_fit_interval <- getWord32le
+    _almanacCommonContent_valid <- getWord8
+    _almanacCommonContent_health_bits <- getWord8
+    return AlmanacCommonContent {..}
+
+  put AlmanacCommonContent {..} = do
+    put _almanacCommonContent_sid
+    put _almanacCommonContent_toa
+    putFloat64le _almanacCommonContent_ura
+    putWord32le _almanacCommonContent_fit_interval
+    putWord8 _almanacCommonContent_valid
+    putWord8 _almanacCommonContent_health_bits
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_almanacCommonContent_" . P.stripPrefix "_almanacCommonContent_"}
+             ''AlmanacCommonContent)
+$(makeLenses ''AlmanacCommonContent)
+
+msgAlmanacGps :: Word16
+msgAlmanacGps = 0x0070
+
+-- | SBP class for message MSG_ALMANAC_GPS (0x0070).
+--
+-- The almanac message returns a set of satellite orbit parameters. Almanac
+-- data is not very precise and is considered valid for up to several months.
+-- Please see the Navstar GPS Space Segment/Navigation user interfaces (ICD-
+-- GPS-200, Chapter 20.3.3.5.1.2 Almanac Data) for more details.
+data MsgAlmanacGps = MsgAlmanacGps
+  { _msgAlmanacGps_common :: AlmanacCommonContent
+    -- ^ Values common for all almanac types
+  , _msgAlmanacGps_m0     :: Double
+    -- ^ Mean anomaly at reference time
+  , _msgAlmanacGps_ecc    :: Double
+    -- ^ Eccentricity of satellite orbit
+  , _msgAlmanacGps_sqrta  :: Double
+    -- ^ Square root of the semi-major axis of orbit
+  , _msgAlmanacGps_omega0 :: Double
+    -- ^ Longitude of ascending node of orbit plane at weekly epoch
+  , _msgAlmanacGps_omegadot :: Double
+    -- ^ Rate of right ascension
+  , _msgAlmanacGps_w      :: Double
+    -- ^ Argument of perigee
+  , _msgAlmanacGps_inc    :: Double
+    -- ^ Inclination
+  , _msgAlmanacGps_af0    :: Double
+    -- ^ Polynomial clock correction coefficient (clock bias)
+  , _msgAlmanacGps_af1    :: Double
+    -- ^ Polynomial clock correction coefficient (clock drift)
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgAlmanacGps where
+  get = do
+    _msgAlmanacGps_common <- get
+    _msgAlmanacGps_m0 <- getFloat64le
+    _msgAlmanacGps_ecc <- getFloat64le
+    _msgAlmanacGps_sqrta <- getFloat64le
+    _msgAlmanacGps_omega0 <- getFloat64le
+    _msgAlmanacGps_omegadot <- getFloat64le
+    _msgAlmanacGps_w <- getFloat64le
+    _msgAlmanacGps_inc <- getFloat64le
+    _msgAlmanacGps_af0 <- getFloat64le
+    _msgAlmanacGps_af1 <- getFloat64le
+    return MsgAlmanacGps {..}
+
+  put MsgAlmanacGps {..} = do
+    put _msgAlmanacGps_common
+    putFloat64le _msgAlmanacGps_m0
+    putFloat64le _msgAlmanacGps_ecc
+    putFloat64le _msgAlmanacGps_sqrta
+    putFloat64le _msgAlmanacGps_omega0
+    putFloat64le _msgAlmanacGps_omegadot
+    putFloat64le _msgAlmanacGps_w
+    putFloat64le _msgAlmanacGps_inc
+    putFloat64le _msgAlmanacGps_af0
+    putFloat64le _msgAlmanacGps_af1
+
+$(deriveSBP 'msgAlmanacGps ''MsgAlmanacGps)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAlmanacGps_" . P.stripPrefix "_msgAlmanacGps_"}
+             ''MsgAlmanacGps)
+$(makeLenses ''MsgAlmanacGps)
+
+msgAlmanacGlo :: Word16
+msgAlmanacGlo = 0x0071
+
+-- | SBP class for message MSG_ALMANAC_GLO (0x0071).
+--
+-- The almanac message returns a set of satellite orbit parameters. Almanac
+-- data is not very precise and is considered valid for up to several months.
+-- Please see the GLO ICD 5.1 "Chapter 4.5 Non-immediate information and
+-- almanac" for details.
+data MsgAlmanacGlo = MsgAlmanacGlo
+  { _msgAlmanacGlo_common    :: AlmanacCommonContent
+    -- ^ Values common for all almanac types
+  , _msgAlmanacGlo_lambda_na :: Double
+    -- ^ Longitude of the first ascending node of the orbit in PZ-90.02
+    -- coordinate system
+  , _msgAlmanacGlo_t_lambda_na :: Double
+    -- ^ Time of the first ascending node passage
+  , _msgAlmanacGlo_i         :: Double
+    -- ^ Value of inclination at instant of t_lambda
+  , _msgAlmanacGlo_t         :: Double
+    -- ^ Value of Draconian period at instant of t_lambda
+  , _msgAlmanacGlo_t_dot     :: Double
+    -- ^ Rate of change of the Draconian period
+  , _msgAlmanacGlo_epsilon   :: Double
+    -- ^ Eccentricity at instant of t_lambda
+  , _msgAlmanacGlo_omega     :: Double
+    -- ^ Argument of perigee at instant of t_lambda
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgAlmanacGlo where
+  get = do
+    _msgAlmanacGlo_common <- get
+    _msgAlmanacGlo_lambda_na <- getFloat64le
+    _msgAlmanacGlo_t_lambda_na <- getFloat64le
+    _msgAlmanacGlo_i <- getFloat64le
+    _msgAlmanacGlo_t <- getFloat64le
+    _msgAlmanacGlo_t_dot <- getFloat64le
+    _msgAlmanacGlo_epsilon <- getFloat64le
+    _msgAlmanacGlo_omega <- getFloat64le
+    return MsgAlmanacGlo {..}
+
+  put MsgAlmanacGlo {..} = do
+    put _msgAlmanacGlo_common
+    putFloat64le _msgAlmanacGlo_lambda_na
+    putFloat64le _msgAlmanacGlo_t_lambda_na
+    putFloat64le _msgAlmanacGlo_i
+    putFloat64le _msgAlmanacGlo_t
+    putFloat64le _msgAlmanacGlo_t_dot
+    putFloat64le _msgAlmanacGlo_epsilon
+    putFloat64le _msgAlmanacGlo_omega
+
+$(deriveSBP 'msgAlmanacGlo ''MsgAlmanacGlo)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAlmanacGlo_" . P.stripPrefix "_msgAlmanacGlo_"}
+             ''MsgAlmanacGlo)
+$(makeLenses ''MsgAlmanacGlo)
+
+msgFcnsGlo :: Word16
+msgFcnsGlo = 0x0072
+
+-- | SBP class for message MSG_FCNS_GLO (0x0072).
+--
+-- The message reports mapping information regarding GLONASS SV orbital and
+-- frequency slots. Mapped as follow: index (SV orbital slot)  fcns[index] 0
+-- 0xFF 1                        FCN for SV orbital slot 1 ...
+-- ... 28                       FCN for SV orbital slot 28 29
+-- 0xFF 30                       0xFF 31                       0xFF
+data MsgFcnsGlo = MsgFcnsGlo
+  { _msgFcnsGlo_wn   :: Word16
+    -- ^ GPS Week number
+  , _msgFcnsGlo_tow_ms :: Word32
+    -- ^ GPS Time of week
+  , _msgFcnsGlo_fcns :: [Word8]
+    -- ^ GLONASS fequency number per orbital slot
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgFcnsGlo where
+  get = do
+    _msgFcnsGlo_wn <- getWord16le
+    _msgFcnsGlo_tow_ms <- getWord32le
+    _msgFcnsGlo_fcns <- replicateM 32 getWord8
+    return MsgFcnsGlo {..}
+
+  put MsgFcnsGlo {..} = do
+    putWord16le _msgFcnsGlo_wn
+    putWord32le _msgFcnsGlo_tow_ms
+    mapM_ putWord8 _msgFcnsGlo_fcns
+
+$(deriveSBP 'msgFcnsGlo ''MsgFcnsGlo)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgFcnsGlo_" . P.stripPrefix "_msgFcnsGlo_"}
+             ''MsgFcnsGlo)
+$(makeLenses ''MsgFcnsGlo)
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
@@ -611,3 +611,80 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgCommandResp_" . P.stripPrefix "_msgCommandResp_"}
              ''MsgCommandResp)
 $(makeLenses ''MsgCommandResp)
+
+msgNetworkStateReq :: Word16
+msgNetworkStateReq = 0x00BA
+
+-- | SBP class for message MSG_NETWORK_STATE_REQ (0x00BA).
+--
+-- Request state of Piksi network interfaces. Output will be sent in
+-- MSG_NETWORK_STATE_RESP messages
+data MsgNetworkStateReq = MsgNetworkStateReq
+  deriving ( Show, Read, Eq )
+
+instance Binary MsgNetworkStateReq where
+  get =
+    return MsgNetworkStateReq
+
+  put MsgNetworkStateReq =
+    return ()
+
+$(deriveSBP 'msgNetworkStateReq ''MsgNetworkStateReq)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgNetworkStateReq_" . P.stripPrefix "_msgNetworkStateReq_"}
+             ''MsgNetworkStateReq)
+$(makeLenses ''MsgNetworkStateReq)
+
+msgNetworkStateResp :: Word16
+msgNetworkStateResp = 0x00BB
+
+-- | SBP class for message MSG_NETWORK_STATE_RESP (0x00BB).
+--
+-- The state of a network interface on the Piksi. Data is made to reflect
+-- output of ifaddrs struct returned by getifaddrs in c.
+data MsgNetworkStateResp = MsgNetworkStateResp
+  { _msgNetworkStateResp_ipv4_address :: [Word8]
+    -- ^ IPv4 address (all zero when unavailable)
+  , _msgNetworkStateResp_ipv4_mask_size :: Word8
+    -- ^ IPv4 netmask CIDR notation
+  , _msgNetworkStateResp_ipv6_address :: [Word8]
+    -- ^ IPv6 address (all zero when unavailable)
+  , _msgNetworkStateResp_ipv6_mask_size :: Word8
+    -- ^ IPv6 netmask CIDR notation
+  , _msgNetworkStateResp_rx_bytes     :: Word32
+    -- ^ Number of Rx bytes
+  , _msgNetworkStateResp_tx_bytes     :: Word32
+    -- ^ Number of Tx bytes
+  , _msgNetworkStateResp_interface_name :: Text
+    -- ^ Interface Name
+  , _msgNetworkStateResp_flags        :: Word32
+    -- ^ Interface flags from SIOCGIFFLAGS
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgNetworkStateResp where
+  get = do
+    _msgNetworkStateResp_ipv4_address <- replicateM 4 getWord8
+    _msgNetworkStateResp_ipv4_mask_size <- getWord8
+    _msgNetworkStateResp_ipv6_address <- replicateM 16 getWord8
+    _msgNetworkStateResp_ipv6_mask_size <- getWord8
+    _msgNetworkStateResp_rx_bytes <- getWord32le
+    _msgNetworkStateResp_tx_bytes <- getWord32le
+    _msgNetworkStateResp_interface_name <- decodeUtf8 <$> getByteString 16
+    _msgNetworkStateResp_flags <- getWord32le
+    return MsgNetworkStateResp {..}
+
+  put MsgNetworkStateResp {..} = do
+    mapM_ putWord8 _msgNetworkStateResp_ipv4_address
+    putWord8 _msgNetworkStateResp_ipv4_mask_size
+    mapM_ putWord8 _msgNetworkStateResp_ipv6_address
+    putWord8 _msgNetworkStateResp_ipv6_mask_size
+    putWord32le _msgNetworkStateResp_rx_bytes
+    putWord32le _msgNetworkStateResp_tx_bytes
+    putByteString $ encodeUtf8 _msgNetworkStateResp_interface_name
+    putWord32le _msgNetworkStateResp_flags
+
+$(deriveSBP 'msgNetworkStateResp ''MsgNetworkStateResp)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgNetworkStateResp_" . P.stripPrefix "_msgNetworkStateResp_"}
+             ''MsgNetworkStateResp)
+$(makeLenses ''MsgNetworkStateResp)
