diff --git a/bfps/NavierStokes.py b/bfps/NavierStokes.py
index 2f758ca2d0395e76634d01e5c0500a5374d14203..920b8413a95b5929255a5f06f4e1afb6a4c6cbf0 100644
--- a/bfps/NavierStokes.py
+++ b/bfps/NavierStokes.py
@@ -378,6 +378,52 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
                           '}\n' +
                           'delete fs;\n')
         return None
+    def add_3D_rFFTW_field(
+            self,
+            name = 'rFFTW_acc'):
+        if self.dtype == np.float32:
+            FFTW = 'fftwf'
+        elif self.dtype == np.float64:
+            FFTW = 'fftw'
+        self.fluid_variables += '{0} *{1};\n'.format(self.C_dtype, name)
+        self.fluid_start += '{0} = {1}_alloc_real(2*fs->cd->local_size);\n'.format(name, FFTW)
+        self.fluid_end   += '{0}_free({1});\n'.format(FFTW, name)
+        return None
+    def add_interpolator(
+            self,
+            interp_type = 'spline',
+            kcut = None,
+            neighbours = 1,
+            smoothness = 1,
+            name = 'field_interpolator',
+            field_name = 'fs->rvelocity'):
+        name = quantity + '_' + name
+        self.fluid_includes += '#include "rFFTW_interpolator.hpp"\n'
+        self.fluid_variables += 'rFFTW_interpolator <{0}, {1}> *{2};\n'.format(self.C_dtype, neighbours, name)
+        self.parameters[name + '_type'] = interp_type
+        self.parameters[name + '_neighbours'] = neighbours
+        if interp_type == 'spline':
+            self.parameters[name + '_smoothness'] = smoothness
+            beta_name = 'beta_n{0}_m{1}'.format(neighbours, smoothness)
+        elif interp_type == 'Lagrange':
+            beta_name = 'beta_Lagrange_n{0}'.format(neighbours)
+        self.fluid_start += '{0} = new rFFTW_interpolator<{1}, {2}>(fs, {3});\n'.format(
+                name,
+                self.C_dtype,
+                neighbours,
+                beta_name)
+        self.fluid_end += 'delete {0};\n'.format(name)
+        update_fields = 'fs->compute_velocity(fs->cvorticity);\n'
+        if not type(kcut) == type(None):
+            update_fields += 'fs->low_pass_Fourier(fs->cvelocity, 3, {0});\n'.format(kcut)
+        if quantity == 'vel':
+            update_fields += ('fs->ift_velocity();\n' +
+                              '{0}->read_rFFTW(fs->rvelocity);\n').format(name)
+        elif quantity == 'acc':
+            update_fields += 'fs->compute_Lagrangian_acceleration({0}->field);\n'.format(name)
+        self.fluid_start += update_fields
+        self.fluid_loop += update_fields
+        return None
     def add_particle_fields(
             self,
             interp_type = 'spline',
@@ -385,7 +431,8 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
             neighbours = 1,
             smoothness = 1,
             name = 'particle_field',
-            field_class = 'rFFTW_interpolator'):
+            field_class = 'rFFTW_interpolator',
+            acc_field_name = 'rFFTW_acc'):
         self.fluid_includes += '#include "{0}.hpp"\n'.format(field_class)
         self.fluid_variables += field_class + '<{0}, {1}> *vel_{2}, *acc_{2};\n'.format(self.C_dtype, neighbours, name)
         self.parameters[name + '_type'] = interp_type
@@ -395,19 +442,19 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
             beta_name = 'beta_n{0}_m{1}'.format(neighbours, smoothness)
         elif interp_type == 'Lagrange':
             beta_name = 'beta_Lagrange_n{0}'.format(neighbours)
-        self.fluid_start += ('vel_{0} = new {1}<{2}, {3}>(fs, {4});\n' +
-                             'acc_{0} = new {1}<{2}, {3}>(fs, {4});\n').format(name,
+        self.fluid_start += ('vel_{0} = new {1}<{2}, {3}>(fs, {4}, fs->rvelocity);\n' +
+                             'acc_{0} = new {1}<{2}, {3}>(fs, {4}, {5});\n').format(name,
                                                                                field_class,
                                                                                self.C_dtype,
                                                                                neighbours,
-                                                                               beta_name)
+                                                                               beta_name,
+                                                                               acc_field_name)
         self.fluid_end += ('delete vel_{0};\n' +
                            'delete acc_{0};\n').format(name)
         update_fields = 'fs->compute_velocity(fs->cvorticity);\n'
         if not type(kcut) == type(None):
             update_fields += 'fs->low_pass_Fourier(fs->cvelocity, 3, {0});\n'.format(kcut)
         update_fields += ('fs->ift_velocity();\n' +
-                          'vel_{0}->read_rFFTW(fs->rvelocity);\n' +
                           'fs->compute_Lagrangian_acceleration(acc_{0}->field);\n').format(name)
         self.fluid_start += update_fields
         self.fluid_loop += update_fields
