diff --git a/examples/main.c b/examples/main.c
index 8d4289c872ce34ba626cacffca4097c0093fe0c3..d41837aeae5e9a2c6e724c48b19fb2857b0e580b 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -323,14 +323,14 @@ int main(int argc, char *argv[]) {
 
   /* How large are the parts? */
   if (myrank == 0) {
-    message("sizeof(part)       is %4zi bytes.", sizeof(struct part));
-    message("sizeof(xpart)      is %4zi bytes.", sizeof(struct xpart));
-    message("sizeof(spart)      is %4zi bytes.", sizeof(struct spart));
-    message("sizeof(gpart)      is %4zi bytes.", sizeof(struct gpart));
-    message("sizeof(multipole)  is %4zi bytes.", sizeof(struct multipole));
-    message("sizeof(acc_tensor) is %4zi bytes.", sizeof(struct acc_tensor));
-    message("sizeof(task)       is %4zi bytes.", sizeof(struct task));
-    message("sizeof(cell)       is %4zi bytes.", sizeof(struct cell));
+    message("sizeof(part)        is %4zi bytes.", sizeof(struct part));
+    message("sizeof(xpart)       is %4zi bytes.", sizeof(struct xpart));
+    message("sizeof(spart)       is %4zi bytes.", sizeof(struct spart));
+    message("sizeof(gpart)       is %4zi bytes.", sizeof(struct gpart));
+    message("sizeof(multipole)   is %4zi bytes.", sizeof(struct multipole));
+    message("sizeof(grav_tensor) is %4zi bytes.", sizeof(struct grav_tensor));
+    message("sizeof(task)        is %4zi bytes.", sizeof(struct task));
+    message("sizeof(cell)        is %4zi bytes.", sizeof(struct cell));
   }
 
   /* Read the parameter file */
diff --git a/src/multipole.h b/src/multipole.h
index fef8d39082c06276087fd50a04ab72dec4af6773..27ff713485f318dbf981a99d59b13e35dfe8d034 100644
--- a/src/multipole.h
+++ b/src/multipole.h
@@ -37,36 +37,7 @@
 
 #define multipole_align 128
 
-struct acc_tensor {
-
-  double F_000;
-
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-
-  /* 1st order terms */
-  float F_100, F_010, F_001;
-#endif
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
-
-  /* 2nd order terms */
-  float F_200, F_020, F_002;
-  float F_110, F_101, F_011;
-#endif
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
-
-  /* 3rd order terms */
-  float F_300, F_030, F_003;
-  float F_210, F_201;
-  float F_120, F_021;
-  float F_102, F_012;
-  float F_111;
-#endif
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 3
-#error "Missing implementation for order >3"
-#endif
-};
-
-struct pot_tensor {
+struct grav_tensor {
 
   double F_000;
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
@@ -144,17 +115,8 @@ struct gravity_tensors {
     /*! Multipole mass */
     struct multipole m_pole;
 
-    /*! Field tensor for acceleration along x */
-    struct acc_tensor a_x;
-
-    /*! Field tensor for acceleration along y */
-    struct acc_tensor a_y;
-
-    /*! Field tensor for acceleration along z */
-    struct acc_tensor a_z;
-
     /*! Field tensor for the potential */
-    struct pot_tensor pot;
+    struct grav_tensor pot;
 
 #ifdef SWIFT_DEBUG_CHECKS
 
@@ -192,10 +154,7 @@ INLINE static void gravity_drift(struct gravity_tensors *m, double dt) {
 
 INLINE static void gravity_field_tensors_init(struct gravity_tensors *m) {
 
-  bzero(&m->a_x, sizeof(struct acc_tensor));
-  bzero(&m->a_y, sizeof(struct acc_tensor));
-  bzero(&m->a_z, sizeof(struct acc_tensor));
-  bzero(&m->pot, sizeof(struct pot_tensor));
+  bzero(&m->pot, sizeof(struct grav_tensor));
 
 #ifdef SWIFT_DEBUG_CHECKS
   m->mass_interacted = 0.;
@@ -210,9 +169,7 @@ INLINE static void gravity_field_tensors_init(struct gravity_tensors *m) {
  */
 INLINE static void gravity_field_tensors_add(struct gravity_tensors *la,
                                              const struct gravity_tensors *lb) {
-  la->a_x.F_000 += lb->a_x.F_000;
-  la->a_y.F_000 += lb->a_y.F_000;
-  la->a_z.F_000 += lb->a_z.F_000;
+  la->pot.F_000 += lb->pot.F_000;
 
 #ifdef SWIFT_DEBUG_CHECKS
   if (lb->mass_interacted == 0.f) error("Adding tensors that did not interact");
@@ -230,26 +187,31 @@ INLINE static void gravity_field_tensors_add(struct gravity_tensors *la,
 INLINE static void gravity_multipole_print(const struct multipole *m) {
 
   printf("Vel= [%12.5e %12.5e %12.5e\n", m->vel[0], m->vel[1], m->vel[2]);
+  printf("-------------------------");
   printf("M_000= %12.5e\n", m->M_000);
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  printf("M_100= %8.5e M_010= %8.5e M_001= %8.5e\n", m->M_100, m->M_010,
+  printf("-------------------------");
+  printf("M_100= %12.5e M_010= %12.5e M_001= %12.5e\n", m->M_100, m->M_010,
          m->M_001);
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
-  printf("M_200= %8.5e M_020= %8.5e M_002= %8.5e\n", m->M_200, m->M_020,
+  printf("-------------------------");
+  printf("M_200= %12.5e M_020= %12.5e M_002= %12.5e\n", m->M_200, m->M_020,
          m->M_002);
-  printf("M_110= %8.5e M_101= %8.5e M_011= %8.5e\n", m->M_110, m->M_101,
+  printf("M_110= %12.5e M_101= %12.5e M_011= %12.5e\n", m->M_110, m->M_101,
          m->M_011);
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 2
-  printf("M_300= %8.5e M_030= %8.5e M_003= %8.5e\n", m->M_300, m->M_030,
+  printf("-------------------------");
+  printf("M_300= %12.5e M_030= %12.5e M_003= %12.5e\n", m->M_300, m->M_030,
          m->M_003);
-  printf("M_210= %8.5e M_201= %8.5e M_120= %8.5e\n", m->M_210, m->M_201,
+  printf("M_210= %12.5e M_201= %12.5e M_120= %12.5e\n", m->M_210, m->M_201,
          m->M_120);
-  printf("M_021= %8.5e M_102= %8.5e M_012= %8.5e\n", m->M_021, m->M_102,
+  printf("M_021= %12.5e M_102= %12.5e M_012= %12.5e\n", m->M_021, m->M_102,
          m->M_012);
-  printf("M_111= %8.5e\n", m->M_111);
+  printf("M_111= %12.5e\n", m->M_111);
 #endif
+  printf("-------------------------");
 }
 
 /**
@@ -278,6 +240,26 @@ INLINE static void gravity_multipole_add(struct multipole *ma,
   ma->M_010 += mb->M_010;
   ma->M_001 += mb->M_001;
 #endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+  ma->M_200 += mb->M_200;
+  ma->M_020 += mb->M_020;
+  ma->M_002 += mb->M_002;
+  ma->M_110 += mb->M_110;
+  ma->M_101 += mb->M_101;
+  ma->M_011 += mb->M_011;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+  ma->M_300 += mb->M_300;
+  ma->M_030 += mb->M_030;
+  ma->M_003 += mb->M_003;
+  ma->M_210 += mb->M_210;
+  ma->M_201 += mb->M_201;
+  ma->M_120 += mb->M_120;
+  ma->M_021 += mb->M_021;
+  ma->M_102 += mb->M_102;
+  ma->M_012 += mb->M_012;
+  ma->M_111 += mb->M_111;
+#endif
 }
 
 /**
@@ -286,7 +268,7 @@ INLINE static void gravity_multipole_add(struct multipole *ma,
  * @param ga The first #multipole.
  * @param gb The second #multipole.
  * @param tolerance The maximal allowed difference for the fields.
- * @return 1 if the multipoles are equal 0 otherwise.
+ * @return 1 if the multipoles are equal, 0 otherwise
  */
 INLINE static int gravity_multipole_equal(const struct gravity_tensors *ga,
                                           const struct gravity_tensors *gb,
@@ -335,6 +317,62 @@ INLINE static int gravity_multipole_equal(const struct gravity_tensors *ga,
     return 0;
 #endif
 
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+  /* Check 2nd order terms */
+  if (fabsf(ma->M_200 + mb->M_200) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_200 - mb->M_200) / fabsf(ma->M_200 + mb->M_200) > tolerance)
+    return 0;
+  if (fabsf(ma->M_020 + mb->M_020) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_020 - mb->M_020) / fabsf(ma->M_020 + mb->M_020) > tolerance)
+    return 0;
+  if (fabsf(ma->M_002 + mb->M_002) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_002 - mb->M_002) / fabsf(ma->M_002 + mb->M_002) > tolerance)
+    return 0;
+  if (fabsf(ma->M_110 + mb->M_110) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_110 - mb->M_110) / fabsf(ma->M_110 + mb->M_110) > tolerance)
+    return 0;
+  if (fabsf(ma->M_101 + mb->M_101) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_101 - mb->M_101) / fabsf(ma->M_101 + mb->M_101) > tolerance)
+    return 0;
+  if (fabsf(ma->M_011 + mb->M_011) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_011 - mb->M_011) / fabsf(ma->M_011 + mb->M_011) > tolerance)
+    return 0;
+#endif
+
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+  /* Check 3rd order terms */
+  if (fabsf(ma->M_300 + mb->M_300) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_300 - mb->M_300) / fabsf(ma->M_300 + mb->M_300) > tolerance)
+    return 0;
+  if (fabsf(ma->M_030 + mb->M_030) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_030 - mb->M_030) / fabsf(ma->M_030 + mb->M_030) > tolerance)
+    return 0;
+  if (fabsf(ma->M_003 + mb->M_003) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_003 - mb->M_003) / fabsf(ma->M_003 + mb->M_003) > tolerance)
+    return 0;
+  if (fabsf(ma->M_210 + mb->M_210) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_210 - mb->M_210) / fabsf(ma->M_210 + mb->M_210) > tolerance)
+    return 0;
+  if (fabsf(ma->M_201 + mb->M_201) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_201 - mb->M_201) / fabsf(ma->M_201 + mb->M_201) > tolerance)
+    return 0;
+  if (fabsf(ma->M_120 + mb->M_120) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_120 - mb->M_120) / fabsf(ma->M_120 + mb->M_120) > tolerance)
+    return 0;
+  if (fabsf(ma->M_021 + mb->M_021) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_021 - mb->M_021) / fabsf(ma->M_021 + mb->M_021) > tolerance)
+    return 0;
+  if (fabsf(ma->M_102 + mb->M_102) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_102 - mb->M_102) / fabsf(ma->M_102 + mb->M_102) > tolerance)
+    return 0;
+  if (fabsf(ma->M_012 + mb->M_012) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_012 - mb->M_012) / fabsf(ma->M_012 + mb->M_012) > tolerance)
+    return 0;
+  if (fabsf(ma->M_111 + mb->M_111) > 1e-6 * ma->M_000 &&
+      fabsf(ma->M_111 - mb->M_111) / fabsf(ma->M_111 + mb->M_111) > tolerance)
+    return 0;
+#endif
+
   /* All is good */
   return 1;
 }
@@ -370,6 +408,7 @@ INLINE static void gravity_P2M(struct gravity_tensors *m,
     vel[2] += gparts[k].v_full[2] * m;
   }
 
+  /* Final operation on CoM */
   const double imass = 1.0 / mass;
   com[0] *= imass;
   com[1] *= imass;
@@ -378,8 +417,19 @@ INLINE static void gravity_P2M(struct gravity_tensors *m,
   vel[1] *= imass;
   vel[2] *= imass;
 
+  /* Prepare some local counters */
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  double M_001 = 0.f, M_010 = 0.f, M_100 = 0.f;
+  float M_100 = 0.f, M_010 = 0.f, M_001 = 0.f;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+  float M_200 = 0.f, M_020 = 0.f, M_002 = 0.f;
+  float M_110 = 0.f, M_101 = 0.f, M_011 = 0.f;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+  float M_300 = 0.f, M_030 = 0.f, M_003 = 0.f;
+  float M_210 = 0.f, M_201 = 0.f, M_120 = 0.f;
+  float M_021 = 0.f, M_102 = 0.f, M_012 = 0.f;
+  float M_111 = 0.f;
 #endif
 
   /* Construce the higher order terms */
@@ -389,10 +439,29 @@ INLINE static void gravity_P2M(struct gravity_tensors *m,
     const double dx[3] = {gparts[k].x[0] - com[0], gparts[k].x[1] - com[1],
                           gparts[k].x[2] - com[2]};
 
-    M_001 += -m * dx[0];
+    M_100 += -m * dx[0];
     M_010 += -m * dx[1];
-    M_100 += -m * dx[2];
-
+    M_001 += -m * dx[2];
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+    M_200 += 0.5f * m * dx[0] * dx[0];
+    M_020 += 0.5f * m * dx[1] * dx[1];
+    M_002 += 0.5f * m * dx[2] * dx[2];
+    M_110 += m * dx[0] * dx[1];
+    M_101 += m * dx[0] * dx[2];
+    M_011 += m * dx[1] * dx[2];
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+    M_300 += -0.16666667f * m * dx[0] * dx[0] * dx[0];
+    M_030 += -0.16666667f * m * dx[1] * dx[1] * dx[1];
+    M_003 += -0.16666667f * m * dx[2] * dx[2] * dx[2];
+    M_210 += -0.5f * m * dx[0] * dx[0] * dx[1];
+    M_201 += -0.5f * m * dx[0] * dx[0] * dx[2];
+    M_120 += -0.5f * m * dx[0] * dx[1] * dx[1];
+    M_021 += -0.5f * m * dx[1] * dx[1] * dx[2];
+    M_102 += -0.5f * m * dx[0] * dx[2] * dx[2];
+    M_012 += -0.5f * m * dx[1] * dx[2] * dx[2];
+    M_111 += -m * dx[0] * dx[1] * dx[2];
 #endif
   }
 
@@ -405,9 +474,29 @@ INLINE static void gravity_P2M(struct gravity_tensors *m,
   m->m_pole.vel[1] = vel[1];
   m->m_pole.vel[2] = vel[2];
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  m->m_pole.M_001 = M_001;
-  m->m_pole.M_010 = M_010;
   m->m_pole.M_100 = M_100;
+  m->m_pole.M_010 = M_010;
+  m->m_pole.M_001 = M_001;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+  m->m_pole.M_200 = M_200;
+  m->m_pole.M_020 = M_020;
+  m->m_pole.M_002 = M_002;
+  m->m_pole.M_110 = M_110;
+  m->m_pole.M_101 = M_101;
+  m->m_pole.M_011 = M_011;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+  m->m_pole.M_300 = M_300;
+  m->m_pole.M_030 = M_030;
+  m->m_pole.M_003 = M_003;
+  m->m_pole.M_210 = M_210;
+  m->m_pole.M_201 = M_201;
+  m->m_pole.M_120 = M_120;
+  m->m_pole.M_021 = M_021;
+  m->m_pole.M_102 = M_102;
+  m->m_pole.M_012 = M_012;
+  m->m_pole.M_111 = M_111;
 #endif
 }
 
@@ -443,6 +532,53 @@ INLINE static void gravity_M2M(struct multipole *m_a,
   m_a->M_010 = m_b->M_010 + dx[1] * m_b->M_000;
   m_a->M_001 = m_b->M_001 + dx[2] * m_b->M_000;
 #endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 1
+  m_a->M_200 =
+      m_b->M_200 + dx[0] * m_b->M_100 + 0.5f * dx[0] * dx[0] * m_b->M_000;
+  m_a->M_020 =
+      m_b->M_020 + dx[1] * m_b->M_010 + 0.5f * dx[1] * dx[1] * m_b->M_000;
+  m_a->M_002 =
+      m_b->M_002 + dx[2] * m_b->M_001 + 0.5f * dx[2] * dx[2] * m_b->M_000;
+  m_a->M_110 = m_b->M_110 + dx[0] * m_b->M_010 + dx[1] * m_b->M_100 +
+               dx[0] * dx[1] * m_b->M_000;
+  m_a->M_101 = m_b->M_101 + dx[0] * m_b->M_001 + dx[2] * m_b->M_100 +
+               dx[0] * dx[2] * m_b->M_000;
+  m_a->M_011 = m_b->M_011 + dx[1] * m_b->M_001 + dx[2] * m_b->M_010 +
+               dx[1] * dx[2] * m_b->M_000;
+#endif
+#if SELF_GRAVITY_MULTIPOLE_ORDER > 2
+  m_a->M_300 = m_b->M_300 + dx[0] * m_b->M_200 +
+               0.5f * dx[0] * dx[0] * m_b->M_100 +
+               0.1666667f * dx[0] * dx[0] * dx[0] * m_b->M_000;
+  m_a->M_030 = m_b->M_030 + dx[1] * m_b->M_020 +
+               0.5f * dx[1] * dx[1] * m_b->M_010 +
+               0.1666667f * dx[1] * dx[1] * dx[1] * m_b->M_000;
+  m_a->M_003 = m_b->M_003 + dx[2] * m_b->M_002 +
+               0.5f * dx[2] * dx[2] * m_b->M_001 +
+               0.1666667f * dx[2] * dx[2] * dx[2] * m_b->M_000;
+  m_a->M_210 = m_b->M_210 + dx[0] * m_b->M_110 + dx[1] * m_b->M_200 +
+               0.5f * dx[0] * dx[0] * m_b->M_010 + dx[0] * dx[1] * m_b->M_100 +
+               0.5f * dx[0] * dx[0] * dx[1] * m_b->M_000;
+  m_a->M_201 = m_b->M_201 + dx[0] * m_b->M_101 + dx[2] * m_b->M_200 +
+               0.5f * dx[0] * dx[0] * m_b->M_001 + dx[0] * dx[2] * m_b->M_100 +
+               0.5f * dx[0] * dx[0] * dx[2] * m_b->M_000;
+  m_a->M_120 = m_b->M_120 + dx[1] * m_b->M_110 + dx[0] * m_b->M_020 +
+               0.5f * dx[1] * dx[1] * m_b->M_100 + dx[0] * dx[1] * m_b->M_010 +
+               0.5f * dx[0] * dx[1] * dx[1] * m_b->M_000;
+  m_a->M_021 = m_b->M_021 + dx[1] * m_b->M_011 + dx[2] * m_b->M_020 +
+               0.5f * dx[1] * dx[1] * m_b->M_001 + dx[1] * dx[2] * m_b->M_010 +
+               0.5f * dx[1] * dx[1] * dx[2] * m_b->M_000;
+  m_a->M_102 = m_b->M_102 + dx[2] * m_b->M_101 + dx[0] * m_b->M_002 +
+               0.5f * dx[2] * dx[2] * m_b->M_100 + dx[0] * dx[2] * m_b->M_001 +
+               0.5f * dx[0] * dx[2] * dx[2] * m_b->M_000;
+  m_a->M_012 = m_b->M_012 + dx[2] * m_b->M_011 + dx[1] * m_b->M_002 +
+               0.5f * dx[2] * dx[2] * m_b->M_010 + dx[1] * dx[2] * m_b->M_001 +
+               0.5f * dx[1] * dx[2] * dx[2] * m_b->M_000;
+  m_a->M_111 = m_b->M_111 + dx[0] * m_b->M_011 + dx[1] * m_b->M_101 +
+               dx[2] * m_b->M_110 + dx[0] * dx[1] * m_b->M_001 +
+               dx[0] * dx[2] * m_b->M_010 + dx[1] * dx[2] * m_b->M_100 +
+               dx[0] * dx[1] * dx[2] * m_b->M_000;
+#endif
 }
 
 /**
@@ -477,9 +613,6 @@ INLINE static void gravity_M2L(struct gravity_tensors *l_b,
 
   /* 0th order multipole term */
   l_b->pot.F_000 += m_a->M_000 * D_000(dx, dy, dz, r_inv);
-  l_b->a_x.F_000 += m_a->M_000 * D_100(dx, dy, dz, r_inv);
-  l_b->a_y.F_000 += m_a->M_000 * D_010(dx, dy, dz, r_inv);
-  l_b->a_z.F_000 += m_a->M_000 * D_001(dx, dy, dz, r_inv);
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
 
@@ -488,35 +621,11 @@ INLINE static void gravity_M2L(struct gravity_tensors *l_b,
   l_b->pot.F_000 += m_a->M_010 * D_010(dx, dy, dz, r_inv);
   l_b->pot.F_000 += m_a->M_001 * D_001(dx, dy, dz, r_inv);
 
-  l_b->a_x.F_000 += m_a->M_100 * D_200(dx, dy, dz, r_inv);
-  l_b->a_x.F_000 += m_a->M_010 * D_110(dx, dy, dz, r_inv);
-  l_b->a_x.F_000 += m_a->M_001 * D_101(dx, dy, dz, r_inv);
-
-  l_b->a_y.F_000 += m_a->M_100 * D_110(dx, dy, dz, r_inv);
-  l_b->a_y.F_000 += m_a->M_010 * D_020(dx, dy, dz, r_inv);
-  l_b->a_y.F_000 += m_a->M_001 * D_011(dx, dy, dz, r_inv);
-
-  l_b->a_z.F_000 += m_a->M_100 * D_101(dx, dy, dz, r_inv);
-  l_b->a_z.F_000 += m_a->M_010 * D_011(dx, dy, dz, r_inv);
-  l_b->a_z.F_000 += m_a->M_001 * D_002(dx, dy, dz, r_inv);
-
   /* 1st order multipole term */
   l_b->pot.F_100 += m_a->M_000 * D_100(dx, dy, dz, r_inv);
   l_b->pot.F_010 += m_a->M_000 * D_010(dx, dy, dz, r_inv);
   l_b->pot.F_001 += m_a->M_000 * D_001(dx, dy, dz, r_inv);
 
-  l_b->a_x.F_100 += m_a->M_000 * D_200(dx, dy, dz, r_inv);
-  l_b->a_x.F_010 += m_a->M_000 * D_110(dx, dy, dz, r_inv);
-  l_b->a_x.F_001 += m_a->M_000 * D_101(dx, dy, dz, r_inv);
-
-  l_b->a_y.F_100 += m_a->M_000 * D_110(dx, dy, dz, r_inv);
-  l_b->a_y.F_010 += m_a->M_000 * D_020(dx, dy, dz, r_inv);
-  l_b->a_y.F_001 += m_a->M_000 * D_011(dx, dy, dz, r_inv);
-
-  l_b->a_z.F_100 += m_a->M_000 * D_101(dx, dy, dz, r_inv);
-  l_b->a_z.F_010 += m_a->M_000 * D_011(dx, dy, dz, r_inv);
-  l_b->a_z.F_001 += m_a->M_000 * D_002(dx, dy, dz, r_inv);
-
 #endif
 
 #ifdef SWIFT_DEBUG_CHECKS
@@ -542,9 +651,6 @@ INLINE static void gravity_L2L(struct gravity_tensors *l_a,
 
   /* Shift 0th order term */
   l_a->pot.F_000 = l_b->pot.F_000;
-  l_a->a_x.F_000 = l_b->a_x.F_000;
-  l_a->a_y.F_000 = l_b->a_y.F_000;
-  l_a->a_z.F_000 = l_b->a_z.F_000;
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
   const double dx[3] = {pos_a[0] - pos_b[0], pos_a[1] - pos_b[1],
@@ -555,34 +661,11 @@ INLINE static void gravity_L2L(struct gravity_tensors *l_a,
   l_a->pot.F_000 += dx[1] * l_b->pot.F_010;
   l_a->pot.F_000 += dx[2] * l_b->pot.F_001;
 
-  l_a->a_x.F_000 += dx[0] * l_b->a_x.F_100;
-  l_a->a_x.F_000 += dx[1] * l_b->a_x.F_010;
-  l_a->a_x.F_000 += dx[2] * l_b->a_x.F_001;
-
-  l_a->a_y.F_000 += dx[0] * l_b->a_y.F_100;
-  l_a->a_y.F_000 += dx[1] * l_b->a_y.F_010;
-  l_a->a_y.F_000 += dx[2] * l_b->a_y.F_001;
-
-  l_a->a_z.F_000 += dx[0] * l_b->a_z.F_100;
-  l_a->a_z.F_000 += dx[1] * l_b->a_z.F_010;
-  l_a->a_z.F_000 += dx[2] * l_b->a_z.F_001;
-
   /* Shift 1st order multipole term */
   l_a->pot.F_100 = l_b->pot.F_100;
   l_a->pot.F_010 = l_b->pot.F_010;
   l_a->pot.F_001 = l_b->pot.F_001;
 
-  l_a->a_x.F_100 = l_b->a_x.F_100;
-  l_a->a_x.F_010 = l_b->a_x.F_010;
-  l_a->a_x.F_001 = l_b->a_x.F_001;
-
-  l_a->a_y.F_100 = l_b->a_y.F_100;
-  l_a->a_y.F_010 = l_b->a_y.F_010;
-  l_a->a_y.F_001 = l_b->a_y.F_001;
-
-  l_a->a_z.F_100 = l_b->a_z.F_100;
-  l_a->a_z.F_010 = l_b->a_z.F_010;
-  l_a->a_z.F_001 = l_b->a_z.F_001;
 #endif
 
 #ifdef SWIFT_DEBUG_CHECKS
@@ -606,29 +689,6 @@ INLINE static void gravity_L2P(const struct gravity_tensors *l_b,
 #endif
 
   /* 0th order interaction */
-  gp->a_grav[0] += l_b->a_x.F_000;
-  gp->a_grav[1] += l_b->a_y.F_000;
-  gp->a_grav[2] += l_b->a_z.F_000;
-
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-
-  const double dx[3] = {gp->x[0] - l_b->CoM[0], gp->x[1] - l_b->CoM[1],
-                        gp->x[2] - l_b->CoM[2]};
-
-  /* 1st order terms */
-  gp->a_grav[0] += dx[0] * l_b->a_x.F_100;
-  gp->a_grav[0] += dx[1] * l_b->a_x.F_010;
-  gp->a_grav[0] += dx[2] * l_b->a_x.F_001;
-
-  gp->a_grav[1] += dx[0] * l_b->a_y.F_100;
-  gp->a_grav[1] += dx[1] * l_b->a_y.F_010;
-  gp->a_grav[1] += dx[2] * l_b->a_y.F_001;
-
-  gp->a_grav[2] += dx[0] * l_b->a_z.F_100;
-  gp->a_grav[2] += dx[1] * l_b->a_z.F_010;
-  gp->a_grav[2] += dx[2] * l_b->a_z.F_001;
-
-#endif
 }
 
 #endif /* SWIFT_MULTIPOLE_H */