diff --git a/demos/critical_filtering.py b/demos/critical_filtering.py
index 81cfbeb35c44d732741c819b647c75f1b349b580..508dc9f2abecde44329f25d86f42e4ffc90162e4 100644
--- a/demos/critical_filtering.py
+++ b/demos/critical_filtering.py
@@ -29,7 +29,7 @@ if __name__ == "__main__":
 
     # Choose the measurement instrument
     # Instrument = SmoothingOperator(s_space, sigma=0.01)
-    Instrument = ift.DiagonalOperator(ift.Field(s_space, 1.))
+    Instrument = ift.ScalingOperator(1., s_space)
     # Instrument._diagonal.val[200:400, 200:400] = 0
     # Instrument._diagonal.val[64:512-64, 64:512-64] = 0
 
@@ -74,7 +74,7 @@ if __name__ == "__main__":
     # Set starting position
     flat_power = ift.Field.full(p_space, 1e-8)
     m0 = ift.power_synthesize(flat_power, real_signal=True)
-    t0 = ift.Field(p_space, val=-7.)
+    t0 = ift.Field.full(p_space, -7.)
 
     for i in range(500):
         S0 = ift.create_power_operator(h_space, power_spectrum=ift.exp(t0))
diff --git a/demos/nonlinear_critical_filter.py b/demos/nonlinear_critical_filter.py
index b9c9f04a31582ea5e85f391d6f7f3bc8ceb31578..52064624b8df692e99459fb46fb12e98e2a01f7f 100644
--- a/demos/nonlinear_critical_filter.py
+++ b/demos/nonlinear_critical_filter.py
@@ -5,14 +5,14 @@ np.random.seed(42)
 
 
 def adjust_zero_mode(m0, t0):
-    mtmp = ift.dobj.to_global_data(m0.val)
+    mtmp = m0.to_global_data()
     zero_position = len(m0.shape)*(0,)
     zero_mode = mtmp[zero_position]
     mtmp[zero_position] = zero_mode / abs(zero_mode)
-    ttmp = ift.dobj.to_global_data(t0.val)
+    ttmp = t0.to_global_data()
     ttmp[0] += 2 * np.log(abs(zero_mode))
-    return (ift.Field(m0.domain, ift.dobj.from_global_data(mtmp)),
-            ift.Field(t0.domain, ift.dobj.from_global_data(ttmp)))
+    return (ift.Field.from_global_data(m0.domain, mtmp),
+            ift.Field.from_global_data(t0.domain, ttmp))
 
 if __name__ == "__main__":
 
@@ -48,7 +48,7 @@ if __name__ == "__main__":
     # Instrument = SmoothingOperator(s_space, sigma=0.01)
     mask = np.ones(s_space.shape)
     mask[6000:8000] = 0.
-    mask = ift.Field(s_space, val=ift.dobj.from_global_data(mask))
+    mask = ift.Field.from_global_data(s_space, mask)
 
     MaskOperator = ift.DiagonalOperator(mask)
     R = ift.GeometryRemover(s_space)
diff --git a/demos/paper_demos/cartesian_wiener_filter.py b/demos/paper_demos/cartesian_wiener_filter.py
index f555e3782c0a762852eae85c454b7f26738ec8c3..f3ea8ae15e0a0702c3f768224fed009b193c243a 100644
--- a/demos/paper_demos/cartesian_wiener_filter.py
+++ b/demos/paper_demos/cartesian_wiener_filter.py
@@ -46,11 +46,10 @@ if __name__ == "__main__":
 
     ht = ht_2*ht_1
 
-    mock_power = ift.Field(
+    mock_power = ift.Field.from_global_data(
         (power_space_1, power_space_2),
-        val=ift.dobj.from_global_data(
-            np.outer(ift.dobj.to_global_data(mock_power_1.val),
-                     ift.dobj.to_global_data(mock_power_2.val))))
+        np.outer(mock_power_1.to_global_data(),
+                 mock_power_2.to_global_data()))
 
     diagonal = ift.power_synthesize_nonrandom(mock_power, spaces=(0, 1))**2
 
