diff --git a/demos/demo_faraday.py b/demos/demo_faraday.py
index ee8037853b1cde41f042de6b77e1699e2f9f1edd..0a9679973a8977cdfc2169bf8d2df72ed6358c78 100644
--- a/demos/demo_faraday.py
+++ b/demos/demo_faraday.py
@@ -48,7 +48,7 @@ about.infos.off()
 ##-----------------------------------------------------------------------------
 
 # (global) Faraday map
-m = field(hp_space(128), val=np.load("demo_faraday_map.npy"))
+m = field(hp_space(128), val=np.load(os.path.join(get_demo_dir(),"demo_faraday_map.npy")))
 
 ##-----------------------------------------------------------------------------
 
diff --git a/demos/demos_core.py b/demos/demos_core.py
index 664e25a6eb93461d637c5942608d75f8376ca639..e4acb2f44e5e3b2b947233cf4d698f02db91bff8 100644
--- a/demos/demos_core.py
+++ b/demos/demos_core.py
@@ -1,7 +1,7 @@
 ## NIFTY (Numerical Information Field Theory) has been developed at the
 ## Max-Planck-Institute for Astrophysics.
 ##
-## Copyright (C) 2014 Max-Planck-Society
+## Copyright (C) 2015 Max-Planck-Society
 ##
 ## Author: Marco Selig
 ## Project homepage: <http://www.mpa-garching.mpg.de/ift/nifty/>
diff --git a/nifty_core.py b/nifty_core.py
index 044a186b4034ea53dd11f7e22fdfd39acbc63bca..bddfe50f3ad2d6a5923922a552e7ec9f45179149 100644
--- a/nifty_core.py
+++ b/nifty_core.py
@@ -163,7 +163,7 @@ import powerspectrum as gp
 
 pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
 
-__version__ = "0.9.6"
+__version__ = "0.9.7"
 
 
 ##-----------------------------------------------------------------------------
@@ -5954,7 +5954,7 @@ class nested_space(space):
                 for ii in xrange(len(self.nest)):
                     reorder += range(lim[ii][0],lim[ii][1])
                 ## permute
-                Tx = np.copy(x,order='C')
+                Tx = np.copy(x)
                 for ii in xrange(len(reorder)):
                     while(reorder[ii]!=ii):
                         Tx = np.swapaxes(Tx,ii,reorder[ii])
@@ -9176,7 +9176,7 @@ class diagonal_operator(operator):
 
     ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-    def get_random_field(self,domain=None,target=None,**kwargs):
+    def get_random_field(self,domain=None,target=None):
         """
             Generates a Gaussian random field with variance equal to the
             diagonal.
@@ -9196,8 +9196,6 @@ class diagonal_operator(operator):
                 Random field.
 
         """
-        if(len(kwargs)):  ## TODO: remove **kwargs in future version
-            about.warnings.cprint("WARNING: deprecated keyword(s).")
         ## weight if ...
         if(not self.domain.discrete):
             diag = self.domain.calc_weight(self.val,power=-1)
@@ -10404,36 +10402,47 @@ class response_operator(operator):
         self.sigma = sigma
 
         ## check assignment(s)
-        if(np.size(self.domain.dim(split=True))==1):
-            if(assign is None):
-                assign = np.arange(self.domain.dim(split=False),dtype=np.int)
-            elif(np.isscalar(assign)):
-                assign = np.array([assign],dtype=np.int)
+        if(assign is None):
+            ## 1:1 assignment
+            assignments = self.domain.dim(split=False)
+            self.assign = None
+        elif(np.size(self.domain.dim(split=True))==1):
+            if(np.isscalar(assign)):
+                ## X:1 assignment
+                assignments = 1
                 if(assign[0]>=self.domain.dim(split=False))or(assign[0]<-self.domain.dim(split=False)):
                     raise IndexError(about._errors.cstring("ERROR: invalid bounds."))
+                self.assign = [int(assign)]
             else:
                 assign = np.array(assign,dtype=np.int)
+                assignments = len(assign)
                 if(np.ndim(assign)!=1):
                     raise ValueError(about._errors.cstring("ERROR: invalid input."))
                 elif(np.any(assign>=self.domain.dim(split=False)))or(np.any(assign<-self.domain.dim(split=False))):
                     raise IndexError(about._errors.cstring("ERROR: invalid bounds."))
+                if(assignments==len(np.unique(assign,return_index=False,return_inverse=False))):
+                    self.assign = assign.tolist()
+                else:
+                    self.assign = assign
         else:
-            if(assign is None):
-                assign = np.array([ii for ii in np.ndindex(tuple(self.domain.dim(split=True)))],dtype=np.int)
-            elif(np.isscalar(assign)):
+            if(np.isscalar(assign)):
                 raise ValueError(about._errors.cstring("ERROR: invalid input."))
             else:
                 assign = np.array(assign,dtype=np.int)
+                assignments = np.size(assign,axis=0)
                 if(np.ndim(assign)!=2)or(np.size(assign,axis=1)!=np.size(self.domain.dim(split=True))):
                     raise ValueError(about._errors.cstring("ERROR: invalid input."))
                 for ii in xrange(np.size(assign,axis=1)):
                     if(np.any(assign[:,ii]>=self.domain.dim(split=True)[ii]))or(np.any(assign[:,ii]<-self.domain.dim(split=True)[ii])):
                         raise IndexError(about._errors.cstring("ERROR: invalid bounds."))
-        self.assign = assign ## transpose
+                if(assignments==len(np.unique(np.ravel_multi_index(assign.T,self.domain.dim(split=True),mode="raise",order='C'),return_index=False,return_inverse=False))):
+                    self.assign = assign.T.tolist()
+                else:
+                    self.assign = assign
 
         if(target is None):
             ## set target
