diff --git a/nifty/__init__.py b/nifty/__init__.py
index 67cec38a5fc68862cb0275314495bb17d6e2288f..c73c9628857770e9fe7d3ba95e5aa24afd11b178 100644
--- a/nifty/__init__.py
+++ b/nifty/__init__.py
@@ -26,7 +26,9 @@ mpl.use('Agg')
 
 from .version import __version__
 
-from logger import logger
+# initialize the logger instance
+from keepers import MPILogger
+logger = MPILogger()
 
 import dummys
 
diff --git a/nifty/field.py b/nifty/field.py
index 0b21844ae8498256f986ceaa52e22021a58b4225..7089938769be878f328448c803f6662e821d3a11 100644
--- a/nifty/field.py
+++ b/nifty/field.py
@@ -14,11 +14,10 @@ from nifty.spaces.power_space import PowerSpace
 import nifty.nifty_utilities as utilities
 from nifty.random import Random
 
-import logging
-logger = logging.getLogger('NIFTy.Field')
+from keepers import Loggable
 
 
-class Field(object):
+class Field(object, Loggable):
     # ---Initialization methods---
 
     def __init__(self, domain=None, val=None, dtype=None, field_type=None,
@@ -116,7 +115,7 @@ class Field(object):
             elif isinstance(val, Field):
                 distribution_strategy = val.distribution_strategy
             else:
-                logger.info("Datamodel set to default!")
+                self.logger.info("Datamodel set to default!")
                 distribution_strategy = gc['default_distribution_strategy']
         elif distribution_strategy not in DISTRIBUTION_STRATEGIES['global']:
             raise ValueError(
@@ -387,7 +386,7 @@ class Field(object):
                 result_list[0].domain_axes[power_space_index])
 
         if pindex.distribution_strategy is not local_distribution_strategy:
-            logger.warn(
+            self.logger.warn(
                 "The distribution_stragey of pindex does not fit the "
                 "slice_local distribution strategy of the synthesized field.")
 
diff --git a/nifty/logger.py b/nifty/logger.py
deleted file mode 100644
index b379750b2693ba40558f77d411c153ac671adda2..0000000000000000000000000000000000000000
--- a/nifty/logger.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from keepers import MPILogger
-
-logger = MPILogger()
diff --git a/nifty/minimization/__init__.py b/nifty/minimization/__init__.py
index f1f47c8a7538d9207e562e8c5990698f74433e1d..079901fa9c1e49553970c2b8a222144be7359d99 100644
--- a/nifty/minimization/__init__.py
+++ b/nifty/minimization/__init__.py
@@ -1,3 +1,6 @@
 # -*- coding: utf-8 -*-
 
+from line_searching import *
 from conjugate_gradient import ConjugateGradient
+from quasi_newton_minimizer import QuasiNewtonMinimizer
+from steepest_descent import SteepestDescent
diff --git a/nifty/minimization/conjugate_gradient.py b/nifty/minimization/conjugate_gradient.py
index 59e89aa67b116b4c8bfe84f647854cf869e7c53d..f64e8d6f86d7d610ad5d9220b8071412b84a2a4a 100644
--- a/nifty/minimization/conjugate_gradient.py
+++ b/nifty/minimization/conjugate_gradient.py
@@ -4,9 +4,6 @@
 from __future__ import division
 import numpy as np
 
-import logging
-logger = logging.getLogger('NIFTy.CG')
-
 
 class ConjugateGradient(object):
     def __init__(self, convergence_tolerance=1E-4, convergence_level=3,
@@ -82,16 +79,16 @@ class ConjugateGradient(object):
         d = self.preconditioner(r)
         previous_gamma = r.dot(d)
         if previous_gamma == 0:
-            logger.info("The starting guess is already perfect solution for "
-                        "the inverse problem.")
+            self.logger.info("The starting guess is already perfect solution "
+                             "for the inverse problem.")
             return x0, self.convergence_level+1
         norm_b = np.sqrt(b.dot(b))
         x = x0
         convergence = 0
         iteration_number = 1
-        logger.info("Starting conjugate gradient.")
+        self.logger.info("Starting conjugate gradient.")
 
-        while(True):
+        while True:
             if self.callback is not None:
                 self.callback(x, iteration_number)
 
@@ -99,19 +96,19 @@ class ConjugateGradient(object):
             alpha = previous_gamma/d.dot(q)
 
             if not np.isfinite(alpha):
-                logger.error("Alpha became infinite! Stopping.")
+                self.logger.error("Alpha became infinite! Stopping.")
                 return x0, 0
 
             x += d * alpha
 
             reset = False
             if alpha.real < 0:
-                logger.warn("Positive definiteness of A violated!")
+                self.logger.warn("Positive definiteness of A violated!")
                 reset = True
             if self.reset_count is not None:
                 reset += (iteration_number % self.reset_count == 0)
             if reset:
-                logger.info("Resetting conjugate directions.")
+                self.logger.info("Resetting conjugate directions.")
                 r = b - A(x)
             else:
                 r -= q * alpha
@@ -120,35 +117,37 @@ class ConjugateGradient(object):
             gamma = r.dot(s)
 
             if gamma.real < 0:
-                logger.warn("Positive definitness of preconditioner violated!")
+                self.logger.warn("Positive definitness of preconditioner "
+                                 "violated!")
 
             beta = max(0, gamma/previous_gamma)
 
             delta = np.sqrt(gamma)/norm_b
 
-            logger.debug("Iteration : %08u   alpha = %3.1E   beta = %3.1E   "
-                         "delta = %3.1E" %
-                         (iteration_number,
-                          np.real(alpha),
-                          np.real(beta),
-                          np.real(delta)))
+            self.logger.debug("Iteration : %08u   alpha = %3.1E   "
+                              "beta = %3.1E   delta = %3.1E" %
+                              (iteration_number,
+                               np.real(alpha),
+                               np.real(beta),
+                               np.real(delta)))
 
             if gamma == 0:
                 convergence = self.convergence_level+1
-                logger.info("Reached infinite convergence.")
+                self.logger.info("Reached infinite convergence.")
                 break
             elif abs(delta) < self.convergence_tolerance:
                 convergence += 1
-                logger.info("Updated convergence level to: %u" % convergence)
+                self.logger.info("Updated convergence level to: %u" %
+                                 convergence)
                 if convergence == self.convergence_level:
-                    logger.info("Reached target convergence level.")
+                    self.logger.info("Reached target convergence level.")
                     break
             else:
                 convergence = max(0, convergence-1)
 
             if self.iteration_limit is not None:
                 if iteration_number == self.iteration_limit:
-                    logger.warn("Reached iteration limit. Stopping.")
+                    self.logger.warn("Reached iteration limit. Stopping.")
                     break
 
             d = s + d * beta
diff --git a/nifty/operators/diagonal_operator/diagonal_operator.py b/nifty/operators/diagonal_operator/diagonal_operator.py
index b282e9cb42365b688c9cd574317c3d8123a2e0ab..8260167fbf73f2eed95c3dda246c3eb1ddd310d7 100644
--- a/nifty/operators/diagonal_operator/diagonal_operator.py
+++ b/nifty/operators/diagonal_operator/diagonal_operator.py
@@ -9,9 +9,6 @@ from nifty.config import nifty_configuration as gc
 from nifty.field import Field
 from nifty.operators.endomorphic_operator import EndomorphicOperator
 
-import logging
-logger = logging.getLogger('NIFTy.DiagonalOperator')
-
 
 class DiagonalOperator(EndomorphicOperator):
 
@@ -119,7 +116,7 @@ class DiagonalOperator(EndomorphicOperator):
             elif isinstance(val, Field):
                 distribution_strategy = val.distribution_strategy
             else:
-                logger.info("Datamodel set to default!")
+                self.logger.info("Datamodel set to default!")
                 distribution_strategy = gc['default_distribution_strategy']
         elif distribution_strategy not in DISTRIBUTION_STRATEGIES['all']:
             raise ValueError(
diff --git a/nifty/operators/fft_operator/transformations/gllmtransformation.py b/nifty/operators/fft_operator/transformations/gllmtransformation.py
index f08794ca24f23a277b748f51713edd96c4ac777c..8e85db1a93254882d700b8a92f4da8d6af97a3ab 100644
--- a/nifty/operators/fft_operator/transformations/gllmtransformation.py
+++ b/nifty/operators/fft_operator/transformations/gllmtransformation.py
@@ -5,9 +5,6 @@ from nifty import GLSpace, LMSpace
 from slicing_transformation import SlicingTransformation
 import lm_transformation_factory as ltf
 
-import logging
-logger = logging.getLogger('NIFTy.GLLMTransformation')
-
 libsharp = gdi.get('libsharp_wrapper_gl')
 
 
@@ -121,8 +118,8 @@ class GLLMTransformation(SlicingTransformation):
         elif inp.dtype == np.dtype('float64'):
             return libsharp.map2alm(inp, **kwargs)
         else:
-            logger.debug("performing dtype conversion for libsharp "
-                         "compatibility.")
+            self.logger.debug("performing dtype conversion for libsharp "
+                              "compatibility.")
             casted_inp = inp.astype(np.dtype('float64'), copy=False)
             result = libsharp.map2alm(casted_inp, **kwargs)
             return result
diff --git a/nifty/operators/fft_operator/transformations/lmgltransformation.py b/nifty/operators/fft_operator/transformations/lmgltransformation.py
index 06950054c6974621268f6c34730dc5c847bae0a1..9d46819a49f39d0946cad37c92fa327988158db2 100644
--- a/nifty/operators/fft_operator/transformations/lmgltransformation.py
+++ b/nifty/operators/fft_operator/transformations/lmgltransformation.py
@@ -5,9 +5,6 @@ from nifty import GLSpace, LMSpace
 from slicing_transformation import SlicingTransformation
 import lm_transformation_factory as ltf
 
-import logging
-logger = logging.getLogger('NIFTy.LMGLTransformation')
-
 libsharp = gdi.get('libsharp_wrapper_gl')
 
 
@@ -128,8 +125,8 @@ class LMGLTransformation(SlicingTransformation):
         elif inp.dtype == np.dtype('complex128'):
             return libsharp.alm2map(inp, **kwargs)
         else:
-            logger.debug("performing dtype conversion for libsharp "
-                         "compatibility.")
+            self.logger.debug("Performing dtype conversion for libsharp "
+                              "compatibility.")
             casted_inp = inp.astype(np.dtype('complex128'), copy=False)
             result = libsharp.alm2map(casted_inp, **kwargs)
             return result
diff --git a/nifty/operators/fft_operator/transformations/rg_transforms.py b/nifty/operators/fft_operator/transformations/rg_transforms.py
index 85b1a5bb06d477c66a06861284c813c6fa3bbaf5..fbc464180c4c237bc3bde3c6a054b66c4b6f8489 100644
--- a/nifty/operators/fft_operator/transformations/rg_transforms.py
+++ b/nifty/operators/fft_operator/transformations/rg_transforms.py
@@ -5,13 +5,12 @@ from d2o import distributed_data_object, STRATEGIES
 from nifty.config import dependency_injector as gdi
 import nifty.nifty_utilities as utilities
 
-import logging
-logger = logging.getLogger('NIFTy.RGTransforms')
+from keepers import Loggable
 
 pyfftw = gdi.get('pyfftw')
 
 
-class Transform(object):
+class Transform(object, Loggable):
     """
         A generic fft object without any implementation.
     """
@@ -297,7 +296,7 @@ class FFTW(Transform):
 
     def _repack_to_fftw_and_transform(self, val, axes, **kwargs):
         temp_val = val.copy_empty(distribution_strategy='fftw')
-        logger.info("Repacking d2o to fftw distribution strategy")
+        self.logger.info("Repacking d2o to fftw distribution strategy")
         temp_val.set_full_data(val, copy=False)
 
         # Recursive call to transform
diff --git a/nifty/operators/fft_operator/transformations/rgrgtransformation.py b/nifty/operators/fft_operator/transformations/rgrgtransformation.py
index fe91bdb4131f8e2d95b46736628d91eba02146b0..c5afbafb7a4644003812a5b97b3684b248444bea 100644
--- a/nifty/operators/fft_operator/transformations/rgrgtransformation.py
+++ b/nifty/operators/fft_operator/transformations/rgrgtransformation.py
@@ -4,9 +4,6 @@ from rg_transforms import FFTW, GFFT
 from nifty.config import dependency_injector as gdi
 from nifty import RGSpace, nifty_configuration
 
-import logging
-logger = logging.getLogger('NIFTy.RGRGTransformation')
-
 
 class RGRGTransformation(Transformation):
     def __init__(self, domain, codomain=None, module=None):
@@ -84,8 +81,8 @@ class RGRGTransformation(Transformation):
         cls.check_codomain(domain, new_space)
         return new_space
 
-    @staticmethod
-    def check_codomain(domain, codomain):
+    @classmethod
+    def check_codomain(cls, domain, codomain):
         if not isinstance(domain, RGSpace):
             raise TypeError('ERROR: domain is not a RGSpace')
 
@@ -104,7 +101,7 @@ class RGRGTransformation(Transformation):
 
         if codomain.harmonic and not issubclass(codomain.dtype.type,
                                                 np.complexfloating):
-            logger.warn("codomain is harmonic but dtype is real.")
+            cls.logger.warn("Codomain is harmonic but dtype is real.")
 
         # Check if the distances match, i.e. dist' = 1 / (num * dist)
         if not np.all(
diff --git a/nifty/operators/fft_operator/transformations/transformation.py b/nifty/operators/fft_operator/transformations/transformation.py
index 0e5df8f463f9fc3ebac6c505609f487544002803..27ec215d5b0f7948cf0d8d130752b9ebafb45e2a 100644
--- a/nifty/operators/fft_operator/transformations/transformation.py
+++ b/nifty/operators/fft_operator/transformations/transformation.py
@@ -1,8 +1,10 @@
 
 import abc
 
+from keepers import Loggable
 
-class Transformation(object):
+
+class Transformation(object, Loggable):
     """
         A generic transformation which defines a static check_codomain
         method for all transforms.
diff --git a/nifty/operators/linear_operator/linear_operator.py b/nifty/operators/linear_operator/linear_operator.py
index 07a7eeddc8653d7f19e29aa634566c1a7f2e75e4..bae13793034aa4bf299586dd1bc54e1a6ca21ab9 100644
--- a/nifty/operators/linear_operator/linear_operator.py
+++ b/nifty/operators/linear_operator/linear_operator.py
@@ -2,13 +2,14 @@
 
 import abc
 
+from keepers import Loggable
 from nifty.field import Field
 from nifty.spaces import Space
 from nifty.field_types import FieldType
 import nifty.nifty_utilities as utilities
 
 
-class LinearOperator(object):
+class LinearOperator(object, Loggable):
     __metaclass__ = abc.ABCMeta
 
     def __init__(self):
diff --git a/nifty/operators/propagator_operator/propagator_operator.py b/nifty/operators/propagator_operator/propagator_operator.py
index 79a1a68dad2a1c709040effe90de4a8e6c043822..0c01c01a3caf2d39f582ab227c9d492d21aeac5f 100644
--- a/nifty/operators/propagator_operator/propagator_operator.py
+++ b/nifty/operators/propagator_operator/propagator_operator.py
@@ -6,9 +6,6 @@ from nifty.field import Field
 from nifty.operators import EndomorphicOperator,\
                             FFTOperator
 
-import logging
-logger = logging.getLogger('NIFTy.PropagatorOperator')
-
 
 class PropagatorOperator(EndomorphicOperator):
 
diff --git a/nifty/spaces/gl_space/gl_space.py b/nifty/spaces/gl_space/gl_space.py
index 3718170da7c8a7f6e12865a954156ae164d3e226..81cfeff6b47c2379b62cf6b74d8ab961a0485b40 100644
--- a/nifty/spaces/gl_space/gl_space.py
+++ b/nifty/spaces/gl_space/gl_space.py
@@ -10,9 +10,6 @@ from nifty.config import nifty_configuration as gc,\
                          dependency_injector as gdi
 import nifty.nifty_utilities as utilities
 
-import logging
-logger = logging.getLogger('NIFTy.GLSpace')
-
 gl = gdi.get('libsharp_wrapper_gl')
 
 GL_DISTRIBUTION_STRATEGIES = DISTRIBUTION_STRATEGIES['global']
@@ -207,6 +204,6 @@ class GLSpace(Space):
         else:
             nlon = int(nlon)
             if nlon != 2 * self.nlat - 1:
-                logger.warn("nlon was set to an unrecommended value: "
-                            "nlon <> 2*nlat-1.")
+                self.logger.warn("nlon was set to an unrecommended value: "
+                                 "nlon <> 2*nlat-1.")
         return nlon
diff --git a/nifty/spaces/lm_space/lm_space.py b/nifty/spaces/lm_space/lm_space.py
index 2e568cec98298ab8a7eadac106ddfe3f84dee111..0a34c939eccd6a895ca68c81cd85eb69385bd9d7 100644
--- a/nifty/spaces/lm_space/lm_space.py
+++ b/nifty/spaces/lm_space/lm_space.py
@@ -11,9 +11,6 @@ from lm_helper import _distance_array_helper
 
 from d2o import arange
 
-import logging
-logger = logging.getLogger('NIFTy.LMSpace')
-
 gl = gdi.get('libsharp_wrapper_gl')
 hp = gdi.get('healpy')
 
@@ -178,9 +175,8 @@ class LMSpace(Space):
     def _parse_lmax(self, lmax):
         lmax = np.int(lmax)
         if lmax < 1:
-            raise ValueError(
-                "negative lmax is not allowed.")
+            raise ValueError("Negative lmax is not allowed.")
         # exception lmax == 2 (nside == 1)
         if (lmax % 2 == 0) and (lmax > 2):
-            logger.warn("unrecommended parameter (lmax <> 2*n+1).")
+            self.logger.warn("Unrecommended parameter (lmax <> 2*n+1).")
         return lmax
diff --git a/nifty/spaces/space/space.py b/nifty/spaces/space/space.py
index b0c0b1a02c1711dc0afdded41a413bd243deb28d..802ae2f0c7ba997f670c8d95420edabd8bf528f5 100644
--- a/nifty/spaces/space/space.py
+++ b/nifty/spaces/space/space.py
@@ -146,8 +146,10 @@ import abc
 
 import numpy as np
 
+from keepers import Loggable
 
-class Space(object):
+
+class Space(object, Loggable):
     """
         ..                            __             __
         ..                          /__/           /  /_
diff --git a/setup.py b/setup.py
index 7c695aed48d96cae546b941ce0eb129a292ded20..cb20468e86ffaacbc906c8ebf5875a369d8b308c 100644
--- a/setup.py
+++ b/setup.py
@@ -44,9 +44,9 @@ setup(name="ift_nifty",
       ]),
       include_dirs=[numpy.get_include()],
       dependency_links=[
-        'git+https://gitlab.mpcdf.mpg.de/ift/keepers.git#egg=keepers-0.3.0',
+        'git+https://gitlab.mpcdf.mpg.de/ift/keepers.git#egg=keepers-0.3.2',
         'git+https://gitlab.mpcdf.mpg.de/ift/d2o.git#egg=d2o-1.0.4'],
-      install_requires=['keepers>=0.3.0', 'd2o>=1.0.4'],
+      install_requires=['keepers>=0.3.2', 'd2o>=1.0.4'],
       package_data={'nifty.demos': ['demo_faraday_map.npy'],
                     },
       license="GPLv3",