diff --git a/examples/EAGLE_12/eagle_12.yml b/examples/EAGLE_12/eagle_12.yml
index fd9569c50f4ad0d87eccd54e34636180c0337596..d2192b68e1bee7721a892d832daa4cd0dadb3836 100644
--- a/examples/EAGLE_12/eagle_12.yml
+++ b/examples/EAGLE_12/eagle_12.yml
@@ -26,7 +26,7 @@ Statistics:
 # Parameters for the self-gravity scheme
 Gravity:
   eta:                   0.025    # Constant dimensionless multiplier for time integration.
-  epsilon:               0.0001   # Softening length (in internal units).
+  epsilon:               0.0000001   # Softening length (in internal units).
   theta:                 0.7      # Opening angle (Multipole acceptance criterion)
   
 # Parameters for the hydrodynamics scheme
diff --git a/src/gravity.c b/src/gravity.c
index 95509066e2e2155d866405bf1ed336996c80d483..de42d58f87cb420de0e9ad9f3e47750568571d17 100644
--- a/src/gravity.c
+++ b/src/gravity.c
@@ -26,6 +26,10 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+#ifdef HAVE_HDF5
+#include <hdf5.h>
+#endif
+
 /* This object's header. */
 #include "gravity.h"
 
@@ -41,16 +45,19 @@ struct exact_force_data {
   double const_G;
 };
 
-/* Components of the Ewald correction */
-float *fewald_x;
-float *fewald_y;
-float *fewald_z;
+#ifdef SWIFT_GRAVITY_FORCE_CHECKS
 
 /* Size of the Ewald table */
-const int N = 64;
+#define Newald 64
+
+/* Components of the Ewald correction */
+static float fewald_x[Newald + 1][Newald + 1][Newald + 1];
+static float fewald_y[Newald + 1][Newald + 1][Newald + 1];
+static float fewald_z[Newald + 1][Newald + 1][Newald + 1];
 
 /* Factor used to normalize the access to the Ewald table */
 float ewald_fac;
+#endif
 
 /**
  * @brief Allocates the memory and computes one octant of the
@@ -78,42 +85,25 @@ void gravity_exact_force_ewald_init(double boxSize) {
   const float factor_sin = 2.f * M_PI;
   const float boxSize_inv2 = 1.f / (boxSize * boxSize);
 
-  /* Number of elements in each direction */
-  const int EN = N + 1;
-
   /* Ewald factor to access the table */
-  ewald_fac = (double)(2 * EN) / boxSize;
-
-  /* Zero stuff before allocation */
-  fewald_x = NULL;
-  fewald_y = NULL;
-  fewald_z = NULL;
-
-  /* Allocate the correction arrays */
-  if ((posix_memalign((void **)&fewald_x, 64, EN * EN * EN * sizeof(float)) !=
-       0) ||
-      (posix_memalign((void **)&fewald_y, 64, EN * EN * EN * sizeof(float)) !=
-       0) ||
-      (posix_memalign((void **)&fewald_z, 64, EN * EN * EN * sizeof(float)) !=
-       0))
-    error("Error allocating array for Ewald correction");
+  ewald_fac = (double)(2 * Newald) / boxSize;
 
   /* Zero everything */
-  bzero(fewald_x, EN * EN * EN * sizeof(float));
-  bzero(fewald_y, EN * EN * EN * sizeof(float));
-  bzero(fewald_z, EN * EN * EN * sizeof(float));
+  bzero(fewald_x, (Newald + 1) * (Newald + 1) * (Newald + 1) * sizeof(float));
+  bzero(fewald_y, (Newald + 1) * (Newald + 1) * (Newald + 1) * sizeof(float));
+  bzero(fewald_z, (Newald + 1) * (Newald + 1) * (Newald + 1) * sizeof(float));
 
   /* Compute the values in one of the octants */