@@ -63,12 +62,12 @@ if __name__ == "__main__":
     N1_10 = int(N_pixels_1/10)
     mask_1 = np.ones(signal_space_1.shape)
     mask_1[N1_10*7:N1_10*9] = 0.
-    mask_1 = ift.Field(signal_space_1, ift.dobj.from_global_data(mask_1))
+    mask_1 = ift.Field.from_global_data(signal_space_1, mask_1)
 
     N2_10 = int(N_pixels_2/10)
     mask_2 = np.ones(signal_space_2.shape)
     mask_2[N2_10*7:N2_10*9] = 0.
-    mask_2 = ift.Field(signal_space_2, ift.dobj.from_global_data(mask_2))
+    mask_2 = ift.Field.from_global_data(signal_space_2, mask_2)
 
     R = ift.GeometryRemover(signal_domain)
     R = R*ift.DiagonalOperator(mask_1, signal_domain, spaces=0)
diff --git a/demos/paper_demos/wiener_filter.py b/demos/paper_demos/wiener_filter.py
index f30f0f3dbf7b919907f0d7015738bbb014331cc8..f7d140145480f58cdb67c3619003325eb5905151 100644
--- a/demos/paper_demos/wiener_filter.py
+++ b/demos/paper_demos/wiener_filter.py
@@ -34,7 +34,7 @@ if __name__ == "__main__":
     mask = np.ones(signal_space.shape)
     N10 = int(N_pixels/10)
     mask[N10*5:N10*9, N10*5:N10*9] = 0.
-    mask = ift.Field(signal_space, ift.dobj.from_global_data(mask))
+    mask = ift.Field.from_global_data(signal_space, mask).lock()
     R = ift.GeometryRemover(signal_space)
     R = R*ift.DiagonalOperator(mask)
     R = R*ht
diff --git a/demos/wiener_filter_via_hamiltonian.py b/demos/wiener_filter_via_hamiltonian.py
index 1eedca8d4c9206d7af4d8dae7e152c3ef0b651e0..b812f2d21cf0192cbf69daee12cf775b3f0951bd 100644
--- a/demos/wiener_filter_via_hamiltonian.py
+++ b/demos/wiener_filter_via_hamiltonian.py
@@ -34,7 +34,7 @@ if __name__ == "__main__":
     else:
         raise NotImplementedError
 
-    diag = ift.Field(s_space, ift.dobj.from_global_data(diag))
+    diag = ift.Field.from_global_data(s_space, diag).lock()
     Instrument = ift.DiagonalOperator(diag)
 
     # Add harmonic transformation to the instrument
diff --git a/nifty4/domains/lm_space.py b/nifty4/domains/lm_space.py
index ab49b3650c5736ff6c2f0cc78172832a6bca3bc9..4d5f6ffa855767337b88c9fb86de57a440d1f322 100644
--- a/nifty4/domains/lm_space.py
+++ b/nifty4/domains/lm_space.py
@@ -91,7 +91,7 @@ class LMSpace(StructuredDomain):
         for m in range(1, mmax+1):
             ldist[idx:idx+2*(lmax+1-m)] = tmp[2*m:]
             idx += 2*(lmax+1-m)
-        return Field((self,), dobj.from_global_data(ldist))
+        return Field.from_global_data(self, ldist)
 
     def get_unique_k_lengths(self):
         return np.arange(self.lmax+1, dtype=np.float64)
diff --git a/nifty4/field.py b/nifty4/field.py
index 0403b04310786bfabd688f221b8f5127422eb3fb..636548d3f3980278a56da02e36e5aee0d72ef428 100644
--- a/nifty4/field.py
+++ b/nifty4/field.py
@@ -123,6 +123,13 @@ class Field(object):
             dtype = field.dtype
         return Field.empty(field._domain, dtype)
 
