diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               6.0.1
+version:               6.1.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
@@ -85,7 +85,7 @@
 -- could be a satellite, SSR grid point, or SSR tile. A group of aggregated
 -- elements being monitored for integrity could refer to:
 --
--- - Satellites in a particular {GPS, GAL, BDS} constellation.
+-- - Satellites in a particular {GPS, GAL, BDS, QZSS} constellation.
 --
 -- - Satellites in the line-of-sight of a particular SSR tile.
 --
@@ -125,6 +125,8 @@
     -- ^ Use GAL satellites.
   , _msgSsrFlagHighLevel_use_bds_sat               :: !Word8
     -- ^ Use BDS satellites.
+  , _msgSsrFlagHighLevel_use_qzss_sat              :: !Word8
+    -- ^ Use QZSS satellites.
   , _msgSsrFlagHighLevel_reserved                  :: ![Word8]
     -- ^ Reserved
   , _msgSsrFlagHighLevel_use_tropo_grid_points     :: !Word8
@@ -148,7 +150,8 @@
     _msgSsrFlagHighLevel_use_gps_sat <- getWord8
     _msgSsrFlagHighLevel_use_gal_sat <- getWord8
     _msgSsrFlagHighLevel_use_bds_sat <- getWord8
-    _msgSsrFlagHighLevel_reserved <- replicateM 6 getWord8
+    _msgSsrFlagHighLevel_use_qzss_sat <- getWord8
+    _msgSsrFlagHighLevel_reserved <- replicateM 5 getWord8
     _msgSsrFlagHighLevel_use_tropo_grid_points <- getWord8
     _msgSsrFlagHighLevel_use_iono_grid_points <- getWord8
     _msgSsrFlagHighLevel_use_iono_tile_sat_los <- getWord8
@@ -165,6 +168,7 @@
     putWord8 _msgSsrFlagHighLevel_use_gps_sat
     putWord8 _msgSsrFlagHighLevel_use_gal_sat
     putWord8 _msgSsrFlagHighLevel_use_bds_sat
+    putWord8 _msgSsrFlagHighLevel_use_qzss_sat
     mapM_ putWord8 _msgSsrFlagHighLevel_reserved
     putWord8 _msgSsrFlagHighLevel_use_tropo_grid_points
     putWord8 _msgSsrFlagHighLevel_use_iono_grid_points
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
@@ -66,6 +66,7 @@
    | SBPMsgAcqResultDepC MsgAcqResultDepC Msg
    | SBPMsgAcqSvProfile MsgAcqSvProfile Msg
    | SBPMsgAcqSvProfileDep MsgAcqSvProfileDep Msg
+   | SBPMsgAesCmacSignature MsgAesCmacSignature Msg
    | SBPMsgAgeCorrections MsgAgeCorrections Msg
    | SBPMsgAlmanac MsgAlmanac Msg
    | SBPMsgAlmanacGlo MsgAlmanacGlo Msg
