diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               4.4.0
+version:               4.5.0
 synopsis:              SwiftNav's SBP Library
 homepage:              https://github.com/swift-nav/libsbp
 license:               MIT
diff --git a/src/SwiftNav/SBP/Integrity.hs b/src/SwiftNav/SBP/Integrity.hs
--- a/src/SwiftNav/SBP/Integrity.hs
+++ b/src/SwiftNav/SBP/Integrity.hs
@@ -36,20 +36,113 @@
 {-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
 
 
+data IntegritySSRHeader = IntegritySSRHeader
+  { _integritySSRHeader_obs_time  :: !GpsTimeSec
+    -- ^ GNSS reference time of the observation used to generate the flag.
+  , _integritySSRHeader_num_msgs  :: !Word8
+    -- ^ Number of messages in the dataset
+  , _integritySSRHeader_seq_num   :: !Word8
+    -- ^ Position of this message in the dataset
+  , _integritySSRHeader_ssr_sol_id :: !Word8
+    -- ^ SSR Solution ID.
+  , _integritySSRHeader_tile_set_id :: !Word16
+    -- ^ Unique identifier of the set this tile belongs to.
+  , _integritySSRHeader_tile_id   :: !Word16
+    -- ^ Unique identifier of this tile in the tile set.
+  , _integritySSRHeader_chain_id  :: !Word8
+    -- ^ Chain and type of flag.
+  } deriving ( Show, Read, Eq )
+
+instance Binary IntegritySSRHeader where
+  get = do
+    _integritySSRHeader_obs_time <- get
+    _integritySSRHeader_num_msgs <- getWord8
+    _integritySSRHeader_seq_num <- getWord8
+    _integritySSRHeader_ssr_sol_id <- getWord8
+    _integritySSRHeader_tile_set_id <- getWord16le
+    _integritySSRHeader_tile_id <- getWord16le
+    _integritySSRHeader_chain_id <- getWord8
+    pure IntegritySSRHeader {..}
+
+  put IntegritySSRHeader {..} = do
+    put _integritySSRHeader_obs_time
+    putWord8 _integritySSRHeader_num_msgs
+    putWord8 _integritySSRHeader_seq_num
+    putWord8 _integritySSRHeader_ssr_sol_id
+    putWord16le _integritySSRHeader_tile_set_id
+    putWord16le _integritySSRHeader_tile_id
+    putWord8 _integritySSRHeader_chain_id
+
+$(makeJSON "_integritySSRHeader_" ''IntegritySSRHeader)
+$(makeLenses ''IntegritySSRHeader)
+
 msgSsrFlagHighLevel :: Word16
 msgSsrFlagHighLevel = 0x0BB9
 
 data MsgSsrFlagHighLevel = MsgSsrFlagHighLevel
-  { _msgSsrFlagHighLevel_stub :: ![Word8]
+  { _msgSsrFlagHighLevel_obs_time                  :: !GpsTimeSec
+    -- ^ GNSS reference time of the observation used to generate the flag.
+  , _msgSsrFlagHighLevel_corr_time                 :: !GpsTimeSec
+    -- ^ GNSS reference time of the correction associated to the flag.
+  , _msgSsrFlagHighLevel_ssr_sol_id                :: !Word8
+    -- ^ SSR Solution ID.
+  , _msgSsrFlagHighLevel_tile_set_id               :: !Word16
+    -- ^ Unique identifier of the set this tile belongs to.
+  , _msgSsrFlagHighLevel_tile_id                   :: !Word16
+    -- ^ Unique identifier of this tile in the tile set.
+  , _msgSsrFlagHighLevel_chain_id                  :: !Word8
+    -- ^ Chain and type of flag.
+  , _msgSsrFlagHighLevel_use_gps_sat               :: !Word8
+    -- ^ Use GPS satellites.
+  , _msgSsrFlagHighLevel_use_gal_sat               :: !Word8
+    -- ^ Use GAL satellites.
+  , _msgSsrFlagHighLevel_use_bds_sat               :: !Word8
+    -- ^ Use BDS satellites.
+  , _msgSsrFlagHighLevel_reserved                  :: ![Word8]
+    -- ^ Reserved
+  , _msgSsrFlagHighLevel_use_tropo_grid_points     :: !Word8
+    -- ^ Use tropo grid points.
+  , _msgSsrFlagHighLevel_use_iono_grid_points      :: !Word8
+    -- ^ Use iono grid points.
+  , _msgSsrFlagHighLevel_use_iono_tile_sat_los     :: !Word8
+    -- ^ Use iono tile satellite LoS.
+  , _msgSsrFlagHighLevel_use_iono_grid_point_sat_los :: !Word8
+    -- ^ Use iono grid point satellite LoS.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagHighLevel where
   get = do
-    _msgSsrFlagHighLevel_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagHighLevel_obs_time <- get
+    _msgSsrFlagHighLevel_corr_time <- get
+    _msgSsrFlagHighLevel_ssr_sol_id <- getWord8
+    _msgSsrFlagHighLevel_tile_set_id <- getWord16le
+    _msgSsrFlagHighLevel_tile_id <- getWord16le
+    _msgSsrFlagHighLevel_chain_id <- getWord8
+    _msgSsrFlagHighLevel_use_gps_sat <- getWord8
+    _msgSsrFlagHighLevel_use_gal_sat <- getWord8
+    _msgSsrFlagHighLevel_use_bds_sat <- getWord8
+    _msgSsrFlagHighLevel_reserved <- replicateM 6 getWord8
+    _msgSsrFlagHighLevel_use_tropo_grid_points <- getWord8
+    _msgSsrFlagHighLevel_use_iono_grid_points <- getWord8
+    _msgSsrFlagHighLevel_use_iono_tile_sat_los <- getWord8
+    _msgSsrFlagHighLevel_use_iono_grid_point_sat_los <- getWord8
     pure MsgSsrFlagHighLevel {..}
 
   put MsgSsrFlagHighLevel {..} = do
-    mapM_ putWord8 _msgSsrFlagHighLevel_stub
+    put _msgSsrFlagHighLevel_obs_time
+    put _msgSsrFlagHighLevel_corr_time
+    putWord8 _msgSsrFlagHighLevel_ssr_sol_id
+    putWord16le _msgSsrFlagHighLevel_tile_set_id
+    putWord16le _msgSsrFlagHighLevel_tile_id
+    putWord8 _msgSsrFlagHighLevel_chain_id
+    putWord8 _msgSsrFlagHighLevel_use_gps_sat
+    putWord8 _msgSsrFlagHighLevel_use_gal_sat
+    putWord8 _msgSsrFlagHighLevel_use_bds_sat
+    mapM_ putWord8 _msgSsrFlagHighLevel_reserved
+    putWord8 _msgSsrFlagHighLevel_use_tropo_grid_points
+    putWord8 _msgSsrFlagHighLevel_use_iono_grid_points
+    putWord8 _msgSsrFlagHighLevel_use_iono_tile_sat_los
+    putWord8 _msgSsrFlagHighLevel_use_iono_grid_point_sat_los
 
 $(makeSBP 'msgSsrFlagHighLevel ''MsgSsrFlagHighLevel)
 $(makeJSON "_msgSsrFlagHighLevel_" ''MsgSsrFlagHighLevel)
@@ -59,16 +152,45 @@
 msgSsrFlagSatellites = 0x0BBD
 
 data MsgSsrFlagSatellites = MsgSsrFlagSatellites
-  { _msgSsrFlagSatellites_stub :: ![Word8]
+  { _msgSsrFlagSatellites_obs_time    :: !GpsTimeSec
+    -- ^ GNSS reference time of the observation used to generate the flag.
+  , _msgSsrFlagSatellites_num_msgs    :: !Word8
+    -- ^ Number of messages in the dataset
+  , _msgSsrFlagSatellites_seq_num     :: !Word8
+    -- ^ Position of this message in the dataset
+  , _msgSsrFlagSatellites_ssr_sol_id  :: !Word8
+    -- ^ SSR Solution ID.
+  , _msgSsrFlagSatellites_chain_id    :: !Word8
+    -- ^ Chain and type of flag.
+  , _msgSsrFlagSatellites_const_id    :: !Word8
+    -- ^ Constellation ID.
+  , _msgSsrFlagSatellites_n_faulty_sats :: !Word8
+    -- ^ Number of faulty satellites.
+  , _msgSsrFlagSatellites_faulty_sats :: ![Word8]
+    -- ^ List of faulty satellites.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagSatellites where
   get = do
-    _msgSsrFlagSatellites_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagSatellites_obs_time <- get
+    _msgSsrFlagSatellites_num_msgs <- getWord8
+    _msgSsrFlagSatellites_seq_num <- getWord8
+    _msgSsrFlagSatellites_ssr_sol_id <- getWord8
+    _msgSsrFlagSatellites_chain_id <- getWord8
+    _msgSsrFlagSatellites_const_id <- getWord8
+    _msgSsrFlagSatellites_n_faulty_sats <- getWord8
+    _msgSsrFlagSatellites_faulty_sats <- whileM (not <$> isEmpty) getWord8
     pure MsgSsrFlagSatellites {..}
 
   put MsgSsrFlagSatellites {..} = do
-    mapM_ putWord8 _msgSsrFlagSatellites_stub
+    put _msgSsrFlagSatellites_obs_time
+    putWord8 _msgSsrFlagSatellites_num_msgs
+    putWord8 _msgSsrFlagSatellites_seq_num
+    putWord8 _msgSsrFlagSatellites_ssr_sol_id
+    putWord8 _msgSsrFlagSatellites_chain_id
+    putWord8 _msgSsrFlagSatellites_const_id
+    putWord8 _msgSsrFlagSatellites_n_faulty_sats
+    mapM_ putWord8 _msgSsrFlagSatellites_faulty_sats
 
 $(makeSBP 'msgSsrFlagSatellites ''MsgSsrFlagSatellites)
 $(makeJSON "_msgSsrFlagSatellites_" ''MsgSsrFlagSatellites)
@@ -78,16 +200,25 @@
 msgSsrFlagTropoGridPoints = 0x0BC3
 
 data MsgSsrFlagTropoGridPoints = MsgSsrFlagTropoGridPoints
-  { _msgSsrFlagTropoGridPoints_stub :: ![Word8]
+  { _msgSsrFlagTropoGridPoints_header        :: !IntegritySSRHeader
+    -- ^ Header of an integrity message.
+  , _msgSsrFlagTropoGridPoints_n_faulty_points :: !Word8
+    -- ^ Number of faulty grid points.
+  , _msgSsrFlagTropoGridPoints_faulty_points :: ![Word16]
+    -- ^ List of faulty grid points.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagTropoGridPoints where
   get = do
-    _msgSsrFlagTropoGridPoints_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagTropoGridPoints_header <- get
+    _msgSsrFlagTropoGridPoints_n_faulty_points <- getWord8
+    _msgSsrFlagTropoGridPoints_faulty_points <- whileM (not <$> isEmpty) getWord16le
     pure MsgSsrFlagTropoGridPoints {..}
 
   put MsgSsrFlagTropoGridPoints {..} = do
-    mapM_ putWord8 _msgSsrFlagTropoGridPoints_stub
+    put _msgSsrFlagTropoGridPoints_header
+    putWord8 _msgSsrFlagTropoGridPoints_n_faulty_points
+    mapM_ putWord16le _msgSsrFlagTropoGridPoints_faulty_points
 
 $(makeSBP 'msgSsrFlagTropoGridPoints ''MsgSsrFlagTropoGridPoints)
 $(makeJSON "_msgSsrFlagTropoGridPoints_" ''MsgSsrFlagTropoGridPoints)
@@ -97,16 +228,25 @@
 msgSsrFlagIonoGridPoints = 0x0BC7
 
 data MsgSsrFlagIonoGridPoints = MsgSsrFlagIonoGridPoints
-  { _msgSsrFlagIonoGridPoints_stub :: ![Word8]
+  { _msgSsrFlagIonoGridPoints_header        :: !IntegritySSRHeader
+    -- ^ Header of an integrity message.
+  , _msgSsrFlagIonoGridPoints_n_faulty_points :: !Word8
+    -- ^ Number of faulty grid points.
+  , _msgSsrFlagIonoGridPoints_faulty_points :: ![Word16]
+    -- ^ List of faulty grid points.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagIonoGridPoints where
   get = do
-    _msgSsrFlagIonoGridPoints_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagIonoGridPoints_header <- get
+    _msgSsrFlagIonoGridPoints_n_faulty_points <- getWord8
+    _msgSsrFlagIonoGridPoints_faulty_points <- whileM (not <$> isEmpty) getWord16le
     pure MsgSsrFlagIonoGridPoints {..}
 
   put MsgSsrFlagIonoGridPoints {..} = do
-    mapM_ putWord8 _msgSsrFlagIonoGridPoints_stub
+    put _msgSsrFlagIonoGridPoints_header
+    putWord8 _msgSsrFlagIonoGridPoints_n_faulty_points
+    mapM_ putWord16le _msgSsrFlagIonoGridPoints_faulty_points
 
 $(makeSBP 'msgSsrFlagIonoGridPoints ''MsgSsrFlagIonoGridPoints)
 $(makeJSON "_msgSsrFlagIonoGridPoints_" ''MsgSsrFlagIonoGridPoints)
@@ -116,16 +256,25 @@
 msgSsrFlagIonoTileSatLos = 0x0BCD
 
 data MsgSsrFlagIonoTileSatLos = MsgSsrFlagIonoTileSatLos
-  { _msgSsrFlagIonoTileSatLos_stub :: ![Word8]
+  { _msgSsrFlagIonoTileSatLos_header     :: !IntegritySSRHeader
+    -- ^ Header of an integrity message.
+  , _msgSsrFlagIonoTileSatLos_n_faulty_los :: !Word8
+    -- ^ Number of faulty LOS.
+  , _msgSsrFlagIonoTileSatLos_faulty_los :: ![SvId]
+    -- ^ List of faulty LOS
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagIonoTileSatLos where
   get = do
-    _msgSsrFlagIonoTileSatLos_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagIonoTileSatLos_header <- get
+    _msgSsrFlagIonoTileSatLos_n_faulty_los <- getWord8
+    _msgSsrFlagIonoTileSatLos_faulty_los <- whileM (not <$> isEmpty) get
     pure MsgSsrFlagIonoTileSatLos {..}
 
   put MsgSsrFlagIonoTileSatLos {..} = do
-    mapM_ putWord8 _msgSsrFlagIonoTileSatLos_stub
+    put _msgSsrFlagIonoTileSatLos_header
+    putWord8 _msgSsrFlagIonoTileSatLos_n_faulty_los
+    mapM_ put _msgSsrFlagIonoTileSatLos_faulty_los
 
 $(makeSBP 'msgSsrFlagIonoTileSatLos ''MsgSsrFlagIonoTileSatLos)
 $(makeJSON "_msgSsrFlagIonoTileSatLos_" ''MsgSsrFlagIonoTileSatLos)
@@ -135,16 +284,29 @@
 msgSsrFlagIonoGridPointSatLos = 0x0BD1
 
 data MsgSsrFlagIonoGridPointSatLos = MsgSsrFlagIonoGridPointSatLos
-  { _msgSsrFlagIonoGridPointSatLos_stub :: ![Word8]
+  { _msgSsrFlagIonoGridPointSatLos_header      :: !IntegritySSRHeader
+    -- ^ Header of an integrity message.
+  , _msgSsrFlagIonoGridPointSatLos_grid_point_id :: !Word16
+    -- ^ Index of the grid point.
+  , _msgSsrFlagIonoGridPointSatLos_n_faulty_los :: !Word8
+    -- ^ Number of faulty LOS.
+  , _msgSsrFlagIonoGridPointSatLos_faulty_los  :: ![SvId]
+    -- ^ List of faulty LOS
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrFlagIonoGridPointSatLos where
   get = do
-    _msgSsrFlagIonoGridPointSatLos_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrFlagIonoGridPointSatLos_header <- get
+    _msgSsrFlagIonoGridPointSatLos_grid_point_id <- getWord16le
+    _msgSsrFlagIonoGridPointSatLos_n_faulty_los <- getWord8
+    _msgSsrFlagIonoGridPointSatLos_faulty_los <- whileM (not <$> isEmpty) get
     pure MsgSsrFlagIonoGridPointSatLos {..}
 
   put MsgSsrFlagIonoGridPointSatLos {..} = do
-    mapM_ putWord8 _msgSsrFlagIonoGridPointSatLos_stub
+    put _msgSsrFlagIonoGridPointSatLos_header
+    putWord16le _msgSsrFlagIonoGridPointSatLos_grid_point_id
+    putWord8 _msgSsrFlagIonoGridPointSatLos_n_faulty_los
+    mapM_ put _msgSsrFlagIonoGridPointSatLos_faulty_los
 
 $(makeSBP 'msgSsrFlagIonoGridPointSatLos ''MsgSsrFlagIonoGridPointSatLos)
 $(makeJSON "_msgSsrFlagIonoGridPointSatLos_" ''MsgSsrFlagIonoGridPointSatLos)
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
@@ -2312,16 +2312,52 @@
 -- Emulates the GPS CNAV message, reserving bytes for future broadcast of the
 -- drift model parameters.
 data MsgUtcLeapSecond = MsgUtcLeapSecond
-  { _msgUtcLeapSecond_stub :: ![Word8]
+  { _msgUtcLeapSecond_bias_coeff     :: !Int16
+    -- ^ Reserved. Bias coefficient of GPS time scale with respect to UTC drift
+    -- model.
+  , _msgUtcLeapSecond_drift_coeff    :: !Int16
+    -- ^ Reserved. Drift coefficient of GPS time scale with respect to UTC drift
+    -- model.
+  , _msgUtcLeapSecond_drift_rate_coeff :: !Int8
+    -- ^ Reserved. Drift rate correction coefficient of GPS time scale with
+    -- respect to UTC drift model.
+  , _msgUtcLeapSecond_count_before   :: !Int8
+    -- ^ Leap second count before insertion.
+  , _msgUtcLeapSecond_tow_s          :: !Word16
+    -- ^ Reserved. Drift model reference week second.
+  , _msgUtcLeapSecond_wn             :: !Word16
+    -- ^ Reserved. Drift model reference week number.
+  , _msgUtcLeapSecond_ref_wn         :: !Word16
+    -- ^ Leap second reference week number.
+  , _msgUtcLeapSecond_ref_dn         :: !Word8
+    -- ^ Leap second reference day number.
+  , _msgUtcLeapSecond_count_after    :: !Int8
+    -- ^ Leap second count after insertion.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgUtcLeapSecond where
   get = do
-    _msgUtcLeapSecond_stub <- whileM (not <$> isEmpty) getWord8
+    _msgUtcLeapSecond_bias_coeff <- (fromIntegral <$> getWord16le)
+    _msgUtcLeapSecond_drift_coeff <- (fromIntegral <$> getWord16le)
+    _msgUtcLeapSecond_drift_rate_coeff <- (fromIntegral <$> getWord8)
+    _msgUtcLeapSecond_count_before <- (fromIntegral <$> getWord8)
+    _msgUtcLeapSecond_tow_s <- getWord16le
+    _msgUtcLeapSecond_wn <- getWord16le
+    _msgUtcLeapSecond_ref_wn <- getWord16le
+    _msgUtcLeapSecond_ref_dn <- getWord8
+    _msgUtcLeapSecond_count_after <- (fromIntegral <$> getWord8)
     pure MsgUtcLeapSecond {..}
 
   put MsgUtcLeapSecond {..} = do
-    mapM_ putWord8 _msgUtcLeapSecond_stub
+    (putWord16le . fromIntegral) _msgUtcLeapSecond_bias_coeff
+    (putWord16le . fromIntegral) _msgUtcLeapSecond_drift_coeff
+    (putWord8 . fromIntegral) _msgUtcLeapSecond_drift_rate_coeff
+    (putWord8 . fromIntegral) _msgUtcLeapSecond_count_before
+    putWord16le _msgUtcLeapSecond_tow_s
+    putWord16le _msgUtcLeapSecond_wn
+    putWord16le _msgUtcLeapSecond_ref_wn
+    putWord8 _msgUtcLeapSecond_ref_dn
+    (putWord8 . fromIntegral) _msgUtcLeapSecond_count_after
 
 $(makeSBP 'msgUtcLeapSecond ''MsgUtcLeapSecond)
 $(makeJSON "_msgUtcLeapSecond_" ''MsgUtcLeapSecond)
@@ -2331,16 +2367,94 @@
 msgReferenceFrameParam = 0x0244
 
 data MsgReferenceFrameParam = MsgReferenceFrameParam
-  { _msgReferenceFrameParam_stub :: ![Word8]
+  { _msgReferenceFrameParam_ssr_iod    :: !Word8
+    -- ^ SSR IOD parameter.
+  , _msgReferenceFrameParam_sn         :: !Text
+    -- ^ Name of source coordinate-system using the EPSG identification code.
+  , _msgReferenceFrameParam_tn         :: !Text
+    -- ^ Name of target coordinate-system using the EPSG identification code.
+  , _msgReferenceFrameParam_sin        :: !Word8
+    -- ^ System Identification Number.
+  , _msgReferenceFrameParam_utn        :: !Word16
+    -- ^ Utilized Transformation Message.
+  , _msgReferenceFrameParam_re_t0      :: !Word16
+    -- ^ Reference Epoch t0 for transformation parameter set given as Modified
+    -- Julian Day (MJD) Number minus 44244 days.
+  , _msgReferenceFrameParam_delta_X0   :: !Int32
+    -- ^ Translation in X for Reference Epoch t0.
+  , _msgReferenceFrameParam_delta_Y0   :: !Int32
+    -- ^ Translation in Y for Reference Epoch t0.
+  , _msgReferenceFrameParam_delta_Z0   :: !Int32
+    -- ^ Translation in Z for Reference Epoch t0.
+  , _msgReferenceFrameParam_theta_01   :: !Int32
+    -- ^ Rotation around the X-axis for Reference Epoch t0.
+  , _msgReferenceFrameParam_theta_02   :: !Int32
+    -- ^ Rotation around the Y-axis for Reference Epoch t0.
+  , _msgReferenceFrameParam_theta_03   :: !Int32
+    -- ^ Rotation around the Z-axis for Reference Epoch t0.
+  , _msgReferenceFrameParam_scale      :: !Int32
+    -- ^ Scale correction for Reference Epoch t0.
+  , _msgReferenceFrameParam_dot_delta_X0 :: !Int32
+    -- ^ Rate of change of translation in X.
+  , _msgReferenceFrameParam_dot_delta_Y0 :: !Int32
+    -- ^ Rate of change of translation in Y.
+  , _msgReferenceFrameParam_dot_delta_Z0 :: !Int32
+    -- ^ Rate of change of translation in Z.
+  , _msgReferenceFrameParam_dot_theta_01 :: !Int32
+    -- ^ Rate of change of rotation around the X-axis.
+  , _msgReferenceFrameParam_dot_theta_02 :: !Int32
+    -- ^ Rate of change of rotation around the Y-axis.
+  , _msgReferenceFrameParam_dot_theta_03 :: !Int32
+    -- ^ Rate of change of rotation around the Z-axis.
+  , _msgReferenceFrameParam_dot_scale  :: !Int16
+    -- ^ Rate of change of scale correction.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgReferenceFrameParam where
   get = do
-    _msgReferenceFrameParam_stub <- whileM (not <$> isEmpty) getWord8
+    _msgReferenceFrameParam_ssr_iod <- getWord8
+    _msgReferenceFrameParam_sn <- decodeUtf8 <$> getByteString 32
+    _msgReferenceFrameParam_tn <- decodeUtf8 <$> getByteString 32
+    _msgReferenceFrameParam_sin <- getWord8
+    _msgReferenceFrameParam_utn <- getWord16le
+    _msgReferenceFrameParam_re_t0 <- getWord16le
+    _msgReferenceFrameParam_delta_X0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_delta_Y0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_delta_Z0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_theta_01 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_theta_02 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_theta_03 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_scale <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_delta_X0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_delta_Y0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_delta_Z0 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_theta_01 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_theta_02 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_theta_03 <- (fromIntegral <$> getWord32le)
+    _msgReferenceFrameParam_dot_scale <- (fromIntegral <$> getWord16le)
     pure MsgReferenceFrameParam {..}
 
   put MsgReferenceFrameParam {..} = do
-    mapM_ putWord8 _msgReferenceFrameParam_stub
+    putWord8 _msgReferenceFrameParam_ssr_iod
+    putByteString $ encodeUtf8 _msgReferenceFrameParam_sn
+    putByteString $ encodeUtf8 _msgReferenceFrameParam_tn
+    putWord8 _msgReferenceFrameParam_sin
+    putWord16le _msgReferenceFrameParam_utn
+    putWord16le _msgReferenceFrameParam_re_t0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_X0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_Y0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_delta_Z0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_01
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_02
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_theta_03
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_scale
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_X0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_Y0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_delta_Z0
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_01
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_02
+    (putWord32le . fromIntegral) _msgReferenceFrameParam_dot_theta_03
+    (putWord16le . fromIntegral) _msgReferenceFrameParam_dot_scale
 
 $(makeSBP 'msgReferenceFrameParam ''MsgReferenceFrameParam)
 $(makeJSON "_msgReferenceFrameParam_" ''MsgReferenceFrameParam)
diff --git a/src/SwiftNav/SBP/Ssr.hs b/src/SwiftNav/SBP/Ssr.hs
--- a/src/SwiftNav/SBP/Ssr.hs
+++ b/src/SwiftNav/SBP/Ssr.hs
@@ -204,7 +204,8 @@
     -- ^ Quality of the STEC data. Encoded following RTCM DF389 specification
     -- but in units of TECU instead of m.
   , _sTECSatElement_stec_coeff           :: ![Int16]
-    -- ^ Coefficients of the STEC polynomial in the order of C00, C01, C10, C11
+    -- ^ Coefficients of the STEC polynomial in the order of C00, C01, C10, C11.
+    -- C00 = 0.05 TECU, C01/C10 = 0.02 TECU/deg, C11 0.02 TECU/deg^2
   } deriving ( Show, Read, Eq )
 
 instance Binary STECSatElement where
@@ -251,11 +252,12 @@
 -- point.
 data TroposphericDelayCorrection = TroposphericDelayCorrection
   { _troposphericDelayCorrection_hydro :: !Int16
-    -- ^ Hydrostatic vertical delay
+    -- ^ Hydrostatic vertical delay. Add 2.3 m to get actual value.
   , _troposphericDelayCorrection_wet  :: !Int8
-    -- ^ Wet vertical delay
+    -- ^ Wet vertical delay. Add 0.252 m to get actual value.
   , _troposphericDelayCorrection_stddev :: !Word8
-    -- ^ stddev
+    -- ^ Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev
+    -- <= (3^class * (1 + value/16) - 1) mm
   } deriving ( Show, Read, Eq )
 
 instance Binary TroposphericDelayCorrection where
@@ -306,7 +308,8 @@
   , _sTECResidual_residual :: !Int16
     -- ^ STEC residual
   , _sTECResidual_stddev :: !Word8
-    -- ^ stddev
+    -- ^ Modified DF389 scale. Class is upper 3 bits, value is lower 5. stddev
+    -- <= (3^class * (1 + value/16) - 1) * 10 TECU
   } deriving ( Show, Read, Eq )
 
 instance Binary STECResidual where
@@ -539,20 +542,73 @@
 $(makeJSON "_msgSsrStecCorrectionDep_" ''MsgSsrStecCorrectionDep)
 $(makeLenses ''MsgSsrStecCorrectionDep)
 
+data BoundsHeader = BoundsHeader
+  { _boundsHeader_time          :: !GpsTimeSec
+    -- ^ GNSS reference time of the bound
+  , _boundsHeader_num_msgs      :: !Word8
+    -- ^ Number of messages in the dataset
+  , _boundsHeader_seq_num       :: !Word8
+    -- ^ Position of this message in the dataset
+  , _boundsHeader_update_interval :: !Word8
+    -- ^ Update interval between consecutive bounds. Similar to RTCM DF391.
+  , _boundsHeader_sol_id        :: !Word8
+    -- ^ SSR Solution ID.
+  } deriving ( Show, Read, Eq )
+
+instance Binary BoundsHeader where
+  get = do
+    _boundsHeader_time <- get
+    _boundsHeader_num_msgs <- getWord8
+    _boundsHeader_seq_num <- getWord8
+    _boundsHeader_update_interval <- getWord8
+    _boundsHeader_sol_id <- getWord8
+    pure BoundsHeader {..}
+
+  put BoundsHeader {..} = do
+    put _boundsHeader_time
+    putWord8 _boundsHeader_num_msgs
+    putWord8 _boundsHeader_seq_num
+    putWord8 _boundsHeader_update_interval
+    putWord8 _boundsHeader_sol_id
+
+$(makeJSON "_boundsHeader_" ''BoundsHeader)
+$(makeLenses ''BoundsHeader)
+
 msgSsrStecCorrection :: Word16
 msgSsrStecCorrection = 0x05FD
 
 data MsgSsrStecCorrection = MsgSsrStecCorrection
-  { _msgSsrStecCorrection_stub :: ![Word8]
+  { _msgSsrStecCorrection_header      :: !BoundsHeader
+    -- ^ Header of a STEC correction with bounds message.
+  , _msgSsrStecCorrection_ssr_iod_atmo :: !Word8
+    -- ^ IOD of the SSR atmospheric correction
+  , _msgSsrStecCorrection_tile_set_id :: !Word16
+    -- ^ Tile set ID
+  , _msgSsrStecCorrection_tile_id     :: !Word16
+    -- ^ Tile ID
+  , _msgSsrStecCorrection_n_sats      :: !Word8
+    -- ^ Number of satellites.
+  , _msgSsrStecCorrection_stec_sat_list :: ![STECSatElement]
+    -- ^ Array of STEC polynomial coefficients for each space vehicle.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrStecCorrection where
   get = do
-    _msgSsrStecCorrection_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrStecCorrection_header <- get
+    _msgSsrStecCorrection_ssr_iod_atmo <- getWord8
+    _msgSsrStecCorrection_tile_set_id <- getWord16le
+    _msgSsrStecCorrection_tile_id <- getWord16le
+    _msgSsrStecCorrection_n_sats <- getWord8
+    _msgSsrStecCorrection_stec_sat_list <- whileM (not <$> isEmpty) get
     pure MsgSsrStecCorrection {..}
 
   put MsgSsrStecCorrection {..} = do
-    mapM_ putWord8 _msgSsrStecCorrection_stub
+    put _msgSsrStecCorrection_header
+    putWord8 _msgSsrStecCorrection_ssr_iod_atmo
+    putWord16le _msgSsrStecCorrection_tile_set_id
+    putWord16le _msgSsrStecCorrection_tile_id
+    putWord8 _msgSsrStecCorrection_n_sats
+    mapM_ put _msgSsrStecCorrection_stec_sat_list
 
 $(makeSBP 'msgSsrStecCorrection ''MsgSsrStecCorrection)
 $(makeJSON "_msgSsrStecCorrection_" ''MsgSsrStecCorrection)
@@ -595,20 +651,109 @@
 $(makeJSON "_msgSsrGriddedCorrection_" ''MsgSsrGriddedCorrection)
 $(makeLenses ''MsgSsrGriddedCorrection)
 
+-- | STECSatElementIntegrity.
+--
+-- STEC polynomial and bounds for the given satellite.
+data STECSatElementIntegrity = STECSatElementIntegrity
+  { _sTECSatElementIntegrity_stec_residual    :: !STECResidual
+    -- ^ STEC residuals (mean, stddev)
+  , _sTECSatElementIntegrity_stec_bound_mu    :: !Word8
+    -- ^ Error Bound Mean. See Note 1.
+  , _sTECSatElementIntegrity_stec_bound_sig   :: !Word8
+    -- ^ Error Bound StDev. See Note 1.
+  , _sTECSatElementIntegrity_stec_bound_mu_dot :: !Word8
+    -- ^ Error Bound Mean First derivative.
+  , _sTECSatElementIntegrity_stec_bound_sig_dot :: !Word8
+    -- ^ Error Bound StDev First derivative.
+  } deriving ( Show, Read, Eq )
+
+instance Binary STECSatElementIntegrity where
+  get = do
+    _sTECSatElementIntegrity_stec_residual <- get
+    _sTECSatElementIntegrity_stec_bound_mu <- getWord8
+    _sTECSatElementIntegrity_stec_bound_sig <- getWord8
+    _sTECSatElementIntegrity_stec_bound_mu_dot <- getWord8
+    _sTECSatElementIntegrity_stec_bound_sig_dot <- getWord8
+    pure STECSatElementIntegrity {..}
+
+  put STECSatElementIntegrity {..} = do
+    put _sTECSatElementIntegrity_stec_residual
+    putWord8 _sTECSatElementIntegrity_stec_bound_mu
+    putWord8 _sTECSatElementIntegrity_stec_bound_sig
+    putWord8 _sTECSatElementIntegrity_stec_bound_mu_dot
+    putWord8 _sTECSatElementIntegrity_stec_bound_sig_dot
+
+$(makeJSON "_sTECSatElementIntegrity_" ''STECSatElementIntegrity)
+$(makeLenses ''STECSatElementIntegrity)
+
 msgSsrGriddedCorrectionBounds :: Word16
 msgSsrGriddedCorrectionBounds = 0x05FE
 
+-- | SBP class for message MSG_SSR_GRIDDED_CORRECTION_BOUNDS (0x05FE).
+--
+-- Note 1: Range: 0-17.5 m. i<= 200, mean = 0.01i; 200<i<=230,
+-- mean=2+0.1(i-200); i>230, mean=5+0.5(i-230).
 data MsgSsrGriddedCorrectionBounds = MsgSsrGriddedCorrectionBounds
-  { _msgSsrGriddedCorrectionBounds_stub :: ![Word8]
+  { _msgSsrGriddedCorrectionBounds_header                :: !BoundsHeader
+    -- ^ Header of a bounds message.
+  , _msgSsrGriddedCorrectionBounds_ssr_iod_atmo          :: !Word8
+    -- ^ IOD of the correction.
+  , _msgSsrGriddedCorrectionBounds_tile_set_id           :: !Word16
+    -- ^ Set this tile belongs to.
+  , _msgSsrGriddedCorrectionBounds_tile_id               :: !Word16
+    -- ^ Unique identifier of this tile in the tile set.
+  , _msgSsrGriddedCorrectionBounds_tropo_qi              :: !Word8
+    -- ^ Tropo Quality Indicator. Similar to RTCM DF389.
+  , _msgSsrGriddedCorrectionBounds_grid_point_id         :: !Word16
+    -- ^ Index of the Grid Point.
+  , _msgSsrGriddedCorrectionBounds_tropo_delay_correction :: !TroposphericDelayCorrection
+    -- ^ Tropospheric delay at grid point.
+  , _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_mu :: !Word8
+    -- ^ Vertical Hydrostatic Error Bound Mean.
+  , _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig :: !Word8
+    -- ^ Vertical Hydrostatic Error Bound StDev.
+  , _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu  :: !Word8
+    -- ^ Vertical Wet Error Bound Mean.
+  , _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig :: !Word8
+    -- ^ Vertical Wet Error Bound StDev.
+  , _msgSsrGriddedCorrectionBounds_n_sats                :: !Word8
+    -- ^ Number of satellites.
+  , _msgSsrGriddedCorrectionBounds_stec_sat_list         :: ![STECSatElementIntegrity]
+    -- ^ Array of STEC polynomial coefficients and its bounds for each space
+    -- vehicle.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrGriddedCorrectionBounds where
   get = do
-    _msgSsrGriddedCorrectionBounds_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrGriddedCorrectionBounds_header <- get
+    _msgSsrGriddedCorrectionBounds_ssr_iod_atmo <- getWord8
+    _msgSsrGriddedCorrectionBounds_tile_set_id <- getWord16le
+    _msgSsrGriddedCorrectionBounds_tile_id <- getWord16le
+    _msgSsrGriddedCorrectionBounds_tropo_qi <- getWord8
+    _msgSsrGriddedCorrectionBounds_grid_point_id <- getWord16le
+    _msgSsrGriddedCorrectionBounds_tropo_delay_correction <- get
+    _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_mu <- getWord8
+    _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig <- getWord8
+    _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu <- getWord8
+    _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig <- getWord8
+    _msgSsrGriddedCorrectionBounds_n_sats <- getWord8
+    _msgSsrGriddedCorrectionBounds_stec_sat_list <- whileM (not <$> isEmpty) get
     pure MsgSsrGriddedCorrectionBounds {..}
 
   put MsgSsrGriddedCorrectionBounds {..} = do
-    mapM_ putWord8 _msgSsrGriddedCorrectionBounds_stub
+    put _msgSsrGriddedCorrectionBounds_header
+    putWord8 _msgSsrGriddedCorrectionBounds_ssr_iod_atmo
+    putWord16le _msgSsrGriddedCorrectionBounds_tile_set_id
+    putWord16le _msgSsrGriddedCorrectionBounds_tile_id
+    putWord8 _msgSsrGriddedCorrectionBounds_tropo_qi
+    putWord16le _msgSsrGriddedCorrectionBounds_grid_point_id
+    put _msgSsrGriddedCorrectionBounds_tropo_delay_correction
+    putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_mu
+    putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_hydro_bound_sig
+    putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_mu
+    putWord8 _msgSsrGriddedCorrectionBounds_tropo_v_wet_bound_sig
+    putWord8 _msgSsrGriddedCorrectionBounds_n_sats
+    mapM_ put _msgSsrGriddedCorrectionBounds_stec_sat_list
 
 $(makeSBP 'msgSsrGriddedCorrectionBounds ''MsgSsrGriddedCorrectionBounds)
 $(makeJSON "_msgSsrGriddedCorrectionBounds_" ''MsgSsrGriddedCorrectionBounds)
@@ -725,16 +870,90 @@
 -- element GNSS-SSR-CorrectionPoints. SBP only supports gridded arrays of
 -- correction points, not lists of points.
 data MsgSsrTileDefinition = MsgSsrTileDefinition
-  { _msgSsrTileDefinition_stub :: ![Word8]
+  { _msgSsrTileDefinition_ssr_sol_id  :: !Word8
+    -- ^ SSR Solution ID.
+  , _msgSsrTileDefinition_tile_set_id :: !Word16
+    -- ^ Unique identifier of the tile set this tile belongs to.
+  , _msgSsrTileDefinition_tile_id     :: !Word16
+    -- ^ Unique identifier of this tile in the tile set.
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field correctionPointSetID.
+  , _msgSsrTileDefinition_corner_nw_lat :: !Int16
+    -- ^ North-West corner correction point latitude.
+    --
+    -- The relation between the latitude X in the range [-90, 90] and the
+    -- coded number N is:
+    --
+    -- N = floor((X / 90) * 2^14)
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLatitude.
+  , _msgSsrTileDefinition_corner_nw_lon :: !Int16
+    -- ^ North-West corner correction point longitude.
+    --
+    -- The relation between the longitude X in the range [-180, 180] and the
+    -- coded number N is:
+    --
+    -- N = floor((X / 180) * 2^15)
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field referencePointLongitude.
+  , _msgSsrTileDefinition_spacing_lat :: !Word16
+    -- ^ Spacing of the correction points in the latitude direction.
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLatitude.
+  , _msgSsrTileDefinition_spacing_lon :: !Word16
+    -- ^ Spacing of the correction points in the longitude direction.
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field stepOfLongitude.
+  , _msgSsrTileDefinition_rows        :: !Word16
+    -- ^ Number of steps in the latitude direction.
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLatitude.
+  , _msgSsrTileDefinition_cols        :: !Word16
+    -- ^ Number of steps in the longitude direction.
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field numberOfStepsLongitude.
+  , _msgSsrTileDefinition_bitmask     :: !Word64
+    -- ^ Specifies the availability of correction data at the correction points
+    -- in the array.
+    --
+    -- If a specific bit is enabled (set to 1), the correction is not
+    -- available. Only the first rows * cols bits are used, the remainder are
+    -- set to 0. If there are more then 64 correction points the remaining
+    -- corrections are always available.
+    --
+    -- Starting with the northwest corner of the array (top left on a north
+    -- oriented map) the correction points are enumerated with row precedence
+    -- - first row west to east, second row west to east, until last row west
+    -- to east - ending with the southeast corner of the array.
+    --
+    -- See GNSS-SSR-ArrayOfCorrectionPoints field bitmaskOfGrids but note the
+    -- definition of the bits is inverted.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrTileDefinition where
   get = do
-    _msgSsrTileDefinition_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrTileDefinition_ssr_sol_id <- getWord8
+    _msgSsrTileDefinition_tile_set_id <- getWord16le
+    _msgSsrTileDefinition_tile_id <- getWord16le
+    _msgSsrTileDefinition_corner_nw_lat <- (fromIntegral <$> getWord16le)
+    _msgSsrTileDefinition_corner_nw_lon <- (fromIntegral <$> getWord16le)
+    _msgSsrTileDefinition_spacing_lat <- getWord16le
+    _msgSsrTileDefinition_spacing_lon <- getWord16le
+    _msgSsrTileDefinition_rows <- getWord16le
+    _msgSsrTileDefinition_cols <- getWord16le
+    _msgSsrTileDefinition_bitmask <- getWord64le
     pure MsgSsrTileDefinition {..}
 
   put MsgSsrTileDefinition {..} = do
-    mapM_ putWord8 _msgSsrTileDefinition_stub
+    putWord8 _msgSsrTileDefinition_ssr_sol_id
+    putWord16le _msgSsrTileDefinition_tile_set_id
+    putWord16le _msgSsrTileDefinition_tile_id
+    (putWord16le . fromIntegral) _msgSsrTileDefinition_corner_nw_lat
+    (putWord16le . fromIntegral) _msgSsrTileDefinition_corner_nw_lon
+    putWord16le _msgSsrTileDefinition_spacing_lat
+    putWord16le _msgSsrTileDefinition_spacing_lon
+    putWord16le _msgSsrTileDefinition_rows
+    putWord16le _msgSsrTileDefinition_cols
+    putWord64le _msgSsrTileDefinition_bitmask
 
 $(makeSBP 'msgSsrTileDefinition ''MsgSsrTileDefinition)
 $(makeJSON "_msgSsrTileDefinition_" ''MsgSsrTileDefinition)
@@ -1110,58 +1329,258 @@
 $(makeJSON "_msgSsrGridDefinitionDepA_" ''MsgSsrGridDefinitionDepA)
 $(makeLenses ''MsgSsrGridDefinitionDepA)
 
+-- | OrbitClockBound.
+--
+-- Orbit and clock bound.
+data OrbitClockBound = OrbitClockBound
+  { _orbitClockBound_sat_id             :: !Word8
+    -- ^ Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or
+    -- DF488 (BDS) depending on the constellation.
+  , _orbitClockBound_orb_radial_bound_mu :: !Word8
+    -- ^ Mean Radial. See Note 1.
+  , _orbitClockBound_orb_along_bound_mu :: !Word8
+    -- ^ Mean Along-Track. See Note 1.
+  , _orbitClockBound_orb_cross_bound_mu :: !Word8
+    -- ^ Mean Cross-Track. See Note 1.
+  , _orbitClockBound_orb_radial_bound_sig :: !Word8
+    -- ^ Standard Deviation Radial. See Note 2.
+  , _orbitClockBound_orb_along_bound_sig :: !Word8
+    -- ^ Standard Deviation Along-Track. See Note 2.
+  , _orbitClockBound_orb_cross_bound_sig :: !Word8
+    -- ^ Standard Deviation Cross-Track. See Note 2.
+  , _orbitClockBound_clock_bound_mu     :: !Word8
+    -- ^ Clock Bound Mean. See Note 1.
+  , _orbitClockBound_clock_bound_sig    :: !Word8
+    -- ^ Clock Bound Standard Deviation. See Note 2.
+  } deriving ( Show, Read, Eq )
+
+instance Binary OrbitClockBound where
+  get = do
+    _orbitClockBound_sat_id <- getWord8
+    _orbitClockBound_orb_radial_bound_mu <- getWord8
+    _orbitClockBound_orb_along_bound_mu <- getWord8
+    _orbitClockBound_orb_cross_bound_mu <- getWord8
+    _orbitClockBound_orb_radial_bound_sig <- getWord8
+    _orbitClockBound_orb_along_bound_sig <- getWord8
+    _orbitClockBound_orb_cross_bound_sig <- getWord8
+    _orbitClockBound_clock_bound_mu <- getWord8
+    _orbitClockBound_clock_bound_sig <- getWord8
+    pure OrbitClockBound {..}
+
+  put OrbitClockBound {..} = do
+    putWord8 _orbitClockBound_sat_id
+    putWord8 _orbitClockBound_orb_radial_bound_mu
+    putWord8 _orbitClockBound_orb_along_bound_mu
+    putWord8 _orbitClockBound_orb_cross_bound_mu
+    putWord8 _orbitClockBound_orb_radial_bound_sig
+    putWord8 _orbitClockBound_orb_along_bound_sig
+    putWord8 _orbitClockBound_orb_cross_bound_sig
+    putWord8 _orbitClockBound_clock_bound_mu
+    putWord8 _orbitClockBound_clock_bound_sig
+
+$(makeJSON "_orbitClockBound_" ''OrbitClockBound)
+$(makeLenses ''OrbitClockBound)
+
 msgSsrOrbitClockBounds :: Word16
 msgSsrOrbitClockBounds = 0x05DE
 
+-- | SBP class for message MSG_SSR_ORBIT_CLOCK_BOUNDS (0x05DE).
+--
+-- Note 1: Range: 0-17.5 m. i<=200, mean=0.01i; 200<i<=230, mean=2+0.1(i-200);
+-- i>230, mean=5+0.5(i-230).
+--
+-- Note 2: Range: 0-17.5 m. i<=200, std=0.01i; 200<i<=230, std=2+0.1(i-200)
+-- i>230, std=5+0.5(i-230).
 data MsgSsrOrbitClockBounds = MsgSsrOrbitClockBounds
-  { _msgSsrOrbitClockBounds_stub :: ![Word8]
+  { _msgSsrOrbitClockBounds_header           :: !BoundsHeader
+    -- ^ Header of a bounds message.
+  , _msgSsrOrbitClockBounds_ssr_iod          :: !Word8
+    -- ^ IOD of the SSR bound.
+  , _msgSsrOrbitClockBounds_const_id         :: !Word8
+    -- ^ Constellation ID to which the SVs belong.
+  , _msgSsrOrbitClockBounds_n_sats           :: !Word8
+    -- ^ Number of satellites.
+  , _msgSsrOrbitClockBounds_orbit_clock_bounds :: ![OrbitClockBound]
+    -- ^ Orbit and Clock Bounds per Satellite
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrOrbitClockBounds where
   get = do
-    _msgSsrOrbitClockBounds_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrOrbitClockBounds_header <- get
+    _msgSsrOrbitClockBounds_ssr_iod <- getWord8
+    _msgSsrOrbitClockBounds_const_id <- getWord8
+    _msgSsrOrbitClockBounds_n_sats <- getWord8
+    _msgSsrOrbitClockBounds_orbit_clock_bounds <- whileM (not <$> isEmpty) get
     pure MsgSsrOrbitClockBounds {..}
 
   put MsgSsrOrbitClockBounds {..} = do
-    mapM_ putWord8 _msgSsrOrbitClockBounds_stub
+    put _msgSsrOrbitClockBounds_header
+    putWord8 _msgSsrOrbitClockBounds_ssr_iod
+    putWord8 _msgSsrOrbitClockBounds_const_id
+    putWord8 _msgSsrOrbitClockBounds_n_sats
+    mapM_ put _msgSsrOrbitClockBounds_orbit_clock_bounds
 
 $(makeSBP 'msgSsrOrbitClockBounds ''MsgSsrOrbitClockBounds)
 $(makeJSON "_msgSsrOrbitClockBounds_" ''MsgSsrOrbitClockBounds)
 $(makeLenses ''MsgSsrOrbitClockBounds)
 
+data CodePhaseBiasesSatSig = CodePhaseBiasesSatSig
+  { _codePhaseBiasesSatSig_sat_id             :: !Word8
+    -- ^ Satellite ID. Similar to either RTCM DF068 (GPS), DF252 (Galileo), or
+    -- DF488 (BDS) depending on the constellation.
+  , _codePhaseBiasesSatSig_signal_id          :: !Word8
+    -- ^ Signal and Tracking Mode Identifier. Similar to either RTCM DF380
+    -- (GPS), DF382 (Galileo) or DF467 (BDS) depending on the constellation.
+  , _codePhaseBiasesSatSig_code_bias_bound_mu :: !Word8
+    -- ^ Code Bias Mean. Range: 0-1.275 m
+  , _codePhaseBiasesSatSig_code_bias_bound_sig :: !Word8
+    -- ^ Code Bias Standard Deviation.  Range: 0-1.275 m
+  , _codePhaseBiasesSatSig_phase_bias_bound_mu :: !Word8
+    -- ^ Phase Bias Mean. Range: 0-1.275 m
+  , _codePhaseBiasesSatSig_phase_bias_bound_sig :: !Word8
+    -- ^ Phase Bias Standard Deviation.  Range: 0-1.275 m
+  } deriving ( Show, Read, Eq )
+
+instance Binary CodePhaseBiasesSatSig where
+  get = do
+    _codePhaseBiasesSatSig_sat_id <- getWord8
+    _codePhaseBiasesSatSig_signal_id <- getWord8
+    _codePhaseBiasesSatSig_code_bias_bound_mu <- getWord8
+    _codePhaseBiasesSatSig_code_bias_bound_sig <- getWord8
+    _codePhaseBiasesSatSig_phase_bias_bound_mu <- getWord8
+    _codePhaseBiasesSatSig_phase_bias_bound_sig <- getWord8
+    pure CodePhaseBiasesSatSig {..}
+
+  put CodePhaseBiasesSatSig {..} = do
+    putWord8 _codePhaseBiasesSatSig_sat_id
+    putWord8 _codePhaseBiasesSatSig_signal_id
+    putWord8 _codePhaseBiasesSatSig_code_bias_bound_mu
+    putWord8 _codePhaseBiasesSatSig_code_bias_bound_sig
+    putWord8 _codePhaseBiasesSatSig_phase_bias_bound_mu
+    putWord8 _codePhaseBiasesSatSig_phase_bias_bound_sig
+
+$(makeJSON "_codePhaseBiasesSatSig_" ''CodePhaseBiasesSatSig)
+$(makeLenses ''CodePhaseBiasesSatSig)
+
 msgSsrCodePhaseBiasesBounds :: Word16
 msgSsrCodePhaseBiasesBounds = 0x05EC
 
 data MsgSsrCodePhaseBiasesBounds = MsgSsrCodePhaseBiasesBounds
-  { _msgSsrCodePhaseBiasesBounds_stub :: ![Word8]
+  { _msgSsrCodePhaseBiasesBounds_header           :: !BoundsHeader
+    -- ^ Header of a bounds message.
+  , _msgSsrCodePhaseBiasesBounds_ssr_iod          :: !Word8
+    -- ^ IOD of the SSR bound.
+  , _msgSsrCodePhaseBiasesBounds_const_id         :: !Word8
+    -- ^ Constellation ID to which the SVs belong.
+  , _msgSsrCodePhaseBiasesBounds_n_sats_signals   :: !Word8
+    -- ^ Number of satellite-signal couples.
+  , _msgSsrCodePhaseBiasesBounds_satellites_signals :: ![CodePhaseBiasesSatSig]
+    -- ^ Code and Phase Biases Bounds per Satellite-Signal couple.
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrCodePhaseBiasesBounds where
   get = do
-    _msgSsrCodePhaseBiasesBounds_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrCodePhaseBiasesBounds_header <- get
+    _msgSsrCodePhaseBiasesBounds_ssr_iod <- getWord8
+    _msgSsrCodePhaseBiasesBounds_const_id <- getWord8
+    _msgSsrCodePhaseBiasesBounds_n_sats_signals <- getWord8
+    _msgSsrCodePhaseBiasesBounds_satellites_signals <- whileM (not <$> isEmpty) get
     pure MsgSsrCodePhaseBiasesBounds {..}
 
   put MsgSsrCodePhaseBiasesBounds {..} = do
-    mapM_ putWord8 _msgSsrCodePhaseBiasesBounds_stub
+    put _msgSsrCodePhaseBiasesBounds_header
+    putWord8 _msgSsrCodePhaseBiasesBounds_ssr_iod
+    putWord8 _msgSsrCodePhaseBiasesBounds_const_id
+    putWord8 _msgSsrCodePhaseBiasesBounds_n_sats_signals
+    mapM_ put _msgSsrCodePhaseBiasesBounds_satellites_signals
 
 $(makeSBP 'msgSsrCodePhaseBiasesBounds ''MsgSsrCodePhaseBiasesBounds)
 $(makeJSON "_msgSsrCodePhaseBiasesBounds_" ''MsgSsrCodePhaseBiasesBounds)
 $(makeLenses ''MsgSsrCodePhaseBiasesBounds)
 
+-- | OrbitClockBoundDegradation.
+--
+-- Orbit and clock bound degradation.
+data OrbitClockBoundDegradation = OrbitClockBoundDegradation
+  { _orbitClockBoundDegradation_orb_radial_bound_mu_dot :: !Word8
+    -- ^ Orbit Bound Mean Radial First derivative. Range: 0-0.255 m/s
+  , _orbitClockBoundDegradation_orb_along_bound_mu_dot :: !Word8
+    -- ^ Orbit Bound Mean Along-Track First derivative. Range: 0-0.255 m/s
+  , _orbitClockBoundDegradation_orb_cross_bound_mu_dot :: !Word8
+    -- ^ Orbit Bound Mean Cross-Track First derivative. Range: 0-0.255 m/s
+  , _orbitClockBoundDegradation_orb_radial_bound_sig_dot :: !Word8
+    -- ^ Orbit Bound Standard Deviation Radial First derivative. Range: 0-0.255
+    -- m/s
+  , _orbitClockBoundDegradation_orb_along_bound_sig_dot :: !Word8
+    -- ^ Orbit Bound Standard Deviation Along-Track First derivative. Range:
+    -- 0-0.255 m/s
+  , _orbitClockBoundDegradation_orb_cross_bound_sig_dot :: !Word8
+    -- ^ Orbit Bound Standard Deviation Cross-Track First derivative. Range:
+    -- 0-0.255 m/s
+  , _orbitClockBoundDegradation_clock_bound_mu_dot     :: !Word8
+    -- ^ Clock Bound Mean First derivative. Range: 0-0.255 m/s
+  , _orbitClockBoundDegradation_clock_bound_sig_dot    :: !Word8
+    -- ^ Clock Bound Standard Deviation First derivative. Range: 0-0.255 m/s
+  } deriving ( Show, Read, Eq )
+
+instance Binary OrbitClockBoundDegradation where
+  get = do
+    _orbitClockBoundDegradation_orb_radial_bound_mu_dot <- getWord8
+    _orbitClockBoundDegradation_orb_along_bound_mu_dot <- getWord8
+    _orbitClockBoundDegradation_orb_cross_bound_mu_dot <- getWord8
+    _orbitClockBoundDegradation_orb_radial_bound_sig_dot <- getWord8
+    _orbitClockBoundDegradation_orb_along_bound_sig_dot <- getWord8
+    _orbitClockBoundDegradation_orb_cross_bound_sig_dot <- getWord8
+    _orbitClockBoundDegradation_clock_bound_mu_dot <- getWord8
+    _orbitClockBoundDegradation_clock_bound_sig_dot <- getWord8
+    pure OrbitClockBoundDegradation {..}
+
+  put OrbitClockBoundDegradation {..} = do
+    putWord8 _orbitClockBoundDegradation_orb_radial_bound_mu_dot
+    putWord8 _orbitClockBoundDegradation_orb_along_bound_mu_dot
+    putWord8 _orbitClockBoundDegradation_orb_cross_bound_mu_dot
+    putWord8 _orbitClockBoundDegradation_orb_radial_bound_sig_dot
+    putWord8 _orbitClockBoundDegradation_orb_along_bound_sig_dot
+    putWord8 _orbitClockBoundDegradation_orb_cross_bound_sig_dot
+    putWord8 _orbitClockBoundDegradation_clock_bound_mu_dot
+    putWord8 _orbitClockBoundDegradation_clock_bound_sig_dot
+
+$(makeJSON "_orbitClockBoundDegradation_" ''OrbitClockBoundDegradation)
+$(makeLenses ''OrbitClockBoundDegradation)
+
 msgSsrOrbitClockBoundsDegradation :: Word16
 msgSsrOrbitClockBoundsDegradation = 0x05DF
 
 data MsgSsrOrbitClockBoundsDegradation = MsgSsrOrbitClockBoundsDegradation
-  { _msgSsrOrbitClockBoundsDegradation_stub :: ![Word8]
+  { _msgSsrOrbitClockBoundsDegradation_header                       :: !BoundsHeader
+    -- ^ Header of a bounds message.
+  , _msgSsrOrbitClockBoundsDegradation_ssr_iod                      :: !Word8
+    -- ^ IOD of the SSR bound degradation parameter.
+  , _msgSsrOrbitClockBoundsDegradation_const_id                     :: !Word8
+    -- ^ Constellation ID to which the SVs belong.
+  , _msgSsrOrbitClockBoundsDegradation_sat_bitmask                  :: !Word64
+    -- ^ Satellite Bit Mask. Put 1 for each satellite where the following
+    -- degradation parameters are applicable, 0 otherwise. Encoded following
+    -- RTCM DF394 specification.
+  , _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation :: !OrbitClockBoundDegradation
+    -- ^ Orbit and Clock Bounds Degradation Parameters
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSsrOrbitClockBoundsDegradation where
   get = do
-    _msgSsrOrbitClockBoundsDegradation_stub <- whileM (not <$> isEmpty) getWord8
+    _msgSsrOrbitClockBoundsDegradation_header <- get
+    _msgSsrOrbitClockBoundsDegradation_ssr_iod <- getWord8
+    _msgSsrOrbitClockBoundsDegradation_const_id <- getWord8
+    _msgSsrOrbitClockBoundsDegradation_sat_bitmask <- getWord64le
+    _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation <- get
     pure MsgSsrOrbitClockBoundsDegradation {..}
 
   put MsgSsrOrbitClockBoundsDegradation {..} = do
-    mapM_ putWord8 _msgSsrOrbitClockBoundsDegradation_stub
+    put _msgSsrOrbitClockBoundsDegradation_header
+    putWord8 _msgSsrOrbitClockBoundsDegradation_ssr_iod
+    putWord8 _msgSsrOrbitClockBoundsDegradation_const_id
+    putWord64le _msgSsrOrbitClockBoundsDegradation_sat_bitmask
+    put _msgSsrOrbitClockBoundsDegradation_orbit_clock_bounds_degradation
 
 $(makeSBP 'msgSsrOrbitClockBoundsDegradation ''MsgSsrOrbitClockBoundsDegradation)
 $(makeJSON "_msgSsrOrbitClockBoundsDegradation_" ''MsgSsrOrbitClockBoundsDegradation)
