diff --git a/main/rtcm32json.hs b/main/rtcm32json.hs
--- a/main/rtcm32json.hs
+++ b/main/rtcm32json.hs
@@ -1,3 +1,7 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Main
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/rtcm.cabal b/rtcm.cabal
--- a/rtcm.cabal
+++ b/rtcm.cabal
@@ -1,5 +1,5 @@
 name:                  rtcm
-version:               0.1.9
+version:               0.1.10
 synopsis:              RTCM Library.
 description:           Haskell bindings for RTCM.
 homepage:              http://github.com/swift-nav/librtcm
@@ -48,10 +48,6 @@
                      , text
                      , word24
   default-language:    Haskell2010
-  default-extensions:  NoImplicitPrelude
-                       OverloadedStrings
-                       RecordWildCards
-                       TemplateHaskell
 
 executable rtcm32json
   hs-source-dirs:      main
@@ -68,8 +64,6 @@
                      , resourcet
                      , rtcm
   default-language:    Haskell2010
-  default-extensions:  NoImplicitPrelude
-                       OverloadedStrings
 
 test-suite test
   type:                exitcode-stdio-1.0
@@ -77,6 +71,7 @@
   main-is:             Test.hs
   other-modules:       Test.Data.CRC24Q
                      , Test.Data.RTCM3.Antennas
+                     , Test.Data.RTCM3.Ephemeris
                      , Test.Data.RTCM3.Extras
                      , Test.Data.RTCM3.Observations
                      , Test.Data.RTCM3.SSR
@@ -96,6 +91,3 @@
                      , word24
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
   default-language:    Haskell2010
-  default-extensions:  NoImplicitPrelude
-                       OverloadedStrings
-                       RecordWildCards
diff --git a/src/Data/CRC24Q.hs b/src/Data/CRC24Q.hs
--- a/src/Data/CRC24Q.hs
+++ b/src/Data/CRC24Q.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.CRC24Q
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3.hs b/src/Data/RTCM3.hs
--- a/src/Data/RTCM3.hs
+++ b/src/Data/RTCM3.hs
@@ -1,3 +1,8 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3
 -- Copyright:   (c) 2015 Mark Fine
