diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               4.1.6
+version:               4.2.0
 synopsis:              SwiftNav's SBP Library
 homepage:              https://github.com/swift-nav/libsbp
 license:               MIT
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
@@ -225,6 +225,7 @@
    | SBPMsgSsrStecCorrectionDepA MsgSsrStecCorrectionDepA Msg
    | SBPMsgSsrTileDefinition MsgSsrTileDefinition Msg
    | SBPMsgStartup MsgStartup Msg
+   | SBPMsgStatusJournal MsgStatusJournal Msg
    | SBPMsgStatusReport MsgStatusReport Msg
    | SBPMsgStmFlashLockSector MsgStmFlashLockSector Msg
    | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector Msg
@@ -442,6 +443,7 @@
           | _msgSBPType == msgSsrStecCorrectionDepA = SBPMsgSsrStecCorrectionDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSsrTileDefinition = SBPMsgSsrTileDefinition (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStartup = SBPMsgStartup (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgStatusJournal = SBPMsgStatusJournal (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStatusReport = SBPMsgStatusReport (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStmFlashLockSector = SBPMsgStmFlashLockSector (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -651,6 +653,7 @@
       encoder (SBPMsgSsrStecCorrectionDepA _ m) = put m
       encoder (SBPMsgSsrTileDefinition _ m) = put m
       encoder (SBPMsgStartup _ m) = put m
+      encoder (SBPMsgStatusJournal _ m) = put m
       encoder (SBPMsgStatusReport _ m) = put m
       encoder (SBPMsgStmFlashLockSector _ m) = put m
       encoder (SBPMsgStmFlashUnlockSector _ m) = put m
@@ -864,6 +867,7 @@
         | msgType == msgSsrStecCorrectionDepA = SBPMsgSsrStecCorrectionDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSsrTileDefinition = SBPMsgSsrTileDefinition <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStartup = SBPMsgStartup <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgStatusJournal = SBPMsgStatusJournal <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStatusReport = SBPMsgStatusReport <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStmFlashLockSector = SBPMsgStmFlashLockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -1078,6 +1082,7 @@
   toJSON (SBPMsgSsrStecCorrectionDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSsrTileDefinition n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStartup n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgStatusJournal n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStatusReport n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStmFlashLockSector n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStmFlashUnlockSector n m) = toJSON n <<>> toJSON m
@@ -1286,6 +1291,7 @@
   msg f (SBPMsgSsrStecCorrectionDepA n m) = SBPMsgSsrStecCorrectionDepA n <$> f m
   msg f (SBPMsgSsrTileDefinition n m) = SBPMsgSsrTileDefinition n <$> f m
   msg f (SBPMsgStartup n m) = SBPMsgStartup n <$> f m
+  msg f (SBPMsgStatusJournal n m) = SBPMsgStatusJournal n <$> f m
   msg f (SBPMsgStatusReport n m) = SBPMsgStatusReport n <$> f m
   msg f (SBPMsgStmFlashLockSector n m) = SBPMsgStmFlashLockSector n <$> f m
   msg f (SBPMsgStmFlashUnlockSector n m) = SBPMsgStmFlashUnlockSector n <$> f m
diff --git a/src/SwiftNav/SBP/System.hs b/src/SwiftNav/SBP/System.hs
--- a/src/SwiftNav/SBP/System.hs
+++ b/src/SwiftNav/SBP/System.hs
@@ -138,8 +138,8 @@
 
 -- | SubSystemReport.
 --
--- Report the general and specific state of a sub-system.  If the generic
--- state is reported as initializing, the specific state should be ignored.
+-- Report the general and specific state of a subsystem.  If the generic state
+-- is reported as initializing, the specific state should be ignored.
 data SubSystemReport = SubSystemReport
   { _subSystemReport_component :: !Word16
     -- ^ Identity of reporting subsystem
@@ -172,7 +172,7 @@
 -- The status report is sent periodically to inform the host or other attached
 -- devices that the system is running. It is used to monitor system
 -- malfunctions. It contains status reports that indicate to the host the
--- status of each sub-system and whether it is operating correctly.
+-- status of each subsystem and whether it is operating correctly.
 --
 -- Interpretation of the subsystem specific status code is product dependent,
 -- but if the generic status code is initializing, it should be ignored.
@@ -209,6 +209,73 @@
 $(makeSBP 'msgStatusReport ''MsgStatusReport)
 $(makeJSON "_msgStatusReport_" ''MsgStatusReport)
 $(makeLenses ''MsgStatusReport)
+
+-- | StatusJournalItem.
+--
+-- Reports the uptime and the state of a subsystem via generic and specific
+-- status codes.  If the generic state is reported as initializing, the
+-- specific state should be ignored.
+data StatusJournalItem = StatusJournalItem
+  { _statusJournalItem_uptime :: !Word32
+    -- ^ Milliseconds since system startup
+  , _statusJournalItem_report :: !SubSystemReport
+  } deriving ( Show, Read, Eq )
+
+instance Binary StatusJournalItem where
+  get = do
+    _statusJournalItem_uptime <- getWord32le
+    _statusJournalItem_report <- get
+    pure StatusJournalItem {..}
+
+  put StatusJournalItem {..} = do
+    putWord32le _statusJournalItem_uptime
+    put _statusJournalItem_report
+
+$(makeJSON "_statusJournalItem_" ''StatusJournalItem)
+$(makeLenses ''StatusJournalItem)
+
+msgStatusJournal :: Word16
+msgStatusJournal = 0xFFFD
+
+-- | SBP class for message MSG_STATUS_JOURNAL (0xFFFD).
+--
+-- The status journal message contains past status reports (see
+-- MSG_STATUS_REPORT) and functions as a error/event storage for telemetry
+-- purposes.
+data MsgStatusJournal = MsgStatusJournal
+  { _msgStatusJournal_reporting_system   :: !Word16
+    -- ^ Identity of reporting system
+  , _msgStatusJournal_sbp_version        :: !Word16
+    -- ^ SBP protocol version
+  , _msgStatusJournal_total_status_reports :: !Word32
+    -- ^ Total number of status reports sent since system startup
+  , _msgStatusJournal_sequence_descriptor :: !Word8
+    -- ^ Index and number of messages in this sequence. First nibble is the size
+    -- of the sequence (n), second nibble is the zero-indexed counter (ith
+    -- packet of n)
+  , _msgStatusJournal_journal            :: ![StatusJournalItem]
+    -- ^ Status journal
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgStatusJournal where
+  get = do
+    _msgStatusJournal_reporting_system <- getWord16le
+    _msgStatusJournal_sbp_version <- getWord16le
+    _msgStatusJournal_total_status_reports <- getWord32le
+    _msgStatusJournal_sequence_descriptor <- getWord8
+    _msgStatusJournal_journal <- whileM (not <$> isEmpty) get
+    pure MsgStatusJournal {..}
+
+  put MsgStatusJournal {..} = do
+    putWord16le _msgStatusJournal_reporting_system
+    putWord16le _msgStatusJournal_sbp_version
+    putWord32le _msgStatusJournal_total_status_reports
+    putWord8 _msgStatusJournal_sequence_descriptor
+    mapM_ put _msgStatusJournal_journal
+
+$(makeSBP 'msgStatusJournal ''MsgStatusJournal)
+$(makeJSON "_msgStatusJournal_" ''MsgStatusJournal)
+$(makeLenses ''MsgStatusJournal)
 
 msgInsStatus :: Word16
 msgInsStatus = 0xFF03
