diff --git a/rtcm.cabal b/rtcm.cabal
--- a/rtcm.cabal
+++ b/rtcm.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.22
 name: rtcm
-version: 0.2.16
+version: 0.2.17
 license: BSD3
 copyright: Copyright (C) 2015-2017 Swift Navigation, Inc.
 maintainer: Swift Navigation <dev@swift-nav.com>
@@ -26,6 +26,7 @@
         Data.RTCM3.Antennas
         Data.RTCM3.Ephemerides
         Data.RTCM3.Internal
+        Data.RTCM3.MSM
         Data.RTCM3.Observations
         Data.RTCM3.SSR
         Data.RTCM3.System
@@ -89,6 +90,7 @@
         Test.Data.RTCM3.Antennas
         Test.Data.RTCM3.Ephemerides
         Test.Data.RTCM3.Extras
+        Test.Data.RTCM3.MSM
         Test.Data.RTCM3.Observations
         Test.Data.RTCM3.SSR
         Test.Data.RTCM3.System
diff --git a/src/Data/RTCM3.hs b/src/Data/RTCM3.hs
--- a/src/Data/RTCM3.hs
+++ b/src/Data/RTCM3.hs
@@ -26,6 +26,7 @@
 import Data.ByteString.Lazy
 import Data.RTCM3.Antennas     as Export
 import Data.RTCM3.Ephemerides  as Export
+import Data.RTCM3.MSM          as Export
 import Data.RTCM3.Observations as Export
 import Data.RTCM3.SSR          as Export
 import Data.RTCM3.System       as Export
@@ -61,6 +62,30 @@
    | RTCM3Msg1064    Msg1064 Msg
    | RTCM3Msg1065    Msg1065 Msg
    | RTCM3Msg1066    Msg1066 Msg
+   | RTCM3Msg1074    Msg1074 Msg
+   | RTCM3Msg1075    Msg1075 Msg
+   | RTCM3Msg1076    Msg1076 Msg
+   | RTCM3Msg1077    Msg1077 Msg
+   | RTCM3Msg1084    Msg1084 Msg
+   | RTCM3Msg1085    Msg1085 Msg
+   | RTCM3Msg1086    Msg1086 Msg
+   | RTCM3Msg1087    Msg1087 Msg
+   | RTCM3Msg1094    Msg1094 Msg
+   | RTCM3Msg1095    Msg1095 Msg
+   | RTCM3Msg1096    Msg1096 Msg
+   | RTCM3Msg1097    Msg1097 Msg
+   | RTCM3Msg1104    Msg1104 Msg
+   | RTCM3Msg1105    Msg1105 Msg
+   | RTCM3Msg1106    Msg1106 Msg
+   | RTCM3Msg1107    Msg1107 Msg
+   | RTCM3Msg1114    Msg1114 Msg
+   | RTCM3Msg1115    Msg1115 Msg
+   | RTCM3Msg1116    Msg1116 Msg
+   | RTCM3Msg1117    Msg1117 Msg
+   | RTCM3Msg1124    Msg1124 Msg
+   | RTCM3Msg1125    Msg1125 Msg
+   | RTCM3Msg1126    Msg1126 Msg
+   | RTCM3Msg1127    Msg1127 Msg
    | RTCM3Msg1230    Msg1230 Msg
    | RTCM3Msg1265    Msg1265 Msg
    | RTCM3Msg1266    Msg1266 Msg
@@ -104,6 +129,30 @@
           | num == msg1064 = RTCM3Msg1064 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1065 = RTCM3Msg1065 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1066 = RTCM3Msg1066 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1074 = RTCM3Msg1074 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1075 = RTCM3Msg1075 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1076 = RTCM3Msg1076 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1077 = RTCM3Msg1077 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1084 = RTCM3Msg1084 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1085 = RTCM3Msg1085 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1086 = RTCM3Msg1086 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1087 = RTCM3Msg1087 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1094 = RTCM3Msg1094 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1095 = RTCM3Msg1095 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1096 = RTCM3Msg1096 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1097 = RTCM3Msg1097 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1104 = RTCM3Msg1104 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1105 = RTCM3Msg1105 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1106 = RTCM3Msg1106 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1107 = RTCM3Msg1107 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1114 = RTCM3Msg1114 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1115 = RTCM3Msg1125 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1116 = RTCM3Msg1116 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1117 = RTCM3Msg1117 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1124 = RTCM3Msg1124 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1125 = RTCM3Msg1125 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1126 = RTCM3Msg1126 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1127 = RTCM3Msg1127 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1230 = RTCM3Msg1230 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1265 = RTCM3Msg1265 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1266 = RTCM3Msg1266 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
@@ -139,6 +188,30 @@
       encoder (RTCM3Msg1064    _n m) = put m
       encoder (RTCM3Msg1065    _n m) = put m
       encoder (RTCM3Msg1066    _n m) = put m
+      encoder (RTCM3Msg1074    _n m) = put m
+      encoder (RTCM3Msg1075    _n m) = put m
+      encoder (RTCM3Msg1076    _n m) = put m
+      encoder (RTCM3Msg1077    _n m) = put m
+      encoder (RTCM3Msg1084    _n m) = put m
+      encoder (RTCM3Msg1085    _n m) = put m
+      encoder (RTCM3Msg1086    _n m) = put m
+      encoder (RTCM3Msg1087    _n m) = put m
+      encoder (RTCM3Msg1094    _n m) = put m
+      encoder (RTCM3Msg1095    _n m) = put m
+      encoder (RTCM3Msg1096    _n m) = put m
+      encoder (RTCM3Msg1097    _n m) = put m
+      encoder (RTCM3Msg1104    _n m) = put m
+      encoder (RTCM3Msg1105    _n m) = put m
+      encoder (RTCM3Msg1106    _n m) = put m
+      encoder (RTCM3Msg1107    _n m) = put m
+      encoder (RTCM3Msg1114    _n m) = put m
+      encoder (RTCM3Msg1115    _n m) = put m
+      encoder (RTCM3Msg1116    _n m) = put m
+      encoder (RTCM3Msg1117    _n m) = put m
+      encoder (RTCM3Msg1124    _n m) = put m
+      encoder (RTCM3Msg1125    _n m) = put m
+      encoder (RTCM3Msg1126    _n m) = put m
+      encoder (RTCM3Msg1127    _n m) = put m
       encoder (RTCM3Msg1230    _n m) = put m
       encoder (RTCM3Msg1265    _n m) = put m
       encoder (RTCM3Msg1266    _n m) = put m
@@ -172,6 +245,30 @@
   msg f (RTCM3Msg1064    n m) = RTCM3Msg1064    n <$> f m
   msg f (RTCM3Msg1065    n m) = RTCM3Msg1065    n <$> f m
   msg f (RTCM3Msg1066    n m) = RTCM3Msg1066    n <$> f m
+  msg f (RTCM3Msg1074    n m) = RTCM3Msg1074    n <$> f m
+  msg f (RTCM3Msg1075    n m) = RTCM3Msg1075    n <$> f m
+  msg f (RTCM3Msg1076    n m) = RTCM3Msg1076    n <$> f m
+  msg f (RTCM3Msg1077    n m) = RTCM3Msg1077    n <$> f m
+  msg f (RTCM3Msg1084    n m) = RTCM3Msg1084    n <$> f m
+  msg f (RTCM3Msg1085    n m) = RTCM3Msg1085    n <$> f m
+  msg f (RTCM3Msg1086    n m) = RTCM3Msg1086    n <$> f m
+  msg f (RTCM3Msg1087    n m) = RTCM3Msg1087    n <$> f m
+  msg f (RTCM3Msg1094    n m) = RTCM3Msg1094    n <$> f m
+  msg f (RTCM3Msg1095    n m) = RTCM3Msg1095    n <$> f m
+  msg f (RTCM3Msg1096    n m) = RTCM3Msg1096    n <$> f m
+  msg f (RTCM3Msg1097    n m) = RTCM3Msg1097    n <$> f m
+  msg f (RTCM3Msg1104    n m) = RTCM3Msg1104    n <$> f m
+  msg f (RTCM3Msg1105    n m) = RTCM3Msg1105    n <$> f m
+  msg f (RTCM3Msg1106    n m) = RTCM3Msg1106    n <$> f m
+  msg f (RTCM3Msg1107    n m) = RTCM3Msg1107    n <$> f m
+  msg f (RTCM3Msg1114    n m) = RTCM3Msg1114    n <$> f m
+  msg f (RTCM3Msg1115    n m) = RTCM3Msg1115    n <$> f m
+  msg f (RTCM3Msg1116    n m) = RTCM3Msg1116    n <$> f m
+  msg f (RTCM3Msg1117    n m) = RTCM3Msg1117    n <$> f m
+  msg f (RTCM3Msg1124    n m) = RTCM3Msg1124    n <$> f m
+  msg f (RTCM3Msg1125    n m) = RTCM3Msg1125    n <$> f m
+  msg f (RTCM3Msg1126    n m) = RTCM3Msg1126    n <$> f m
+  msg f (RTCM3Msg1127    n m) = RTCM3Msg1127    n <$> f m
   msg f (RTCM3Msg1230    n m) = RTCM3Msg1230    n <$> f m
   msg f (RTCM3Msg1265    n m) = RTCM3Msg1265    n <$> f m
   msg f (RTCM3Msg1266    n m) = RTCM3Msg1266    n <$> f m
