diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               2.2.3
+version:               2.2.6
 synopsis:              SwiftNav's SBP Library
 homepage:              https://github.com/swift-nav/libsbp
 license:               LGPL-3
diff --git a/src/SwiftNav/SBP/Msg.hs b/src/SwiftNav/SBP/Msg.hs
--- a/src/SwiftNav/SBP/Msg.hs
+++ b/src/SwiftNav/SBP/Msg.hs
@@ -59,6 +59,7 @@
    | SBPMsgBootloaderHandshakeReq MsgBootloaderHandshakeReq Msg
    | SBPMsgBootloaderHandshakeResp MsgBootloaderHandshakeResp Msg
    | SBPMsgBootloaderJumpToApp MsgBootloaderJumpToApp Msg
+   | SBPMsgCommandOutput MsgCommandOutput Msg
    | SBPMsgCommandReq MsgCommandReq Msg
    | SBPMsgCommandResp MsgCommandResp Msg
    | SBPMsgCwResults MsgCwResults Msg
@@ -73,6 +74,8 @@
    | SBPMsgEphemerisDepD MsgEphemerisDepD Msg
    | SBPMsgEphemerisGlo MsgEphemerisGlo Msg
    | SBPMsgEphemerisGloDepA MsgEphemerisGloDepA Msg
+   | SBPMsgEphemerisGloDepB MsgEphemerisGloDepB Msg
+   | SBPMsgEphemerisGloDepC MsgEphemerisGloDepC Msg
    | SBPMsgEphemerisGps MsgEphemerisGps Msg
    | SBPMsgEphemerisGpsDepE MsgEphemerisGpsDepE Msg
    | SBPMsgEphemerisSbas MsgEphemerisSbas Msg