+    @staticmethod
+    def from_global_data(domain, dobject):
+        return Field(domain, dobj.from_global_data(dobject))
+
+    def to_global_data(self):
+        return dobj.to_global_data(self._val)
+
     @staticmethod
     def _infer_domain(domain, val=None):
         if domain is None:
@@ -174,6 +181,7 @@ class Field(object):
 
     def lock(self):
         dobj.lock(self._val)
+        return self
 
     @property
     def locked(self):
diff --git a/nifty4/operators/dof_distributor.py b/nifty4/operators/dof_distributor.py
index 2e2cc31b88302f6a4b5475e2c6aef9852eb2bfb5..82232dae30512a17da5fe86602ad41a98a7fa9e9 100644
--- a/nifty4/operators/dof_distributor.py
+++ b/nifty4/operators/dof_distributor.py
@@ -91,7 +91,7 @@ class DOFDistributor(LinearOperator):
         np.add.at(oarr, (slice(None), self._dofdex, slice(None)), arr)
         if dobj.distaxis(x.val) in x.domain.axes[self._space]:
             oarr = dobj.np_allreduce_sum(oarr).reshape(self._domain.shape)
-            res = Field(self._domain, dobj.from_global_data(oarr))
+            res = Field.from_global_data(self._domain, oarr)
         else:
             oarr = oarr.reshape(dobj.local_shape(self._domain.shape,
                                                  dobj.distaxis(x.val)))
@@ -103,7 +103,7 @@ class DOFDistributor(LinearOperator):
     def _times(self, x):
         res = Field.empty(self._target, dtype=x.dtype)
         if dobj.distaxis(x.val) in x.domain.axes[self._space]:
-            arr = dobj.to_global_data(x.val)
+            arr = x.to_global_data()
         else:
             arr = dobj.local_data(x.val)
         arr = arr.reshape(self._hshape)
diff --git a/test/test_field.py b/test/test_field.py
index f28c22596f420528101d82cd501a9c5f0b8ca2ad..5a97c8f6d6672dbe5d42a1351f6be0542dfa1e95 100644
--- a/test/test_field.py
+++ b/test/test_field.py
@@ -59,14 +59,14 @@ class Test_Functionality(unittest.TestCase):
 
         p1 = ift.PowerSpace(space1)
         p1val = _spec1(p1.k_lengths)
-        fp1 = ift.Field(p1, val=ift.dobj.from_global_data(p1val))
+        fp1 = ift.Field.from_global_data(p1, p1val)
 
         p2 = ift.PowerSpace(space2)
         p2val = _spec2(p2.k_lengths)
-        fp2 = ift.Field(p2, val=ift.dobj.from_global_data(p2val))
+        fp2 = ift.Field.from_global_data(p2, p2val)
 
-        outer = ift.dobj.from_global_data(np.outer(p1val, p2val))
-        fp = ift.Field((p1, p2), val=outer)
+        outer = np.outer(p1val, p2val)
+        fp = ift.Field.from_global_data((p1, p2), outer)
 
         samples = 500
         ps1 = 0.
@@ -79,10 +79,10 @@ class Test_Functionality(unittest.TestCase):
             ps1 += sp.sum(spaces=1)/fp2.sum()
             ps2 += sp.sum(spaces=0)/fp1.sum()
 
