diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,10 +10,10 @@
 
 Available on [Hackage as `sbp`](http://hackage.haskell.org/package/sbp).
 
-The library supports building against Stackage LTS-6. To
+The library supports building against Stackage LTS-10. To
 install from Hackage using `stack`:
 
-    $ stack install --resolver lts-6.35 sbp # (LTS-6)
+    $ stack install --resolver lts-10.0 sbp # (LTS-10)
 
 Note that we explicitly specify the resolvers to use, as installing `libsbp` may
 fail to build with more recent resolvers.
@@ -41,9 +41,9 @@
 ## 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`:
+`publish-lower` recipe in the `Shakefile.hs` with LTS-10 `stack.yaml`:
 
-    $ STACK_YAML=stack-lts-6.yaml ./Shakefile.hs publish-lower
+    $ STACK_YAML=stack-lts-10.yaml ./Shakefile.hs publish-lower
 
 ## References
 
diff --git a/sbp.cabal b/sbp.cabal
--- a/sbp.cabal
+++ b/sbp.cabal
@@ -1,129 +1,124 @@
-name: sbp
-version: 2.3.2
-cabal-version: >=1.22
-build-type: Simple
-license: LGPL-3
-copyright: Copyright (C) 2015 Swift Navigation, Inc.
-maintainer: Mark Fine <dev@swiftnav.com>
-homepage: https://github.com/swift-nav/libsbp
-synopsis: SwiftNav's SBP Library
+name:                  sbp
+version:               2.3.5
+synopsis:              SwiftNav's SBP Library
+homepage:              https://github.com/swift-nav/libsbp
+license:               LGPL-3
+author:                Swift Navigation Inc.
+maintainer:            Swift Navigation <dev@swiftnav.com>
+copyright:             Copyright (C) 2015-2018 Swift Navigation, Inc.
+category:              Network
+build-type:            Simple
+cabal-version:         >= 1.22
+extra-source-files:    README.md
 description:
-    Haskell bindings for Swift Navigation Binary Protocol (SBP), a fast,
-    simple, and minimal binary protocol for communicating with Swift
-    devices. It is the native binary protocol used by the Piksi GPS
-    receiver to transmit solutions, observations, status and debugging
-    messages, as well as receive messages from the host operating
-    system, such as differential corrections and the almanac.
-category: Network
-author: Swift Navigation Inc.
-extra-source-files:
-    README.md
+  Haskell bindings for Swift Navigation Binary Protocol (SBP), a fast,
+  simple, and minimal binary protocol for communicating with Swift
+  devices. It is the native binary protocol used by the Piksi GPS
+  receiver to transmit solutions, observations, status and debugging
+  messages, as well as receive messages from the host operating
+  system, such as differential corrections and the almanac.
 
 source-repository head
-    type: git
-    location: git@github.com:swift-nav/libsbp.git
+  type:                git
+  location:            git@github.com:swift-nav/libsbp.git
 
 library
-    exposed-modules:
-        SwiftNav.CRC16
-        SwiftNav.SBP
-    build-depends:
-        aeson >=0.11.3.0,
-        array >=0.5.1.0,
-        base >=4.8 && <5,
-        base64-bytestring >=1.0.0.1,
-        basic-prelude >=0.5.2,
-        binary >=0.7.5.0,
-        bytestring >=0.10.6.0,
-        data-binary-ieee754 >=0.4.4,
-        lens >=4.13,
-        lens-aeson >=1.0.0.5,
-        monad-loops >=0.4.3,
-        template-haskell >=2.10.0.0,
-        text >=1.2.2.2
-    default-language: Haskell2010
-    hs-source-dirs: src
-    other-modules:
-        SwiftNav.SBP.Msg
-        SwiftNav.SBP.TH
-        SwiftNav.SBP.Types
-        SwiftNav.SBP.Acquisition
-        SwiftNav.SBP.Bootload
-        SwiftNav.SBP.ExtEvents
-        SwiftNav.SBP.FileIo
-        SwiftNav.SBP.Flash
-        SwiftNav.SBP.Gnss
-        SwiftNav.SBP.Imu
-        SwiftNav.SBP.Logging
-        SwiftNav.SBP.Mag
-        SwiftNav.SBP.Navigation
-        SwiftNav.SBP.Ndb
-        SwiftNav.SBP.Observation
-        SwiftNav.SBP.Piksi
-        SwiftNav.SBP.Settings
-        SwiftNav.SBP.System
-        SwiftNav.SBP.Tracking
-        SwiftNav.SBP.User
-    ghc-options: -Wall
+  exposed-modules:     SwiftNav.CRC16
+                     , SwiftNav.SBP
+  other-modules:       SwiftNav.SBP.Msg
+                     , SwiftNav.SBP.TH
+                     , SwiftNav.SBP.Types
+                     , SwiftNav.SBP.Acquisition
+                     , SwiftNav.SBP.Bootload
+                     , SwiftNav.SBP.ExtEvents
+                     , SwiftNav.SBP.FileIo
+                     , SwiftNav.SBP.Flash
+                     , SwiftNav.SBP.Gnss
+                     , SwiftNav.SBP.Imu
+                     , SwiftNav.SBP.Logging
+                     , SwiftNav.SBP.Mag
+                     , SwiftNav.SBP.Navigation
+                     , SwiftNav.SBP.Ndb
+                     , SwiftNav.SBP.Observation
+                     , SwiftNav.SBP.Orientation
+                     , SwiftNav.SBP.Piksi
+                     , SwiftNav.SBP.Sbas
+                     , SwiftNav.SBP.Settings
+                     , SwiftNav.SBP.Ssr
+                     , SwiftNav.SBP.System
+                     , SwiftNav.SBP.Tracking
+                     , SwiftNav.SBP.User
+                     , SwiftNav.SBP.Vehicle
+  default-language:    Haskell2010
+  hs-source-dirs:      src
+  ghc-options:         -Wall
+  build-depends:       aeson
+                     , array
+                     , base >= 4.8 && < 5
+                     , base64-bytestring
+                     , basic-prelude
+                     , binary
+                     , bytestring
+                     , data-binary-ieee754
+                     , lens
+                     , lens-aeson
+                     , monad-loops
+                     , template-haskell
+                     , text
 
 executable sbp2json
-    main-is: SBP2JSON.hs
-    build-depends:
-        aeson >=0.11.3.0,
-        base >=4.8.2.0,
-        basic-prelude >=0.5.2,
-        binary-conduit >=1.2.4.1,
-        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
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  hs-source-dirs:      main
+  main-is:             SBP2JSON.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:       aeson
+                     , base
+                     , basic-prelude
+                     , binary-conduit
+                     , bytestring
+                     , conduit
+                     , conduit-extra
+                     , resourcet
+                     , sbp
+  default-language:    Haskell2010
 
 executable json2sbp
-    main-is: JSON2SBP.hs
-    build-depends:
-        aeson >=0.11.3.0,
-        base >=4.8.2.0,
-        basic-prelude >=0.5.2,
-        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
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  hs-source-dirs:      main
+  main-is:             JSON2SBP.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:       aeson
+                     , base
+                     , basic-prelude
+                     , binary-conduit
+                     , conduit
+                     , conduit-extra
+                     , resourcet
+                     , sbp
+  default-language:    Haskell2010
 
 executable sbp2yaml
-    main-is: SBP2YAML.hs
-    build-depends:
-        base >=4.8.2.0,
-        basic-prelude >=0.5.2,
-        binary-conduit >=1.2.4.1,
-        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
-    hs-source-dirs: main
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  hs-source-dirs:      main
+  main-is:             SBP2YAML.hs
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
+  build-depends:       base
+                     , basic-prelude
+                     , binary-conduit
+                     , bytestring
+                     , conduit
+                     , conduit-extra
+                     , resourcet
+                     , sbp
+                     , yaml
+  default-language:    Haskell2010
 
 test-suite test
-    type: exitcode-stdio-1.0
-    main-is: Test.hs
-    build-depends:
-        base >=4.8.2.0,
-        basic-prelude >=0.5.2,
-        sbp,
-        tasty >=0.11.2.1,
-        tasty-hunit >=0.9.2
-    default-language: Haskell2010
-    hs-source-dirs: test
-    other-modules:
-        Test.SwiftNav.CRC16
-    ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  main-is:             Test.hs
+  other-modules:       Test.SwiftNav.CRC16
+  build-depends:       base
+                     , basic-prelude
+                     , sbp
+                     , tasty
+                     , tasty-hunit
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
+  default-language:    Haskell2010
diff --git a/src/SwiftNav/SBP.hs b/src/SwiftNav/SBP.hs
--- a/src/SwiftNav/SBP.hs
+++ b/src/SwiftNav/SBP.hs
@@ -1,8 +1,8 @@
 -- |
 -- Module:      SwiftNav.SBP
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -26,8 +26,12 @@
 import SwiftNav.SBP.Navigation as Exports
 import SwiftNav.SBP.Ndb as Exports
 import SwiftNav.SBP.Observation as Exports
+import SwiftNav.SBP.Orientation as Exports
 import SwiftNav.SBP.Piksi as Exports
+import SwiftNav.SBP.Sbas as Exports
 import SwiftNav.SBP.Settings as Exports
+import SwiftNav.SBP.Ssr as Exports
 import SwiftNav.SBP.System as Exports
 import SwiftNav.SBP.Tracking as Exports
 import SwiftNav.SBP.User as Exports
+import SwiftNav.SBP.Vehicle as Exports
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Acquisition
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Bootload
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.ExtEvents
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.FileIo
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Flash
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Gnss
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Imu
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -41,7 +41,8 @@
 -- | SBP class for message MSG_IMU_RAW (0x0900).
 --
 -- Raw data from the Inertial Measurement Unit, containing accelerometer and
--- gyroscope readings.
+-- gyroscope readings. The sense of the measurements are to be aligned with
+-- the indications on the device itself.
 data MsgImuRaw = MsgImuRaw
   { _msgImuRaw_tow :: !Word32
     -- ^ Milliseconds since start of GPS week. If the high bit is set, the time
@@ -49,17 +50,17 @@
   , _msgImuRaw_tow_f :: !Word8
     -- ^ Milliseconds since start of GPS week, fractional part
   , _msgImuRaw_acc_x :: !Int16
-    -- ^ Acceleration in the body frame X axis
+    -- ^ Acceleration in the IMU frame X axis
   , _msgImuRaw_acc_y :: !Int16
-    -- ^ Acceleration in the body frame Y axis
+    -- ^ Acceleration in the IMU frame Y axis
   , _msgImuRaw_acc_z :: !Int16
-    -- ^ Acceleration in the body frame Z axis
+    -- ^ Acceleration in the IMU frame Z axis
   , _msgImuRaw_gyr_x :: !Int16
-    -- ^ Angular rate around the body frame X axis
+    -- ^ Angular rate around IMU frame X axis
   , _msgImuRaw_gyr_y :: !Int16
-    -- ^ Angular rate around the body frame Y axis
+    -- ^ Angular rate around IMU frame Y axis
   , _msgImuRaw_gyr_z :: !Int16
-    -- ^ Angular rate around the body frame Z axis
+    -- ^ Angular rate around IMU frame Z axis
   } deriving ( Show, Read, Eq )
 
 instance Binary MsgImuRaw where
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Logging
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Mag
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -6,9 +6,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Msg
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -36,11 +36,15 @@
 import SwiftNav.SBP.Navigation
 import SwiftNav.SBP.Ndb
 import SwiftNav.SBP.Observation
+import SwiftNav.SBP.Orientation
 import SwiftNav.SBP.Piksi
+import SwiftNav.SBP.Sbas
 import SwiftNav.SBP.Settings
+import SwiftNav.SBP.Ssr
 import SwiftNav.SBP.System
 import SwiftNav.SBP.Tracking
 import SwiftNav.SBP.User
+import SwiftNav.SBP.Vehicle
 import SwiftNav.SBP.Types
 
 
@@ -61,6 +65,7 @@
    | SBPMsgAlmanacGloDep MsgAlmanacGloDep Msg
    | SBPMsgAlmanacGps MsgAlmanacGps Msg
    | SBPMsgAlmanacGpsDep MsgAlmanacGpsDep Msg
+   | SBPMsgAngularRate MsgAngularRate Msg
    | SBPMsgBasePosEcef MsgBasePosEcef Msg
    | SBPMsgBasePosLlh MsgBasePosLlh Msg
    | SBPMsgBaselineEcef MsgBaselineEcef Msg
@@ -119,6 +124,7 @@
    | SBPMsgImuAux MsgImuAux Msg
    | SBPMsgImuRaw MsgImuRaw Msg
    | SBPMsgInitBase MsgInitBase Msg
+   | SBPMsgInsStatus MsgInsStatus Msg
    | SBPMsgIono MsgIono Msg
    | SBPMsgLog MsgLog Msg
    | SBPMsgM25FlashWriteStatus MsgM25FlashWriteStatus Msg
@@ -134,14 +140,20 @@
    | SBPMsgObsDepA MsgObsDepA Msg
    | SBPMsgObsDepB MsgObsDepB Msg
    | SBPMsgObsDepC MsgObsDepC Msg
+   | SBPMsgOdometry MsgOdometry Msg
+   | SBPMsgOrientEuler MsgOrientEuler Msg
+   | SBPMsgOrientQuat MsgOrientQuat Msg
    | SBPMsgPosEcef MsgPosEcef Msg
+   | SBPMsgPosEcefCov MsgPosEcefCov Msg
    | SBPMsgPosEcefDepA MsgPosEcefDepA Msg
    | SBPMsgPosLlh MsgPosLlh Msg
+   | SBPMsgPosLlhCov MsgPosLlhCov Msg
    | SBPMsgPosLlhDepA MsgPosLlhDepA Msg
    | SBPMsgPrintDep MsgPrintDep Msg
    | SBPMsgReset MsgReset Msg
    | SBPMsgResetDep MsgResetDep Msg
    | SBPMsgResetFilters MsgResetFilters Msg
+   | SBPMsgSbasRaw MsgSbasRaw Msg
    | SBPMsgSetTime MsgSetTime Msg
    | SBPMsgSettingsReadByIndexDone MsgSettingsReadByIndexDone Msg
    | SBPMsgSettingsReadByIndexReq MsgSettingsReadByIndexReq Msg
@@ -154,6 +166,9 @@
    | SBPMsgSettingsWriteResp MsgSettingsWriteResp Msg
    | SBPMsgSpecan MsgSpecan Msg
    | SBPMsgSpecanDep MsgSpecanDep Msg
+   | SBPMsgSsrCodeBiases MsgSsrCodeBiases Msg
+   | SBPMsgSsrOrbitClock MsgSsrOrbitClock Msg
+   | SBPMsgSsrPhaseBiases MsgSsrPhaseBiases Msg
    | SBPMsgStartup MsgStartup Msg
    | SBPMsgStmFlashLockSector MsgStmFlashLockSector Msg
    | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector Msg
@@ -166,16 +181,19 @@
    | SBPMsgTrackingState MsgTrackingState Msg
    | SBPMsgTrackingStateDepA MsgTrackingStateDepA Msg
    | SBPMsgTrackingStateDepB MsgTrackingStateDepB Msg
-   | SBPMsgTrackingStateDetailed MsgTrackingStateDetailed Msg
    | SBPMsgTrackingStateDetailedDep MsgTrackingStateDetailedDep Msg
+   | SBPMsgTrackingStateDetailedDepA MsgTrackingStateDetailedDepA Msg
    | SBPMsgTweet MsgTweet Msg
    | SBPMsgUartState MsgUartState Msg
    | SBPMsgUartStateDepa MsgUartStateDepa Msg
    | SBPMsgUserData MsgUserData Msg
    | SBPMsgUtcTime MsgUtcTime Msg
+   | SBPMsgVelBody MsgVelBody Msg
    | SBPMsgVelEcef MsgVelEcef Msg
+   | SBPMsgVelEcefCov MsgVelEcefCov Msg
    | SBPMsgVelEcefDepA MsgVelEcefDepA Msg
    | SBPMsgVelNed MsgVelNed Msg
+   | SBPMsgVelNedCov MsgVelNedCov Msg
    | SBPMsgVelNedDepA MsgVelNedDepA Msg
    | SBPMsgBadCrc Msg
    | SBPMsgUnknown Msg
@@ -202,6 +220,7 @@
           | _msgSBPType == msgAlmanacGloDep = SBPMsgAlmanacGloDep (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAlmanacGps = SBPMsgAlmanacGps (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgAlmanacGpsDep = SBPMsgAlmanacGpsDep (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgAngularRate = SBPMsgAngularRate (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgBasePosEcef = SBPMsgBasePosEcef (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgBasePosLlh = SBPMsgBasePosLlh (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgBaselineEcef = SBPMsgBaselineEcef (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -260,6 +279,7 @@
           | _msgSBPType == msgImuAux = SBPMsgImuAux (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgImuRaw = SBPMsgImuRaw (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgInitBase = SBPMsgInitBase (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgInsStatus = SBPMsgInsStatus (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgLog = SBPMsgLog (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -275,14 +295,20 @@
           | _msgSBPType == msgObsDepA = SBPMsgObsDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgObsDepB = SBPMsgObsDepB (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgObsDepC = SBPMsgObsDepC (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgOdometry = SBPMsgOdometry (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgOrientEuler = SBPMsgOrientEuler (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgOrientQuat = SBPMsgOrientQuat (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgPosEcef = SBPMsgPosEcef (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgPosEcefCov = SBPMsgPosEcefCov (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgPosEcefDepA = SBPMsgPosEcefDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgPosLlh = SBPMsgPosLlh (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgPosLlhCov = SBPMsgPosLlhCov (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgPosLlhDepA = SBPMsgPosLlhDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgPrintDep = SBPMsgPrintDep (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgReset = SBPMsgReset (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgResetDep = SBPMsgResetDep (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgResetFilters = SBPMsgResetFilters (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgSbasRaw = SBPMsgSbasRaw (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSetTime = SBPMsgSetTime (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSettingsReadByIndexReq = SBPMsgSettingsReadByIndexReq (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -295,6 +321,9 @@
           | _msgSBPType == msgSettingsWriteResp = SBPMsgSettingsWriteResp (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSpecan = SBPMsgSpecan (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgSpecanDep = SBPMsgSpecanDep (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgSsrCodeBiases = SBPMsgSsrCodeBiases (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgSsrOrbitClock = SBPMsgSsrOrbitClock (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStartup = SBPMsgStartup (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStmFlashLockSector = SBPMsgStmFlashLockSector (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector (decode (fromStrict (unBytes _msgSBPPayload))) m
@@ -307,16 +336,19 @@
           | _msgSBPType == msgTrackingState = SBPMsgTrackingState (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgTrackingStateDepA = SBPMsgTrackingStateDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgTrackingStateDepB = SBPMsgTrackingStateDepB (decode (fromStrict (unBytes _msgSBPPayload))) m
-          | _msgSBPType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgTrackingStateDetailedDep = SBPMsgTrackingStateDetailedDep (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgTrackingStateDetailedDepA = SBPMsgTrackingStateDetailedDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgTweet = SBPMsgTweet (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgUartState = SBPMsgUartState (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgUartStateDepa = SBPMsgUartStateDepa (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgUserData = SBPMsgUserData (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgUtcTime = SBPMsgUtcTime (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgVelBody = SBPMsgVelBody (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgVelEcef = SBPMsgVelEcef (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgVelEcefCov = SBPMsgVelEcefCov (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgVelEcefDepA = SBPMsgVelEcefDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgVelNed = SBPMsgVelNed (decode (fromStrict (unBytes _msgSBPPayload))) m
+          | _msgSBPType == msgVelNedCov = SBPMsgVelNedCov (decode (fromStrict (unBytes _msgSBPPayload))) m
           | _msgSBPType == msgVelNedDepA = SBPMsgVelNedDepA (decode (fromStrict (unBytes _msgSBPPayload))) m
           | otherwise = SBPMsgUnknown m
 
@@ -335,6 +367,7 @@
       encoder (SBPMsgAlmanacGloDep _ m) = put m
       encoder (SBPMsgAlmanacGps _ m) = put m
       encoder (SBPMsgAlmanacGpsDep _ m) = put m
+      encoder (SBPMsgAngularRate _ m) = put m
       encoder (SBPMsgBasePosEcef _ m) = put m
       encoder (SBPMsgBasePosLlh _ m) = put m
       encoder (SBPMsgBaselineEcef _ m) = put m
@@ -393,6 +426,7 @@
       encoder (SBPMsgImuAux _ m) = put m
       encoder (SBPMsgImuRaw _ m) = put m
       encoder (SBPMsgInitBase _ m) = put m
+      encoder (SBPMsgInsStatus _ m) = put m
       encoder (SBPMsgIono _ m) = put m
       encoder (SBPMsgLog _ m) = put m
       encoder (SBPMsgM25FlashWriteStatus _ m) = put m
@@ -408,14 +442,20 @@
       encoder (SBPMsgObsDepA _ m) = put m
       encoder (SBPMsgObsDepB _ m) = put m
       encoder (SBPMsgObsDepC _ m) = put m
+      encoder (SBPMsgOdometry _ m) = put m
+      encoder (SBPMsgOrientEuler _ m) = put m
+      encoder (SBPMsgOrientQuat _ m) = put m
       encoder (SBPMsgPosEcef _ m) = put m
+      encoder (SBPMsgPosEcefCov _ m) = put m
       encoder (SBPMsgPosEcefDepA _ m) = put m
       encoder (SBPMsgPosLlh _ m) = put m
+      encoder (SBPMsgPosLlhCov _ m) = put m
       encoder (SBPMsgPosLlhDepA _ m) = put m
       encoder (SBPMsgPrintDep _ m) = put m
       encoder (SBPMsgReset _ m) = put m
       encoder (SBPMsgResetDep _ m) = put m
       encoder (SBPMsgResetFilters _ m) = put m
+      encoder (SBPMsgSbasRaw _ m) = put m
       encoder (SBPMsgSetTime _ m) = put m
       encoder (SBPMsgSettingsReadByIndexDone _ m) = put m
       encoder (SBPMsgSettingsReadByIndexReq _ m) = put m
@@ -428,6 +468,9 @@
       encoder (SBPMsgSettingsWriteResp _ m) = put m
       encoder (SBPMsgSpecan _ m) = put m
       encoder (SBPMsgSpecanDep _ m) = put m
+      encoder (SBPMsgSsrCodeBiases _ m) = put m
+      encoder (SBPMsgSsrOrbitClock _ m) = put m
+      encoder (SBPMsgSsrPhaseBiases _ m) = put m
       encoder (SBPMsgStartup _ m) = put m
       encoder (SBPMsgStmFlashLockSector _ m) = put m
       encoder (SBPMsgStmFlashUnlockSector _ m) = put m
@@ -440,16 +483,19 @@
       encoder (SBPMsgTrackingState _ m) = put m
       encoder (SBPMsgTrackingStateDepA _ m) = put m
       encoder (SBPMsgTrackingStateDepB _ m) = put m
-      encoder (SBPMsgTrackingStateDetailed _ m) = put m
       encoder (SBPMsgTrackingStateDetailedDep _ m) = put m
+      encoder (SBPMsgTrackingStateDetailedDepA _ m) = put m
       encoder (SBPMsgTweet _ m) = put m
       encoder (SBPMsgUartState _ m) = put m
       encoder (SBPMsgUartStateDepa _ m) = put m
       encoder (SBPMsgUserData _ m) = put m
       encoder (SBPMsgUtcTime _ m) = put m
+      encoder (SBPMsgVelBody _ m) = put m
       encoder (SBPMsgVelEcef _ m) = put m
+      encoder (SBPMsgVelEcefCov _ m) = put m
       encoder (SBPMsgVelEcefDepA _ m) = put m
       encoder (SBPMsgVelNed _ m) = put m
+      encoder (SBPMsgVelNedCov _ m) = put m
       encoder (SBPMsgVelNedDepA _ m) = put m
       encoder (SBPMsgUnknown m) = put m
       encoder (SBPMsgBadCrc m) = put m
@@ -472,6 +518,7 @@
         | msgType == msgAlmanacGloDep = SBPMsgAlmanacGloDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAlmanacGps = SBPMsgAlmanacGps <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgAlmanacGpsDep = SBPMsgAlmanacGpsDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgAngularRate = SBPMsgAngularRate <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgBasePosEcef = SBPMsgBasePosEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgBasePosLlh = SBPMsgBasePosLlh <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgBaselineEcef = SBPMsgBaselineEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -530,6 +577,7 @@
         | msgType == msgImuAux = SBPMsgImuAux <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgImuRaw = SBPMsgImuRaw <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgInitBase = SBPMsgInitBase <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgInsStatus = SBPMsgInsStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgIono = SBPMsgIono <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgLog = SBPMsgLog <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -545,14 +593,20 @@
         | msgType == msgObsDepA = SBPMsgObsDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgObsDepB = SBPMsgObsDepB <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgObsDepC = SBPMsgObsDepC <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgOdometry = SBPMsgOdometry <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgOrientEuler = SBPMsgOrientEuler <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgOrientQuat = SBPMsgOrientQuat <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgPosEcef = SBPMsgPosEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgPosEcefCov = SBPMsgPosEcefCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgPosEcefDepA = SBPMsgPosEcefDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgPosLlh = SBPMsgPosLlh <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgPosLlhCov = SBPMsgPosLlhCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgPosLlhDepA = SBPMsgPosLlhDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgPrintDep = SBPMsgPrintDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgReset = SBPMsgReset <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgResetDep = SBPMsgResetDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgResetFilters = SBPMsgResetFilters <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgSbasRaw = SBPMsgSbasRaw <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSetTime = SBPMsgSetTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSettingsReadByIndexReq = SBPMsgSettingsReadByIndexReq <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -565,6 +619,9 @@
         | msgType == msgSettingsWriteResp = SBPMsgSettingsWriteResp <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSpecan = SBPMsgSpecan <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgSpecanDep = SBPMsgSpecanDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgSsrCodeBiases = SBPMsgSsrCodeBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgSsrOrbitClock = SBPMsgSsrOrbitClock <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStartup = SBPMsgStartup <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStmFlashLockSector = SBPMsgStmFlashLockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
@@ -577,16 +634,19 @@
         | msgType == msgTrackingState = SBPMsgTrackingState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgTrackingStateDepA = SBPMsgTrackingStateDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgTrackingStateDepB = SBPMsgTrackingStateDepB <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
-        | msgType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgTrackingStateDetailedDep = SBPMsgTrackingStateDetailedDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgTrackingStateDetailedDepA = SBPMsgTrackingStateDetailedDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgTweet = SBPMsgTweet <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgUartState = SBPMsgUartState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgUartStateDepa = SBPMsgUartStateDepa <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgUserData = SBPMsgUserData <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgUtcTime = SBPMsgUtcTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgVelBody = SBPMsgVelBody <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgVelEcef = SBPMsgVelEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgVelEcefCov = SBPMsgVelEcefCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgVelEcefDepA = SBPMsgVelEcefDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgVelNed = SBPMsgVelNed <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
+        | msgType == msgVelNedCov = SBPMsgVelNedCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | msgType == msgVelNedDepA = SBPMsgVelNedDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj
         | otherwise = SBPMsgUnknown <$> parseJSON obj
   parseJSON _ = mzero
@@ -610,6 +670,7 @@
   toJSON (SBPMsgAlmanacGloDep n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAlmanacGps n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgAlmanacGpsDep n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgAngularRate n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgBasePosEcef n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgBasePosLlh n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgBaselineEcef n m) = toJSON n <<>> toJSON m
@@ -668,6 +729,7 @@
   toJSON (SBPMsgImuAux n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgImuRaw n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgInitBase n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgInsStatus n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgIono n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgLog n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgM25FlashWriteStatus n m) = toJSON n <<>> toJSON m
@@ -683,14 +745,20 @@
   toJSON (SBPMsgObsDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgObsDepB n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgObsDepC n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgOdometry n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgOrientEuler n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgOrientQuat n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgPosEcef n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgPosEcefCov n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgPosEcefDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgPosLlh n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgPosLlhCov n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgPosLlhDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgPrintDep n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgReset n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgResetDep n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgResetFilters n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgSbasRaw n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSetTime n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSettingsReadByIndexDone n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSettingsReadByIndexReq n m) = toJSON n <<>> toJSON m
@@ -703,6 +771,9 @@
   toJSON (SBPMsgSettingsWriteResp n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSpecan n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgSpecanDep n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgSsrCodeBiases n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgSsrOrbitClock n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgSsrPhaseBiases n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStartup n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStmFlashLockSector n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgStmFlashUnlockSector n m) = toJSON n <<>> toJSON m
@@ -715,16 +786,19 @@
   toJSON (SBPMsgTrackingState n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgTrackingStateDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgTrackingStateDepB n m) = toJSON n <<>> toJSON m
-  toJSON (SBPMsgTrackingStateDetailed n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgTrackingStateDetailedDep n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgTrackingStateDetailedDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgTweet n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgUartState n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgUartStateDepa n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgUserData n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgUtcTime n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgVelBody n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgVelEcef n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgVelEcefCov n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgVelEcefDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgVelNed n m) = toJSON n <<>> toJSON m
+  toJSON (SBPMsgVelNedCov n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgVelNedDepA n m) = toJSON n <<>> toJSON m
   toJSON (SBPMsgBadCrc m) = toJSON m
   toJSON (SBPMsgUnknown m) = toJSON m
@@ -742,6 +816,7 @@
   msg f (SBPMsgAlmanacGloDep n m) = SBPMsgAlmanacGloDep n <$> f m
   msg f (SBPMsgAlmanacGps n m) = SBPMsgAlmanacGps n <$> f m
   msg f (SBPMsgAlmanacGpsDep n m) = SBPMsgAlmanacGpsDep n <$> f m
+  msg f (SBPMsgAngularRate n m) = SBPMsgAngularRate n <$> f m
   msg f (SBPMsgBasePosEcef n m) = SBPMsgBasePosEcef n <$> f m
   msg f (SBPMsgBasePosLlh n m) = SBPMsgBasePosLlh n <$> f m
   msg f (SBPMsgBaselineEcef n m) = SBPMsgBaselineEcef n <$> f m
@@ -800,6 +875,7 @@
   msg f (SBPMsgImuAux n m) = SBPMsgImuAux n <$> f m
   msg f (SBPMsgImuRaw n m) = SBPMsgImuRaw n <$> f m
   msg f (SBPMsgInitBase n m) = SBPMsgInitBase n <$> f m
+  msg f (SBPMsgInsStatus n m) = SBPMsgInsStatus n <$> f m
   msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m
   msg f (SBPMsgLog n m) = SBPMsgLog n <$> f m
   msg f (SBPMsgM25FlashWriteStatus n m) = SBPMsgM25FlashWriteStatus n <$> f m
@@ -815,14 +891,20 @@
   msg f (SBPMsgObsDepA n m) = SBPMsgObsDepA n <$> f m
   msg f (SBPMsgObsDepB n m) = SBPMsgObsDepB n <$> f m
   msg f (SBPMsgObsDepC n m) = SBPMsgObsDepC n <$> f m
+  msg f (SBPMsgOdometry n m) = SBPMsgOdometry n <$> f m
+  msg f (SBPMsgOrientEuler n m) = SBPMsgOrientEuler n <$> f m
+  msg f (SBPMsgOrientQuat n m) = SBPMsgOrientQuat n <$> f m
   msg f (SBPMsgPosEcef n m) = SBPMsgPosEcef n <$> f m
+  msg f (SBPMsgPosEcefCov n m) = SBPMsgPosEcefCov n <$> f m
   msg f (SBPMsgPosEcefDepA n m) = SBPMsgPosEcefDepA n <$> f m
   msg f (SBPMsgPosLlh n m) = SBPMsgPosLlh n <$> f m
+  msg f (SBPMsgPosLlhCov n m) = SBPMsgPosLlhCov n <$> f m
   msg f (SBPMsgPosLlhDepA n m) = SBPMsgPosLlhDepA n <$> f m
   msg f (SBPMsgPrintDep n m) = SBPMsgPrintDep n <$> f m
   msg f (SBPMsgReset n m) = SBPMsgReset n <$> f m
   msg f (SBPMsgResetDep n m) = SBPMsgResetDep n <$> f m
   msg f (SBPMsgResetFilters n m) = SBPMsgResetFilters n <$> f m
+  msg f (SBPMsgSbasRaw n m) = SBPMsgSbasRaw n <$> f m
   msg f (SBPMsgSetTime n m) = SBPMsgSetTime n <$> f m
   msg f (SBPMsgSettingsReadByIndexDone n m) = SBPMsgSettingsReadByIndexDone n <$> f m
   msg f (SBPMsgSettingsReadByIndexReq n m) = SBPMsgSettingsReadByIndexReq n <$> f m
@@ -835,6 +917,9 @@
   msg f (SBPMsgSettingsWriteResp n m) = SBPMsgSettingsWriteResp n <$> f m
   msg f (SBPMsgSpecan n m) = SBPMsgSpecan n <$> f m
   msg f (SBPMsgSpecanDep n m) = SBPMsgSpecanDep n <$> f m
+  msg f (SBPMsgSsrCodeBiases n m) = SBPMsgSsrCodeBiases n <$> f m
+  msg f (SBPMsgSsrOrbitClock n m) = SBPMsgSsrOrbitClock n <$> f m
+  msg f (SBPMsgSsrPhaseBiases n m) = SBPMsgSsrPhaseBiases n <$> f m
   msg f (SBPMsgStartup n m) = SBPMsgStartup n <$> f m
   msg f (SBPMsgStmFlashLockSector n m) = SBPMsgStmFlashLockSector n <$> f m
   msg f (SBPMsgStmFlashUnlockSector n m) = SBPMsgStmFlashUnlockSector n <$> f m
@@ -847,16 +932,19 @@
   msg f (SBPMsgTrackingState n m) = SBPMsgTrackingState n <$> f m
   msg f (SBPMsgTrackingStateDepA n m) = SBPMsgTrackingStateDepA n <$> f m
   msg f (SBPMsgTrackingStateDepB n m) = SBPMsgTrackingStateDepB n <$> f m
-  msg f (SBPMsgTrackingStateDetailed n m) = SBPMsgTrackingStateDetailed n <$> f m
   msg f (SBPMsgTrackingStateDetailedDep n m) = SBPMsgTrackingStateDetailedDep n <$> f m
+  msg f (SBPMsgTrackingStateDetailedDepA n m) = SBPMsgTrackingStateDetailedDepA n <$> f m
   msg f (SBPMsgTweet n m) = SBPMsgTweet n <$> f m
   msg f (SBPMsgUartState n m) = SBPMsgUartState n <$> f m
   msg f (SBPMsgUartStateDepa n m) = SBPMsgUartStateDepa n <$> f m
   msg f (SBPMsgUserData n m) = SBPMsgUserData n <$> f m
   msg f (SBPMsgUtcTime n m) = SBPMsgUtcTime n <$> f m
+  msg f (SBPMsgVelBody n m) = SBPMsgVelBody n <$> f m
   msg f (SBPMsgVelEcef n m) = SBPMsgVelEcef n <$> f m
+  msg f (SBPMsgVelEcefCov n m) = SBPMsgVelEcefCov n <$> f m
   msg f (SBPMsgVelEcefDepA n m) = SBPMsgVelEcefDepA n <$> f m
   msg f (SBPMsgVelNed n m) = SBPMsgVelNed n <$> f m
+  msg f (SBPMsgVelNedCov n m) = SBPMsgVelNedCov n <$> f m
   msg f (SBPMsgVelNedDepA n m) = SBPMsgVelNedDepA n <$> f m
   msg f (SBPMsgUnknown m) = SBPMsgUnknown <$> f m
   msg f (SBPMsgBadCrc m) = SBPMsgBadCrc <$> 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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Navigation
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -19,7 +19,12 @@
 -- differential GPS solution, which can use either a fixed/integer or floating
 -- carrier phase ambiguity. The pseudo-absolute position solution uses a user-
 -- provided, well-surveyed base station position (if available) and the RTK
--- solution in tandem.
+-- solution in tandem.  When the inertial navigation mode indicates that the
+-- IMU is used, all messages are reported in the vehicle body frame as defined
+-- by device settings.  By default, the vehicle body frame is configured to be
+-- coincident with the antenna phase center.  When there is no inertial
+-- navigation, the solution will be reported at the phase center of the
+-- antenna.
 
 module SwiftNav.SBP.Navigation
   ( module SwiftNav.SBP.Navigation
@@ -216,7 +221,7 @@
   , _msgPosEcef_z      :: !Double
     -- ^ ECEF Z coordinate
   , _msgPosEcef_accuracy :: !Word16
-    -- ^ Position accuracy estimate.
+    -- ^ Position estimated standard deviation
   , _msgPosEcef_n_sats :: !Word8
     -- ^ Number of satellites used in solution
   , _msgPosEcef_flags  :: !Word8
@@ -247,6 +252,80 @@
 $(makeJSON "_msgPosEcef_" ''MsgPosEcef)
 $(makeLenses ''MsgPosEcef)
 
+msgPosEcefCov :: Word16
+msgPosEcefCov = 0x0214
+
+-- | SBP class for message MSG_POS_ECEF_COV (0x0214).
+--
+-- The position solution message reports absolute Earth Centered Earth Fixed
+-- (ECEF) coordinates and the status (single point vs pseudo-absolute RTK) of
+-- the position solution. The message also reports the upper triangular portion
+-- of the 3x3 covariance matrix. If the receiver knows the surveyed position of
+-- the base station and has an RTK solution, this reports a pseudo-absolute
+-- position solution using the base station position and the rover's RTK
+-- 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
+    -- ^ GPS Time of Week
+  , _msgPosEcefCov_x     :: !Double
+    -- ^ ECEF X coordinate
+  , _msgPosEcefCov_y     :: !Double
+    -- ^ ECEF Y coordinate
+  , _msgPosEcefCov_z     :: !Double
+    -- ^ ECEF Z coordinate
+  , _msgPosEcefCov_cov_x_x :: !Float
+    -- ^ Estimated variance of x
+  , _msgPosEcefCov_cov_x_y :: !Float
+    -- ^ Estimated covariance of x and y
+  , _msgPosEcefCov_cov_x_z :: !Float
+    -- ^ Estimated covariance of x and z
+  , _msgPosEcefCov_cov_y_y :: !Float
+    -- ^ Estimated variance of y
+  , _msgPosEcefCov_cov_y_z :: !Float
+    -- ^ Estimated covariance of y and z
+  , _msgPosEcefCov_cov_z_z :: !Float
+    -- ^ Estimated variance of z
+  , _msgPosEcefCov_n_sats :: !Word8
+    -- ^ Number of satellites used in solution
+  , _msgPosEcefCov_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgPosEcefCov where
+  get = do
+    _msgPosEcefCov_tow <- getWord32le
+    _msgPosEcefCov_x <- getFloat64le
+    _msgPosEcefCov_y <- getFloat64le
+    _msgPosEcefCov_z <- getFloat64le
+    _msgPosEcefCov_cov_x_x <- getFloat32le
+    _msgPosEcefCov_cov_x_y <- getFloat32le
+    _msgPosEcefCov_cov_x_z <- getFloat32le
+    _msgPosEcefCov_cov_y_y <- getFloat32le
+    _msgPosEcefCov_cov_y_z <- getFloat32le
+    _msgPosEcefCov_cov_z_z <- getFloat32le
+    _msgPosEcefCov_n_sats <- getWord8
+    _msgPosEcefCov_flags <- getWord8
+    pure MsgPosEcefCov {..}
+
+  put MsgPosEcefCov {..} = do
+    putWord32le _msgPosEcefCov_tow
+    putFloat64le _msgPosEcefCov_x
+    putFloat64le _msgPosEcefCov_y
+    putFloat64le _msgPosEcefCov_z
+    putFloat32le _msgPosEcefCov_cov_x_x
+    putFloat32le _msgPosEcefCov_cov_x_y
+    putFloat32le _msgPosEcefCov_cov_x_z
+    putFloat32le _msgPosEcefCov_cov_y_y
+    putFloat32le _msgPosEcefCov_cov_y_z
+    putFloat32le _msgPosEcefCov_cov_z_z
+    putWord8 _msgPosEcefCov_n_sats
+    putWord8 _msgPosEcefCov_flags
+
+$(makeSBP 'msgPosEcefCov ''MsgPosEcefCov)
+$(makeJSON "_msgPosEcefCov_" ''MsgPosEcefCov)
+$(makeLenses ''MsgPosEcefCov)
+
 msgPosLlh :: Word16
 msgPosLlh = 0x020A
 
@@ -269,9 +348,9 @@
   , _msgPosLlh_height   :: !Double
     -- ^ Height above WGS84 ellipsoid
   , _msgPosLlh_h_accuracy :: !Word16
-    -- ^ Horizontal position accuracy estimate.
+    -- ^ Horizontal position estimated standard deviation
   , _msgPosLlh_v_accuracy :: !Word16
-    -- ^ Vertical position accuracy estimate.
+    -- ^ Vertical position estimated standard deviation
   , _msgPosLlh_n_sats   :: !Word8
     -- ^ Number of satellites used in solution.
   , _msgPosLlh_flags    :: !Word8
@@ -304,6 +383,80 @@
 $(makeJSON "_msgPosLlh_" ''MsgPosLlh)
 $(makeLenses ''MsgPosLlh)
 
+msgPosLlhCov :: Word16
+msgPosLlhCov = 0x0211
+
+-- | SBP class for message MSG_POS_LLH_COV (0x0211).
+--
+-- This position solution message reports the absolute geodetic coordinates and
+-- the status (single point vs pseudo-absolute RTK) of the position solution as
+-- well as the upper triangle of the 3x3 covariance matrix.  The position
+-- information and Fix Mode flags should follow the MSG_POS_LLH message.  Since
+-- the covariance matrix is computed in the local-level North, East, Down
+-- frame, the covariance terms follow with that convention. Thus, covariances
+-- are reported against the "downward" measurement and care should be taken
+-- with the sign convention.
+data MsgPosLlhCov = MsgPosLlhCov
+  { _msgPosLlhCov_tow   :: !Word32
+    -- ^ GPS Time of Week
+  , _msgPosLlhCov_lat   :: !Double
+    -- ^ Latitude
+  , _msgPosLlhCov_lon   :: !Double
+    -- ^ Longitude
+  , _msgPosLlhCov_height :: !Double
+    -- ^ Height above WGS84 ellipsoid
+  , _msgPosLlhCov_cov_n_n :: !Float
+    -- ^ Estimated variance of northing
+  , _msgPosLlhCov_cov_n_e :: !Float
+    -- ^ Covariance of northing and easting
+  , _msgPosLlhCov_cov_n_d :: !Float
+    -- ^ Covariance of northing and downward measurement
+  , _msgPosLlhCov_cov_e_e :: !Float
+    -- ^ Estimated variance of easting
+  , _msgPosLlhCov_cov_e_d :: !Float
+    -- ^ Covariance of easting and downward measurement
+  , _msgPosLlhCov_cov_d_d :: !Float
+    -- ^ Estimated variance of downward measurement
+  , _msgPosLlhCov_n_sats :: !Word8
+    -- ^ Number of satellites used in solution.
+  , _msgPosLlhCov_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgPosLlhCov where
+  get = do
+    _msgPosLlhCov_tow <- getWord32le
+    _msgPosLlhCov_lat <- getFloat64le
+    _msgPosLlhCov_lon <- getFloat64le
+    _msgPosLlhCov_height <- getFloat64le
+    _msgPosLlhCov_cov_n_n <- getFloat32le
+    _msgPosLlhCov_cov_n_e <- getFloat32le
+    _msgPosLlhCov_cov_n_d <- getFloat32le
+    _msgPosLlhCov_cov_e_e <- getFloat32le
+    _msgPosLlhCov_cov_e_d <- getFloat32le
+    _msgPosLlhCov_cov_d_d <- getFloat32le
+    _msgPosLlhCov_n_sats <- getWord8
+    _msgPosLlhCov_flags <- getWord8
+    pure MsgPosLlhCov {..}
+
+  put MsgPosLlhCov {..} = do
+    putWord32le _msgPosLlhCov_tow
+    putFloat64le _msgPosLlhCov_lat
+    putFloat64le _msgPosLlhCov_lon
+    putFloat64le _msgPosLlhCov_height
+    putFloat32le _msgPosLlhCov_cov_n_n
+    putFloat32le _msgPosLlhCov_cov_n_e
+    putFloat32le _msgPosLlhCov_cov_n_d
+    putFloat32le _msgPosLlhCov_cov_e_e
+    putFloat32le _msgPosLlhCov_cov_e_d
+    putFloat32le _msgPosLlhCov_cov_d_d
+    putWord8 _msgPosLlhCov_n_sats
+    putWord8 _msgPosLlhCov_flags
+
+$(makeSBP 'msgPosLlhCov ''MsgPosLlhCov)
+$(makeJSON "_msgPosLlhCov_" ''MsgPosLlhCov)
+$(makeLenses ''MsgPosLlhCov)
+
 msgBaselineEcef :: Word16
 msgBaselineEcef = 0x020B
 
@@ -323,7 +476,7 @@
   , _msgBaselineEcef_z      :: !Int32
     -- ^ Baseline ECEF Z coordinate
   , _msgBaselineEcef_accuracy :: !Word16
-    -- ^ Position accuracy estimate
+    -- ^ Position estimated standard deviation
   , _msgBaselineEcef_n_sats :: !Word8
     -- ^ Number of satellites used in solution
   , _msgBaselineEcef_flags  :: !Word8
@@ -375,9 +528,9 @@
   , _msgBaselineNed_d        :: !Int32
     -- ^ Baseline Down coordinate
   , _msgBaselineNed_h_accuracy :: !Word16
-    -- ^ Horizontal position accuracy estimate
+    -- ^ Horizontal position estimated standard deviation
   , _msgBaselineNed_v_accuracy :: !Word16
-    -- ^ Vertical position accuracy estimate
+    -- ^ Vertical position estimated standard deviation
   , _msgBaselineNed_n_sats   :: !Word8
     -- ^ Number of satellites used in solution
   , _msgBaselineNed_flags    :: !Word8
@@ -428,7 +581,7 @@
   , _msgVelEcef_z      :: !Int32
     -- ^ Velocity ECEF Z coordinate
   , _msgVelEcef_accuracy :: !Word16
-    -- ^ Velocity accuracy estimate
+    -- ^ Velocity estimated standard deviation
   , _msgVelEcef_n_sats :: !Word8
     -- ^ Number of satellites used in solution
   , _msgVelEcef_flags  :: !Word8
@@ -459,6 +612,75 @@
 $(makeJSON "_msgVelEcef_" ''MsgVelEcef)
 $(makeLenses ''MsgVelEcef)
 
+msgVelEcefCov :: Word16
+msgVelEcefCov = 0x0215
+
+-- | SBP class for message MSG_VEL_ECEF_COV (0x0215).
+--
+-- This message reports the velocity in Earth Centered Earth Fixed (ECEF)
+-- 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
+    -- ^ GPS Time of Week
+  , _msgVelEcefCov_x     :: !Int32
+    -- ^ Velocity ECEF X coordinate
+  , _msgVelEcefCov_y     :: !Int32
+    -- ^ Velocity ECEF Y coordinate
+  , _msgVelEcefCov_z     :: !Int32
+    -- ^ Velocity ECEF Z coordinate
+  , _msgVelEcefCov_cov_x_x :: !Float
+    -- ^ Estimated variance of x
+  , _msgVelEcefCov_cov_x_y :: !Float
+    -- ^ Estimated covariance of x and y
+  , _msgVelEcefCov_cov_x_z :: !Float
+    -- ^ Estimated covariance of x and z
+  , _msgVelEcefCov_cov_y_y :: !Float
+    -- ^ Estimated variance of y
+  , _msgVelEcefCov_cov_y_z :: !Float
+    -- ^ Estimated covariance of y and z
+  , _msgVelEcefCov_cov_z_z :: !Float
+    -- ^ Estimated variance of z
+  , _msgVelEcefCov_n_sats :: !Word8
+    -- ^ Number of satellites used in solution
+  , _msgVelEcefCov_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgVelEcefCov where
+  get = do
+    _msgVelEcefCov_tow <- getWord32le
+    _msgVelEcefCov_x <- fromIntegral <$> getWord32le
+    _msgVelEcefCov_y <- fromIntegral <$> getWord32le
+    _msgVelEcefCov_z <- fromIntegral <$> getWord32le
+    _msgVelEcefCov_cov_x_x <- getFloat32le
+    _msgVelEcefCov_cov_x_y <- getFloat32le
+    _msgVelEcefCov_cov_x_z <- getFloat32le
+    _msgVelEcefCov_cov_y_y <- getFloat32le
+    _msgVelEcefCov_cov_y_z <- getFloat32le
+    _msgVelEcefCov_cov_z_z <- getFloat32le
+    _msgVelEcefCov_n_sats <- getWord8
+    _msgVelEcefCov_flags <- getWord8
+    pure MsgVelEcefCov {..}
+
+  put MsgVelEcefCov {..} = do
+    putWord32le _msgVelEcefCov_tow
+    putWord32le $ fromIntegral _msgVelEcefCov_x
+    putWord32le $ fromIntegral _msgVelEcefCov_y
+    putWord32le $ fromIntegral _msgVelEcefCov_z
+    putFloat32le _msgVelEcefCov_cov_x_x
+    putFloat32le _msgVelEcefCov_cov_x_y
+    putFloat32le _msgVelEcefCov_cov_x_z
+    putFloat32le _msgVelEcefCov_cov_y_y
+    putFloat32le _msgVelEcefCov_cov_y_z
+    putFloat32le _msgVelEcefCov_cov_z_z
+    putWord8 _msgVelEcefCov_n_sats
+    putWord8 _msgVelEcefCov_flags
+
+$(makeSBP 'msgVelEcefCov ''MsgVelEcefCov)
+$(makeJSON "_msgVelEcefCov_" ''MsgVelEcefCov)
+$(makeLenses ''MsgVelEcefCov)
+
 msgVelNed :: Word16
 msgVelNed = 0x020E
 
@@ -478,9 +700,9 @@
   , _msgVelNed_d        :: !Int32
     -- ^ Velocity Down coordinate
   , _msgVelNed_h_accuracy :: !Word16
-    -- ^ Horizontal velocity accuracy estimate
+    -- ^ Horizontal velocity estimated standard deviation
   , _msgVelNed_v_accuracy :: !Word16
-    -- ^ Vertical velocity accuracy estimate
+    -- ^ Vertical velocity estimated standard deviation
   , _msgVelNed_n_sats   :: !Word8
     -- ^ Number of satellites used in solution
   , _msgVelNed_flags    :: !Word8
@@ -513,43 +735,150 @@
 $(makeJSON "_msgVelNed_" ''MsgVelNed)
 $(makeLenses ''MsgVelNed)
 
-msgBaselineHeading :: Word16
-msgBaselineHeading = 0x020F
+msgVelNedCov :: Word16
+msgVelNedCov = 0x0212
 
--- | SBP class for message MSG_BASELINE_HEADING (0x020F).
+-- | SBP class for message MSG_VEL_NED_COV (0x0212).
 --
--- This message reports the baseline heading pointing from the base station to
--- 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). It is intended
--- that time-matched RTK mode is used when the base station is moving.
-data MsgBaselineHeading = MsgBaselineHeading
-  { _msgBaselineHeading_tow   :: !Word32
+-- This message reports the velocity in local North East Down (NED)
+-- coordinates. The NED coordinate system is defined as the local WGS84 tangent
+-- 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). This message is
+-- similar to the MSG_VEL_NED, but it includes the upper triangular portion of
+-- the 3x3 covariance matrix.
+data MsgVelNedCov = MsgVelNedCov
+  { _msgVelNedCov_tow   :: !Word32
     -- ^ GPS Time of Week
-  , _msgBaselineHeading_heading :: !Word32
-    -- ^ Heading
-  , _msgBaselineHeading_n_sats :: !Word8
+  , _msgVelNedCov_n     :: !Int32
+    -- ^ Velocity North coordinate
+  , _msgVelNedCov_e     :: !Int32
+    -- ^ Velocity East coordinate
+  , _msgVelNedCov_d     :: !Int32
+    -- ^ Velocity Down coordinate
+  , _msgVelNedCov_cov_n_n :: !Float
+    -- ^ Estimated variance of northward measurement
+  , _msgVelNedCov_cov_n_e :: !Float
+    -- ^ Covariance of northward and eastward measurement
+  , _msgVelNedCov_cov_n_d :: !Float
+    -- ^ Covariance of northward and downward measurement
+  , _msgVelNedCov_cov_e_e :: !Float
+    -- ^ Estimated variance of eastward measurement
+  , _msgVelNedCov_cov_e_d :: !Float
+    -- ^ Covariance of eastward and downward measurement
+  , _msgVelNedCov_cov_d_d :: !Float
+    -- ^ Estimated variance of downward measurement
+  , _msgVelNedCov_n_sats :: !Word8
     -- ^ Number of satellites used in solution
-  , _msgBaselineHeading_flags :: !Word8
+  , _msgVelNedCov_flags :: !Word8
     -- ^ Status flags
   } deriving ( Show, Read, Eq )
 
-instance Binary MsgBaselineHeading where
+instance Binary MsgVelNedCov where
   get = do
-    _msgBaselineHeading_tow <- getWord32le
-    _msgBaselineHeading_heading <- getWord32le
-    _msgBaselineHeading_n_sats <- getWord8
-    _msgBaselineHeading_flags <- getWord8
-    pure MsgBaselineHeading {..}
+    _msgVelNedCov_tow <- getWord32le
+    _msgVelNedCov_n <- fromIntegral <$> getWord32le
+    _msgVelNedCov_e <- fromIntegral <$> getWord32le
+    _msgVelNedCov_d <- fromIntegral <$> getWord32le
+    _msgVelNedCov_cov_n_n <- getFloat32le
+    _msgVelNedCov_cov_n_e <- getFloat32le
+    _msgVelNedCov_cov_n_d <- getFloat32le
+    _msgVelNedCov_cov_e_e <- getFloat32le
+    _msgVelNedCov_cov_e_d <- getFloat32le
+    _msgVelNedCov_cov_d_d <- getFloat32le
+    _msgVelNedCov_n_sats <- getWord8
+    _msgVelNedCov_flags <- getWord8
+    pure MsgVelNedCov {..}
 
-  put MsgBaselineHeading {..} = do
-    putWord32le _msgBaselineHeading_tow
-    putWord32le _msgBaselineHeading_heading
-    putWord8 _msgBaselineHeading_n_sats
-    putWord8 _msgBaselineHeading_flags
+  put MsgVelNedCov {..} = do
+    putWord32le _msgVelNedCov_tow
+    putWord32le $ fromIntegral _msgVelNedCov_n
+    putWord32le $ fromIntegral _msgVelNedCov_e
+    putWord32le $ fromIntegral _msgVelNedCov_d
+    putFloat32le _msgVelNedCov_cov_n_n
+    putFloat32le _msgVelNedCov_cov_n_e
+    putFloat32le _msgVelNedCov_cov_n_d
+    putFloat32le _msgVelNedCov_cov_e_e
+    putFloat32le _msgVelNedCov_cov_e_d
+    putFloat32le _msgVelNedCov_cov_d_d
+    putWord8 _msgVelNedCov_n_sats
+    putWord8 _msgVelNedCov_flags
 
-$(makeSBP 'msgBaselineHeading ''MsgBaselineHeading)
-$(makeJSON "_msgBaselineHeading_" ''MsgBaselineHeading)
-$(makeLenses ''MsgBaselineHeading)
+$(makeSBP 'msgVelNedCov ''MsgVelNedCov)
+$(makeJSON "_msgVelNedCov_" ''MsgVelNedCov)
+$(makeLenses ''MsgVelNedCov)
+
+msgVelBody :: Word16
+msgVelBody = 0x0213
+
+-- | SBP class for message MSG_VEL_BODY (0x0213).
+--
+-- This message reports the velocity in the Vehicle Body Frame. By convention,
+-- the x-axis should point out the nose of the vehicle and represent the
+-- forward direction, while as the y-axis should point out the right hand side
+-- of the vehicle. Since this is a right handed system, z should point out the
+-- bottom of the vehicle. The orientation and origin of the Vehicle Body Frame
+-- 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
+    -- ^ GPS Time of Week
+  , _msgVelBody_x     :: !Int32
+    -- ^ Velocity in x direction
+  , _msgVelBody_y     :: !Int32
+    -- ^ Velocity in y direction
+  , _msgVelBody_z     :: !Int32
+    -- ^ Velocity in z direction
+  , _msgVelBody_cov_x_x :: !Float
+    -- ^ Estimated variance of x
+  , _msgVelBody_cov_x_y :: !Float
+    -- ^ Covariance of x and y
+  , _msgVelBody_cov_x_z :: !Float
+    -- ^ Covariance of x and z
+  , _msgVelBody_cov_y_y :: !Float
+    -- ^ Estimated variance of y
+  , _msgVelBody_cov_y_z :: !Float
+    -- ^ Covariance of y and z
+  , _msgVelBody_cov_z_z :: !Float
+    -- ^ Estimated variance of z
+  , _msgVelBody_n_sats :: !Word8
+    -- ^ Number of satellites used in solution
+  , _msgVelBody_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgVelBody where
+  get = do
+    _msgVelBody_tow <- getWord32le
+    _msgVelBody_x <- fromIntegral <$> getWord32le
+    _msgVelBody_y <- fromIntegral <$> getWord32le
+    _msgVelBody_z <- fromIntegral <$> getWord32le
+    _msgVelBody_cov_x_x <- getFloat32le
+    _msgVelBody_cov_x_y <- getFloat32le
+    _msgVelBody_cov_x_z <- getFloat32le
+    _msgVelBody_cov_y_y <- getFloat32le
+    _msgVelBody_cov_y_z <- getFloat32le
+    _msgVelBody_cov_z_z <- getFloat32le
+    _msgVelBody_n_sats <- getWord8
+    _msgVelBody_flags <- getWord8
+    pure MsgVelBody {..}
+
+  put MsgVelBody {..} = do
+    putWord32le _msgVelBody_tow
+    putWord32le $ fromIntegral _msgVelBody_x
+    putWord32le $ fromIntegral _msgVelBody_y
+    putWord32le $ fromIntegral _msgVelBody_z
+    putFloat32le _msgVelBody_cov_x_x
+    putFloat32le _msgVelBody_cov_x_y
+    putFloat32le _msgVelBody_cov_x_z
+    putFloat32le _msgVelBody_cov_y_y
+    putFloat32le _msgVelBody_cov_y_z
+    putFloat32le _msgVelBody_cov_z_z
+    putWord8 _msgVelBody_n_sats
+    putWord8 _msgVelBody_flags
+
+$(makeSBP 'msgVelBody ''MsgVelBody)
+$(makeJSON "_msgVelBody_" ''MsgVelBody)
+$(makeLenses ''MsgVelBody)
 
 msgAgeCorrections :: Word16
 msgAgeCorrections = 0x0210
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Ndb
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Observation
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
diff --git a/src/SwiftNav/SBP/Orientation.hs b/src/SwiftNav/SBP/Orientation.hs
new file mode 100644
--- /dev/null
+++ b/src/SwiftNav/SBP/Orientation.hs
@@ -0,0 +1,234 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE TemplateHaskell             #-}
+{-# LANGUAGE RecordWildCards             #-}
+
+-- |
+-- Module:      SwiftNav.SBP.Orientation
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
+-- License:     LGPL-3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- Orientation Messages
+
+module SwiftNav.SBP.Orientation
+  ( module SwiftNav.SBP.Orientation
+  ) where
+
+import BasicPrelude
+import Control.Lens
+import Control.Monad.Loops
+import Data.Binary
+import Data.Binary.Get
+import Data.Binary.IEEE754
+import Data.Binary.Put
+import Data.ByteString.Lazy    hiding (ByteString)
+import Data.Int
+import Data.Word
+import SwiftNav.SBP.TH
+
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
+msgBaselineHeading :: Word16
+msgBaselineHeading = 0x020F
+
+-- | SBP class for message MSG_BASELINE_HEADING (0x020F).
+--
+-- This message reports the baseline heading pointing from the base station to
+-- 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). It is intended
+-- that time-matched RTK mode is used when the base station is moving.
+data MsgBaselineHeading = MsgBaselineHeading
+  { _msgBaselineHeading_tow   :: !Word32
+    -- ^ GPS Time of Week
+  , _msgBaselineHeading_heading :: !Word32
+    -- ^ Heading
+  , _msgBaselineHeading_n_sats :: !Word8
+    -- ^ Number of satellites used in solution
+  , _msgBaselineHeading_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgBaselineHeading where
+  get = do
+    _msgBaselineHeading_tow <- getWord32le
+    _msgBaselineHeading_heading <- getWord32le
+    _msgBaselineHeading_n_sats <- getWord8
+    _msgBaselineHeading_flags <- getWord8
+    pure MsgBaselineHeading {..}
+
+  put MsgBaselineHeading {..} = do
+    putWord32le _msgBaselineHeading_tow
+    putWord32le _msgBaselineHeading_heading
+    putWord8 _msgBaselineHeading_n_sats
+    putWord8 _msgBaselineHeading_flags
+
+$(makeSBP 'msgBaselineHeading ''MsgBaselineHeading)
+$(makeJSON "_msgBaselineHeading_" ''MsgBaselineHeading)
+$(makeLenses ''MsgBaselineHeading)
+
+msgOrientQuat :: Word16
+msgOrientQuat = 0x0220
+
+-- | SBP class for message MSG_ORIENT_QUAT (0x0220).
+--
+-- This message reports the quaternion vector describing the vehicle body
+-- frame's orientation with respect to a local-level NED frame. The components
+-- 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
+    -- ^ GPS Time of Week
+  , _msgOrientQuat_w   :: !Int32
+    -- ^ Real component
+  , _msgOrientQuat_x   :: !Int32
+    -- ^ 1st imaginary component
+  , _msgOrientQuat_y   :: !Int32
+    -- ^ 2nd imaginary component
+  , _msgOrientQuat_z   :: !Int32
+    -- ^ 3rd imaginary component
+  , _msgOrientQuat_acc_w :: !Float
+    -- ^ Estimated standard deviation of w
+  , _msgOrientQuat_acc_x :: !Float
+    -- ^ Estimated standard deviation of x
+  , _msgOrientQuat_acc_y :: !Float
+    -- ^ Estimated standard deviation of y
+  , _msgOrientQuat_acc_z :: !Float
+    -- ^ Estimated standard deviation of z
+  , _msgOrientQuat_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgOrientQuat where
+  get = do
+    _msgOrientQuat_tow <- getWord32le
+    _msgOrientQuat_w <- fromIntegral <$> getWord32le
+    _msgOrientQuat_x <- fromIntegral <$> getWord32le
+    _msgOrientQuat_y <- fromIntegral <$> getWord32le
+    _msgOrientQuat_z <- fromIntegral <$> getWord32le
+    _msgOrientQuat_acc_w <- getFloat32le
+    _msgOrientQuat_acc_x <- getFloat32le
+    _msgOrientQuat_acc_y <- getFloat32le
+    _msgOrientQuat_acc_z <- getFloat32le
+    _msgOrientQuat_flags <- getWord8
+    pure MsgOrientQuat {..}
+
+  put MsgOrientQuat {..} = do
+    putWord32le _msgOrientQuat_tow
+    putWord32le $ fromIntegral _msgOrientQuat_w
+    putWord32le $ fromIntegral _msgOrientQuat_x
+    putWord32le $ fromIntegral _msgOrientQuat_y
+    putWord32le $ fromIntegral _msgOrientQuat_z
+    putFloat32le _msgOrientQuat_acc_w
+    putFloat32le _msgOrientQuat_acc_x
+    putFloat32le _msgOrientQuat_acc_y
+    putFloat32le _msgOrientQuat_acc_z
+    putWord8 _msgOrientQuat_flags
+
+$(makeSBP 'msgOrientQuat ''MsgOrientQuat)
+$(makeJSON "_msgOrientQuat_" ''MsgOrientQuat)
+$(makeLenses ''MsgOrientQuat)
+
+msgOrientEuler :: Word16
+msgOrientEuler = 0x0221
+
+-- | SBP class for message MSG_ORIENT_EULER (0x0221).
+--
+-- This message reports the yaw, pitch, and roll angles of the vehicle body
+-- frame. The rotations should applied intrinsically in the order yaw, pitch,
+-- 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
+    -- ^ GPS Time of Week
+  , _msgOrientEuler_roll    :: !Int32
+    -- ^ rotation about the forward axis of the vehicle
+  , _msgOrientEuler_pitch   :: !Int32
+    -- ^ rotation about the rightward axis of the vehicle
+  , _msgOrientEuler_yaw     :: !Int32
+    -- ^ rotation about the downward axis of the vehicle
+  , _msgOrientEuler_var_roll :: !Float
+    -- ^ Estimated standard deviation of roll
+  , _msgOrientEuler_var_pitch :: !Float
+    -- ^ Estimated standard deviation of pitch
+  , _msgOrientEuler_var_yaw :: !Float
+    -- ^ Estimated standard deviation of yaw
+  , _msgOrientEuler_flags   :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgOrientEuler where
+  get = do
+    _msgOrientEuler_tow <- getWord32le
+    _msgOrientEuler_roll <- fromIntegral <$> getWord32le
+    _msgOrientEuler_pitch <- fromIntegral <$> getWord32le
+    _msgOrientEuler_yaw <- fromIntegral <$> getWord32le
+    _msgOrientEuler_var_roll <- getFloat32le
+    _msgOrientEuler_var_pitch <- getFloat32le
+    _msgOrientEuler_var_yaw <- getFloat32le
+    _msgOrientEuler_flags <- getWord8
+    pure MsgOrientEuler {..}
+
+  put MsgOrientEuler {..} = do
+    putWord32le _msgOrientEuler_tow
+    putWord32le $ fromIntegral _msgOrientEuler_roll
+    putWord32le $ fromIntegral _msgOrientEuler_pitch
+    putWord32le $ fromIntegral _msgOrientEuler_yaw
+    putFloat32le _msgOrientEuler_var_roll
+    putFloat32le _msgOrientEuler_var_pitch
+    putFloat32le _msgOrientEuler_var_yaw
+    putWord8 _msgOrientEuler_flags
+
+$(makeSBP 'msgOrientEuler ''MsgOrientEuler)
+$(makeJSON "_msgOrientEuler_" ''MsgOrientEuler)
+$(makeLenses ''MsgOrientEuler)
+
+msgAngularRate :: Word16
+msgAngularRate = 0x0222
+
+-- | SBP class for message MSG_ANGULAR_RATE (0x0222).
+--
+-- This message reports the orientation rates in the vehicle body frame.  The
+-- values represent the measurements a strapped down gyroscope would  make and
+-- are not equivalent to the time derivative of the Euler angles. The
+-- orientation and origin of the user frame is specified via device settings.
+-- By convention, the vehicle x-axis is expected to be aligned with the forward
+-- 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
+    -- ^ GPS Time of Week
+  , _msgAngularRate_x   :: !Int32
+    -- ^ angular rate about x axis
+  , _msgAngularRate_y   :: !Int32
+    -- ^ angular rate about y axis
+  , _msgAngularRate_z   :: !Int32
+    -- ^ angular rate about z axis
+  , _msgAngularRate_flags :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgAngularRate where
+  get = do
+    _msgAngularRate_tow <- getWord32le
+    _msgAngularRate_x <- fromIntegral <$> getWord32le
+    _msgAngularRate_y <- fromIntegral <$> getWord32le
+    _msgAngularRate_z <- fromIntegral <$> getWord32le
+    _msgAngularRate_flags <- getWord8
+    pure MsgAngularRate {..}
+
+  put MsgAngularRate {..} = do
+    putWord32le _msgAngularRate_tow
+    putWord32le $ fromIntegral _msgAngularRate_x
+    putWord32le $ fromIntegral _msgAngularRate_y
+    putWord32le $ fromIntegral _msgAngularRate_z
+    putWord8 _msgAngularRate_flags
+
+$(makeSBP 'msgAngularRate ''MsgAngularRate)
+$(makeJSON "_msgAngularRate_" ''MsgAngularRate)
+$(makeLenses ''MsgAngularRate)
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Piksi
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
diff --git a/src/SwiftNav/SBP/Sbas.hs b/src/SwiftNav/SBP/Sbas.hs
new file mode 100644
--- /dev/null
+++ b/src/SwiftNav/SBP/Sbas.hs
@@ -0,0 +1,72 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE TemplateHaskell             #-}
+{-# LANGUAGE RecordWildCards             #-}
+
+-- |
+-- Module:      SwiftNav.SBP.Sbas
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
+-- License:     LGPL-3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- SBAS data
+
+module SwiftNav.SBP.Sbas
+  ( module SwiftNav.SBP.Sbas
+  ) where
+
+import BasicPrelude
+import Control.Lens
+import Control.Monad.Loops
+import Data.Binary
+import Data.Binary.Get
+import Data.Binary.IEEE754
+import Data.Binary.Put
+import Data.ByteString.Lazy    hiding (ByteString)
+import Data.Int
+import Data.Word
+import SwiftNav.SBP.TH
+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) #-}
+
+
+msgSbasRaw :: Word16
+msgSbasRaw = 0x7777
+
+-- | SBP class for message MSG_SBAS_RAW (0x7777).
+--
+-- 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
+    -- ^ GNSS signal identifier.
+  , _msgSbasRaw_tow        :: !Word32
+    -- ^ GPS time-of-week at the start of the data block.
+  , _msgSbasRaw_message_type :: !Word8
+    -- ^ SBAS message type (0-63)
+  , _msgSbasRaw_data       :: ![Word8]
+    -- ^ Raw SBAS data field of 212 bits (last byte padded with zeros).
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSbasRaw where
+  get = do
+    _msgSbasRaw_sid <- get
+    _msgSbasRaw_tow <- getWord32le
+    _msgSbasRaw_message_type <- getWord8
+    _msgSbasRaw_data <- replicateM 27 getWord8
+    pure MsgSbasRaw {..}
+
+  put MsgSbasRaw {..} = do
+    put _msgSbasRaw_sid
+    putWord32le _msgSbasRaw_tow
+    putWord8 _msgSbasRaw_message_type
+    mapM_ putWord8 _msgSbasRaw_data
+
+$(makeSBP 'msgSbasRaw ''MsgSbasRaw)
+$(makeJSON "_msgSbasRaw_" ''MsgSbasRaw)
+$(makeLenses ''MsgSbasRaw)
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Settings
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
diff --git a/src/SwiftNav/SBP/Ssr.hs b/src/SwiftNav/SBP/Ssr.hs
new file mode 100644
--- /dev/null
+++ b/src/SwiftNav/SBP/Ssr.hs
@@ -0,0 +1,278 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE TemplateHaskell             #-}
+{-# LANGUAGE RecordWildCards             #-}
+
+-- |
+-- Module:      SwiftNav.SBP.Ssr
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
+-- License:     LGPL-3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- Precise State Space Representation (SSR) corrections format
+
+module SwiftNav.SBP.Ssr
+  ( module SwiftNav.SBP.Ssr
+  ) where
+
+import BasicPrelude
+import Control.Lens
+import Control.Monad.Loops
+import Data.Binary
+import Data.Binary.Get
+import Data.Binary.IEEE754
+import Data.Binary.Put
+import Data.ByteString.Lazy    hiding (ByteString)
+import Data.Int
+import Data.Word
+import SwiftNav.SBP.TH
+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) #-}
+
+
+-- | CodeBiasesContent.
+--
+-- Code biases are to be added to pseudorange. The corrections are conform with
+-- typical RTCMv3 MT1059 and 1065.
+data CodeBiasesContent = CodeBiasesContent
+  { _codeBiasesContent_code :: !Word8
+    -- ^ Signal constellation, band and code
+  , _codeBiasesContent_value :: !Int16
+    -- ^ Code bias value
+  } deriving ( Show, Read, Eq )
+
+instance Binary CodeBiasesContent where
+  get = do
+    _codeBiasesContent_code <- getWord8
+    _codeBiasesContent_value <- fromIntegral <$> getWord16le
+    pure CodeBiasesContent {..}
+
+  put CodeBiasesContent {..} = do
+    putWord8 _codeBiasesContent_code
+    putWord16le $ fromIntegral _codeBiasesContent_value
+
+$(makeJSON "_codeBiasesContent_" ''CodeBiasesContent)
+$(makeLenses ''CodeBiasesContent)
+
+-- | PhaseBiasesContent.
+--
+-- 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
+    -- ^ Signal constellation, band and code
+  , _phaseBiasesContent_integer_indicator        :: !Word8
+    -- ^ Indicator for integer property
+  , _phaseBiasesContent_widelane_integer_indicator :: !Word8
+    -- ^ Indicator for two groups of Wide-Lane(s) integer property
+  , _phaseBiasesContent_discontinuity_counter    :: !Word8
+    -- ^ Signal phase discontinuity counter.  Increased for every discontinuity
+    -- in phase.
+  , _phaseBiasesContent_bias                     :: !Int32
+    -- ^ Phase bias for specified signal
+  } deriving ( Show, Read, Eq )
+
+instance Binary PhaseBiasesContent where
+  get = do
+    _phaseBiasesContent_code <- getWord8
+    _phaseBiasesContent_integer_indicator <- getWord8
+    _phaseBiasesContent_widelane_integer_indicator <- getWord8
+    _phaseBiasesContent_discontinuity_counter <- getWord8
+    _phaseBiasesContent_bias <- fromIntegral <$> getWord32le
+    pure PhaseBiasesContent {..}
+
+  put PhaseBiasesContent {..} = do
+    putWord8 _phaseBiasesContent_code
+    putWord8 _phaseBiasesContent_integer_indicator
+    putWord8 _phaseBiasesContent_widelane_integer_indicator
+    putWord8 _phaseBiasesContent_discontinuity_counter
+    putWord32le $ fromIntegral _phaseBiasesContent_bias
+
+$(makeJSON "_phaseBiasesContent_" ''PhaseBiasesContent)
+$(makeLenses ''PhaseBiasesContent)
+
+msgSsrOrbitClock :: Word16
+msgSsrOrbitClock = 0x05DC
+
+-- | SBP class for message MSG_SSR_ORBIT_CLOCK (0x05DC).
+--
+-- The precise orbit and clock correction message is  to be applied as a delta
+-- correction to broadcast  ephemeris and is typically an equivalent to the
+-- 1060 and 1066 RTCM message types
+data MsgSsrOrbitClock = MsgSsrOrbitClock
+  { _msgSsrOrbitClock_time          :: !GpsTimeSec
+    -- ^ GNSS reference time of the correction
+  , _msgSsrOrbitClock_sid           :: !GnssSignal
+    -- ^ GNSS signal identifier (16 bit)
+  , _msgSsrOrbitClock_update_interval :: !Word8
+    -- ^ Update interval between consecutive corrections
+  , _msgSsrOrbitClock_iod_ssr       :: !Word8
+    -- ^ 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
+    -- ^ Issue of broadcast ephemeris data
+  , _msgSsrOrbitClock_radial        :: !Int32
+    -- ^ Orbit radial delta correction
+  , _msgSsrOrbitClock_along         :: !Int32
+    -- ^ Orbit along delta correction
+  , _msgSsrOrbitClock_cross         :: !Int32
+    -- ^ Orbit along delta correction
+  , _msgSsrOrbitClock_dot_radial    :: !Int32
+    -- ^ Velocity of orbit radial delta correction
+  , _msgSsrOrbitClock_dot_along     :: !Int32
+    -- ^ Velocity of orbit along delta correction
+  , _msgSsrOrbitClock_dot_cross     :: !Int32
+    -- ^ Velocity of orbit cross delta correction
+  , _msgSsrOrbitClock_c0            :: !Int32
+    -- ^ C0 polynomial coefficient for correction of broadcast satellite clock
+  , _msgSsrOrbitClock_c1            :: !Int32
+    -- ^ C1 polynomial coefficient for correction of broadcast satellite clock
+  , _msgSsrOrbitClock_c2            :: !Int32
+    -- ^ C2 polynomial coefficient for correction of broadcast satellite clock
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSsrOrbitClock where
+  get = do
+    _msgSsrOrbitClock_time <- get
+    _msgSsrOrbitClock_sid <- get
+    _msgSsrOrbitClock_update_interval <- getWord8
+    _msgSsrOrbitClock_iod_ssr <- getWord8
+    _msgSsrOrbitClock_iod <- getWord8
+    _msgSsrOrbitClock_radial <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_along <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_cross <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_dot_radial <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_dot_along <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_dot_cross <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_c0 <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_c1 <- fromIntegral <$> getWord32le
+    _msgSsrOrbitClock_c2 <- fromIntegral <$> getWord32le
+    pure MsgSsrOrbitClock {..}
+
+  put MsgSsrOrbitClock {..} = do
+    put _msgSsrOrbitClock_time
+    put _msgSsrOrbitClock_sid
+    putWord8 _msgSsrOrbitClock_update_interval
+    putWord8 _msgSsrOrbitClock_iod_ssr
+    putWord8 _msgSsrOrbitClock_iod
+    putWord32le $ fromIntegral _msgSsrOrbitClock_radial
+    putWord32le $ fromIntegral _msgSsrOrbitClock_along
+    putWord32le $ fromIntegral _msgSsrOrbitClock_cross
+    putWord32le $ fromIntegral _msgSsrOrbitClock_dot_radial
+    putWord32le $ fromIntegral _msgSsrOrbitClock_dot_along
+    putWord32le $ fromIntegral _msgSsrOrbitClock_dot_cross
+    putWord32le $ fromIntegral _msgSsrOrbitClock_c0
+    putWord32le $ fromIntegral _msgSsrOrbitClock_c1
+    putWord32le $ fromIntegral _msgSsrOrbitClock_c2
+
+$(makeSBP 'msgSsrOrbitClock ''MsgSsrOrbitClock)
+$(makeJSON "_msgSsrOrbitClock_" ''MsgSsrOrbitClock)
+$(makeLenses ''MsgSsrOrbitClock)
+
+msgSsrCodeBiases :: Word16
+msgSsrCodeBiases = 0x05E1
+
+-- | SBP class for message MSG_SSR_CODE_BIASES (0x05E1).
+--
+-- The precise code biases message is to be added to the pseudorange of the
+-- 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
+    -- ^ GNSS reference time of the correction
+  , _msgSsrCodeBiases_sid           :: !GnssSignal
+    -- ^ GNSS signal identifier (16 bit)
+  , _msgSsrCodeBiases_update_interval :: !Word8
+    -- ^ Update interval between consecutive corrections
+  , _msgSsrCodeBiases_iod_ssr       :: !Word8
+    -- ^ 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]
+    -- ^ Code biases for the different satellite signals
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSsrCodeBiases where
+  get = do
+    _msgSsrCodeBiases_time <- get
+    _msgSsrCodeBiases_sid <- get
+    _msgSsrCodeBiases_update_interval <- getWord8
+    _msgSsrCodeBiases_iod_ssr <- getWord8
+    _msgSsrCodeBiases_biases <- replicateM 8 get
+    pure MsgSsrCodeBiases {..}
+
+  put MsgSsrCodeBiases {..} = do
+    put _msgSsrCodeBiases_time
+    put _msgSsrCodeBiases_sid
+    putWord8 _msgSsrCodeBiases_update_interval
+    putWord8 _msgSsrCodeBiases_iod_ssr
+    mapM_ put _msgSsrCodeBiases_biases
+
+$(makeSBP 'msgSsrCodeBiases ''MsgSsrCodeBiases)
+$(makeJSON "_msgSsrCodeBiases_" ''MsgSsrCodeBiases)
+$(makeLenses ''MsgSsrCodeBiases)
+
+msgSsrPhaseBiases :: Word16
+msgSsrPhaseBiases = 0x05E6
+
+-- | SBP class for message MSG_SSR_PHASE_BIASES (0x05E6).
+--
+-- The precise phase biases message contains the biases to be added to the
+-- carrier phase of the corresponding signal to get corrected carrier phase
+-- measurement, as  well as the satellite yaw angle to be applied to compute
+-- the phase wind-up correction.  It is typically an equivalent to the 1265
+-- RTCM message types
+data MsgSsrPhaseBiases = MsgSsrPhaseBiases
+  { _msgSsrPhaseBiases_time          :: !GpsTimeSec
+    -- ^ GNSS reference time of the correction
+  , _msgSsrPhaseBiases_sid           :: !GnssSignal
+    -- ^ GNSS signal identifier (16 bit)
+  , _msgSsrPhaseBiases_update_interval :: !Word8
+    -- ^ Update interval between consecutive corrections
+  , _msgSsrPhaseBiases_iod_ssr       :: !Word8
+    -- ^ 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
+    -- ^ Indicator for the dispersive phase biases property.
+  , _msgSsrPhaseBiases_mw_consistency :: !Word8
+    -- ^ Consistency indicator for Melbourne-Wubbena linear combinations
+  , _msgSsrPhaseBiases_yaw           :: !Word16
+    -- ^ Satellite yaw angle
+  , _msgSsrPhaseBiases_yaw_rate      :: !Int16
+    -- ^ Satellite yaw angle rate
+  , _msgSsrPhaseBiases_biases        :: ![PhaseBiasesContent]
+    -- ^ Phase biases corrections for a satellite being tracked.
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgSsrPhaseBiases where
+  get = do
+    _msgSsrPhaseBiases_time <- get
+    _msgSsrPhaseBiases_sid <- get
+    _msgSsrPhaseBiases_update_interval <- getWord8
+    _msgSsrPhaseBiases_iod_ssr <- getWord8
+    _msgSsrPhaseBiases_dispersive_bias <- getWord8
+    _msgSsrPhaseBiases_mw_consistency <- getWord8
+    _msgSsrPhaseBiases_yaw <- getWord16le
+    _msgSsrPhaseBiases_yaw_rate <- fromIntegral <$> getWord16le
+    _msgSsrPhaseBiases_biases <- replicateM 8 get
+    pure MsgSsrPhaseBiases {..}
+
+  put MsgSsrPhaseBiases {..} = do
+    put _msgSsrPhaseBiases_time
+    put _msgSsrPhaseBiases_sid
+    putWord8 _msgSsrPhaseBiases_update_interval
+    putWord8 _msgSsrPhaseBiases_iod_ssr
+    putWord8 _msgSsrPhaseBiases_dispersive_bias
+    putWord8 _msgSsrPhaseBiases_mw_consistency
+    putWord16le _msgSsrPhaseBiases_yaw
+    putWord16le $ fromIntegral _msgSsrPhaseBiases_yaw_rate
+    mapM_ put _msgSsrPhaseBiases_biases
+
+$(makeSBP 'msgSsrPhaseBiases ''MsgSsrPhaseBiases)
+$(makeJSON "_msgSsrPhaseBiases_" ''MsgSsrPhaseBiases)
+$(makeLenses ''MsgSsrPhaseBiases)
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.System
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -133,3 +133,27 @@
 $(makeSBP 'msgHeartbeat ''MsgHeartbeat)
 $(makeJSON "_msgHeartbeat_" ''MsgHeartbeat)
 $(makeLenses ''MsgHeartbeat)
+
+msgInsStatus :: Word16
+msgInsStatus = 0xFF03
+
+-- | SBP class for message MSG_INS_STATUS (0xFF03).
+--
+-- The INS status message describes the state of the operation and
+-- initialization of the inertial navigation system.
+data MsgInsStatus = MsgInsStatus
+  { _msgInsStatus_flags :: !Word32
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgInsStatus where
+  get = do
+    _msgInsStatus_flags <- getWord32le
+    pure MsgInsStatus {..}
+
+  put MsgInsStatus {..} = do
+    putWord32le _msgInsStatus_flags
+
+$(makeSBP 'msgInsStatus ''MsgInsStatus)
+$(makeJSON "_msgInsStatus_" ''MsgInsStatus)
+$(makeLenses ''MsgInsStatus)
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.Tracking
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
@@ -36,115 +36,115 @@
 {-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
 
 
-msgTrackingStateDetailed :: Word16
-msgTrackingStateDetailed = 0x0021
+msgTrackingStateDetailedDepA :: Word16
+msgTrackingStateDetailedDepA = 0x0021
 
--- | SBP class for message MSG_TRACKING_STATE_DETAILED (0x0021).
+-- | SBP class for message MSG_TRACKING_STATE_DETAILED_DEP_A (0x0021).
 --
 -- The tracking message returns a set tracking channel parameters for a single
 -- tracking channel useful for debugging issues.
-data MsgTrackingStateDetailed = MsgTrackingStateDetailed
-  { _msgTrackingStateDetailed_recv_time  :: !Word64
+data MsgTrackingStateDetailedDepA = MsgTrackingStateDetailedDepA
+  { _msgTrackingStateDetailedDepA_recv_time  :: !Word64
     -- ^ Receiver clock time.
-  , _msgTrackingStateDetailed_tot        :: !GpsTime
+  , _msgTrackingStateDetailedDepA_tot        :: !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.
-  , _msgTrackingStateDetailed_P          :: !Word32
+  , _msgTrackingStateDetailedDepA_P          :: !Word32
     -- ^ Pseudorange observation. Valid only when pseudorange valid flag is set.
-  , _msgTrackingStateDetailed_P_std      :: !Word16
+  , _msgTrackingStateDetailedDepA_P_std      :: !Word16
     -- ^ Pseudorange observation standard deviation. Valid only when pseudorange
     -- valid flag is set.
-  , _msgTrackingStateDetailed_L          :: !CarrierPhase
+  , _msgTrackingStateDetailedDepA_L          :: !CarrierPhase
     -- ^ Carrier phase observation with typical sign convention. Valid only when
     -- PLL pessimistic lock is achieved.
-  , _msgTrackingStateDetailed_cn0        :: !Word8
+  , _msgTrackingStateDetailedDepA_cn0        :: !Word8
     -- ^ Carrier-to-Noise density
-  , _msgTrackingStateDetailed_lock       :: !Word16
+  , _msgTrackingStateDetailedDepA_lock       :: !Word16
     -- ^ Lock time. It is encoded according to DF402 from the RTCM 10403.2
     -- Amendment 2 specification. Valid values range from 0 to 15.
-  , _msgTrackingStateDetailed_sid        :: !GnssSignal
+  , _msgTrackingStateDetailedDepA_sid        :: !GnssSignal
     -- ^ GNSS signal identifier.
-  , _msgTrackingStateDetailed_doppler    :: !Int32
+  , _msgTrackingStateDetailedDepA_doppler    :: !Int32
     -- ^ Carrier Doppler frequency.
-  , _msgTrackingStateDetailed_doppler_std :: !Word16
+  , _msgTrackingStateDetailedDepA_doppler_std :: !Word16
     -- ^ Carrier Doppler frequency standard deviation.
-  , _msgTrackingStateDetailed_uptime     :: !Word32
+  , _msgTrackingStateDetailedDepA_uptime     :: !Word32
     -- ^ Number of seconds of continuous tracking. Specifies how much time signal
     -- is in continuous track.
-  , _msgTrackingStateDetailed_clock_offset :: !Int16
+  , _msgTrackingStateDetailedDepA_clock_offset :: !Int16
     -- ^ TCXO clock offset. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailed_clock_drift :: !Int16
+  , _msgTrackingStateDetailedDepA_clock_drift :: !Int16
     -- ^ TCXO clock drift. Valid only when valid clock valid flag is set.
-  , _msgTrackingStateDetailed_corr_spacing :: !Word16
+  , _msgTrackingStateDetailedDepA_corr_spacing :: !Word16
     -- ^ Early-Prompt (EP) and Prompt-Late (PL) correlators spacing.
-  , _msgTrackingStateDetailed_acceleration :: !Int8
+  , _msgTrackingStateDetailedDepA_acceleration :: !Int8
     -- ^ Acceleration. Valid only when acceleration valid flag is set.
-  , _msgTrackingStateDetailed_sync_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_sync_flags :: !Word8
     -- ^ Synchronization status flags.
-  , _msgTrackingStateDetailed_tow_flags  :: !Word8
+  , _msgTrackingStateDetailedDepA_tow_flags  :: !Word8
     -- ^ TOW status flags.
-  , _msgTrackingStateDetailed_track_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_track_flags :: !Word8
     -- ^ Tracking loop status flags.
-  , _msgTrackingStateDetailed_nav_flags  :: !Word8
+  , _msgTrackingStateDetailedDepA_nav_flags  :: !Word8
     -- ^ Navigation data status flags.
-  , _msgTrackingStateDetailed_pset_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_pset_flags :: !Word8
     -- ^ Parameters sets flags.
-  , _msgTrackingStateDetailed_misc_flags :: !Word8
+  , _msgTrackingStateDetailedDepA_misc_flags :: !Word8
     -- ^ Miscellaneous flags.
   } deriving ( Show, Read, Eq )
 
-instance Binary MsgTrackingStateDetailed where
+instance Binary MsgTrackingStateDetailedDepA where
   get = do
-    _msgTrackingStateDetailed_recv_time <- getWord64le
-    _msgTrackingStateDetailed_tot <- get
-    _msgTrackingStateDetailed_P <- getWord32le
-    _msgTrackingStateDetailed_P_std <- getWord16le
-    _msgTrackingStateDetailed_L <- get
-    _msgTrackingStateDetailed_cn0 <- getWord8
-    _msgTrackingStateDetailed_lock <- getWord16le
-    _msgTrackingStateDetailed_sid <- get
-    _msgTrackingStateDetailed_doppler <- fromIntegral <$> getWord32le
-    _msgTrackingStateDetailed_doppler_std <- getWord16le
-    _msgTrackingStateDetailed_uptime <- getWord32le
-    _msgTrackingStateDetailed_clock_offset <- fromIntegral <$> getWord16le
-    _msgTrackingStateDetailed_clock_drift <- fromIntegral <$> getWord16le
-    _msgTrackingStateDetailed_corr_spacing <- getWord16le
-    _msgTrackingStateDetailed_acceleration <- fromIntegral <$> getWord8
-    _msgTrackingStateDetailed_sync_flags <- getWord8
-    _msgTrackingStateDetailed_tow_flags <- getWord8
-    _msgTrackingStateDetailed_track_flags <- getWord8
-    _msgTrackingStateDetailed_nav_flags <- getWord8
-    _msgTrackingStateDetailed_pset_flags <- getWord8
-    _msgTrackingStateDetailed_misc_flags <- getWord8
-    pure MsgTrackingStateDetailed {..}
+    _msgTrackingStateDetailedDepA_recv_time <- getWord64le
+    _msgTrackingStateDetailedDepA_tot <- get
+    _msgTrackingStateDetailedDepA_P <- getWord32le
+    _msgTrackingStateDetailedDepA_P_std <- getWord16le
+    _msgTrackingStateDetailedDepA_L <- get
+    _msgTrackingStateDetailedDepA_cn0 <- getWord8
+    _msgTrackingStateDetailedDepA_lock <- getWord16le
+    _msgTrackingStateDetailedDepA_sid <- get
+    _msgTrackingStateDetailedDepA_doppler <- fromIntegral <$> getWord32le
+    _msgTrackingStateDetailedDepA_doppler_std <- getWord16le
+    _msgTrackingStateDetailedDepA_uptime <- getWord32le
+    _msgTrackingStateDetailedDepA_clock_offset <- fromIntegral <$> getWord16le
+    _msgTrackingStateDetailedDepA_clock_drift <- fromIntegral <$> getWord16le
+    _msgTrackingStateDetailedDepA_corr_spacing <- getWord16le
+    _msgTrackingStateDetailedDepA_acceleration <- fromIntegral <$> getWord8
+    _msgTrackingStateDetailedDepA_sync_flags <- getWord8
+    _msgTrackingStateDetailedDepA_tow_flags <- getWord8
+    _msgTrackingStateDetailedDepA_track_flags <- getWord8
+    _msgTrackingStateDetailedDepA_nav_flags <- getWord8
+    _msgTrackingStateDetailedDepA_pset_flags <- getWord8
+    _msgTrackingStateDetailedDepA_misc_flags <- getWord8
+    pure MsgTrackingStateDetailedDepA {..}
 
-  put MsgTrackingStateDetailed {..} = do
-    putWord64le _msgTrackingStateDetailed_recv_time
-    put _msgTrackingStateDetailed_tot
-    putWord32le _msgTrackingStateDetailed_P
-    putWord16le _msgTrackingStateDetailed_P_std
-    put _msgTrackingStateDetailed_L
-    putWord8 _msgTrackingStateDetailed_cn0
-    putWord16le _msgTrackingStateDetailed_lock
-    put _msgTrackingStateDetailed_sid
-    putWord32le $ fromIntegral _msgTrackingStateDetailed_doppler
-    putWord16le _msgTrackingStateDetailed_doppler_std
-    putWord32le _msgTrackingStateDetailed_uptime
-    putWord16le $ fromIntegral _msgTrackingStateDetailed_clock_offset
-    putWord16le $ fromIntegral _msgTrackingStateDetailed_clock_drift
-    putWord16le _msgTrackingStateDetailed_corr_spacing
-    putWord8 $ fromIntegral _msgTrackingStateDetailed_acceleration
-    putWord8 _msgTrackingStateDetailed_sync_flags
-    putWord8 _msgTrackingStateDetailed_tow_flags
-    putWord8 _msgTrackingStateDetailed_track_flags
-    putWord8 _msgTrackingStateDetailed_nav_flags
-    putWord8 _msgTrackingStateDetailed_pset_flags
-    putWord8 _msgTrackingStateDetailed_misc_flags
+  put MsgTrackingStateDetailedDepA {..} = do
+    putWord64le _msgTrackingStateDetailedDepA_recv_time
+    put _msgTrackingStateDetailedDepA_tot
+    putWord32le _msgTrackingStateDetailedDepA_P
+    putWord16le _msgTrackingStateDetailedDepA_P_std
+    put _msgTrackingStateDetailedDepA_L
+    putWord8 _msgTrackingStateDetailedDepA_cn0
+    putWord16le _msgTrackingStateDetailedDepA_lock
+    put _msgTrackingStateDetailedDepA_sid
+    putWord32le $ fromIntegral _msgTrackingStateDetailedDepA_doppler
+    putWord16le _msgTrackingStateDetailedDepA_doppler_std
+    putWord32le _msgTrackingStateDetailedDepA_uptime
+    putWord16le $ fromIntegral _msgTrackingStateDetailedDepA_clock_offset
+    putWord16le $ fromIntegral _msgTrackingStateDetailedDepA_clock_drift
+    putWord16le _msgTrackingStateDetailedDepA_corr_spacing
+    putWord8 $ fromIntegral _msgTrackingStateDetailedDepA_acceleration
+    putWord8 _msgTrackingStateDetailedDepA_sync_flags
+    putWord8 _msgTrackingStateDetailedDepA_tow_flags
+    putWord8 _msgTrackingStateDetailedDepA_track_flags
+    putWord8 _msgTrackingStateDetailedDepA_nav_flags
+    putWord8 _msgTrackingStateDetailedDepA_pset_flags
+    putWord8 _msgTrackingStateDetailedDepA_misc_flags
 
-$(makeSBP 'msgTrackingStateDetailed ''MsgTrackingStateDetailed)
-$(makeJSON "_msgTrackingStateDetailed_" ''MsgTrackingStateDetailed)
-$(makeLenses ''MsgTrackingStateDetailed)
+$(makeSBP 'msgTrackingStateDetailedDepA ''MsgTrackingStateDetailedDepA)
+$(makeJSON "_msgTrackingStateDetailedDepA_" ''MsgTrackingStateDetailedDepA)
+$(makeLenses ''MsgTrackingStateDetailedDepA)
 
 msgTrackingStateDetailedDep :: Word16
 msgTrackingStateDetailedDep = 0x0011
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
@@ -5,9 +5,9 @@
 
 -- |
 -- Module:      SwiftNav.SBP.User
--- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
 -- License:     LGPL-3
--- Maintainer:  Mark Fine <dev@swiftnav.com>
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
 -- Stability:   experimental
 -- Portability: portable
 --
diff --git a/src/SwiftNav/SBP/Vehicle.hs b/src/SwiftNav/SBP/Vehicle.hs
new file mode 100644
--- /dev/null
+++ b/src/SwiftNav/SBP/Vehicle.hs
@@ -0,0 +1,73 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# LANGUAGE NoImplicitPrelude           #-}
+{-# LANGUAGE TemplateHaskell             #-}
+{-# LANGUAGE RecordWildCards             #-}
+
+-- |
+-- Module:      SwiftNav.SBP.Vehicle
+-- Copyright:   Copyright (C) 2015-2018 Swift Navigation, Inc.
+-- License:     LGPL-3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+-- Stability:   experimental
+-- Portability: portable
+--
+-- Messages from a vehicle.
+
+module SwiftNav.SBP.Vehicle
+  ( module SwiftNav.SBP.Vehicle
+  ) where
+
+import BasicPrelude
+import Control.Lens
+import Control.Monad.Loops
+import Data.Binary
+import Data.Binary.Get
+import Data.Binary.IEEE754
+import Data.Binary.Put
+import Data.ByteString.Lazy    hiding (ByteString)
+import Data.Int
+import Data.Word
+import SwiftNav.SBP.TH
+
+{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
+{-# ANN module ("HLint: ignore Redundant do"::String) #-}
+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
+
+
+msgOdometry :: Word16
+msgOdometry = 0x0903
+
+-- | SBP class for message MSG_ODOMETRY (0x0903).
+--
+-- Message representing the x component of vehicle velocity in the user frame
+-- at the odometry reference point(s) specified by the user. The offset for the
+-- odometry reference point and  the definition and origin of the user frame
+-- are defined through the device settings interface. There are 4 possible
+-- user-defined sources of this message  which are labeled arbitrarily  source
+-- 0 through 3.
+data MsgOdometry = MsgOdometry
+  { _msgOdometry_tow    :: !Word32
+    -- ^ 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
+    -- ^ The signed forward component of vehicle velocity.
+  , _msgOdometry_flags  :: !Word8
+    -- ^ Status flags
+  } deriving ( Show, Read, Eq )
+
+instance Binary MsgOdometry where
+  get = do
+    _msgOdometry_tow <- getWord32le
+    _msgOdometry_velocity <- fromIntegral <$> getWord32le
+    _msgOdometry_flags <- getWord8
+    pure MsgOdometry {..}
+
+  put MsgOdometry {..} = do
+    putWord32le _msgOdometry_tow
+    putWord32le $ fromIntegral _msgOdometry_velocity
+    putWord8 _msgOdometry_flags
+
+$(makeSBP 'msgOdometry ''MsgOdometry)
+$(makeJSON "_msgOdometry_" ''MsgOdometry)
+$(makeLenses ''MsgOdometry)
