diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               2.2.1
+version:               2.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
@@ -9,7 +9,7 @@
 -- SBP message containers.
 
 module SwiftNav.SBP
-  ( SBPMsg (..)
+  ( module SwiftNav.SBP
   , module SwiftNav.SBP.Types
   , module SwiftNav.SBP.Acquisition
   , module SwiftNav.SBP.Bootload
@@ -150,6 +150,7 @@
    | SBPMsgSettingsRegister MsgSettingsRegister Msg
    | SBPMsgSettingsSave MsgSettingsSave Msg
    | SBPMsgSettingsWrite MsgSettingsWrite Msg
+   | SBPMsgSpecan MsgSpecan Msg
    | SBPMsgStartup MsgStartup Msg
    | SBPMsgStmFlashLockSector MsgStmFlashLockSector Msg
    | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector Msg
@@ -160,6 +161,7 @@
    | SBPMsgTrackingIq MsgTrackingIq Msg
    | SBPMsgTrackingState MsgTrackingState Msg
    | SBPMsgTrackingStateDepA MsgTrackingStateDepA Msg
+   | SBPMsgTrackingStateDepB MsgTrackingStateDepB Msg
    | SBPMsgTrackingStateDetailed MsgTrackingStateDetailed Msg
    | SBPMsgTweet MsgTweet Msg
    | SBPMsgUartState MsgUartState Msg
@@ -275,6 +277,7 @@
           | _msgSBPType == msgSettingsRegister = SBPMsgSettingsRegister (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgSettingsSave = SBPMsgSettingsSave (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgSettingsWrite = SBPMsgSettingsWrite (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgSpecan = SBPMsgSpecan (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgStartup = SBPMsgStartup (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgStmFlashLockSector = SBPMsgStmFlashLockSector (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector (decode (fromStrict _msgSBPPayload)) m
@@ -285,6 +288,7 @@
           | _msgSBPType == msgTrackingIq = SBPMsgTrackingIq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTrackingState = SBPMsgTrackingState (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTrackingStateDepA = SBPMsgTrackingStateDepA (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgTrackingStateDepB = SBPMsgTrackingStateDepB (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgTweet = SBPMsgTweet (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgUartState = SBPMsgUartState (decode (fromStrict _msgSBPPayload)) m
@@ -392,6 +396,7 @@
       encode' (SBPMsgSettingsRegister _ m) = put m
       encode' (SBPMsgSettingsSave _ m) = put m
       encode' (SBPMsgSettingsWrite _ m) = put m
+      encode' (SBPMsgSpecan _ m) = put m
       encode' (SBPMsgStartup _ m) = put m
       encode' (SBPMsgStmFlashLockSector _ m) = put m
       encode' (SBPMsgStmFlashUnlockSector _ m) = put m
@@ -402,6 +407,7 @@
       encode' (SBPMsgTrackingIq _ m) = put m
       encode' (SBPMsgTrackingState _ m) = put m
       encode' (SBPMsgTrackingStateDepA _ m) = put m
+      encode' (SBPMsgTrackingStateDepB _ m) = put m
       encode' (SBPMsgTrackingStateDetailed _ m) = put m
       encode' (SBPMsgTweet _ m) = put m
       encode' (SBPMsgUartState _ m) = put m
@@ -512,6 +518,7 @@
         | msgType == msgSettingsRegister = SBPMsgSettingsRegister <$> parseJSON obj <*> parseJSON obj
         | msgType == msgSettingsSave = SBPMsgSettingsSave <$> parseJSON obj <*> parseJSON obj
         | msgType == msgSettingsWrite = SBPMsgSettingsWrite <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgSpecan = SBPMsgSpecan <$> parseJSON obj <*> parseJSON obj
         | msgType == msgStartup = SBPMsgStartup <$> parseJSON obj <*> parseJSON obj
         | msgType == msgStmFlashLockSector = SBPMsgStmFlashLockSector <$> parseJSON obj <*> parseJSON obj
         | msgType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector <$> parseJSON obj <*> parseJSON obj
@@ -522,6 +529,7 @@
         | msgType == msgTrackingIq = SBPMsgTrackingIq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTrackingState = SBPMsgTrackingState <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTrackingStateDepA = SBPMsgTrackingStateDepA <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgTrackingStateDepB = SBPMsgTrackingStateDepB <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed <$> parseJSON obj <*> parseJSON obj
         | msgType == msgTweet = SBPMsgTweet <$> parseJSON obj <*> parseJSON obj
         | msgType == msgUartState = SBPMsgUartState <$> parseJSON obj <*> parseJSON obj
@@ -634,6 +642,7 @@
   toJSON (SBPMsgSettingsRegister n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgSettingsSave n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgSettingsWrite n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgSpecan n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgStartup n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgStmFlashLockSector n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgStmFlashUnlockSector n m) = toJSON n `mergeValues` toJSON m
@@ -644,6 +653,7 @@
   toJSON (SBPMsgTrackingIq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTrackingState n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTrackingStateDepA n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgTrackingStateDepB n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTrackingStateDetailed n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgTweet n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgUartState n m) = toJSON n `mergeValues` toJSON m
@@ -750,6 +760,7 @@
   msg f (SBPMsgSettingsRegister n m) = SBPMsgSettingsRegister n <$> f m
   msg f (SBPMsgSettingsSave n m) = SBPMsgSettingsSave n <$> f m
   msg f (SBPMsgSettingsWrite n m) = SBPMsgSettingsWrite n <$> f m
+  msg f (SBPMsgSpecan n m) = SBPMsgSpecan n <$> f m
   msg f (SBPMsgStartup n m) = SBPMsgStartup n <$> f m
   msg f (SBPMsgStmFlashLockSector n m) = SBPMsgStmFlashLockSector n <$> f m
   msg f (SBPMsgStmFlashUnlockSector n m) = SBPMsgStmFlashUnlockSector n <$> f m
@@ -760,6 +771,7 @@
   msg f (SBPMsgTrackingIq n m) = SBPMsgTrackingIq n <$> f m
   msg f (SBPMsgTrackingState n m) = SBPMsgTrackingState n <$> f m
   msg f (SBPMsgTrackingStateDepA n m) = SBPMsgTrackingStateDepA n <$> f m
+  msg f (SBPMsgTrackingStateDepB n m) = SBPMsgTrackingStateDepB n <$> f m
   msg f (SBPMsgTrackingStateDetailed n m) = SBPMsgTrackingStateDetailed n <$> f m
   msg f (SBPMsgTweet n m) = SBPMsgTweet n <$> f m
   msg f (SBPMsgUartState n m) = SBPMsgUartState n <$> f m
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
@@ -688,3 +688,48 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgNetworkStateResp_" . P.stripPrefix "_msgNetworkStateResp_"}
              ''MsgNetworkStateResp)
 $(makeLenses ''MsgNetworkStateResp)
+
+msgSpecan :: Word16
+msgSpecan = 0x0050
+
+-- | SBP class for message MSG_SPECAN (0x0050).
+--
+-- Spectrum analyzer packet.
+data MsgSpecan = MsgSpecan
+  { _msgSpecan_t             :: GpsTime
+    -- ^ Receiver time of this observation
+  , _msgSpecan_freq_ref      :: Float
+    -- ^ Reference frequency of this packet
+  , _msgSpecan_freq_step     :: Float
+    -- ^ Frequency step of points in this packet
+  , _msgSpecan_amplitude_ref :: Float
+    -- ^ Reference amplitude of this packet
+  , _msgSpecan_amplitude_unit :: Float
+    -- ^ Amplitude unit value of points in this packet
+  , _msgSpecan_amplitude_value :: [Word8]
+    -- ^ Amplitude values (in the above units) of points in this packet
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSpecan where
+  get = do
+    _msgSpecan_t <- get
+    _msgSpecan_freq_ref <- getFloat32le
+    _msgSpecan_freq_step <- getFloat32le
+    _msgSpecan_amplitude_ref <- getFloat32le
+    _msgSpecan_amplitude_unit <- getFloat32le
+    _msgSpecan_amplitude_value <- whileM (not <$> isEmpty) getWord8
+    return MsgSpecan {..}
+
+  put MsgSpecan {..} = do
+    put _msgSpecan_t
+    putFloat32le _msgSpecan_freq_ref
+    putFloat32le _msgSpecan_freq_step
+    putFloat32le _msgSpecan_amplitude_ref
+    putFloat32le _msgSpecan_amplitude_unit
+    mapM_ putWord8 _msgSpecan_amplitude_value
+
+$(deriveSBP 'msgSpecan ''MsgSpecan)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgSpecan_" . P.stripPrefix "_msgSpecan_"}
+             ''MsgSpecan)
+$(makeLenses ''MsgSpecan)
diff --git a/src/SwiftNav/SBP/Tracking.hs b/src/SwiftNav/SBP/Tracking.hs
--- a/src/SwiftNav/SBP/Tracking.hs
+++ b/src/SwiftNav/SBP/Tracking.hs
@@ -145,33 +145,33 @@
 -- Tracking channel state for a specific satellite signal and measured signal
 -- power.
 data TrackingChannelState = TrackingChannelState
-  { _trackingChannelState_state :: Word8
-    -- ^ Status of tracking channel
-  , _trackingChannelState_sid :: GnssSignal
+  { _trackingChannelState_sid :: GnssSignal16
     -- ^ GNSS signal being tracked
-  , _trackingChannelState_cn0 :: Float
-    -- ^ Carrier-to-noise density
+  , _trackingChannelState_fcn :: Word8
+    -- ^ Frequency channel number (GLONASS only)
+  , _trackingChannelState_cn0 :: Word8
+    -- ^ Carrier-to-Noise density.  Zero implies invalid cn0.
   } deriving ( Show, Read, Eq )
 
 instance Binary TrackingChannelState where
   get = do
-    _trackingChannelState_state <- getWord8
     _trackingChannelState_sid <- get
-    _trackingChannelState_cn0 <- getFloat32le
+    _trackingChannelState_fcn <- getWord8
+    _trackingChannelState_cn0 <- getWord8
     return TrackingChannelState {..}
 
   put TrackingChannelState {..} = do
-    putWord8 _trackingChannelState_state
     put _trackingChannelState_sid
-    putFloat32le _trackingChannelState_cn0
+    putWord8 _trackingChannelState_fcn
+    putWord8 _trackingChannelState_cn0
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_trackingChannelState_" . P.stripPrefix "_trackingChannelState_"}
              ''TrackingChannelState)
 $(makeLenses ''TrackingChannelState)
 
 msgTrackingState :: Word16
-msgTrackingState = 0x0013
+msgTrackingState = 0x0041
 
--- | SBP class for message MSG_TRACKING_STATE (0x0013).
+-- | SBP class for message MSG_TRACKING_STATE (0x0041).
 --
 -- The tracking message returns a variable-length array of tracking channel
 -- states. It reports status and carrier-to-noise density measurements for all
@@ -303,3 +303,55 @@
 $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgTrackingStateDepA_" . P.stripPrefix "_msgTrackingStateDepA_"}
              ''MsgTrackingStateDepA)
 $(makeLenses ''MsgTrackingStateDepA)
+
+-- | TrackingChannelStateDepB.
+--
+-- Deprecated.
+data TrackingChannelStateDepB = TrackingChannelStateDepB
+  { _trackingChannelStateDepB_state :: Word8
+    -- ^ Status of tracking channel
+  , _trackingChannelStateDepB_sid :: GnssSignal
+    -- ^ GNSS signal being tracked
+  , _trackingChannelStateDepB_cn0 :: Float
+    -- ^ Carrier-to-noise density
+  } deriving ( Show, Read, Eq )
+
+instance Binary TrackingChannelStateDepB where
+  get = do
+    _trackingChannelStateDepB_state <- getWord8
+    _trackingChannelStateDepB_sid <- get
+    _trackingChannelStateDepB_cn0 <- getFloat32le
+    return TrackingChannelStateDepB {..}
+
+  put TrackingChannelStateDepB {..} = do
+    putWord8 _trackingChannelStateDepB_state
+    put _trackingChannelStateDepB_sid
+    putFloat32le _trackingChannelStateDepB_cn0
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_trackingChannelStateDepB_" . P.stripPrefix "_trackingChannelStateDepB_"}
+             ''TrackingChannelStateDepB)
+$(makeLenses ''TrackingChannelStateDepB)
+
+msgTrackingStateDepB :: Word16
+msgTrackingStateDepB = 0x0013
+
+-- | SBP class for message MSG_TRACKING_STATE_DEP_B (0x0013).
+--
+-- Deprecated.
+data MsgTrackingStateDepB = MsgTrackingStateDepB
+  { _msgTrackingStateDepB_states :: [TrackingChannelStateDepB]
+    -- ^ Signal tracking channel state
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgTrackingStateDepB where
+  get = do
+    _msgTrackingStateDepB_states <- whileM (not <$> isEmpty) get
+    return MsgTrackingStateDepB {..}
+
+  put MsgTrackingStateDepB {..} = do
+    mapM_ put _msgTrackingStateDepB_states
+
+$(deriveSBP 'msgTrackingStateDepB ''MsgTrackingStateDepB)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgTrackingStateDepB_" . P.stripPrefix "_msgTrackingStateDepB_"}
+             ''MsgTrackingStateDepB)
+$(makeLenses ''MsgTrackingStateDepB)