@@ -316,6 +317,7 @@
           | _msgSBPType == msgAcqResultDepC = SBPMsgAcqResultDepC (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAcqSvProfile = SBPMsgAcqSvProfile (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAcqSvProfileDep = SBPMsgAcqSvProfileDep (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgAesCmacSignature = SBPMsgAesCmacSignature (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAgeCorrections = SBPMsgAgeCorrections (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAlmanac = SBPMsgAlmanac (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAlmanacGlo = SBPMsgAlmanacGlo (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -558,6 +560,7 @@
       encoder (SBPMsgAcqResultDepC _ m) = put m
       encoder (SBPMsgAcqSvProfile _ m) = put m
       encoder (SBPMsgAcqSvProfileDep _ m) = put m
+      encoder (SBPMsgAesCmacSignature _ m) = put m
       encoder (SBPMsgAgeCorrections _ m) = put m
       encoder (SBPMsgAlmanac _ m) = put m
       encoder (SBPMsgAlmanacGlo _ m) = put m
@@ -804,6 +807,7 @@
         | msgType == msgAcqResultDepC = SBPMsgAcqResultDepC <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAcqSvProfile = SBPMsgAcqSvProfile <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAcqSvProfileDep = SBPMsgAcqSvProfileDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgAesCmacSignature = SBPMsgAesCmacSignature <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAgeCorrections = SBPMsgAgeCorrections <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAlmanac = SBPMsgAlmanac <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAlmanacGlo = SBPMsgAlmanacGlo <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -1051,6 +1055,7 @@
   toJSON (SBPMsgAcqResultDepC n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAcqSvProfile n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAcqSvProfileDep n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgAesCmacSignature n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAgeCorrections n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAlmanac _ m) = toJSON m
   toJSON (SBPMsgAlmanacGlo n m) = toJSON n <<>> toJSON m
@@ -1292,6 +1297,7 @@
   msg f (SBPMsgAcqResultDepC n m) = SBPMsgAcqResultDepC n <$> f m
   msg f (SBPMsgAcqSvProfile n m) = SBPMsgAcqSvProfile n <$> f m
   msg f (SBPMsgAcqSvProfileDep n m) = SBPMsgAcqSvProfileDep n <$> f m
+  msg f (SBPMsgAesCmacSignature n m) = SBPMsgAesCmacSignature n <$> f m
   msg f (SBPMsgAgeCorrections n m) = SBPMsgAgeCorrections n <$> f m
   msg f (SBPMsgAlmanac n m) = SBPMsgAlmanac n <$> f m
   msg f (SBPMsgAlmanacGlo n m) = SBPMsgAlmanacGlo n <$> f m
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
@@ -2731,6 +2731,7 @@
     --   - bits 0-4: Signal health status. See IS-GPS-200H
     --     Table 20-VIII. Codes for Health of SV Signal
     --     Components.
+    --
     -- Satellite health status for GLO (see GLO ICD 5.1 table 5.1 for
     -- details):
     --   - bit 0: C(n), "unhealthy" flag that is transmitted within
@@ -2781,6 +2782,7 @@
     --   - bits 0-4: Signal health status. See IS-GPS-200H
     --     Table 20-VIII. Codes for Health of SV Signal
     --     Components.
+    --
     -- Satellite health status for GLO (see GLO ICD 5.1 table 5.1 for
     -- details):
     --   - bit 0: C(n), "unhealthy" flag that is transmitted within
diff --git a/src/SwiftNav/SBP/Signing.hs b/src/SwiftNav/SBP/Signing.hs
--- a/src/SwiftNav/SBP/Signing.hs
+++ b/src/SwiftNav/SBP/Signing.hs
@@ -224,6 +224,60 @@
 $(makeJSON "_msgCertificateChainDep_" ''MsgCertificateChainDep)
 $(makeLenses ''MsgCertificateChainDep)
 
+msgAesCmacSignature :: Word16
+msgAesCmacSignature = 0x0C10
+
+-- | SBP class for message MSG_AES_CMAC_SIGNATURE (0x0C10).
+--
+-- Digital signature using AES-CMAC 128 algorithm used for data integrity.
+data MsgAesCmacSignature = MsgAesCmacSignature
+  { _msgAesCmacSignature_stream_counter  :: !Word8
+    -- ^ Signature message counter. Zero indexed and incremented with each
+    -- signature message.  The counter will not increment if this message was
+    -- in response to an on demand request.  The counter will roll over after
+    -- 256 messages. Upon connection, the value of the counter may not
+    -- initially be zero.
+  , _msgAesCmacSignature_on_demand_counter :: !Word8
+    -- ^ On demand message counter. Zero indexed and incremented with each
+    -- signature message sent in response to an on demand message. The counter
+    -- will roll over after 256 messages.  Upon connection, the value of the
+    -- counter may not initially be zero.
+  , _msgAesCmacSignature_certificate_id  :: ![Word8]
+    -- ^ The last 4 bytes of the certificate's SHA-1 fingerprint
+  , _msgAesCmacSignature_signature       :: ![Word8]
+    -- ^ Signature (CMAC tag value)
+  , _msgAesCmacSignature_flags           :: !Word8
+    -- ^ Describes the format of the 'signed messages' field below.
+  , _msgAesCmacSignature_signed_messages :: ![Word8]
+    -- ^ CRCs of the messages covered by this signature.  For Skylark, which
+    -- delivers SBP messages wrapped in Swift's proprietary RTCM message,
+    -- these are the 24-bit CRCs from the RTCM message framing. For SBP only
+    -- streams, this will be 16-bit CRCs from the SBP framing.  See the
+    -- `flags` field to determine the type of CRCs covered.
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgAesCmacSignature where
+  get = do
+    _msgAesCmacSignature_stream_counter <- getWord8
+    _msgAesCmacSignature_on_demand_counter <- getWord8
+    _msgAesCmacSignature_certificate_id <- replicateM 4 getWord8
+    _msgAesCmacSignature_signature <- replicateM 16 getWord8
+    _msgAesCmacSignature_flags <- getWord8
+    _msgAesCmacSignature_signed_messages <- whileM (not <$> isEmpty) getWord8
+    pure MsgAesCmacSignature {..}
+
+  put MsgAesCmacSignature {..} = do
+    putWord8 _msgAesCmacSignature_stream_counter
+    putWord8 _msgAesCmacSignature_on_demand_counter
+    mapM_ putWord8 _msgAesCmacSignature_certificate_id
+    mapM_ putWord8 _msgAesCmacSignature_signature
+    putWord8 _msgAesCmacSignature_flags
+    mapM_ putWord8 _msgAesCmacSignature_signed_messages
+
+$(makeSBP 'msgAesCmacSignature ''MsgAesCmacSignature)
+$(makeJSON "_msgAesCmacSignature_" ''MsgAesCmacSignature)
+$(makeLenses ''MsgAesCmacSignature)
+
 msgEcdsaSignature :: Word16
 msgEcdsaSignature = 0x0C08
 
