diff --git a/rtcm.cabal b/rtcm.cabal
--- a/rtcm.cabal
+++ b/rtcm.cabal
@@ -1,10 +1,9 @@
 name:                  rtcm
-version:               0.2.14
-synopsis:              RTCM Library.
-description:           Haskell bindings for RTCM.
+version:               0.2.15
+synopsis:              Haskell bindings for RTCM.
 homepage:              http://github.com/swift-nav/librtcm
 license:               BSD3
-author:                Mark Fine <mark@swift-nav.com>, Joshua Gross <josh@swift-nav.com>
+author:                Mark Fine <mark@swift-nav.com>
 maintainer:            Swift Navigation <dev@swift-nav.com>
 copyright:             Copyright (C) 2015-2017 Swift Navigation, Inc.
 category:              Network
@@ -99,6 +98,7 @@
                      , tasty
                      , tasty-hunit
                      , tasty-quickcheck
+                     , text
                      , word24
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N -Wall
   default-language:    Haskell2010
diff --git a/src/Data/RTCM3.hs b/src/Data/RTCM3.hs
--- a/src/Data/RTCM3.hs
+++ b/src/Data/RTCM3.hs
@@ -51,6 +51,7 @@
    | RTCM3Msg1013    Msg1013 Msg
    | RTCM3Msg1019    Msg1019 Msg
    | RTCM3Msg1020    Msg1020 Msg
+   | RTCM3Msg1029    Msg1029 Msg
    | RTCM3Msg1033    Msg1033 Msg
    | RTCM3Msg1057    Msg1057 Msg
    | RTCM3Msg1058    Msg1058 Msg
@@ -93,6 +94,7 @@
           | num == msg1013 = RTCM3Msg1013 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1019 = RTCM3Msg1019 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1020 = RTCM3Msg1020 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
+          | num == msg1029 = RTCM3Msg1029 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1033 = RTCM3Msg1033 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1057 = RTCM3Msg1057 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1058 = RTCM3Msg1058 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
@@ -127,6 +129,7 @@
       encoder (RTCM3Msg1013    _n m) = put m
       encoder (RTCM3Msg1019    _n m) = put m
       encoder (RTCM3Msg1020    _n m) = put m
+      encoder (RTCM3Msg1029    _n m) = put m
       encoder (RTCM3Msg1033    _n m) = put m
       encoder (RTCM3Msg1057    _n m) = put m
       encoder (RTCM3Msg1058    _n m) = put m
@@ -159,6 +162,7 @@
   msg f (RTCM3Msg1013    n m) = RTCM3Msg1013    n <$> f m
   msg f (RTCM3Msg1019    n m) = RTCM3Msg1019    n <$> f m
   msg f (RTCM3Msg1020    n m) = RTCM3Msg1020    n <$> f m
+  msg f (RTCM3Msg1029    n m) = RTCM3Msg1029    n <$> f m
   msg f (RTCM3Msg1033    n m) = RTCM3Msg1033    n <$> f m
   msg f (RTCM3Msg1057    n m) = RTCM3Msg1057    n <$> f m
   msg f (RTCM3Msg1058    n m) = RTCM3Msg1058    n <$> f m
@@ -197,6 +201,7 @@
   toJSON (RTCM3Msg1013    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1019    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1020    n m) = toJSON n <<>> toJSON m
+  toJSON (RTCM3Msg1029    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1033    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1057    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1058    n m) = toJSON n <<>> toJSON m
@@ -233,6 +238,7 @@
         | num == msg1013 = RTCM3Msg1013 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1019 = RTCM3Msg1019 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1020 = RTCM3Msg1020 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
+        | num == msg1029 = RTCM3Msg1029 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1033 = RTCM3Msg1033 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1057 = RTCM3Msg1057 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1058 = RTCM3Msg1058 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
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
@@ -93,6 +93,49 @@
     B.putBool        _message_synchronous
     B.putWord16be 16 _message_interval
 
