diff --git a/da/baseclasses/optimizer.py b/da/baseclasses/optimizer.py
index 8ffe7d7de93b82ddc869f056541a86205ce3067a..85e3d6c83e2b51be1e20ca7ed7bab3e1b9d5a955 100755
--- a/da/baseclasses/optimizer.py
+++ b/da/baseclasses/optimizer.py
@@ -45,9 +45,6 @@ class Optimizer(object):
         self.nmembers           = dims[1]
         self.nparams            = dims[2]
         self.nobs               = dims[3]
-        self.localization       = False
-        self.localization       = False
-
         self.CreateMatrices()
 
         return None
@@ -68,6 +65,11 @@ class Optimizer(object):
         self.obs             =  np.zeros( (self.nobs,), float)
         # covariance of observations
         self.R               =  np.zeros( (self.nobs,self.nobs,), float)
+        # localization of obs
+        self.may_localize       = np.zeros(self.nobs,int)
+        # rejection of obs
+        self.may_reject         = np.zeros(self.nobs,int)
+
         # Total covariance of fluxes and obs in units of obs [H P H^t + R]
         self.HPHR            =  np.zeros( (self.nobs,self.nobs,), float)
         # Kalman Gain matrix
@@ -91,6 +93,10 @@ class Optimizer(object):
 
             if members[0].ModelSample != None:
 
+                self.rejection_threshold                        = members[0].ModelSample.rejection_theshold
+                self.may_reject[:]                              = float(members[0].ModelSample.Data.getvalues('may_reject'))
+                self.may_localize[:]                            = float(members[0].ModelSample.Data.getvalues('may_localize'))
+
                 allobs.extend(                                    members[0].ModelSample.Data.getvalues('obs') )
                 allsamples.extend(                                members[0].ModelSample.Data.getvalues('simulated') )
                 allmdm.extend(                                    members[0].ModelSample.Data.getvalues('mdm')  )
@@ -286,21 +292,28 @@ class Optimizer(object):
         import numpy.linalg as la
 
         tvalue=1.97591
+
         for n in range(self.nobs):
 
-            if self.flags[n] == 1: continue
+            res                         = self.obs[n]-self.Hx[n]
+
+            # Screen for outliers greather than 3x model-data mismatch, only apply if obs may be rejected
+
+            if self.may_reject == 1:
+                if np.abs(res) > self.rejection_threshold*np.sqrt(self.R[n,n]):
+                    self.flags[n] == 1
+                    continue
 
             PHt                         = 1./(self.nmembers-1)*np.dot(self.X_prime,self.HX_prime[n,:])
             self.HPHR[n,n]              = 1./(self.nmembers-1)*(self.HX_prime[n,:]*self.HX_prime[n,:]).sum()+self.R[n,n]
 
             self.KG[:,n]                = PHt/self.HPHR[n,n]
 
-            dummy                       = self.Localize(n)
+            if self.may_localize[n] == 1:
+                dummy                   = self.Localize(n)
 
             alpha                       = np.double(1.0)/(np.double(1.0)+np.sqrt( (self.R[n,n])/self.HPHR[n,n] ) )
 
-            res                         = self.obs[n]-self.Hx[n]
-
             self.x[:]                   = self.x + self.KG[:,n]*res
 
             for r in range(self.nmembers):