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.14
+version:               0.1.15
 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
@@ -196,6 +196,22 @@
 toWn :: Word16 -> Word16
 toWn mjd = (mjd - mjdEpoch) `div` 7
 
+-- | Determine whether an L1 RTCM observation is invalid.
+--
+-- See DF011 and DF012 of the RTCM3 spec
+invalid_L1 :: GpsL1Observation -> Bool
+invalid_L1 l1 =
+  l1 ^. gpsL1Observation_pseudorange == 0x80000      ||
+  l1 ^. gpsL1Observation_carrierMinusCode == 0x80000
+
+-- | 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
+
 -- | Construct metric pseudorange (meters!) from L1 RTCM observation.
 --
 -- See DF011, pg. 3-16 of the RTCM3 spec
@@ -404,7 +420,7 @@
 fromObservation1002 :: MonadStore e m => Word16 -> Observation1002 -> m [PackedObsContent]
 fromObservation1002 station obs =
   -- Only lower set of PRN numbers (1-32) are supported
-  if sat > maxSats then return mempty else do
+  if sat > maxSats || invalid_L1 l1 then return mempty else do
     obs1 <- fromL1SatelliteObservation station sat l1 l1e
     return [obs1]
     where
@@ -430,16 +446,17 @@
 fromObservation1004 :: MonadStore e m => Word16 -> Observation1004 -> m [PackedObsContent]
 fromObservation1004 station obs =
   -- Only lower set of PRN numbers (1-32) are supported
-  if sat > maxSats then return mempty else do
-    obs1 <- fromL1SatelliteObservation station sat l1 l1e
+  if sat > maxSats || invalid_L2 l2 then return mempty else do
     obs2 <- fromL2SatelliteObservation station sat l1 l1e l2 l2e
-    return $ maybe [obs1] (: [obs1]) obs2
-    where
-      sat = obs ^. observation1004_sat
-      l1  = obs ^. observation1004_l1
-      l1e = obs ^. observation1004_l1e
-      l2  = obs ^. observation1004_l2
-      l2e = obs ^. observation1004_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
 
 -- | Convert an RTCM L1+L2 1004 observation into multiple SBP MsgObs.
 --
