diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name:                  sbp
-version:               2.3.9
+version:               2.3.12
 synopsis:              SwiftNav's SBP Library
 homepage:              https://github.com/swift-nav/libsbp
 license:               LGPL-3
diff --git a/src/SwiftNav/SBP/Acquisition.hs b/src/SwiftNav/SBP/Acquisition.hs
--- a/src/SwiftNav/SBP/Acquisition.hs
+++ b/src/SwiftNav/SBP/Acquisition.hs
@@ -46,13 +46,13 @@
 -- contains the parameters of the point in the acquisition search space with
 -- the best carrier-to-noise (CN/0) ratio.
 data MsgAcqResult = MsgAcqResult
-  { _msgAcqResult_cn0 :: !Float
+  { _msgAcqResult_cn0 :: !float
     -- ^ CN/0 of best point
-  , _msgAcqResult_cp :: !Float
+  , _msgAcqResult_cp :: !float
     -- ^ Code phase of best point
-  , _msgAcqResult_cf :: !Float
+  , _msgAcqResult_cf :: !float
     -- ^ Carrier frequency of best point
-  , _msgAcqResult_sid :: !GnssSignal
+  , _msgAcqResult_sid :: !gnss.GnssSignal
     -- ^ GNSS signal for which acquisition was attempted
   } deriving ( Show, Read, Eq )
 
@@ -81,11 +81,11 @@
 --
 -- Deprecated.
 data MsgAcqResultDepC = MsgAcqResultDepC
-  { _msgAcqResultDepC_cn0 :: !Float
+  { _msgAcqResultDepC_cn0 :: !float
     -- ^ CN/0 of best point
-  , _msgAcqResultDepC_cp :: !Float
+  , _msgAcqResultDepC_cp :: !float
     -- ^ Code phase of best point
-  , _msgAcqResultDepC_cf :: !Float
+  , _msgAcqResultDepC_cf :: !float
     -- ^ Carrier frequency of best point
   , _msgAcqResultDepC_sid :: !GnssSignalDep
     -- ^ GNSS signal for which acquisition was attempted
@@ -116,12 +116,12 @@
 --
 -- Deprecated.
 data MsgAcqResultDepB = MsgAcqResultDepB
-  { _msgAcqResultDepB_snr :: !Float
+  { _msgAcqResultDepB_snr :: !float
     -- ^ SNR of best point. Currently in arbitrary SNR points, but will be in
     -- units of dB Hz in a later revision of this message.
-  , _msgAcqResultDepB_cp :: !Float
+  , _msgAcqResultDepB_cp :: !float
     -- ^ Code phase of best point
-  , _msgAcqResultDepB_cf :: !Float
+  , _msgAcqResultDepB_cf :: !float
     -- ^ Carrier frequency of best point
   , _msgAcqResultDepB_sid :: !GnssSignalDep
     -- ^ GNSS signal for which acquisition was attempted
@@ -152,14 +152,14 @@
 --
 -- Deprecated.
 data MsgAcqResultDepA = MsgAcqResultDepA
-  { _msgAcqResultDepA_snr :: !Float
+  { _msgAcqResultDepA_snr :: !float
     -- ^ SNR of best point. Currently dimensonless, but will have units of dB Hz
     -- in the revision of this message.
-  , _msgAcqResultDepA_cp :: !Float
+  , _msgAcqResultDepA_cp :: !float
     -- ^ Code phase of best point
-  , _msgAcqResultDepA_cf :: !Float
+  , _msgAcqResultDepA_cf :: !float
     -- ^ Carrier frequency of best point
-  , _msgAcqResultDepA_prn :: !Word8
+  , _msgAcqResultDepA_prn :: !uint32
     -- ^ PRN-1 identifier of the satellite signal for which acquisition was
     -- attempted
   } deriving ( Show, Read, Eq )
@@ -188,29 +188,29 @@
 -- profile during acquisition time. The message is used to debug and measure
 -- the performance.
 data AcqSvProfile = AcqSvProfile
-  { _acqSvProfile_job_type :: !Word8
+  { _acqSvProfile_job_type :: !uint32
     -- ^ SV search job type (deep, fallback, etc)
-  , _acqSvProfile_status   :: !Word8
+  , _acqSvProfile_status   :: !uint32
     -- ^ Acquisition status 1 is Success, 0 is Failure
-  , _acqSvProfile_cn0      :: !Word16
+  , _acqSvProfile_cn0      :: !uint32
     -- ^ CN0 value. Only valid if status is '1'
-  , _acqSvProfile_int_time :: !Word8
+  , _acqSvProfile_int_time :: !uint32
     -- ^ Acquisition integration time
-  , _acqSvProfile_sid      :: !GnssSignal
+  , _acqSvProfile_sid      :: !gnss.GnssSignal
     -- ^ GNSS signal for which acquisition was attempted
-  , _acqSvProfile_bin_width :: !Word16
+  , _acqSvProfile_bin_width :: !uint32
     -- ^ Acq frequency bin width
-  , _acqSvProfile_timestamp :: !Word32
+  , _acqSvProfile_timestamp :: !uint32
     -- ^ Timestamp of the job complete event
-  , _acqSvProfile_time_spent :: !Word32
+  , _acqSvProfile_time_spent :: !uint32
     -- ^ Time spent to search for sid.code
-  , _acqSvProfile_cf_min   :: !Int32
+  , _acqSvProfile_cf_min   :: !sint32
     -- ^ Doppler range lowest frequency
-  , _acqSvProfile_cf_max   :: !Int32
+  , _acqSvProfile_cf_max   :: !sint32
     -- ^ Doppler range highest frequency
-  , _acqSvProfile_cf       :: !Int32
+  , _acqSvProfile_cf       :: !sint32
     -- ^ Doppler value of detected peak. Only valid if status is '1'
-  , _acqSvProfile_cp       :: !Word32
+  , _acqSvProfile_cp       :: !uint32
     -- ^ Codephase of detected peak. Only valid if status is '1'
   } deriving ( Show, Read, Eq )
 
@@ -251,29 +251,29 @@
 --
 -- Deprecated.
 data AcqSvProfileDep = AcqSvProfileDep
-  { _acqSvProfileDep_job_type :: !Word8
+  { _acqSvProfileDep_job_type :: !uint32
     -- ^ SV search job type (deep, fallback, etc)
-  , _acqSvProfileDep_status   :: !Word8
+  , _acqSvProfileDep_status   :: !uint32
     -- ^ Acquisition status 1 is Success, 0 is Failure
-  , _acqSvProfileDep_cn0      :: !Word16
+  , _acqSvProfileDep_cn0      :: !uint32
     -- ^ CN0 value. Only valid if status is '1'
-  , _acqSvProfileDep_int_time :: !Word8
+  , _acqSvProfileDep_int_time :: !uint32
     -- ^ Acquisition integration time
   , _acqSvProfileDep_sid      :: !GnssSignalDep
     -- ^ GNSS signal for which acquisition was attempted
-  , _acqSvProfileDep_bin_width :: !Word16
+  , _acqSvProfileDep_bin_width :: !uint32
     -- ^ Acq frequency bin width
-  , _acqSvProfileDep_timestamp :: !Word32
+  , _acqSvProfileDep_timestamp :: !uint32
     -- ^ Timestamp of the job complete event
-  , _acqSvProfileDep_time_spent :: !Word32
+  , _acqSvProfileDep_time_spent :: !uint32
     -- ^ Time spent to search for sid.code
-  , _acqSvProfileDep_cf_min   :: !Int32
+  , _acqSvProfileDep_cf_min   :: !sint32
     -- ^ Doppler range lowest frequency
-  , _acqSvProfileDep_cf_max   :: !Int32
+  , _acqSvProfileDep_cf_max   :: !sint32
     -- ^ Doppler range highest frequency
-  , _acqSvProfileDep_cf       :: !Int32
+  , _acqSvProfileDep_cf       :: !sint32
     -- ^ Doppler value of detected peak. Only valid if status is '1'
-  , _acqSvProfileDep_cp       :: !Word32
+  , _acqSvProfileDep_cp       :: !uint32
     -- ^ Codephase of detected peak. Only valid if status is '1'
   } deriving ( Show, Read, Eq )
 
@@ -318,7 +318,7 @@
 -- The message describes all SV profiles during acquisition time. The message
 -- is used to debug and measure the performance.
 data MsgAcqSvProfile = MsgAcqSvProfile
-  { _msgAcqSvProfile_acq_sv_profile :: ![AcqSvProfile]
+  { _msgAcqSvProfile_acq_sv_profile :: !repeated AcqSvProfile
     -- ^ SV profiles during acquisition time
   } deriving ( Show, Read, Eq )
 
@@ -341,7 +341,7 @@
 --
 -- Deprecated.
 data MsgAcqSvProfileDep = MsgAcqSvProfileDep
-  { _msgAcqSvProfileDep_acq_sv_profile :: ![AcqSvProfileDep]
+  { _msgAcqSvProfileDep_acq_sv_profile :: !repeated AcqSvProfileDep
     -- ^ SV profiles during acquisition time
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Bootload.hs b/src/SwiftNav/SBP/Bootload.hs
--- a/src/SwiftNav/SBP/Bootload.hs
+++ b/src/SwiftNav/SBP/Bootload.hs
@@ -68,9 +68,9 @@
 -- MSG_BOOTLOADER_HANDSHAKE_REQ.  The payload contains the bootloader version
 -- number and the SBP protocol version number.
 data MsgBootloaderHandshakeResp = MsgBootloaderHandshakeResp
-  { _msgBootloaderHandshakeResp_flags :: !Word32
+  { _msgBootloaderHandshakeResp_flags :: !uint32
     -- ^ Bootloader flags
-  , _msgBootloaderHandshakeResp_version :: !Text
+  , _msgBootloaderHandshakeResp_version :: !string
     -- ^ Bootloader version number
   } deriving ( Show, Read, Eq )
 
@@ -95,7 +95,7 @@
 --
 -- The host initiates the bootloader to jump to the application.
 data MsgBootloaderJumpToApp = MsgBootloaderJumpToApp
-  { _msgBootloaderJumpToApp_jump :: !Word8
+  { _msgBootloaderJumpToApp_jump :: !uint32
     -- ^ Ignored by the device
   } deriving ( Show, Read, Eq )
 
@@ -146,7 +146,7 @@
 -- that this ID is tied to the FPGA, and not related to the Piksi's serial
 -- number.
 data MsgNapDeviceDnaResp = MsgNapDeviceDnaResp
-  { _msgNapDeviceDnaResp_dna :: ![Word8]
+  { _msgNapDeviceDnaResp_dna :: !repeated uint32
     -- ^ 57-bit SwiftNAP FPGA Device ID. Remaining bits are padded on the right.
   } deriving ( Show, Read, Eq )
 
@@ -169,7 +169,7 @@
 --
 -- Deprecated.
 data MsgBootloaderHandshakeDepA = MsgBootloaderHandshakeDepA
-  { _msgBootloaderHandshakeDepA_handshake :: ![Word8]
+  { _msgBootloaderHandshakeDepA_handshake :: !repeated uint32
     -- ^ Version number string (not NULL terminated)
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/ExtEvents.hs b/src/SwiftNav/SBP/ExtEvents.hs
--- a/src/SwiftNav/SBP/ExtEvents.hs
+++ b/src/SwiftNav/SBP/ExtEvents.hs
@@ -44,16 +44,16 @@
 -- Reports detection of an external event, the GPS time it occurred, which pin
 -- it was and whether it was rising or falling.
 data MsgExtEvent = MsgExtEvent
-  { _msgExtEvent_wn        :: !Word16
+  { _msgExtEvent_wn        :: !uint32
     -- ^ GPS week number
-  , _msgExtEvent_tow       :: !Word32
+  , _msgExtEvent_tow       :: !uint32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgExtEvent_ns_residual :: !Int32
+  , _msgExtEvent_ns_residual :: !sint32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgExtEvent_flags     :: !Word8
+  , _msgExtEvent_flags     :: !uint32
     -- ^ Flags
-  , _msgExtEvent_pin       :: !Word8
+  , _msgExtEvent_pin       :: !uint32
     -- ^ Pin number.  0..9 = DEBUG0..9.
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/FileIo.hs b/src/SwiftNav/SBP/FileIo.hs
--- a/src/SwiftNav/SBP/FileIo.hs
+++ b/src/SwiftNav/SBP/FileIo.hs
@@ -53,13 +53,13 @@
 -- fileio read message". A device will only respond to this message when it is
 -- received from sender ID 0x42.
 data MsgFileioReadReq = MsgFileioReadReq
-  { _msgFileioReadReq_sequence :: !Word32
+  { _msgFileioReadReq_sequence :: !uint32
     -- ^ Read sequence number
-  , _msgFileioReadReq_offset   :: !Word32
+  , _msgFileioReadReq_offset   :: !uint32
     -- ^ File offset
-  , _msgFileioReadReq_chunk_size :: !Word8
+  , _msgFileioReadReq_chunk_size :: !uint32
     -- ^ Chunk size to read
-  , _msgFileioReadReq_filename :: !Text
+  , _msgFileioReadReq_filename :: !string
     -- ^ Name of the file to read from
   } deriving ( Show, Read, Eq )
 
@@ -91,9 +91,9 @@
 -- length field indicates how many bytes were succesfully read. The sequence
 -- number in the response is preserved from the request.
 data MsgFileioReadResp = MsgFileioReadResp
-  { _msgFileioReadResp_sequence :: !Word32
+  { _msgFileioReadResp_sequence :: !uint32
     -- ^ Read sequence number
-  , _msgFileioReadResp_contents :: ![Word8]
+  , _msgFileioReadResp_contents :: !repeated uint32
     -- ^ Contents of read file
   } deriving ( Show, Read, Eq )
 
@@ -125,11 +125,11 @@
 -- MSG_PRINT message will print "Invalid fileio read message". A device will
 -- only respond to this message when it is received from sender ID 0x42.
 data MsgFileioReadDirReq = MsgFileioReadDirReq
-  { _msgFileioReadDirReq_sequence :: !Word32
+  { _msgFileioReadDirReq_sequence :: !uint32
     -- ^ Read sequence number
-  , _msgFileioReadDirReq_offset :: !Word32
+  , _msgFileioReadDirReq_offset :: !uint32
     -- ^ The offset to skip the first n elements of the file list
-  , _msgFileioReadDirReq_dirname :: !Text
+  , _msgFileioReadDirReq_dirname :: !string
     -- ^ Name of the directory to list
   } deriving ( Show, Read, Eq )
 
@@ -160,9 +160,9 @@
 -- of the list is identified by an entry containing just the character 0xFF.
 -- The sequence number in the response is preserved from the request.
 data MsgFileioReadDirResp = MsgFileioReadDirResp
-  { _msgFileioReadDirResp_sequence :: !Word32
+  { _msgFileioReadDirResp_sequence :: !uint32
     -- ^ Read sequence number
-  , _msgFileioReadDirResp_contents :: ![Word8]
+  , _msgFileioReadDirResp_contents :: !repeated uint32
     -- ^ Contents of read directory
   } deriving ( Show, Read, Eq )
 
@@ -190,7 +190,7 @@
 -- message". A device will only process this message when it is received from
 -- sender ID 0x42.
 data MsgFileioRemove = MsgFileioRemove
-  { _msgFileioRemove_filename :: !Text
+  { _msgFileioRemove_filename :: !string
     -- ^ Name of the file to delete
   } deriving ( Show, Read, Eq )
 
@@ -219,13 +219,13 @@
 -- message". A device will only  process this message when it is received from
 -- sender ID 0x42.
 data MsgFileioWriteReq = MsgFileioWriteReq
-  { _msgFileioWriteReq_sequence :: !Word32
+  { _msgFileioWriteReq_sequence :: !uint32
     -- ^ Write sequence number
-  , _msgFileioWriteReq_offset :: !Word32
+  , _msgFileioWriteReq_offset :: !uint32
     -- ^ Offset into the file at which to start writing in bytes
-  , _msgFileioWriteReq_filename :: !Text
+  , _msgFileioWriteReq_filename :: !string
     -- ^ Name of the file to write to
-  , _msgFileioWriteReq_data   :: ![Word8]
+  , _msgFileioWriteReq_data   :: !repeated uint32
     -- ^ Variable-length array of data to write
   } deriving ( Show, Read, Eq )
 
@@ -257,7 +257,7 @@
 -- MSG_FILEIO_WRITE_REQ message to check integrity of the write. The sequence
 -- number in the response is preserved from the request.
 data MsgFileioWriteResp = MsgFileioWriteResp
-  { _msgFileioWriteResp_sequence :: !Word32
+  { _msgFileioWriteResp_sequence :: !uint32
     -- ^ Write sequence number
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Flash.hs b/src/SwiftNav/SBP/Flash.hs
--- a/src/SwiftNav/SBP/Flash.hs
+++ b/src/SwiftNav/SBP/Flash.hs
@@ -49,13 +49,13 @@
 -- if the maximum write size is exceeded. Note that the sector-containing
 -- addresses must be erased before addresses can be programmed.
 data MsgFlashProgram = MsgFlashProgram
-  { _msgFlashProgram_target   :: !Word8
+  { _msgFlashProgram_target   :: !uint32
     -- ^ Target flags
-  , _msgFlashProgram_addr_start :: ![Word8]
+  , _msgFlashProgram_addr_start :: !repeated uint32
     -- ^ Starting address offset to program
-  , _msgFlashProgram_addr_len :: !Word8
+  , _msgFlashProgram_addr_len :: !uint32
     -- ^ Length of set of addresses to program, counting up from starting address
-  , _msgFlashProgram_data     :: ![Word8]
+  , _msgFlashProgram_data     :: !repeated uint32
     -- ^ Data to program addresses with, with length N=addr_len
   } deriving ( Show, Read, Eq )
 
@@ -87,7 +87,7 @@
 -- MSG_FLASH_READ_REQ, or MSG_FLASH_PROGRAM, may return this message on
 -- failure.
 data MsgFlashDone = MsgFlashDone
-  { _msgFlashDone_response :: !Word8
+  { _msgFlashDone_response :: !uint32
     -- ^ Response flags
   } deriving ( Show, Read, Eq )
 
@@ -115,11 +115,11 @@
 -- exceeded or FLASH_INVALID_ADDR (3) if the address is outside of the allowed
 -- range.
 data MsgFlashReadReq = MsgFlashReadReq
-  { _msgFlashReadReq_target   :: !Word8
+  { _msgFlashReadReq_target   :: !uint32
     -- ^ Target flags
-  , _msgFlashReadReq_addr_start :: ![Word8]
+  , _msgFlashReadReq_addr_start :: !repeated uint32
     -- ^ Starting address offset to read from
-  , _msgFlashReadReq_addr_len :: !Word8
+  , _msgFlashReadReq_addr_len :: !uint32
     -- ^ Length of set of addresses to read, counting up from starting address
   } deriving ( Show, Read, Eq )
 
@@ -151,11 +151,11 @@
 -- exceeded or FLASH_INVALID_ADDR (3) if the address is outside of the allowed
 -- range.
 data MsgFlashReadResp = MsgFlashReadResp
-  { _msgFlashReadResp_target   :: !Word8
+  { _msgFlashReadResp_target   :: !uint32
     -- ^ Target flags
-  , _msgFlashReadResp_addr_start :: ![Word8]
+  , _msgFlashReadResp_addr_start :: !repeated uint32
     -- ^ Starting address offset to read from
-  , _msgFlashReadResp_addr_len :: !Word8
+  , _msgFlashReadResp_addr_len :: !uint32
     -- ^ Length of set of addresses to read, counting up from starting address
   } deriving ( Show, Read, Eq )
 
@@ -185,9 +185,9 @@
 -- message containing the return code - FLASH_OK (0) on success or
 -- FLASH_INVALID_FLASH (1) if the flash specified is invalid.
 data MsgFlashErase = MsgFlashErase
-  { _msgFlashErase_target   :: !Word8
+  { _msgFlashErase_target   :: !uint32
     -- ^ Target flags
-  , _msgFlashErase_sector_num :: !Word32
+  , _msgFlashErase_sector_num :: !uint32
     -- ^ Flash sector number to erase (0-11 for the STM, 0-15 for the M25)
   } deriving ( Show, Read, Eq )
 
@@ -213,7 +213,7 @@
 -- The flash lock message locks a sector of the STM flash memory. The device
 -- replies with a MSG_FLASH_DONE message.
 data MsgStmFlashLockSector = MsgStmFlashLockSector
-  { _msgStmFlashLockSector_sector :: !Word32
+  { _msgStmFlashLockSector_sector :: !uint32
     -- ^ Flash sector number to lock
   } deriving ( Show, Read, Eq )
 
@@ -237,7 +237,7 @@
 -- The flash unlock message unlocks a sector of the STM flash memory. The
 -- device replies with a MSG_FLASH_DONE message.
 data MsgStmFlashUnlockSector = MsgStmFlashUnlockSector
-  { _msgStmFlashUnlockSector_sector :: !Word32
+  { _msgStmFlashUnlockSector_sector :: !uint32
     -- ^ Flash sector number to unlock
   } deriving ( Show, Read, Eq )
 
@@ -283,7 +283,7 @@
 -- ID by sending a MSG_STM_UNIQUE_ID_REQ. The device responds with a
 -- MSG_STM_UNIQUE_ID_RESP with the 12-byte unique ID in the payload..
 data MsgStmUniqueIdResp = MsgStmUniqueIdResp
-  { _msgStmUniqueIdResp_stm_id :: ![Word8]
+  { _msgStmUniqueIdResp_stm_id :: !repeated uint32
     -- ^ Device unique ID
   } deriving ( Show, Read, Eq )
 
@@ -307,7 +307,7 @@
 -- The flash status message writes to the 8-bit M25 flash status register. The
 -- device replies with a MSG_FLASH_DONE message.
 data MsgM25FlashWriteStatus = MsgM25FlashWriteStatus
-  { _msgM25FlashWriteStatus_status :: ![Word8]
+  { _msgM25FlashWriteStatus_status :: !repeated uint32
     -- ^ Byte to write to the M25 flash status register
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Gnss.hs b/src/SwiftNav/SBP/Gnss.hs
--- a/src/SwiftNav/SBP/Gnss.hs
+++ b/src/SwiftNav/SBP/Gnss.hs
@@ -39,9 +39,9 @@
 --
 -- Signal identifier containing constellation, band, and satellite identifier
 data GnssSignal = GnssSignal
-  { _gnssSignal_sat :: !Word8
+  { _gnssSignal_sat :: !uint32
     -- ^ Constellation-specific satellite identifier
-  , _gnssSignal_code :: !Word8
+  , _gnssSignal_code :: !uint32
     -- ^ Signal constellation, band and code
   } deriving ( Show, Read, Eq )
 
@@ -62,13 +62,13 @@
 --
 -- Deprecated.
 data GnssSignalDep = GnssSignalDep
-  { _gnssSignalDep_sat    :: !Word16
+  { _gnssSignalDep_sat    :: !uint32
     -- ^ Constellation-specific satellite identifier.  Note: unlike GnssSignal,
     -- GPS satellites are encoded as (PRN - 1). Other constellations do not
     -- have this offset.
-  , _gnssSignalDep_code   :: !Word8
+  , _gnssSignalDep_code   :: !uint32
     -- ^ Signal constellation, band and code
-  , _gnssSignalDep_reserved :: !Word8
+  , _gnssSignalDep_reserved :: !uint32
     -- ^ Reserved
   } deriving ( Show, Read, Eq )
 
@@ -92,9 +92,9 @@
 -- A wire-appropriate GPS time, defined as the number of milliseconds since
 -- beginning of the week on the Saturday/Sunday transition.
 data GpsTimeDep = GpsTimeDep
-  { _gpsTimeDep_tow :: !Word32
+  { _gpsTimeDep_tow :: !uint32
     -- ^ Milliseconds since start of GPS week
-  , _gpsTimeDep_wn :: !Word16
+  , _gpsTimeDep_wn :: !uint32
     -- ^ GPS week number
   } deriving ( Show, Read, Eq )
 
@@ -116,9 +116,9 @@
 -- A GPS time, defined as the number of seconds since beginning of the week on
 -- the Saturday/Sunday transition.
 data GpsTimeSec = GpsTimeSec
-  { _gpsTimeSec_tow :: !Word32
+  { _gpsTimeSec_tow :: !uint32
     -- ^ Seconds since start of GPS week
-  , _gpsTimeSec_wn :: !Word16
+  , _gpsTimeSec_wn :: !uint32
     -- ^ GPS week number
   } deriving ( Show, Read, Eq )
 
@@ -141,12 +141,12 @@
 -- beginning of the week on the Saturday/Sunday transition. In most cases,
 -- observations are epoch aligned so ns field will be 0.
 data GpsTime = GpsTime
-  { _gpsTime_tow       :: !Word32
+  { _gpsTime_tow       :: !uint32
     -- ^ Milliseconds since start of GPS week
-  , _gpsTime_ns_residual :: !Int32
+  , _gpsTime_ns_residual :: !sint32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _gpsTime_wn        :: !Word16
+  , _gpsTime_wn        :: !uint32
     -- ^ GPS week number
   } deriving ( Show, Read, Eq )
 
@@ -171,9 +171,9 @@
 -- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of
 -- fractional cycles. This phase has the same sign as the pseudorange.
 data CarrierPhase = CarrierPhase
-  { _carrierPhase_i :: !Int32
+  { _carrierPhase_i :: !sint32
     -- ^ Carrier phase whole cycles
-  , _carrierPhase_f :: !Word8
+  , _carrierPhase_f :: !uint32
     -- ^ Carrier phase fractional part
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Imu.hs b/src/SwiftNav/SBP/Imu.hs
--- a/src/SwiftNav/SBP/Imu.hs
+++ b/src/SwiftNav/SBP/Imu.hs
@@ -44,22 +44,22 @@
 -- gyroscope readings. The sense of the measurements are to be aligned with
 -- the indications on the device itself.
 data MsgImuRaw = MsgImuRaw
-  { _msgImuRaw_tow :: !Word32
+  { _msgImuRaw_tow :: !uint32
     -- ^ Milliseconds since start of GPS week. If the high bit is set, the time
     -- is unknown or invalid.
-  , _msgImuRaw_tow_f :: !Word8
+  , _msgImuRaw_tow_f :: !uint32
     -- ^ Milliseconds since start of GPS week, fractional part
-  , _msgImuRaw_acc_x :: !Int16
+  , _msgImuRaw_acc_x :: !sint32
     -- ^ Acceleration in the IMU frame X axis
-  , _msgImuRaw_acc_y :: !Int16
+  , _msgImuRaw_acc_y :: !sint32
     -- ^ Acceleration in the IMU frame Y axis
-  , _msgImuRaw_acc_z :: !Int16
+  , _msgImuRaw_acc_z :: !sint32
     -- ^ Acceleration in the IMU frame Z axis
-  , _msgImuRaw_gyr_x :: !Int16
+  , _msgImuRaw_gyr_x :: !sint32
     -- ^ Angular rate around IMU frame X axis
-  , _msgImuRaw_gyr_y :: !Int16
+  , _msgImuRaw_gyr_y :: !sint32
     -- ^ Angular rate around IMU frame Y axis
-  , _msgImuRaw_gyr_z :: !Int16
+  , _msgImuRaw_gyr_z :: !sint32
     -- ^ Angular rate around IMU frame Z axis
   } deriving ( Show, Read, Eq )
 
@@ -98,11 +98,11 @@
 -- always be consistent but the rest of the payload is device specific and
 -- depends on the value of `imu_type`.
 data MsgImuAux = MsgImuAux
-  { _msgImuAux_imu_type :: !Word8
+  { _msgImuAux_imu_type :: !uint32
     -- ^ IMU type
-  , _msgImuAux_temp   :: !Int16
+  , _msgImuAux_temp   :: !sint32
     -- ^ Raw IMU temperature
-  , _msgImuAux_imu_conf :: !Word8
+  , _msgImuAux_imu_conf :: !uint32
     -- ^ IMU configuration
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Logging.hs b/src/SwiftNav/SBP/Logging.hs
--- a/src/SwiftNav/SBP/Logging.hs
+++ b/src/SwiftNav/SBP/Logging.hs
@@ -44,9 +44,9 @@
 -- containing errors, warnings and informational messages at ERROR, WARNING,
 -- DEBUG, INFO logging levels.
 data MsgLog = MsgLog
-  { _msgLog_level :: !Word8
+  { _msgLog_level :: !uint32
     -- ^ Logging level
-  , _msgLog_text :: !Text
+  , _msgLog_text :: !string
     -- ^ Human-readable string
   } deriving ( Show, Read, Eq )
 
@@ -77,11 +77,11 @@
 -- Protocol 0 represents SBP and the remaining values are implementation
 -- defined.
 data MsgFwd = MsgFwd
-  { _msgFwd_source    :: !Word8
+  { _msgFwd_source    :: !uint32
     -- ^ source identifier
-  , _msgFwd_protocol  :: !Word8
+  , _msgFwd_protocol  :: !uint32
     -- ^ protocol identifier
-  , _msgFwd_fwd_payload :: !Text
+  , _msgFwd_fwd_payload :: !string
     -- ^ variable length wrapped binary message
   } deriving ( Show, Read, Eq )
 
@@ -108,7 +108,7 @@
 --
 -- All the news fit to tweet.
 data MsgTweet = MsgTweet
-  { _msgTweet_tweet :: !Text
+  { _msgTweet_tweet :: !string
     -- ^ Human-readable string
   } deriving ( Show, Read, Eq )
 
@@ -131,7 +131,7 @@
 --
 -- Deprecated.
 data MsgPrintDep = MsgPrintDep
-  { _msgPrintDep_text :: !Text
+  { _msgPrintDep_text :: !string
     -- ^ Human-readable string
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Mag.hs b/src/SwiftNav/SBP/Mag.hs
--- a/src/SwiftNav/SBP/Mag.hs
+++ b/src/SwiftNav/SBP/Mag.hs
@@ -42,16 +42,16 @@
 --
 -- Raw data from the magnetometer.
 data MsgMagRaw = MsgMagRaw
-  { _msgMagRaw_tow :: !Word32
+  { _msgMagRaw_tow :: !uint32
     -- ^ Milliseconds since start of GPS week. If the high bit is set, the time
     -- is unknown or invalid.
-  , _msgMagRaw_tow_f :: !Word8
+  , _msgMagRaw_tow_f :: !uint32
     -- ^ Milliseconds since start of GPS week, fractional part
-  , _msgMagRaw_mag_x :: !Int16
+  , _msgMagRaw_mag_x :: !sint32
     -- ^ Magnetic field in the body frame X axis
-  , _msgMagRaw_mag_y :: !Int16
+  , _msgMagRaw_mag_y :: !sint32
     -- ^ Magnetic field in the body frame Y axis
-  , _msgMagRaw_mag_z :: !Int16
+  , _msgMagRaw_mag_z :: !sint32
     -- ^ Magnetic field in the body frame Z axis
   } deriving ( Show, Read, Eq )
 
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
@@ -63,14 +63,14 @@
 -- other navigation messages referenced to the same time (but lacking the ns
 -- field) and indicates a more precise time of these messages.
 data MsgGpsTime = MsgGpsTime
-  { _msgGpsTime_wn        :: !Word16
+  { _msgGpsTime_wn        :: !uint32
     -- ^ GPS week number
-  , _msgGpsTime_tow       :: !Word32
+  , _msgGpsTime_tow       :: !uint32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgGpsTime_ns_residual :: !Int32
+  , _msgGpsTime_ns_residual :: !sint32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgGpsTime_flags     :: !Word8
+  , _msgGpsTime_flags     :: !uint32
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -101,23 +101,23 @@
 -- which indicate the source of the UTC offset value and source of the time
 -- fix.
 data MsgUtcTime = MsgUtcTime
-  { _msgUtcTime_flags :: !Word8
+  { _msgUtcTime_flags :: !uint32
     -- ^ Indicates source and time validity
-  , _msgUtcTime_tow   :: !Word32
+  , _msgUtcTime_tow   :: !uint32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgUtcTime_year  :: !Word16
+  , _msgUtcTime_year  :: !uint32
     -- ^ Year
-  , _msgUtcTime_month :: !Word8
+  , _msgUtcTime_month :: !uint32
     -- ^ Month (range 1 .. 12)
-  , _msgUtcTime_day   :: !Word8
+  , _msgUtcTime_day   :: !uint32
     -- ^ days in the month (range 1-31)
-  , _msgUtcTime_hours :: !Word8
+  , _msgUtcTime_hours :: !uint32
     -- ^ hours of day (range 0-23)
-  , _msgUtcTime_minutes :: !Word8
+  , _msgUtcTime_minutes :: !uint32
     -- ^ minutes of hour (range 0-59)
-  , _msgUtcTime_seconds :: !Word8
+  , _msgUtcTime_seconds :: !uint32
     -- ^ seconds of minute (range 0-60) rounded down
-  , _msgUtcTime_ns    :: !Word32
+  , _msgUtcTime_ns    :: !uint32
     -- ^ nanoseconds of second (range 0-999999999)
   } deriving ( Show, Read, Eq )
 
@@ -159,19 +159,19 @@
 -- indicated whether the DOP reported corresponds to differential or SPP
 -- solution.
 data MsgDops = MsgDops
-  { _msgDops_tow :: !Word32
+  { _msgDops_tow :: !uint32
     -- ^ GPS Time of Week
-  , _msgDops_gdop :: !Word16
+  , _msgDops_gdop :: !uint32
     -- ^ Geometric Dilution of Precision
-  , _msgDops_pdop :: !Word16
+  , _msgDops_pdop :: !uint32
     -- ^ Position Dilution of Precision
-  , _msgDops_tdop :: !Word16
+  , _msgDops_tdop :: !uint32
     -- ^ Time Dilution of Precision
-  , _msgDops_hdop :: !Word16
+  , _msgDops_hdop :: !uint32
     -- ^ Horizontal Dilution of Precision
-  , _msgDops_vdop :: !Word16
+  , _msgDops_vdop :: !uint32
     -- ^ Vertical Dilution of Precision
-  , _msgDops_flags :: !Word8
+  , _msgDops_flags :: !uint32
     -- ^ Indicates the position solution with which the DOPS message corresponds
   } deriving ( Show, Read, Eq )
 
@@ -212,19 +212,19 @@
 -- baseline vector. The full GPS time is given by the preceding MSG_GPS_TIME
 -- with the matching time-of-week (tow).
 data MsgPosEcef = MsgPosEcef
-  { _msgPosEcef_tow    :: !Word32
+  { _msgPosEcef_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosEcef_x      :: !Double
+  , _msgPosEcef_x      :: !double
     -- ^ ECEF X coordinate
-  , _msgPosEcef_y      :: !Double
+  , _msgPosEcef_y      :: !double
     -- ^ ECEF Y coordinate
-  , _msgPosEcef_z      :: !Double
+  , _msgPosEcef_z      :: !double
     -- ^ ECEF Z coordinate
-  , _msgPosEcef_accuracy :: !Word16
+  , _msgPosEcef_accuracy :: !uint32
     -- ^ Position estimated standard deviation
-  , _msgPosEcef_n_sats :: !Word8
+  , _msgPosEcef_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgPosEcef_flags  :: !Word8
+  , _msgPosEcef_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -266,29 +266,29 @@
 -- baseline vector. The full GPS time is given by the preceding MSG_GPS_TIME
 -- with the matching time-of-week (tow).
 data MsgPosEcefCov = MsgPosEcefCov
-  { _msgPosEcefCov_tow   :: !Word32
+  { _msgPosEcefCov_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosEcefCov_x     :: !Double
+  , _msgPosEcefCov_x     :: !double
     -- ^ ECEF X coordinate
-  , _msgPosEcefCov_y     :: !Double
+  , _msgPosEcefCov_y     :: !double
     -- ^ ECEF Y coordinate
-  , _msgPosEcefCov_z     :: !Double
+  , _msgPosEcefCov_z     :: !double
     -- ^ ECEF Z coordinate
-  , _msgPosEcefCov_cov_x_x :: !Float
+  , _msgPosEcefCov_cov_x_x :: !float
     -- ^ Estimated variance of x
-  , _msgPosEcefCov_cov_x_y :: !Float
+  , _msgPosEcefCov_cov_x_y :: !float
     -- ^ Estimated covariance of x and y
-  , _msgPosEcefCov_cov_x_z :: !Float
+  , _msgPosEcefCov_cov_x_z :: !float
     -- ^ Estimated covariance of x and z
-  , _msgPosEcefCov_cov_y_y :: !Float
+  , _msgPosEcefCov_cov_y_y :: !float
     -- ^ Estimated variance of y
-  , _msgPosEcefCov_cov_y_z :: !Float
+  , _msgPosEcefCov_cov_y_z :: !float
     -- ^ Estimated covariance of y and z
-  , _msgPosEcefCov_cov_z_z :: !Float
+  , _msgPosEcefCov_cov_z_z :: !float
     -- ^ Estimated variance of z
-  , _msgPosEcefCov_n_sats :: !Word8
+  , _msgPosEcefCov_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgPosEcefCov_flags :: !Word8
+  , _msgPosEcefCov_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -339,21 +339,21 @@
 -- time is given by the preceding MSG_GPS_TIME with the matching time-of-week
 -- (tow).
 data MsgPosLlh = MsgPosLlh
-  { _msgPosLlh_tow      :: !Word32
+  { _msgPosLlh_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosLlh_lat      :: !Double
+  , _msgPosLlh_lat      :: !double
     -- ^ Latitude
-  , _msgPosLlh_lon      :: !Double
+  , _msgPosLlh_lon      :: !double
     -- ^ Longitude
-  , _msgPosLlh_height   :: !Double
+  , _msgPosLlh_height   :: !double
     -- ^ Height above WGS84 ellipsoid
-  , _msgPosLlh_h_accuracy :: !Word16
+  , _msgPosLlh_h_accuracy :: !uint32
     -- ^ Horizontal position estimated standard deviation
-  , _msgPosLlh_v_accuracy :: !Word16
+  , _msgPosLlh_v_accuracy :: !uint32
     -- ^ Vertical position estimated standard deviation
-  , _msgPosLlh_n_sats   :: !Word8
+  , _msgPosLlh_n_sats   :: !uint32
     -- ^ Number of satellites used in solution.
-  , _msgPosLlh_flags    :: !Word8
+  , _msgPosLlh_flags    :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -397,29 +397,29 @@
 -- are reported against the "downward" measurement and care should be taken
 -- with the sign convention.
 data MsgPosLlhCov = MsgPosLlhCov
-  { _msgPosLlhCov_tow   :: !Word32
+  { _msgPosLlhCov_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosLlhCov_lat   :: !Double
+  , _msgPosLlhCov_lat   :: !double
     -- ^ Latitude
-  , _msgPosLlhCov_lon   :: !Double
+  , _msgPosLlhCov_lon   :: !double
     -- ^ Longitude
-  , _msgPosLlhCov_height :: !Double
+  , _msgPosLlhCov_height :: !double
     -- ^ Height above WGS84 ellipsoid
-  , _msgPosLlhCov_cov_n_n :: !Float
+  , _msgPosLlhCov_cov_n_n :: !float
     -- ^ Estimated variance of northing
-  , _msgPosLlhCov_cov_n_e :: !Float
+  , _msgPosLlhCov_cov_n_e :: !float
     -- ^ Covariance of northing and easting
-  , _msgPosLlhCov_cov_n_d :: !Float
+  , _msgPosLlhCov_cov_n_d :: !float
     -- ^ Covariance of northing and downward measurement
-  , _msgPosLlhCov_cov_e_e :: !Float
+  , _msgPosLlhCov_cov_e_e :: !float
     -- ^ Estimated variance of easting
-  , _msgPosLlhCov_cov_e_d :: !Float
+  , _msgPosLlhCov_cov_e_d :: !float
     -- ^ Covariance of easting and downward measurement
-  , _msgPosLlhCov_cov_d_d :: !Float
+  , _msgPosLlhCov_cov_d_d :: !float
     -- ^ Estimated variance of downward measurement
-  , _msgPosLlhCov_n_sats :: !Word8
+  , _msgPosLlhCov_n_sats :: !uint32
     -- ^ Number of satellites used in solution.
-  , _msgPosLlhCov_flags :: !Word8
+  , _msgPosLlhCov_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -467,19 +467,19 @@
 -- base station to the rover receiver. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgBaselineEcef = MsgBaselineEcef
-  { _msgBaselineEcef_tow    :: !Word32
+  { _msgBaselineEcef_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineEcef_x      :: !Int32
+  , _msgBaselineEcef_x      :: !sint32
     -- ^ Baseline ECEF X coordinate
-  , _msgBaselineEcef_y      :: !Int32
+  , _msgBaselineEcef_y      :: !sint32
     -- ^ Baseline ECEF Y coordinate
-  , _msgBaselineEcef_z      :: !Int32
+  , _msgBaselineEcef_z      :: !sint32
     -- ^ Baseline ECEF Z coordinate
-  , _msgBaselineEcef_accuracy :: !Word16
+  , _msgBaselineEcef_accuracy :: !uint32
     -- ^ Position estimated standard deviation
-  , _msgBaselineEcef_n_sats :: !Word8
+  , _msgBaselineEcef_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineEcef_flags  :: !Word8
+  , _msgBaselineEcef_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -519,21 +519,21 @@
 -- GPS time is given by the preceding MSG_GPS_TIME with the matching time-of-
 -- week (tow).
 data MsgBaselineNed = MsgBaselineNed
-  { _msgBaselineNed_tow      :: !Word32
+  { _msgBaselineNed_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineNed_n        :: !Int32
+  , _msgBaselineNed_n        :: !sint32
     -- ^ Baseline North coordinate
-  , _msgBaselineNed_e        :: !Int32
+  , _msgBaselineNed_e        :: !sint32
     -- ^ Baseline East coordinate
-  , _msgBaselineNed_d        :: !Int32
+  , _msgBaselineNed_d        :: !sint32
     -- ^ Baseline Down coordinate
-  , _msgBaselineNed_h_accuracy :: !Word16
+  , _msgBaselineNed_h_accuracy :: !uint32
     -- ^ Horizontal position estimated standard deviation
-  , _msgBaselineNed_v_accuracy :: !Word16
+  , _msgBaselineNed_v_accuracy :: !uint32
     -- ^ Vertical position estimated standard deviation
-  , _msgBaselineNed_n_sats   :: !Word8
+  , _msgBaselineNed_n_sats   :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineNed_flags    :: !Word8
+  , _msgBaselineNed_flags    :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -572,19 +572,19 @@
 -- coordinates. The full GPS time is given by the preceding MSG_GPS_TIME with
 -- the matching time-of-week (tow).
 data MsgVelEcef = MsgVelEcef
-  { _msgVelEcef_tow    :: !Word32
+  { _msgVelEcef_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelEcef_x      :: !Int32
+  , _msgVelEcef_x      :: !sint32
     -- ^ Velocity ECEF X coordinate
-  , _msgVelEcef_y      :: !Int32
+  , _msgVelEcef_y      :: !sint32
     -- ^ Velocity ECEF Y coordinate
-  , _msgVelEcef_z      :: !Int32
+  , _msgVelEcef_z      :: !sint32
     -- ^ Velocity ECEF Z coordinate
-  , _msgVelEcef_accuracy :: !Word16
+  , _msgVelEcef_accuracy :: !uint32
     -- ^ Velocity estimated standard deviation
-  , _msgVelEcef_n_sats :: !Word8
+  , _msgVelEcef_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelEcef_flags  :: !Word8
+  , _msgVelEcef_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -621,29 +621,29 @@
 -- coordinates. The full GPS time is given by the preceding MSG_GPS_TIME with
 -- the matching time-of-week (tow).
 data MsgVelEcefCov = MsgVelEcefCov
-  { _msgVelEcefCov_tow   :: !Word32
+  { _msgVelEcefCov_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelEcefCov_x     :: !Int32
+  , _msgVelEcefCov_x     :: !sint32
     -- ^ Velocity ECEF X coordinate
-  , _msgVelEcefCov_y     :: !Int32
+  , _msgVelEcefCov_y     :: !sint32
     -- ^ Velocity ECEF Y coordinate
-  , _msgVelEcefCov_z     :: !Int32
+  , _msgVelEcefCov_z     :: !sint32
     -- ^ Velocity ECEF Z coordinate
-  , _msgVelEcefCov_cov_x_x :: !Float
+  , _msgVelEcefCov_cov_x_x :: !float
     -- ^ Estimated variance of x
-  , _msgVelEcefCov_cov_x_y :: !Float
+  , _msgVelEcefCov_cov_x_y :: !float
     -- ^ Estimated covariance of x and y
-  , _msgVelEcefCov_cov_x_z :: !Float
+  , _msgVelEcefCov_cov_x_z :: !float
     -- ^ Estimated covariance of x and z
-  , _msgVelEcefCov_cov_y_y :: !Float
+  , _msgVelEcefCov_cov_y_y :: !float
     -- ^ Estimated variance of y
-  , _msgVelEcefCov_cov_y_z :: !Float
+  , _msgVelEcefCov_cov_y_z :: !float
     -- ^ Estimated covariance of y and z
-  , _msgVelEcefCov_cov_z_z :: !Float
+  , _msgVelEcefCov_cov_z_z :: !float
     -- ^ Estimated variance of z
-  , _msgVelEcefCov_n_sats :: !Word8
+  , _msgVelEcefCov_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelEcefCov_flags :: !Word8
+  , _msgVelEcefCov_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -691,21 +691,21 @@
 -- plane centered at the current position. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgVelNed = MsgVelNed
-  { _msgVelNed_tow      :: !Word32
+  { _msgVelNed_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelNed_n        :: !Int32
+  , _msgVelNed_n        :: !sint32
     -- ^ Velocity North coordinate
-  , _msgVelNed_e        :: !Int32
+  , _msgVelNed_e        :: !sint32
     -- ^ Velocity East coordinate
-  , _msgVelNed_d        :: !Int32
+  , _msgVelNed_d        :: !sint32
     -- ^ Velocity Down coordinate
-  , _msgVelNed_h_accuracy :: !Word16
+  , _msgVelNed_h_accuracy :: !uint32
     -- ^ Horizontal velocity estimated standard deviation
-  , _msgVelNed_v_accuracy :: !Word16
+  , _msgVelNed_v_accuracy :: !uint32
     -- ^ Vertical velocity estimated standard deviation
-  , _msgVelNed_n_sats   :: !Word8
+  , _msgVelNed_n_sats   :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelNed_flags    :: !Word8
+  , _msgVelNed_flags    :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -747,29 +747,29 @@
 -- similar to the MSG_VEL_NED, but it includes the upper triangular portion of
 -- the 3x3 covariance matrix.
 data MsgVelNedCov = MsgVelNedCov
-  { _msgVelNedCov_tow   :: !Word32
+  { _msgVelNedCov_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelNedCov_n     :: !Int32
+  , _msgVelNedCov_n     :: !sint32
     -- ^ Velocity North coordinate
-  , _msgVelNedCov_e     :: !Int32
+  , _msgVelNedCov_e     :: !sint32
     -- ^ Velocity East coordinate
-  , _msgVelNedCov_d     :: !Int32
+  , _msgVelNedCov_d     :: !sint32
     -- ^ Velocity Down coordinate
-  , _msgVelNedCov_cov_n_n :: !Float
+  , _msgVelNedCov_cov_n_n :: !float
     -- ^ Estimated variance of northward measurement
-  , _msgVelNedCov_cov_n_e :: !Float
+  , _msgVelNedCov_cov_n_e :: !float
     -- ^ Covariance of northward and eastward measurement
-  , _msgVelNedCov_cov_n_d :: !Float
+  , _msgVelNedCov_cov_n_d :: !float
     -- ^ Covariance of northward and downward measurement
-  , _msgVelNedCov_cov_e_e :: !Float
+  , _msgVelNedCov_cov_e_e :: !float
     -- ^ Estimated variance of eastward measurement
-  , _msgVelNedCov_cov_e_d :: !Float
+  , _msgVelNedCov_cov_e_d :: !float
     -- ^ Covariance of eastward and downward measurement
-  , _msgVelNedCov_cov_d_d :: !Float
+  , _msgVelNedCov_cov_d_d :: !float
     -- ^ Estimated variance of downward measurement
-  , _msgVelNedCov_n_sats :: !Word8
+  , _msgVelNedCov_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelNedCov_flags :: !Word8
+  , _msgVelNedCov_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -820,29 +820,29 @@
 -- are specified via the device settings. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgVelBody = MsgVelBody
-  { _msgVelBody_tow   :: !Word32
+  { _msgVelBody_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelBody_x     :: !Int32
+  , _msgVelBody_x     :: !sint32
     -- ^ Velocity in x direction
-  , _msgVelBody_y     :: !Int32
+  , _msgVelBody_y     :: !sint32
     -- ^ Velocity in y direction
-  , _msgVelBody_z     :: !Int32
+  , _msgVelBody_z     :: !sint32
     -- ^ Velocity in z direction
-  , _msgVelBody_cov_x_x :: !Float
+  , _msgVelBody_cov_x_x :: !float
     -- ^ Estimated variance of x
-  , _msgVelBody_cov_x_y :: !Float
+  , _msgVelBody_cov_x_y :: !float
     -- ^ Covariance of x and y
-  , _msgVelBody_cov_x_z :: !Float
+  , _msgVelBody_cov_x_z :: !float
     -- ^ Covariance of x and z
-  , _msgVelBody_cov_y_y :: !Float
+  , _msgVelBody_cov_y_y :: !float
     -- ^ Estimated variance of y
-  , _msgVelBody_cov_y_z :: !Float
+  , _msgVelBody_cov_y_z :: !float
     -- ^ Covariance of y and z
-  , _msgVelBody_cov_z_z :: !Float
+  , _msgVelBody_cov_z_z :: !float
     -- ^ Estimated variance of z
-  , _msgVelBody_n_sats :: !Word8
+  , _msgVelBody_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelBody_flags :: !Word8
+  , _msgVelBody_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -888,9 +888,9 @@
 -- This message reports the Age of the corrections used for the current
 -- Differential solution
 data MsgAgeCorrections = MsgAgeCorrections
-  { _msgAgeCorrections_tow :: !Word32
+  { _msgAgeCorrections_tow :: !uint32
     -- ^ GPS Time of Week
-  , _msgAgeCorrections_age :: !Word16
+  , _msgAgeCorrections_age :: !uint32
     -- ^ Age of the corrections (0xFFFF indicates invalid)
   } deriving ( Show, Read, Eq )
 
@@ -923,14 +923,14 @@
 -- other navigation messages referenced to the same time (but lacking the ns
 -- field) and indicates a more precise time of these messages.
 data MsgGpsTimeDepA = MsgGpsTimeDepA
-  { _msgGpsTimeDepA_wn        :: !Word16
+  { _msgGpsTimeDepA_wn        :: !uint32
     -- ^ GPS week number
-  , _msgGpsTimeDepA_tow       :: !Word32
+  , _msgGpsTimeDepA_tow       :: !uint32
     -- ^ GPS time of week rounded to the nearest millisecond
-  , _msgGpsTimeDepA_ns_residual :: !Int32
+  , _msgGpsTimeDepA_ns_residual :: !sint32
     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to
     -- 500000)
-  , _msgGpsTimeDepA_flags     :: !Word8
+  , _msgGpsTimeDepA_flags     :: !uint32
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -960,17 +960,17 @@
 -- This dilution of precision (DOP) message describes the effect of navigation
 -- satellite geometry on positional measurement precision.
 data MsgDopsDepA = MsgDopsDepA
-  { _msgDopsDepA_tow :: !Word32
+  { _msgDopsDepA_tow :: !uint32
     -- ^ GPS Time of Week
-  , _msgDopsDepA_gdop :: !Word16
+  , _msgDopsDepA_gdop :: !uint32
     -- ^ Geometric Dilution of Precision
-  , _msgDopsDepA_pdop :: !Word16
+  , _msgDopsDepA_pdop :: !uint32
     -- ^ Position Dilution of Precision
-  , _msgDopsDepA_tdop :: !Word16
+  , _msgDopsDepA_tdop :: !uint32
     -- ^ Time Dilution of Precision
-  , _msgDopsDepA_hdop :: !Word16
+  , _msgDopsDepA_hdop :: !uint32
     -- ^ Horizontal Dilution of Precision
-  , _msgDopsDepA_vdop :: !Word16
+  , _msgDopsDepA_vdop :: !uint32
     -- ^ Vertical Dilution of Precision
   } deriving ( Show, Read, Eq )
 
@@ -1009,19 +1009,19 @@
 -- baseline vector. The full GPS time is given by the preceding MSG_GPS_TIME
 -- with the matching time-of-week (tow).
 data MsgPosEcefDepA = MsgPosEcefDepA
-  { _msgPosEcefDepA_tow    :: !Word32
+  { _msgPosEcefDepA_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosEcefDepA_x      :: !Double
+  , _msgPosEcefDepA_x      :: !double
     -- ^ ECEF X coordinate
-  , _msgPosEcefDepA_y      :: !Double
+  , _msgPosEcefDepA_y      :: !double
     -- ^ ECEF Y coordinate
-  , _msgPosEcefDepA_z      :: !Double
+  , _msgPosEcefDepA_z      :: !double
     -- ^ ECEF Z coordinate
-  , _msgPosEcefDepA_accuracy :: !Word16
+  , _msgPosEcefDepA_accuracy :: !uint32
     -- ^ Position accuracy estimate (not implemented). Defaults to 0.
-  , _msgPosEcefDepA_n_sats :: !Word8
+  , _msgPosEcefDepA_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgPosEcefDepA_flags  :: !Word8
+  , _msgPosEcefDepA_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -1062,21 +1062,21 @@
 -- time is given by the preceding MSG_GPS_TIME with the matching time-of-week
 -- (tow).
 data MsgPosLlhDepA = MsgPosLlhDepA
-  { _msgPosLlhDepA_tow      :: !Word32
+  { _msgPosLlhDepA_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgPosLlhDepA_lat      :: !Double
+  , _msgPosLlhDepA_lat      :: !double
     -- ^ Latitude
-  , _msgPosLlhDepA_lon      :: !Double
+  , _msgPosLlhDepA_lon      :: !double
     -- ^ Longitude
-  , _msgPosLlhDepA_height   :: !Double
+  , _msgPosLlhDepA_height   :: !double
     -- ^ Height
-  , _msgPosLlhDepA_h_accuracy :: !Word16
+  , _msgPosLlhDepA_h_accuracy :: !uint32
     -- ^ Horizontal position accuracy estimate (not implemented). Defaults to 0.
-  , _msgPosLlhDepA_v_accuracy :: !Word16
+  , _msgPosLlhDepA_v_accuracy :: !uint32
     -- ^ Vertical position accuracy estimate (not implemented). Defaults to 0.
-  , _msgPosLlhDepA_n_sats   :: !Word8
+  , _msgPosLlhDepA_n_sats   :: !uint32
     -- ^ Number of satellites used in solution.
-  , _msgPosLlhDepA_flags    :: !Word8
+  , _msgPosLlhDepA_flags    :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -1116,19 +1116,19 @@
 -- base station to the rover receiver. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgBaselineEcefDepA = MsgBaselineEcefDepA
-  { _msgBaselineEcefDepA_tow    :: !Word32
+  { _msgBaselineEcefDepA_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineEcefDepA_x      :: !Int32
+  , _msgBaselineEcefDepA_x      :: !sint32
     -- ^ Baseline ECEF X coordinate
-  , _msgBaselineEcefDepA_y      :: !Int32
+  , _msgBaselineEcefDepA_y      :: !sint32
     -- ^ Baseline ECEF Y coordinate
-  , _msgBaselineEcefDepA_z      :: !Int32
+  , _msgBaselineEcefDepA_z      :: !sint32
     -- ^ Baseline ECEF Z coordinate
-  , _msgBaselineEcefDepA_accuracy :: !Word16
+  , _msgBaselineEcefDepA_accuracy :: !uint32
     -- ^ Position accuracy estimate
-  , _msgBaselineEcefDepA_n_sats :: !Word8
+  , _msgBaselineEcefDepA_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineEcefDepA_flags  :: !Word8
+  , _msgBaselineEcefDepA_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -1168,21 +1168,21 @@
 -- GPS time is given by the preceding MSG_GPS_TIME with the matching time-of-
 -- week (tow).
 data MsgBaselineNedDepA = MsgBaselineNedDepA
-  { _msgBaselineNedDepA_tow      :: !Word32
+  { _msgBaselineNedDepA_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineNedDepA_n        :: !Int32
+  , _msgBaselineNedDepA_n        :: !sint32
     -- ^ Baseline North coordinate
-  , _msgBaselineNedDepA_e        :: !Int32
+  , _msgBaselineNedDepA_e        :: !sint32
     -- ^ Baseline East coordinate
-  , _msgBaselineNedDepA_d        :: !Int32
+  , _msgBaselineNedDepA_d        :: !sint32
     -- ^ Baseline Down coordinate
-  , _msgBaselineNedDepA_h_accuracy :: !Word16
+  , _msgBaselineNedDepA_h_accuracy :: !uint32
     -- ^ Horizontal position accuracy estimate (not implemented). Defaults to 0.
-  , _msgBaselineNedDepA_v_accuracy :: !Word16
+  , _msgBaselineNedDepA_v_accuracy :: !uint32
     -- ^ Vertical position accuracy estimate (not implemented). Defaults to 0.
-  , _msgBaselineNedDepA_n_sats   :: !Word8
+  , _msgBaselineNedDepA_n_sats   :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineNedDepA_flags    :: !Word8
+  , _msgBaselineNedDepA_flags    :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -1221,19 +1221,19 @@
 -- coordinates. The full GPS time is given by the preceding MSG_GPS_TIME with
 -- the matching time-of-week (tow).
 data MsgVelEcefDepA = MsgVelEcefDepA
-  { _msgVelEcefDepA_tow    :: !Word32
+  { _msgVelEcefDepA_tow    :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelEcefDepA_x      :: !Int32
+  , _msgVelEcefDepA_x      :: !sint32
     -- ^ Velocity ECEF X coordinate
-  , _msgVelEcefDepA_y      :: !Int32
+  , _msgVelEcefDepA_y      :: !sint32
     -- ^ Velocity ECEF Y coordinate
-  , _msgVelEcefDepA_z      :: !Int32
+  , _msgVelEcefDepA_z      :: !sint32
     -- ^ Velocity ECEF Z coordinate
-  , _msgVelEcefDepA_accuracy :: !Word16
+  , _msgVelEcefDepA_accuracy :: !uint32
     -- ^ Velocity accuracy estimate (not implemented). Defaults to 0.
-  , _msgVelEcefDepA_n_sats :: !Word8
+  , _msgVelEcefDepA_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelEcefDepA_flags  :: !Word8
+  , _msgVelEcefDepA_flags  :: !uint32
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -1271,21 +1271,21 @@
 -- plane centered at the current position. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgVelNedDepA = MsgVelNedDepA
-  { _msgVelNedDepA_tow      :: !Word32
+  { _msgVelNedDepA_tow      :: !uint32
     -- ^ GPS Time of Week
-  , _msgVelNedDepA_n        :: !Int32
+  , _msgVelNedDepA_n        :: !sint32
     -- ^ Velocity North coordinate
-  , _msgVelNedDepA_e        :: !Int32
+  , _msgVelNedDepA_e        :: !sint32
     -- ^ Velocity East coordinate
-  , _msgVelNedDepA_d        :: !Int32
+  , _msgVelNedDepA_d        :: !sint32
     -- ^ Velocity Down coordinate
-  , _msgVelNedDepA_h_accuracy :: !Word16
+  , _msgVelNedDepA_h_accuracy :: !uint32
     -- ^ Horizontal velocity accuracy estimate (not implemented). Defaults to 0.
-  , _msgVelNedDepA_v_accuracy :: !Word16
+  , _msgVelNedDepA_v_accuracy :: !uint32
     -- ^ Vertical velocity accuracy estimate (not implemented). Defaults to 0.
-  , _msgVelNedDepA_n_sats   :: !Word8
+  , _msgVelNedDepA_n_sats   :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgVelNedDepA_flags    :: !Word8
+  , _msgVelNedDepA_flags    :: !uint32
     -- ^ Status flags (reserved)
   } deriving ( Show, Read, Eq )
 
@@ -1324,13 +1324,13 @@
 -- the rover relative to True North. The full GPS time is given by the
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow).
 data MsgBaselineHeadingDepA = MsgBaselineHeadingDepA
-  { _msgBaselineHeadingDepA_tow   :: !Word32
+  { _msgBaselineHeadingDepA_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineHeadingDepA_heading :: !Word32
+  , _msgBaselineHeadingDepA_heading :: !uint32
     -- ^ Heading
-  , _msgBaselineHeadingDepA_n_sats :: !Word8
+  , _msgBaselineHeadingDepA_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineHeadingDepA_flags :: !Word8
+  , _msgBaselineHeadingDepA_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Ndb.hs b/src/SwiftNav/SBP/Ndb.hs
--- a/src/SwiftNav/SBP/Ndb.hs
+++ b/src/SwiftNav/SBP/Ndb.hs
@@ -44,25 +44,25 @@
 -- This message is sent out when an object is stored into NDB. If needed
 -- message could also be sent out when fetching an object from NDB.
 data MsgNdbEvent = MsgNdbEvent
-  { _msgNdbEvent_recv_time     :: !Word64
+  { _msgNdbEvent_recv_time     :: !uint64
     -- ^ HW time in milliseconds.
-  , _msgNdbEvent_event         :: !Word8
+  , _msgNdbEvent_event         :: !uint32
     -- ^ Event type.
-  , _msgNdbEvent_object_type   :: !Word8
+  , _msgNdbEvent_object_type   :: !uint32
     -- ^ Event object type.
-  , _msgNdbEvent_result        :: !Word8
+  , _msgNdbEvent_result        :: !uint32
     -- ^ Event result.
-  , _msgNdbEvent_data_source   :: !Word8
+  , _msgNdbEvent_data_source   :: !uint32
     -- ^ Data source for STORE event, reserved for other events.
-  , _msgNdbEvent_object_sid    :: !GnssSignal
+  , _msgNdbEvent_object_sid    :: !gnss.GnssSignal
     -- ^ GNSS signal identifier, If object_type is Ephemeris OR Almanac, sid
     -- indicates for which signal the object belongs to. Reserved in other
     -- cases.
-  , _msgNdbEvent_src_sid       :: !GnssSignal
+  , _msgNdbEvent_src_sid       :: !gnss.GnssSignal
     -- ^ GNSS signal identifier, If object_type is Almanac, Almanac WN, Iono OR
     -- L2C capabilities AND data_source is NDB_DS_RECEIVER sid indicates from
     -- which SV data was decoded. Reserved in other cases.
-  , _msgNdbEvent_original_sender :: !Word16
+  , _msgNdbEvent_original_sender :: !uint32
     -- ^ A unique identifier of the sending hardware. For v1.0, set to the 2
     -- least significant bytes of the device serial number, valid only if
     -- data_source is NDB_DS_SBP. Reserved in case of other data_source.
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
@@ -40,9 +40,9 @@
 --
 -- Header of a GNSS observation message.
 data ObservationHeader = ObservationHeader
-  { _observationHeader_t   :: !GpsTime
+  { _observationHeader_t   :: !gnss.GpsTime
     -- ^ GNSS time of this observation
-  , _observationHeader_n_obs :: !Word8
+  , _observationHeader_n_obs :: !uint32
     -- ^ Total number of observations. First nibble is the size of the sequence
     -- (n), second nibble is the zero-indexed counter (ith packet of n)
   } deriving ( Show, Read, Eq )
@@ -66,9 +66,9 @@
 -- Q16.8 layout, i.e. 16-bits of whole doppler and 8-bits of fractional
 -- doppler. This doppler is defined as positive for approaching satellites.
 data Doppler = Doppler
-  { _doppler_i :: !Int16
+  { _doppler_i :: !sint32
     -- ^ Doppler whole Hz
-  , _doppler_f :: !Word8
+  , _doppler_f :: !uint32
     -- ^ Doppler fractional part
   } deriving ( Show, Read, Eq )
 
@@ -91,26 +91,26 @@
 -- observations are interoperable with 3rd party receivers and conform with
 -- typical RTCMv3 GNSS observations.
 data PackedObsContent = PackedObsContent
-  { _packedObsContent_P   :: !Word32
+  { _packedObsContent_P   :: !uint32
     -- ^ Pseudorange observation
-  , _packedObsContent_L   :: !CarrierPhase
+  , _packedObsContent_L   :: !gnss.CarrierPhase
     -- ^ Carrier phase observation with typical sign convention.
   , _packedObsContent_D   :: !Doppler
     -- ^ Doppler observation with typical sign convention.
-  , _packedObsContent_cn0 :: !Word8
+  , _packedObsContent_cn0 :: !uint32
     -- ^ Carrier-to-Noise density.  Zero implies invalid cn0.
-  , _packedObsContent_lock :: !Word8
+  , _packedObsContent_lock :: !uint32
     -- ^ Lock timer. This value gives an indication of the time for which a
     -- signal has maintained continuous phase lock. Whenever a signal has lost
     -- and regained lock, this value is reset to zero. It is encoded according
     -- to DF402 from the RTCM 10403.2 Amendment 2 specification.  Valid values
     -- range from 0 to 15 and the most significant nibble is reserved for
     -- future use.
-  , _packedObsContent_flags :: !Word8
+  , _packedObsContent_flags :: !uint32
     -- ^ Measurement status flags. A bit field of flags providing the status of
     -- this observation.  If this field is 0 it means only the Cn0 estimate for
     -- the signal is valid.
-  , _packedObsContent_sid :: !GnssSignal
+  , _packedObsContent_sid :: !gnss.GnssSignal
     -- ^ GNSS signal identifier (16 bit)
   } deriving ( Show, Read, Eq )
 
@@ -151,7 +151,7 @@
 data MsgObs = MsgObs
   { _msgObs_header :: !ObservationHeader
     -- ^ Header of a GPS observation message
-  , _msgObs_obs  :: ![PackedObsContent]
+  , _msgObs_obs  :: !repeated PackedObsContent
     -- ^ Pseudorange and carrier phase observation for a satellite being tracked.
   } deriving ( Show, Read, Eq )
 
@@ -179,11 +179,11 @@
 -- required to be a high-accuracy surveyed location of the base station. Any
 -- error here will result in an error in the pseudo-absolute position output.
 data MsgBasePosLlh = MsgBasePosLlh
-  { _msgBasePosLlh_lat  :: !Double
+  { _msgBasePosLlh_lat  :: !double
     -- ^ Latitude
-  , _msgBasePosLlh_lon  :: !Double
+  , _msgBasePosLlh_lon  :: !double
     -- ^ Longitude
-  , _msgBasePosLlh_height :: !Double
+  , _msgBasePosLlh_height :: !double
     -- ^ Height
   } deriving ( Show, Read, Eq )
 
@@ -214,11 +214,11 @@
 -- accuracy surveyed location of the base station. Any error here will result
 -- in an error in the pseudo-absolute position output.
 data MsgBasePosEcef = MsgBasePosEcef
-  { _msgBasePosEcef_x :: !Double
+  { _msgBasePosEcef_x :: !double
     -- ^ ECEF X coodinate
-  , _msgBasePosEcef_y :: !Double
+  , _msgBasePosEcef_y :: !double
     -- ^ ECEF Y coordinate
-  , _msgBasePosEcef_z :: !Double
+  , _msgBasePosEcef_z :: !double
     -- ^ ECEF Z coordinate
   } deriving ( Show, Read, Eq )
 
@@ -239,17 +239,17 @@
 $(makeLenses ''MsgBasePosEcef)
 
 data EphemerisCommonContent = EphemerisCommonContent
-  { _ephemerisCommonContent_sid        :: !GnssSignal
+  { _ephemerisCommonContent_sid        :: !gnss.GnssSignal
     -- ^ GNSS signal identifier (16 bit)
-  , _ephemerisCommonContent_toe        :: !GpsTimeSec
+  , _ephemerisCommonContent_toe        :: !gnss.GpsTimeSec
     -- ^ Time of Ephemerides
-  , _ephemerisCommonContent_ura        :: !Double
+  , _ephemerisCommonContent_ura        :: !double
     -- ^ User Range Accuracy
-  , _ephemerisCommonContent_fit_interval :: !Word32
+  , _ephemerisCommonContent_fit_interval :: !uint32
     -- ^ Curve fit interval
-  , _ephemerisCommonContent_valid      :: !Word8
+  , _ephemerisCommonContent_valid      :: !uint32
     -- ^ Status of ephemeris, 1 = valid, 0 = invalid
-  , _ephemerisCommonContent_health_bits :: !Word8
+  , _ephemerisCommonContent_health_bits :: !uint32
     -- ^ Satellite health status. GPS: ICD-GPS-200, chapter 20.3.3.3.1.4 SBAS: 0
     -- = valid, non-zero = invalid GLO: 0 = valid, non-zero = invalid
   } deriving ( Show, Read, Eq )
@@ -280,13 +280,13 @@
     -- ^ GNSS signal identifier
   , _ephemerisCommonContentDepA_toe        :: !GpsTimeDep
     -- ^ Time of Ephemerides
-  , _ephemerisCommonContentDepA_ura        :: !Double
+  , _ephemerisCommonContentDepA_ura        :: !double
     -- ^ User Range Accuracy
-  , _ephemerisCommonContentDepA_fit_interval :: !Word32
+  , _ephemerisCommonContentDepA_fit_interval :: !uint32
     -- ^ Curve fit interval
-  , _ephemerisCommonContentDepA_valid      :: !Word8
+  , _ephemerisCommonContentDepA_valid      :: !uint32
     -- ^ Status of ephemeris, 1 = valid, 0 = invalid
-  , _ephemerisCommonContentDepA_health_bits :: !Word8
+  , _ephemerisCommonContentDepA_health_bits :: !uint32
     -- ^ Satellite health status. GPS: ICD-GPS-200, chapter 20.3.3.3.1.4 SBAS: 0
     -- = valid, non-zero = invalid GLO: 0 = valid, non-zero = invalid
   } deriving ( Show, Read, Eq )
@@ -324,53 +324,53 @@
 data MsgEphemerisGpsDepE = MsgEphemerisGpsDepE
   { _msgEphemerisGpsDepE_common :: !EphemerisCommonContentDepA
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGpsDepE_tgd    :: !Double
+  , _msgEphemerisGpsDepE_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisGpsDepE_c_rs   :: !Double
+  , _msgEphemerisGpsDepE_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisGpsDepE_c_rc   :: !Double
+  , _msgEphemerisGpsDepE_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisGpsDepE_c_uc   :: !Double
+  , _msgEphemerisGpsDepE_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisGpsDepE_c_us   :: !Double
+  , _msgEphemerisGpsDepE_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisGpsDepE_c_ic   :: !Double
+  , _msgEphemerisGpsDepE_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisGpsDepE_c_is   :: !Double
+  , _msgEphemerisGpsDepE_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisGpsDepE_dn     :: !Double
+  , _msgEphemerisGpsDepE_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisGpsDepE_m0     :: !Double
+  , _msgEphemerisGpsDepE_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisGpsDepE_ecc    :: !Double
+  , _msgEphemerisGpsDepE_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisGpsDepE_sqrta  :: !Double
+  , _msgEphemerisGpsDepE_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisGpsDepE_omega0 :: !Double
+  , _msgEphemerisGpsDepE_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisGpsDepE_omegadot :: !Double
+  , _msgEphemerisGpsDepE_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisGpsDepE_w      :: !Double
+  , _msgEphemerisGpsDepE_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisGpsDepE_inc    :: !Double
+  , _msgEphemerisGpsDepE_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisGpsDepE_inc_dot :: !Double
+  , _msgEphemerisGpsDepE_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisGpsDepE_af0    :: !Double
+  , _msgEphemerisGpsDepE_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisGpsDepE_af1    :: !Double
+  , _msgEphemerisGpsDepE_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisGpsDepE_af2    :: !Double
+  , _msgEphemerisGpsDepE_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
   , _msgEphemerisGpsDepE_toc    :: !GpsTimeDep
     -- ^ Clock reference
-  , _msgEphemerisGpsDepE_iode   :: !Word8
+  , _msgEphemerisGpsDepE_iode   :: !uint32
     -- ^ Issue of ephemeris data
-  , _msgEphemerisGpsDepE_iodc   :: !Word16
+  , _msgEphemerisGpsDepE_iodc   :: !uint32
     -- ^ Issue of clock data
   } deriving ( Show, Read, Eq )
 
@@ -442,53 +442,53 @@
 data MsgEphemerisGps = MsgEphemerisGps
   { _msgEphemerisGps_common :: !EphemerisCommonContent
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGps_tgd    :: !Double
+  , _msgEphemerisGps_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisGps_c_rs   :: !Double
+  , _msgEphemerisGps_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisGps_c_rc   :: !Double
+  , _msgEphemerisGps_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisGps_c_uc   :: !Double
+  , _msgEphemerisGps_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisGps_c_us   :: !Double
+  , _msgEphemerisGps_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisGps_c_ic   :: !Double
+  , _msgEphemerisGps_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisGps_c_is   :: !Double
+  , _msgEphemerisGps_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisGps_dn     :: !Double
+  , _msgEphemerisGps_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisGps_m0     :: !Double
+  , _msgEphemerisGps_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisGps_ecc    :: !Double
+  , _msgEphemerisGps_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisGps_sqrta  :: !Double
+  , _msgEphemerisGps_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisGps_omega0 :: !Double
+  , _msgEphemerisGps_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisGps_omegadot :: !Double
+  , _msgEphemerisGps_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisGps_w      :: !Double
+  , _msgEphemerisGps_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisGps_inc    :: !Double
+  , _msgEphemerisGps_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisGps_inc_dot :: !Double
+  , _msgEphemerisGps_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisGps_af0    :: !Double
+  , _msgEphemerisGps_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisGps_af1    :: !Double
+  , _msgEphemerisGps_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisGps_af2    :: !Double
+  , _msgEphemerisGps_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemerisGps_toc    :: !GpsTimeSec
+  , _msgEphemerisGps_toc    :: !gnss.GpsTimeSec
     -- ^ Clock reference
-  , _msgEphemerisGps_iode   :: !Word8
+  , _msgEphemerisGps_iode   :: !uint32
     -- ^ Issue of ephemeris data
-  , _msgEphemerisGps_iodc   :: !Word16
+  , _msgEphemerisGps_iodc   :: !uint32
     -- ^ Issue of clock data
   } deriving ( Show, Read, Eq )
 
@@ -554,15 +554,15 @@
 data MsgEphemerisSbasDepA = MsgEphemerisSbasDepA
   { _msgEphemerisSbasDepA_common :: !EphemerisCommonContentDepA
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisSbasDepA_pos  :: ![Double]
+  , _msgEphemerisSbasDepA_pos  :: !repeated double
     -- ^ Position of the GEO at time toe
-  , _msgEphemerisSbasDepA_vel  :: ![Double]
+  , _msgEphemerisSbasDepA_vel  :: !repeated double
     -- ^ Velocity of the GEO at time toe
-  , _msgEphemerisSbasDepA_acc  :: ![Double]
+  , _msgEphemerisSbasDepA_acc  :: !repeated double
     -- ^ Acceleration of the GEO at time toe
-  , _msgEphemerisSbasDepA_a_gf0 :: !Double
+  , _msgEphemerisSbasDepA_a_gf0 :: !double
     -- ^ Time offset of the GEO clock w.r.t. SBAS Network Time
-  , _msgEphemerisSbasDepA_a_gf1 :: !Double
+  , _msgEphemerisSbasDepA_a_gf1 :: !double
     -- ^ Drift of the GEO clock w.r.t. SBAS Network Time
   } deriving ( Show, Read, Eq )
 
@@ -600,15 +600,15 @@
 data MsgEphemerisGloDepA = MsgEphemerisGloDepA
   { _msgEphemerisGloDepA_common :: !EphemerisCommonContentDepA
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGloDepA_gamma :: !Double
+  , _msgEphemerisGloDepA_gamma :: !double
     -- ^ Relative deviation of predicted carrier frequency from nominal
-  , _msgEphemerisGloDepA_tau  :: !Double
+  , _msgEphemerisGloDepA_tau  :: !double
     -- ^ Correction to the SV time
-  , _msgEphemerisGloDepA_pos  :: ![Double]
+  , _msgEphemerisGloDepA_pos  :: !repeated double
     -- ^ Position of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepA_vel  :: ![Double]
+  , _msgEphemerisGloDepA_vel  :: !repeated double
     -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepA_acc  :: ![Double]
+  , _msgEphemerisGloDepA_acc  :: !repeated double
     -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
   } deriving ( Show, Read, Eq )
 
@@ -640,15 +640,15 @@
 data MsgEphemerisSbas = MsgEphemerisSbas
   { _msgEphemerisSbas_common :: !EphemerisCommonContent
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisSbas_pos  :: ![Double]
+  , _msgEphemerisSbas_pos  :: !repeated double
     -- ^ Position of the GEO at time toe
-  , _msgEphemerisSbas_vel  :: ![Double]
+  , _msgEphemerisSbas_vel  :: !repeated double
     -- ^ Velocity of the GEO at time toe
-  , _msgEphemerisSbas_acc  :: ![Double]
+  , _msgEphemerisSbas_acc  :: !repeated double
     -- ^ Acceleration of the GEO at time toe
-  , _msgEphemerisSbas_a_gf0 :: !Double
+  , _msgEphemerisSbas_a_gf0 :: !double
     -- ^ Time offset of the GEO clock w.r.t. SBAS Network Time
-  , _msgEphemerisSbas_a_gf1 :: !Double
+  , _msgEphemerisSbas_a_gf1 :: !double
     -- ^ Drift of the GEO clock w.r.t. SBAS Network Time
   } deriving ( Show, Read, Eq )
 
@@ -686,15 +686,15 @@
 data MsgEphemerisGloDepB = MsgEphemerisGloDepB
   { _msgEphemerisGloDepB_common :: !EphemerisCommonContent
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGloDepB_gamma :: !Double
+  , _msgEphemerisGloDepB_gamma :: !double
     -- ^ Relative deviation of predicted carrier frequency from nominal
-  , _msgEphemerisGloDepB_tau  :: !Double
+  , _msgEphemerisGloDepB_tau  :: !double
     -- ^ Correction to the SV time
-  , _msgEphemerisGloDepB_pos  :: ![Double]
+  , _msgEphemerisGloDepB_pos  :: !repeated double
     -- ^ Position of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepB_vel  :: ![Double]
+  , _msgEphemerisGloDepB_vel  :: !repeated double
     -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepB_acc  :: ![Double]
+  , _msgEphemerisGloDepB_acc  :: !repeated double
     -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
   } deriving ( Show, Read, Eq )
 
@@ -732,19 +732,19 @@
 data MsgEphemerisGloDepC = MsgEphemerisGloDepC
   { _msgEphemerisGloDepC_common :: !EphemerisCommonContent
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGloDepC_gamma :: !Double
+  , _msgEphemerisGloDepC_gamma :: !double
     -- ^ Relative deviation of predicted carrier frequency from nominal
-  , _msgEphemerisGloDepC_tau  :: !Double
+  , _msgEphemerisGloDepC_tau  :: !double
     -- ^ Correction to the SV time
-  , _msgEphemerisGloDepC_d_tau :: !Double
+  , _msgEphemerisGloDepC_d_tau :: !double
     -- ^ Equipment delay between L1 and L2
-  , _msgEphemerisGloDepC_pos  :: ![Double]
+  , _msgEphemerisGloDepC_pos  :: !repeated double
     -- ^ Position of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepC_vel  :: ![Double]
+  , _msgEphemerisGloDepC_vel  :: !repeated double
     -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGloDepC_acc  :: ![Double]
+  , _msgEphemerisGloDepC_acc  :: !repeated double
     -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
-  , _msgEphemerisGloDepC_fcn  :: !Word8
+  , _msgEphemerisGloDepC_fcn  :: !uint32
     -- ^ Frequency slot. FCN+8 (that is [1..14]). 0 or 0xFF for invalid
   } deriving ( Show, Read, Eq )
 
@@ -786,21 +786,21 @@
 data MsgEphemerisGlo = MsgEphemerisGlo
   { _msgEphemerisGlo_common :: !EphemerisCommonContent
     -- ^ Values common for all ephemeris types
-  , _msgEphemerisGlo_gamma :: !Double
+  , _msgEphemerisGlo_gamma :: !double
     -- ^ Relative deviation of predicted carrier frequency from nominal
-  , _msgEphemerisGlo_tau  :: !Double
+  , _msgEphemerisGlo_tau  :: !double
     -- ^ Correction to the SV time
-  , _msgEphemerisGlo_d_tau :: !Double
+  , _msgEphemerisGlo_d_tau :: !double
     -- ^ Equipment delay between L1 and L2
-  , _msgEphemerisGlo_pos  :: ![Double]
+  , _msgEphemerisGlo_pos  :: !repeated double
     -- ^ Position of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGlo_vel  :: ![Double]
+  , _msgEphemerisGlo_vel  :: !repeated double
     -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system
-  , _msgEphemerisGlo_acc  :: ![Double]
+  , _msgEphemerisGlo_acc  :: !repeated double
     -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys
-  , _msgEphemerisGlo_fcn  :: !Word8
+  , _msgEphemerisGlo_fcn  :: !uint32
     -- ^ Frequency slot. FCN+8 (that is [1..14]). 0 or 0xFF for invalid
-  , _msgEphemerisGlo_iod  :: !Word8
+  , _msgEphemerisGlo_iod  :: !uint32
     -- ^ Issue of ephemeris data
   } deriving ( Show, Read, Eq )
 
@@ -842,67 +842,67 @@
 -- see the Navstar GPS Space Segment/Navigation user interfaces (ICD-GPS-200,
 -- Table 20-III) for more details.
 data MsgEphemerisDepD = MsgEphemerisDepD
-  { _msgEphemerisDepD_tgd    :: !Double
+  { _msgEphemerisDepD_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisDepD_c_rs   :: !Double
+  , _msgEphemerisDepD_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisDepD_c_rc   :: !Double
+  , _msgEphemerisDepD_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisDepD_c_uc   :: !Double
+  , _msgEphemerisDepD_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepD_c_us   :: !Double
+  , _msgEphemerisDepD_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepD_c_ic   :: !Double
+  , _msgEphemerisDepD_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepD_c_is   :: !Double
+  , _msgEphemerisDepD_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepD_dn     :: !Double
+  , _msgEphemerisDepD_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisDepD_m0     :: !Double
+  , _msgEphemerisDepD_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisDepD_ecc    :: !Double
+  , _msgEphemerisDepD_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisDepD_sqrta  :: !Double
+  , _msgEphemerisDepD_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisDepD_omega0 :: !Double
+  , _msgEphemerisDepD_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisDepD_omegadot :: !Double
+  , _msgEphemerisDepD_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisDepD_w      :: !Double
+  , _msgEphemerisDepD_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisDepD_inc    :: !Double
+  , _msgEphemerisDepD_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisDepD_inc_dot :: !Double
+  , _msgEphemerisDepD_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisDepD_af0    :: !Double
+  , _msgEphemerisDepD_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisDepD_af1    :: !Double
+  , _msgEphemerisDepD_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisDepD_af2    :: !Double
+  , _msgEphemerisDepD_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemerisDepD_toe_tow :: !Double
+  , _msgEphemerisDepD_toe_tow :: !double
     -- ^ Time of week
-  , _msgEphemerisDepD_toe_wn :: !Word16
+  , _msgEphemerisDepD_toe_wn :: !uint32
     -- ^ Week number
-  , _msgEphemerisDepD_toc_tow :: !Double
+  , _msgEphemerisDepD_toc_tow :: !double
     -- ^ Clock reference time of week
-  , _msgEphemerisDepD_toc_wn :: !Word16
+  , _msgEphemerisDepD_toc_wn :: !uint32
     -- ^ Clock reference week number
-  , _msgEphemerisDepD_valid  :: !Word8
+  , _msgEphemerisDepD_valid  :: !uint32
     -- ^ Is valid?
-  , _msgEphemerisDepD_healthy :: !Word8
+  , _msgEphemerisDepD_healthy :: !uint32
     -- ^ Satellite is healthy?
   , _msgEphemerisDepD_sid    :: !GnssSignalDep
     -- ^ GNSS signal identifier
-  , _msgEphemerisDepD_iode   :: !Word8
+  , _msgEphemerisDepD_iode   :: !uint32
     -- ^ Issue of ephemeris data
-  , _msgEphemerisDepD_iodc   :: !Word16
+  , _msgEphemerisDepD_iodc   :: !uint32
     -- ^ Issue of clock data
-  , _msgEphemerisDepD_reserved :: !Word32
+  , _msgEphemerisDepD_reserved :: !uint32
     -- ^ Reserved field
   } deriving ( Show, Read, Eq )
 
@@ -981,61 +981,61 @@
 --
 -- Deprecated.
 data MsgEphemerisDepA = MsgEphemerisDepA
-  { _msgEphemerisDepA_tgd    :: !Double
+  { _msgEphemerisDepA_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisDepA_c_rs   :: !Double
+  , _msgEphemerisDepA_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisDepA_c_rc   :: !Double
+  , _msgEphemerisDepA_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisDepA_c_uc   :: !Double
+  , _msgEphemerisDepA_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepA_c_us   :: !Double
+  , _msgEphemerisDepA_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepA_c_ic   :: !Double
+  , _msgEphemerisDepA_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepA_c_is   :: !Double
+  , _msgEphemerisDepA_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepA_dn     :: !Double
+  , _msgEphemerisDepA_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisDepA_m0     :: !Double
+  , _msgEphemerisDepA_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisDepA_ecc    :: !Double
+  , _msgEphemerisDepA_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisDepA_sqrta  :: !Double
+  , _msgEphemerisDepA_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisDepA_omega0 :: !Double
+  , _msgEphemerisDepA_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisDepA_omegadot :: !Double
+  , _msgEphemerisDepA_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisDepA_w      :: !Double
+  , _msgEphemerisDepA_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisDepA_inc    :: !Double
+  , _msgEphemerisDepA_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisDepA_inc_dot :: !Double
+  , _msgEphemerisDepA_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisDepA_af0    :: !Double
+  , _msgEphemerisDepA_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisDepA_af1    :: !Double
+  , _msgEphemerisDepA_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisDepA_af2    :: !Double
+  , _msgEphemerisDepA_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemerisDepA_toe_tow :: !Double
+  , _msgEphemerisDepA_toe_tow :: !double
     -- ^ Time of week
-  , _msgEphemerisDepA_toe_wn :: !Word16
+  , _msgEphemerisDepA_toe_wn :: !uint32
     -- ^ Week number
-  , _msgEphemerisDepA_toc_tow :: !Double
+  , _msgEphemerisDepA_toc_tow :: !double
     -- ^ Clock reference time of week
-  , _msgEphemerisDepA_toc_wn :: !Word16
+  , _msgEphemerisDepA_toc_wn :: !uint32
     -- ^ Clock reference week number
-  , _msgEphemerisDepA_valid  :: !Word8
+  , _msgEphemerisDepA_valid  :: !uint32
     -- ^ Is valid?
-  , _msgEphemerisDepA_healthy :: !Word8
+  , _msgEphemerisDepA_healthy :: !uint32
     -- ^ Satellite is healthy?
-  , _msgEphemerisDepA_prn    :: !Word8
+  , _msgEphemerisDepA_prn    :: !uint32
     -- ^ PRN being tracked
   } deriving ( Show, Read, Eq )
 
@@ -1108,63 +1108,63 @@
 --
 -- Deprecated.
 data MsgEphemerisDepB = MsgEphemerisDepB
-  { _msgEphemerisDepB_tgd    :: !Double
+  { _msgEphemerisDepB_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisDepB_c_rs   :: !Double
+  , _msgEphemerisDepB_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisDepB_c_rc   :: !Double
+  , _msgEphemerisDepB_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisDepB_c_uc   :: !Double
+  , _msgEphemerisDepB_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepB_c_us   :: !Double
+  , _msgEphemerisDepB_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepB_c_ic   :: !Double
+  , _msgEphemerisDepB_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepB_c_is   :: !Double
+  , _msgEphemerisDepB_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepB_dn     :: !Double
+  , _msgEphemerisDepB_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisDepB_m0     :: !Double
+  , _msgEphemerisDepB_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisDepB_ecc    :: !Double
+  , _msgEphemerisDepB_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisDepB_sqrta  :: !Double
+  , _msgEphemerisDepB_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisDepB_omega0 :: !Double
+  , _msgEphemerisDepB_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisDepB_omegadot :: !Double
+  , _msgEphemerisDepB_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisDepB_w      :: !Double
+  , _msgEphemerisDepB_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisDepB_inc    :: !Double
+  , _msgEphemerisDepB_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisDepB_inc_dot :: !Double
+  , _msgEphemerisDepB_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisDepB_af0    :: !Double
+  , _msgEphemerisDepB_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisDepB_af1    :: !Double
+  , _msgEphemerisDepB_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisDepB_af2    :: !Double
+  , _msgEphemerisDepB_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemerisDepB_toe_tow :: !Double
+  , _msgEphemerisDepB_toe_tow :: !double
     -- ^ Time of week
-  , _msgEphemerisDepB_toe_wn :: !Word16
+  , _msgEphemerisDepB_toe_wn :: !uint32
     -- ^ Week number
-  , _msgEphemerisDepB_toc_tow :: !Double
+  , _msgEphemerisDepB_toc_tow :: !double
     -- ^ Clock reference time of week
-  , _msgEphemerisDepB_toc_wn :: !Word16
+  , _msgEphemerisDepB_toc_wn :: !uint32
     -- ^ Clock reference week number
-  , _msgEphemerisDepB_valid  :: !Word8
+  , _msgEphemerisDepB_valid  :: !uint32
     -- ^ Is valid?
-  , _msgEphemerisDepB_healthy :: !Word8
+  , _msgEphemerisDepB_healthy :: !uint32
     -- ^ Satellite is healthy?
-  , _msgEphemerisDepB_prn    :: !Word8
+  , _msgEphemerisDepB_prn    :: !uint32
     -- ^ PRN being tracked
-  , _msgEphemerisDepB_iode   :: !Word8
+  , _msgEphemerisDepB_iode   :: !uint32
     -- ^ Issue of ephemeris data
   } deriving ( Show, Read, Eq )
 
@@ -1242,67 +1242,67 @@
 -- see the Navstar GPS Space Segment/Navigation user interfaces (ICD-GPS-200,
 -- Table 20-III) for more details.
 data MsgEphemerisDepC = MsgEphemerisDepC
-  { _msgEphemerisDepC_tgd    :: !Double
+  { _msgEphemerisDepC_tgd    :: !double
     -- ^ Group delay differential between L1 and L2
-  , _msgEphemerisDepC_c_rs   :: !Double
+  , _msgEphemerisDepC_c_rs   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the orbit radius
-  , _msgEphemerisDepC_c_rc   :: !Double
+  , _msgEphemerisDepC_c_rc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the orbit radius
-  , _msgEphemerisDepC_c_uc   :: !Double
+  , _msgEphemerisDepC_c_uc   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepC_c_us   :: !Double
+  , _msgEphemerisDepC_c_us   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the argument of
     -- latitude
-  , _msgEphemerisDepC_c_ic   :: !Double
+  , _msgEphemerisDepC_c_ic   :: !double
     -- ^ Amplitude of the cosine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepC_c_is   :: !Double
+  , _msgEphemerisDepC_c_is   :: !double
     -- ^ Amplitude of the sine harmonic correction term to the angle of
     -- inclination
-  , _msgEphemerisDepC_dn     :: !Double
+  , _msgEphemerisDepC_dn     :: !double
     -- ^ Mean motion difference
-  , _msgEphemerisDepC_m0     :: !Double
+  , _msgEphemerisDepC_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgEphemerisDepC_ecc    :: !Double
+  , _msgEphemerisDepC_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgEphemerisDepC_sqrta  :: !Double
+  , _msgEphemerisDepC_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgEphemerisDepC_omega0 :: !Double
+  , _msgEphemerisDepC_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgEphemerisDepC_omegadot :: !Double
+  , _msgEphemerisDepC_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgEphemerisDepC_w      :: !Double
+  , _msgEphemerisDepC_w      :: !double
     -- ^ Argument of perigee
-  , _msgEphemerisDepC_inc    :: !Double
+  , _msgEphemerisDepC_inc    :: !double
     -- ^ Inclination
-  , _msgEphemerisDepC_inc_dot :: !Double
+  , _msgEphemerisDepC_inc_dot :: !double
     -- ^ Inclination first derivative
-  , _msgEphemerisDepC_af0    :: !Double
+  , _msgEphemerisDepC_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgEphemerisDepC_af1    :: !Double
+  , _msgEphemerisDepC_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
-  , _msgEphemerisDepC_af2    :: !Double
+  , _msgEphemerisDepC_af2    :: !double
     -- ^ Polynomial clock correction coefficient (rate of clock drift)
-  , _msgEphemerisDepC_toe_tow :: !Double
+  , _msgEphemerisDepC_toe_tow :: !double
     -- ^ Time of week
-  , _msgEphemerisDepC_toe_wn :: !Word16
+  , _msgEphemerisDepC_toe_wn :: !uint32
     -- ^ Week number
-  , _msgEphemerisDepC_toc_tow :: !Double
+  , _msgEphemerisDepC_toc_tow :: !double
     -- ^ Clock reference time of week
-  , _msgEphemerisDepC_toc_wn :: !Word16
+  , _msgEphemerisDepC_toc_wn :: !uint32
     -- ^ Clock reference week number
-  , _msgEphemerisDepC_valid  :: !Word8
+  , _msgEphemerisDepC_valid  :: !uint32
     -- ^ Is valid?
-  , _msgEphemerisDepC_healthy :: !Word8
+  , _msgEphemerisDepC_healthy :: !uint32
     -- ^ Satellite is healthy?
   , _msgEphemerisDepC_sid    :: !GnssSignalDep
     -- ^ GNSS signal identifier
-  , _msgEphemerisDepC_iode   :: !Word8
+  , _msgEphemerisDepC_iode   :: !uint32
     -- ^ Issue of ephemeris data
-  , _msgEphemerisDepC_iodc   :: !Word16
+  , _msgEphemerisDepC_iodc   :: !uint32
     -- ^ Issue of clock data
-  , _msgEphemerisDepC_reserved :: !Word32
+  , _msgEphemerisDepC_reserved :: !uint32
     -- ^ Reserved field
   } deriving ( Show, Read, Eq )
 
@@ -1380,7 +1380,7 @@
 data ObservationHeaderDep = ObservationHeaderDep
   { _observationHeaderDep_t   :: !GpsTimeDep
     -- ^ GPS time of this observation
-  , _observationHeaderDep_n_obs :: !Word8
+  , _observationHeaderDep_n_obs :: !uint32
     -- ^ Total number of observations. First nibble is the size of the sequence
     -- (n), second nibble is the zero-indexed counter (ith packet of n)
   } deriving ( Show, Read, Eq )
@@ -1405,9 +1405,9 @@
 -- fractional cycles. This has the opposite sign convention than a typical GPS
 -- receiver and the phase has the opposite sign as the pseudorange.
 data CarrierPhaseDepA = CarrierPhaseDepA
-  { _carrierPhaseDepA_i :: !Int32
+  { _carrierPhaseDepA_i :: !sint32
     -- ^ Carrier phase whole cycles
-  , _carrierPhaseDepA_f :: !Word8
+  , _carrierPhaseDepA_f :: !uint32
     -- ^ Carrier phase fractional part
   } deriving ( Show, Read, Eq )
 
@@ -1428,17 +1428,17 @@
 --
 -- Deprecated.
 data PackedObsContentDepA = PackedObsContentDepA
-  { _packedObsContentDepA_P  :: !Word32
+  { _packedObsContentDepA_P  :: !uint32
     -- ^ Pseudorange observation
   , _packedObsContentDepA_L  :: !CarrierPhaseDepA
     -- ^ Carrier phase observation with opposite sign from typical convention
-  , _packedObsContentDepA_cn0 :: !Word8
+  , _packedObsContentDepA_cn0 :: !uint32
     -- ^ Carrier-to-Noise density
-  , _packedObsContentDepA_lock :: !Word16
+  , _packedObsContentDepA_lock :: !uint32
     -- ^ Lock indicator. This value changes whenever a satellite signal has lost
     -- and regained lock, indicating that the carrier phase ambiguity may have
     -- changed.
-  , _packedObsContentDepA_prn :: !Word8
+  , _packedObsContentDepA_prn :: !uint32
     -- ^ PRN-1 identifier of the satellite signal
   } deriving ( Show, Read, Eq )
 
@@ -1466,13 +1466,13 @@
 -- Pseudorange and carrier phase observation for a satellite being tracked.
 -- Pseudoranges are referenced to a nominal pseudorange.
 data PackedObsContentDepB = PackedObsContentDepB
-  { _packedObsContentDepB_P  :: !Word32
+  { _packedObsContentDepB_P  :: !uint32
     -- ^ Pseudorange observation
   , _packedObsContentDepB_L  :: !CarrierPhaseDepA
     -- ^ Carrier phase observation with opposite sign from typical convention.
-  , _packedObsContentDepB_cn0 :: !Word8
+  , _packedObsContentDepB_cn0 :: !uint32
     -- ^ Carrier-to-Noise density
-  , _packedObsContentDepB_lock :: !Word16
+  , _packedObsContentDepB_lock :: !uint32
     -- ^ Lock indicator. This value changes whenever a satellite signal has lost
     -- and regained lock, indicating that the carrier phase ambiguity may have
     -- changed.
@@ -1505,13 +1505,13 @@
 -- observations are be interoperable with 3rd party receivers and conform with
 -- typical RTCMv3 GNSS observations.
 data PackedObsContentDepC = PackedObsContentDepC
-  { _packedObsContentDepC_P  :: !Word32
+  { _packedObsContentDepC_P  :: !uint32
     -- ^ Pseudorange observation
-  , _packedObsContentDepC_L  :: !CarrierPhase
+  , _packedObsContentDepC_L  :: !gnss.CarrierPhase
     -- ^ Carrier phase observation with typical sign convention.
-  , _packedObsContentDepC_cn0 :: !Word8
+  , _packedObsContentDepC_cn0 :: !uint32
     -- ^ Carrier-to-Noise density
-  , _packedObsContentDepC_lock :: !Word16
+  , _packedObsContentDepC_lock :: !uint32
     -- ^ Lock indicator. This value changes whenever a satellite signal has lost
     -- and regained lock, indicating that the carrier phase ambiguity may have
     -- changed.
@@ -1547,7 +1547,7 @@
 data MsgObsDepA = MsgObsDepA
   { _msgObsDepA_header :: !ObservationHeaderDep
     -- ^ Header of a GPS observation message
-  , _msgObsDepA_obs  :: ![PackedObsContentDepA]
+  , _msgObsDepA_obs  :: !repeated PackedObsContentDepA
     -- ^ Pseudorange and carrier phase observation for a satellite being tracked.
   } deriving ( Show, Read, Eq )
 
@@ -1577,7 +1577,7 @@
 data MsgObsDepB = MsgObsDepB
   { _msgObsDepB_header :: !ObservationHeaderDep
     -- ^ Header of a GPS observation message
-  , _msgObsDepB_obs  :: ![PackedObsContentDepB]
+  , _msgObsDepB_obs  :: !repeated PackedObsContentDepB
     -- ^ Pseudorange and carrier phase observation for a satellite being tracked.
   } deriving ( Show, Read, Eq )
 
@@ -1609,7 +1609,7 @@
 data MsgObsDepC = MsgObsDepC
   { _msgObsDepC_header :: !ObservationHeaderDep
     -- ^ Header of a GPS observation message
-  , _msgObsDepC_obs  :: ![PackedObsContentDepC]
+  , _msgObsDepC_obs  :: !repeated PackedObsContentDepC
     -- ^ Pseudorange and carrier phase observation for a satellite being tracked.
   } deriving ( Show, Read, Eq )
 
@@ -1636,16 +1636,16 @@
 -- utilize the ionospheric model for computation of the ionospheric delay.
 -- Please see ICD-GPS-200 (Chapter 20.3.3.5.1.7) for more details.
 data MsgIono = MsgIono
-  { _msgIono_t_nmct :: !GpsTimeSec
+  { _msgIono_t_nmct :: !gnss.GpsTimeSec
     -- ^ Navigation Message Correction Table Valitidy Time
-  , _msgIono_a0   :: !Double
-  , _msgIono_a1   :: !Double
-  , _msgIono_a2   :: !Double
-  , _msgIono_a3   :: !Double
-  , _msgIono_b0   :: !Double
-  , _msgIono_b1   :: !Double
-  , _msgIono_b2   :: !Double
-  , _msgIono_b3   :: !Double
+  , _msgIono_a0   :: !double
+  , _msgIono_a1   :: !double
+  , _msgIono_a2   :: !double
+  , _msgIono_a3   :: !double
+  , _msgIono_b0   :: !double
+  , _msgIono_b1   :: !double
+  , _msgIono_b2   :: !double
+  , _msgIono_b3   :: !double
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgIono where
@@ -1683,9 +1683,9 @@
 --
 -- Please see ICD-GPS-200 (Chapter 20.3.3.5.1.4) for more details.
 data MsgSvConfigurationGps = MsgSvConfigurationGps
-  { _msgSvConfigurationGps_t_nmct :: !GpsTimeSec
+  { _msgSvConfigurationGps_t_nmct :: !gnss.GpsTimeSec
     -- ^ Navigation Message Correction Table Valitidy Time
-  , _msgSvConfigurationGps_l2c_mask :: !Word32
+  , _msgSvConfigurationGps_l2c_mask :: !uint32
     -- ^ L2C capability mask, SV32 bit being MSB, SV1 bit being LSB
   } deriving ( Show, Read, Eq )
 
@@ -1712,14 +1712,14 @@
 data MsgGroupDelayDepA = MsgGroupDelayDepA
   { _msgGroupDelayDepA_t_op   :: !GpsTimeDep
     -- ^ Data Predict Time of Week
-  , _msgGroupDelayDepA_prn    :: !Word8
+  , _msgGroupDelayDepA_prn    :: !uint32
     -- ^ Satellite number
-  , _msgGroupDelayDepA_valid  :: !Word8
+  , _msgGroupDelayDepA_valid  :: !uint32
     -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
     -- etc. 1 = value is valid, 0 = value is not valid.
-  , _msgGroupDelayDepA_tgd    :: !Int16
-  , _msgGroupDelayDepA_isc_l1ca :: !Int16
-  , _msgGroupDelayDepA_isc_l2c :: !Int16
+  , _msgGroupDelayDepA_tgd    :: !sint32
+  , _msgGroupDelayDepA_isc_l1ca :: !sint32
+  , _msgGroupDelayDepA_isc_l2c :: !sint32
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgGroupDelayDepA where
@@ -1751,16 +1751,16 @@
 --
 -- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.
 data MsgGroupDelayDepB = MsgGroupDelayDepB
-  { _msgGroupDelayDepB_t_op   :: !GpsTimeSec
+  { _msgGroupDelayDepB_t_op   :: !gnss.GpsTimeSec
     -- ^ Data Predict Time of Week
   , _msgGroupDelayDepB_sid    :: !GnssSignalDep
     -- ^ GNSS signal identifier
-  , _msgGroupDelayDepB_valid  :: !Word8
+  , _msgGroupDelayDepB_valid  :: !uint32
     -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
     -- etc. 1 = value is valid, 0 = value is not valid.
-  , _msgGroupDelayDepB_tgd    :: !Int16
-  , _msgGroupDelayDepB_isc_l1ca :: !Int16
-  , _msgGroupDelayDepB_isc_l2c :: !Int16
+  , _msgGroupDelayDepB_tgd    :: !sint32
+  , _msgGroupDelayDepB_isc_l1ca :: !sint32
+  , _msgGroupDelayDepB_isc_l2c :: !sint32
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgGroupDelayDepB where
@@ -1792,16 +1792,16 @@
 --
 -- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.
 data MsgGroupDelay = MsgGroupDelay
-  { _msgGroupDelay_t_op   :: !GpsTimeSec
+  { _msgGroupDelay_t_op   :: !gnss.GpsTimeSec
     -- ^ Data Predict Time of Week
-  , _msgGroupDelay_sid    :: !GnssSignal
+  , _msgGroupDelay_sid    :: !gnss.GnssSignal
     -- ^ GNSS signal identifier
-  , _msgGroupDelay_valid  :: !Word8
+  , _msgGroupDelay_valid  :: !uint32
     -- ^ bit-field indicating validity of the values, LSB indicating tgd validity
     -- etc. 1 = value is valid, 0 = value is not valid.
-  , _msgGroupDelay_tgd    :: !Int16
-  , _msgGroupDelay_isc_l1ca :: !Int16
-  , _msgGroupDelay_isc_l2c :: !Int16
+  , _msgGroupDelay_tgd    :: !sint32
+  , _msgGroupDelay_isc_l1ca :: !sint32
+  , _msgGroupDelay_isc_l2c :: !sint32
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgGroupDelay where
@@ -1827,17 +1827,17 @@
 $(makeLenses ''MsgGroupDelay)
 
 data AlmanacCommonContent = AlmanacCommonContent
-  { _almanacCommonContent_sid        :: !GnssSignal
+  { _almanacCommonContent_sid        :: !gnss.GnssSignal
     -- ^ GNSS signal identifier
-  , _almanacCommonContent_toa        :: !GpsTimeSec
+  , _almanacCommonContent_toa        :: !gnss.GpsTimeSec
     -- ^ Reference time of almanac
-  , _almanacCommonContent_ura        :: !Double
+  , _almanacCommonContent_ura        :: !double
     -- ^ User Range Accuracy
-  , _almanacCommonContent_fit_interval :: !Word32
+  , _almanacCommonContent_fit_interval :: !uint32
     -- ^ Curve fit interval
-  , _almanacCommonContent_valid      :: !Word8
+  , _almanacCommonContent_valid      :: !uint32
     -- ^ Status of almanac, 1 = valid, 0 = invalid
-  , _almanacCommonContent_health_bits :: !Word8
+  , _almanacCommonContent_health_bits :: !uint32
     -- ^ Satellite health status for GPS:   - bits 5-7: NAV data health status.
     -- See IS-GPS-200H     Table 20-VII: NAV Data Health Indications.   - bits
     -- 0-4: Signal health status. See IS-GPS-200H     Table 20-VIII. Codes for
@@ -1874,15 +1874,15 @@
 data AlmanacCommonContentDep = AlmanacCommonContentDep
   { _almanacCommonContentDep_sid        :: !GnssSignalDep
     -- ^ GNSS signal identifier
-  , _almanacCommonContentDep_toa        :: !GpsTimeSec
+  , _almanacCommonContentDep_toa        :: !gnss.GpsTimeSec
     -- ^ Reference time of almanac
-  , _almanacCommonContentDep_ura        :: !Double
+  , _almanacCommonContentDep_ura        :: !double
     -- ^ User Range Accuracy
-  , _almanacCommonContentDep_fit_interval :: !Word32
+  , _almanacCommonContentDep_fit_interval :: !uint32
     -- ^ Curve fit interval
-  , _almanacCommonContentDep_valid      :: !Word8
+  , _almanacCommonContentDep_valid      :: !uint32
     -- ^ Status of almanac, 1 = valid, 0 = invalid
-  , _almanacCommonContentDep_health_bits :: !Word8
+  , _almanacCommonContentDep_health_bits :: !uint32
     -- ^ Satellite health status for GPS:   - bits 5-7: NAV data health status.
     -- See IS-GPS-200H     Table 20-VII: NAV Data Health Indications.   - bits
     -- 0-4: Signal health status. See IS-GPS-200H     Table 20-VIII. Codes for
@@ -1928,23 +1928,23 @@
 data MsgAlmanacGpsDep = MsgAlmanacGpsDep
   { _msgAlmanacGpsDep_common :: !AlmanacCommonContentDep
     -- ^ Values common for all almanac types
-  , _msgAlmanacGpsDep_m0     :: !Double
+  , _msgAlmanacGpsDep_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgAlmanacGpsDep_ecc    :: !Double
+  , _msgAlmanacGpsDep_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgAlmanacGpsDep_sqrta  :: !Double
+  , _msgAlmanacGpsDep_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgAlmanacGpsDep_omega0 :: !Double
+  , _msgAlmanacGpsDep_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgAlmanacGpsDep_omegadot :: !Double
+  , _msgAlmanacGpsDep_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgAlmanacGpsDep_w      :: !Double
+  , _msgAlmanacGpsDep_w      :: !double
     -- ^ Argument of perigee
-  , _msgAlmanacGpsDep_inc    :: !Double
+  , _msgAlmanacGpsDep_inc    :: !double
     -- ^ Inclination
-  , _msgAlmanacGpsDep_af0    :: !Double
+  , _msgAlmanacGpsDep_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgAlmanacGpsDep_af1    :: !Double
+  , _msgAlmanacGpsDep_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
   } deriving ( Show, Read, Eq )
 
@@ -1990,23 +1990,23 @@
 data MsgAlmanacGps = MsgAlmanacGps
   { _msgAlmanacGps_common :: !AlmanacCommonContent
     -- ^ Values common for all almanac types
-  , _msgAlmanacGps_m0     :: !Double
+  , _msgAlmanacGps_m0     :: !double
     -- ^ Mean anomaly at reference time
-  , _msgAlmanacGps_ecc    :: !Double
+  , _msgAlmanacGps_ecc    :: !double
     -- ^ Eccentricity of satellite orbit
-  , _msgAlmanacGps_sqrta  :: !Double
+  , _msgAlmanacGps_sqrta  :: !double
     -- ^ Square root of the semi-major axis of orbit
-  , _msgAlmanacGps_omega0 :: !Double
+  , _msgAlmanacGps_omega0 :: !double
     -- ^ Longitude of ascending node of orbit plane at weekly epoch
-  , _msgAlmanacGps_omegadot :: !Double
+  , _msgAlmanacGps_omegadot :: !double
     -- ^ Rate of right ascension
-  , _msgAlmanacGps_w      :: !Double
+  , _msgAlmanacGps_w      :: !double
     -- ^ Argument of perigee
-  , _msgAlmanacGps_inc    :: !Double
+  , _msgAlmanacGps_inc    :: !double
     -- ^ Inclination
-  , _msgAlmanacGps_af0    :: !Double
+  , _msgAlmanacGps_af0    :: !double
     -- ^ Polynomial clock correction coefficient (clock bias)
-  , _msgAlmanacGps_af1    :: !Double
+  , _msgAlmanacGps_af1    :: !double
     -- ^ Polynomial clock correction coefficient (clock drift)
   } deriving ( Show, Read, Eq )
 
@@ -2052,20 +2052,20 @@
 data MsgAlmanacGloDep = MsgAlmanacGloDep
   { _msgAlmanacGloDep_common    :: !AlmanacCommonContentDep
     -- ^ Values common for all almanac types
-  , _msgAlmanacGloDep_lambda_na :: !Double
+  , _msgAlmanacGloDep_lambda_na :: !double
     -- ^ Longitude of the first ascending node of the orbit in PZ-90.02
     -- coordinate system
-  , _msgAlmanacGloDep_t_lambda_na :: !Double
+  , _msgAlmanacGloDep_t_lambda_na :: !double
     -- ^ Time of the first ascending node passage
-  , _msgAlmanacGloDep_i         :: !Double
+  , _msgAlmanacGloDep_i         :: !double
     -- ^ Value of inclination at instant of t_lambda
-  , _msgAlmanacGloDep_t         :: !Double
+  , _msgAlmanacGloDep_t         :: !double
     -- ^ Value of Draconian period at instant of t_lambda
-  , _msgAlmanacGloDep_t_dot     :: !Double
+  , _msgAlmanacGloDep_t_dot     :: !double
     -- ^ Rate of change of the Draconian period
-  , _msgAlmanacGloDep_epsilon   :: !Double
+  , _msgAlmanacGloDep_epsilon   :: !double
     -- ^ Eccentricity at instant of t_lambda
-  , _msgAlmanacGloDep_omega     :: !Double
+  , _msgAlmanacGloDep_omega     :: !double
     -- ^ Argument of perigee at instant of t_lambda
   } deriving ( Show, Read, Eq )
 
@@ -2107,20 +2107,20 @@
 data MsgAlmanacGlo = MsgAlmanacGlo
   { _msgAlmanacGlo_common    :: !AlmanacCommonContent
     -- ^ Values common for all almanac types
-  , _msgAlmanacGlo_lambda_na :: !Double
+  , _msgAlmanacGlo_lambda_na :: !double
     -- ^ Longitude of the first ascending node of the orbit in PZ-90.02
     -- coordinate system
-  , _msgAlmanacGlo_t_lambda_na :: !Double
+  , _msgAlmanacGlo_t_lambda_na :: !double
     -- ^ Time of the first ascending node passage
-  , _msgAlmanacGlo_i         :: !Double
+  , _msgAlmanacGlo_i         :: !double
     -- ^ Value of inclination at instant of t_lambda
-  , _msgAlmanacGlo_t         :: !Double
+  , _msgAlmanacGlo_t         :: !double
     -- ^ Value of Draconian period at instant of t_lambda
-  , _msgAlmanacGlo_t_dot     :: !Double
+  , _msgAlmanacGlo_t_dot     :: !double
     -- ^ Rate of change of the Draconian period
-  , _msgAlmanacGlo_epsilon   :: !Double
+  , _msgAlmanacGlo_epsilon   :: !double
     -- ^ Eccentricity at instant of t_lambda
-  , _msgAlmanacGlo_omega     :: !Double
+  , _msgAlmanacGlo_omega     :: !double
     -- ^ Argument of perigee at instant of t_lambda
   } deriving ( Show, Read, Eq )
 
@@ -2159,15 +2159,15 @@
 -- ambiguity resolution for baselines with mixed receiver types (e.g. receiver
 -- of different manufacturers)
 data MsgGloBiases = MsgGloBiases
-  { _msgGloBiases_mask    :: !Word8
+  { _msgGloBiases_mask    :: !uint32
     -- ^ GLONASS FDMA signals mask
-  , _msgGloBiases_l1ca_bias :: !Int16
+  , _msgGloBiases_l1ca_bias :: !sint32
     -- ^ GLONASS L1 C/A Code-Phase Bias
-  , _msgGloBiases_l1p_bias :: !Int16
+  , _msgGloBiases_l1p_bias :: !sint32
     -- ^ GLONASS L1 P Code-Phase Bias
-  , _msgGloBiases_l2ca_bias :: !Int16
+  , _msgGloBiases_l2ca_bias :: !sint32
     -- ^ GLONASS L2 C/A Code-Phase Bias
-  , _msgGloBiases_l2p_bias :: !Int16
+  , _msgGloBiases_l2p_bias :: !sint32
     -- ^ GLONASS L2 P Code-Phase Bias
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Orientation.hs b/src/SwiftNav/SBP/Orientation.hs
--- a/src/SwiftNav/SBP/Orientation.hs
+++ b/src/SwiftNav/SBP/Orientation.hs
@@ -44,13 +44,13 @@
 -- preceding MSG_GPS_TIME with the matching time-of-week (tow). It is intended
 -- that time-matched RTK mode is used when the base station is moving.
 data MsgBaselineHeading = MsgBaselineHeading
-  { _msgBaselineHeading_tow   :: !Word32
+  { _msgBaselineHeading_tow   :: !uint32
     -- ^ GPS Time of Week
-  , _msgBaselineHeading_heading :: !Word32
+  , _msgBaselineHeading_heading :: !uint32
     -- ^ Heading
-  , _msgBaselineHeading_n_sats :: !Word8
+  , _msgBaselineHeading_n_sats :: !uint32
     -- ^ Number of satellites used in solution
-  , _msgBaselineHeading_flags :: !Word8
+  , _msgBaselineHeading_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -82,25 +82,25 @@
 -- of the vector should sum to a unit vector assuming that the LSB of each
 -- component as a value of 2^-31.
 data MsgOrientQuat = MsgOrientQuat
-  { _msgOrientQuat_tow :: !Word32
+  { _msgOrientQuat_tow :: !uint32
     -- ^ GPS Time of Week
-  , _msgOrientQuat_w   :: !Int32
+  , _msgOrientQuat_w   :: !sint32
     -- ^ Real component
-  , _msgOrientQuat_x   :: !Int32
+  , _msgOrientQuat_x   :: !sint32
     -- ^ 1st imaginary component
-  , _msgOrientQuat_y   :: !Int32
+  , _msgOrientQuat_y   :: !sint32
     -- ^ 2nd imaginary component
-  , _msgOrientQuat_z   :: !Int32
+  , _msgOrientQuat_z   :: !sint32
     -- ^ 3rd imaginary component
-  , _msgOrientQuat_acc_w :: !Float
+  , _msgOrientQuat_acc_w :: !float
     -- ^ Estimated standard deviation of w
-  , _msgOrientQuat_acc_x :: !Float
+  , _msgOrientQuat_acc_x :: !float
     -- ^ Estimated standard deviation of x
-  , _msgOrientQuat_acc_y :: !Float
+  , _msgOrientQuat_acc_y :: !float
     -- ^ Estimated standard deviation of y
-  , _msgOrientQuat_acc_z :: !Float
+  , _msgOrientQuat_acc_z :: !float
     -- ^ Estimated standard deviation of z
-  , _msgOrientQuat_flags :: !Word8
+  , _msgOrientQuat_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -144,21 +144,21 @@
 -- and roll  in order to rotate the from a frame aligned with the local-level
 -- NED frame  to the vehicle body frame.
 data MsgOrientEuler = MsgOrientEuler
-  { _msgOrientEuler_tow     :: !Word32
+  { _msgOrientEuler_tow     :: !uint32
     -- ^ GPS Time of Week
-  , _msgOrientEuler_roll    :: !Int32
+  , _msgOrientEuler_roll    :: !sint32
     -- ^ rotation about the forward axis of the vehicle
-  , _msgOrientEuler_pitch   :: !Int32
+  , _msgOrientEuler_pitch   :: !sint32
     -- ^ rotation about the rightward axis of the vehicle
-  , _msgOrientEuler_yaw     :: !Int32
+  , _msgOrientEuler_yaw     :: !sint32
     -- ^ rotation about the downward axis of the vehicle
-  , _msgOrientEuler_var_roll :: !Float
+  , _msgOrientEuler_var_roll :: !float
     -- ^ Estimated standard deviation of roll
-  , _msgOrientEuler_var_pitch :: !Float
+  , _msgOrientEuler_var_pitch :: !float
     -- ^ Estimated standard deviation of pitch
-  , _msgOrientEuler_var_yaw :: !Float
+  , _msgOrientEuler_var_yaw :: !float
     -- ^ Estimated standard deviation of yaw
-  , _msgOrientEuler_flags   :: !Word8
+  , _msgOrientEuler_flags   :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -201,15 +201,15 @@
 -- direction, while the vehicle y-axis is expected to be aligned with the right
 -- direction, and the vehicle z-axis should be aligned with the down direction.
 data MsgAngularRate = MsgAngularRate
-  { _msgAngularRate_tow :: !Word32
+  { _msgAngularRate_tow :: !uint32
     -- ^ GPS Time of Week
-  , _msgAngularRate_x   :: !Int32
+  , _msgAngularRate_x   :: !sint32
     -- ^ angular rate about x axis
-  , _msgAngularRate_y   :: !Int32
+  , _msgAngularRate_y   :: !sint32
     -- ^ angular rate about y axis
-  , _msgAngularRate_z   :: !Int32
+  , _msgAngularRate_z   :: !sint32
     -- ^ angular rate about z axis
-  , _msgAngularRate_flags :: !Word8
+  , _msgAngularRate_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Piksi.hs b/src/SwiftNav/SBP/Piksi.hs
--- a/src/SwiftNav/SBP/Piksi.hs
+++ b/src/SwiftNav/SBP/Piksi.hs
@@ -85,7 +85,7 @@
 --
 -- This message from the host resets the Piksi back into the bootloader.
 data MsgReset = MsgReset
-  { _msgReset_flags :: !Word32
+  { _msgReset_flags :: !uint32
     -- ^ Reset flags
   } deriving ( Show, Read, Eq )
 
@@ -170,7 +170,7 @@
 -- This message resets either the DGNSS Kalman filters or Integer Ambiguity
 -- Resolution (IAR) process.
 data MsgResetFilters = MsgResetFilters
-  { _msgResetFilters_filter :: !Word8
+  { _msgResetFilters_filter :: !uint32
     -- ^ Filter flags
   } deriving ( Show, Read, Eq )
 
@@ -217,12 +217,12 @@
 -- (RTOS) thread usage statistics for the named thread. The reported percentage
 -- values must be normalized.
 data MsgThreadState = MsgThreadState
-  { _msgThreadState_name     :: !Text
+  { _msgThreadState_name     :: !string
     -- ^ Thread name (NULL terminated)
-  , _msgThreadState_cpu      :: !Word16
+  , _msgThreadState_cpu      :: !uint32
     -- ^ Percentage cpu use for this thread. Values range from 0 - 1000 and needs
     -- to be renormalized to 100
-  , _msgThreadState_stack_free :: !Word32
+  , _msgThreadState_stack_free :: !uint32
     -- ^ Free stack space for this thread
   } deriving ( Show, Read, Eq )
 
@@ -247,17 +247,17 @@
 -- Throughput, utilization, and error counts on the RX/TX buffers of this UART
 -- channel. The reported percentage values must be normalized.
 data UARTChannel = UARTChannel
-  { _uARTChannel_tx_throughput :: !Float
+  { _uARTChannel_tx_throughput :: !float
     -- ^ UART transmit throughput
-  , _uARTChannel_rx_throughput :: !Float
+  , _uARTChannel_rx_throughput :: !float
     -- ^ UART receive throughput
-  , _uARTChannel_crc_error_count :: !Word16
+  , _uARTChannel_crc_error_count :: !uint32
     -- ^ UART CRC error count
-  , _uARTChannel_io_error_count :: !Word16
+  , _uARTChannel_io_error_count :: !uint32
     -- ^ UART IO error count
-  , _uARTChannel_tx_buffer_level :: !Word8
+  , _uARTChannel_tx_buffer_level :: !uint32
     -- ^ UART transmit buffer percentage utilization (ranges from 0 to 255)
-  , _uARTChannel_rx_buffer_level :: !Word8
+  , _uARTChannel_rx_buffer_level :: !uint32
     -- ^ UART receive buffer percentage utilization (ranges from 0 to 255)
   } deriving ( Show, Read, Eq )
 
@@ -290,13 +290,13 @@
 -- for link quality as incomplete or missing sets will increase the period.
 -- Long periods can cause momentary RTK solution outages.
 data Period = Period
-  { _period_avg   :: !Int32
+  { _period_avg   :: !sint32
     -- ^ Average period
-  , _period_pmin  :: !Int32
+  , _period_pmin  :: !sint32
     -- ^ Minimum period
-  , _period_pmax  :: !Int32
+  , _period_pmax  :: !sint32
     -- ^ Maximum period
-  , _period_current :: !Int32
+  , _period_current :: !sint32
     -- ^ Smoothed estimate of the current period
   } deriving ( Show, Read, Eq )
 
@@ -324,13 +324,13 @@
 -- GPS time calculated locally by the receiver to give a precise measurement of
 -- the end-to-end communication latency in the system.
 data Latency = Latency
-  { _latency_avg   :: !Int32
+  { _latency_avg   :: !sint32
     -- ^ Average latency
-  , _latency_lmin  :: !Int32
+  , _latency_lmin  :: !sint32
     -- ^ Minimum latency
-  , _latency_lmax  :: !Int32
+  , _latency_lmax  :: !sint32
     -- ^ Maximum latency
-  , _latency_current :: !Int32
+  , _latency_current :: !sint32
     -- ^ Smoothed estimate of the current latency
   } deriving ( Show, Read, Eq )
 
@@ -441,7 +441,7 @@
 -- process, which resolves unknown integer ambiguities from double-differenced
 -- carrier-phase measurements from satellite observations.
 data MsgIarState = MsgIarState
-  { _msgIarState_num_hyps :: !Word32
+  { _msgIarState_num_hyps :: !uint32
     -- ^ Number of integer ambiguity hypotheses remaining
   } deriving ( Show, Read, Eq )
 
@@ -465,9 +465,9 @@
 -- This message allows setting a mask to prevent a particular satellite from
 -- being used in various Piksi subsystems.
 data MsgMaskSatellite = MsgMaskSatellite
-  { _msgMaskSatellite_mask :: !Word8
+  { _msgMaskSatellite_mask :: !uint32
     -- ^ Mask of systems that should ignore this satellite.
-  , _msgMaskSatellite_sid :: !GnssSignal
+  , _msgMaskSatellite_sid :: !gnss.GnssSignal
     -- ^ GNSS signal for which the mask is applied
   } deriving ( Show, Read, Eq )
 
@@ -492,7 +492,7 @@
 --
 -- Deprecated.
 data MsgMaskSatelliteDep = MsgMaskSatelliteDep
-  { _msgMaskSatelliteDep_mask :: !Word8
+  { _msgMaskSatelliteDep_mask :: !uint32
     -- ^ Mask of systems that should ignore this satellite.
   , _msgMaskSatelliteDep_sid :: !GnssSignalDep
     -- ^ GNSS signal for which the mask is applied
@@ -521,15 +521,15 @@
 -- processor's monitoring system and the RF frontend die temperature if
 -- available.
 data MsgDeviceMonitor = MsgDeviceMonitor
-  { _msgDeviceMonitor_dev_vin       :: !Int16
+  { _msgDeviceMonitor_dev_vin       :: !sint32
     -- ^ Device V_in
-  , _msgDeviceMonitor_cpu_vint      :: !Int16
+  , _msgDeviceMonitor_cpu_vint      :: !sint32
     -- ^ Processor V_int
-  , _msgDeviceMonitor_cpu_vaux      :: !Int16
+  , _msgDeviceMonitor_cpu_vaux      :: !sint32
     -- ^ Processor V_aux
-  , _msgDeviceMonitor_cpu_temperature :: !Int16
+  , _msgDeviceMonitor_cpu_temperature :: !sint32
     -- ^ Processor temperature
-  , _msgDeviceMonitor_fe_temperature :: !Int16
+  , _msgDeviceMonitor_fe_temperature :: !sint32
     -- ^ Frontend temperature (if available)
   } deriving ( Show, Read, Eq )
 
@@ -561,9 +561,9 @@
 -- Request the recipient to execute an command. Output will be sent in MSG_LOG
 -- messages, and the exit code will be returned with MSG_COMMAND_RESP.
 data MsgCommandReq = MsgCommandReq
-  { _msgCommandReq_sequence :: !Word32
+  { _msgCommandReq_sequence :: !uint32
     -- ^ Sequence number
-  , _msgCommandReq_command :: !Text
+  , _msgCommandReq_command :: !string
     -- ^ Command line to execute
   } deriving ( Show, Read, Eq )
 
@@ -589,9 +589,9 @@
 -- The response to MSG_COMMAND_REQ with the return code of the command.  A
 -- return code of zero indicates success.
 data MsgCommandResp = MsgCommandResp
-  { _msgCommandResp_sequence :: !Word32
+  { _msgCommandResp_sequence :: !uint32
     -- ^ Sequence number
-  , _msgCommandResp_code   :: !Int32
+  , _msgCommandResp_code   :: !sint32
     -- ^ Exit code
   } deriving ( Show, Read, Eq )
 
@@ -618,9 +618,9 @@
 -- MSG_COMMAND_REQ. The sequence number can be used to filter for filtering the
 -- correct command.
 data MsgCommandOutput = MsgCommandOutput
-  { _msgCommandOutput_sequence :: !Word32
+  { _msgCommandOutput_sequence :: !uint32
     -- ^ Sequence number
-  , _msgCommandOutput_line   :: !Text
+  , _msgCommandOutput_line   :: !string
     -- ^ Line of standard output or standard error
   } deriving ( Show, Read, Eq )
 
@@ -666,21 +666,21 @@
 -- The state of a network interface on the Piksi. Data is made to reflect
 -- output of ifaddrs struct returned by getifaddrs in c.
 data MsgNetworkStateResp = MsgNetworkStateResp
-  { _msgNetworkStateResp_ipv4_address :: ![Word8]
+  { _msgNetworkStateResp_ipv4_address :: !repeated uint32
     -- ^ IPv4 address (all zero when unavailable)
-  , _msgNetworkStateResp_ipv4_mask_size :: !Word8
+  , _msgNetworkStateResp_ipv4_mask_size :: !uint32
     -- ^ IPv4 netmask CIDR notation
-  , _msgNetworkStateResp_ipv6_address :: ![Word8]
+  , _msgNetworkStateResp_ipv6_address :: !repeated uint32
     -- ^ IPv6 address (all zero when unavailable)
-  , _msgNetworkStateResp_ipv6_mask_size :: !Word8
+  , _msgNetworkStateResp_ipv6_mask_size :: !uint32
     -- ^ IPv6 netmask CIDR notation
-  , _msgNetworkStateResp_rx_bytes     :: !Word32
+  , _msgNetworkStateResp_rx_bytes     :: !uint32
     -- ^ Number of Rx bytes
-  , _msgNetworkStateResp_tx_bytes     :: !Word32
+  , _msgNetworkStateResp_tx_bytes     :: !uint32
     -- ^ Number of Tx bytes
-  , _msgNetworkStateResp_interface_name :: !Text
+  , _msgNetworkStateResp_interface_name :: !string
     -- ^ Interface Name
-  , _msgNetworkStateResp_flags        :: !Word32
+  , _msgNetworkStateResp_flags        :: !uint32
     -- ^ Interface flags from SIOCGIFFLAGS
   } deriving ( Show, Read, Eq )
 
@@ -718,15 +718,15 @@
 -- may vary, both a timestamp and period field is provided, though may not
 -- necessarily be populated with a value.
 data NetworkUsage = NetworkUsage
-  { _networkUsage_duration     :: !Word64
+  { _networkUsage_duration     :: !uint64
     -- ^ Duration over which the measurement was collected
-  , _networkUsage_total_bytes  :: !Word64
+  , _networkUsage_total_bytes  :: !uint64
     -- ^ Number of bytes handled in total within period
-  , _networkUsage_rx_bytes     :: !Word32
+  , _networkUsage_rx_bytes     :: !uint32
     -- ^ Number of bytes transmitted within period
-  , _networkUsage_tx_bytes     :: !Word32
+  , _networkUsage_tx_bytes     :: !uint32
     -- ^ Number of bytes received within period
-  , _networkUsage_interface_name :: !Text
+  , _networkUsage_interface_name :: !string
     -- ^ Interface Name
   } deriving ( Show, Read, Eq )
 
@@ -756,7 +756,7 @@
 --
 -- The bandwidth usage, a list of usage by interface.
 data MsgNetworkBandwidthUsage = MsgNetworkBandwidthUsage
-  { _msgNetworkBandwidthUsage_interfaces :: ![NetworkUsage]
+  { _msgNetworkBandwidthUsage_interfaces :: !repeated NetworkUsage
     -- ^ Usage measurement array
   } deriving ( Show, Read, Eq )
 
@@ -779,19 +779,19 @@
 --
 -- Deprecated.
 data MsgSpecanDep = MsgSpecanDep
-  { _msgSpecanDep_channel_tag   :: !Word16
+  { _msgSpecanDep_channel_tag   :: !uint32
     -- ^ Channel ID
   , _msgSpecanDep_t             :: !GpsTimeDep
     -- ^ Receiver time of this observation
-  , _msgSpecanDep_freq_ref      :: !Float
+  , _msgSpecanDep_freq_ref      :: !float
     -- ^ Reference frequency of this packet
-  , _msgSpecanDep_freq_step     :: !Float
+  , _msgSpecanDep_freq_step     :: !float
     -- ^ Frequency step of points in this packet
-  , _msgSpecanDep_amplitude_ref :: !Float
+  , _msgSpecanDep_amplitude_ref :: !float
     -- ^ Reference amplitude of this packet
-  , _msgSpecanDep_amplitude_unit :: !Float
+  , _msgSpecanDep_amplitude_unit :: !float
     -- ^ Amplitude unit value of points in this packet
-  , _msgSpecanDep_amplitude_value :: ![Word8]
+  , _msgSpecanDep_amplitude_value :: !repeated uint32
     -- ^ Amplitude values (in the above units) of points in this packet
   } deriving ( Show, Read, Eq )
 
@@ -826,19 +826,19 @@
 --
 -- Spectrum analyzer packet.
 data MsgSpecan = MsgSpecan
-  { _msgSpecan_channel_tag   :: !Word16
+  { _msgSpecan_channel_tag   :: !uint32
     -- ^ Channel ID
-  , _msgSpecan_t             :: !GpsTime
+  , _msgSpecan_t             :: !gnss.GpsTime
     -- ^ Receiver time of this observation
-  , _msgSpecan_freq_ref      :: !Float
+  , _msgSpecan_freq_ref      :: !float
     -- ^ Reference frequency of this packet
-  , _msgSpecan_freq_step     :: !Float
+  , _msgSpecan_freq_step     :: !float
     -- ^ Frequency step of points in this packet
-  , _msgSpecan_amplitude_ref :: !Float
+  , _msgSpecan_amplitude_ref :: !float
     -- ^ Reference amplitude of this packet
-  , _msgSpecan_amplitude_unit :: !Float
+  , _msgSpecan_amplitude_unit :: !float
     -- ^ Amplitude unit value of points in this packet
-  , _msgSpecan_amplitude_value :: ![Word8]
+  , _msgSpecan_amplitude_value :: !repeated uint32
     -- ^ Amplitude values (in the above units) of points in this packet
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Sbas.hs b/src/SwiftNav/SBP/Sbas.hs
--- a/src/SwiftNav/SBP/Sbas.hs
+++ b/src/SwiftNav/SBP/Sbas.hs
@@ -43,13 +43,13 @@
 -- This message is sent once per second per SBAS satellite. ME checks the
 -- parity of the data block and sends only blocks that pass the check.
 data MsgSbasRaw = MsgSbasRaw
-  { _msgSbasRaw_sid        :: !GnssSignal
+  { _msgSbasRaw_sid        :: !gnss.GnssSignal
     -- ^ GNSS signal identifier.
-  , _msgSbasRaw_tow        :: !Word32
+  , _msgSbasRaw_tow        :: !uint32
     -- ^ GPS time-of-week at the start of the data block.
-  , _msgSbasRaw_message_type :: !Word8
+  , _msgSbasRaw_message_type :: !uint32
     -- ^ SBAS message type (0-63)
-  , _msgSbasRaw_data       :: ![Word8]
+  , _msgSbasRaw_data       :: !repeated uint32
     -- ^ Raw SBAS data field of 212 bits (last byte padded with zeros).
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Settings.hs b/src/SwiftNav/SBP/Settings.hs
--- a/src/SwiftNav/SBP/Settings.hs
+++ b/src/SwiftNav/SBP/Settings.hs
@@ -11,11 +11,28 @@
 -- Stability:   experimental
 -- Portability: portable
 --
--- Messages for reading and writing the device's device settings.  Note that
--- some of these messages share the same message type ID for both the host
--- request and the device response. See the accompanying document for
--- descriptions of settings configurations and examples:  https://github.com
--- /swift-nav/piksi\_firmware/blob/master/docs/settings.pdf
+--  Messages for reading, writing, and discovering device settings. Settings
+-- with a "string" field have multiple values in this field delimited with a
+-- null character (the c style null terminator).  For instance, when querying
+-- the 'firmware_version' setting in the 'system_info' section, the following
+-- array of characters needs to be sent for the string field in
+-- MSG_SETTINGS_READ: "system_info\0firmware_version\0", where the delimiting
+-- null characters are specified with the escape sequence '\0' and all
+-- quotation marks should be omitted.    In the message descriptions below, the
+-- generic strings SECTION_SETTING and SETTING are used to refer to the two
+-- strings that comprise the identifier of an individual setting.In
+-- firmware_version example above, SECTION_SETTING is the 'system_info', and
+-- the SETTING portion is 'firmware_version'.   See the "Software Settings
+-- Manual" on support.swiftnav.com for detailed documentation about all
+-- settings and sections available for each Swift firmware version. Settings
+-- manuals are available for each firmware version at the following link:
+-- https://support.swiftnav.com/customer/en/portal/articles/2628580-piksi-
+-- multi-specifications#settings. The latest settings document is also
+-- available at the following link:  http://swiftnav.com/latest/piksi-multi-
+-- settings . See lastly https://github.com/swift-
+-- nav/piksi_tools/blob/master/piksi_tools/settings.py ,  the open source
+-- python command line utility for reading, writing, and saving settings in the
+-- piksi_tools repository on github as a helpful reference and example.
 
 module SwiftNav.SBP.Settings
   ( module SwiftNav.SBP.Settings
@@ -64,12 +81,16 @@
 
 -- | SBP class for message MSG_SETTINGS_WRITE (0x00A0).
 --
--- The setting message writes the device configuration.
+-- The setting message writes the device configuration for a particular setting
+-- via A NULL-terminated and NULL-delimited string with contents
+-- "SECTION_SETTING\0SETTING\0VALUE\0" where the '\0' escape sequence denotes
+-- the NULL character and where quotation marks are omitted. A device will only
+-- process to this message when it is received from sender ID 0x42. An example
+-- string that could be sent to a device is "solution\0soln_freq\010\0".
 data MsgSettingsWrite = MsgSettingsWrite
-  { _msgSettingsWrite_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING, VALUE]. A device will only process to this message when it is
-    -- received from sender ID 0x42.
+  { _msgSettingsWrite_setting :: !string
+    -- ^ A NULL-terminated and NULL-delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0VALUE\0"
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsWrite where
@@ -90,13 +111,17 @@
 -- | SBP class for message MSG_SETTINGS_WRITE_RESP (0x00AF).
 --
 -- Return the status of a write request with the new value of the setting.  If
--- the requested value is rejected, the current value will be returned.
+-- the requested value is rejected, the current value will be returned. The
+-- string field is a NULL-terminated and NULL-delimited string with contents
+-- "SECTION_SETTING\0SETTING\0VALUE\0" where the '\0' escape sequence denotes
+-- the NULL character and where quotation marks are omitted. An example string
+-- that could be sent from device is "solution\0soln_freq\010\0".
 data MsgSettingsWriteResp = MsgSettingsWriteResp
-  { _msgSettingsWriteResp_status :: !Word8
+  { _msgSettingsWriteResp_status :: !uint32
     -- ^ Write status
-  , _msgSettingsWriteResp_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING, VALUE].
+  , _msgSettingsWriteResp_setting :: !string
+    -- ^ A NULL-terminated and delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0VALUE\0"
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsWriteResp where
@@ -118,12 +143,17 @@
 
 -- | SBP class for message MSG_SETTINGS_READ_REQ (0x00A4).
 --
--- The setting message reads the device configuration.
+-- The setting message that reads the device configuration. The string field is
+-- a NULL-terminated and NULL-delimited string with contents
+-- "SECTION_SETTING\0SETTING\0" where the '\0' escape sequence denotes the NULL
+-- character and where quotation marks are omitted. An example string that
+-- could be sent to a device is "solution\0soln_freq\0". A device will only
+-- respond to this message when it is received from sender ID 0x42. A device
+-- should respond with a MSG_SETTINGS_READ_RESP message (msg_id 0x00A5).
 data MsgSettingsReadReq = MsgSettingsReadReq
-  { _msgSettingsReadReq_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING]. A device will only respond to this message when it is received
-    -- from sender ID 0x42.
+  { _msgSettingsReadReq_setting :: !string
+    -- ^ A NULL-terminated and NULL-delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0"
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsReadReq where
@@ -143,11 +173,16 @@
 
 -- | SBP class for message MSG_SETTINGS_READ_RESP (0x00A5).
 --
--- The setting message reads the device configuration.
+-- The setting message wich which the device responds after a
+-- MSG_SETTING_READ_REQ is sent to device. The string field is a NULL-
+-- terminated and NULL-delimited string with contents
+-- "SECTION_SETTING\0SETTING\0VALUE\0" where the '\0' escape sequence denotes
+-- the NULL character and where quotation marks are omitted. An example string
+-- that could be sent from device is "solution\0soln_freq\010\0".
 data MsgSettingsReadResp = MsgSettingsReadResp
-  { _msgSettingsReadResp_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING, VALUE].
+  { _msgSettingsReadResp_setting :: !string
+    -- ^ A NULL-terminated and NULL-delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0VALUE\0"
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsReadResp where
@@ -167,12 +202,10 @@
 
 -- | SBP class for message MSG_SETTINGS_READ_BY_INDEX_REQ (0x00A2).
 --
--- The settings message for iterating through the settings values. It will read
--- the setting at an index, returning a NULL-terminated and delimited string
--- with contents [SECTION_SETTING, SETTING, VALUE]. A device will only respond
--- to this message when it is received from sender ID 0x42.
+-- The settings message for iterating through the settings values. A device
+-- will respond to this message with a  "MSG_SETTINGS_READ_BY_INDEX_RESP".
 data MsgSettingsReadByIndexReq = MsgSettingsReadByIndexReq
-  { _msgSettingsReadByIndexReq_index :: !Word16
+  { _msgSettingsReadByIndexReq_index :: !uint32
     -- ^ An index into the device settings, with values ranging from 0 to
     -- length(settings)
   } deriving ( Show, Read, Eq )
@@ -194,16 +227,22 @@
 
 -- | SBP class for message MSG_SETTINGS_READ_BY_INDEX_RESP (0x00A7).
 --
--- The settings message for iterating through the settings values. It will read
--- the setting at an index, returning a NULL-terminated and delimited string
--- with contents [SECTION_SETTING, SETTING, VALUE].
+-- The settings message that reports the value of a setting at an index.  In
+-- the string field, it reports NULL-terminated and delimited string with
+-- contents "SECTION_SETTING\0SETTING\0VALUE\0FORMAT_TYPE\0". where the '\0'
+-- escape sequence denotes the NULL character and where quotation marks are
+-- omitted. The FORMAT_TYPE field is optional and denotes possible string
+-- values of the setting as a hint to the user. If included, the format type
+-- portion of the string has the format "enum:value1,value2,value3". An example
+-- string that could be sent from the device is
+-- "simulator\0enabled\0True\0enum:True,False\0"
 data MsgSettingsReadByIndexResp = MsgSettingsReadByIndexResp
-  { _msgSettingsReadByIndexResp_index :: !Word16
+  { _msgSettingsReadByIndexResp_index :: !uint32
     -- ^ An index into the device settings, with values ranging from 0 to
     -- length(settings)
-  , _msgSettingsReadByIndexResp_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING, VALUE].
+  , _msgSettingsReadByIndexResp_setting :: !string
+    -- ^ A NULL-terminated and delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0VALUE\0FORMAT_TYPE\0"
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsReadByIndexResp where
@@ -248,9 +287,9 @@
 -- settings daemon.  The host should reply with MSG_SETTINGS_WRITE for this
 -- setting to set the initial value.
 data MsgSettingsRegister = MsgSettingsRegister
-  { _msgSettingsRegister_setting :: !Text
-    -- ^ A NULL-terminated and delimited string with contents [SECTION_SETTING,
-    -- SETTING, VALUE].
+  { _msgSettingsRegister_setting :: !string
+    -- ^ A NULL-terminated and delimited string with contents
+    -- "SECTION_SETTING\0SETTING\0VALUE".
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgSettingsRegister where
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
@@ -41,9 +41,9 @@
 -- Code biases are to be added to pseudorange. The corrections are conform with
 -- typical RTCMv3 MT1059 and 1065.
 data CodeBiasesContent = CodeBiasesContent
-  { _codeBiasesContent_code :: !Word8
+  { _codeBiasesContent_code :: !uint32
     -- ^ Signal constellation, band and code
-  , _codeBiasesContent_value :: !Int16
+  , _codeBiasesContent_value :: !sint32
     -- ^ Code bias value
   } deriving ( Show, Read, Eq )
 
@@ -65,16 +65,16 @@
 -- Phase biases are to be added to carrier phase measurements. The corrections
 -- are conform with typical RTCMv3 MT1059 and 1065.
 data PhaseBiasesContent = PhaseBiasesContent
-  { _phaseBiasesContent_code                     :: !Word8
+  { _phaseBiasesContent_code                     :: !uint32
     -- ^ Signal constellation, band and code
-  , _phaseBiasesContent_integer_indicator        :: !Word8
+  , _phaseBiasesContent_integer_indicator        :: !uint32
     -- ^ Indicator for integer property
-  , _phaseBiasesContent_widelane_integer_indicator :: !Word8
+  , _phaseBiasesContent_widelane_integer_indicator :: !uint32
     -- ^ Indicator for two groups of Wide-Lane(s) integer property
-  , _phaseBiasesContent_discontinuity_counter    :: !Word8
+  , _phaseBiasesContent_discontinuity_counter    :: !uint32
     -- ^ Signal phase discontinuity counter.  Increased for every discontinuity
     -- in phase.
-  , _phaseBiasesContent_bias                     :: !Int32
+  , _phaseBiasesContent_bias                     :: !sint32
     -- ^ Phase bias for specified signal
   } deriving ( Show, Read, Eq )
 
@@ -106,34 +106,34 @@
 -- correction to broadcast  ephemeris and is typically an equivalent to the
 -- 1060 and 1066 RTCM message types
 data MsgSsrOrbitClock = MsgSsrOrbitClock
-  { _msgSsrOrbitClock_time          :: !GpsTimeSec
+  { _msgSsrOrbitClock_time          :: !gnss.GpsTimeSec
     -- ^ GNSS reference time of the correction
-  , _msgSsrOrbitClock_sid           :: !GnssSignal
+  , _msgSsrOrbitClock_sid           :: !gnss.GnssSignal
     -- ^ GNSS signal identifier (16 bit)
-  , _msgSsrOrbitClock_update_interval :: !Word8
+  , _msgSsrOrbitClock_update_interval :: !uint32
     -- ^ Update interval between consecutive corrections
-  , _msgSsrOrbitClock_iod_ssr       :: !Word8
+  , _msgSsrOrbitClock_iod_ssr       :: !uint32
     -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to
     -- indicate a change in the SSR  generating configuration
-  , _msgSsrOrbitClock_iod           :: !Word8
+  , _msgSsrOrbitClock_iod           :: !uint32
     -- ^ Issue of broadcast ephemeris data
-  , _msgSsrOrbitClock_radial        :: !Int32
+  , _msgSsrOrbitClock_radial        :: !sint32
     -- ^ Orbit radial delta correction
-  , _msgSsrOrbitClock_along         :: !Int32
+  , _msgSsrOrbitClock_along         :: !sint32
     -- ^ Orbit along delta correction
-  , _msgSsrOrbitClock_cross         :: !Int32
+  , _msgSsrOrbitClock_cross         :: !sint32
     -- ^ Orbit along delta correction
-  , _msgSsrOrbitClock_dot_radial    :: !Int32
+  , _msgSsrOrbitClock_dot_radial    :: !sint32
     -- ^ Velocity of orbit radial delta correction
-  , _msgSsrOrbitClock_dot_along     :: !Int32
+  , _msgSsrOrbitClock_dot_along     :: !sint32
     -- ^ Velocity of orbit along delta correction
-  , _msgSsrOrbitClock_dot_cross     :: !Int32
+  , _msgSsrOrbitClock_dot_cross     :: !sint32
     -- ^ Velocity of orbit cross delta correction
-  , _msgSsrOrbitClock_c0            :: !Int32
+  , _msgSsrOrbitClock_c0            :: !sint32
     -- ^ C0 polynomial coefficient for correction of broadcast satellite clock
-  , _msgSsrOrbitClock_c1            :: !Int32
+  , _msgSsrOrbitClock_c1            :: !sint32
     -- ^ C1 polynomial coefficient for correction of broadcast satellite clock
-  , _msgSsrOrbitClock_c2            :: !Int32
+  , _msgSsrOrbitClock_c2            :: !sint32
     -- ^ C2 polynomial coefficient for correction of broadcast satellite clock
   } deriving ( Show, Read, Eq )
 
@@ -184,16 +184,16 @@
 -- corresponding signal to get corrected pseudorange. It is typically  an
 -- equivalent to the 1059 and 1065 RTCM message types
 data MsgSsrCodeBiases = MsgSsrCodeBiases
-  { _msgSsrCodeBiases_time          :: !GpsTimeSec
+  { _msgSsrCodeBiases_time          :: !gnss.GpsTimeSec
     -- ^ GNSS reference time of the correction
-  , _msgSsrCodeBiases_sid           :: !GnssSignal
+  , _msgSsrCodeBiases_sid           :: !gnss.GnssSignal
     -- ^ GNSS signal identifier (16 bit)
-  , _msgSsrCodeBiases_update_interval :: !Word8
+  , _msgSsrCodeBiases_update_interval :: !uint32
     -- ^ Update interval between consecutive corrections
-  , _msgSsrCodeBiases_iod_ssr       :: !Word8
+  , _msgSsrCodeBiases_iod_ssr       :: !uint32
     -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to
     -- indicate a change in the SSR  generating configuration
-  , _msgSsrCodeBiases_biases        :: ![CodeBiasesContent]
+  , _msgSsrCodeBiases_biases        :: !repeated CodeBiasesContent
     -- ^ Code biases for the different satellite signals
   } deriving ( Show, Read, Eq )
 
@@ -228,24 +228,24 @@
 -- the phase wind-up correction.  It is typically an equivalent to the 1265
 -- RTCM message types
 data MsgSsrPhaseBiases = MsgSsrPhaseBiases
-  { _msgSsrPhaseBiases_time          :: !GpsTimeSec
+  { _msgSsrPhaseBiases_time          :: !gnss.GpsTimeSec
     -- ^ GNSS reference time of the correction
-  , _msgSsrPhaseBiases_sid           :: !GnssSignal
+  , _msgSsrPhaseBiases_sid           :: !gnss.GnssSignal
     -- ^ GNSS signal identifier (16 bit)
-  , _msgSsrPhaseBiases_update_interval :: !Word8
+  , _msgSsrPhaseBiases_update_interval :: !uint32
     -- ^ Update interval between consecutive corrections
-  , _msgSsrPhaseBiases_iod_ssr       :: !Word8
+  , _msgSsrPhaseBiases_iod_ssr       :: !uint32
     -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to
     -- indicate a change in the SSR  generating configuration
-  , _msgSsrPhaseBiases_dispersive_bias :: !Word8
+  , _msgSsrPhaseBiases_dispersive_bias :: !uint32
     -- ^ Indicator for the dispersive phase biases property.
-  , _msgSsrPhaseBiases_mw_consistency :: !Word8
+  , _msgSsrPhaseBiases_mw_consistency :: !uint32
     -- ^ Consistency indicator for Melbourne-Wubbena linear combinations
-  , _msgSsrPhaseBiases_yaw           :: !Word16
+  , _msgSsrPhaseBiases_yaw           :: !uint32
     -- ^ Satellite yaw angle
-  , _msgSsrPhaseBiases_yaw_rate      :: !Int8
+  , _msgSsrPhaseBiases_yaw_rate      :: !sint32
     -- ^ Satellite yaw angle rate
-  , _msgSsrPhaseBiases_biases        :: ![PhaseBiasesContent]
+  , _msgSsrPhaseBiases_biases        :: !repeated PhaseBiasesContent
     -- ^ Phase biases corrections for a satellite being tracked.
   } deriving ( Show, Read, Eq )
 
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
@@ -44,11 +44,11 @@
 -- host or other attached devices that the system has started and is now ready
 -- to respond to commands or configuration requests.
 data MsgStartup = MsgStartup
-  { _msgStartup_cause      :: !Word8
+  { _msgStartup_cause      :: !uint32
     -- ^ Cause of startup
-  , _msgStartup_startup_type :: !Word8
+  , _msgStartup_startup_type :: !uint32
     -- ^ Startup type
-  , _msgStartup_reserved   :: !Word16
+  , _msgStartup_reserved   :: !uint32
     -- ^ Reserved
   } deriving ( Show, Read, Eq )
 
@@ -77,13 +77,13 @@
 -- corrections.  It is expected to be sent with each receipt of a complete
 -- corrections packet.
 data MsgDgnssStatus = MsgDgnssStatus
-  { _msgDgnssStatus_flags     :: !Word8
+  { _msgDgnssStatus_flags     :: !uint32
     -- ^ Status flags
-  , _msgDgnssStatus_latency   :: !Word16
+  , _msgDgnssStatus_latency   :: !uint32
     -- ^ Latency of observation receipt
-  , _msgDgnssStatus_num_signals :: !Word8
+  , _msgDgnssStatus_num_signals :: !uint32
     -- ^ Number of signals from base station
-  , _msgDgnssStatus_source    :: !Text
+  , _msgDgnssStatus_source    :: !string
     -- ^ Corrections source string
   } deriving ( Show, Read, Eq )
 
@@ -118,7 +118,7 @@
 -- indicate that an error has occurred in the system. To determine the source
 -- of the error, the remaining error flags should be inspected.
 data MsgHeartbeat = MsgHeartbeat
-  { _msgHeartbeat_flags :: !Word32
+  { _msgHeartbeat_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
@@ -142,7 +142,7 @@
 -- The INS status message describes the state of the operation and
 -- initialization of the inertial navigation system.
 data MsgInsStatus = MsgInsStatus
-  { _msgInsStatus_flags :: !Word32
+  { _msgInsStatus_flags :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Tracking.hs b/src/SwiftNav/SBP/Tracking.hs
--- a/src/SwiftNav/SBP/Tracking.hs
+++ b/src/SwiftNav/SBP/Tracking.hs
@@ -44,53 +44,53 @@
 -- The tracking message returns a set tracking channel parameters for a single
 -- tracking channel useful for debugging issues.
 data MsgTrackingStateDetailedDepA = MsgTrackingStateDetailedDepA
-  { _msgTrackingStateDetailedDepA_recv_time  :: !Word64
+  { _msgTrackingStateDetailedDepA_recv_time  :: !uint64
     -- ^ Receiver clock time.
-  , _msgTrackingStateDetailedDepA_tot        :: !GpsTime
+  , _msgTrackingStateDetailedDepA_tot        :: !gnss.GpsTime
     -- ^ Time of transmission of signal from satellite. TOW only valid when TOW
     -- status is decoded or propagated. WN only valid when week number valid
     -- flag is set.
-  , _msgTrackingStateDetailedDepA_P          :: !Word32
+  , _msgTrackingStateDetailedDepA_P          :: !uint32
     -- ^ Pseudorange observation. Valid only when pseudorange valid flag is set.
-  , _msgTrackingStateDetailedDepA_P_std      :: !Word16
+  , _msgTrackingStateDetailedDepA_P_std      :: !uint32
     -- ^ Pseudorange observation standard deviation. Valid only when pseudorange
     -- valid flag is set.
-  , _msgTrackingStateDetailedDepA_L          :: !CarrierPhase
+  , _msgTrackingStateDetailedDepA_L          :: !gnss.CarrierPhase
     -- ^ Carrier phase observation with typical sign convention. Valid only when
     -- PLL pessimistic lock is achieved.
-  , _msgTrackingStateDetailedDepA_cn0        :: !Word8
+  , _msgTrackingStateDetailedDepA_cn0        :: !uint32
     -- ^ Carrier-to-Noise density
-  , _msgTrackingStateDetailedDepA_lock       :: !Word16
+  , _msgTrackingStateDetailedDepA_lock       :: !uint32
     -- ^ Lock time. It is encoded according to DF402 from the RTCM 10403.2
     -- Amendment 2 specification. Valid values range from 0 to 15.
-  , _msgTrackingStateDetailedDepA_sid        :: !GnssSignal
+  , _msgTrackingStateDetailedDepA_sid        :: !gnss.GnssSignal
     -- ^ GNSS signal identifier.
-  , _msgTrackingStateDetailedDepA_doppler    :: !Int32
+  , _msgTrackingStateDetailedDepA_doppler    :: !sint32
     -- ^ Carrier Doppler frequency.
-  , _msgTrackingStateDetailedDepA_doppler_std :: !Word16
+  , _msgTrackingStateDetailedDepA_doppler_std :: !uint32
     -- ^ Carrier Doppler frequency standard deviation.
-  , _msgTrackingStateDetailedDepA_uptime     :: !Word32
+  , _msgTrackingStateDetailedDepA_uptime     :: !uint32
     -- ^ Number of seconds of continuous tracking. Specifies how much time signal
     -- is in continuous track.
-  , _msgTrackingStateDetailedDepA_clock_offset :: !Int16
+  , _msgTrackingStateDetailedDepA_clock_offset :: !sint32
     -- ^ TCXO clock offset. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailedDepA_clock_drift :: !Int16
+  , _msgTrackingStateDetailedDepA_clock_drift :: !sint32
     -- ^ TCXO clock drift. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailedDepA_corr_spacing :: !Word16
+  , _msgTrackingStateDetailedDepA_corr_spacing :: !uint32
     -- ^ Early-Prompt (EP) and Prompt-Late (PL) correlators spacing.
-  , _msgTrackingStateDetailedDepA_acceleration :: !Int8
+  , _msgTrackingStateDetailedDepA_acceleration :: !sint32
     -- ^ Acceleration. Valid only when acceleration valid flag is set.
-  , _msgTrackingStateDetailedDepA_sync_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_sync_flags :: !uint32
     -- ^ Synchronization status flags.
-  , _msgTrackingStateDetailedDepA_tow_flags  :: !Word8
+  , _msgTrackingStateDetailedDepA_tow_flags  :: !uint32
     -- ^ TOW status flags.
-  , _msgTrackingStateDetailedDepA_track_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_track_flags :: !uint32
     -- ^ Tracking loop status flags.
-  , _msgTrackingStateDetailedDepA_nav_flags  :: !Word8
+  , _msgTrackingStateDetailedDepA_nav_flags  :: !uint32
     -- ^ Navigation data status flags.
-  , _msgTrackingStateDetailedDepA_pset_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_pset_flags :: !uint32
     -- ^ Parameters sets flags.
-  , _msgTrackingStateDetailedDepA_misc_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_misc_flags :: !uint32
     -- ^ Miscellaneous flags.
   } deriving ( Show, Read, Eq )
 
@@ -153,53 +153,53 @@
 --
 -- Deprecated.
 data MsgTrackingStateDetailedDep = MsgTrackingStateDetailedDep
-  { _msgTrackingStateDetailedDep_recv_time  :: !Word64
+  { _msgTrackingStateDetailedDep_recv_time  :: !uint64
     -- ^ Receiver clock time.
   , _msgTrackingStateDetailedDep_tot        :: !GpsTimeDep
     -- ^ Time of transmission of signal from satellite. TOW only valid when TOW
     -- status is decoded or propagated. WN only valid when week number valid
     -- flag is set.
-  , _msgTrackingStateDetailedDep_P          :: !Word32
+  , _msgTrackingStateDetailedDep_P          :: !uint32
     -- ^ Pseudorange observation. Valid only when pseudorange valid flag is set.
-  , _msgTrackingStateDetailedDep_P_std      :: !Word16
+  , _msgTrackingStateDetailedDep_P_std      :: !uint32
     -- ^ Pseudorange observation standard deviation. Valid only when pseudorange
     -- valid flag is set.
-  , _msgTrackingStateDetailedDep_L          :: !CarrierPhase
+  , _msgTrackingStateDetailedDep_L          :: !gnss.CarrierPhase
     -- ^ Carrier phase observation with typical sign convention. Valid only when
     -- PLL pessimistic lock is achieved.
-  , _msgTrackingStateDetailedDep_cn0        :: !Word8
+  , _msgTrackingStateDetailedDep_cn0        :: !uint32
     -- ^ Carrier-to-Noise density
-  , _msgTrackingStateDetailedDep_lock       :: !Word16
+  , _msgTrackingStateDetailedDep_lock       :: !uint32
     -- ^ Lock time. It is encoded according to DF402 from the RTCM 10403.2
     -- Amendment 2 specification. Valid values range from 0 to 15.
   , _msgTrackingStateDetailedDep_sid        :: !GnssSignalDep
     -- ^ GNSS signal identifier.
-  , _msgTrackingStateDetailedDep_doppler    :: !Int32
+  , _msgTrackingStateDetailedDep_doppler    :: !sint32
     -- ^ Carrier Doppler frequency.
-  , _msgTrackingStateDetailedDep_doppler_std :: !Word16
+  , _msgTrackingStateDetailedDep_doppler_std :: !uint32
     -- ^ Carrier Doppler frequency standard deviation.
-  , _msgTrackingStateDetailedDep_uptime     :: !Word32
+  , _msgTrackingStateDetailedDep_uptime     :: !uint32
     -- ^ Number of seconds of continuous tracking. Specifies how much time signal
     -- is in continuous track.
-  , _msgTrackingStateDetailedDep_clock_offset :: !Int16
+  , _msgTrackingStateDetailedDep_clock_offset :: !sint32
     -- ^ TCXO clock offset. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailedDep_clock_drift :: !Int16
+  , _msgTrackingStateDetailedDep_clock_drift :: !sint32
     -- ^ TCXO clock drift. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailedDep_corr_spacing :: !Word16
+  , _msgTrackingStateDetailedDep_corr_spacing :: !uint32
     -- ^ Early-Prompt (EP) and Prompt-Late (PL) correlators spacing.
-  , _msgTrackingStateDetailedDep_acceleration :: !Int8
+  , _msgTrackingStateDetailedDep_acceleration :: !sint32
     -- ^ Acceleration. Valid only when acceleration valid flag is set.
-  , _msgTrackingStateDetailedDep_sync_flags :: !Word8
+  , _msgTrackingStateDetailedDep_sync_flags :: !uint32
     -- ^ Synchronization status flags.
-  , _msgTrackingStateDetailedDep_tow_flags  :: !Word8
+  , _msgTrackingStateDetailedDep_tow_flags  :: !uint32
     -- ^ TOW status flags.
-  , _msgTrackingStateDetailedDep_track_flags :: !Word8
+  , _msgTrackingStateDetailedDep_track_flags :: !uint32
     -- ^ Tracking loop status flags.
-  , _msgTrackingStateDetailedDep_nav_flags  :: !Word8
+  , _msgTrackingStateDetailedDep_nav_flags  :: !uint32
     -- ^ Navigation data status flags.
-  , _msgTrackingStateDetailedDep_pset_flags :: !Word8
+  , _msgTrackingStateDetailedDep_pset_flags :: !uint32
     -- ^ Parameters sets flags.
-  , _msgTrackingStateDetailedDep_misc_flags :: !Word8
+  , _msgTrackingStateDetailedDep_misc_flags :: !uint32
     -- ^ Miscellaneous flags.
   } deriving ( Show, Read, Eq )
 
@@ -260,11 +260,11 @@
 -- Tracking channel state for a specific satellite signal and measured signal
 -- power.
 data TrackingChannelState = TrackingChannelState
-  { _trackingChannelState_sid :: !GnssSignal
+  { _trackingChannelState_sid :: !gnss.GnssSignal
     -- ^ GNSS signal being tracked
-  , _trackingChannelState_fcn :: !Word8
+  , _trackingChannelState_fcn :: !uint32
     -- ^ Frequency channel number (GLONASS only)
-  , _trackingChannelState_cn0 :: !Word8
+  , _trackingChannelState_cn0 :: !uint32
     -- ^ Carrier-to-Noise density.  Zero implies invalid cn0.
   } deriving ( Show, Read, Eq )
 
@@ -292,7 +292,7 @@
 -- states. It reports status and carrier-to-noise density measurements for all
 -- tracked satellites.
 data MsgTrackingState = MsgTrackingState
-  { _msgTrackingState_states :: ![TrackingChannelState]
+  { _msgTrackingState_states :: !repeated TrackingChannelState
     -- ^ Signal tracking channel state
   } deriving ( Show, Read, Eq )
 
@@ -312,9 +312,9 @@
 --
 -- Structure containing in-phase and quadrature correlation components.
 data TrackingChannelCorrelation = TrackingChannelCorrelation
-  { _trackingChannelCorrelation_I :: !Int32
+  { _trackingChannelCorrelation_I :: !sint32
     -- ^ In-phase correlation
-  , _trackingChannelCorrelation_Q :: !Int32
+  , _trackingChannelCorrelation_Q :: !sint32
     -- ^ Quadrature correlation
   } deriving ( Show, Read, Eq )
 
@@ -339,11 +339,11 @@
 -- When enabled, a tracking channel can output the correlations at each update
 -- interval.
 data MsgTrackingIq = MsgTrackingIq
-  { _msgTrackingIq_channel :: !Word8
+  { _msgTrackingIq_channel :: !uint32
     -- ^ Tracking channel of origin
-  , _msgTrackingIq_sid   :: !GnssSignal
+  , _msgTrackingIq_sid   :: !gnss.GnssSignal
     -- ^ GNSS signal identifier
-  , _msgTrackingIq_corrs :: ![TrackingChannelCorrelation]
+  , _msgTrackingIq_corrs :: !repeated TrackingChannelCorrelation
     -- ^ Early, Prompt and Late correlations
   } deriving ( Show, Read, Eq )
 
@@ -370,11 +370,11 @@
 --
 -- Deprecated.
 data MsgTrackingIqDep = MsgTrackingIqDep
-  { _msgTrackingIqDep_channel :: !Word8
+  { _msgTrackingIqDep_channel :: !uint32
     -- ^ Tracking channel of origin
   , _msgTrackingIqDep_sid   :: !GnssSignalDep
     -- ^ GNSS signal identifier
-  , _msgTrackingIqDep_corrs :: ![TrackingChannelCorrelation]
+  , _msgTrackingIqDep_corrs :: !repeated TrackingChannelCorrelation
     -- ^ Early, Prompt and Late correlations
   } deriving ( Show, Read, Eq )
 
@@ -398,11 +398,11 @@
 --
 -- Deprecated.
 data TrackingChannelStateDepA = TrackingChannelStateDepA
-  { _trackingChannelStateDepA_state :: !Word8
+  { _trackingChannelStateDepA_state :: !uint32
     -- ^ Status of tracking channel
-  , _trackingChannelStateDepA_prn :: !Word8
+  , _trackingChannelStateDepA_prn :: !uint32
     -- ^ PRN-1 being tracked
-  , _trackingChannelStateDepA_cn0 :: !Float
+  , _trackingChannelStateDepA_cn0 :: !float
     -- ^ Carrier-to-noise density
   } deriving ( Show, Read, Eq )
 
@@ -428,7 +428,7 @@
 --
 -- Deprecated.
 data MsgTrackingStateDepA = MsgTrackingStateDepA
-  { _msgTrackingStateDepA_states :: ![TrackingChannelStateDepA]
+  { _msgTrackingStateDepA_states :: !repeated TrackingChannelStateDepA
     -- ^ Satellite tracking channel state
   } deriving ( Show, Read, Eq )
 
@@ -448,11 +448,11 @@
 --
 -- Deprecated.
 data TrackingChannelStateDepB = TrackingChannelStateDepB
-  { _trackingChannelStateDepB_state :: !Word8
+  { _trackingChannelStateDepB_state :: !uint32
     -- ^ Status of tracking channel
   , _trackingChannelStateDepB_sid :: !GnssSignalDep
     -- ^ GNSS signal being tracked
-  , _trackingChannelStateDepB_cn0 :: !Float
+  , _trackingChannelStateDepB_cn0 :: !float
     -- ^ Carrier-to-noise density
   } deriving ( Show, Read, Eq )
 
@@ -478,7 +478,7 @@
 --
 -- Deprecated.
 data MsgTrackingStateDepB = MsgTrackingStateDepB
-  { _msgTrackingStateDepB_states :: ![TrackingChannelStateDepB]
+  { _msgTrackingStateDepB_states :: !repeated TrackingChannelStateDepB
     -- ^ Signal tracking channel state
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/User.hs b/src/SwiftNav/SBP/User.hs
--- a/src/SwiftNav/SBP/User.hs
+++ b/src/SwiftNav/SBP/User.hs
@@ -43,7 +43,7 @@
 -- This message can contain any application specific user data up to a maximum
 -- length of 255 bytes per message.
 data MsgUserData = MsgUserData
-  { _msgUserData_contents :: ![Word8]
+  { _msgUserData_contents :: !repeated uint32
     -- ^ User data payload
   } deriving ( Show, Read, Eq )
 
diff --git a/src/SwiftNav/SBP/Vehicle.hs b/src/SwiftNav/SBP/Vehicle.hs
--- a/src/SwiftNav/SBP/Vehicle.hs
+++ b/src/SwiftNav/SBP/Vehicle.hs
@@ -46,13 +46,13 @@
 -- user-defined sources of this message  which are labeled arbitrarily  source
 -- 0 through 3.
 data MsgOdometry = MsgOdometry
-  { _msgOdometry_tow    :: !Word32
+  { _msgOdometry_tow    :: !uint32
     -- ^ Time field representing either milliseconds in the GPS Week or local CPU
     -- time from the producing system in milliseconds.  See the tow_source flag
     -- for the exact source of this timestamp.
-  , _msgOdometry_velocity :: !Int32
+  , _msgOdometry_velocity :: !sint32
     -- ^ The signed forward component of vehicle velocity.
-  , _msgOdometry_flags  :: !Word8
+  , _msgOdometry_flags  :: !uint32
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
