diff --git a/gnss-converters.cabal b/gnss-converters.cabal
--- a/gnss-converters.cabal
+++ b/gnss-converters.cabal
@@ -1,5 +1,5 @@
 name:                  gnss-converters
-version:               0.1.16
+version:               0.1.17
 synopsis:              GNSS Converters.
 description:           Haskell bindings for GNSS converters.
 homepage:              http://github.com/swift-nav/gnss-converters
diff --git a/src/Data/RTCM3/SBP.hs b/src/Data/RTCM3/SBP.hs
--- a/src/Data/RTCM3/SBP.hs
+++ b/src/Data/RTCM3/SBP.hs
@@ -215,16 +215,16 @@
 -- See DF011 and DF012 of the RTCM3 spec
 invalid_L1 :: GpsL1Observation -> Bool
 invalid_L1 l1 =
-  l1 ^. gpsL1Observation_pseudorange == 0x80000      ||
-  l1 ^. gpsL1Observation_carrierMinusCode == 0x80000
+  l1 ^. gpsL1Observation_pseudorange == 524288 ||
+  l1 ^. gpsL1Observation_carrierMinusCode == -524288
 
 -- | Determine whether an L1 + L2 RTCM observation is invalid.
 --
 -- See DF011, DF012, and DF018 of the RTCM3 spec
 invalid_L2 :: GpsL2Observation -> Bool
 invalid_L2 l2 =
-  l2 ^. gpsL2Observation_pseudorangeDifference == 0x2000 ||
-  l2 ^. gpsL2Observation_carrierMinusCode == 0x80000
+  l2 ^. gpsL2Observation_pseudorangeDifference == -8192 ||
+  l2 ^. gpsL2Observation_carrierMinusCode == -524288
 
 -- | Construct metric pseudorange (meters!) from L1 RTCM observation.
 --
@@ -432,16 +432,19 @@
 -- | Construct an L1 SBP PackedObsContent from an RTCM Msg 1002.
 --
 fromObservation1002 :: MonadStore e m => Word16 -> Observation1002 -> m [PackedObsContent]
-fromObservation1002 station obs =
-  -- Only lower set of PRN numbers (1-32) are supported
-  if sat > maxSats || invalid_L1 l1 then return mempty else do
-    obs1 <- fromL1SatelliteObservation station sat l1 l1e
-    return [obs1]
-    where
-      sat = obs ^. observation1002_sat
-      l1  = obs ^. observation1002_l1
-      l1e = obs ^. observation1002_l1e
+fromObservation1002 station obs = do
+  obs1 <- fromL1SatelliteObservation station sat l1 l1e
+  return $
+    -- Only lower set of PRN numbers (1-32) are supported
+    if sat > maxSats then mempty else
+      if invalid_L1 l1 then mempty else
+        [obs1]
+  where
+    sat = obs ^. observation1002_sat
+    l1  = obs ^. observation1002_l1
+    l1e = obs ^. observation1002_l1e
 
+
 -- | Convert an RTCM L1 1002 observation into an SBP MsgObs.
 --
 -- This chunking takes places because the number of observations in a given 1002
@@ -458,19 +461,23 @@
 -- | Construct an L1/L2 SBP PackedObsContent from an RTCM Msg 1004.
 --
 fromObservation1004 :: MonadStore e m => Word16 -> Observation1004 -> m [PackedObsContent]
-fromObservation1004 station obs =
-  -- Only lower set of PRN numbers (1-32) are supported
-  if sat > maxSats || invalid_L2 l2 then return mempty else do
-    obs2 <- fromL2SatelliteObservation station sat l1 l1e l2 l2e
-    if invalid_L1 l1 then return $ maybeToList obs2 else do
-      obs1 <- fromL1SatelliteObservation station sat l1 l1e
-      return $ obs1 : maybeToList obs2
-      where
-        sat = obs ^. observation1004_sat
-        l1  = obs ^. observation1004_l1
-        l1e = obs ^. observation1004_l1e
-        l2  = obs ^. observation1004_l2
-        l2e = obs ^. observation1004_l2e
+fromObservation1004 station obs = do
+  obs1 <- fromL1SatelliteObservation station sat l1 l1e
+  obs2 <- fromL2SatelliteObservation station sat l1 l1e l2 l2e
+  return $
+    -- Only lower set of PRN numbers (1-32) are supported
+    if sat > maxSats then mempty else
+      if invalid_L1 l1 && invalid_L2 l2 then mempty else
+        if invalid_L1 l1 then maybeToList obs2 else
+          if invalid_L2 l2 then [obs1] else
+            obs1 : maybeToList obs2
+  where
+    sat = obs ^. observation1004_sat
+    l1  = obs ^. observation1004_l1
+    l1e = obs ^. observation1004_l1e
+    l2  = obs ^. observation1004_l2
+    l2e = obs ^. observation1004_l2e
+
 
 -- | Convert an RTCM L1+L2 1004 observation into multiple SBP MsgObs.
 --