@@ -419,7 +466,8 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
             kcut = 'fs->kM',
             frozen_particles = False,
             fields_name = None,
-            particle_class = 'rFFTW_particles'):
+            particle_class = 'rFFTW_particles',
+            acc_stats = False):
         if integration_method == 'cRK4':
             integration_steps = 4
         elif integration_method == 'Heun':
diff --git a/bfps/cpp/rFFTW_interpolator.cpp b/bfps/cpp/rFFTW_interpolator.cpp
index a858eb104abf19837f7ccd30ae673caaf841a493..c701fbd64bba8e1c68ab2de953eae0795baead2f 100644
--- a/bfps/cpp/rFFTW_interpolator.cpp
+++ b/bfps/cpp/rFFTW_interpolator.cpp
@@ -32,15 +32,13 @@
 template <class rnumber, int interp_neighbours>
 rFFTW_interpolator<rnumber, interp_neighbours>::rFFTW_interpolator(
         fluid_solver_base<rnumber> *fs,
-        base_polynomial_values BETA_POLYS)
+        base_polynomial_values BETA_POLYS,
+        rnumber *FIELD)
 {
     this->descriptor = fs->rd;
     this->field_size = 2*fs->cd->local_size;
     this->compute_beta = BETA_POLYS;
-    if (sizeof(rnumber) == 4)
-        this->field = (rnumber*)((void*)fftwf_alloc_real(this->field_size));
-    else if (sizeof(rnumber) == 8)
-        this->field = (rnumber*)((void*)fftw_alloc_real(this->field_size));
+    this->field = FIELD;
 
     // compute dx, dy, dz;
     this->dx = 4*acos(0) / (fs->dkx*this->descriptor->sizes[2]);
@@ -59,24 +57,9 @@ rFFTW_interpolator<rnumber, interp_neighbours>::rFFTW_interpolator(
 template <class rnumber, int interp_neighbours>
 rFFTW_interpolator<rnumber, interp_neighbours>::~rFFTW_interpolator()
 {
-    if (sizeof(rnumber) == 4)
-        fftwf_free((float*)((void*)this->field));
-    else if (sizeof(rnumber) == 8)
-        fftw_free((double*)((void*)this->field));
     delete[] this->compute;
 }
 
-template <class rnumber, int interp_neighbours>
-int rFFTW_interpolator<rnumber, interp_neighbours>::read_rFFTW(void *void_src)
-{
-    rnumber *src = (rnumber*)void_src;
-    /* do big copy of middle stuff */
-    std::copy(src,
-              src + this->field_size,
-              this->field);
-    return EXIT_SUCCESS;
-}
-
 template <class rnumber, int interp_neighbours>
 void rFFTW_interpolator<rnumber, interp_neighbours>::get_grid_coordinates(
         const int nparticles,
diff --git a/bfps/cpp/rFFTW_interpolator.hpp b/bfps/cpp/rFFTW_interpolator.hpp
index 154296018926202bb53367e4313510079343c4b8..3dccd7150d17bea612128bf6d70b37033d281db8 100644
--- a/bfps/cpp/rFFTW_interpolator.hpp
+++ b/bfps/cpp/rFFTW_interpolator.hpp
@@ -60,7 +60,8 @@ class rFFTW_interpolator
 
         rFFTW_interpolator(
                 fluid_solver_base<rnumber> *FSOLVER,
-                base_polynomial_values BETA_POLYS);
+                base_polynomial_values BETA_POLYS,
+                rnumber *FIELD_DATA);
         ~rFFTW_interpolator();
 
         /* map real locations to grid coordinates */
@@ -83,7 +84,6 @@ class rFFTW_interpolator
                 const double *__restrict__ xx,
                 double *__restrict__ dest,
                 const int *deriv = NULL);
-        int read_rFFTW(void *src);
 };
 
 #endif//RFFTW_INTERPOLATOR
diff --git a/tests/base.py b/tests/base.py
index c050245b85910bd35e2c62bf937945ba8d897e52..df1d65614ccedaa68491f961d8e7af7b178d8973 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -102,6 +102,7 @@ def launch(
     c.parameters['famplitude'] = 0.2
     c.fill_up_fluid_code()
     if c.parameters['nparticles'] > 0:
+        c.add_3D_rFFTW_field()
         c.add_particle_fields(
                 name = 'regular',
                 neighbours = opt.neighbours,