+-- | TextMessage
+--
+-- Informational text message.
+data TextMessage = TextMessage
+  { _textMessage_num         :: Word16
+    -- ^ Message number.
+  , _textMessage_station     :: Word16
+    -- ^ Reference station id.
+  , _textMessage_mjd         :: Word16
+    -- ^ Modified Julian Day Number.
+  , _textMessage_seconds     :: Word32
+    -- ^ Seconds of Day.
+  , _textMessage_characters  :: Word8
+    -- ^ Number of characters.
+  , _textMessage_n           :: Word8
+    -- ^ Number of UTF-8 code units.
+  , _textMessage_text        :: Text
+    -- ^ UTF-8 code units.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''TextMessage)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_textMessage_" . stripPrefix "_textMessage_"} ''TextMessage)
+
+instance BinaryBit TextMessage where
+  getBits _n = do
+    _textMessage_num        <- B.getWord16be 12
+    _textMessage_station    <- B.getWord16be 12
+    _textMessage_mjd        <- B.getWord16be 16
+    _textMessage_seconds    <- B.getWord32be 17
+    _textMessage_characters <- B.getWord8 7
+    _textMessage_n          <- B.getWord8 8
+    _textMessage_text       <- decodeUtf8 <$> B.getByteString (fromIntegral _textMessage_n)
+    pure TextMessage {..}
+
+  putBits _n TextMessage {..} = do
+    B.putWord16be 12 _textMessage_num
+    B.putWord16be 12 _textMessage_station
+    B.putWord16be 16 _textMessage_mjd
+    B.putWord32be 17 _textMessage_seconds
+    B.putWord8 7     _textMessage_characters
+    B.putWord8 8     _textMessage_n
+    B.putByteString $ encodeUtf8 _textMessage_text
+
 msg1013 :: Word16
 msg1013 = 1013
 
@@ -111,7 +154,7 @@
 
 instance Binary Msg1013 where
   get = B.runBitGet $ do
-    _msg1013_header <- getBits 0
+    _msg1013_header   <- getBits 0
     _msg1013_messages <- replicateM (fromIntegral $ _msg1013_header ^. messageHeader_n) $ getBits 0
     pure Msg1013 {..}
 
@@ -120,3 +163,28 @@
     forM_ _msg1013_messages $ putBits 0
 
 $(deriveRTCM3 ''Msg1013)
+
+msg1029 :: Word16
+msg1029 = 1029
+
+-- | Msg1029.
+--
+-- RTCMv3 message 1029.
+newtype Msg1029 = Msg1029
+  { _msg1029_message :: TextMessage
+    -- ^ Text Messages.
+  } deriving ( Show, Read, Eq )
+
+$(makeLenses ''Msg1029)
+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1029_" . stripPrefix "_msg1029_"} ''Msg1029)
+
+instance Binary Msg1029 where
+  get = B.runBitGet $ do
+    _msg1029_message <- getBits 0
+    pure Msg1029 {..}
+
+  put Msg1029 {..} = B.runBitPut $
+    putBits 0 _msg1029_message
+
+$(deriveRTCM3 ''Msg1029)
+
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
@@ -18,6 +18,7 @@
 import Control.Lens
 import Data.Binary
 import Data.RTCM3
+import Data.Text
 import Test.Data.RTCM3.Test
 import Test.Tasty
 import Test.Tasty.QuickCheck
@@ -39,11 +40,27 @@
     _message_interval    <- arbitraryWord 16
     pure Message {..}
 
+instance Arbitrary TextMessage where
+  arbitrary = do
+    _textMessage_num        <- arbitraryWord 12
+    _textMessage_station    <- arbitraryWord 12
+    _textMessage_mjd        <- arbitraryWord 16
+    _textMessage_seconds    <- arbitraryWord 17
+    _textMessage_characters <- arbitraryWord 7
+    _textMessage_n          <- arbitraryWord 8
+    _textMessage_text       <- pack <$> replicateM (fromIntegral _textMessage_n) arbitrary
+    pure TextMessage {..}
+
 instance Arbitrary Msg1013 where
   arbitrary = do
     header   <- arbitrary
     messages <- replicateM (fromIntegral $ header ^. messageHeader_n) arbitrary
     pure $ Msg1013 header messages
+
+instance Arbitrary Msg1029 where
+  arbitrary = do
+    message <- arbitrary
+    pure $ Msg1029 message
 
 testMsg1013 :: TestTree
 testMsg1013 =