diff --git a/src/Data/RTCM3/Aeson.hs b/src/Data/RTCM3/Aeson.hs
--- a/src/Data/RTCM3/Aeson.hs
+++ b/src/Data/RTCM3/Aeson.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 {-# OPTIONS -fno-warn-orphans #-}
 -- |
 -- Module:      Data.RTCM3.Extras
diff --git a/src/Data/RTCM3/Antennas.hs b/src/Data/RTCM3/Antennas.hs
--- a/src/Data/RTCM3/Antennas.hs
+++ b/src/Data/RTCM3/Antennas.hs
@@ -1,3 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.Antennas
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
@@ -292,9 +296,7 @@
 instance Binary Msg1008 where
   get = B.runBitGet $ do
     _msg1008_descriptor    <- getBits 0
-    -- ^ Antenna descriptor.
     _msg1008_extDescriptor <- getBits 0
-    -- ^ Antenna extended descriptor.
     return Msg1008 {..}
 
   put Msg1008 {..} = B.runBitPut $ do
@@ -324,11 +326,8 @@
 instance Binary Msg1033 where
   get = B.runBitGet $ do
     _msg1033_antennaDescriptor    <- getBits 0
-    -- ^ Antenna descriptor.
     _msg1033_antennaExtDescriptor <- getBits 0
-    -- ^ Antenna extended descriptor.
     _msg1033_receiverDescriptor   <- getBits 0
-    -- ^ Receiver descriptor.
     return Msg1033 {..}
 
   put Msg1033 {..} = B.runBitPut $ do
diff --git a/src/Data/RTCM3/Ephemeris.hs b/src/Data/RTCM3/Ephemeris.hs
--- a/src/Data/RTCM3/Ephemeris.hs
+++ b/src/Data/RTCM3/Ephemeris.hs
@@ -1,3 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.Ephemeris
 -- Copyright:   Copyright (C) 2017 Swift Navigation, Inc.
@@ -21,28 +25,28 @@
 import           Data.RTCM3.Extras
 import           Data.RTCM3.TH
 
--- | EphemerisHeader.
+-- | GpsEphemerisHeader.
 --
 -- GPS and Glonass Ephemeris header.
-data EphemerisHeader = EphemerisHeader
-  { _ephemerisHeader_num :: Word16
+data GpsEphemerisHeader = GpsEphemerisHeader
+  { _gpsEphemerisHeader_num :: Word16
     -- ^ Message number.
-  , _ephemerisHeader_sat :: Word8
+  , _gpsEphemerisHeader_sat :: Word8
     -- ^ GPS/Glonass satellite ID.
   } deriving ( Show, Read, Eq )
 
-$(makeLenses ''EphemerisHeader)
-$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_ephemerisHeader_" . stripPrefix "_ephemerisHeader_"} ''EphemerisHeader)
+$(makeLenses ''GpsEphemerisHeader)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsEphemerisHeader_" . stripPrefix "_gpsEphemerisHeader_"} ''GpsEphemerisHeader)
 
-instance BinaryBit EphemerisHeader where
+instance BinaryBit GpsEphemerisHeader where
   getBits _n = do
-    _ephemerisHeader_num <- B.getWord16be 12
-    _ephemerisHeader_sat <- B.getWord8    6
-    return EphemerisHeader {..}
+    _gpsEphemerisHeader_num <- B.getWord16be 12
+    _gpsEphemerisHeader_sat <- B.getWord8    6
+    return GpsEphemerisHeader {..}
 
-  putBits _n EphemerisHeader {..} = do
-    B.putWord16be 12 _ephemerisHeader_num
-    B.putWord8    6  _ephemerisHeader_sat
+  putBits _n GpsEphemerisHeader {..} = do
+    B.putWord16be 12 _gpsEphemerisHeader_num
+    B.putWord8    6  _gpsEphemerisHeader_sat
 
 data GpsEphemeris = GpsEphemeris
   { _gpsEphemeris_wn          :: Word16
@@ -182,7 +186,7 @@
 -- See RTCM spec and GPS SPS Signal Specification, 2.4.3,
 -- for more information about these fields.
 data Msg1019 = Msg1019
-  { _msg1019_header    :: EphemerisHeader
+  { _msg1019_header    :: GpsEphemerisHeader
     -- ^ GPS ephemeris header.
   , _msg1019_ephemeris :: GpsEphemeris
     -- ^ GPS ephemeris body.
@@ -202,3 +206,244 @@
     putBits 0 _msg1019_ephemeris
 
 $(deriveRTCM3 ''Msg1019)
+
+data GlonassEphemerisHeader = GlonassEphemerisHeader
+  { _glonassEphemerisHeader_num :: Word16
+    -- ^ RTCM message number
+  , _glonassEphemerisHeader_sat :: Word8
+    -- ^ GLONASS Satellite ID (slot number)
+  , _glonassEphemerisHeader_channel :: Word8
+    -- ^ Satellite frequency channel number
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''GlonassEphemerisHeader)
+$(deriveJSON
+   defaultOptions
+   { fieldLabelModifier =
+       fromMaybe "_glonassEphemerisHeader_" .
+       stripPrefix "_glonassEphemerisHeader_" }
+   ''GlonassEphemerisHeader)
+
+instance BinaryBit GlonassEphemerisHeader where
+  getBits _n = do
+    _glonassEphemerisHeader_num <- B.getWord16be  12
+    _glonassEphemerisHeader_sat <- B.getWord8     6
+    _glonassEphemerisHeader_channel <- B.getWord8 5
+    return GlonassEphemerisHeader {..}
+
+  putBits _n GlonassEphemerisHeader {..} = do
+    B.putWord16be 12 _glonassEphemerisHeader_num
+    B.putWord8    6  _glonassEphemerisHeader_sat
+    B.putWord8    5  _glonassEphemerisHeader_channel
+
+data GlonassEphemeris = GlonassEphemeris
+  { _glonassEphemeris_almanacHealth :: Bool
+  -- ^ @C_n@ word
+  , _glonassEphemeris_healthAvailability :: Bool
+  -- ^ Is GLONASS almanac health available?
+  , _glonassEphemeris_p1 :: Word8
+  -- ^ GLONASS P1 word
+  , _glonassEphemeris_tk :: Word16
+  -- ^ Time referenced to the beginning of GLONASS subframe within the
+  -- current day.  See DF107 on page 55 of the RTCM3.1 document for
+  -- more information.
+  , _glonassEphemeris_bn_msb :: Bool
+  -- ^ MSB of B_n word: the ephemeris health flag
+  , _glonassEphemeris_p2 :: Bool
+  -- ^ GLONASS P2 word
+  , _glonassEphemeris_tb :: Word8
+  -- ^ Time to which GLONASS navigation data are referenced.  Unit: 15 minutes
+  , _glonassEphemeris_xndot :: Int32
+  -- ^ GLONASS @x_n(t_b)@, first time-derivative, given in PZ-90 datum.
+  -- Unit: km/s Scale factor: 2^(-20)
+  , _glonassEphemeris_xn :: Int32
+  -- ^ GLONASS @x_n(t_b)@, given in PZ-90 datum.
+  -- Unit: km Scale factor: 2^(-11)
+  , _glonassEphemeris_xndotdot :: Int8
+  -- ^ GLONASS @x_n(t_b)@, second time-derivative, given in PZ-90 datum.
+  -- Unit: km/s^2 Scale factor: 2^(-30)
+  , _glonassEphemeris_yndot :: Int32
+  -- ^ GLONASS @y_n(t_b)@, first time-derivative, given in PZ-90 datum.
+  -- Unit: km/s Scale factor: 2^(-20)
+  , _glonassEphemeris_yn :: Int32
+  -- ^ GLONASS @y_n(t_b)@, given in PZ-90 datum.
+  -- Unit: km Scale factor: 2^(-11)
+  , _glonassEphemeris_yndotdot :: Int8
+  -- ^ GLONASS @y_n(t_b)@, second time-derivative, given in PZ-90 datum.
+  -- Unit: km/s^2 Scale factor: 2^(-30)
+  , _glonassEphemeris_zndot :: Int32
+  -- ^ GLONASS @z_n(t_b)@, first time-derivative, given in PZ-90 datum.
+  -- Unit: km/s Scale factor: 2^(-20)
+  , _glonassEphemeris_zn :: Int32
+  -- ^ GLONASS @z_n(t_b)@, given in PZ-90 datum.
+  -- Unit: km Scale factor: 2^(-11)
+  , _glonassEphemeris_zndotdot :: Int8
+  -- ^ GLONASS @z_n(t_b)@, second time-derivative, given in PZ-90 datum.
+  -- Unit: km/s^2 Scale factor: 2^(-30)
+  , _glonassEphemeris_p3 :: Bool
+  -- ^ GLONASS P3 word
+  , _glonassEphemeris_gammaN :: Int16
+  -- ^ Relative deviation of predicted carrier from nominal value.
+  -- Scale factor: 2^(-40)
+  , _glonassEphemeris_mp :: Word8
+  -- ^ GLONASS-M P-word
+  , _glonassEphemeris_mi3 :: Bool
+  -- ^ GLONASS-M I_n word extracted from third string of the subframe
+  -- [this is the extent of the explanation given in the RTCM
+  -- document]
+  , _glonassEphemeris_tauN :: Int32
+  -- ^ GLONASS @tau_n(t_b)@, correction to the satellite time relative
+  -- to GLONASS system time.
+  -- Units: seconds  Scale factor: 2^(-30)
+  , _glonassEphemeris_mdeltatau :: Int8
+  -- ^ GLONASS time difference between navigation RF signal
+  -- transmitted in L2 sub-band and navigation RF signal transmitted
+  -- in L1 sub-band
+  -- Units: seconds  Scale factor: 2^(-30)
+  , _glonassEphemeris_en :: Word8
+  -- ^ GLONASS E_n, age of GLONASS navigation data
+  -- Units: days  Scale factor: 1
+  , _glonassEphemeris_mp4 :: Bool
+  -- ^ GLONASS-M P4 word
+  , _glonassEphemeris_mft :: Word8
+  -- ^ GLONASS-M predicted satellite user range accuracy at time @t_b@
+  , _glonassEphemeris_mnt :: Word16
+  -- ^ GLONASS_M calendar number of day within four-year interval
+  -- starting from the first of January in a leap year
+  -- Units: days  Scale factor: 1
+  , _glonassEphemeris_mM :: Word8
+  -- ^ Type of GLONASS satellite:
+    --     [@01@] -> GLONASS-M
+    --     [@00@] -> non-GLONASS-M
+  , _glonassEphemeris_additional :: Bool
+  -- ^ Are the remaining fields ("additional data") valid?
+  , _glonassEphemeris_nA :: Word16
+  -- ^ GLONASS calendar number of day within the four-year period to
+  -- which @tau_c@ is referenced.
+  -- Units: days  Scale factor: 1
+  , _glonassEphemeris_tauC :: Int32
+  -- ^ GLONASS @tau_c@: difference between GLONASS system time and
+  -- UTC(SU), referenced to '_glonassEphemeris_nA'.
+  -- Units: seconds  Scale factor: 2^(-31)
+  , _glonassEphemeris_mn4 :: Word8
+  -- ^ GLONASS-M @N_4@: four-year interval number starting from 1996
+  -- Units: 4 years
+  , _glonassEphemeris_mTauGps :: Int32
+  -- ^ GLONASS-M @tau_gps@: correction to GPS system time relative to
+  -- GLONASS system time.
+  -- Units: seconds  Scale factor: 2^(-30)
+  , _glonassEphemeris_mln5 :: Bool
+  -- ^ GLONASS-M @I_n@ word extracted from fifth string of the
+  -- subframe [this is the extent of the explanation given in the RTCM
+  -- document]
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''GlonassEphemeris)
+$(deriveJSON defaultOptions
+  { fieldLabelModifier = fromMaybe "_glonassEphemeris_" .
+                         stripPrefix "_glonassEphemeris_"
+  } ''GlonassEphemeris)
+
+instance BinaryBit GlonassEphemeris where
+  getBits _n = do
+    _glonassEphemeris_almanacHealth      <- B.getBool
+    _glonassEphemeris_healthAvailability <- B.getBool
+    _glonassEphemeris_p1                 <- B.getWord8 2
+    _glonassEphemeris_tk                 <- B.getWord16be 12
+    _glonassEphemeris_bn_msb             <- B.getBool
+    _glonassEphemeris_p2                 <- B.getBool
+    _glonassEphemeris_tb                 <- B.getWord8 7
+    _glonassEphemeris_xndot              <- getInt32be 24
+    _glonassEphemeris_xn                 <- getInt32be 27
+    _glonassEphemeris_xndotdot           <- getInt8 5
+    _glonassEphemeris_yndot              <- getInt32be 24
+    _glonassEphemeris_yn                 <- getInt32be 27
+    _glonassEphemeris_yndotdot           <- getInt8 5
+    _glonassEphemeris_zndot              <- getInt32be 24
+    _glonassEphemeris_zn                 <- getInt32be 27
+    _glonassEphemeris_zndotdot           <- getInt8 5
+    _glonassEphemeris_p3                 <- B.getBool
+    _glonassEphemeris_gammaN             <- getInt16be 11
+    _glonassEphemeris_mp                 <- B.getWord8 2
+    _glonassEphemeris_mi3                <- B.getBool
+    _glonassEphemeris_tauN               <- getInt32be 22
+    _glonassEphemeris_mdeltatau          <- getInt8 5
+    _glonassEphemeris_en                 <- B.getWord8 5
+    _glonassEphemeris_mp4                <- B.getBool
+    _glonassEphemeris_mft                <- B.getWord8 4
+    _glonassEphemeris_mnt                <- B.getWord16be 11
+    _glonassEphemeris_mM                 <- B.getWord8 2
+    _glonassEphemeris_additional         <- B.getBool
+    _glonassEphemeris_nA                 <- B.getWord16be 11
+    _glonassEphemeris_tauC               <- getInt32be 32
+    _glonassEphemeris_mn4                <- B.getWord8 5
+    _glonassEphemeris_mTauGps            <- getInt32be 22
+    _glonassEphemeris_mln5               <- B.getBool
+    return GlonassEphemeris{..}
+  putBits _n GlonassEphemeris{..} = do
+    B.putBool         _glonassEphemeris_almanacHealth
+    B.putBool         _glonassEphemeris_healthAvailability
+    B.putWord8    2   _glonassEphemeris_p1
+    B.putWord16be 12  _glonassEphemeris_tk
+    B.putBool         _glonassEphemeris_bn_msb
+    B.putBool        _glonassEphemeris_p2
+    B.putWord8    7  _glonassEphemeris_tb
+    putInt32be    24 _glonassEphemeris_xndot
+    putInt32be    27 _glonassEphemeris_xn
+    putInt8       5  _glonassEphemeris_xndotdot
+    putInt32be    24 _glonassEphemeris_yndot
+    putInt32be    27 _glonassEphemeris_yn
+    putInt8       5  _glonassEphemeris_yndotdot
+    putInt32be    24 _glonassEphemeris_zndot
+    putInt32be    27 _glonassEphemeris_zn
+    putInt8       5  _glonassEphemeris_zndotdot
+    B.putBool        _glonassEphemeris_p3
+    putInt16be    11 _glonassEphemeris_gammaN
+    B.putWord8    2  _glonassEphemeris_mp
+    B.putBool        _glonassEphemeris_mi3
+    putInt32be    22 _glonassEphemeris_tauN
+    putInt8       5  _glonassEphemeris_mdeltatau
+    B.putWord8    5  _glonassEphemeris_en
+    B.putBool        _glonassEphemeris_mp4
+    B.putWord8    4  _glonassEphemeris_mft
+    B.putWord16be 11 _glonassEphemeris_mnt
+    B.putWord8    2  _glonassEphemeris_mM
+    B.putBool        _glonassEphemeris_additional
+    B.putWord16be 11 _glonassEphemeris_nA
+    putInt32be    32 _glonassEphemeris_tauC
+    B.putWord8    5  _glonassEphemeris_mn4
+    putInt32be    22 _glonassEphemeris_mTauGps
+    B.putBool        _glonassEphemeris_mln5
+
+msg1020 :: Word16
+msg1020 = 1020
+
+-- | Message 1020
+--
+-- RTCMv3 message 1020.
+--
+-- See RTCM spec and GLONASS signal specification for more information
+-- about these fields.
+data Msg1020 = Msg1020
+  { _msg1020_header :: GlonassEphemerisHeader
+    -- ^ GLONASS ephemeris header.
+  , _msg1020_ephemeris :: GlonassEphemeris
+    -- ^ GLONASS ephemeris body.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1020)
+$(deriveJSON defaultOptions
+  { fieldLabelModifier = fromMaybe "_msg1020_" . stripPrefix "_msg1020_"
+  } ''Msg1020)
+
+instance Binary Msg1020 where
+  get = B.runBitGet $ do
+    _msg1020_header    <- getBits 0
+    _msg1020_ephemeris <- getBits 0
+    return Msg1020 {..}
+
+  put Msg1020 {..} = B.runBitPut $ do
+    putBits 0 _msg1020_header
+    putBits 0 _msg1020_ephemeris
+
+$(deriveRTCM3 ''Msg1020)
diff --git a/src/Data/RTCM3/Extras.hs b/src/Data/RTCM3/Extras.hs
--- a/src/Data/RTCM3/Extras.hs
+++ b/src/Data/RTCM3/Extras.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.Extras
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3/Observations.hs b/src/Data/RTCM3/Observations.hs
--- a/src/Data/RTCM3/Observations.hs
+++ b/src/Data/RTCM3/Observations.hs
@@ -1,3 +1,8 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.Observations
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3/SSR.hs b/src/Data/RTCM3/SSR.hs
--- a/src/Data/RTCM3/SSR.hs
+++ b/src/Data/RTCM3/SSR.hs
@@ -1,3 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.SSR
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3/System.hs b/src/Data/RTCM3/System.hs
--- a/src/Data/RTCM3/System.hs
+++ b/src/Data/RTCM3/System.hs
@@ -1,3 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.System
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3/TH.hs b/src/Data/RTCM3/TH.hs
--- a/src/Data/RTCM3/TH.hs
+++ b/src/Data/RTCM3/TH.hs
@@ -1,3 +1,6 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.TH
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
diff --git a/src/Data/RTCM3/Types.hs b/src/Data/RTCM3/Types.hs
--- a/src/Data/RTCM3/Types.hs
+++ b/src/Data/RTCM3/Types.hs
@@ -1,3 +1,8 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Data.RTCM3.Types
 -- Copyright:   Copyright (C) 2015 Swift Navigation, Inc.
@@ -72,4 +77,3 @@
 
 class Binary a => ToRTCM3 a where
   toRTCM3 :: a -> Msg
-
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -1,3 +1,6 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Test
 -- Copyright:   (c) 2015 Swift Navigation
diff --git a/test/Test/Data/CRC24Q.hs b/test/Test/Data/CRC24Q.hs
--- a/test/Test/Data/CRC24Q.hs
+++ b/test/Test/Data/CRC24Q.hs
@@ -1,3 +1,6 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Test.Data.CRC24Q
 -- Copyright:   (c) 2015 Swift Navigation
diff --git a/test/Test/Data/RTCM3/Antennas.hs b/test/Test/Data/RTCM3/Antennas.hs
--- a/test/Test/Data/RTCM3/Antennas.hs
+++ b/test/Test/Data/RTCM3/Antennas.hs
@@ -1,3 +1,6 @@
+{-# OPTIONS_GHC -Wall #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 {-# OPTIONS -fno-warn-orphans #-}
 
 -- |
diff --git a/test/Test/Data/RTCM3/Ephemeris.hs b/test/Test/Data/RTCM3/Ephemeris.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Data/RTCM3/Ephemeris.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# OPTIONS -fno-warn-orphans #-}
+
+-- |
+-- Module:      Test.Data.RTCM3.Ephemeris
+-- Copyright:   (c) 2017 Swift Navigation
+-- License:     BSD3
+-- Maintainer:  Swift Navigation <dev@swiftnav.com>
+--
+-- Test Ephemeris module for RTCM3.
+
+module Test.Data.RTCM3.Ephemeris
+  ( tests
+  ) where
+
+import BasicPrelude
+import Data.Binary
+import Data.RTCM3
+import Test.Data.RTCM3.Test
+import Test.Tasty
+import Test.Tasty.QuickCheck
+
+instance Arbitrary GpsEphemerisHeader where
+  arbitrary = do
+    _gpsEphemerisHeader_num <- arbitraryWord 12
+    _gpsEphemerisHeader_sat <- arbitraryWord 6
+    return GpsEphemerisHeader {..}
+
+instance Arbitrary GpsEphemeris where
+  arbitrary = do
+    _gpsEphemeris_wn          <- arbitraryWord 10
+    _gpsEphemeris_svAccuracy  <- arbitraryWord 4
+    _gpsEphemeris_codeOnL2    <- arbitraryWord 2
+    _gpsEphemeris_idot        <- arbitraryInt  14
+    _gpsEphemeris_iode        <- arbitraryWord 8
+    _gpsEphemeris_toc         <- arbitraryWord 16
+    _gpsEphemeris_af2         <- arbitraryInt  8
+    _gpsEphemeris_af1         <- arbitraryInt  16
+    _gpsEphemeris_af0         <- arbitraryInt  22
+    _gpsEphemeris_iodc        <- arbitraryWord 10
+    _gpsEphemeris_c_rs        <- arbitraryInt  16
+    _gpsEphemeris_dn          <- arbitraryInt  16
+    _gpsEphemeris_m0          <- arbitraryInt  32
+    _gpsEphemeris_c_uc        <- arbitraryInt  16
+    _gpsEphemeris_ecc         <- arbitraryWord 32
+    _gpsEphemeris_c_us        <- arbitraryInt  16
+    _gpsEphemeris_sqrta       <- arbitraryWord 32
+    _gpsEphemeris_toe         <- arbitraryWord 16
+    _gpsEphemeris_c_ic        <- arbitraryInt  16
+    _gpsEphemeris_omega0      <- arbitraryInt  32
+    _gpsEphemeris_c_is        <- arbitraryInt  16
+    _gpsEphemeris_i0          <- arbitraryInt  32
+    _gpsEphemeris_c_rc        <- arbitraryInt  16
+    _gpsEphemeris_w           <- arbitraryInt  32
+    _gpsEphemeris_omegadot    <- arbitraryInt  24
+    _gpsEphemeris_tgd         <- arbitraryInt  8
+    _gpsEphemeris_svHealth    <- arbitraryWord 6
+    _gpsEphemeris_l2pFlag     <- arbitrary
+    _gpsEphemeris_fitInterval <- arbitrary
+    return GpsEphemeris {..}
+
+instance Arbitrary Msg1019 where
+  arbitrary = do
+    _msg1019_header    <- arbitrary
+    _msg1019_ephemeris <- arbitrary
+    return Msg1019 {..}
+
+testMsg1019 :: TestTree
+testMsg1019 =
+  testProperty "Roundtrip Msg1019" $ \m ->
+    (decode $ encode m) == (m :: Msg1019)
+
+instance Arbitrary GlonassEphemerisHeader where
+  arbitrary = do
+    _glonassEphemerisHeader_num <- arbitraryWord 12
+    _glonassEphemerisHeader_sat <- arbitraryWord 6
+    _glonassEphemerisHeader_channel <- arbitraryWord 5
+    return GlonassEphemerisHeader{..}
+
+instance Arbitrary GlonassEphemeris where
+  arbitrary = do
+    _glonassEphemeris_almanacHealth      <- arbitrary
+    _glonassEphemeris_healthAvailability <- arbitrary
+    _glonassEphemeris_p1                 <- arbitraryWord 2
+    _glonassEphemeris_tk                 <- arbitraryWord 12
+    _glonassEphemeris_bn_msb             <- arbitrary
+    _glonassEphemeris_p2                 <- arbitrary
+    _glonassEphemeris_tb                 <- arbitraryWord 7
+    _glonassEphemeris_xndot              <- arbitraryInt 24
+    _glonassEphemeris_xn                 <- arbitraryInt 27
+    _glonassEphemeris_xndotdot           <- arbitraryInt 5
+    _glonassEphemeris_yndot              <- arbitraryInt 24
+    _glonassEphemeris_yn                 <- arbitraryInt 27
+    _glonassEphemeris_yndotdot           <- arbitraryInt 5
+    _glonassEphemeris_zndot              <- arbitraryInt 24
+    _glonassEphemeris_zn                 <- arbitraryInt 27
+    _glonassEphemeris_zndotdot           <- arbitraryInt 5
+    _glonassEphemeris_p3                 <- arbitrary
+    _glonassEphemeris_gammaN             <- arbitraryInt 11
+    _glonassEphemeris_mp                 <- arbitraryWord 2
+    _glonassEphemeris_mi3                <- arbitrary
+    _glonassEphemeris_tauN               <- arbitraryInt 22
+    _glonassEphemeris_mdeltatau          <- arbitraryInt 5
+    _glonassEphemeris_en                 <- arbitraryWord 5
+    _glonassEphemeris_mp4                <- arbitrary
+    _glonassEphemeris_mft                <- arbitraryWord 4
+    _glonassEphemeris_mnt                <- arbitraryWord 11
+    _glonassEphemeris_mM                 <- arbitraryWord 2
+    _glonassEphemeris_additional         <- arbitrary
+    _glonassEphemeris_nA                 <- arbitraryWord 11
+    _glonassEphemeris_tauC               <- arbitraryInt 32
+    _glonassEphemeris_mn4                <- arbitraryWord 5
+    _glonassEphemeris_mTauGps            <- arbitraryInt 22
+    _glonassEphemeris_mln5               <- arbitrary
+    return GlonassEphemeris{..}
+
+instance Arbitrary Msg1020 where
+  arbitrary = do
+    _msg1020_header <- arbitrary
+    _msg1020_ephemeris <- arbitrary
+    return Msg1020 {..}
+
+testMsg1020 :: TestTree
+testMsg1020 =
+  testProperty "Roundtrip Msg1020" $ \m ->
+    (decode $ encode m) == (m :: Msg1020)
+
+tests :: TestTree
+tests =
+  testGroup "Ephemeris tests"
+    [ testMsg1019
+    , testMsg1020
+    ]
diff --git a/test/Test/Data/RTCM3/Extras.hs b/test/Test/Data/RTCM3/Extras.hs
--- a/test/Test/Data/RTCM3/Extras.hs
+++ b/test/Test/Data/RTCM3/Extras.hs
@@ -1,5 +1,6 @@
-{-# OPTIONS -fno-warn-orphans  #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE FlexibleInstances #-}
+{-# OPTIONS -fno-warn-orphans  #-}
 
 -- |
 -- Module:      Test.Data.RTCM3.Extras
diff --git a/test/Test/Data/RTCM3/Observations.hs b/test/Test/Data/RTCM3/Observations.hs
--- a/test/Test/Data/RTCM3/Observations.hs
+++ b/test/Test/Data/RTCM3/Observations.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# OPTIONS -fno-warn-orphans #-}
 
 -- |
diff --git a/test/Test/Data/RTCM3/SSR.hs b/test/Test/Data/RTCM3/SSR.hs
--- a/test/Test/Data/RTCM3/SSR.hs
+++ b/test/Test/Data/RTCM3/SSR.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# OPTIONS -fno-warn-orphans #-}
 
 -- |
diff --git a/test/Test/Data/RTCM3/System.hs b/test/Test/Data/RTCM3/System.hs
--- a/test/Test/Data/RTCM3/System.hs
+++ b/test/Test/Data/RTCM3/System.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# OPTIONS -fno-warn-orphans #-}
 
 -- |
diff --git a/test/Test/Data/RTCM3/Test.hs b/test/Test/Data/RTCM3/Test.hs
--- a/test/Test/Data/RTCM3/Test.hs
+++ b/test/Test/Data/RTCM3/Test.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
 -- |
 -- Module:      Test.Data.RTCM3.Test
 -- Copyright:   (c) 2015 Swift Navigation
