diff --git a/modules/icing/pirep_goes.py b/modules/icing/pirep_goes.py
index c6635d9a071abfe8ba2ac73eec2f3024aefaa104..e159744b154236c0268bbdcb3b3f4df6844666d5 100644
--- a/modules/icing/pirep_goes.py
+++ b/modules/icing/pirep_goes.py
@@ -277,6 +277,32 @@ def analyze(ice_dct, no_ice_dct):
         print(dt_str[2:])
 
 
-def apply_qc_icing_pireps(icing_dct):
-    new_dct = {}
-    pass
\ No newline at end of file
+def apply_qc_icing_pireps(icing_alt, cld_top_hgt, cld_phase, cld_opd, bt_11um, cld_mask):
+    opd_threshold = 6
+    closeness = 100.0  # meters
+    num_obs = len(icing_alt)
+    cld_mask = cld_mask.reshape((num_obs, -1))
+    cld_top_hgt = cld_top_hgt.reshape((num_obs, -1))
+    cld_phase = cld_phase.reshape((num_obs, -1))
+    cld_opd = cld_opd.reshape((num_obs, -1))
+    bt_11um = bt_11um.reshape((num_obs, -1))
+
+    keep_0 = np.logical_or(cld_mask == 2, cld_mask == 3)  # cloudy
+    keep_1 = np.invert(np.isnan(cld_top_hgt))
+    keep_2 = np.invert(np.isnan(bt_11um))
+    keep_3 = np.invert(np.isnan())
+    keep = keep_0 & keep_1 & keep_2 & keep_3
+
+    keep = np.where(keep, cld_top_hgt[:, ] > icing_alt[:], False)
+    keep = np.invert(
+        np.where(keep,
+        np.logical_and(cld_phase[:, ] == 3,
+            np.logical_and(cld_top_hgt[:, ]+closeness > icing_alt[:], cld_top_hgt[:, ]-closeness < icing_alt[:])),
+                 False))
+
+    keep = np.where(keep, (cld_opd[:, ] > opd_threshold) & (cld_phase[:, ] == 3) & (cld_top_hgt[:, ] > icing_alt[:]), False)
+    keep = np.where(keep, np.invert((cld_phase[:, ] == 3) & (cld_opd[:,] < 0.1) & (cld_top_hgt[:, ] > icing_alt[:]), False))
+    keep = np.where(keep, np.invert(bt_11um[:,] > 270.0), False)
+    keep = np.where(keep, np.invert(bt_11um[:,] < 228.0), False)
+
+    return keep
\ No newline at end of file