@@ -186,6 +189,7 @@
           | _msgSBPType == msgBootloaderHandshakeReq = SBPMsgBootloaderHandshakeReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBootloaderHandshakeResp = SBPMsgBootloaderHandshakeResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgBootloaderJumpToApp = SBPMsgBootloaderJumpToApp (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgCommandOutput = SBPMsgCommandOutput (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgCommandReq = SBPMsgCommandReq (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgCommandResp = SBPMsgCommandResp (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgCwResults = SBPMsgCwResults (decode (fromStrict _msgSBPPayload)) m
@@ -200,6 +204,8 @@
           | _msgSBPType == msgEphemerisDepD = SBPMsgEphemerisDepD (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisGlo = SBPMsgEphemerisGlo (decode (fromStrict _msgSBPPayload)) m
           | _msgSBPType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGloDepB = SBPMsgEphemerisGloDepB (decode (fromStrict _msgSBPPayload)) m
+          | _msgSBPType == msgEphemerisGloDepC = SBPMsgEphemerisGloDepC (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
@@ -305,6 +311,7 @@
       encode' (SBPMsgBootloaderHandshakeReq _ m) = put m
       encode' (SBPMsgBootloaderHandshakeResp _ m) = put m
       encode' (SBPMsgBootloaderJumpToApp _ m) = put m
+      encode' (SBPMsgCommandOutput _ m) = put m
       encode' (SBPMsgCommandReq _ m) = put m
       encode' (SBPMsgCommandResp _ m) = put m
       encode' (SBPMsgCwResults _ m) = put m
@@ -319,6 +326,8 @@
       encode' (SBPMsgEphemerisDepD _ m) = put m
       encode' (SBPMsgEphemerisGlo _ m) = put m
       encode' (SBPMsgEphemerisGloDepA _ m) = put m
+      encode' (SBPMsgEphemerisGloDepB _ m) = put m
+      encode' (SBPMsgEphemerisGloDepC _ m) = put m
       encode' (SBPMsgEphemerisGps _ m) = put m
       encode' (SBPMsgEphemerisGpsDepE _ m) = put m
       encode' (SBPMsgEphemerisSbas _ m) = put m
@@ -427,6 +436,7 @@
         | msgType == msgBootloaderHandshakeReq = SBPMsgBootloaderHandshakeReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBootloaderHandshakeResp = SBPMsgBootloaderHandshakeResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgBootloaderJumpToApp = SBPMsgBootloaderJumpToApp <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgCommandOutput = SBPMsgCommandOutput <$> parseJSON obj <*> parseJSON obj
         | msgType == msgCommandReq = SBPMsgCommandReq <$> parseJSON obj <*> parseJSON obj
         | msgType == msgCommandResp = SBPMsgCommandResp <$> parseJSON obj <*> parseJSON obj
         | msgType == msgCwResults = SBPMsgCwResults <$> parseJSON obj <*> parseJSON obj
@@ -441,6 +451,8 @@
         | msgType == msgEphemerisDepD = SBPMsgEphemerisDepD <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisGlo = SBPMsgEphemerisGlo <$> parseJSON obj <*> parseJSON obj
         | msgType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGloDepB = SBPMsgEphemerisGloDepB <$> parseJSON obj <*> parseJSON obj
+        | msgType == msgEphemerisGloDepC = SBPMsgEphemerisGloDepC <$> 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
@@ -551,6 +563,7 @@
   toJSON (SBPMsgBootloaderHandshakeReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgBootloaderHandshakeResp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgBootloaderJumpToApp n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgCommandOutput n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgCommandReq n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgCommandResp n m) = toJSON n `mergeValues` toJSON m
   toJSON (SBPMsgCwResults n m) = toJSON n `mergeValues` toJSON m
@@ -565,6 +578,8 @@
   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 (SBPMsgEphemerisGloDepB n m) = toJSON n `mergeValues` toJSON m
+  toJSON (SBPMsgEphemerisGloDepC 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
@@ -669,6 +684,7 @@
   msg f (SBPMsgBootloaderHandshakeReq n m) = SBPMsgBootloaderHandshakeReq n <$> f m
   msg f (SBPMsgBootloaderHandshakeResp n m) = SBPMsgBootloaderHandshakeResp n <$> f m
   msg f (SBPMsgBootloaderJumpToApp n m) = SBPMsgBootloaderJumpToApp n <$> f m
+  msg f (SBPMsgCommandOutput n m) = SBPMsgCommandOutput n <$> f m
   msg f (SBPMsgCommandReq n m) = SBPMsgCommandReq n <$> f m
   msg f (SBPMsgCommandResp n m) = SBPMsgCommandResp n <$> f m
   msg f (SBPMsgCwResults n m) = SBPMsgCwResults n <$> f m
@@ -683,6 +699,8 @@
   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 (SBPMsgEphemerisGloDepB n m) = SBPMsgEphemerisGloDepB n <$> f m
+  msg f (SBPMsgEphemerisGloDepC n m) = SBPMsgEphemerisGloDepC 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
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
@@ -434,7 +434,7 @@
   , _msgVelEcef_z      :: Int32
     -- ^ Velocity ECEF Z coordinate
   , _msgVelEcef_accuracy :: Word16
-    -- ^ Velocity accuracy estimate (not implemented). Defaults to 0.
+    -- ^ Velocity accuracy estimate
   , _msgVelEcef_n_sats :: Word8
     -- ^ Number of satellites used in solution
   , _msgVelEcef_flags  :: Word8
@@ -486,9 +486,9 @@
   , _msgVelNed_d        :: Int32
     -- ^ Velocity Down coordinate
   , _msgVelNed_h_accuracy :: Word16
-    -- ^ Horizontal velocity accuracy estimate (not implemented). Defaults to 0.
+    -- ^ Horizontal velocity accuracy estimate
   , _msgVelNed_v_accuracy :: Word16
-    -- ^ Vertical velocity accuracy estimate (not implemented). Defaults to 0.
+    -- ^ Vertical velocity accuracy estimate
   , _msgVelNed_n_sats   :: Word8
     -- ^ Number of satellites used in solution
   , _msgVelNed_flags    :: Word8
@@ -818,7 +818,7 @@
   , _msgBaselineEcefDepA_z      :: Int32
     -- ^ Baseline ECEF Z coordinate
   , _msgBaselineEcefDepA_accuracy :: Word16
-    -- ^ Position accuracy estimate (not implemented). Defaults to 0.
+    -- ^ Position accuracy estimate
   , _msgBaselineEcefDepA_n_sats :: Word8
     -- ^ Number of satellites used in solution
   , _msgBaselineEcefDepA_flags  :: Word8
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
@@ -682,10 +682,114 @@
              ''MsgEphemerisSbas)
 $(makeLenses ''MsgEphemerisSbas)
 
+msgEphemerisGloDepB :: Word16
+msgEphemerisGloDepB = 0x0085
+
+-- | SBP class for message MSG_EPHEMERIS_GLO_DEP_B (0x0085).
+--
+-- 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 MsgEphemerisGloDepB = MsgEphemerisGloDepB
+  { _msgEphemerisGloDepB_common :: EphemerisCommonContent
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGloDepB_gamma :: Double
+    -- ^ Relative deviation of predicted carrier frequency from nominal
+  , _msgEphemerisGloDepB_tau  :: Double
+    -- ^ Correction to the SV time
+  , _msgEphemerisGloDepB_pos  :: [Double]
+    -- ^ Position of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepB_vel  :: [Double]
+    -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepB_acc  :: [Double]
+    -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGloDepB where
+  get = do
+    _msgEphemerisGloDepB_common <- get
+    _msgEphemerisGloDepB_gamma <- getFloat64le
+    _msgEphemerisGloDepB_tau <- getFloat64le
+    _msgEphemerisGloDepB_pos <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepB_vel <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepB_acc <- replicateM 3 getFloat64le
+    return MsgEphemerisGloDepB {..}
+
+  put MsgEphemerisGloDepB {..} = do
+    put _msgEphemerisGloDepB_common
+    putFloat64le _msgEphemerisGloDepB_gamma
+    putFloat64le _msgEphemerisGloDepB_tau
+    mapM_ putFloat64le _msgEphemerisGloDepB_pos
+    mapM_ putFloat64le _msgEphemerisGloDepB_vel
+    mapM_ putFloat64le _msgEphemerisGloDepB_acc
+
+$(deriveSBP 'msgEphemerisGloDepB ''MsgEphemerisGloDepB)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGloDepB_" . P.stripPrefix "_msgEphemerisGloDepB_"}
+             ''MsgEphemerisGloDepB)
+$(makeLenses ''MsgEphemerisGloDepB)
+
+msgEphemerisGloDepC :: Word16
+msgEphemerisGloDepC = 0x0087
+
+-- | SBP class for message MSG_EPHEMERIS_GLO_DEP_C (0x0087).
+--
+-- 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 MsgEphemerisGloDepC = MsgEphemerisGloDepC
+  { _msgEphemerisGloDepC_common :: EphemerisCommonContent
+    -- ^ Values common for all ephemeris types
+  , _msgEphemerisGloDepC_gamma :: Double
+    -- ^ Relative deviation of predicted carrier frequency from nominal
+  , _msgEphemerisGloDepC_tau  :: Double
+    -- ^ Correction to the SV time
+  , _msgEphemerisGloDepC_d_tau :: Double
+    -- ^ Equipment delay between L1 and L2
+  , _msgEphemerisGloDepC_pos  :: [Double]
+    -- ^ Position of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepC_vel  :: [Double]
+    -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
+  , _msgEphemerisGloDepC_acc  :: [Double]
+    -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
+  , _msgEphemerisGloDepC_fcn  :: Word8
+    -- ^ Frequency slot. FCN+8 (that is [1..14]). 0 or 0xFF for invalid
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgEphemerisGloDepC where
+  get = do
+    _msgEphemerisGloDepC_common <- get
+    _msgEphemerisGloDepC_gamma <- getFloat64le
+    _msgEphemerisGloDepC_tau <- getFloat64le
+    _msgEphemerisGloDepC_d_tau <- getFloat64le
+    _msgEphemerisGloDepC_pos <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepC_vel <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepC_acc <- replicateM 3 getFloat64le
+    _msgEphemerisGloDepC_fcn <- getWord8
+    return MsgEphemerisGloDepC {..}
+
+  put MsgEphemerisGloDepC {..} = do
+    put _msgEphemerisGloDepC_common
+    putFloat64le _msgEphemerisGloDepC_gamma
+    putFloat64le _msgEphemerisGloDepC_tau
+    putFloat64le _msgEphemerisGloDepC_d_tau
+    mapM_ putFloat64le _msgEphemerisGloDepC_pos
+    mapM_ putFloat64le _msgEphemerisGloDepC_vel
+    mapM_ putFloat64le _msgEphemerisGloDepC_acc
+    putWord8 _msgEphemerisGloDepC_fcn
+
+$(deriveSBP 'msgEphemerisGloDepC ''MsgEphemerisGloDepC)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGloDepC_" . P.stripPrefix "_msgEphemerisGloDepC_"}
+             ''MsgEphemerisGloDepC)
+$(makeLenses ''MsgEphemerisGloDepC)
+
 msgEphemerisGlo :: Word16
-msgEphemerisGlo = 0x0085
+msgEphemerisGlo = 0x0088
 
--- | SBP class for message MSG_EPHEMERIS_GLO (0x0085).
+-- | SBP class for message MSG_EPHEMERIS_GLO (0x0088).
 --
 -- The ephemeris message returns a set of satellite orbit parameters that is
 -- used to calculate GLO satellite position, velocity, and clock offset. Please
@@ -698,12 +802,18 @@
     -- ^ Relative deviation of predicted carrier frequency from nominal
   , _msgEphemerisGlo_tau  :: Double
     -- ^ Correction to the SV time
+  , _msgEphemerisGlo_d_tau :: Double
+    -- ^ Equipment delay between L1 and L2
   , _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
+  , _msgEphemerisGlo_fcn  :: Word8
+    -- ^ Frequency slot. FCN+8 (that is [1..14]). 0 or 0xFF for invalid
+  , _msgEphemerisGlo_iod  :: Word8
+    -- ^ Issue of ephemeris data
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgEphemerisGlo where
@@ -711,18 +821,24 @@
     _msgEphemerisGlo_common <- get
     _msgEphemerisGlo_gamma <- getFloat64le
     _msgEphemerisGlo_tau <- getFloat64le
+    _msgEphemerisGlo_d_tau <- getFloat64le
     _msgEphemerisGlo_pos <- replicateM 3 getFloat64le
     _msgEphemerisGlo_vel <- replicateM 3 getFloat64le
     _msgEphemerisGlo_acc <- replicateM 3 getFloat64le
+    _msgEphemerisGlo_fcn <- getWord8
+    _msgEphemerisGlo_iod <- getWord8
     return MsgEphemerisGlo {..}
 
   put MsgEphemerisGlo {..} = do
     put _msgEphemerisGlo_common
     putFloat64le _msgEphemerisGlo_gamma
     putFloat64le _msgEphemerisGlo_tau
+    putFloat64le _msgEphemerisGlo_d_tau
     mapM_ putFloat64le _msgEphemerisGlo_pos
     mapM_ putFloat64le _msgEphemerisGlo_vel
     mapM_ putFloat64le _msgEphemerisGlo_acc
+    putWord8 _msgEphemerisGlo_fcn
+    putWord8 _msgEphemerisGlo_iod
 
 $(deriveSBP 'msgEphemerisGlo ''MsgEphemerisGlo)
 
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
@@ -612,6 +612,37 @@
              ''MsgCommandResp)
 $(makeLenses ''MsgCommandResp)
 
+msgCommandOutput :: Word16
+msgCommandOutput = 0x00BC
+
+-- | SBP class for message MSG_COMMAND_OUTPUT (0x00BC).
+--
+-- Returns the standard output and standard error of the command requested by
+-- MSG_COMMAND_REQ. The sequence number can be used to filter for filtering the
+-- correct command.
+data MsgCommandOutput = MsgCommandOutput
+  { _msgCommandOutput_sequence :: Word32
+    -- ^ Sequence number
+  , _msgCommandOutput_line   :: Text
+    -- ^ Line of standard output or standard error
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgCommandOutput where
+  get = do
+    _msgCommandOutput_sequence <- getWord32le
+    _msgCommandOutput_line <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
+    return MsgCommandOutput {..}
+
+  put MsgCommandOutput {..} = do
+    putWord32le _msgCommandOutput_sequence
+    putByteString $ encodeUtf8 _msgCommandOutput_line
+
+$(deriveSBP 'msgCommandOutput ''MsgCommandOutput)
+
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgCommandOutput_" . P.stripPrefix "_msgCommandOutput_"}
+             ''MsgCommandOutput)
+$(makeLenses ''MsgCommandOutput)
+
 msgNetworkStateReq :: Word16
 msgNetworkStateReq = 0x00BA
 
@@ -696,7 +727,9 @@
 --
 -- Spectrum analyzer packet.
 data MsgSpecan = MsgSpecan
-  { _msgSpecan_t             :: GpsTime
+  { _msgSpecan_channel_tag   :: Word16
+    -- ^ Channel ID
+  , _msgSpecan_t             :: GpsTime
     -- ^ Receiver time of this observation
   , _msgSpecan_freq_ref      :: Float
     -- ^ Reference frequency of this packet
@@ -712,6 +745,7 @@
 
 instance Binary MsgSpecan where
   get = do
+    _msgSpecan_channel_tag <- getWord16le
     _msgSpecan_t <- get
     _msgSpecan_freq_ref <- getFloat32le
     _msgSpecan_freq_step <- getFloat32le
@@ -721,6 +755,7 @@
     return MsgSpecan {..}
 
   put MsgSpecan {..} = do
+    putWord16le _msgSpecan_channel_tag
     put _msgSpecan_t
     putFloat32le _msgSpecan_freq_ref
     putFloat32le _msgSpecan_freq_step
