diff --git a/main/JSON2SBP.hs b/main/JSON2SBP.hs
--- a/main/JSON2SBP.hs
+++ b/main/JSON2SBP.hs
@@ -16,6 +16,7 @@
 import           Data.Conduit.Binary
 import qualified Data.Conduit.List as CL
 import           Data.Conduit.Serialization.Binary
+import           Debug.Trace
 import           SwiftNav.SBP
 import           System.IO
 
@@ -29,7 +30,11 @@
 
 -- | Decode a SBPMsg from JSON.
 decodeSBPMsg :: ByteString -> Maybe SBPMsg
-decodeSBPMsg v = decodeStrict v <|> sbpMsgData <$> decodeStrict v
+decodeSBPMsg v = result
+  where parsed = eitherDecodeStrict v <|> sbpMsgData <$> eitherDecodeStrict v
+        result = case parsed of
+                   Left s -> trace s Nothing
+                   Right x -> Just x
 
 main :: IO ()
 main =
diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               1.1.0
+version:               1.2.2
 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
@@ -56,6 +56,7 @@
 data SBPMsg =
      SBPMsgAcqResult MsgAcqResult Msg
    | SBPMsgAcqResultDepA MsgAcqResultDepA Msg
+   | SBPMsgAcqSvProfile MsgAcqSvProfile Msg
    | SBPMsgAlmanac MsgAlmanac Msg
    | SBPMsgBasePosEcef MsgBasePosEcef Msg
    | SBPMsgBasePosLlh MsgBasePosLlh Msg
@@ -68,11 +69,15 @@
    | SBPMsgBootloaderJumpToApp MsgBootloaderJumpToApp Msg
    | SBPMsgCwResults MsgCwResults Msg
    | SBPMsgCwStart MsgCwStart Msg
+   | SBPMsgDeviceMonitor MsgDeviceMonitor Msg
    | SBPMsgDops MsgDops Msg
-   | SBPMsgEphemeris MsgEphemeris Msg
    | SBPMsgEphemerisDepA MsgEphemerisDepA Msg
    | SBPMsgEphemerisDepB MsgEphemerisDepB Msg
    | SBPMsgEphemerisDepC MsgEphemerisDepC Msg
+   | SBPMsgEphemerisDepD MsgEphemerisDepD Msg
+   | SBPMsgEphemerisGlo MsgEphemerisGlo Msg
+   | SBPMsgEphemerisGps MsgEphemerisGps Msg
+   | SBPMsgEphemerisSbas MsgEphemerisSbas Msg
    | SBPMsgExtEvent MsgExtEvent Msg
    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg
    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg
@@ -87,9 +92,11 @@
    | SBPMsgFlashReadReq MsgFlashReadReq Msg
    | SBPMsgFlashReadResp MsgFlashReadResp Msg
    | SBPMsgGpsTime MsgGpsTime Msg
+   | SBPMsgGroupDelay MsgGroupDelay Msg
    | SBPMsgHeartbeat MsgHeartbeat Msg
    | SBPMsgIarState MsgIarState Msg
    | SBPMsgInitBase MsgInitBase Msg
+   | SBPMsgIono MsgIono Msg
    | SBPMsgLog MsgLog Msg
    | SBPMsgM25FlashWriteStatus MsgM25FlashWriteStatus Msg
    | SBPMsgMaskSatellite MsgMaskSatellite Msg
@@ -117,6 +124,7 @@
    | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector Msg
    | SBPMsgStmUniqueIdReq MsgStmUniqueIdReq Msg
    | SBPMsgStmUniqueIdResp MsgStmUniqueIdResp Msg
+   | SBPMsgSvConfigurationGps MsgSvConfigurationGps Msg
    | SBPMsgThreadState MsgThreadState Msg
    | SBPMsgTrackingIq MsgTrackingIq Msg
    | SBPMsgTrackingState MsgTrackingState Msg
