diff --git a/nifty5/library/gridder.py b/nifty5/library/gridder.py
index 0bb1d673c8031e6f8d0d4acb0997752e8d4545b0..80d168395adf0270f1af1ded65eed175ccfe1f3b 100644
--- a/nifty5/library/gridder.py
+++ b/nifty5/library/gridder.py
@@ -1,3 +1,20 @@
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Copyright(C) 2019 Max-Planck-Society
+#
+# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik.
+
 import numpy as np
 
 from ..domain_tuple import DomainTuple
diff --git a/test/test_operators/test_nft.py b/test/test_operators/test_nft.py
new file mode 100644
index 0000000000000000000000000000000000000000..b4834a768a363d806f312a3e5bb5446406f14267
--- /dev/null
+++ b/test/test_operators/test_nft.py
@@ -0,0 +1,75 @@
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Copyright(C) 2019 Max-Planck-Society
+#
+# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik.
+
+import numpy as np
+import pytest
+from numpy.testing import assert_allclose
+
+import nifty5 as ift
+
+np.random.seed(40)
+
+pmp = pytest.mark.parametrize
+
+
+@pmp('nu', [12, 128])
+@pmp('nv', [4, 12, 128])
+@pmp('N', [1, 10, 100])
+def test_gridding(nu, nv, N):
+    uv = np.random.rand(N, 2) - 0.5
+    vis = np.random.randn(N) + 1j*np.random.randn(N)
+
+    # Nifty
+    GM = ift.GridderMaker(ift.RGSpace((nu, nv)))
+    # re-order for performance
+    idx = GM.getReordering(uv)
+    uv, vis = uv[idx], vis[idx]
+    vis = ift.from_global_data(ift.UnstructuredDomain(vis.shape), vis)
+
+    Op = GM.getFull(uv)
+    pynu = Op(vis).to_global_data()
+    # DFT
+    x, y = np.meshgrid(
+        *[-ss/2 + np.arange(ss) for ss in [nu, nv]], indexing='ij')
+    dft = pynu*0.
+    for i in range(N):
+        dft += vis.val[i]*np.exp(2j*np.pi*(x*uv[i, 0] + y*uv[i, 1]))
+    assert_allclose(dft, pynu)
+
+
+@pmp('eps', [1e-2, 1e-6, 1e-15])
+@pmp('nu', [12, 128])
+@pmp('nv', [4, 12, 128])
+@pmp('N', [1, 10, 100])
+def test_build(nu, nv, N, eps):
+    dom = ift.RGSpace([nu, nv])
+    uv = np.random.rand(N, 2) - 0.5
+    GM = ift.GridderMaker(dom)
+    # re-order for performance
+    idx = GM.getReordering(uv)
+    uv = uv[idx]
+    R0 = GM.getGridder(uv)
+    R1 = GM.getRest()
+    R = R1@R0
+    RF = GM.getFull(uv)
+
+    # Consistency checks
+    dt = np.complex
+    ift.extra.consistency_check(R0, domain_dtype=dt, target_dtype=dt)
+    ift.extra.consistency_check(R1, domain_dtype=dt, target_dtype=dt)
+    ift.extra.consistency_check(R, domain_dtype=dt, target_dtype=dt)
+    ift.extra.consistency_check(RF, domain_dtype=dt, target_dtype=dt)