-        assert_allclose(ift.dobj.to_global_data(ps1.val/samples),
-                        ift.dobj.to_global_data(fp1.val), rtol=0.2)
-        assert_allclose(ift.dobj.to_global_data(ps2.val/samples),
-                        ift.dobj.to_global_data(fp2.val), rtol=0.2)
+        assert_allclose((ps1/samples).to_global_data(),
+                        fp1.to_global_data(), rtol=0.2)
+        assert_allclose((ps2/samples).to_global_data(),
+                        fp2.to_global_data(), rtol=0.2)
 
     @expand(product([ift.RGSpace((8,), harmonic=True),
                      ift.RGSpace((8, 8), harmonic=True, distances=0.123)],
@@ -95,11 +95,11 @@ class Test_Functionality(unittest.TestCase):
 
         p1 = ift.PowerSpace(space1)
         p1val = _spec1(p1.k_lengths)
-        fp1 = ift.Field(p1, val=ift.dobj.from_global_data(p1val))
+        fp1 = ift.Field.from_global_data(p1, p1val)
 
         p2 = ift.PowerSpace(space2)
         p2val = _spec2(p2.k_lengths)
-        fp2 = ift.Field(p2, val=ift.dobj.from_global_data(p2val))
+        fp2 = ift.Field.from_global_data(p2, p2val)
 
         S_1 = ift.create_power_field(space1, lambda x: np.sqrt(_spec1(x)))
         S_1 = ift.DiagonalOperator(S_1, domain=fulldomain, spaces=0)
@@ -118,10 +118,10 @@ class Test_Functionality(unittest.TestCase):
             ps1 += sp.sum(spaces=1)/fp2.sum()
             ps2 += sp.sum(spaces=0)/fp1.sum()
 
-        assert_allclose(ift.dobj.to_global_data(ps1.val/samples),
-                        ift.dobj.to_global_data(fp1.val), rtol=0.2)
-        assert_allclose(ift.dobj.to_global_data(ps2.val/samples),
-                        ift.dobj.to_global_data(fp2.val), rtol=0.2)
+        assert_allclose((ps1/samples).to_global_data(),
+                        fp1.to_global_data(), rtol=0.2)
+        assert_allclose((ps2/samples).to_global_data(),
+                        fp2.to_global_data(), rtol=0.2)
 
     def test_vdot(self):
         s = ift.RGSpace((10,))
@@ -135,4 +135,4 @@ class Test_Functionality(unittest.TestCase):
         x2 = ift.RGSpace((150,))
         m = ift.Field((x1, x2), val=.5)
         res = m.vdot(m, spaces=1)
-        assert_allclose(ift.dobj.to_global_data(res.val), 37.5)
+        assert_allclose(res.to_global_data(), 37.5)
diff --git a/test/test_operators/test_adjoint.py b/test/test_operators/test_adjoint.py
index 353abc1e06a8a5788666467ab35221c47dc98165..6c2f89bcb2b390cada5cb6f4df26fea88ccd0470 100644
--- a/test/test_operators/test_adjoint.py
+++ b/test/test_operators/test_adjoint.py
@@ -31,7 +31,8 @@ _p_RG_spaces = [ift.RGSpace(19, distances=0.7),
                 ift.RGSpace((1, 2, 3, 6), distances=(0.2, 0.25, 0.34, .8))]
 _p_spaces = _p_RG_spaces + [ift.HPSpace(17), ift.GLSpace(8, 13)]
 
-_pow_spaces = [ift.PowerSpace(ift.RGSpace((17,38), harmonic=True))]
+_pow_spaces = [ift.PowerSpace(ift.RGSpace((17, 38), harmonic=True))]
+
 
 class Consistency_Tests(unittest.TestCase):
     @expand(product(_h_spaces, [np.float64, np.complex128]))
diff --git a/test/test_operators/test_smoothing_operator.py b/test/test_operators/test_smoothing_operator.py
index b930714b23b15a305016310b71a7002178c334a2..956690a3a564a2fd942c7de9c754a5f015cbfc4e 100644
--- a/test/test_operators/test_smoothing_operator.py
+++ b/test/test_operators/test_smoothing_operator.py
@@ -54,7 +54,7 @@ class SmoothingOperator_Tests(unittest.TestCase):
         op = ift.FFTSmoothingOperator(space, sigma=sigma)
         fld = np.zeros(space.shape, dtype=np.float64)
         fld[0] = 1.
-        rand1 = ift.Field(space, ift.dobj.from_global_data(fld))
+        rand1 = ift.Field.from_global_data(space, fld)
         tt1 = op.times(rand1)
         assert_allclose(1, tt1.sum())