diff --git a/demos/getting_started_3.py b/demos/getting_started_3.py
index b0e90e3a276b725fcb00136da2d72fe03a12da6a..7b2c33888f3dd9ceb3110ee4ac6a12e439439f63 100644
--- a/demos/getting_started_3.py
+++ b/demos/getting_started_3.py
@@ -76,6 +76,8 @@ if __name__ == '__main__':
     ic_sampling = ift.GradientNormController(iteration_limit=100)
     ic_newton = ift.GradientNormController(name='Newton', iteration_limit=100)
     minimizer = ift.RelaxedNewton(ic_newton)
+    minimizer = ift.NewtonCG(1e-5, 10, True)
+    minimizer = ift.L_BFGS_B(1e-10, 1e-5, 100, 10, True)
 
     # build model Hamiltonian
     H = ift.Hamiltonian(likelihood, ic_sampling)
diff --git a/nifty5/minimization/scipy_minimizer.py b/nifty5/minimization/scipy_minimizer.py
index 057355b0dfeabadf0625671eddb82d33be3590be..0727b9b3c45326a705c94a13b7f96016e3694146 100644
--- a/nifty5/minimization/scipy_minimizer.py
+++ b/nifty5/minimization/scipy_minimizer.py
@@ -18,24 +18,53 @@
 
 from __future__ import absolute_import, division, print_function
 
+import numpy as np
 from .. import dobj
 from ..compat import *
 from ..field import Field
+from ..multi_field import MultiField
+from ..domain_tuple import DomainTuple
 from ..logger import logger
 from .iteration_controller import IterationController
 from .minimizer import Minimizer
 
 
+def _multiToArray(fld):
+    szall = 0
+    for val in fld.values():
+        if val.dtype != np.float64:
+            raise TypeError("need float64 fields")
+        szall += val.size
+    res = np.empty(szall, dtype=np.float64)
+    ofs = 0
+    for val in fld.values():
+        res[ofs:ofs+val.size] = val.local_data.reshape(-1)
+        ofs += val.size
+    return res
+
+
 def _toArray(fld):
-    return fld.to_global_data().reshape(-1)
+    if isinstance(fld, Field):
+        return fld.local_data.reshape(-1)
+    return _multiToArray(fld)
 
 
 def _toArray_rw(fld):
-    return fld.to_global_data_rw().reshape(-1)
+    if isinstance(fld, Field):
+        return fld.local_data.copy().reshape(-1)
+    return _multiToArray(fld)
 
 
 def _toField(arr, dom):
-    return Field.from_global_data(dom, arr.reshape(dom.shape).copy())
+    if isinstance(dom, DomainTuple):
+        return Field.from_local_data(dom, arr.reshape(dom.shape).copy())
+    ofs = 0
+    res = []
+    for d in dom.domains():
+        res.append(Field.from_local_data(
+            d, arr[ofs:ofs+d.size].copy().reshape(d.shape)))
+        ofs += d.size
+    return MultiField(dom, tuple(res))
 
 
 class _MinHelper(object):
diff --git a/nifty5/operators/operator.py b/nifty5/operators/operator.py
index 04f91b1ececd7d0838266ba34c28f392ac8d293c..11f979ac5c9c955258ad9d3f8c2097c5c79040dc 100644
--- a/nifty5/operators/operator.py
+++ b/nifty5/operators/operator.py
@@ -132,18 +132,16 @@ class _OpProd(Operator):
         from ..linearization import Linearization
         from ..sugar import makeOp
         lin = isinstance(x, Linearization)
+        v = x._val if lin else x
+        v1 = v.extract(self._op1.domain)
+        v2 = v.extract(self._op2.domain)
         if not lin:
-            r1 = self._op1(x.extract(self._op1.domain))
-            r2 = self._op2(x.extract(self._op2.domain))
-            return r1*r2
-        lin1 = self._op1(
-            Linearization.make_var(x._val.extract(self._op1.domain)))
-        lin2 = self._op2(
-            Linearization.make_var(x._val.extract(self._op2.domain)))
+            return self._op1(v1) * self._op2(v2)
+        lin1 = self._op1(Linearization.make_var(v1))
+        lin2 = self._op2(Linearization.make_var(v2))
         op = (makeOp(lin1._val)(lin2._jac))._myadd(
             makeOp(lin2._val)(lin1._jac), False)
-        jac = op(x.jac)
-        return Linearization(lin1._val*lin2._val, jac)
+        return Linearization(lin1._val*lin2._val, op(x.jac))
 
 
 class _OpSum(_CombinedOperator):
diff --git a/test/test_minimization/test_minimizers.py b/test/test_minimization/test_minimizers.py
index 35be855cae96a36c8aa168787dd3016fd412a6f9..e2105132771d360568f3250d35529d7d766f0ffc 100644
--- a/test/test_minimization/test_minimizers.py
+++ b/test/test_minimization/test_minimizers.py
@@ -100,10 +100,7 @@ class Test_Minimizers(unittest.TestCase):
                     def __init__(self, loc):
                         self._loc = loc.to_global_data_rw()
                         self._capability = self.TIMES
-
-                    @property
-                    def domain(self):
-                        return space
+                        self._domain = space
 
                     def apply(self, x, mode):
                         self._check_input(x, mode)