-  for (int i = 0; i < EN; ++i) {
-    for (int j = 0; j < EN; ++j) {
-      for (int k = 0; k < EN; ++k) {
+  for (int i = 0; i <= Newald; ++i) {
+    for (int j = 0; j <= Newald; ++j) {
+      for (int k = 0; k <= Newald; ++k) {
 
         if (i == 0 && j == 0 && k == 0) continue;
 
         /* Distance vector */
-        const float r_x = 0.5f * ((float)i) / N;
-        const float r_y = 0.5f * ((float)j) / N;
-        const float r_z = 0.5f * ((float)k) / N;
+        const float r_x = 0.5f * ((float)i) / Newald;
+        const float r_y = 0.5f * ((float)j) / Newald;
+        const float r_z = 0.5f * ((float)k) / Newald;
 
         /* Norm of distance vector */
         const float r2 = r_x * r_x + r_y * r_y + r_z * r_z;
@@ -173,19 +163,51 @@ void gravity_exact_force_ewald_init(double boxSize) {
           }
         }
 
-        /* Apply the box-size correction */
-        f_x *= boxSize_inv2;
-        f_y *= boxSize_inv2;
-        f_z *= boxSize_inv2;
-
         /* Save back to memory */
-        fewald_x[i * EN * EN + j * EN + k] = f_x;
-        fewald_y[i * EN * EN + j * EN + k] = f_y;
-        fewald_z[i * EN * EN + j * EN + k] = f_z;
+        fewald_x[i][j][k] = f_x;
+        fewald_y[i][j][k] = f_y;
+        fewald_z[i][j][k] = f_z;
       }
     }
   }
 
+  /* Dump the Ewald table to a file */
+#ifdef HAVE_HDF5
+  hid_t h_file = H5Fcreate("Ewald.hdf5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+  if (h_file < 0)
+    error("Error while opening file for Ewald dump.");
+
+  /* Create dataspace */
+  hsize_t dim[3] = {Newald + 1, Newald + 1, Newald + 1};
+  hid_t h_space = H5Screate_simple(3, dim, NULL);
+  hid_t h_data;
+  h_data = H5Dcreate(h_file, "Ewald_x", H5T_NATIVE_FLOAT, h_space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Dwrite(h_data, H5T_NATIVE_FLOAT, h_space, H5S_ALL, H5P_DEFAULT, &(fewald_x[0][0][0]));
+  H5Dclose(h_data);
+  h_data = H5Dcreate(h_file, "Ewald_y", H5T_NATIVE_FLOAT, h_space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Dwrite(h_data, H5T_NATIVE_FLOAT, h_space, H5S_ALL, H5P_DEFAULT, &(fewald_y[0][0][0]));
+  H5Dclose(h_data);
+  h_data = H5Dcreate(h_file, "Ewald_z", H5T_NATIVE_FLOAT, h_space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+  H5Dwrite(h_data, H5T_NATIVE_FLOAT, h_space, H5S_ALL, H5P_DEFAULT, &(fewald_z[0][0][0]));
+  H5Dclose(h_data);
+  H5Sclose(h_space);
+  H5Fclose(h_file);
+#endif
+
+  //message("\n\n fewald_x[2 * EN * EN + 3 * EN + 4]=%e\n\n", fewald_x[2 * EN * EN + 3 * EN + 4]);
+
+  /* Apply the box-size correction */
+  for (int i = 0; i <= Newald; ++i) {
+    for (int j = 0; j <= Newald; ++j) {
+      for (int k = 0; k <= Newald; ++k) {
+        fewald_x[i][j][k] *= boxSize_inv2;
+        fewald_y[i][j][k] *= boxSize_inv2;
+        fewald_z[i][j][k] *= boxSize_inv2;
+      }
+    }
+  }
+
+
   /* Say goodbye */
   message("Ewald correction table computed (took %.3f %s). ",
           clocks_from_ticks(getticks() - tic), clocks_getunit());
@@ -222,62 +244,62 @@ __attribute__((always_inline)) INLINE static void
 gravity_exact_force_ewald_evaluate(double rx, double ry, double rz,
                                    double corr[3]) {
 
-  const int s_x = (rx < 0.) ? 1 : -1;
-  const int s_y = (ry < 0.) ? 1 : -1;
-  const int s_z = (rz < 0.) ? 1 : -1;
+  const double s_x = (rx < 0.) ? 1. : -1.;
+  const double s_y = (ry < 0.) ? 1. : -1.;
+  const double s_z = (rz < 0.) ? 1. : -1.;
   rx = fabs(rx);
   ry = fabs(ry);
   rz = fabs(rz);
 
   int i = (int)(rx * ewald_fac);
-  if (i >= N) i = N - 1;
+  if (i >= Newald) i = Newald - 1;
   const double dx = rx * ewald_fac - i;
   const double tx = 1. - dx;
 
   int j = (int)(ry * ewald_fac);
-  if (j >= N) j = N - 1;
+  if (j >= Newald) j = Newald - 1;
   const double dy = ry * ewald_fac - j;
   const double ty = 1. - dy;
 
   int k = (int)(rz * ewald_fac);
-  if (k >= N) k = N - 1;
+  if (k >= Newald) k = Newald - 1;
   const double dz = rz * ewald_fac - k;
   const double tz = 1. - dz;
 
   /* Interpolation in X */
   corr[0] = 0.;
-  corr[0] += fewald_x[(i + 0) * N * N + (j + 0) * N + (k + 0)] * tx * ty * tz;
-  corr[0] += fewald_x[(i + 0) * N * N + (j + 0) * N + (k + 1)] * tx * ty * dz;
-  corr[0] += fewald_x[(i + 0) * N * N + (j + 1) * N + (k + 0)] * tx * dy * tz;
-  corr[0] += fewald_x[(i + 0) * N * N + (j + 1) * N + (k + 1)] * tx * dy * dz;
-  corr[0] += fewald_x[(i + 1) * N * N + (j + 0) * N + (k + 0)] * dx * ty * tz;
-  corr[0] += fewald_x[(i + 1) * N * N + (j + 0) * N + (k + 1)] * dx * ty * dz;
-  corr[0] += fewald_x[(i + 1) * N * N + (j + 1) * N + (k + 0)] * dx * dy * tz;
-  corr[0] += fewald_x[(i + 1) * N * N + (j + 1) * N + (k + 1)] * dx * dy * dz;
+  corr[0] += fewald_x[i + 0][j + 0][k + 0] * tx * ty * tz;
+  corr[0] += fewald_x[i + 0][j + 0][k + 1] * tx * ty * dz;
+  corr[0] += fewald_x[i + 0][j + 1][k + 0] * tx * dy * tz;
+  corr[0] += fewald_x[i + 0][j + 1][k + 1] * tx * dy * dz;
+  corr[0] += fewald_x[i + 1][j + 0][k + 0] * dx * ty * tz;
+  corr[0] += fewald_x[i + 1][j + 0][k + 1] * dx * ty * dz;
+  corr[0] += fewald_x[i + 1][j + 1][k + 0] * dx * dy * tz;
+  corr[0] += fewald_x[i + 1][j + 1][k + 1] * dx * dy * dz;
   corr[0] *= s_x;
 
   /* Interpolation in Y */
   corr[1] = 0.;
-  corr[1] += fewald_y[(i + 0) * N * N + (j + 0) * N + (k + 0)] * tx * ty * tz;
-  corr[1] += fewald_y[(i + 0) * N * N + (j + 0) * N + (k + 1)] * tx * ty * dz;
-  corr[1] += fewald_y[(i + 0) * N * N + (j + 1) * N + (k + 0)] * tx * dy * tz;
-  corr[1] += fewald_y[(i + 0) * N * N + (j + 1) * N + (k + 1)] * tx * dy * dz;
-  corr[1] += fewald_y[(i + 1) * N * N + (j + 0) * N + (k + 0)] * dx * ty * tz;
-  corr[1] += fewald_y[(i + 1) * N * N + (j + 0) * N + (k + 1)] * dx * ty * dz;
-  corr[1] += fewald_y[(i + 1) * N * N + (j + 1) * N + (k + 0)] * dx * dy * tz;
-  corr[1] += fewald_y[(i + 1) * N * N + (j + 1) * N + (k + 1)] * dx * dy * dz;
+  corr[1] += fewald_y[i + 0][j + 0][k + 0] * tx * ty * tz;
+  corr[1] += fewald_y[i + 0][j + 0][k + 1] * tx * ty * dz;
+  corr[1] += fewald_y[i + 0][j + 1][k + 0] * tx * dy * tz;
+  corr[1] += fewald_y[i + 0][j + 1][k + 1] * tx * dy * dz;
+  corr[1] += fewald_y[i + 1][j + 0][k + 0] * dx * ty * tz;
+  corr[1] += fewald_y[i + 1][j + 0][k + 1] * dx * ty * dz;
+  corr[1] += fewald_y[i + 1][j + 1][k + 0] * dx * dy * tz;
+  corr[1] += fewald_y[i + 1][j + 1][k + 1] * dx * dy * dz;
   corr[1] *= s_y;
 
   /* Interpolation in Z */
   corr[2] = 0.;
-  corr[2] += fewald_z[(i + 0) * N * N + (j + 0) * N + (k + 0)] * tx * ty * tz;
-  corr[2] += fewald_z[(i + 0) * N * N + (j + 0) * N + (k + 1)] * tx * ty * dz;
-  corr[2] += fewald_z[(i + 0) * N * N + (j + 1) * N + (k + 0)] * tx * dy * tz;
-  corr[2] += fewald_z[(i + 0) * N * N + (j + 1) * N + (k + 1)] * tx * dy * dz;
-  corr[2] += fewald_z[(i + 1) * N * N + (j + 0) * N + (k + 0)] * dx * ty * tz;
-  corr[2] += fewald_z[(i + 1) * N * N + (j + 0) * N + (k + 1)] * dx * ty * dz;
-  corr[2] += fewald_z[(i + 1) * N * N + (j + 1) * N + (k + 0)] * dx * dy * tz;
-  corr[2] += fewald_z[(i + 1) * N * N + (j + 1) * N + (k + 1)] * dx * dy * dz;
+  corr[2] += fewald_z[i + 0][j + 0][k + 0] * tx * ty * tz;
+  corr[2] += fewald_z[i + 0][j + 0][k + 1] * tx * ty * dz;
+  corr[2] += fewald_z[i + 0][j + 1][k + 0] * tx * dy * tz;
+  corr[2] += fewald_z[i + 0][j + 1][k + 1] * tx * dy * dz;
+  corr[2] += fewald_z[i + 1][j + 0][k + 0] * dx * ty * tz;
+  corr[2] += fewald_z[i + 1][j + 0][k + 1] * dx * ty * dz;
+  corr[2] += fewald_z[i + 1][j + 1][k + 0] * dx * dy * tz;
+  corr[2] += fewald_z[i + 1][j + 1][k + 1] * dx * dy * dz;
   corr[2] *= s_z;
 }
 
@@ -419,9 +441,9 @@ void gravity_exact_force_compute_mapper(void *map_data, int nr_gparts,
           double corr[3];
 	  gravity_exact_force_ewald_evaluate(dx, dy, dz, corr);
 
-          a_grav[0] += mj * corr[0] * 0.;
-          a_grav[1] += mj * corr[1] * 0.;
-          a_grav[2] += mj * corr[2] * 0.;
+          a_grav[0] += mj * corr[0];
+          a_grav[1] += mj * corr[1];
+          a_grav[2] += mj * corr[2];
         }
       }