diff --git a/demos/critical_filtering.py b/demos/critical_filtering.py
index ee45c52e10af499adee692bd9411c8a60b6e81c2..5674ec8346cb19ec936fe988eb57fb4303ab2a72 100644
--- a/demos/critical_filtering.py
+++ b/demos/critical_filtering.py
@@ -76,8 +76,8 @@ if __name__ == "__main__":
 
 
     # Choosing the measurement instrument
-    # Instrument = SmoothingOperator(s_space, sigma=0.01)
-    Instrument = DiagonalOperator(s_space, diagonal=1.)
+    Instrument = SmoothingOperator(s_space, sigma=0.01)
+    # Instrument = DiagonalOperator(s_space, diagonal=1.)
     # Instrument._diagonal.val[200:400, 200:400] = 0
     #Instrument._diagonal.val[64:512-64, 64:512-64] = 0
 
@@ -112,11 +112,11 @@ if __name__ == "__main__":
 
     minimizer1 = RelaxedNewton(convergence_tolerance=1e-2,
                               convergence_level=2,
-                              iteration_limit=3,
+                              iteration_limit=5,
                               callback=convergence_measure)
 
     minimizer2 = VL_BFGS(convergence_tolerance=1e-3,
-                       iteration_limit=70,
+                       iteration_limit=20,
                        callback=convergence_measure,
                        max_history_length=10)
     minimizer3 = SteepestDescent(convergence_tolerance=1e-3,
@@ -143,7 +143,7 @@ if __name__ == "__main__":
         # Initializing the power energy with updated parameters
         power_energy = CriticalPowerEnergy(position=t0, m=m0, D=D0, smoothness_prior=10., samples=3)
 
-        (power_energy, convergence) = minimizer2(power_energy)
+        (power_energy, convergence) = minimizer3(power_energy)
 
 
         # Setting new power spectrum
diff --git a/nifty/energies/line_energy.py b/nifty/energies/line_energy.py
index e79ee2b829a2d389bbff27df23a0d86ac8931925..3f9c0f75b11c793f72f6c407bf295d126c9c8a67 100644
--- a/nifty/energies/line_energy.py
+++ b/nifty/energies/line_energy.py
@@ -107,4 +107,7 @@ class LineEnergy:
 
     @property
     def dd(self):
-        return self.energy.gradient.vdot(self.linedir)
+        res = self.energy.gradient.vdot(self.linedir)
+        assert abs(res-res.real)<1e-12, \
+               "directional derivative has non-negligible imaginary part"
+        return res.real
diff --git a/nifty/minimization/line_searching/line_search_strong_wolfe.py b/nifty/minimization/line_searching/line_search_strong_wolfe.py
index b14cbce78dcf0dcb167bada801d121ee603427ca..83dab0edbbe262103a1fbed9fcfb1ea7f91737ee 100644
--- a/nifty/minimization/line_searching/line_search_strong_wolfe.py
+++ b/nifty/minimization/line_searching/line_search_strong_wolfe.py
@@ -61,12 +61,9 @@ class LineSearchStrongWolfe(LineSearch):
 
     """
 
-#    def __init__(self, c1=1e-4, c2=0.9,
-#                 max_step_size=1000000000, max_iterations=100,
-#                 max_zoom_iterations=100):
     def __init__(self, c1=1e-4, c2=0.9,
-                 max_step_size=50, max_iterations=10,
-                 max_zoom_iterations=10):
+                 max_step_size=1000000000, max_iterations=100,
+                 max_zoom_iterations=100):
 
         super(LineSearchStrongWolfe, self).__init__()
 
@@ -116,10 +113,6 @@ class LineSearchStrongWolfe(LineSearch):
         phiprime_0 = le_0.dd
         assert phiprime_0<0, "input direction must be a descent direction"
 
-        if phiprime_0 == 0:
-            self.logger.warn("Flat gradient in search direction.")
-            return 0., 0.
-
         # set alphas
         alpha0 = 0.
         if self.preferred_initial_step_size is not None:
@@ -137,12 +130,8 @@ class LineSearchStrongWolfe(LineSearch):
 
         # start the minimization loop
         for i in xrange(max_iterations):
-            #print "a0a1:",alpha0, alpha1
-            #print "line search outer iteration", i
             le_alpha1 = self.line_energy.at(alpha1)
-            #print "position:", le_alpha1.energy.position.val[0]
             phi_alpha1 = le_alpha1.value
-            #print "energy:", le_alpha1.value
             if alpha1 == 0:
                 self.logger.warn("Increment size became 0.")
                 alpha_star = 0.
@@ -151,7 +140,7 @@ class LineSearchStrongWolfe(LineSearch):
                 break
 
             if (phi_alpha1 > phi_0 + self.c1*alpha1*phiprime_0) or \
-               ((phi_alpha1 >= phi_alpha0) and (i > 1)):
+               ((phi_alpha1 >= phi_alpha0) and (i > 0)):
                 (alpha_star, phi_star, le_star) = self._zoom(
                                                     alpha0, alpha1,
                                                     phi_0, phiprime_0,
@@ -179,7 +168,7 @@ class LineSearchStrongWolfe(LineSearch):
             # update alphas
             alpha0, alpha1 = alpha1, min(2*alpha1, max_step_size)
             if alpha1 == max_step_size:
-                print "bailout"
+                print "reached max step size, bailing out"
                 alpha_star = alpha1
                 phi_star = phi_alpha1
                 le_star = le_alpha1
@@ -250,8 +239,8 @@ class LineSearchStrongWolfe(LineSearch):
         quad_delta = 0.1  # quadratic
 
         # initialize the most recent versions (j-1) of phi and alpha
-        alpha_recent = 0
-        phi_recent = phi_0
+        alpha_recent = None
+        phi_recent = None
 
         for i in xrange(max_iterations):
             delta_alpha = alpha_hi - alpha_lo