@@ -211,6 +308,30 @@
   toJSON (RTCM3Msg1064    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1065    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1066    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1074    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1075    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1076    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1077    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1084    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1085    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1086    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1087    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1094    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1095    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1096    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1097    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1104    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1105    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1106    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1107    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1114    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1115    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1116    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1117    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1124    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1125    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1126    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1127    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1230    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1265    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1266    n m) = toJSON n <<>> toJSON m
@@ -248,6 +369,7 @@
         | num == msg1064 = RTCM3Msg1064 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1065 = RTCM3Msg1065 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1066 = RTCM3Msg1066 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
+        | num == msg1074 = RTCM3Msg1074 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1230 = RTCM3Msg1230 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1265 = RTCM3Msg1265 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | otherwise = RTCM3MsgUnknown <$> pure num <*> parseJSON obj
diff --git a/src/Data/RTCM3/MSM.hs b/src/Data/RTCM3/MSM.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/RTCM3/MSM.hs
@@ -0,0 +1,1173 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards   #-}
+{-# LANGUAGE TemplateHaskell   #-}
+
+-- |
+-- Module:      Data.RTCM3.MSM
+-- Copyright:   Copyright (C) 2018 Swift Navigation, Inc.
+-- License:     LGPL-3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- RTCMv3 messages for Multiple Signal Messages.
+
+module Data.RTCM3.MSM
+  ( module Data.RTCM3.MSM
+  ) where
+
+import           BasicPrelude
+import           Control.Lens
+import           Data.Aeson.TH
+import           Data.Binary
+import           Data.Binary.Bits
+import qualified Data.Binary.Bits.Get as B
+import qualified Data.Binary.Bits.Put as B
+import           Data.Bits
+import           Data.Int
+import           Data.RTCM3.Extras
+import           Data.RTCM3.TH
+
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+
+-- | MsmHeader.
+--
+-- MSM observation header.
+data MsmHeader = MsmHeader
+  { _msmHeader_num               :: Word16
+    -- ^ Message number.
+  , _msmHeader_station           :: Word16
+    -- ^ Reference station id.
+  , _msmHeader_epoch             :: Word32
+    -- ^ GNSS epoch time.
+  , _msmHeader_multiple          :: Bool
+    -- ^ Multiple message indicator.
+  , _msmHeader_iods              :: Word8
+    -- ^ Issue of data station.
+  , _msmHeader_reserved          :: Word8
+    -- ^ Reserved.
+  , _msmHeader_clockSteering     :: Word8
+    -- ^ Clock steering indicator.
+  , _msmHeader_externalClock     :: Word8
+    -- ^ External clock indicator.
+  , _msmHeader_smoothing         :: Bool
+    -- ^ GNSS divergence-free smoothing indicator.
+  , _msmHeader_smoothingInterval :: Word8
+    -- ^ GNSS smoothing interval.
+  , _msmHeader_satelliteMask     :: Word64
+    -- ^ GNSS satellite mask.
+  , _msmHeader_signalMask        :: Word32
+    -- ^ GNSS signal mask.
+  , _msmHeader_cellMask          :: Word64
+    -- ^ GNSS cell mask.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''MsmHeader)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msmHeader_" . stripPrefix "_msmHeader_"} ''MsmHeader)
+
+instance BinaryBit MsmHeader where
+  getBits _n = do
+    _msmHeader_num               <- B.getWord16be 12
+    _msmHeader_station           <- B.getWord16be 12
+    _msmHeader_epoch             <- B.getWord32be 30
+    _msmHeader_multiple          <- B.getBool
+    _msmHeader_iods              <- B.getWord8 3
+    _msmHeader_reserved          <- B.getWord8 7
+    _msmHeader_clockSteering     <- B.getWord8 2
+    _msmHeader_externalClock     <- B.getWord8 2
+    _msmHeader_smoothing         <- B.getBool
+    _msmHeader_smoothingInterval <- B.getWord8 3
+    _msmHeader_satelliteMask     <- B.getWord64be 64
+    _msmHeader_signalMask        <- B.getWord32be 32
+    let x = min 64 $ popCount _msmHeader_satelliteMask * popCount _msmHeader_signalMask
+    _msmHeader_cellMask          <- B.getWord64be x
+    pure MsmHeader {..}
+
+  putBits _n MsmHeader {..} = do
+    B.putWord16be 12 _msmHeader_num
+    B.putWord16be 12 _msmHeader_station
+    B.putWord32be 30 _msmHeader_epoch
+    B.putBool        _msmHeader_multiple
+    B.putWord8 3     _msmHeader_iods
+    B.putWord8 7     _msmHeader_reserved
+    B.putWord8 2     _msmHeader_clockSteering
+    B.putWord8 2     _msmHeader_externalClock
+    B.putBool        _msmHeader_smoothing
+    B.putWord8 3     _msmHeader_smoothingInterval
+    B.putWord64be 64 _msmHeader_satelliteMask
+    B.putWord32be 32 _msmHeader_signalMask
+    let x = min 64 $ popCount _msmHeader_satelliteMask * popCount _msmHeader_signalMask
+    B.putWord64be x  _msmHeader_cellMask
+
+-- | Msm46SatelliteData.
+--
+-- MSM46 satellite data.
+data Msm46SatelliteData = Msm46SatelliteData
+  { _msm46SatelliteData_ranges       :: [Word8]
+    -- ^ The number of integer milliseconds in GNSS Satellite rough ranges.
+  , _msm46SatelliteData_rangesModulo :: [Word16]
+    -- ^ GNSS Satellite rough ranges modulo 1 millisecond.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm46SatelliteData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm46SatelliteData_" . stripPrefix "_msm46SatelliteData_"} ''Msm46SatelliteData)
+
+-- | Get Bits for Msm4SatelliteData.
+--
+getBitsMsm46SatelliteData :: Int -> B.BitGet Msm46SatelliteData
+getBitsMsm46SatelliteData n = do
+  _msm46SatelliteData_ranges       <- replicateM n $ B.getWord8 8
+  _msm46SatelliteData_rangesModulo <- replicateM n $ B.getWord16be 10
+  pure Msm46SatelliteData {..}
+
+-- | Put Bits for Msm46SatelliteData.
+--
+putBitsMsm46SatelliteData :: Msm46SatelliteData -> B.BitPut ()
+putBitsMsm46SatelliteData Msm46SatelliteData {..} = do
+  forM_ _msm46SatelliteData_ranges $ B.putWord8 8
+  forM_ _msm46SatelliteData_rangesModulo $ B.putWord16be 10
+
+-- | Msm57SatelliteData
+--
+-- MSM57 satellite data.
+data Msm57SatelliteData = Msm57SatelliteData
+  { _msm57SatelliteData_ranges          :: [Word8]
+    -- ^ The number of integer milliseconds in GNSS Satellite rough ranges.
+  , _msm57SatelliteData_extendeds       :: [Word8]
+    -- ^ Extended satellite information.
+  , _msm57SatelliteData_rangesModulo    :: [Word16]
+    -- ^ GNSS Satellite rough ranges modulo 1 millisecond.
+  , _msm57SatelliteData_phaseRangeRates :: [Word16]
+    -- ^ GNSS Satellite rough PhaseRangeRates.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm57SatelliteData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm57SatelliteData_" . stripPrefix "_msm57SatelliteData_"} ''Msm57SatelliteData)
+
+-- | Get Bits for Msm57SatelliteData.
+--
+getBitsMsm57SatelliteData :: Int -> B.BitGet Msm57SatelliteData
+getBitsMsm57SatelliteData n = do
+  _msm57SatelliteData_ranges          <- replicateM n $ B.getWord8 8
+  _msm57SatelliteData_extendeds       <- replicateM n $ B.getWord8 4
+  _msm57SatelliteData_rangesModulo    <- replicateM n $ B.getWord16be 10
+  _msm57SatelliteData_phaseRangeRates <- replicateM n $ B.getWord16be 14
+  pure Msm57SatelliteData {..}
+
+-- | Put Bits for Msm4SatelliteData.
+--
+putBitsMsm57SatelliteData :: Msm57SatelliteData -> B.BitPut ()
+putBitsMsm57SatelliteData Msm57SatelliteData {..} = do
+  forM_ _msm57SatelliteData_ranges $ B.putWord8 8
+  forM_ _msm57SatelliteData_extendeds $ B.putWord8 4
+  forM_ _msm57SatelliteData_rangesModulo $ B.putWord16be 10
+  forM_ _msm57SatelliteData_phaseRangeRates $ B.putWord16be 14
+
+-- | Msm4SignalData.
+--
+-- MSM4 signal data.
+data Msm4SignalData = Msm4SignalData
+  { _msm4SignalData_pseudoranges :: [Int16]
+    -- ^ GNSS signal fine pseudoranges.
+  , _msm4SignalData_phaseranges  :: [Int32]
+    -- ^ GNSS signal fine phaserange data.
+  , _msm4SignalData_lockTimes    :: [Word8]
+    -- ^ GNSS phaserange lock time indicators.
+  , _msm4SignalData_halfCycles   :: [Bool]
+    -- ^ Half-cycle ambiguity indicators.
+  , _msm4SignalData_cnrs         :: [Word8]
+    -- ^ GNSS signal CNRs.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm4SignalData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm4SignalData_" . stripPrefix "_msm4SignalData_"} ''Msm4SignalData)
+
+-- | Get Bits for Msm4SignalData.
+--
+getBitsMsm4SignalData :: Int -> B.BitGet Msm4SignalData
+getBitsMsm4SignalData n = do
+  _msm4SignalData_pseudoranges <- replicateM n $ getInt16be 15
+  _msm4SignalData_phaseranges  <- replicateM n $ getInt32be 22
+  _msm4SignalData_lockTimes    <- replicateM n $ B.getWord8 4
+  _msm4SignalData_halfCycles   <- replicateM n B.getBool
+  _msm4SignalData_cnrs         <- replicateM n $ B.getWord8 6
+  pure Msm4SignalData {..}
+
+-- | Put Bits for Msm4SignalData.
+--
+putBitsMsm4SignalData :: Msm4SignalData -> B.BitPut ()
+putBitsMsm4SignalData Msm4SignalData {..} = do
+  forM_ _msm4SignalData_pseudoranges $ putInt16be 15
+  forM_ _msm4SignalData_phaseranges $ putInt32be 22
+  forM_ _msm4SignalData_lockTimes $ B.putWord8 4
+  forM_ _msm4SignalData_halfCycles B.putBool
+  forM_ _msm4SignalData_cnrs $ B.putWord8 6
+
+-- | Msm5SignalData.
+--
+-- MSM5 signal data.
+data Msm5SignalData = Msm5SignalData
+  { _msm5SignalData_pseudoranges    :: [Int16]
+    -- ^ GNSS signal fine pseudoranges.
+  , _msm5SignalData_phaseranges     :: [Int32]
+    -- ^ GNSS signal fine phaserange data.
+  , _msm5SignalData_lockTimes       :: [Word8]
+    -- ^ GNSS phaserange lock time indicators.
+  , _msm5SignalData_halfCycles      :: [Bool]
+    -- ^ Half-cycle ambiguity indicators.
+  , _msm5SignalData_cnrs            :: [Word8]
+    -- ^ GNSS signal CNRs.
+  , _msm5SignalData_phaseRangeRates :: [Int16]
+    -- ^ GNSS signal fine phaserangerates.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm5SignalData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm5SignalData_" . stripPrefix "_msm5SignalData_"} ''Msm5SignalData)
+
+-- | Get Bits for Msm5SignalData.
+--
+getBitsMsm5SignalData :: Int -> B.BitGet Msm5SignalData
+getBitsMsm5SignalData n = do
+  _msm5SignalData_pseudoranges    <- replicateM n $ getInt16be 15
+  _msm5SignalData_phaseranges     <- replicateM n $ getInt32be 22
+  _msm5SignalData_lockTimes       <- replicateM n $ B.getWord8 4
+  _msm5SignalData_halfCycles      <- replicateM n B.getBool
+  _msm5SignalData_cnrs            <- replicateM n $ B.getWord8 6
+  _msm5SignalData_phaseRangeRates <- replicateM n $ getInt16be 15
+  pure Msm5SignalData {..}
+
+-- | Put Bits for Msm5SignalData.
+--
+putBitsMsm5SignalData :: Msm5SignalData -> B.BitPut ()
+putBitsMsm5SignalData Msm5SignalData {..} = do
+  forM_ _msm5SignalData_pseudoranges $ putInt16be 15
+  forM_ _msm5SignalData_phaseranges $ putInt32be 22
+  forM_ _msm5SignalData_lockTimes $ B.putWord8 4
+  forM_ _msm5SignalData_halfCycles B.putBool
+  forM_ _msm5SignalData_cnrs $ B.putWord8 6
+  forM_ _msm5SignalData_phaseRangeRates $ putInt16be 15
+
+-- | Msm6SignalData.
+--
+-- MSM6 signal data.
+data Msm6SignalData = Msm6SignalData
+  { _msm6SignalData_pseudoranges :: [Int32]
+    -- ^ GNSS signal fine pseudoranges.
+  , _msm6SignalData_phaseranges  :: [Int32]
+    -- ^ GNSS signal fine phaserange data.
+  , _msm6SignalData_lockTimes    :: [Word16]
+    -- ^ GNSS phaserange lock time indicators.
+  , _msm6SignalData_halfCycles   :: [Bool]
+    -- ^ Half-cycle ambiguity indicators.
+  , _msm6SignalData_cnrs         :: [Word16]
+    -- ^ GNSS signal CNRs.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm6SignalData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm6SignalData_" . stripPrefix "_msm6SignalData_"} ''Msm6SignalData)
+
+-- | Get Bits for Msm6SignalData.
+--
+getBitsMsm6SignalData :: Int -> B.BitGet Msm6SignalData
+getBitsMsm6SignalData n = do
+  _msm6SignalData_pseudoranges <- replicateM n $ getInt32be 20
+  _msm6SignalData_phaseranges  <- replicateM n $ getInt32be 24
+  _msm6SignalData_lockTimes    <- replicateM n $ B.getWord16be 10
+  _msm6SignalData_halfCycles   <- replicateM n B.getBool
+  _msm6SignalData_cnrs         <- replicateM n $ B.getWord16be 10
+  pure Msm6SignalData {..}
+
+-- | Put Bits for Msm6SignalData.
+--
+putBitsMsm6SignalData :: Msm6SignalData -> B.BitPut ()
+putBitsMsm6SignalData Msm6SignalData {..} = do
+  forM_ _msm6SignalData_pseudoranges $ putInt32be 20
+  forM_ _msm6SignalData_phaseranges $ putInt32be 24
+  forM_ _msm6SignalData_lockTimes $ B.putWord16be 10
+  forM_ _msm6SignalData_halfCycles B.putBool
+  forM_ _msm6SignalData_cnrs $ B.putWord16be 10
+
+-- | Msm7SignalData.
+--
+-- MSM7 signal data.
+data Msm7SignalData = Msm7SignalData
+  { _msm7SignalData_pseudoranges    :: [Int32]
+    -- ^ GNSS signal fine pseudoranges.
+  , _msm7SignalData_phaseranges     :: [Int32]
+    -- ^ GNSS signal fine phaserange data.
+  , _msm7SignalData_lockTimes       :: [Word16]
+    -- ^ GNSS phaserange lock time indicators.
+  , _msm7SignalData_halfCycles      :: [Bool]
+    -- ^ Half-cycle ambiguity indicators.
+  , _msm7SignalData_cnrs            :: [Word16]
+    -- ^ GNSS signal CNRs.
+  , _msm7SignalData_phaseRangeRates :: [Int16]
+    -- ^ GNSS signal fine phaserangerates.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msm7SignalData)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msm7SignalData_" . stripPrefix "_msm7SignalData_"} ''Msm7SignalData)
+
+-- | Get Bits for Msm7SignalData.
+--
+getBitsMsm7SignalData :: Int -> B.BitGet Msm7SignalData
+getBitsMsm7SignalData n = do
+  _msm7SignalData_pseudoranges    <- replicateM n $ getInt32be 20
+  _msm7SignalData_phaseranges     <- replicateM n $ getInt32be 24
+  _msm7SignalData_lockTimes       <- replicateM n $ B.getWord16be 10
+  _msm7SignalData_halfCycles      <- replicateM n B.getBool
+  _msm7SignalData_cnrs            <- replicateM n $ B.getWord16be 10
+  _msm7SignalData_phaseRangeRates <- replicateM n $ getInt16be 15
+  pure Msm7SignalData {..}
+
+-- | Put Bits for Msm7SignalData.
+--
+putBitsMsm7SignalData :: Msm7SignalData -> B.BitPut ()
+putBitsMsm7SignalData Msm7SignalData {..} = do
+  forM_ _msm7SignalData_pseudoranges $ putInt32be 20
+  forM_ _msm7SignalData_phaseranges $ putInt32be 24
+  forM_ _msm7SignalData_lockTimes $ B.putWord16be 10
+  forM_ _msm7SignalData_halfCycles B.putBool
+  forM_ _msm7SignalData_cnrs $ B.putWord16be 10
+  forM_ _msm7SignalData_phaseRangeRates $ putInt16be 15
+
+msg1074 :: Word16
+msg1074 = 1074
+
+-- | Message 1074
+--
+-- RTCMv3 message 1074.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1074 = Msg1074
+  { _msg1074_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1074_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1074_signalData    :: Msm4SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1074)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1074_" . stripPrefix "_msg1074_"} ''Msg1074)
+
+instance Binary Msg1074 where
+  get = B.runBitGet $ do
+    _msg1074_header        <- getBits 0
+    _msg1074_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1074_header ^. msmHeader_satelliteMask
+    _msg1074_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1074_header ^. msmHeader_cellMask
+    pure Msg1074 {..}
+
+  put Msg1074 {..} = B.runBitPut $ do
+    putBits 0                 _msg1074_header
+    putBitsMsm46SatelliteData _msg1074_satelliteData
+    putBitsMsm4SignalData     _msg1074_signalData
+
+$(deriveRTCM3 ''Msg1074)
+
+msg1075 :: Word16
+msg1075 = 1075
+
+-- | Message 1075
+--
+-- RTCMv3 message 1075.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1075 = Msg1075
+  { _msg1075_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1075_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1075_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1075)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1075_" . stripPrefix "_msg1075_"} ''Msg1075)
+
+instance Binary Msg1075 where
+  get = B.runBitGet $ do
+    _msg1075_header        <- getBits 0
+    _msg1075_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1075_header ^. msmHeader_satelliteMask
+    _msg1075_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1075_header ^. msmHeader_cellMask
+    pure Msg1075 {..}
+
+  put Msg1075 {..} = B.runBitPut $ do
+    putBits 0                 _msg1075_header
+    putBitsMsm57SatelliteData _msg1075_satelliteData
+    putBitsMsm5SignalData     _msg1075_signalData
+
+$(deriveRTCM3 ''Msg1075)
+
+msg1076 :: Word16
+msg1076 = 1076
+
+-- | Message 1076
+--
+-- RTCMv3 message 1076.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1076 = Msg1076
+  { _msg1076_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1076_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1076_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1076)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1076_" . stripPrefix "_msg1076_"} ''Msg1076)
+
+instance Binary Msg1076 where
+  get = B.runBitGet $ do
+    _msg1076_header        <- getBits 0
+    _msg1076_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1076_header ^. msmHeader_satelliteMask
+    _msg1076_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1076_header ^. msmHeader_cellMask
+    pure Msg1076 {..}
+
+  put Msg1076 {..} = B.runBitPut $ do
+    putBits 0                 _msg1076_header
+    putBitsMsm46SatelliteData _msg1076_satelliteData
+    putBitsMsm6SignalData     _msg1076_signalData
+
+$(deriveRTCM3 ''Msg1076)
+
+msg1077 :: Word16
+msg1077 = 1077
+
+-- | Message 1077
+--
+-- RTCMv3 message 1077.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1077 = Msg1077
+  { _msg1077_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1077_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1077_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1077)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1077_" . stripPrefix "_msg1077_"} ''Msg1077)
+
+instance Binary Msg1077 where
+  get = B.runBitGet $ do
+    _msg1077_header        <- getBits 0
+    _msg1077_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1077_header ^. msmHeader_satelliteMask
+    _msg1077_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1077_header ^. msmHeader_cellMask
+    pure Msg1077 {..}
+
+  put Msg1077 {..} = B.runBitPut $ do
+    putBits 0                 _msg1077_header
+    putBitsMsm57SatelliteData _msg1077_satelliteData
+    putBitsMsm7SignalData     _msg1077_signalData
+
+$(deriveRTCM3 ''Msg1077)
+
+msg1084 :: Word16
+msg1084 = 1084
+
+-- | Message 1084
+--
+-- RTCMv3 message 1084.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1084 = Msg1084
+  { _msg1084_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1084_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1084_signalData    :: Msm4SignalData
+    -- ^ MSM satellite data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1084)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1084_" . stripPrefix "_msg1084_"} ''Msg1084)
+
+instance Binary Msg1084 where
+  get = B.runBitGet $ do
+    _msg1084_header        <- getBits 0
+    _msg1084_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1084_header ^. msmHeader_satelliteMask
+    _msg1084_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1084_header ^. msmHeader_cellMask
+    pure Msg1084 {..}
+
+  put Msg1084 {..} = B.runBitPut $ do
+    putBits 0                 _msg1084_header
+    putBitsMsm46SatelliteData _msg1084_satelliteData
+    putBitsMsm4SignalData     _msg1084_signalData
+
+$(deriveRTCM3 ''Msg1084)
+
+msg1085 :: Word16
+msg1085 = 1085
+
+-- | Message 1085
+--
+-- RTCMv3 message 1085.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1085 = Msg1085
+  { _msg1085_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1085_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1085_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1085)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1085_" . stripPrefix "_msg1085_"} ''Msg1085)
+
+instance Binary Msg1085 where
+  get = B.runBitGet $ do
+    _msg1085_header <- getBits 0
+    _msg1085_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1085_header ^. msmHeader_satelliteMask
+    _msg1085_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1085_header ^. msmHeader_cellMask
+    pure Msg1085 {..}
+
+  put Msg1085 {..} = B.runBitPut $ do
+    putBits 0                 _msg1085_header
+    putBitsMsm57SatelliteData _msg1085_satelliteData
+    putBitsMsm5SignalData     _msg1085_signalData
+
+$(deriveRTCM3 ''Msg1085)
+
+msg1086 :: Word16
+msg1086 = 1086
+
+-- | Message 1086
+--
+-- RTCMv3 message 1086.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1086 = Msg1086
+  { _msg1086_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1086_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1086_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1086)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1086_" . stripPrefix "_msg1086_"} ''Msg1086)
+
+instance Binary Msg1086 where
+  get = B.runBitGet $ do
+    _msg1086_header        <- getBits 0
+    _msg1086_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1086_header ^. msmHeader_satelliteMask
+    _msg1086_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1086_header ^. msmHeader_cellMask
+    pure Msg1086 {..}
+
+  put Msg1086 {..} = B.runBitPut $ do
+    putBits 0                 _msg1086_header
+    putBitsMsm46SatelliteData _msg1086_satelliteData
+    putBitsMsm6SignalData     _msg1086_signalData
+
+$(deriveRTCM3 ''Msg1086)
+
+msg1087 :: Word16
+msg1087 = 1087
+
+-- | Message 1087
+--
+-- RTCMv3 message 1087.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1087 = Msg1087
+  { _msg1087_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1087_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1087_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1087)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1087_" . stripPrefix "_msg1087_"} ''Msg1087)
+
+instance Binary Msg1087 where
+  get = B.runBitGet $ do
+    _msg1087_header        <- getBits 0
+    _msg1087_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1087_header ^. msmHeader_satelliteMask
+    _msg1087_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1087_header ^. msmHeader_cellMask
+    pure Msg1087 {..}
+
+  put Msg1087 {..} = B.runBitPut $ do
+    putBits 0                 _msg1087_header
+    putBitsMsm57SatelliteData _msg1087_satelliteData
+    putBitsMsm7SignalData     _msg1087_signalData
+
+$(deriveRTCM3 ''Msg1087)
+
+msg1094 :: Word16
+msg1094 = 1094
+
+-- | Message 1094
+--
+-- RTCMv3 message 1094.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1094 = Msg1094
+  { _msg1094_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1094_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1094_signalData    :: Msm4SignalData
+    -- ^ MSM satellite data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1094)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1094_" . stripPrefix "_msg1094_"} ''Msg1094)
+
+instance Binary Msg1094 where
+  get = B.runBitGet $ do
+    _msg1094_header        <- getBits 0
+    _msg1094_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1094_header ^. msmHeader_satelliteMask
+    _msg1094_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1094_header ^. msmHeader_cellMask
+    pure Msg1094 {..}
+
+  put Msg1094 {..} = B.runBitPut $ do
+    putBits 0                 _msg1094_header
+    putBitsMsm46SatelliteData _msg1094_satelliteData
+    putBitsMsm4SignalData     _msg1094_signalData
+
+$(deriveRTCM3 ''Msg1094)
+
+msg1095 :: Word16
+msg1095 = 1095
+
+-- | Message 1095
+--
+-- RTCMv3 message 1095.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1095 = Msg1095
+  { _msg1095_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1095_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1095_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1095)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1095_" . stripPrefix "_msg1095_"} ''Msg1095)
+
+instance Binary Msg1095 where
+  get = B.runBitGet $ do
+    _msg1095_header        <- getBits 0
+    _msg1095_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1095_header ^. msmHeader_satelliteMask
+    _msg1095_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1095_header ^. msmHeader_cellMask
+    pure Msg1095 {..}
+
+  put Msg1095 {..} = B.runBitPut $ do
+    putBits 0                 _msg1095_header
+    putBitsMsm57SatelliteData _msg1095_satelliteData
+    putBitsMsm5SignalData     _msg1095_signalData
+
+$(deriveRTCM3 ''Msg1095)
+
+msg1096 :: Word16
+msg1096 = 1096
+
+-- | Message 1096
+--
+-- RTCMv3 message 1096.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1096 = Msg1096
+  { _msg1096_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1096_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1096_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1096)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1096_" . stripPrefix "_msg1096_"} ''Msg1096)
+
+instance Binary Msg1096 where
+  get = B.runBitGet $ do
+    _msg1096_header        <- getBits 0
+    _msg1096_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1096_header ^. msmHeader_satelliteMask
+    _msg1096_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1096_header ^. msmHeader_cellMask
+    pure Msg1096 {..}
+
+  put Msg1096 {..} = B.runBitPut $ do
+    putBits 0                 _msg1096_header
+    putBitsMsm46SatelliteData _msg1096_satelliteData
+    putBitsMsm6SignalData     _msg1096_signalData
+
+$(deriveRTCM3 ''Msg1096)
+
+msg1097 :: Word16
+msg1097 = 1097
+
+-- | Message 1097
+--
+-- RTCMv3 message 1097.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1097 = Msg1097
+  { _msg1097_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1097_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1097_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1097)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1097_" . stripPrefix "_msg1097_"} ''Msg1097)
+
+instance Binary Msg1097 where
+  get = B.runBitGet $ do
+    _msg1097_header        <- getBits 0
+    _msg1097_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1097_header ^. msmHeader_satelliteMask
+    _msg1097_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1097_header ^. msmHeader_cellMask
+    pure Msg1097 {..}
+
+  put Msg1097 {..} = B.runBitPut $ do
+    putBits 0                 _msg1097_header
+    putBitsMsm57SatelliteData _msg1097_satelliteData
+    putBitsMsm7SignalData     _msg1097_signalData
+
+$(deriveRTCM3 ''Msg1097)
+
+msg1104 :: Word16
+msg1104 = 1104
+
+-- | Message 1104
+--
+-- RTCMv3 message 1104.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1104 = Msg1104
+  { _msg1104_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1104_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1104_signalData    :: Msm4SignalData
+    -- ^ MSM satellite data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1104)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1104_" . stripPrefix "_msg1104_"} ''Msg1104)
+
+instance Binary Msg1104 where
+  get = B.runBitGet $ do
+    _msg1104_header        <- getBits 0
+    _msg1104_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1104_header ^. msmHeader_satelliteMask
+    _msg1104_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1104_header ^. msmHeader_cellMask
+    pure Msg1104 {..}
+
+  put Msg1104 {..} = B.runBitPut $ do
+    putBits 0                 _msg1104_header
+    putBitsMsm46SatelliteData _msg1104_satelliteData
+    putBitsMsm4SignalData     _msg1104_signalData
+
+$(deriveRTCM3 ''Msg1104)
+
+msg1105 :: Word16
+msg1105 = 1105
+
+-- | Message 1105
+--
+-- RTCMv3 message 1105.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1105 = Msg1105
+  { _msg1105_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1105_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1105_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1105)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1105_" . stripPrefix "_msg1105_"} ''Msg1105)
+
+instance Binary Msg1105 where
+  get = B.runBitGet $ do
+    _msg1105_header        <- getBits 0
+    _msg1105_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1105_header ^. msmHeader_satelliteMask
+    _msg1105_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1105_header ^. msmHeader_cellMask
+    pure Msg1105 {..}
+
+  put Msg1105 {..} = B.runBitPut $ do
+    putBits 0                 _msg1105_header
+    putBitsMsm57SatelliteData _msg1105_satelliteData
+    putBitsMsm5SignalData     _msg1105_signalData
+
+$(deriveRTCM3 ''Msg1105)
+
+msg1106 :: Word16
+msg1106 = 1106
+
+-- | Message 1106
+--
+-- RTCMv3 message 1106.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1106 = Msg1106
+  { _msg1106_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1106_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1106_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1106)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1106_" . stripPrefix "_msg1106_"} ''Msg1106)
+
+instance Binary Msg1106 where
+  get = B.runBitGet $ do
+    _msg1106_header        <- getBits 0
+    _msg1106_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1106_header ^. msmHeader_satelliteMask
+    _msg1106_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1106_header ^. msmHeader_cellMask
+    pure Msg1106 {..}
+
+  put Msg1106 {..} = B.runBitPut $ do
+    putBits 0                 _msg1106_header
+    putBitsMsm46SatelliteData _msg1106_satelliteData
+    putBitsMsm6SignalData     _msg1106_signalData
+
+$(deriveRTCM3 ''Msg1106)
+
+msg1107 :: Word16
+msg1107 = 1107
+
+-- | Message 1107
+--
+-- RTCMv3 message 1107.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1107 = Msg1107
+  { _msg1107_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1107_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1107_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1107)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1107_" . stripPrefix "_msg1107_"} ''Msg1107)
+
+instance Binary Msg1107 where
+  get = B.runBitGet $ do
+    _msg1107_header        <- getBits 0
+    _msg1107_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1107_header ^. msmHeader_satelliteMask
+    _msg1107_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1107_header ^. msmHeader_cellMask
+    pure Msg1107 {..}
+
+  put Msg1107 {..} = B.runBitPut $ do
+    putBits 0                 _msg1107_header
+    putBitsMsm57SatelliteData _msg1107_satelliteData
+    putBitsMsm7SignalData     _msg1107_signalData
+
+$(deriveRTCM3 ''Msg1107)
+
+msg1114 :: Word16
+msg1114 = 1114
+
+-- | Message 1114
+--
+-- RTCMv3 message 1114.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1114 = Msg1114
+  { _msg1114_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1114_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1114_signalData    :: Msm4SignalData
+    -- ^ MSM satellite data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1114)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1114_" . stripPrefix "_msg1114_"} ''Msg1114)
+
+instance Binary Msg1114 where
+  get = B.runBitGet $ do
+    _msg1114_header        <- getBits 0
+    _msg1114_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1114_header ^. msmHeader_satelliteMask
+    _msg1114_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1114_header ^. msmHeader_cellMask
+    pure Msg1114 {..}
+
+  put Msg1114 {..} = B.runBitPut $ do
+    putBits 0                 _msg1114_header
+    putBitsMsm46SatelliteData _msg1114_satelliteData
+    putBitsMsm4SignalData     _msg1114_signalData
+
+$(deriveRTCM3 ''Msg1114)
+
+msg1115 :: Word16
+msg1115 = 1115
+
+-- | Message 1115
+--
+-- RTCMv3 message 1115.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1115 = Msg1115
+  { _msg1115_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1115_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1115_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1115)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1115_" . stripPrefix "_msg1115_"} ''Msg1115)
+
+instance Binary Msg1115 where
+  get = B.runBitGet $ do
+    _msg1115_header        <- getBits 0
+    _msg1115_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1115_header ^. msmHeader_satelliteMask
+    _msg1115_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1115_header ^. msmHeader_cellMask
+    pure Msg1115 {..}
+
+  put Msg1115 {..} = B.runBitPut $ do
+    putBits 0                 _msg1115_header
+    putBitsMsm57SatelliteData _msg1115_satelliteData
+    putBitsMsm5SignalData     _msg1115_signalData
+
+$(deriveRTCM3 ''Msg1115)
+
+msg1116 :: Word16
+msg1116 = 1116
+
+-- | Message 1116
+--
+-- RTCMv3 message 1116.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1116 = Msg1116
+  { _msg1116_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1116_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1116_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1116)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1116_" . stripPrefix "_msg1116_"} ''Msg1116)
+
+instance Binary Msg1116 where
+  get = B.runBitGet $ do
+    _msg1116_header        <- getBits 0
+    _msg1116_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1116_header ^. msmHeader_satelliteMask
+    _msg1116_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1116_header ^. msmHeader_cellMask
+    pure Msg1116 {..}
+
+  put Msg1116 {..} = B.runBitPut $ do
+    putBits 0                 _msg1116_header
+    putBitsMsm46SatelliteData _msg1116_satelliteData
+    putBitsMsm6SignalData     _msg1116_signalData
+
+$(deriveRTCM3 ''Msg1116)
+
+msg1117 :: Word16
+msg1117 = 1117
+
+-- | Message 1117
+--
+-- RTCMv3 message 1117.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1117 = Msg1117
+  { _msg1117_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1117_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1117_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1117)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1117_" . stripPrefix "_msg1117_"} ''Msg1117)
+
+instance Binary Msg1117 where
+  get = B.runBitGet $ do
+    _msg1117_header        <- getBits 0
+    _msg1117_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1117_header ^. msmHeader_satelliteMask
+    _msg1117_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1117_header ^. msmHeader_cellMask
+    pure Msg1117 {..}
+
+  put Msg1117 {..} = B.runBitPut $ do
+    putBits 0                 _msg1117_header
+    putBitsMsm57SatelliteData _msg1117_satelliteData
+    putBitsMsm7SignalData     _msg1117_signalData
+
+$(deriveRTCM3 ''Msg1117)
+
+msg1124 :: Word16
+msg1124 = 1124
+
+-- | Message 1124
+--
+-- RTCMv3 message 1124.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1124 = Msg1124
+  { _msg1124_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1124_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1124_signalData    :: Msm4SignalData
+    -- ^ MSM satellite data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1124)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1124_" . stripPrefix "_msg1124_"} ''Msg1124)
+
+instance Binary Msg1124 where
+  get = B.runBitGet $ do
+    _msg1124_header        <- getBits 0
+    _msg1124_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1124_header ^. msmHeader_satelliteMask
+    _msg1124_signalData    <- getBitsMsm4SignalData $ popCount $ _msg1124_header ^. msmHeader_cellMask
+    pure Msg1124 {..}
+
+  put Msg1124 {..} = B.runBitPut $ do
+    putBits 0                 _msg1124_header
+    putBitsMsm46SatelliteData _msg1124_satelliteData
+    putBitsMsm4SignalData     _msg1124_signalData
+
+$(deriveRTCM3 ''Msg1124)
+
+msg1125 :: Word16
+msg1125 = 1125
+
+-- | Message 1125
+--
+-- RTCMv3 message 1125.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1125 = Msg1125
+  { _msg1125_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1125_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1125_signalData    :: Msm5SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1125)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1125_" . stripPrefix "_msg1125_"} ''Msg1125)
+
+instance Binary Msg1125 where
+  get = B.runBitGet $ do
+    _msg1125_header        <- getBits 0
+    _msg1125_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1125_header ^. msmHeader_satelliteMask
+    _msg1125_signalData    <- getBitsMsm5SignalData $ popCount $ _msg1125_header ^. msmHeader_cellMask
+    pure Msg1125 {..}
+
+  put Msg1125 {..} = B.runBitPut $ do
+    putBits 0                 _msg1125_header
+    putBitsMsm57SatelliteData _msg1125_satelliteData
+    putBitsMsm5SignalData     _msg1125_signalData
+
+$(deriveRTCM3 ''Msg1125)
+
+msg1126 :: Word16
+msg1126 = 1126
+
+-- | Message 1126
+--
+-- RTCMv3 message 1126.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1126 = Msg1126
+  { _msg1126_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1126_satelliteData :: Msm46SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1126_signalData    :: Msm6SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1126)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1126_" . stripPrefix "_msg1126_"} ''Msg1126)
+
+instance Binary Msg1126 where
+  get = B.runBitGet $ do
+    _msg1126_header        <- getBits 0
+    _msg1126_satelliteData <- getBitsMsm46SatelliteData $ popCount $ _msg1126_header ^. msmHeader_satelliteMask
+    _msg1126_signalData    <- getBitsMsm6SignalData $ popCount $ _msg1126_header ^. msmHeader_cellMask
+    pure Msg1126 {..}
+
+  put Msg1126 {..} = B.runBitPut $ do
+    putBits 0                 _msg1126_header
+    putBitsMsm46SatelliteData _msg1126_satelliteData
+    putBitsMsm6SignalData     _msg1126_signalData
+
+$(deriveRTCM3 ''Msg1126)
+
+msg1127 :: Word16
+msg1127 = 1127
+
+-- | Message 1127
+--
+-- RTCMv3 message 1127.
+--
+-- See RTCM spec and MSM signal specification for more information
+-- about these fields.
+data Msg1127 = Msg1127
+  { _msg1127_header        :: MsmHeader
+    -- ^ MSM header.
+  , _msg1127_satelliteData :: Msm57SatelliteData
+    -- ^ MSM satellite data.
+  , _msg1127_signalData    :: Msm7SignalData
+    -- ^ MSM signal data.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1127)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1127_" . stripPrefix "_msg1127_"} ''Msg1127)
+
+instance Binary Msg1127 where
+  get = B.runBitGet $ do
+    _msg1127_header        <- getBits 0
+    _msg1127_satelliteData <- getBitsMsm57SatelliteData $ popCount $ _msg1127_header ^. msmHeader_satelliteMask
+    _msg1127_signalData    <- getBitsMsm7SignalData $ popCount $ _msg1127_header ^. msmHeader_cellMask
+    pure Msg1127 {..}
+
+  put Msg1127 {..} = B.runBitPut $ do
+    putBits 0                 _msg1127_header
+    putBitsMsm57SatelliteData _msg1127_satelliteData
+    putBitsMsm7SignalData     _msg1127_signalData
+
+$(deriveRTCM3 ''Msg1127)
+
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -13,6 +13,7 @@
 import qualified Test.Data.RTCM3.Antennas     as Antennas
 import qualified Test.Data.RTCM3.Ephemerides  as Ephemerides
 import qualified Test.Data.RTCM3.Extras       as Extras
+import qualified Test.Data.RTCM3.MSM          as MSM
 import qualified Test.Data.RTCM3.Observations as Observations
 import qualified Test.Data.RTCM3.SSR          as SSR
 import qualified Test.Data.RTCM3.System       as System
@@ -25,6 +26,7 @@
     , Antennas.tests
     , Ephemerides.tests
     , Extras.tests
+    , MSM.tests
     , Observations.tests
     , SSR.tests
     , System.tests
diff --git a/test/Test/Data/RTCM3/MSM.hs b/test/Test/Data/RTCM3/MSM.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Data/RTCM3/MSM.hs
@@ -0,0 +1,411 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards   #-}
+{-# OPTIONS -fno-warn-orphans  #-}
+
+-- |
+-- Module:      Test.Data.RTCM3.MSM
+-- Copyright:   (c) 2015 Swift Navigation
+-- License:     BSD3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+--
+-- Test MSM module for RTCM3.
+
+module Test.Data.RTCM3.MSM
+  ( tests
+  ) where
+
+import BasicPrelude
+import Control.Lens
+import Data.Binary
+import Data.Bits
+import Data.RTCM3
+import Test.Data.RTCM3.Test
+import Test.Tasty
+import Test.Tasty.QuickCheck
+
+instance Arbitrary MsmHeader where
+  arbitrary = do
+    _msmHeader_num               <- arbitraryWord 12
+    _msmHeader_station           <- arbitraryWord 12
+    _msmHeader_epoch             <- arbitraryWord 30
+    _msmHeader_multiple          <- arbitrary
+    _msmHeader_iods              <- arbitraryWord 3
+    _msmHeader_reserved          <- arbitraryWord 7
+    _msmHeader_clockSteering     <- arbitraryWord 2
+    _msmHeader_externalClock     <- arbitraryWord 2
+    _msmHeader_smoothing         <- arbitrary
+    _msmHeader_smoothingInterval <- arbitraryWord 3
+    _msmHeader_satelliteMask     <- arbitraryWord 64
+    _msmHeader_signalMask        <- arbitraryWord 32
+    let x = min 64 $ popCount _msmHeader_satelliteMask * popCount _msmHeader_signalMask
+    _msmHeader_cellMask          <- arbitraryWord x
+    pure MsmHeader {..}
+
+arbitraryMsm46SatelliteData :: Int -> Gen Msm46SatelliteData
+arbitraryMsm46SatelliteData n = do
+  _msm46SatelliteData_ranges       <- replicateM n $ arbitraryWord 8
+  _msm46SatelliteData_rangesModulo <- replicateM n $ arbitraryWord 10
+  pure Msm46SatelliteData {..}
+
+arbitraryMsm57SatelliteData :: Int -> Gen Msm57SatelliteData
+arbitraryMsm57SatelliteData n = do
+  _msm57SatelliteData_ranges          <- replicateM n $ arbitraryWord 8
+  _msm57SatelliteData_extendeds       <- replicateM n $ arbitraryWord 4
+  _msm57SatelliteData_rangesModulo    <- replicateM n $ arbitraryWord 10
+  _msm57SatelliteData_phaseRangeRates <- replicateM n $ arbitraryWord 14
+  pure Msm57SatelliteData {..}
+
+arbitraryMsm4SignalData :: Int -> Gen Msm4SignalData
+arbitraryMsm4SignalData n = do
+  _msm4SignalData_pseudoranges <- replicateM n $ arbitraryInt 15
+  _msm4SignalData_phaseranges  <- replicateM n $ arbitraryInt 22
+  _msm4SignalData_lockTimes    <- replicateM n $ arbitraryWord 4
+  _msm4SignalData_halfCycles   <- replicateM n arbitrary
+  _msm4SignalData_cnrs         <- replicateM n $ arbitraryWord 6
+  pure Msm4SignalData {..}
+
+arbitraryMsm5SignalData :: Int -> Gen Msm5SignalData
+arbitraryMsm5SignalData n = do
+  _msm5SignalData_pseudoranges    <- replicateM n $ arbitraryInt 15
+  _msm5SignalData_phaseranges     <- replicateM n $ arbitraryInt 22
+  _msm5SignalData_lockTimes       <- replicateM n $ arbitraryWord 4
+  _msm5SignalData_halfCycles      <- replicateM n arbitrary
+  _msm5SignalData_cnrs            <- replicateM n $ arbitraryWord 6
+  _msm5SignalData_phaseRangeRates <- replicateM n $ arbitraryInt 15
+  pure Msm5SignalData {..}
+
+arbitraryMsm6SignalData :: Int -> Gen Msm6SignalData
+arbitraryMsm6SignalData n = do
+  _msm6SignalData_pseudoranges <- replicateM n $ arbitraryInt 20
+  _msm6SignalData_phaseranges  <- replicateM n $ arbitraryInt 24
+  _msm6SignalData_lockTimes    <- replicateM n $ arbitraryWord 10
+  _msm6SignalData_halfCycles   <- replicateM n arbitrary
+  _msm6SignalData_cnrs         <- replicateM n $ arbitraryWord 10
+  pure Msm6SignalData {..}
+
+arbitraryMsm7SignalData :: Int -> Gen Msm7SignalData
+arbitraryMsm7SignalData n = do
+  _msm7SignalData_pseudoranges    <- replicateM n $ arbitraryInt 20
+  _msm7SignalData_phaseranges     <- replicateM n $ arbitraryInt 24
+  _msm7SignalData_lockTimes       <- replicateM n $ arbitraryWord 10
+  _msm7SignalData_halfCycles      <- replicateM n arbitrary
+  _msm7SignalData_cnrs            <- replicateM n $ arbitraryWord 10
+  _msm7SignalData_phaseRangeRates <- replicateM n $ arbitraryInt 15
+  pure Msm7SignalData {..}
+
+instance Arbitrary Msg1074 where
+  arbitrary = do
+    _msg1074_header        <- arbitrary
+    _msg1074_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1074_header ^. msmHeader_satelliteMask
+    _msg1074_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1074_header ^. msmHeader_cellMask
+    pure Msg1074 {..}
+
+instance Arbitrary Msg1075 where
+  arbitrary = do
+    _msg1075_header        <- arbitrary
+    _msg1075_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1075_header ^. msmHeader_satelliteMask
+    _msg1075_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1075_header ^. msmHeader_cellMask
+    pure Msg1075 {..}
+
+instance Arbitrary Msg1076 where
+  arbitrary = do
+    _msg1076_header        <- arbitrary
+    _msg1076_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1076_header ^. msmHeader_satelliteMask
+    _msg1076_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1076_header ^. msmHeader_cellMask
+    pure Msg1076 {..}
+
+instance Arbitrary Msg1077 where
+  arbitrary = do
+    _msg1077_header        <- arbitrary
+    _msg1077_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1077_header ^. msmHeader_satelliteMask
+    _msg1077_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1077_header ^. msmHeader_cellMask
+    pure Msg1077 {..}
+
+instance Arbitrary Msg1084 where
+  arbitrary = do
+    _msg1084_header        <- arbitrary
+    _msg1084_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1084_header ^. msmHeader_satelliteMask
+    _msg1084_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1084_header ^. msmHeader_cellMask
+    pure Msg1084 {..}
+
+instance Arbitrary Msg1085 where
+  arbitrary = do
+    _msg1085_header        <- arbitrary
+    _msg1085_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1085_header ^. msmHeader_satelliteMask
+    _msg1085_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1085_header ^. msmHeader_cellMask
+    pure Msg1085 {..}
+
+instance Arbitrary Msg1086 where
+  arbitrary = do
+    _msg1086_header        <- arbitrary
+    _msg1086_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1086_header ^. msmHeader_satelliteMask
+    _msg1086_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1086_header ^. msmHeader_cellMask
+    pure Msg1086 {..}
+
+instance Arbitrary Msg1087 where
+  arbitrary = do
+    _msg1087_header        <- arbitrary
+    _msg1087_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1087_header ^. msmHeader_satelliteMask
+    _msg1087_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1087_header ^. msmHeader_cellMask
+    pure Msg1087 {..}
+
+instance Arbitrary Msg1094 where
+  arbitrary = do
+    _msg1094_header        <- arbitrary
+    _msg1094_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1094_header ^. msmHeader_satelliteMask
+    _msg1094_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1094_header ^. msmHeader_cellMask
+    pure Msg1094 {..}
+
+instance Arbitrary Msg1095 where
+  arbitrary = do
+    _msg1095_header        <- arbitrary
+    _msg1095_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1095_header ^. msmHeader_satelliteMask
+    _msg1095_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1095_header ^. msmHeader_cellMask
+    pure Msg1095 {..}
+
+instance Arbitrary Msg1096 where
+  arbitrary = do
+    _msg1096_header        <- arbitrary
+    _msg1096_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1096_header ^. msmHeader_satelliteMask
+    _msg1096_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1096_header ^. msmHeader_cellMask
+    pure Msg1096 {..}
+
+instance Arbitrary Msg1097 where
+  arbitrary = do
+    _msg1097_header        <- arbitrary
+    _msg1097_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1097_header ^. msmHeader_satelliteMask
+    _msg1097_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1097_header ^. msmHeader_cellMask
+    pure Msg1097 {..}
+
+instance Arbitrary Msg1104 where
+  arbitrary = do
+    _msg1104_header        <- arbitrary
+    _msg1104_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1104_header ^. msmHeader_satelliteMask
+    _msg1104_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1104_header ^. msmHeader_cellMask
+    pure Msg1104 {..}
+
+instance Arbitrary Msg1105 where
+  arbitrary = do
+    _msg1105_header        <- arbitrary
+    _msg1105_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1105_header ^. msmHeader_satelliteMask
+    _msg1105_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1105_header ^. msmHeader_cellMask
+    pure Msg1105 {..}
+
+instance Arbitrary Msg1106 where
+  arbitrary = do
+    _msg1106_header        <- arbitrary
+    _msg1106_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1106_header ^. msmHeader_satelliteMask
+    _msg1106_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1106_header ^. msmHeader_cellMask
+    pure Msg1106 {..}
+
+instance Arbitrary Msg1107 where
+  arbitrary = do
+    _msg1107_header        <- arbitrary
+    _msg1107_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1107_header ^. msmHeader_satelliteMask
+    _msg1107_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1107_header ^. msmHeader_cellMask
+    pure Msg1107 {..}
+
+instance Arbitrary Msg1114 where
+  arbitrary = do
+    _msg1114_header        <- arbitrary
+    _msg1114_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1114_header ^. msmHeader_satelliteMask
+    _msg1114_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1114_header ^. msmHeader_cellMask
+    pure Msg1114 {..}
+
+instance Arbitrary Msg1115 where
+  arbitrary = do
+    _msg1115_header        <- arbitrary
+    _msg1115_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1115_header ^. msmHeader_satelliteMask
+    _msg1115_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1115_header ^. msmHeader_cellMask
+    pure Msg1115 {..}
+
+instance Arbitrary Msg1116 where
+  arbitrary = do
+    _msg1116_header        <- arbitrary
+    _msg1116_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1116_header ^. msmHeader_satelliteMask
+    _msg1116_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1116_header ^. msmHeader_cellMask
+    pure Msg1116 {..}
+
+instance Arbitrary Msg1117 where
+  arbitrary = do
+    _msg1117_header        <- arbitrary
+    _msg1117_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1117_header ^. msmHeader_satelliteMask
+    _msg1117_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1117_header ^. msmHeader_cellMask
+    pure Msg1117 {..}
+
+instance Arbitrary Msg1124 where
+  arbitrary = do
+    _msg1124_header        <- arbitrary
+    _msg1124_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1124_header ^. msmHeader_satelliteMask
+    _msg1124_signalData    <- arbitraryMsm4SignalData $ popCount $ _msg1124_header ^. msmHeader_cellMask
+    pure Msg1124 {..}
+
+instance Arbitrary Msg1125 where
+  arbitrary = do
+    _msg1125_header       <- arbitrary
+    _msg1125_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1125_header ^. msmHeader_satelliteMask
+    _msg1125_signalData    <- arbitraryMsm5SignalData $ popCount $ _msg1125_header ^. msmHeader_cellMask
+    pure Msg1125 {..}
+
+instance Arbitrary Msg1126 where
+  arbitrary = do
+    _msg1126_header        <- arbitrary
+    _msg1126_satelliteData <- arbitraryMsm46SatelliteData $ popCount $ _msg1126_header ^. msmHeader_satelliteMask
+    _msg1126_signalData    <- arbitraryMsm6SignalData $ popCount $ _msg1126_header ^. msmHeader_cellMask
+    pure Msg1126 {..}
+
+instance Arbitrary Msg1127 where
+  arbitrary = do
+    _msg1127_header        <- arbitrary
+    _msg1127_satelliteData <- arbitraryMsm57SatelliteData $ popCount $ _msg1127_header ^. msmHeader_satelliteMask
+    _msg1127_signalData    <- arbitraryMsm7SignalData $ popCount $ _msg1127_header ^. msmHeader_cellMask
+    pure Msg1127 {..}
+
+testMsg1074 :: TestTree
+testMsg1074 =
+  testProperty "Roundtrip Msg1074" $ \m ->
+    decode (encode m) == (m :: Msg1074)
+
+testMsg1075 :: TestTree
+testMsg1075 =
+  testProperty "Roundtrip Msg1075" $ \m ->
+    decode (encode m) == (m :: Msg1075)
+
+testMsg1076 :: TestTree
+testMsg1076 =
+  testProperty "Roundtrip Msg1076" $ \m ->
+    decode (encode m) == (m :: Msg1076)
+
+testMsg1077 :: TestTree
+testMsg1077 =
+  testProperty "Roundtrip Msg1077" $ \m ->
+    decode (encode m) == (m :: Msg1077)
+
+testMsg1084 :: TestTree
+testMsg1084 =
+  testProperty "Roundtrip Msg1084" $ \m ->
+    decode (encode m) == (m :: Msg1084)
+
+testMsg1085 :: TestTree
+testMsg1085 =
+  testProperty "Roundtrip Msg1085" $ \m ->
+    decode (encode m) == (m :: Msg1085)
+
+testMsg1086 :: TestTree
+testMsg1086 =
+  testProperty "Roundtrip Msg1086" $ \m ->
+    decode (encode m) == (m :: Msg1086)
+
+testMsg1087 :: TestTree
+testMsg1087 =
+  testProperty "Roundtrip Msg1087" $ \m ->
+    decode (encode m) == (m :: Msg1087)
+
+testMsg1094 :: TestTree
+testMsg1094 =
+  testProperty "Roundtrip Msg1094" $ \m ->
+    decode (encode m) == (m :: Msg1094)
+
+testMsg1095 :: TestTree
+testMsg1095 =
+  testProperty "Roundtrip Msg1095" $ \m ->
+    decode (encode m) == (m :: Msg1095)
+
+testMsg1096 :: TestTree
+testMsg1096 =
+  testProperty "Roundtrip Msg1096" $ \m ->
+    decode (encode m) == (m :: Msg1096)
+
+testMsg1097 :: TestTree
+testMsg1097 =
+  testProperty "Roundtrip Msg1097" $ \m ->
+    decode (encode m) == (m :: Msg1097)
+
+testMsg1104 :: TestTree
+testMsg1104 =
+  testProperty "Roundtrip Msg1104" $ \m ->
+    decode (encode m) == (m :: Msg1104)
+
+testMsg1105 :: TestTree
+testMsg1105 =
+  testProperty "Roundtrip Msg1105" $ \m ->
+    decode (encode m) == (m :: Msg1105)
+
+testMsg1106 :: TestTree
+testMsg1106 =
+  testProperty "Roundtrip Msg1106" $ \m ->
+    decode (encode m) == (m :: Msg1106)
+
+testMsg1107 :: TestTree
+testMsg1107 =
+  testProperty "Roundtrip Msg1107" $ \m ->
+    decode (encode m) == (m :: Msg1107)
+
+testMsg1114 :: TestTree
+testMsg1114 =
+  testProperty "Roundtrip Msg1114" $ \m ->
+    decode (encode m) == (m :: Msg1114)
+
+testMsg1115 :: TestTree
+testMsg1115 =
+  testProperty "Roundtrip Msg1115" $ \m ->
+    decode (encode m) == (m :: Msg1115)
+
+testMsg1116 :: TestTree
+testMsg1116 =
+  testProperty "Roundtrip Msg1116" $ \m ->
+    decode (encode m) == (m :: Msg1116)
+
+testMsg1117 :: TestTree
+testMsg1117 =
+  testProperty "Roundtrip Msg1117" $ \m ->
+    decode (encode m) == (m :: Msg1117)
+
+testMsg1124 :: TestTree
+testMsg1124 =
+  testProperty "Roundtrip Msg1124" $ \m ->
+    decode (encode m) == (m :: Msg1124)
+
+testMsg1125 :: TestTree
+testMsg1125 =
+  testProperty "Roundtrip Msg1125" $ \m ->
+    decode (encode m) == (m :: Msg1125)
+
+testMsg1126 :: TestTree
+testMsg1126 =
+  testProperty "Roundtrip Msg1126" $ \m ->
+    decode (encode m) == (m :: Msg1126)
+
+testMsg1127 :: TestTree
+testMsg1127 =
+  testProperty "Roundtrip Msg1127" $ \m ->
+    decode (encode m) == (m :: Msg1127)
+
+tests :: TestTree
+tests =
+  testGroup "MSM tests"
+    [ testMsg1074
+    , testMsg1075
+    , testMsg1076
+    , testMsg1077
+    , testMsg1084
+    , testMsg1085
+    , testMsg1086
+    , testMsg1087
+    , testMsg1094
+    , testMsg1095
+    , testMsg1096
+    , testMsg1097
+    , testMsg1104
+    , testMsg1105
+    , testMsg1106
+    , testMsg1107
+    , testMsg1114
+    , testMsg1115
+    , testMsg1116
+    , testMsg1117
+    , testMsg1124
+    , testMsg1125
+    , testMsg1126
+    , testMsg1127
+    ]
