diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@
 
 or
 
-    $ stack install --resolver lts-8.23 sbp # (LTS-8)
+    $ stack install --resolver lts-8.24 sbp # (LTS-8)
 
 Note that we explicitly specify the resolvers to use, as installing `libsbp` may
 fail to build with more recent resolvers.
@@ -42,7 +42,12 @@
 
     $ stack upload
 
-## Usage Examples (TODO)
+## Publishing
+
+To publish to [Hackage](http://hackage.haskell.org/package/sbp), use the
+`publish-lower` recipe in the `Shakefile.hs` with LTS-6 `stack.yaml`:
+
+    $ STACK_YAML=stack-lts-6.yaml ./Shakefile.hs publish-lower
 
 ## References
 
diff --git a/main/JSON2SBP.hs b/main/JSON2SBP.hs
--- a/main/JSON2SBP.hs
+++ b/main/JSON2SBP.hs
@@ -13,7 +13,6 @@
 -- stdout.
 
 import BasicPrelude                      hiding (lines, mapMaybe)
-import Control.Monad.Trans.Resource
 import Data.Aeson
 import Data.Conduit
 import Data.Conduit.Binary
@@ -31,14 +30,15 @@
   parseJSON _ = mzero
 
 -- | Decode a SBPMsg from JSON.
+--
 decodeSBPMsg :: ByteString -> Maybe SBPMsg
 decodeSBPMsg v = decodeStrict v <|> sbpMsgData <$> decodeStrict v
 
 main :: IO ()
 main =
-  runResourceT $
-    sourceHandle stdin    =$=
-    lines                 =$=
-    mapMaybe decodeSBPMsg =$=
-    conduitEncode         $$
-    sinkHandle stdout
+  runConduitRes $
+    sourceHandle stdin
+      =$= lines
+      =$= mapMaybe decodeSBPMsg
+      =$= conduitEncode
+      $$  sinkHandle stdout
diff --git a/main/SBP2JSON.hs b/main/SBP2JSON.hs
--- a/main/SBP2JSON.hs
+++ b/main/SBP2JSON.hs
@@ -13,7 +13,6 @@
 -- to stdout.
 
 import BasicPrelude                      hiding (map)
-import Control.Monad.Trans.Resource
 import Data.Aeson
 import Data.ByteString.Lazy              hiding (ByteString, map)
 import Data.Conduit
@@ -29,8 +28,8 @@
 
 main :: IO ()
 main =
-  runResourceT $
-    sourceHandle stdin  =$=
-      conduitDecode     =$=
-      map encodeLine    $$
-      sinkHandle stdout
+  runConduitRes $
+    sourceHandle stdin
+      =$= conduitDecode
+      =$= map encodeLine
+      $$  sinkHandle stdout
diff --git a/main/SBP2YAML.hs b/main/SBP2YAML.hs
--- a/main/SBP2YAML.hs
+++ b/main/SBP2YAML.hs
@@ -12,7 +12,6 @@
 -- to stdout.
 
 import BasicPrelude                      hiding (map)
-import Control.Monad.Trans.Resource
 import Data.Conduit
 import Data.Conduit.Binary
 import Data.Conduit.List
@@ -23,8 +22,8 @@
 
 main :: IO ()
 main =
-  runResourceT $
-    sourceHandle stdin                   =$=
-    conduitDecode                        =$=
-    map (encode :: SBPMsg -> ByteString) $$
-    sinkHandle stdout
+  runConduitRes $
+    sourceHandle stdin
+      =$= conduitDecode
+      =$= map (encode :: SBPMsg -> ByteString)
+      $$  sinkHandle stdout
diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,5 +1,5 @@
 name: sbp
-version: 2.2.11
+version: 2.2.12
 cabal-version: >=1.22
 build-type: Simple
 license: LGPL-3
@@ -76,7 +76,6 @@
         bytestring >=0.10.6.0,
         conduit >=1.2.10,
         conduit-extra >=1.1.16,
-        resourcet >=1.1.9,
         sbp
     default-language: Haskell2010
     hs-source-dirs: main
@@ -91,7 +90,6 @@
         binary-conduit >=1.2.4.1,
         conduit >=1.2.10,
         conduit-extra >=1.1.16,
-        resourcet >=1.1.9,
         sbp
     default-language: Haskell2010
     hs-source-dirs: main
@@ -106,7 +104,6 @@
         bytestring >=0.10.6.0,
         conduit >=1.2.10,
         conduit-extra >=1.1.16,
-        resourcet >=1.1.9,
         sbp,
         yaml >=0.8.23
     default-language: Haskell2010
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
@@ -31,6 +31,11 @@
 import SwiftNav.SBP.Types
 import SwiftNav.SBP.Gnss
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgAcqResult :: Word16
 msgAcqResult = 0x001F
 
@@ -57,7 +62,7 @@
     _msgAcqResult_cp <- getFloat32le
     _msgAcqResult_cf <- getFloat32le
     _msgAcqResult_sid <- get
-    return MsgAcqResult {..}
+    pure MsgAcqResult {..}
 
   put MsgAcqResult {..} = do
     putFloat32le _msgAcqResult_cn0
@@ -93,7 +98,7 @@
     _msgAcqResultDepB_cp <- getFloat32le
     _msgAcqResultDepB_cf <- getFloat32le
     _msgAcqResultDepB_sid <- get
-    return MsgAcqResultDepB {..}
+    pure MsgAcqResultDepB {..}
 
   put MsgAcqResultDepB {..} = do
     putFloat32le _msgAcqResultDepB_snr
@@ -130,7 +135,7 @@
     _msgAcqResultDepA_cp <- getFloat32le
     _msgAcqResultDepA_cf <- getFloat32le
     _msgAcqResultDepA_prn <- getWord8
-    return MsgAcqResultDepA {..}
+    pure MsgAcqResultDepA {..}
 
   put MsgAcqResultDepA {..} = do
     putFloat32le _msgAcqResultDepA_snr
@@ -188,7 +193,7 @@
     _acqSvProfile_cf_max <- fromIntegral <$> getWord32le
     _acqSvProfile_cf <- fromIntegral <$> getWord32le
     _acqSvProfile_cp <- getWord32le
-    return AcqSvProfile {..}
+    pure AcqSvProfile {..}
 
   put AcqSvProfile {..} = do
     putWord8 _acqSvProfile_job_type
@@ -222,7 +227,7 @@
 instance Binary MsgAcqSvProfile where
   get = do
     _msgAcqSvProfile_acq_sv_profile <- whileM (not <$> isEmpty) get
-    return MsgAcqSvProfile {..}
+    pure MsgAcqSvProfile {..}
 
   put MsgAcqSvProfile {..} = do
     mapM_ put _msgAcqSvProfile_acq_sv_profile
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
@@ -32,6 +32,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgBootloaderHandshakeReq :: Word16
 msgBootloaderHandshakeReq = 0x00B3
 
@@ -45,10 +50,10 @@
 
 instance Binary MsgBootloaderHandshakeReq where
   get =
-    return MsgBootloaderHandshakeReq
+    pure MsgBootloaderHandshakeReq
 
   put MsgBootloaderHandshakeReq =
-    return ()
+    pure ()
 $(makeSBP 'msgBootloaderHandshakeReq ''MsgBootloaderHandshakeReq)
 $(makeJSON "_msgBootloaderHandshakeReq_" ''MsgBootloaderHandshakeReq)
 $(makeLenses ''MsgBootloaderHandshakeReq)
@@ -73,7 +78,7 @@
   get = do
     _msgBootloaderHandshakeResp_flags <- getWord32le
     _msgBootloaderHandshakeResp_version <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgBootloaderHandshakeResp {..}
+    pure MsgBootloaderHandshakeResp {..}
 
   put MsgBootloaderHandshakeResp {..} = do
     putWord32le _msgBootloaderHandshakeResp_flags
@@ -97,7 +102,7 @@
 instance Binary MsgBootloaderJumpToApp where
   get = do
     _msgBootloaderJumpToApp_jump <- getWord8
-    return MsgBootloaderJumpToApp {..}
+    pure MsgBootloaderJumpToApp {..}
 
   put MsgBootloaderJumpToApp {..} = do
     putWord8 _msgBootloaderJumpToApp_jump
@@ -121,10 +126,10 @@
 
 instance Binary MsgNapDeviceDnaReq where
   get =
-    return MsgNapDeviceDnaReq
+    pure MsgNapDeviceDnaReq
 
   put MsgNapDeviceDnaReq =
-    return ()
+    pure ()
 $(makeSBP 'msgNapDeviceDnaReq ''MsgNapDeviceDnaReq)
 $(makeJSON "_msgNapDeviceDnaReq_" ''MsgNapDeviceDnaReq)
 $(makeLenses ''MsgNapDeviceDnaReq)
@@ -148,7 +153,7 @@
 instance Binary MsgNapDeviceDnaResp where
   get = do
     _msgNapDeviceDnaResp_dna <- replicateM 8 getWord8
-    return MsgNapDeviceDnaResp {..}
+    pure MsgNapDeviceDnaResp {..}
 
   put MsgNapDeviceDnaResp {..} = do
     mapM_ putWord8 _msgNapDeviceDnaResp_dna
@@ -171,7 +176,7 @@
 instance Binary MsgBootloaderHandshakeDepA where
   get = do
     _msgBootloaderHandshakeDepA_handshake <- whileM (not <$> isEmpty) getWord8
-    return MsgBootloaderHandshakeDepA {..}
+    pure MsgBootloaderHandshakeDepA {..}
 
   put MsgBootloaderHandshakeDepA {..} = do
     mapM_ putWord8 _msgBootloaderHandshakeDepA_handshake
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
@@ -31,6 +31,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgExtEvent :: Word16
 msgExtEvent = 0x0101
 
@@ -59,7 +64,7 @@
     _msgExtEvent_ns_residual <- fromIntegral <$> getWord32le
     _msgExtEvent_flags <- getWord8
     _msgExtEvent_pin <- getWord8
-    return MsgExtEvent {..}
+    pure MsgExtEvent {..}
 
   put MsgExtEvent {..} = do
     putWord16le _msgExtEvent_wn
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
@@ -35,6 +35,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgFileioReadReq :: Word16
 msgFileioReadReq = 0x00A8
 
@@ -64,7 +69,7 @@
     _msgFileioReadReq_offset <- getWord32le
     _msgFileioReadReq_chunk_size <- getWord8
     _msgFileioReadReq_filename <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgFileioReadReq {..}
+    pure MsgFileioReadReq {..}
 
   put MsgFileioReadReq {..} = do
     putWord32le _msgFileioReadReq_sequence
@@ -96,7 +101,7 @@
   get = do
     _msgFileioReadResp_sequence <- getWord32le
     _msgFileioReadResp_contents <- whileM (not <$> isEmpty) getWord8
-    return MsgFileioReadResp {..}
+    pure MsgFileioReadResp {..}
 
   put MsgFileioReadResp {..} = do
     putWord32le _msgFileioReadResp_sequence
@@ -133,7 +138,7 @@
     _msgFileioReadDirReq_sequence <- getWord32le
     _msgFileioReadDirReq_offset <- getWord32le
     _msgFileioReadDirReq_dirname <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgFileioReadDirReq {..}
+    pure MsgFileioReadDirReq {..}
 
   put MsgFileioReadDirReq {..} = do
     putWord32le _msgFileioReadDirReq_sequence
@@ -165,7 +170,7 @@
   get = do
     _msgFileioReadDirResp_sequence <- getWord32le
     _msgFileioReadDirResp_contents <- whileM (not <$> isEmpty) getWord8
-    return MsgFileioReadDirResp {..}
+    pure MsgFileioReadDirResp {..}
 
   put MsgFileioReadDirResp {..} = do
     putWord32le _msgFileioReadDirResp_sequence
@@ -192,7 +197,7 @@
 instance Binary MsgFileioRemove where
   get = do
     _msgFileioRemove_filename <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgFileioRemove {..}
+    pure MsgFileioRemove {..}
 
   put MsgFileioRemove {..} = do
     putByteString $ encodeUtf8 _msgFileioRemove_filename
@@ -230,7 +235,7 @@
     _msgFileioWriteReq_offset <- getWord32le
     _msgFileioWriteReq_filename <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
     _msgFileioWriteReq_data <- whileM (not <$> isEmpty) getWord8
-    return MsgFileioWriteReq {..}
+    pure MsgFileioWriteReq {..}
 
   put MsgFileioWriteReq {..} = do
     putWord32le _msgFileioWriteReq_sequence
@@ -259,7 +264,7 @@
 instance Binary MsgFileioWriteResp where
   get = do
     _msgFileioWriteResp_sequence <- getWord32le
-    return MsgFileioWriteResp {..}
+    pure MsgFileioWriteResp {..}
 
   put MsgFileioWriteResp {..} = do
     putWord32le _msgFileioWriteResp_sequence
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
@@ -33,6 +33,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgFlashProgram :: Word16
 msgFlashProgram = 0x00E6
 
@@ -60,7 +65,7 @@
     _msgFlashProgram_addr_start <- replicateM 3 getWord8
     _msgFlashProgram_addr_len <- getWord8
     _msgFlashProgram_data <- whileM (not <$> isEmpty) getWord8
-    return MsgFlashProgram {..}
+    pure MsgFlashProgram {..}
 
   put MsgFlashProgram {..} = do
     putWord8 _msgFlashProgram_target
@@ -89,7 +94,7 @@
 instance Binary MsgFlashDone where
   get = do
     _msgFlashDone_response <- getWord8
-    return MsgFlashDone {..}
+    pure MsgFlashDone {..}
 
   put MsgFlashDone {..} = do
     putWord8 _msgFlashDone_response
@@ -123,7 +128,7 @@
     _msgFlashReadReq_target <- getWord8
     _msgFlashReadReq_addr_start <- replicateM 3 getWord8
     _msgFlashReadReq_addr_len <- getWord8
-    return MsgFlashReadReq {..}
+    pure MsgFlashReadReq {..}
 
   put MsgFlashReadReq {..} = do
     putWord8 _msgFlashReadReq_target
@@ -159,7 +164,7 @@
     _msgFlashReadResp_target <- getWord8
     _msgFlashReadResp_addr_start <- replicateM 3 getWord8
     _msgFlashReadResp_addr_len <- getWord8
-    return MsgFlashReadResp {..}
+    pure MsgFlashReadResp {..}
 
   put MsgFlashReadResp {..} = do
     putWord8 _msgFlashReadResp_target
@@ -190,7 +195,7 @@
   get = do
     _msgFlashErase_target <- getWord8
     _msgFlashErase_sector_num <- getWord32le
-    return MsgFlashErase {..}
+    pure MsgFlashErase {..}
 
   put MsgFlashErase {..} = do
     putWord8 _msgFlashErase_target
@@ -215,7 +220,7 @@
 instance Binary MsgStmFlashLockSector where
   get = do
     _msgStmFlashLockSector_sector <- getWord32le
-    return MsgStmFlashLockSector {..}
+    pure MsgStmFlashLockSector {..}
 
   put MsgStmFlashLockSector {..} = do
     putWord32le _msgStmFlashLockSector_sector
@@ -239,7 +244,7 @@
 instance Binary MsgStmFlashUnlockSector where
   get = do
     _msgStmFlashUnlockSector_sector <- getWord32le
-    return MsgStmFlashUnlockSector {..}
+    pure MsgStmFlashUnlockSector {..}
 
   put MsgStmFlashUnlockSector {..} = do
     putWord32le _msgStmFlashUnlockSector_sector
@@ -261,10 +266,10 @@
 
 instance Binary MsgStmUniqueIdReq where
   get =
-    return MsgStmUniqueIdReq
+    pure MsgStmUniqueIdReq
 
   put MsgStmUniqueIdReq =
-    return ()
+    pure ()
 $(makeSBP 'msgStmUniqueIdReq ''MsgStmUniqueIdReq)
 $(makeJSON "_msgStmUniqueIdReq_" ''MsgStmUniqueIdReq)
 $(makeLenses ''MsgStmUniqueIdReq)
@@ -285,7 +290,7 @@
 instance Binary MsgStmUniqueIdResp where
   get = do
     _msgStmUniqueIdResp_stm_id <- replicateM 12 getWord8
-    return MsgStmUniqueIdResp {..}
+    pure MsgStmUniqueIdResp {..}
 
   put MsgStmUniqueIdResp {..} = do
     mapM_ putWord8 _msgStmUniqueIdResp_stm_id
@@ -309,7 +314,7 @@
 instance Binary MsgM25FlashWriteStatus where
   get = do
     _msgM25FlashWriteStatus_status <- replicateM 1 getWord8
-    return MsgM25FlashWriteStatus {..}
+    pure MsgM25FlashWriteStatus {..}
 
   put MsgM25FlashWriteStatus {..} = do
     mapM_ putWord8 _msgM25FlashWriteStatus_status
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
@@ -30,6 +30,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 -- | GnssSignal16.
 --
 -- Signal identifier containing constellation, band, and satellite identifier
@@ -44,7 +49,7 @@
   get = do
     _gnssSignal16_sat <- getWord8
     _gnssSignal16_code <- getWord8
-    return GnssSignal16 {..}
+    pure GnssSignal16 {..}
 
   put GnssSignal16 {..} = do
     putWord8 _gnssSignal16_sat
@@ -72,7 +77,7 @@
     _gnssSignal_sat <- getWord16le
     _gnssSignal_code <- getWord8
     _gnssSignal_reserved <- getWord8
-    return GnssSignal {..}
+    pure GnssSignal {..}
 
   put GnssSignal {..} = do
     putWord16le _gnssSignal_sat
@@ -97,7 +102,7 @@
   get = do
     _gpsTime_tow <- getWord32le
     _gpsTime_wn <- getWord16le
-    return GpsTime {..}
+    pure GpsTime {..}
 
   put GpsTime {..} = do
     putWord32le _gpsTime_tow
@@ -121,7 +126,7 @@
   get = do
     _gpsTimeSec_tow <- getWord32le
     _gpsTimeSec_wn <- getWord16le
-    return GpsTimeSec {..}
+    pure GpsTimeSec {..}
 
   put GpsTimeSec {..} = do
     putWord32le _gpsTimeSec_tow
@@ -150,7 +155,7 @@
     _gpsTimeNano_tow <- getWord32le
     _gpsTimeNano_ns_residual <- fromIntegral <$> getWord32le
     _gpsTimeNano_wn <- getWord16le
-    return GpsTimeNano {..}
+    pure GpsTimeNano {..}
 
   put GpsTimeNano {..} = do
     putWord32le _gpsTimeNano_tow
@@ -176,7 +181,7 @@
   get = do
     _carrierPhase_i <- fromIntegral <$> getWord32le
     _carrierPhase_f <- getWord8
-    return CarrierPhase {..}
+    pure CarrierPhase {..}
 
   put CarrierPhase {..} = do
     putWord32le $ fromIntegral _carrierPhase_i
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
@@ -30,6 +30,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgImuRaw :: Word16
 msgImuRaw = 0x0900
 
@@ -67,7 +72,7 @@
     _msgImuRaw_gyr_x <- fromIntegral <$> getWord16le
     _msgImuRaw_gyr_y <- fromIntegral <$> getWord16le
     _msgImuRaw_gyr_z <- fromIntegral <$> getWord16le
-    return MsgImuRaw {..}
+    pure MsgImuRaw {..}
 
   put MsgImuRaw {..} = do
     putWord32le _msgImuRaw_tow
@@ -105,7 +110,7 @@
     _msgImuAux_imu_type <- getWord8
     _msgImuAux_temp <- fromIntegral <$> getWord16le
     _msgImuAux_imu_conf <- getWord8
-    return MsgImuAux {..}
+    pure MsgImuAux {..}
 
   put MsgImuAux {..} = do
     putWord8 _msgImuAux_imu_type
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
@@ -30,6 +30,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgLog :: Word16
 msgLog = 0x0401
 
@@ -49,7 +54,7 @@
   get = do
     _msgLog_level <- getWord8
     _msgLog_text <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgLog {..}
+    pure MsgLog {..}
 
   put MsgLog {..} = do
     putWord8 _msgLog_level
@@ -85,7 +90,7 @@
     _msgFwd_source <- getWord8
     _msgFwd_protocol <- getWord8
     _msgFwd_fwd_payload <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgFwd {..}
+    pure MsgFwd {..}
 
   put MsgFwd {..} = do
     putWord8 _msgFwd_source
@@ -110,7 +115,7 @@
 instance Binary MsgTweet where
   get = do
     _msgTweet_tweet <- decodeUtf8 <$> getByteString 140
-    return MsgTweet {..}
+    pure MsgTweet {..}
 
   put MsgTweet {..} = do
     putByteString $ encodeUtf8 _msgTweet_tweet
@@ -133,7 +138,7 @@
 instance Binary MsgPrintDep where
   get = do
     _msgPrintDep_text <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgPrintDep {..}
+    pure MsgPrintDep {..}
 
   put MsgPrintDep {..} = do
     putByteString $ encodeUtf8 _msgPrintDep_text
diff --git a/src/SwiftNav/SBP/Msg.hs b/src/SwiftNav/SBP/Msg.hs
--- a/src/SwiftNav/SBP/Msg.hs
+++ b/src/SwiftNav/SBP/Msg.hs
@@ -90,7 +90,6 @@
    | SBPMsgEphemerisSbas MsgEphemerisSbas Msg
    | SBPMsgEphemerisSbasDepA MsgEphemerisSbasDepA Msg
    | SBPMsgExtEvent MsgExtEvent Msg
-   | SBPMsgFcnsGlo MsgFcnsGlo Msg
    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg
    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg
    | SBPMsgFileioReadReq MsgFileioReadReq Msg
@@ -220,7 +219,6 @@
           | _msgSBPType == msgEphemerisSbas = SBPMsgEphemerisSbas (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgExtEvent = SBPMsgExtEvent (decode (fromStrict (unBytes _msgSBPPayload))) m
-          | _msgSBPType == msgFcnsGlo = SBPMsgFcnsGlo (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgFileioReadDirReq = SBPMsgFileioReadDirReq (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgFileioReadDirResp = SBPMsgFileioReadDirResp (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgFileioReadReq = SBPMsgFileioReadReq (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -342,7 +340,6 @@
       encoder (SBPMsgEphemerisSbas _ m) = put m
       encoder (SBPMsgEphemerisSbasDepA _ m) = put m
       encoder (SBPMsgExtEvent _ m) = put m
-      encoder (SBPMsgFcnsGlo _ m) = put m
       encoder (SBPMsgFileioReadDirReq _ m) = put m
       encoder (SBPMsgFileioReadDirResp _ m) = put m
       encoder (SBPMsgFileioReadReq _ m) = put m
@@ -468,7 +465,6 @@
         | msgType == msgEphemerisSbas = SBPMsgEphemerisSbas <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgExtEvent = SBPMsgExtEvent <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
-        | msgType == msgFcnsGlo = SBPMsgFcnsGlo <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgFileioReadDirReq = SBPMsgFileioReadDirReq <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgFileioReadDirResp = SBPMsgFileioReadDirResp <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgFileioReadReq = SBPMsgFileioReadReq <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -550,7 +546,7 @@
 (<<>>) a b = fromMaybe Null $ do
   a' <- preview _Object a
   b' <- preview _Object b
-  return $ review _Object $ a' <> b'
+  pure $ review _Object $ a' <> b'
 
 instance ToJSON SBPMsg where
   toJSON (SBPMsgAcqResult n m) = toJSON n <<>> toJSON m
@@ -595,7 +591,6 @@
   toJSON (SBPMsgEphemerisSbas n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgEphemerisSbasDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgExtEvent n m) = toJSON n <<>> toJSON m
-  toJSON (SBPMsgFcnsGlo n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgFileioReadDirReq n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgFileioReadDirResp n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgFileioReadReq n m) = toJSON n <<>> toJSON m
@@ -716,7 +711,6 @@
   msg f (SBPMsgEphemerisSbas n m) = SBPMsgEphemerisSbas n <$> f m
   msg f (SBPMsgEphemerisSbasDepA n m) = SBPMsgEphemerisSbasDepA n <$> f m
   msg f (SBPMsgExtEvent n m) = SBPMsgExtEvent n <$> f m
-  msg f (SBPMsgFcnsGlo n m) = SBPMsgFcnsGlo n <$> f m
   msg f (SBPMsgFileioReadDirReq n m) = SBPMsgFileioReadDirReq n <$> f m
   msg f (SBPMsgFileioReadDirResp n m) = SBPMsgFileioReadDirResp n <$> f m
   msg f (SBPMsgFileioReadReq n m) = SBPMsgFileioReadReq n <$> f m
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
@@ -38,6 +38,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgGpsTime :: Word16
 msgGpsTime = 0x0102
 
@@ -70,7 +75,7 @@
     _msgGpsTime_tow <- getWord32le
     _msgGpsTime_ns_residual <- fromIntegral <$> getWord32le
     _msgGpsTime_flags <- getWord8
-    return MsgGpsTime {..}
+    pure MsgGpsTime {..}
 
   put MsgGpsTime {..} = do
     putWord16le _msgGpsTime_wn
@@ -122,7 +127,7 @@
     _msgUtcTime_minutes <- getWord8
     _msgUtcTime_seconds <- getWord8
     _msgUtcTime_ns <- getWord32le
-    return MsgUtcTime {..}
+    pure MsgUtcTime {..}
 
   put MsgUtcTime {..} = do
     putWord8 _msgUtcTime_flags
@@ -174,7 +179,7 @@
     _msgDops_hdop <- getWord16le
     _msgDops_vdop <- getWord16le
     _msgDops_flags <- getWord8
-    return MsgDops {..}
+    pure MsgDops {..}
 
   put MsgDops {..} = do
     putWord32le _msgDops_tow
@@ -227,7 +232,7 @@
     _msgPosEcef_accuracy <- getWord16le
     _msgPosEcef_n_sats <- getWord8
     _msgPosEcef_flags <- getWord8
-    return MsgPosEcef {..}
+    pure MsgPosEcef {..}
 
   put MsgPosEcef {..} = do
     putWord32le _msgPosEcef_tow
@@ -283,7 +288,7 @@
     _msgPosLlh_v_accuracy <- getWord16le
     _msgPosLlh_n_sats <- getWord8
     _msgPosLlh_flags <- getWord8
-    return MsgPosLlh {..}
+    pure MsgPosLlh {..}
 
   put MsgPosLlh {..} = do
     putWord32le _msgPosLlh_tow
@@ -334,7 +339,7 @@
     _msgBaselineEcef_accuracy <- getWord16le
     _msgBaselineEcef_n_sats <- getWord8
     _msgBaselineEcef_flags <- getWord8
-    return MsgBaselineEcef {..}
+    pure MsgBaselineEcef {..}
 
   put MsgBaselineEcef {..} = do
     putWord32le _msgBaselineEcef_tow
@@ -389,7 +394,7 @@
     _msgBaselineNed_v_accuracy <- getWord16le
     _msgBaselineNed_n_sats <- getWord8
     _msgBaselineNed_flags <- getWord8
-    return MsgBaselineNed {..}
+    pure MsgBaselineNed {..}
 
   put MsgBaselineNed {..} = do
     putWord32le _msgBaselineNed_tow
@@ -439,7 +444,7 @@
     _msgVelEcef_accuracy <- getWord16le
     _msgVelEcef_n_sats <- getWord8
     _msgVelEcef_flags <- getWord8
-    return MsgVelEcef {..}
+    pure MsgVelEcef {..}
 
   put MsgVelEcef {..} = do
     putWord32le _msgVelEcef_tow
@@ -492,7 +497,7 @@
     _msgVelNed_v_accuracy <- getWord16le
     _msgVelNed_n_sats <- getWord8
     _msgVelNed_flags <- getWord8
-    return MsgVelNed {..}
+    pure MsgVelNed {..}
 
   put MsgVelNed {..} = do
     putWord32le _msgVelNed_tow
@@ -534,7 +539,7 @@
     _msgBaselineHeading_heading <- getWord32le
     _msgBaselineHeading_n_sats <- getWord8
     _msgBaselineHeading_flags <- getWord8
-    return MsgBaselineHeading {..}
+    pure MsgBaselineHeading {..}
 
   put MsgBaselineHeading {..} = do
     putWord32le _msgBaselineHeading_tow
@@ -564,7 +569,7 @@
   get = do
     _msgAgeCorrections_tow <- getWord32le
     _msgAgeCorrections_age <- getWord16le
-    return MsgAgeCorrections {..}
+    pure MsgAgeCorrections {..}
 
   put MsgAgeCorrections {..} = do
     putWord32le _msgAgeCorrections_tow
@@ -606,7 +611,7 @@
     _msgGpsTimeDepA_tow <- getWord32le
     _msgGpsTimeDepA_ns_residual <- fromIntegral <$> getWord32le
     _msgGpsTimeDepA_flags <- getWord8
-    return MsgGpsTimeDepA {..}
+    pure MsgGpsTimeDepA {..}
 
   put MsgGpsTimeDepA {..} = do
     putWord16le _msgGpsTimeDepA_wn
@@ -648,7 +653,7 @@
     _msgDopsDepA_tdop <- getWord16le
     _msgDopsDepA_hdop <- getWord16le
     _msgDopsDepA_vdop <- getWord16le
-    return MsgDopsDepA {..}
+    pure MsgDopsDepA {..}
 
   put MsgDopsDepA {..} = do
     putWord32le _msgDopsDepA_tow
@@ -700,7 +705,7 @@
     _msgPosEcefDepA_accuracy <- getWord16le
     _msgPosEcefDepA_n_sats <- getWord8
     _msgPosEcefDepA_flags <- getWord8
-    return MsgPosEcefDepA {..}
+    pure MsgPosEcefDepA {..}
 
   put MsgPosEcefDepA {..} = do
     putWord32le _msgPosEcefDepA_tow
@@ -756,7 +761,7 @@
     _msgPosLlhDepA_v_accuracy <- getWord16le
     _msgPosLlhDepA_n_sats <- getWord8
     _msgPosLlhDepA_flags <- getWord8
-    return MsgPosLlhDepA {..}
+    pure MsgPosLlhDepA {..}
 
   put MsgPosLlhDepA {..} = do
     putWord32le _msgPosLlhDepA_tow
@@ -807,7 +812,7 @@
     _msgBaselineEcefDepA_accuracy <- getWord16le
     _msgBaselineEcefDepA_n_sats <- getWord8
     _msgBaselineEcefDepA_flags <- getWord8
-    return MsgBaselineEcefDepA {..}
+    pure MsgBaselineEcefDepA {..}
 
   put MsgBaselineEcefDepA {..} = do
     putWord32le _msgBaselineEcefDepA_tow
@@ -862,7 +867,7 @@
     _msgBaselineNedDepA_v_accuracy <- getWord16le
     _msgBaselineNedDepA_n_sats <- getWord8
     _msgBaselineNedDepA_flags <- getWord8
-    return MsgBaselineNedDepA {..}
+    pure MsgBaselineNedDepA {..}
 
   put MsgBaselineNedDepA {..} = do
     putWord32le _msgBaselineNedDepA_tow
@@ -912,7 +917,7 @@
     _msgVelEcefDepA_accuracy <- getWord16le
     _msgVelEcefDepA_n_sats <- getWord8
     _msgVelEcefDepA_flags <- getWord8
-    return MsgVelEcefDepA {..}
+    pure MsgVelEcefDepA {..}
 
   put MsgVelEcefDepA {..} = do
     putWord32le _msgVelEcefDepA_tow
@@ -965,7 +970,7 @@
     _msgVelNedDepA_v_accuracy <- getWord16le
     _msgVelNedDepA_n_sats <- getWord8
     _msgVelNedDepA_flags <- getWord8
-    return MsgVelNedDepA {..}
+    pure MsgVelNedDepA {..}
 
   put MsgVelNedDepA {..} = do
     putWord32le _msgVelNedDepA_tow
@@ -1006,7 +1011,7 @@
     _msgBaselineHeadingDepA_heading <- getWord32le
     _msgBaselineHeadingDepA_n_sats <- getWord8
     _msgBaselineHeadingDepA_flags <- getWord8
-    return MsgBaselineHeadingDepA {..}
+    pure MsgBaselineHeadingDepA {..}
 
   put MsgBaselineHeadingDepA {..} = do
     putWord32le _msgBaselineHeadingDepA_tow
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
@@ -31,6 +31,11 @@
 import SwiftNav.SBP.Types
 import SwiftNav.SBP.Gnss
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgNdbEvent :: Word16
 msgNdbEvent = 0x0400
 
@@ -73,7 +78,7 @@
     _msgNdbEvent_object_sid <- get
     _msgNdbEvent_src_sid <- get
     _msgNdbEvent_original_sender <- getWord16le
-    return MsgNdbEvent {..}
+    pure MsgNdbEvent {..}
 
   put MsgNdbEvent {..} = do
     putWord64le _msgNdbEvent_recv_time
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
@@ -31,6 +31,11 @@
 import SwiftNav.SBP.Types
 import SwiftNav.SBP.Gnss
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 -- | ObservationHeader.
 --
 -- Header of a GNSS observation message.
@@ -46,7 +51,7 @@
   get = do
     _observationHeader_t <- get
     _observationHeader_n_obs <- getWord8
-    return ObservationHeader {..}
+    pure ObservationHeader {..}
 
   put ObservationHeader {..} = do
     put _observationHeader_t
@@ -71,7 +76,7 @@
   get = do
     _doppler_i <- fromIntegral <$> getWord16le
     _doppler_f <- getWord8
-    return Doppler {..}
+    pure Doppler {..}
 
   put Doppler {..} = do
     putWord16le $ fromIntegral _doppler_i
@@ -118,7 +123,7 @@
     _packedObsContent_lock <- getWord8
     _packedObsContent_flags <- getWord8
     _packedObsContent_sid <- get
-    return PackedObsContent {..}
+    pure PackedObsContent {..}
 
   put PackedObsContent {..} = do
     putWord32le _packedObsContent_P
@@ -154,7 +159,7 @@
   get = do
     _msgObs_header <- get
     _msgObs_obs <- whileM (not <$> isEmpty) get
-    return MsgObs {..}
+    pure MsgObs {..}
 
   put MsgObs {..} = do
     put _msgObs_header
@@ -187,7 +192,7 @@
     _msgBasePosLlh_lat <- getFloat64le
     _msgBasePosLlh_lon <- getFloat64le
     _msgBasePosLlh_height <- getFloat64le
-    return MsgBasePosLlh {..}
+    pure MsgBasePosLlh {..}
 
   put MsgBasePosLlh {..} = do
     putFloat64le _msgBasePosLlh_lat
@@ -222,7 +227,7 @@
     _msgBasePosEcef_x <- getFloat64le
     _msgBasePosEcef_y <- getFloat64le
     _msgBasePosEcef_z <- getFloat64le
-    return MsgBasePosEcef {..}
+    pure MsgBasePosEcef {..}
 
   put MsgBasePosEcef {..} = do
     putFloat64le _msgBasePosEcef_x
@@ -257,7 +262,7 @@
     _ephemerisCommonContent_fit_interval <- getWord32le
     _ephemerisCommonContent_valid <- getWord8
     _ephemerisCommonContent_health_bits <- getWord8
-    return EphemerisCommonContent {..}
+    pure EphemerisCommonContent {..}
 
   put EphemerisCommonContent {..} = do
     put _ephemerisCommonContent_sid
@@ -294,7 +299,7 @@
     _ephemerisCommonContentDepA_fit_interval <- getWord32le
     _ephemerisCommonContentDepA_valid <- getWord8
     _ephemerisCommonContentDepA_health_bits <- getWord8
-    return EphemerisCommonContentDepA {..}
+    pure EphemerisCommonContentDepA {..}
 
   put EphemerisCommonContentDepA {..} = do
     put _ephemerisCommonContentDepA_sid
@@ -394,7 +399,7 @@
     _msgEphemerisGpsDepE_toc <- get
     _msgEphemerisGpsDepE_iode <- getWord8
     _msgEphemerisGpsDepE_iodc <- getWord16le
-    return MsgEphemerisGpsDepE {..}
+    pure MsgEphemerisGpsDepE {..}
 
   put MsgEphemerisGpsDepE {..} = do
     put _msgEphemerisGpsDepE_common
@@ -512,7 +517,7 @@
     _msgEphemerisGps_toc <- get
     _msgEphemerisGps_iode <- getWord8
     _msgEphemerisGps_iodc <- getWord16le
-    return MsgEphemerisGps {..}
+    pure MsgEphemerisGps {..}
 
   put MsgEphemerisGps {..} = do
     put _msgEphemerisGps_common
@@ -569,7 +574,7 @@
     _msgEphemerisSbasDepA_acc <- replicateM 3 getFloat64le
     _msgEphemerisSbasDepA_a_gf0 <- getFloat64le
     _msgEphemerisSbasDepA_a_gf1 <- getFloat64le
-    return MsgEphemerisSbasDepA {..}
+    pure MsgEphemerisSbasDepA {..}
 
   put MsgEphemerisSbasDepA {..} = do
     put _msgEphemerisSbasDepA_common
@@ -615,7 +620,7 @@
     _msgEphemerisGloDepA_pos <- replicateM 3 getFloat64le
     _msgEphemerisGloDepA_vel <- replicateM 3 getFloat64le
     _msgEphemerisGloDepA_acc <- replicateM 3 getFloat64le
-    return MsgEphemerisGloDepA {..}
+    pure MsgEphemerisGloDepA {..}
 
   put MsgEphemerisGloDepA {..} = do
     put _msgEphemerisGloDepA_common
@@ -655,7 +660,7 @@
     _msgEphemerisSbas_acc <- replicateM 3 getFloat64le
     _msgEphemerisSbas_a_gf0 <- getFloat64le
     _msgEphemerisSbas_a_gf1 <- getFloat64le
-    return MsgEphemerisSbas {..}
+    pure MsgEphemerisSbas {..}
 
   put MsgEphemerisSbas {..} = do
     put _msgEphemerisSbas_common
@@ -701,7 +706,7 @@
     _msgEphemerisGloDepB_pos <- replicateM 3 getFloat64le
     _msgEphemerisGloDepB_vel <- replicateM 3 getFloat64le
     _msgEphemerisGloDepB_acc <- replicateM 3 getFloat64le
-    return MsgEphemerisGloDepB {..}
+    pure MsgEphemerisGloDepB {..}
 
   put MsgEphemerisGloDepB {..} = do
     put _msgEphemerisGloDepB_common
@@ -753,7 +758,7 @@
     _msgEphemerisGloDepC_vel <- replicateM 3 getFloat64le
     _msgEphemerisGloDepC_acc <- replicateM 3 getFloat64le
     _msgEphemerisGloDepC_fcn <- getWord8
-    return MsgEphemerisGloDepC {..}
+    pure MsgEphemerisGloDepC {..}
 
   put MsgEphemerisGloDepC {..} = do
     put _msgEphemerisGloDepC_common
@@ -810,7 +815,7 @@
     _msgEphemerisGlo_acc <- replicateM 3 getFloat64le
     _msgEphemerisGlo_fcn <- getWord8
     _msgEphemerisGlo_iod <- getWord8
-    return MsgEphemerisGlo {..}
+    pure MsgEphemerisGlo {..}
 
   put MsgEphemerisGlo {..} = do
     put _msgEphemerisGlo_common
@@ -932,7 +937,7 @@
     _msgEphemerisDepD_iode <- getWord8
     _msgEphemerisDepD_iodc <- getWord16le
     _msgEphemerisDepD_reserved <- getWord32le
-    return MsgEphemerisDepD {..}
+    pure MsgEphemerisDepD {..}
 
   put MsgEphemerisDepD {..} = do
     putFloat64le _msgEphemerisDepD_tgd
@@ -1062,7 +1067,7 @@
     _msgEphemerisDepA_valid <- getWord8
     _msgEphemerisDepA_healthy <- getWord8
     _msgEphemerisDepA_prn <- getWord8
-    return MsgEphemerisDepA {..}
+    pure MsgEphemerisDepA {..}
 
   put MsgEphemerisDepA {..} = do
     putFloat64le _msgEphemerisDepA_tgd
@@ -1192,7 +1197,7 @@
     _msgEphemerisDepB_healthy <- getWord8
     _msgEphemerisDepB_prn <- getWord8
     _msgEphemerisDepB_iode <- getWord8
-    return MsgEphemerisDepB {..}
+    pure MsgEphemerisDepB {..}
 
   put MsgEphemerisDepB {..} = do
     putFloat64le _msgEphemerisDepB_tgd
@@ -1332,7 +1337,7 @@
     _msgEphemerisDepC_iode <- getWord8
     _msgEphemerisDepC_iodc <- getWord16le
     _msgEphemerisDepC_reserved <- getWord32le
-    return MsgEphemerisDepC {..}
+    pure MsgEphemerisDepC {..}
 
   put MsgEphemerisDepC {..} = do
     putFloat64le _msgEphemerisDepC_tgd
@@ -1384,7 +1389,7 @@
   get = do
     _observationHeaderDep_t <- get
     _observationHeaderDep_n_obs <- getWord8
-    return ObservationHeaderDep {..}
+    pure ObservationHeaderDep {..}
 
   put ObservationHeaderDep {..} = do
     put _observationHeaderDep_t
@@ -1410,7 +1415,7 @@
   get = do
     _carrierPhaseDepA_i <- fromIntegral <$> getWord32le
     _carrierPhaseDepA_f <- getWord8
-    return CarrierPhaseDepA {..}
+    pure CarrierPhaseDepA {..}
 
   put CarrierPhaseDepA {..} = do
     putWord32le $ fromIntegral _carrierPhaseDepA_i
@@ -1444,7 +1449,7 @@
     _packedObsContentDepA_cn0 <- getWord8
     _packedObsContentDepA_lock <- getWord16le
     _packedObsContentDepA_prn <- getWord8
-    return PackedObsContentDepA {..}
+    pure PackedObsContentDepA {..}
 
   put PackedObsContentDepA {..} = do
     putWord32le _packedObsContentDepA_P
@@ -1482,7 +1487,7 @@
     _packedObsContentDepB_cn0 <- getWord8
     _packedObsContentDepB_lock <- getWord16le
     _packedObsContentDepB_sid <- get
-    return PackedObsContentDepB {..}
+    pure PackedObsContentDepB {..}
 
   put PackedObsContentDepB {..} = do
     putWord32le _packedObsContentDepB_P
@@ -1521,7 +1526,7 @@
     _packedObsContentDepC_cn0 <- getWord8
     _packedObsContentDepC_lock <- getWord16le
     _packedObsContentDepC_sid <- get
-    return PackedObsContentDepC {..}
+    pure PackedObsContentDepC {..}
 
   put PackedObsContentDepC {..} = do
     putWord32le _packedObsContentDepC_P
@@ -1550,7 +1555,7 @@
   get = do
     _msgObsDepA_header <- get
     _msgObsDepA_obs <- whileM (not <$> isEmpty) get
-    return MsgObsDepA {..}
+    pure MsgObsDepA {..}
 
   put MsgObsDepA {..} = do
     put _msgObsDepA_header
@@ -1580,7 +1585,7 @@
   get = do
     _msgObsDepB_header <- get
     _msgObsDepB_obs <- whileM (not <$> isEmpty) get
-    return MsgObsDepB {..}
+    pure MsgObsDepB {..}
 
   put MsgObsDepB {..} = do
     put _msgObsDepB_header
@@ -1612,7 +1617,7 @@
   get = do
     _msgObsDepC_header <- get
     _msgObsDepC_obs <- whileM (not <$> isEmpty) get
-    return MsgObsDepC {..}
+    pure MsgObsDepC {..}
 
   put MsgObsDepC {..} = do
     put _msgObsDepC_header
@@ -1654,7 +1659,7 @@
     _msgIono_b1 <- getFloat64le
     _msgIono_b2 <- getFloat64le
     _msgIono_b3 <- getFloat64le
-    return MsgIono {..}
+    pure MsgIono {..}
 
   put MsgIono {..} = do
     put _msgIono_t_nmct
@@ -1688,7 +1693,7 @@
   get = do
     _msgSvConfigurationGps_t_nmct <- get
     _msgSvConfigurationGps_l2c_mask <- getWord32le
-    return MsgSvConfigurationGps {..}
+    pure MsgSvConfigurationGps {..}
 
   put MsgSvConfigurationGps {..} = do
     put _msgSvConfigurationGps_t_nmct
@@ -1725,7 +1730,7 @@
     _msgGroupDelayDepA_tgd <- fromIntegral <$> getWord16le
     _msgGroupDelayDepA_isc_l1ca <- fromIntegral <$> getWord16le
     _msgGroupDelayDepA_isc_l2c <- fromIntegral <$> getWord16le
-    return MsgGroupDelayDepA {..}
+    pure MsgGroupDelayDepA {..}
 
   put MsgGroupDelayDepA {..} = do
     put _msgGroupDelayDepA_t_op
@@ -1766,7 +1771,7 @@
     _msgGroupDelay_tgd <- fromIntegral <$> getWord16le
     _msgGroupDelay_isc_l1ca <- fromIntegral <$> getWord16le
     _msgGroupDelay_isc_l2c <- fromIntegral <$> getWord16le
-    return MsgGroupDelay {..}
+    pure MsgGroupDelay {..}
 
   put MsgGroupDelay {..} = do
     put _msgGroupDelay_t_op
@@ -1812,7 +1817,7 @@
     _almanacCommonContent_fit_interval <- getWord32le
     _almanacCommonContent_valid <- getWord8
     _almanacCommonContent_health_bits <- getWord8
-    return AlmanacCommonContent {..}
+    pure AlmanacCommonContent {..}
 
   put AlmanacCommonContent {..} = do
     put _almanacCommonContent_sid
@@ -1869,7 +1874,7 @@
     _msgAlmanacGps_inc <- getFloat64le
     _msgAlmanacGps_af0 <- getFloat64le
     _msgAlmanacGps_af1 <- getFloat64le
-    return MsgAlmanacGps {..}
+    pure MsgAlmanacGps {..}
 
   put MsgAlmanacGps {..} = do
     put _msgAlmanacGps_common
@@ -1926,7 +1931,7 @@
     _msgAlmanacGlo_t_dot <- getFloat64le
     _msgAlmanacGlo_epsilon <- getFloat64le
     _msgAlmanacGlo_omega <- getFloat64le
-    return MsgAlmanacGlo {..}
+    pure MsgAlmanacGlo {..}
 
   put MsgAlmanacGlo {..} = do
     put _msgAlmanacGlo_common
@@ -1941,38 +1946,3 @@
 $(makeSBP 'msgAlmanacGlo ''MsgAlmanacGlo)
 $(makeJSON "_msgAlmanacGlo_" ''MsgAlmanacGlo)
 $(makeLenses ''MsgAlmanacGlo)
-
-msgFcnsGlo :: Word16
-msgFcnsGlo = 0x0072
-
--- | SBP class for message MSG_FCNS_GLO (0x0072).
---
--- The message reports mapping information regarding GLONASS SV orbital and
--- frequency slots. Mapped as follow: index (SV orbital slot)  fcns[index] 0
--- 0xFF 1                        FCN for SV orbital slot 1 ...
--- ... 28                       FCN for SV orbital slot 28 29
--- 0xFF 30                       0xFF 31                       0xFF
-data MsgFcnsGlo = MsgFcnsGlo
-  { _msgFcnsGlo_wn   :: !Word16
-    -- ^ GPS Week number
-  , _msgFcnsGlo_tow_ms :: !Word32
-    -- ^ GPS Time of week
-  , _msgFcnsGlo_fcns :: ![Word8]
-    -- ^ GLONASS fequency number per orbital slot
-  } deriving ( Show, Read, Eq )
-
-instance Binary MsgFcnsGlo where
-  get = do
-    _msgFcnsGlo_wn <- getWord16le
-    _msgFcnsGlo_tow_ms <- getWord32le
-    _msgFcnsGlo_fcns <- replicateM 32 getWord8
-    return MsgFcnsGlo {..}
-
-  put MsgFcnsGlo {..} = do
-    putWord16le _msgFcnsGlo_wn
-    putWord32le _msgFcnsGlo_tow_ms
-    mapM_ putWord8 _msgFcnsGlo_fcns
-
-$(makeSBP 'msgFcnsGlo ''MsgFcnsGlo)
-$(makeJSON "_msgFcnsGlo_" ''MsgFcnsGlo)
-$(makeLenses ''MsgFcnsGlo)
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
@@ -33,6 +33,11 @@
 import SwiftNav.SBP.Types
 import SwiftNav.SBP.Gnss
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgAlmanac :: Word16
 msgAlmanac = 0x0069
 
@@ -45,10 +50,10 @@
 
 instance Binary MsgAlmanac where
   get =
-    return MsgAlmanac
+    pure MsgAlmanac
 
   put MsgAlmanac =
-    return ()
+    pure ()
 $(makeSBP 'msgAlmanac ''MsgAlmanac)
 $(makeJSON "_msgAlmanac_" ''MsgAlmanac)
 $(makeLenses ''MsgAlmanac)
@@ -65,10 +70,10 @@
 
 instance Binary MsgSetTime where
   get =
-    return MsgSetTime
+    pure MsgSetTime
 
   put MsgSetTime =
-    return ()
+    pure ()
 $(makeSBP 'msgSetTime ''MsgSetTime)
 $(makeJSON "_msgSetTime_" ''MsgSetTime)
 $(makeLenses ''MsgSetTime)
@@ -87,7 +92,7 @@
 instance Binary MsgReset where
   get = do
     _msgReset_flags <- getWord32le
-    return MsgReset {..}
+    pure MsgReset {..}
 
   put MsgReset {..} = do
     putWord32le _msgReset_flags
@@ -107,10 +112,10 @@
 
 instance Binary MsgResetDep where
   get =
-    return MsgResetDep
+    pure MsgResetDep
 
   put MsgResetDep =
-    return ()
+    pure ()
 $(makeSBP 'msgResetDep ''MsgResetDep)
 $(makeJSON "_msgResetDep_" ''MsgResetDep)
 $(makeLenses ''MsgResetDep)
@@ -128,10 +133,10 @@
 
 instance Binary MsgCwResults where
   get =
-    return MsgCwResults
+    pure MsgCwResults
 
   put MsgCwResults =
-    return ()
+    pure ()
 $(makeSBP 'msgCwResults ''MsgCwResults)
 $(makeJSON "_msgCwResults_" ''MsgCwResults)
 $(makeLenses ''MsgCwResults)
@@ -149,10 +154,10 @@
 
 instance Binary MsgCwStart where
   get =
-    return MsgCwStart
+    pure MsgCwStart
 
   put MsgCwStart =
-    return ()
+    pure ()
 $(makeSBP 'msgCwStart ''MsgCwStart)
 $(makeJSON "_msgCwStart_" ''MsgCwStart)
 $(makeLenses ''MsgCwStart)
@@ -172,7 +177,7 @@
 instance Binary MsgResetFilters where
   get = do
     _msgResetFilters_filter <- getWord8
-    return MsgResetFilters {..}
+    pure MsgResetFilters {..}
 
   put MsgResetFilters {..} = do
     putWord8 _msgResetFilters_filter
@@ -195,10 +200,10 @@
 
 instance Binary MsgInitBase where
   get =
-    return MsgInitBase
+    pure MsgInitBase
 
   put MsgInitBase =
-    return ()
+    pure ()
 $(makeSBP 'msgInitBase ''MsgInitBase)
 $(makeJSON "_msgInitBase_" ''MsgInitBase)
 $(makeLenses ''MsgInitBase)
@@ -226,7 +231,7 @@
     _msgThreadState_name <- decodeUtf8 <$> getByteString 20
     _msgThreadState_cpu <- getWord16le
     _msgThreadState_stack_free <- getWord32le
-    return MsgThreadState {..}
+    pure MsgThreadState {..}
 
   put MsgThreadState {..} = do
     putByteString $ encodeUtf8 _msgThreadState_name
@@ -264,7 +269,7 @@
     _uARTChannel_io_error_count <- getWord16le
     _uARTChannel_tx_buffer_level <- getWord8
     _uARTChannel_rx_buffer_level <- getWord8
-    return UARTChannel {..}
+    pure UARTChannel {..}
 
   put UARTChannel {..} = do
     putFloat32le _uARTChannel_tx_throughput
@@ -301,7 +306,7 @@
     _period_pmin <- fromIntegral <$> getWord32le
     _period_pmax <- fromIntegral <$> getWord32le
     _period_current <- fromIntegral <$> getWord32le
-    return Period {..}
+    pure Period {..}
 
   put Period {..} = do
     putWord32le $ fromIntegral _period_avg
@@ -335,7 +340,7 @@
     _latency_lmin <- fromIntegral <$> getWord32le
     _latency_lmax <- fromIntegral <$> getWord32le
     _latency_current <- fromIntegral <$> getWord32le
-    return Latency {..}
+    pure Latency {..}
 
   put Latency {..} = do
     putWord32le $ fromIntegral _latency_avg
@@ -379,7 +384,7 @@
     _msgUartState_uart_ftdi <- get
     _msgUartState_latency <- get
     _msgUartState_obs_period <- get
-    return MsgUartState {..}
+    pure MsgUartState {..}
 
   put MsgUartState {..} = do
     put _msgUartState_uart_a
@@ -415,7 +420,7 @@
     _msgUartStateDepa_uart_b <- get
     _msgUartStateDepa_uart_ftdi <- get
     _msgUartStateDepa_latency <- get
-    return MsgUartStateDepa {..}
+    pure MsgUartStateDepa {..}
 
   put MsgUartStateDepa {..} = do
     put _msgUartStateDepa_uart_a
@@ -443,7 +448,7 @@
 instance Binary MsgIarState where
   get = do
     _msgIarState_num_hyps <- getWord32le
-    return MsgIarState {..}
+    pure MsgIarState {..}
 
   put MsgIarState {..} = do
     putWord32le _msgIarState_num_hyps
@@ -470,7 +475,7 @@
   get = do
     _msgMaskSatellite_mask <- getWord8
     _msgMaskSatellite_sid <- get
-    return MsgMaskSatellite {..}
+    pure MsgMaskSatellite {..}
 
   put MsgMaskSatellite {..} = do
     putWord8 _msgMaskSatellite_mask
@@ -508,7 +513,7 @@
     _msgDeviceMonitor_cpu_vaux <- fromIntegral <$> getWord16le
     _msgDeviceMonitor_cpu_temperature <- fromIntegral <$> getWord16le
     _msgDeviceMonitor_fe_temperature <- fromIntegral <$> getWord16le
-    return MsgDeviceMonitor {..}
+    pure MsgDeviceMonitor {..}
 
   put MsgDeviceMonitor {..} = do
     putWord16le $ fromIntegral _msgDeviceMonitor_dev_vin
@@ -539,7 +544,7 @@
   get = do
     _msgCommandReq_sequence <- getWord32le
     _msgCommandReq_command <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgCommandReq {..}
+    pure MsgCommandReq {..}
 
   put MsgCommandReq {..} = do
     putWord32le _msgCommandReq_sequence
@@ -567,7 +572,7 @@
   get = do
     _msgCommandResp_sequence <- getWord32le
     _msgCommandResp_code <- fromIntegral <$> getWord32le
-    return MsgCommandResp {..}
+    pure MsgCommandResp {..}
 
   put MsgCommandResp {..} = do
     putWord32le _msgCommandResp_sequence
@@ -596,7 +601,7 @@
   get = do
     _msgCommandOutput_sequence <- getWord32le
     _msgCommandOutput_line <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgCommandOutput {..}
+    pure MsgCommandOutput {..}
 
   put MsgCommandOutput {..} = do
     putWord32le _msgCommandOutput_sequence
@@ -618,10 +623,10 @@
 
 instance Binary MsgNetworkStateReq where
   get =
-    return MsgNetworkStateReq
+    pure MsgNetworkStateReq
 
   put MsgNetworkStateReq =
-    return ()
+    pure ()
 $(makeSBP 'msgNetworkStateReq ''MsgNetworkStateReq)
 $(makeJSON "_msgNetworkStateReq_" ''MsgNetworkStateReq)
 $(makeLenses ''MsgNetworkStateReq)
@@ -662,7 +667,7 @@
     _msgNetworkStateResp_tx_bytes <- getWord32le
     _msgNetworkStateResp_interface_name <- decodeUtf8 <$> getByteString 16
     _msgNetworkStateResp_flags <- getWord32le
-    return MsgNetworkStateResp {..}
+    pure MsgNetworkStateResp {..}
 
   put MsgNetworkStateResp {..} = do
     mapM_ putWord8 _msgNetworkStateResp_ipv4_address
@@ -710,7 +715,7 @@
     _msgSpecan_amplitude_ref <- getFloat32le
     _msgSpecan_amplitude_unit <- getFloat32le
     _msgSpecan_amplitude_value <- whileM (not <$> isEmpty) getWord8
-    return MsgSpecan {..}
+    pure MsgSpecan {..}
 
   put MsgSpecan {..} = do
     putWord16le _msgSpecan_channel_tag
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
@@ -34,6 +34,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgSettingsSave :: Word16
 msgSettingsSave = 0x00A1
 
@@ -46,10 +51,10 @@
 
 instance Binary MsgSettingsSave where
   get =
-    return MsgSettingsSave
+    pure MsgSettingsSave
 
   put MsgSettingsSave =
-    return ()
+    pure ()
 $(makeSBP 'msgSettingsSave ''MsgSettingsSave)
 $(makeJSON "_msgSettingsSave_" ''MsgSettingsSave)
 $(makeLenses ''MsgSettingsSave)
@@ -70,7 +75,7 @@
 instance Binary MsgSettingsWrite where
   get = do
     _msgSettingsWrite_setting <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgSettingsWrite {..}
+    pure MsgSettingsWrite {..}
 
   put MsgSettingsWrite {..} = do
     putByteString $ encodeUtf8 _msgSettingsWrite_setting
@@ -95,7 +100,7 @@
 instance Binary MsgSettingsReadReq where
   get = do
     _msgSettingsReadReq_setting <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgSettingsReadReq {..}
+    pure MsgSettingsReadReq {..}
 
   put MsgSettingsReadReq {..} = do
     putByteString $ encodeUtf8 _msgSettingsReadReq_setting
@@ -119,7 +124,7 @@
 instance Binary MsgSettingsReadResp where
   get = do
     _msgSettingsReadResp_setting <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgSettingsReadResp {..}
+    pure MsgSettingsReadResp {..}
 
   put MsgSettingsReadResp {..} = do
     putByteString $ encodeUtf8 _msgSettingsReadResp_setting
@@ -146,7 +151,7 @@
 instance Binary MsgSettingsReadByIndexReq where
   get = do
     _msgSettingsReadByIndexReq_index <- getWord16le
-    return MsgSettingsReadByIndexReq {..}
+    pure MsgSettingsReadByIndexReq {..}
 
   put MsgSettingsReadByIndexReq {..} = do
     putWord16le _msgSettingsReadByIndexReq_index
@@ -176,7 +181,7 @@
   get = do
     _msgSettingsReadByIndexResp_index <- getWord16le
     _msgSettingsReadByIndexResp_setting <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgSettingsReadByIndexResp {..}
+    pure MsgSettingsReadByIndexResp {..}
 
   put MsgSettingsReadByIndexResp {..} = do
     putWord16le _msgSettingsReadByIndexResp_index
@@ -197,10 +202,10 @@
 
 instance Binary MsgSettingsReadByIndexDone where
   get =
-    return MsgSettingsReadByIndexDone
+    pure MsgSettingsReadByIndexDone
 
   put MsgSettingsReadByIndexDone =
-    return ()
+    pure ()
 $(makeSBP 'msgSettingsReadByIndexDone ''MsgSettingsReadByIndexDone)
 $(makeJSON "_msgSettingsReadByIndexDone_" ''MsgSettingsReadByIndexDone)
 $(makeLenses ''MsgSettingsReadByIndexDone)
@@ -222,7 +227,7 @@
 instance Binary MsgSettingsRegister where
   get = do
     _msgSettingsRegister_setting <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgSettingsRegister {..}
+    pure MsgSettingsRegister {..}
 
   put MsgSettingsRegister {..} = do
     putByteString $ encodeUtf8 _msgSettingsRegister_setting
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
@@ -30,6 +30,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgStartup :: Word16
 msgStartup = 0xFF00
 
@@ -52,7 +57,7 @@
     _msgStartup_cause <- getWord8
     _msgStartup_startup_type <- getWord8
     _msgStartup_reserved <- getWord16le
-    return MsgStartup {..}
+    pure MsgStartup {..}
 
   put MsgStartup {..} = do
     putWord8 _msgStartup_cause
@@ -88,7 +93,7 @@
     _msgDgnssStatus_latency <- getWord16le
     _msgDgnssStatus_num_signals <- getWord8
     _msgDgnssStatus_source <- decodeUtf8 . toStrict <$> getRemainingLazyByteString
-    return MsgDgnssStatus {..}
+    pure MsgDgnssStatus {..}
 
   put MsgDgnssStatus {..} = do
     putWord8 _msgDgnssStatus_flags
@@ -120,7 +125,7 @@
 instance Binary MsgHeartbeat where
   get = do
     _msgHeartbeat_flags <- getWord32le
-    return MsgHeartbeat {..}
+    pure MsgHeartbeat {..}
 
   put MsgHeartbeat {..} = do
     putWord32le _msgHeartbeat_flags
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
@@ -31,6 +31,11 @@
 import SwiftNav.SBP.Types
 import SwiftNav.SBP.Gnss
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgTrackingStateDetailed :: Word16
 msgTrackingStateDetailed = 0x0011
 
@@ -112,7 +117,7 @@
     _msgTrackingStateDetailed_nav_flags <- getWord8
     _msgTrackingStateDetailed_pset_flags <- getWord8
     _msgTrackingStateDetailed_misc_flags <- getWord8
-    return MsgTrackingStateDetailed {..}
+    pure MsgTrackingStateDetailed {..}
 
   put MsgTrackingStateDetailed {..} = do
     putWord64le _msgTrackingStateDetailed_recv_time
@@ -159,7 +164,7 @@
     _trackingChannelState_sid <- get
     _trackingChannelState_fcn <- getWord8
     _trackingChannelState_cn0 <- getWord8
-    return TrackingChannelState {..}
+    pure TrackingChannelState {..}
 
   put TrackingChannelState {..} = do
     put _trackingChannelState_sid
@@ -185,7 +190,7 @@
 instance Binary MsgTrackingState where
   get = do
     _msgTrackingState_states <- whileM (not <$> isEmpty) get
-    return MsgTrackingState {..}
+    pure MsgTrackingState {..}
 
   put MsgTrackingState {..} = do
     mapM_ put _msgTrackingState_states
@@ -208,7 +213,7 @@
   get = do
     _trackingChannelCorrelation_I <- fromIntegral <$> getWord32le
     _trackingChannelCorrelation_Q <- fromIntegral <$> getWord32le
-    return TrackingChannelCorrelation {..}
+    pure TrackingChannelCorrelation {..}
 
   put TrackingChannelCorrelation {..} = do
     putWord32le $ fromIntegral _trackingChannelCorrelation_I
@@ -238,7 +243,7 @@
     _msgTrackingIq_channel <- getWord8
     _msgTrackingIq_sid <- get
     _msgTrackingIq_corrs <- replicateM 3 get
-    return MsgTrackingIq {..}
+    pure MsgTrackingIq {..}
 
   put MsgTrackingIq {..} = do
     putWord8 _msgTrackingIq_channel
@@ -266,7 +271,7 @@
     _trackingChannelStateDepA_state <- getWord8
     _trackingChannelStateDepA_prn <- getWord8
     _trackingChannelStateDepA_cn0 <- getFloat32le
-    return TrackingChannelStateDepA {..}
+    pure TrackingChannelStateDepA {..}
 
   put TrackingChannelStateDepA {..} = do
     putWord8 _trackingChannelStateDepA_state
@@ -290,7 +295,7 @@
 instance Binary MsgTrackingStateDepA where
   get = do
     _msgTrackingStateDepA_states <- whileM (not <$> isEmpty) get
-    return MsgTrackingStateDepA {..}
+    pure MsgTrackingStateDepA {..}
 
   put MsgTrackingStateDepA {..} = do
     mapM_ put _msgTrackingStateDepA_states
@@ -316,7 +321,7 @@
     _trackingChannelStateDepB_state <- getWord8
     _trackingChannelStateDepB_sid <- get
     _trackingChannelStateDepB_cn0 <- getFloat32le
-    return TrackingChannelStateDepB {..}
+    pure TrackingChannelStateDepB {..}
 
   put TrackingChannelStateDepB {..} = do
     putWord8 _trackingChannelStateDepB_state
@@ -340,7 +345,7 @@
 instance Binary MsgTrackingStateDepB where
   get = do
     _msgTrackingStateDepB_states <- whileM (not <$> isEmpty) get
-    return MsgTrackingStateDepB {..}
+    pure MsgTrackingStateDepB {..}
 
   put MsgTrackingStateDepB {..} = do
     mapM_ put _msgTrackingStateDepB_states
diff --git a/src/SwiftNav/SBP/Types.hs b/src/SwiftNav/SBP/Types.hs
--- a/src/SwiftNav/SBP/Types.hs
+++ b/src/SwiftNav/SBP/Types.hs
@@ -81,7 +81,7 @@
     _msgSBPLen     <- getWord8
     _msgSBPPayload <- fmap Bytes $ getByteString $ fromIntegral _msgSBPLen
     _msgSBPCrc     <- getWord16le
-    return Msg {..}
+    pure Msg {..}
 
   put Msg {..} = do
     putWord16le   _msgSBPType
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
@@ -30,6 +30,11 @@
 import SwiftNav.SBP.TH
 import SwiftNav.SBP.Types
 
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
 msgUserData :: Word16
 msgUserData = 0x0800
 
@@ -45,7 +50,7 @@
 instance Binary MsgUserData where
   get = do
     _msgUserData_contents <- whileM (not <$> isEmpty) getWord8
-    return MsgUserData {..}
+    pure MsgUserData {..}
 
   put MsgUserData {..} = do
     mapM_ putWord8 _msgUserData_contents