-            target = point_space(np.size(self.assign,axis=0),datatype=self.domain.datatype)
+            target = point_space(assignments,datatype=self.domain.datatype)
         else:
             ## check target
             if(not isinstance(target,space)):
@@ -10442,8 +10451,8 @@ class response_operator(operator):
                 raise ValueError(about._errors.cstring("ERROR: continuous codomain.")) ## discrete(!)
             elif(np.size(target.dim(split=True))!=1):
                 raise ValueError(about._errors.cstring("ERROR: structured codomain.")) ## unstructured(!)
-            elif(np.size(self.assign,axis=0)!=target.dim(split=False)):
-                raise ValueError(about._errors.cstring("ERROR: dimension mismatch ( "+str(np.size(self.assign,axis=0))+" <> "+str(target.dim(split=False))+" )."))
+            elif(assignments!=target.dim(split=False)):
+                raise ValueError(about._errors.cstring("ERROR: dimension mismatch ( "+str(assignments)+" <> "+str(target.dim(split=False))+" )."))
         self.target = target
 
     ##+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -10492,15 +10501,24 @@ class response_operator(operator):
         x_ = self.domain.calc_smooth(x.val,sigma=self.sigma)
         ## mask
         x_ *= self.mask
-        ## assign
-        #return x_[self.assign.T.tolist()]
-        return field(self.target,val=x_[self.assign.T.tolist()],target=kwargs.get("target",None))
+        ## assign and return
+        if(self.assign is None):
+            return field(self.target,val=x_,target=kwargs.get("target",None))
+        elif(isinstance(self.assign,list)):
+            return field(self.target,val=x_[self.assign],target=kwargs.get("target",None))
+        else:
+            return field(self.target,val=x_[self.assign.T.tolist()],target=kwargs.get("target",None))
 
     def _adjoint_multiply(self,x,**kwargs): ## > applies the adjoint operator to a given field
         x_ = np.zeros(self.domain.dim(split=True),dtype=self.domain.datatype,order='C')
         ## assign (transposed)
-        for ii in xrange(np.size(self.assign,axis=0)):
-            x_[np.array([self.assign[ii]]).T.tolist()] += x[ii]
+        if(self.assign is None):
+            x_ = np.copy(x.val.flatten(order='C'))
+        elif(isinstance(self.assign,list)):
+            x_[self.assign] += x.val.flatten(order='C')
+        else:
+            for ii in xrange(np.size(self.assign,axis=0)):
+                x_[np.array([self.assign[ii]]).T.tolist()] += x[ii]
         ## mask
         x_ *= self.mask
         ## smooth
diff --git a/nifty_explicit.py b/nifty_explicit.py
index 09fe1dae57b137168d014f0d48a25e012cd0070f..36caae3b692aafacbea2f58fcdd72605bf5c96f1 100644
--- a/nifty_explicit.py
+++ b/nifty_explicit.py
@@ -38,20 +38,20 @@
 
 """
 from __future__ import division
-from nifty_core import *
-#from sys import stdout as so
-#import numpy as np
-#import pylab as pl
-#from matplotlib.colors import LogNorm as ln
-#from matplotlib.ticker import LogFormatter as lf
-#from multiprocessing import Pool as mp
-#from multiprocessing import Value as mv
-#from multiprocessing import Array as ma
-#from nifty_core import about,                                                \
-#                       space,                                                \
-#                       field,                                                \
-#                       operator,diagonal_operator,identity,vecvec_operator,  \
-#                       probing
+#from nifty_core import *
+from sys import stdout as so
+import numpy as np
+import pylab as pl
+from matplotlib.colors import LogNorm as ln
+from matplotlib.ticker import LogFormatter as lf
+from multiprocessing import Pool as mp
+from multiprocessing import Value as mv
+from multiprocessing import Array as ma
+from nifty_core import about,                                                \
+                       space,                                                \
+                       field,                                                \
+                       operator,diagonal_operator,identity,vecvec_operator,  \
+                       probing
 
 
 ##-----------------------------------------------------------------------------
diff --git a/nifty_power.py b/nifty_power.py
index 9c46ab0e364013afef61f9ff6066bc82cf01bafe..1c78439a7b1aa71b4d5e6f41dddd732812801dc3 100644
--- a/nifty_power.py
+++ b/nifty_power.py
@@ -42,12 +42,12 @@
 """
 from __future__ import division
 from scipy.interpolate import interp1d as ip ## FIXME: conflicts with sphinx's autodoc
-from nifty_core import *
-#import numpy as np
-#from nifty_core import about,                                                \
-#                       space,                                                \
-#                       field,                                                \
-#                       projection_operator
+#from nifty_core import *
+import numpy as np
+from nifty_core import about,                                                \
+                       space,                                                \
+                       field,                                                \
+                       projection_operator
 import smoothing as gs
 
 
diff --git a/nifty_tools.py b/nifty_tools.py
index 255fec648a57f601ddd5cf7d17bba961e0d31265..39edcea32cab540456cc148fac10bacbf308b9dc 100644
--- a/nifty_tools.py
+++ b/nifty_tools.py
@@ -37,12 +37,12 @@
 
 """
 from __future__ import division
-from nifty_core import *
-#import numpy as np
-#from nifty_core import notification,about,                                   \
-#                       space,                                                \
-#                       field,                                                \
-#                       operator,diagonal_operator
+#from nifty_core import *
+import numpy as np
+from nifty_core import notification,about,                                   \
+                       space,                                                \
+                       field,                                                \
+                       operator,diagonal_operator
 
 
 ##-----------------------------------------------------------------------------