@@ -142,6 +150,7 @@
           | checkCrc m /= _msgSBPCrc = SBPMsgBadCrc m
           | _msgSBPType == msgAcqResult = SBPMsgAcqResult (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgAcqResultDepA = SBPMsgAcqResultDepA (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgAcqSvProfile = SBPMsgAcqSvProfile (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgAlmanac = SBPMsgAlmanac (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBasePosEcef = SBPMsgBasePosEcef (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBasePosLlh = SBPMsgBasePosLlh (decode (fromStrict _msgSBPPayload)) m
@@ -154,11 +163,15 @@
           | _msgSBPType == msgBootloaderJumpToApp = SBPMsgBootloaderJumpToApp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgCwResults = SBPMsgCwResults (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgCwStart = SBPMsgCwStart (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgDeviceMonitor = SBPMsgDeviceMonitor (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgDops = SBPMsgDops (decode (fromStrict _msgSBPPayload)) m
-          | _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 == msgEphemerisDepD = SBPMsgEphemerisDepD (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGlo = SBPMsgEphemerisGlo (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGps = SBPMsgEphemerisGps (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisSbas = SBPMsgEphemerisSbas (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
@@ -173,9 +186,11 @@
           | _msgSBPType == msgFlashReadReq = SBPMsgFlashReadReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgFlashReadResp = SBPMsgFlashReadResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgGpsTime = SBPMsgGpsTime (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgGroupDelay = SBPMsgGroupDelay (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgHeartbeat = SBPMsgHeartbeat (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgIarState = SBPMsgIarState (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgInitBase = SBPMsgInitBase (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgLog = SBPMsgLog (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgMaskSatellite = SBPMsgMaskSatellite (decode (fromStrict _msgSBPPayload)) m
@@ -203,6 +218,7 @@
           | _msgSBPType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgStmUniqueIdReq = SBPMsgStmUniqueIdReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgStmUniqueIdResp = SBPMsgStmUniqueIdResp (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgSvConfigurationGps = SBPMsgSvConfigurationGps (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgThreadState = SBPMsgThreadState (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTrackingIq = SBPMsgTrackingIq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTrackingState = SBPMsgTrackingState (decode (fromStrict _msgSBPPayload)) m
@@ -220,6 +236,7 @@
     encode' sm where
       encode' (SBPMsgAcqResult _ m) = put m
       encode' (SBPMsgAcqResultDepA _ m) = put m
+      encode' (SBPMsgAcqSvProfile _ m) = put m
       encode' (SBPMsgAlmanac _ m) = put m
       encode' (SBPMsgBasePosEcef _ m) = put m
       encode' (SBPMsgBasePosLlh _ m) = put m
@@ -232,11 +249,15 @@
       encode' (SBPMsgBootloaderJumpToApp _ m) = put m
       encode' (SBPMsgCwResults _ m) = put m
       encode' (SBPMsgCwStart _ m) = put m
+      encode' (SBPMsgDeviceMonitor _ m) = put m
       encode' (SBPMsgDops _ m) = put m
-      encode' (SBPMsgEphemeris _ m) = put m
       encode' (SBPMsgEphemerisDepA _ m) = put m
       encode' (SBPMsgEphemerisDepB _ m) = put m
       encode' (SBPMsgEphemerisDepC _ m) = put m
+      encode' (SBPMsgEphemerisDepD _ m) = put m
+      encode' (SBPMsgEphemerisGlo _ m) = put m
+      encode' (SBPMsgEphemerisGps _ m) = put m
+      encode' (SBPMsgEphemerisSbas _ m) = put m
       encode' (SBPMsgExtEvent _ m) = put m
       encode' (SBPMsgFileioReadDirReq _ m) = put m
       encode' (SBPMsgFileioReadDirResp _ m) = put m
@@ -251,9 +272,11 @@
       encode' (SBPMsgFlashReadReq _ m) = put m
       encode' (SBPMsgFlashReadResp _ m) = put m
       encode' (SBPMsgGpsTime _ m) = put m
+      encode' (SBPMsgGroupDelay _ m) = put m
       encode' (SBPMsgHeartbeat _ m) = put m
       encode' (SBPMsgIarState _ m) = put m
       encode' (SBPMsgInitBase _ m) = put m
+      encode' (SBPMsgIono _ m) = put m
       encode' (SBPMsgLog _ m) = put m
       encode' (SBPMsgM25FlashWriteStatus _ m) = put m
       encode' (SBPMsgMaskSatellite _ m) = put m
@@ -281,6 +304,7 @@
       encode' (SBPMsgStmFlashUnlockSector _ m) = put m
       encode' (SBPMsgStmUniqueIdReq _ m) = put m
       encode' (SBPMsgStmUniqueIdResp _ m) = put m
+      encode' (SBPMsgSvConfigurationGps _ m) = put m
       encode' (SBPMsgThreadState _ m) = put m
       encode' (SBPMsgTrackingIq _ m) = put m
       encode' (SBPMsgTrackingState _ m) = put m
@@ -301,6 +325,7 @@
       decode' msgType
         | msgType == msgAcqResult = SBPMsgAcqResult <$> parseJSON obj <*> parseJSON obj
         | msgType == msgAcqResultDepA = SBPMsgAcqResultDepA <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgAcqSvProfile = SBPMsgAcqSvProfile <$> parseJSON obj <*> parseJSON obj
         | msgType == msgAlmanac = SBPMsgAlmanac <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBasePosEcef = SBPMsgBasePosEcef <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBasePosLlh = SBPMsgBasePosLlh <$> parseJSON obj <*> parseJSON obj
@@ -313,11 +338,15 @@
         | msgType == msgBootloaderJumpToApp = SBPMsgBootloaderJumpToApp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgCwResults = SBPMsgCwResults <$> parseJSON obj <*> parseJSON obj
         | msgType == msgCwStart = SBPMsgCwStart <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgDeviceMonitor = SBPMsgDeviceMonitor <$> parseJSON obj <*> parseJSON obj
         | msgType == msgDops = SBPMsgDops <$> parseJSON obj <*> parseJSON obj
-        | 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 == msgEphemerisDepD = SBPMsgEphemerisDepD <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGlo = SBPMsgEphemerisGlo <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGps = SBPMsgEphemerisGps <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisSbas = SBPMsgEphemerisSbas <$> 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
@@ -332,9 +361,11 @@
         | msgType == msgFlashReadReq = SBPMsgFlashReadReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgFlashReadResp = SBPMsgFlashReadResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgGpsTime = SBPMsgGpsTime <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgGroupDelay = SBPMsgGroupDelay <$> parseJSON obj <*> parseJSON obj
         | msgType == msgHeartbeat = SBPMsgHeartbeat <$> parseJSON obj <*> parseJSON obj
         | msgType == msgIarState = SBPMsgIarState <$> parseJSON obj <*> parseJSON obj
         | msgType == msgInitBase = SBPMsgInitBase <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgIono = SBPMsgIono <$> parseJSON obj <*> parseJSON obj
         | msgType == msgLog = SBPMsgLog <$> parseJSON obj <*> parseJSON obj
         | msgType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus <$> parseJSON obj <*> parseJSON obj
         | msgType == msgMaskSatellite = SBPMsgMaskSatellite <$> parseJSON obj <*> parseJSON obj
@@ -362,6 +393,7 @@
         | msgType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector <$> parseJSON obj <*> parseJSON obj
         | msgType == msgStmUniqueIdReq = SBPMsgStmUniqueIdReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgStmUniqueIdResp = SBPMsgStmUniqueIdResp <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgSvConfigurationGps = SBPMsgSvConfigurationGps <$> parseJSON obj <*> parseJSON obj
         | msgType == msgThreadState = SBPMsgThreadState <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTrackingIq = SBPMsgTrackingIq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTrackingState = SBPMsgTrackingState <$> parseJSON obj <*> parseJSON obj
@@ -384,6 +416,7 @@
 instance ToJSON SBPMsg where
   toJSON (SBPMsgAcqResult n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgAcqResultDepA n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgAcqSvProfile n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgAlmanac 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
@@ -396,11 +429,15 @@
   toJSON (SBPMsgBootloaderJumpToApp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgCwResults n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgCwStart n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgDeviceMonitor n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgDops n m) = toJSON n `mergeValues` toJSON m
-  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 (SBPMsgEphemerisDepD n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisGlo n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisGps n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisSbas 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
@@ -415,9 +452,11 @@
   toJSON (SBPMsgFlashReadReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgFlashReadResp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgGpsTime n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgGroupDelay 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 (SBPMsgInitBase n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgIono n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgLog n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgM25FlashWriteStatus n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgMaskSatellite n m) = toJSON n `mergeValues` toJSON m
@@ -445,6 +484,7 @@
   toJSON (SBPMsgStmFlashUnlockSector n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgStmUniqueIdReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgStmUniqueIdResp n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgSvConfigurationGps n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgThreadState n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTrackingIq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTrackingState n m) = toJSON n `mergeValues` toJSON m
@@ -461,6 +501,7 @@
 instance HasMsg SBPMsg where
   msg f (SBPMsgAcqResult n m) = SBPMsgAcqResult n <$> f m
   msg f (SBPMsgAcqResultDepA n m) = SBPMsgAcqResultDepA n <$> f m
+  msg f (SBPMsgAcqSvProfile n m) = SBPMsgAcqSvProfile n <$> f m
   msg f (SBPMsgAlmanac n m) = SBPMsgAlmanac n <$> f m
   msg f (SBPMsgBasePosEcef n m) = SBPMsgBasePosEcef n <$> f m
   msg f (SBPMsgBasePosLlh n m) = SBPMsgBasePosLlh n <$> f m
@@ -473,11 +514,15 @@
   msg f (SBPMsgBootloaderJumpToApp n m) = SBPMsgBootloaderJumpToApp n <$> f m
   msg f (SBPMsgCwResults n m) = SBPMsgCwResults n <$> f m
   msg f (SBPMsgCwStart n m) = SBPMsgCwStart n <$> f m
+  msg f (SBPMsgDeviceMonitor n m) = SBPMsgDeviceMonitor n <$> f m
   msg f (SBPMsgDops n m) = SBPMsgDops n <$> f m
-  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 (SBPMsgEphemerisDepD n m) = SBPMsgEphemerisDepD n <$> f m
+  msg f (SBPMsgEphemerisGlo n m) = SBPMsgEphemerisGlo n <$> f m
+  msg f (SBPMsgEphemerisGps n m) = SBPMsgEphemerisGps n <$> f m
+  msg f (SBPMsgEphemerisSbas n m) = SBPMsgEphemerisSbas 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
@@ -492,9 +537,11 @@
   msg f (SBPMsgFlashReadReq n m) = SBPMsgFlashReadReq n <$> f m
   msg f (SBPMsgFlashReadResp n m) = SBPMsgFlashReadResp n <$> f m
   msg f (SBPMsgGpsTime n m) = SBPMsgGpsTime n <$> f m
+  msg f (SBPMsgGroupDelay n m) = SBPMsgGroupDelay n <$> f m
   msg f (SBPMsgHeartbeat n m) = SBPMsgHeartbeat n <$> f m
   msg f (SBPMsgIarState n m) = SBPMsgIarState n <$> f m
   msg f (SBPMsgInitBase n m) = SBPMsgInitBase n <$> f m
+  msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m
   msg f (SBPMsgLog n m) = SBPMsgLog n <$> f m
   msg f (SBPMsgM25FlashWriteStatus n m) = SBPMsgM25FlashWriteStatus n <$> f m
   msg f (SBPMsgMaskSatellite n m) = SBPMsgMaskSatellite n <$> f m
@@ -522,6 +569,7 @@
   msg f (SBPMsgStmFlashUnlockSector n m) = SBPMsgStmFlashUnlockSector n <$> f m
   msg f (SBPMsgStmUniqueIdReq n m) = SBPMsgStmUniqueIdReq n <$> f m
   msg f (SBPMsgStmUniqueIdResp n m) = SBPMsgStmUniqueIdResp n <$> f m
+  msg f (SBPMsgSvConfigurationGps n m) = SBPMsgSvConfigurationGps n <$> f m
   msg f (SBPMsgThreadState n m) = SBPMsgThreadState n <$> f m
   msg f (SBPMsgTrackingIq n m) = SBPMsgTrackingIq n <$> f m
   msg f (SBPMsgTrackingState n m) = SBPMsgTrackingState n <$> f m
diff --git a/src/SwiftNav/SBP/Acquisition.hs b/src/SwiftNav/SBP/Acquisition.hs
--- a/src/SwiftNav/SBP/Acquisition.hs
+++ b/src/SwiftNav/SBP/Acquisition.hs
@@ -107,3 +107,94 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAcqResultDepA_" . stripPrefix "_msgAcqResultDepA_"}
              ''MsgAcqResultDepA)
 $(makeLenses ''MsgAcqResultDepA)
+
+-- | AcqSvProfile.
+--
+-- Profile for a specific SV for debugging purposes The message describes SV
+-- profile during acquisition time. The message is used to debug and measure
+-- the performance.
+data AcqSvProfile = AcqSvProfile
+  { _acqSvProfile_job_type :: Word8
+    -- ^ SV search job type (deep, fallback, etc)
+  , _acqSvProfile_status   :: Word8
+    -- ^ Acquisition status 1 is Success, 0 is Failure
+  , _acqSvProfile_cn0      :: Word16
+    -- ^ CN0 value. Only valid if status is '1'
+  , _acqSvProfile_int_time :: Word8
+    -- ^ Acquisition integration time
+  , _acqSvProfile_sid      :: GnssSignal
+    -- ^ GNSS signal for which acquisition was attempted
+  , _acqSvProfile_bin_width :: Word16
+    -- ^ Acq frequency bin width
+  , _acqSvProfile_timestamp :: Word32
+    -- ^ Timestamp of the job complete event
+  , _acqSvProfile_time_spent :: Word32
+    -- ^ Time spent to search for sid.code
+  , _acqSvProfile_cf_min   :: Word32
+    -- ^ Doppler range lowest frequency
+  , _acqSvProfile_cf_max   :: Word32
+    -- ^ Doppler range highest frequency
+  , _acqSvProfile_cf       :: Word32
+    -- ^ Doppler value of detected peak. Only valid if status is '1'
+  , _acqSvProfile_cp       :: Word32
+    -- ^ Codephase of detected peak. Only valid if status is '1'
+  } deriving ( Show, Read, Eq )
+
+instance Binary AcqSvProfile where
+  get = do
+    _acqSvProfile_job_type <- getWord8
+    _acqSvProfile_status <- getWord8
+    _acqSvProfile_cn0 <- getWord16le
+    _acqSvProfile_int_time <- getWord8
+    _acqSvProfile_sid <- get
+    _acqSvProfile_bin_width <- getWord16le
+    _acqSvProfile_timestamp <- getWord32le
+    _acqSvProfile_time_spent <- getWord32le
+    _acqSvProfile_cf_min <- getWord32le
+    _acqSvProfile_cf_max <- getWord32le
+    _acqSvProfile_cf <- getWord32le
+    _acqSvProfile_cp <- getWord32le
+    return AcqSvProfile {..}
+
+  put AcqSvProfile {..} = do
+    putWord8 _acqSvProfile_job_type
+    putWord8 _acqSvProfile_status
+    putWord16le _acqSvProfile_cn0
+    putWord8 _acqSvProfile_int_time
+    put _acqSvProfile_sid
+    putWord16le _acqSvProfile_bin_width
+    putWord32le _acqSvProfile_timestamp
+    putWord32le _acqSvProfile_time_spent
+    putWord32le _acqSvProfile_cf_min
+    putWord32le _acqSvProfile_cf_max
+    putWord32le _acqSvProfile_cf
+    putWord32le _acqSvProfile_cp
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_acqSvProfile_" . stripPrefix "_acqSvProfile_"}
+             ''AcqSvProfile)
+$(makeLenses ''AcqSvProfile)
+
+msgAcqSvProfile :: Word16
+msgAcqSvProfile = 0x001E
+
+-- | SBP class for message MSG_ACQ_SV_PROFILE (0x001E).
+--
+-- The message describes all SV profiles during acquisition time. The message
+-- is used to debug and measure the performance.
+data MsgAcqSvProfile = MsgAcqSvProfile
+  { _msgAcqSvProfile_acq_sv_profile :: [AcqSvProfile]
+    -- ^ SV profiles during acquisition time
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgAcqSvProfile where
+  get = do
+    _msgAcqSvProfile_acq_sv_profile <- whileM (liftM not isEmpty) get
+    return MsgAcqSvProfile {..}
+
+  put MsgAcqSvProfile {..} = do
+    mapM_ put _msgAcqSvProfile_acq_sv_profile
+
+$(deriveSBP 'msgAcqSvProfile ''MsgAcqSvProfile)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAcqSvProfile_" . stripPrefix "_msgAcqSvProfile_"}
+             ''MsgAcqSvProfile)
+$(makeLenses ''MsgAcqSvProfile)
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
@@ -247,149 +247,396 @@
              ''MsgBasePosEcef)
 $(makeLenses ''MsgBasePosEcef)
 
-msgEphemeris :: Word16
-msgEphemeris = 0x0080
+data EphemerisCommonContent = EphemerisCommonContent
+  { _ephemerisCommonContent_sid        :: GnssSignal
+    -- ^ GNSS signal identifier
+  , _ephemerisCommonContent_toe        :: ObsGPSTime
+    -- ^ Time of Ephemerides
+  , _ephemerisCommonContent_ura        :: Double
+    -- ^ User Range Accuracy
+  , _ephemerisCommonContent_fit_interval :: Word32
+    -- ^ Curve fit interval
+  , _ephemerisCommonContent_valid      :: Word8
+    -- ^ Status of ephemeris, 1 = valid, 0 = invalid
+  , _ephemerisCommonContent_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 )
 
--- | SBP class for message MSG_EPHEMERIS (0x0080).
+instance Binary EphemerisCommonContent where
+  get = do
+    _ephemerisCommonContent_sid <- get
+    _ephemerisCommonContent_toe <- get
+    _ephemerisCommonContent_ura <- getFloat64le
+    _ephemerisCommonContent_fit_interval <- getWord32le
+    _ephemerisCommonContent_valid <- getWord8
+    _ephemerisCommonContent_health_bits <- getWord8
+    return EphemerisCommonContent {..}
+
+  put EphemerisCommonContent {..} = do
+    put _ephemerisCommonContent_sid
+    put _ephemerisCommonContent_toe
+    putFloat64le _ephemerisCommonContent_ura
+    putWord32le _ephemerisCommonContent_fit_interval
+    putWord8 _ephemerisCommonContent_valid
+    putWord8 _ephemerisCommonContent_health_bits
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_ephemerisCommonContent_" . stripPrefix "_ephemerisCommonContent_"}
+             ''EphemerisCommonContent)
+$(makeLenses ''EphemerisCommonContent)
+
+msgEphemerisGps :: Word16
+msgEphemerisGps = 0x0081
+
+-- | SBP class for message MSG_EPHEMERIS_GPS (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 MsgEphemeris = MsgEphemeris
-  { _msgEphemeris_tgd    :: Double
+data MsgEphemerisGps = MsgEphemerisGps
+  { _msgEphemerisGps_common :: EphemerisCommonContent
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGps_tgd    :: Double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemeris_c_rs   :: Double
+  , _msgEphemerisGps_c_rs   :: Double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemeris_c_rc   :: Double
+  , _msgEphemerisGps_c_rc   :: Double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemeris_c_uc   :: Double
+  , _msgEphemerisGps_c_uc   :: Double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemeris_c_us   :: Double
+  , _msgEphemerisGps_c_us   :: Double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemeris_c_ic   :: Double
+  , _msgEphemerisGps_c_ic   :: Double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemeris_c_is   :: Double
+  , _msgEphemerisGps_c_is   :: Double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemeris_dn     :: Double
+  , _msgEphemerisGps_dn     :: Double
     -- ^ Mean motion difference
-  , _msgEphemeris_m0     :: Double
+  , _msgEphemerisGps_m0     :: Double
     -- ^ Mean anomaly at reference time
-  , _msgEphemeris_ecc    :: Double
+  , _msgEphemerisGps_ecc    :: Double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemeris_sqrta  :: Double
+  , _msgEphemerisGps_sqrta  :: Double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemeris_omega0 :: Double
+  , _msgEphemerisGps_omega0 :: Double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemeris_omegadot :: Double
+  , _msgEphemerisGps_omegadot :: Double
     -- ^ Rate of right ascension
-  , _msgEphemeris_w      :: Double
+  , _msgEphemerisGps_w      :: Double
     -- ^ Argument of perigee
-  , _msgEphemeris_inc    :: Double
+  , _msgEphemerisGps_inc    :: Double
     -- ^ Inclination
-  , _msgEphemeris_inc_dot :: Double
+  , _msgEphemerisGps_inc_dot :: Double
     -- ^ Inclination first derivative
-  , _msgEphemeris_af0    :: Double
+  , _msgEphemerisGps_af0    :: Double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemeris_af1    :: Double
+  , _msgEphemerisGps_af1    :: Double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemeris_af2    :: Double
+  , _msgEphemerisGps_af2    :: Double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemeris_toe_tow :: Double
+  , _msgEphemerisGps_toc    :: ObsGPSTime
+    -- ^ Clock reference
+  , _msgEphemerisGps_iode   :: Word8
+    -- ^ Issue of ephemeris data
+  , _msgEphemerisGps_iodc   :: Word16
+    -- ^ Issue of clock data
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGps where
+  get = do
+    _msgEphemerisGps_common <- get
+    _msgEphemerisGps_tgd <- getFloat64le
+    _msgEphemerisGps_c_rs <- getFloat64le
+    _msgEphemerisGps_c_rc <- getFloat64le
+    _msgEphemerisGps_c_uc <- getFloat64le
+    _msgEphemerisGps_c_us <- getFloat64le
+    _msgEphemerisGps_c_ic <- getFloat64le
+    _msgEphemerisGps_c_is <- getFloat64le
+    _msgEphemerisGps_dn <- getFloat64le
+    _msgEphemerisGps_m0 <- getFloat64le
+    _msgEphemerisGps_ecc <- getFloat64le
+    _msgEphemerisGps_sqrta <- getFloat64le
+    _msgEphemerisGps_omega0 <- getFloat64le
+    _msgEphemerisGps_omegadot <- getFloat64le
+    _msgEphemerisGps_w <- getFloat64le
+    _msgEphemerisGps_inc <- getFloat64le
+    _msgEphemerisGps_inc_dot <- getFloat64le
+    _msgEphemerisGps_af0 <- getFloat64le
+    _msgEphemerisGps_af1 <- getFloat64le
+    _msgEphemerisGps_af2 <- getFloat64le
+    _msgEphemerisGps_toc <- get
+    _msgEphemerisGps_iode <- getWord8
+    _msgEphemerisGps_iodc <- getWord16le
+    return MsgEphemerisGps {..}
+
+  put MsgEphemerisGps {..} = do
+    put _msgEphemerisGps_common
+    putFloat64le _msgEphemerisGps_tgd
+    putFloat64le _msgEphemerisGps_c_rs
+    putFloat64le _msgEphemerisGps_c_rc
+    putFloat64le _msgEphemerisGps_c_uc
+    putFloat64le _msgEphemerisGps_c_us
+    putFloat64le _msgEphemerisGps_c_ic
+    putFloat64le _msgEphemerisGps_c_is
+    putFloat64le _msgEphemerisGps_dn
+    putFloat64le _msgEphemerisGps_m0
+    putFloat64le _msgEphemerisGps_ecc
+    putFloat64le _msgEphemerisGps_sqrta
+    putFloat64le _msgEphemerisGps_omega0
+    putFloat64le _msgEphemerisGps_omegadot
+    putFloat64le _msgEphemerisGps_w
+    putFloat64le _msgEphemerisGps_inc
+    putFloat64le _msgEphemerisGps_inc_dot
+    putFloat64le _msgEphemerisGps_af0
+    putFloat64le _msgEphemerisGps_af1
+    putFloat64le _msgEphemerisGps_af2
+    put _msgEphemerisGps_toc
+    putWord8 _msgEphemerisGps_iode
+    putWord16le _msgEphemerisGps_iodc
+
+$(deriveSBP 'msgEphemerisGps ''MsgEphemerisGps)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGps_" . stripPrefix "_msgEphemerisGps_"}
+             ''MsgEphemerisGps)
+$(makeLenses ''MsgEphemerisGps)
+
+msgEphemerisSbas :: Word16
+msgEphemerisSbas = 0x0082
+
+data MsgEphemerisSbas = MsgEphemerisSbas
+  { _msgEphemerisSbas_common :: EphemerisCommonContent
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisSbas_pos  :: [Double]
+    -- ^ Position of the GEO at time toe
+  , _msgEphemerisSbas_vel  :: [Double]
+    -- ^ Velocity of the GEO at time toe
+  , _msgEphemerisSbas_acc  :: [Double]
+    -- ^ Acceleration of the GEO at time toe
+  , _msgEphemerisSbas_a_gf0 :: Double
+    -- ^ Time offset of the GEO clock w.r.t. SBAS Network Time
+  , _msgEphemerisSbas_a_gf1 :: Double
+    -- ^ Drift of the GEO clock w.r.t. SBAS Network Time
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisSbas where
+  get = do
+    _msgEphemerisSbas_common <- get
+    _msgEphemerisSbas_pos <- replicateM 3 getFloat64le
+    _msgEphemerisSbas_vel <- replicateM 3 getFloat64le
+    _msgEphemerisSbas_acc <- replicateM 3 getFloat64le
+    _msgEphemerisSbas_a_gf0 <- getFloat64le
+    _msgEphemerisSbas_a_gf1 <- getFloat64le
+    return MsgEphemerisSbas {..}
+
+  put MsgEphemerisSbas {..} = do
+    put _msgEphemerisSbas_common
+    mapM_ putFloat64le _msgEphemerisSbas_pos
+    mapM_ putFloat64le _msgEphemerisSbas_vel
+    mapM_ putFloat64le _msgEphemerisSbas_acc
+    putFloat64le _msgEphemerisSbas_a_gf0
+    putFloat64le _msgEphemerisSbas_a_gf1
+
+$(deriveSBP 'msgEphemerisSbas ''MsgEphemerisSbas)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisSbas_" . stripPrefix "_msgEphemerisSbas_"}
+             ''MsgEphemerisSbas)
+$(makeLenses ''MsgEphemerisSbas)
+
+msgEphemerisGlo :: Word16
+msgEphemerisGlo = 0x0083
+
+-- | SBP class for message MSG_EPHEMERIS_GLO (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 MsgEphemerisGlo = MsgEphemerisGlo
+  { _msgEphemerisGlo_common :: EphemerisCommonContent
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGlo_gamma :: Double
+    -- ^ Relative deviation of predicted carrier frequency from nominal
+  , _msgEphemerisGlo_tau  :: Double
+    -- ^ Correction to the SV time
+  , _msgEphemerisGlo_pos  :: [Double]
+    -- ^ Position of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGlo_vel  :: [Double]
+    -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGlo_acc  :: [Double]
+    -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGlo where
+  get = do
+    _msgEphemerisGlo_common <- get
+    _msgEphemerisGlo_gamma <- getFloat64le
+    _msgEphemerisGlo_tau <- getFloat64le
+    _msgEphemerisGlo_pos <- replicateM 3 getFloat64le
+    _msgEphemerisGlo_vel <- replicateM 3 getFloat64le
+    _msgEphemerisGlo_acc <- replicateM 3 getFloat64le
+    return MsgEphemerisGlo {..}
+
+  put MsgEphemerisGlo {..} = do
+    put _msgEphemerisGlo_common
+    putFloat64le _msgEphemerisGlo_gamma
+    putFloat64le _msgEphemerisGlo_tau
+    mapM_ putFloat64le _msgEphemerisGlo_pos
+    mapM_ putFloat64le _msgEphemerisGlo_vel
+    mapM_ putFloat64le _msgEphemerisGlo_acc
+
+$(deriveSBP 'msgEphemerisGlo ''MsgEphemerisGlo)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGlo_" . stripPrefix "_msgEphemerisGlo_"}
+             ''MsgEphemerisGlo)
+$(makeLenses ''MsgEphemerisGlo)
+
+msgEphemerisDepD :: Word16
+msgEphemerisDepD = 0x0080
+
+-- | SBP class for message MSG_EPHEMERIS_DEP_D (0x0080).
+--
+-- 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 MsgEphemerisDepD = MsgEphemerisDepD
+  { _msgEphemerisDepD_tgd    :: Double
+    -- ^ Group delay differential between L1 and L2
+  , _msgEphemerisDepD_c_rs   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the orbit radius
+  , _msgEphemerisDepD_c_rc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
+  , _msgEphemerisDepD_c_uc   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisDepD_c_us   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the argument of
+    -- latitude
+  , _msgEphemerisDepD_c_ic   :: Double
+    -- ^ Amplitude of the cosine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisDepD_c_is   :: Double
+    -- ^ Amplitude of the sine harmonic correction term to the angle of
+    -- inclination
+  , _msgEphemerisDepD_dn     :: Double
+    -- ^ Mean motion difference
+  , _msgEphemerisDepD_m0     :: Double
+    -- ^ Mean anomaly at reference time
+  , _msgEphemerisDepD_ecc    :: Double
+    -- ^ Eccentricity of satellite orbit
+  , _msgEphemerisDepD_sqrta  :: Double
+    -- ^ Square root of the semi-major axis of orbit
+  , _msgEphemerisDepD_omega0 :: Double
+    -- ^ Longitude of ascending node of orbit plane at weekly epoch
+  , _msgEphemerisDepD_omegadot :: Double
+    -- ^ Rate of right ascension
+  , _msgEphemerisDepD_w      :: Double
+    -- ^ Argument of perigee
+  , _msgEphemerisDepD_inc    :: Double
+    -- ^ Inclination
+  , _msgEphemerisDepD_inc_dot :: Double
+    -- ^ Inclination first derivative
+  , _msgEphemerisDepD_af0    :: Double
+    -- ^ Polynomial clock correction coefficient (clock bias)
+  , _msgEphemerisDepD_af1    :: Double
+    -- ^ Polynomial clock correction coefficient (clock drift)
+  , _msgEphemerisDepD_af2    :: Double
+    -- ^ Polynomial clock correction coefficient (rate of clock drift)
+  , _msgEphemerisDepD_toe_tow :: Double
     -- ^ Time of week
-  , _msgEphemeris_toe_wn :: Word16
+  , _msgEphemerisDepD_toe_wn :: Word16
     -- ^ Week number
-  , _msgEphemeris_toc_tow :: Double
+  , _msgEphemerisDepD_toc_tow :: Double
     -- ^ Clock reference time of week
-  , _msgEphemeris_toc_wn :: Word16
+  , _msgEphemerisDepD_toc_wn :: Word16
     -- ^ Clock reference week number
-  , _msgEphemeris_valid  :: Word8
+  , _msgEphemerisDepD_valid  :: Word8
     -- ^ Is valid?
-  , _msgEphemeris_healthy :: Word8
+  , _msgEphemerisDepD_healthy :: Word8
     -- ^ Satellite is healthy?
-  , _msgEphemeris_sid    :: GnssSignal
+  , _msgEphemerisDepD_sid    :: GnssSignal
     -- ^ GNSS signal identifier
-  , _msgEphemeris_iode   :: Word8
+  , _msgEphemerisDepD_iode   :: Word8
     -- ^ Issue of ephemeris data
-  , _msgEphemeris_iodc   :: Word16
+  , _msgEphemerisDepD_iodc   :: Word16
     -- ^ Issue of clock data
-  , _msgEphemeris_reserved :: Word32
+  , _msgEphemerisDepD_reserved :: Word32
     -- ^ Reserved field
   } deriving ( Show, Read, Eq )
 
-instance Binary MsgEphemeris where
+instance Binary MsgEphemerisDepD where
   get = do
-    _msgEphemeris_tgd <- getFloat64le
-    _msgEphemeris_c_rs <- getFloat64le
-    _msgEphemeris_c_rc <- getFloat64le
-    _msgEphemeris_c_uc <- getFloat64le
-    _msgEphemeris_c_us <- getFloat64le
-    _msgEphemeris_c_ic <- getFloat64le
-    _msgEphemeris_c_is <- getFloat64le
-    _msgEphemeris_dn <- getFloat64le
-    _msgEphemeris_m0 <- getFloat64le
-    _msgEphemeris_ecc <- getFloat64le
-    _msgEphemeris_sqrta <- getFloat64le
-    _msgEphemeris_omega0 <- getFloat64le
-    _msgEphemeris_omegadot <- getFloat64le
-    _msgEphemeris_w <- getFloat64le
-    _msgEphemeris_inc <- getFloat64le
-    _msgEphemeris_inc_dot <- getFloat64le
-    _msgEphemeris_af0 <- getFloat64le
-    _msgEphemeris_af1 <- getFloat64le
-    _msgEphemeris_af2 <- getFloat64le
-    _msgEphemeris_toe_tow <- getFloat64le
-    _msgEphemeris_toe_wn <- getWord16le
-    _msgEphemeris_toc_tow <- getFloat64le
-    _msgEphemeris_toc_wn <- getWord16le
-    _msgEphemeris_valid <- getWord8
-    _msgEphemeris_healthy <- getWord8
-    _msgEphemeris_sid <- get
-    _msgEphemeris_iode <- getWord8
-    _msgEphemeris_iodc <- getWord16le
-    _msgEphemeris_reserved <- getWord32le
-    return MsgEphemeris {..}
+    _msgEphemerisDepD_tgd <- getFloat64le
+    _msgEphemerisDepD_c_rs <- getFloat64le
+    _msgEphemerisDepD_c_rc <- getFloat64le
+    _msgEphemerisDepD_c_uc <- getFloat64le
+    _msgEphemerisDepD_c_us <- getFloat64le
+    _msgEphemerisDepD_c_ic <- getFloat64le
+    _msgEphemerisDepD_c_is <- getFloat64le
+    _msgEphemerisDepD_dn <- getFloat64le
+    _msgEphemerisDepD_m0 <- getFloat64le
+    _msgEphemerisDepD_ecc <- getFloat64le
+    _msgEphemerisDepD_sqrta <- getFloat64le
+    _msgEphemerisDepD_omega0 <- getFloat64le
+    _msgEphemerisDepD_omegadot <- getFloat64le
+    _msgEphemerisDepD_w <- getFloat64le
+    _msgEphemerisDepD_inc <- getFloat64le
+    _msgEphemerisDepD_inc_dot <- getFloat64le
+    _msgEphemerisDepD_af0 <- getFloat64le
+    _msgEphemerisDepD_af1 <- getFloat64le
+    _msgEphemerisDepD_af2 <- getFloat64le
+    _msgEphemerisDepD_toe_tow <- getFloat64le
+    _msgEphemerisDepD_toe_wn <- getWord16le
+    _msgEphemerisDepD_toc_tow <- getFloat64le
+    _msgEphemerisDepD_toc_wn <- getWord16le
+    _msgEphemerisDepD_valid <- getWord8
+    _msgEphemerisDepD_healthy <- getWord8
+    _msgEphemerisDepD_sid <- get
+    _msgEphemerisDepD_iode <- getWord8
+    _msgEphemerisDepD_iodc <- getWord16le
+    _msgEphemerisDepD_reserved <- getWord32le
+    return MsgEphemerisDepD {..}
 
-  put MsgEphemeris {..} = do
-    putFloat64le _msgEphemeris_tgd
-    putFloat64le _msgEphemeris_c_rs
-    putFloat64le _msgEphemeris_c_rc
-    putFloat64le _msgEphemeris_c_uc
-    putFloat64le _msgEphemeris_c_us
-    putFloat64le _msgEphemeris_c_ic
-    putFloat64le _msgEphemeris_c_is
-    putFloat64le _msgEphemeris_dn
-    putFloat64le _msgEphemeris_m0
-    putFloat64le _msgEphemeris_ecc
-    putFloat64le _msgEphemeris_sqrta
-    putFloat64le _msgEphemeris_omega0
-    putFloat64le _msgEphemeris_omegadot
-    putFloat64le _msgEphemeris_w
-    putFloat64le _msgEphemeris_inc
-    putFloat64le _msgEphemeris_inc_dot
-    putFloat64le _msgEphemeris_af0
-    putFloat64le _msgEphemeris_af1
-    putFloat64le _msgEphemeris_af2
-    putFloat64le _msgEphemeris_toe_tow
-    putWord16le _msgEphemeris_toe_wn
-    putFloat64le _msgEphemeris_toc_tow
-    putWord16le _msgEphemeris_toc_wn
-    putWord8 _msgEphemeris_valid
-    putWord8 _msgEphemeris_healthy
-    put _msgEphemeris_sid
-    putWord8 _msgEphemeris_iode
-    putWord16le _msgEphemeris_iodc
-    putWord32le _msgEphemeris_reserved
+  put MsgEphemerisDepD {..} = do
+    putFloat64le _msgEphemerisDepD_tgd
+    putFloat64le _msgEphemerisDepD_c_rs
+    putFloat64le _msgEphemerisDepD_c_rc
+    putFloat64le _msgEphemerisDepD_c_uc
+    putFloat64le _msgEphemerisDepD_c_us
+    putFloat64le _msgEphemerisDepD_c_ic
+    putFloat64le _msgEphemerisDepD_c_is
+    putFloat64le _msgEphemerisDepD_dn
+    putFloat64le _msgEphemerisDepD_m0
+    putFloat64le _msgEphemerisDepD_ecc
+    putFloat64le _msgEphemerisDepD_sqrta
+    putFloat64le _msgEphemerisDepD_omega0
+    putFloat64le _msgEphemerisDepD_omegadot
+    putFloat64le _msgEphemerisDepD_w
+    putFloat64le _msgEphemerisDepD_inc
+    putFloat64le _msgEphemerisDepD_inc_dot
+    putFloat64le _msgEphemerisDepD_af0
+    putFloat64le _msgEphemerisDepD_af1
+    putFloat64le _msgEphemerisDepD_af2
+    putFloat64le _msgEphemerisDepD_toe_tow
+    putWord16le _msgEphemerisDepD_toe_wn
+    putFloat64le _msgEphemerisDepD_toc_tow
+    putWord16le _msgEphemerisDepD_toc_wn
+    putWord8 _msgEphemerisDepD_valid
+    putWord8 _msgEphemerisDepD_healthy
+    put _msgEphemerisDepD_sid
+    putWord8 _msgEphemerisDepD_iode
+    putWord16le _msgEphemerisDepD_iodc
+    putWord32le _msgEphemerisDepD_reserved
 
-$(deriveSBP 'msgEphemeris ''MsgEphemeris)
+$(deriveSBP 'msgEphemerisDepD ''MsgEphemerisDepD)
 
-$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemeris_" . stripPrefix "_msgEphemeris_"}
-             ''MsgEphemeris)
-$(makeLenses ''MsgEphemeris)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisDepD_" . stripPrefix "_msgEphemerisDepD_"}
+             ''MsgEphemerisDepD)
+$(makeLenses ''MsgEphemerisDepD)
 
 msgEphemerisDepA :: Word16
 msgEphemerisDepA = 0x001A
@@ -958,3 +1205,126 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepB_" . stripPrefix "_msgObsDepB_"}
              ''MsgObsDepB)
 $(makeLenses ''MsgObsDepB)
+
+msgIono :: Word16
+msgIono = 0x0090
+
+-- | SBP class for message MSG_IONO (0x0090).
+--
+-- The ionospheric parameters which allow the "L1 only" or "L2 only" user to
+-- utilize the ionospheric model for computation of the ionospheric delay.
+-- Please see ICD-GPS-200 (Chapter 20.3.3.5.1.7) for more details.
+data MsgIono = MsgIono
+  { _msgIono_t_nmct :: ObsGPSTime
+    -- ^ Navigation Message Correction Table Valitidy Time
+  , _msgIono_a0   :: Double
+  , _msgIono_a1   :: Double
+  , _msgIono_a2   :: Double
+  , _msgIono_a3   :: Double
+  , _msgIono_b0   :: Double
+  , _msgIono_b1   :: Double
+  , _msgIono_b2   :: Double
+  , _msgIono_b3   :: Double
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgIono where
+  get = do
+    _msgIono_t_nmct <- get
+    _msgIono_a0 <- getFloat64le
+    _msgIono_a1 <- getFloat64le
+    _msgIono_a2 <- getFloat64le
+    _msgIono_a3 <- getFloat64le
+    _msgIono_b0 <- getFloat64le
+    _msgIono_b1 <- getFloat64le
+    _msgIono_b2 <- getFloat64le
+    _msgIono_b3 <- getFloat64le
+    return MsgIono {..}
+
+  put MsgIono {..} = do
+    put _msgIono_t_nmct
+    putFloat64le _msgIono_a0
+    putFloat64le _msgIono_a1
+    putFloat64le _msgIono_a2
+    putFloat64le _msgIono_a3
+    putFloat64le _msgIono_b0
+    putFloat64le _msgIono_b1
+    putFloat64le _msgIono_b2
+    putFloat64le _msgIono_b3
+
+$(deriveSBP 'msgIono ''MsgIono)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgIono_" . stripPrefix "_msgIono_"}
+             ''MsgIono)
+$(makeLenses ''MsgIono)
+
+msgSvConfigurationGps :: Word16
+msgSvConfigurationGps = 0x0091
+
+-- | SBP class for message MSG_SV_CONFIGURATION_GPS (0x0091).
+--
+-- Please see ICD-GPS-200 (Chapter 20.3.3.5.1.4) for more details.
+data MsgSvConfigurationGps = MsgSvConfigurationGps
+  { _msgSvConfigurationGps_t_nmct :: ObsGPSTime
+    -- ^ Navigation Message Correction Table Valitidy Time
+  , _msgSvConfigurationGps_l2c_mask :: Word32
+    -- ^ L2C capability mask, SV32 bit being MSB, SV1 bit being LSB
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSvConfigurationGps where
+  get = do
+    _msgSvConfigurationGps_t_nmct <- get
+    _msgSvConfigurationGps_l2c_mask <- getWord32le
+    return MsgSvConfigurationGps {..}
+
+  put MsgSvConfigurationGps {..} = do
+    put _msgSvConfigurationGps_t_nmct
+    putWord32le _msgSvConfigurationGps_l2c_mask
+
+$(deriveSBP 'msgSvConfigurationGps ''MsgSvConfigurationGps)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgSvConfigurationGps_" . stripPrefix "_msgSvConfigurationGps_"}
+             ''MsgSvConfigurationGps)
+$(makeLenses ''MsgSvConfigurationGps)
+
+msgGroupDelay :: Word16
+msgGroupDelay = 0x0092
+
+-- | SBP class for message MSG_GROUP_DELAY (0x0092).
+--
+-- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.
+data MsgGroupDelay = MsgGroupDelay
+  { _msgGroupDelay_t_op   :: ObsGPSTime
+    -- ^ Data Predict Time of Week
+  , _msgGroupDelay_prn    :: Word8
+    -- ^ Satellite number
+  , _msgGroupDelay_valid  :: Word8
+    -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
+    -- etc. 1 = value is valid, 0 = value is not valid.
+  , _msgGroupDelay_tgd    :: Int16
+  , _msgGroupDelay_isc_l1ca :: Int16
+  , _msgGroupDelay_isc_l2c :: Int16
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgGroupDelay where
+  get = do
+    _msgGroupDelay_t_op <- get
+    _msgGroupDelay_prn <- getWord8
+    _msgGroupDelay_valid <- getWord8
+    _msgGroupDelay_tgd <- liftM fromIntegral getWord16le
+    _msgGroupDelay_isc_l1ca <- liftM fromIntegral getWord16le
+    _msgGroupDelay_isc_l2c <- liftM fromIntegral getWord16le
+    return MsgGroupDelay {..}
+
+  put MsgGroupDelay {..} = do
+    put _msgGroupDelay_t_op
+    putWord8 _msgGroupDelay_prn
+    putWord8 _msgGroupDelay_valid
+    putWord16le $ fromIntegral _msgGroupDelay_tgd
+    putWord16le $ fromIntegral _msgGroupDelay_isc_l1ca
+    putWord16le $ fromIntegral _msgGroupDelay_isc_l2c
+
+$(deriveSBP 'msgGroupDelay ''MsgGroupDelay)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgGroupDelay_" . stripPrefix "_msgGroupDelay_"}
+             ''MsgGroupDelay)
+$(makeLenses ''MsgGroupDelay)
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
@@ -351,10 +351,10 @@
 -- 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. 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.
+-- 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
     -- ^ State of UART A
@@ -483,3 +483,46 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgMaskSatellite_" . stripPrefix "_msgMaskSatellite_"}
              ''MsgMaskSatellite)
 $(makeLenses ''MsgMaskSatellite)
+
+msgDeviceMonitor :: Word16
+msgDeviceMonitor = 0x00B5
+
+-- | SBP class for message MSG_DEVICE_MONITOR (0x00B5).
+--
+-- This message contains temperature and voltage level measurements from the
+-- processor's monitoring system and the RF frontend die temperature if
+-- available.
+data MsgDeviceMonitor = MsgDeviceMonitor
+  { _msgDeviceMonitor_dev_vin       :: Int16
+    -- ^ Device V_in
+  , _msgDeviceMonitor_cpu_vint      :: Int16
+    -- ^ Processor V_int
+  , _msgDeviceMonitor_cpu_vaux      :: Int16
+    -- ^ Processor V_aux
+  , _msgDeviceMonitor_cpu_temperature :: Int16
+    -- ^ Processor temperature
+  , _msgDeviceMonitor_fe_temperature :: Int16
+    -- ^ Frontend temperature (if available)
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgDeviceMonitor where
+  get = do
+    _msgDeviceMonitor_dev_vin <- liftM fromIntegral getWord16le
+    _msgDeviceMonitor_cpu_vint <- liftM fromIntegral getWord16le
+    _msgDeviceMonitor_cpu_vaux <- liftM fromIntegral getWord16le
+    _msgDeviceMonitor_cpu_temperature <- liftM fromIntegral getWord16le
+    _msgDeviceMonitor_fe_temperature <- liftM fromIntegral getWord16le
+    return MsgDeviceMonitor {..}
+
+  put MsgDeviceMonitor {..} = do
+    putWord16le $ fromIntegral _msgDeviceMonitor_dev_vin
+    putWord16le $ fromIntegral _msgDeviceMonitor_cpu_vint
+    putWord16le $ fromIntegral _msgDeviceMonitor_cpu_vaux
+    putWord16le $ fromIntegral _msgDeviceMonitor_cpu_temperature
+    putWord16le $ fromIntegral _msgDeviceMonitor_fe_temperature
+
+$(deriveSBP 'msgDeviceMonitor ''MsgDeviceMonitor)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgDeviceMonitor_" . stripPrefix "_msgDeviceMonitor_"}
+             ''MsgDeviceMonitor)
+$(makeLenses ''MsgDeviceMonitor)
