diff --git a/rtcm.cabal b/rtcm.cabal
--- a/rtcm.cabal
+++ b/rtcm.cabal
@@ -1,6 +1,6 @@
 cabal-version: >=1.22
 name: rtcm
-version: 0.2.17
+version: 0.2.36
 license: BSD3
 copyright: Copyright (C) 2015-2017 Swift Navigation, Inc.
 maintainer: Swift Navigation <dev@swift-nav.com>
diff --git a/src/Data/RTCM3.hs b/src/Data/RTCM3.hs
--- a/src/Data/RTCM3.hs
+++ b/src/Data/RTCM3.hs
@@ -89,7 +89,7 @@
    | RTCM3Msg1230    Msg1230 Msg
    | RTCM3Msg1265    Msg1265 Msg
    | RTCM3Msg1266    Msg1266 Msg
-   | RTCM3MsgUnknown Word16  Msg
+   | RTCM3MsgUnknown         Msg
    | RTCM3MsgBadCrc          Msg
    | RTCM3MsgEmpty           Msg
    deriving ( Show, Read, Eq )
@@ -156,7 +156,7 @@
           | num == msg1230 = RTCM3Msg1230 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1265 = RTCM3Msg1265 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
           | num == msg1266 = RTCM3Msg1266 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
-          | otherwise = RTCM3MsgUnknown num m where
+          | otherwise = RTCM3MsgUnknown m where
             crc = checkCrc _msgRTCM3Len $ unBytes _msgRTCM3Payload
             num = checkNum $ unBytes _msgRTCM3Payload
 
@@ -215,7 +215,7 @@
       encoder (RTCM3Msg1230    _n m) = put m
       encoder (RTCM3Msg1265    _n m) = put m
       encoder (RTCM3Msg1266    _n m) = put m
-      encoder (RTCM3MsgUnknown _n m) = put m
+      encoder (RTCM3MsgUnknown    m) = put m
       encoder (RTCM3MsgBadCrc     m) = put m
       encoder (RTCM3MsgEmpty      m) = put m
 
@@ -272,7 +272,7 @@
   msg f (RTCM3Msg1230    n m) = RTCM3Msg1230    n <$> f m
   msg f (RTCM3Msg1265    n m) = RTCM3Msg1265    n <$> f m
   msg f (RTCM3Msg1266    n m) = RTCM3Msg1266    n <$> f m
-  msg f (RTCM3MsgUnknown n m) = RTCM3MsgUnknown n <$> f m
+  msg f (RTCM3MsgUnknown   m) = RTCM3MsgUnknown   <$> f m
   msg f (RTCM3MsgBadCrc    m) = RTCM3MsgBadCrc    <$> f m
   msg f (RTCM3MsgEmpty     m) = RTCM3MsgEmpty     <$> f m
 
@@ -335,7 +335,7 @@
   toJSON (RTCM3Msg1230    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1265    n m) = toJSON n <<>> toJSON m
   toJSON (RTCM3Msg1266    n m) = toJSON n <<>> toJSON m
-  toJSON (RTCM3MsgUnknown n m) = object [ "num" .= n ] <<>> toJSON m
+  toJSON (RTCM3MsgUnknown   m) = toJSON m
   toJSON (RTCM3MsgBadCrc    m) = toJSON m
   toJSON (RTCM3MsgEmpty     m) = toJSON m
 
@@ -372,5 +372,5 @@
         | num == msg1074 = RTCM3Msg1074 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1230 = RTCM3Msg1230 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
         | num == msg1265 = RTCM3Msg1265 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
-        | otherwise = RTCM3MsgUnknown <$> pure num <*> parseJSON obj
+        | otherwise = RTCM3MsgUnknown <$> parseJSON obj
   parseJSON _ = mzero
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
@@ -26,6 +26,7 @@
 import qualified Data.Binary.Bits.Get     as B
 import           Data.Binary.Get
 import           Data.Binary.Put
+import           Data.Bits
 import           Data.ByteString.Base64   as Base64
 import           Data.ByteString.Builder
 import           Data.ByteString.Lazy     hiding (ByteString)
@@ -61,6 +62,7 @@
     [ "len"     .= _msgRTCM3Len
     , "payload" .= _msgRTCM3Payload
     , "crc"     .= _msgRTCM3Crc
+    , "num"     .= checkNum (unBytes _msgRTCM3Payload)
     ]
 
 instance FromJSON Bytes where
@@ -78,7 +80,7 @@
 
 instance Binary Msg where
   get = do
-    _msgRTCM3Len     <- getWord16be
+    _msgRTCM3Len     <- (.&. 1023) <$> getWord16be
     _msgRTCM3Payload <- fmap Bytes $ getByteString $ fromIntegral _msgRTCM3Len
     _msgRTCM3Crc     <- getWord24be
     pure Msg {..}
