diff --git a/src/engine.c b/src/engine.c
index e9cb5977d6edc492ec7181bb0fbb9ed7f3767cc3..d8dc43d94992143364e2a133202b3412b1866f93 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -4421,6 +4421,11 @@ void engine_reconstruct_multipoles(struct engine *e) {
             clocks_getunit());
 }
 
+int count_in_hydro;
+int count_out_hydro;
+int count_in_grav;
+int count_out_grav;
+
 /**
  * @brief Create and fill the proxies.
  *
@@ -4438,7 +4443,7 @@ void engine_makeproxies(struct engine *e) {
   const double dim[3] = {s->dim[0], s->dim[1], s->dim[2]};
   const struct gravity_props *props = e->gravity_properties;
   const double theta_crit2 = props->theta_crit2;
-  ticks tic = getticks();
+  const ticks tic = getticks();
   const int with_hydro = (e->policy & engine_policy_hydro);
   const int with_gravity = (e->policy & engine_policy_self_gravity);
   double CoM_i[3] = {0., 0., 0.};
@@ -4488,7 +4493,21 @@ void engine_makeproxies(struct engine *e) {
               if (cells[cid].nodeID != nodeID && cells[cjd].nodeID != nodeID)
                 continue;
 
-              char proxy_type = proxy_cell_type_none;
+              int proxy_type = 0;
+
+              /* In the hydro case, only care about neighbours */
+              if (with_hydro) {
+
+                /* This is super-ugly but checks for direct neighbours */
+                /* with periodic BC */
+                if (((abs(i - ii) <= 1 || abs(i - ii - cdim[0]) <= 1 ||
+                      abs(i - ii + cdim[0]) <= 1) &&
+                     (abs(j - jj) <= 1 || abs(j - jj - cdim[1]) <= 1 ||
+                      abs(j - jj + cdim[1]) <= 1) &&
+                     (abs(k - kk) <= 1 || abs(k - kk - cdim[2]) <= 1 ||
+                      abs(k - kk + cdim[2]) <= 1)))
+                  proxy_type |= (int)proxy_cell_type_hydro;
+              }
 
               /* In the gravity case, check distances using the MAC. */
               if (with_gravity) {
@@ -4514,21 +4533,7 @@ void engine_makeproxies(struct engine *e) {
 
                 /* Are we too close for M2L? */
                 if (!gravity_M2L_accept(r_max_i, r_max_j, theta_crit2, r2))
-                  proxy_type |= proxy_cell_type_gravity;
-              }
-
-              /* In the hydro case, only care about neighbours */
-              if (with_hydro) {
-
-                /* This is super-ugly but checks for direct neighbours */
-                /* with periodic BC */
-                if (((abs(i - ii) <= 1 || abs(i - ii - cdim[0]) <= 1 ||
-                      abs(i - ii + cdim[0]) <= 1) &&
-                     (abs(j - jj) <= 1 || abs(j - jj - cdim[1]) <= 1 ||
-                      abs(j - jj + cdim[1]) <= 1) &&
-                     (abs(k - kk) <= 1 || abs(k - kk - cdim[2]) <= 1 ||
-                      abs(k - kk + cdim[2]) <= 1)))
-                  proxy_type |= proxy_cell_type_hydro;
+                  proxy_type |= (int)proxy_cell_type_gravity;
               }
 
               /* Abort if not in range at all */
@@ -4594,6 +4599,28 @@ void engine_makeproxies(struct engine *e) {
     }
   }
 
+  count_in_hydro = 0;
+  count_out_hydro = 0;
+  count_in_grav = 0;
+  count_out_grav = 0;
+  for (int pid = 0; pid < e->nr_proxies; pid++) {
+
+    /* Get a handle on the proxy. */
+    struct proxy *p = &e->proxies[pid];
+
+    for (int k = 0; k < p->nr_cells_in; k++) {
+      if (p->cells_in_type[k] & proxy_cell_type_hydro) ++count_in_hydro;
+      if (p->cells_in_type[k] & proxy_cell_type_gravity) ++count_in_grav;
+    }
+    for (int k = 0; k < p->nr_cells_out; k++) {
+      if (p->cells_out_type[k] & proxy_cell_type_hydro) ++count_out_hydro;
+      if (p->cells_out_type[k] & proxy_cell_type_gravity) ++count_out_grav;
+    }
+  }
+
+  message("in hydro: %d out hydro: %d", count_in_hydro, count_out_hydro);
+  message("in grav: %d out grav: %d", count_in_grav, count_out_grav);
+
   if (e->verbose)
     message("took %.3f %s.", clocks_from_ticks(getticks() - tic),
             clocks_getunit());
diff --git a/src/proxy.c b/src/proxy.c
index 47c5dad21b9864754107534b8cb7783cd1643d42..3a9a4e4d5ba82971092e7be5dce1f4717678e4b8 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -40,6 +40,11 @@
 /* Local headers. */
 #include "error.h"
 
+extern int count_in_hydro;
+extern int count_out_hydro;
+extern int count_in_grav;
+extern int count_out_grav;
+
 /**
  * @brief Exchange cells with a remote node.
  *
@@ -126,17 +131,22 @@ void proxy_cells_exch2(struct proxy *p) {
  * @param c The #cell.
  * @param type Why is this cell in the proxy (hdro, gravity, ...) ?
  */
-void proxy_addcell_in(struct proxy *p, struct cell *c, char type) {
+void proxy_addcell_in(struct proxy *p, struct cell *c, int type) {
+
+  if (type == proxy_cell_type_none) error("Invalid type for proxy");
 
   /* Check if the cell is already registered with the proxy. */
   for (int k = 0; k < p->nr_cells_in; k++)
-    if (p->cells_in[k] == c) return;
+    if (p->cells_in[k] == c) {
+
+      /* Update the type */
+      p->cells_in_type[k] = type;
+      return;
+    }
 
   /* Do we need to grow the number of in cells? */
   if (p->nr_cells_in == p->size_cells_in) {
 
-    message("Increasing proxy size");
-
     p->size_cells_in *= proxy_buffgrow;
 
     struct cell **temp_cell;
@@ -146,10 +156,10 @@ void proxy_addcell_in(struct proxy *p, struct cell *c, char type) {
     free(p->cells_in);
     p->cells_in = temp_cell;
 
-    char *temp_type;
-    if ((temp_type = malloc(sizeof(char) * p->size_cells_in)) == NULL)
+    int *temp_type;
+    if ((temp_type = malloc(sizeof(int) * p->size_cells_in)) == NULL)
       error("Failed to allocate incoming cell type list.");
-    memcpy(temp_type, p->cells_in_type, sizeof(char) * p->nr_cells_in);
+    memcpy(temp_type, p->cells_in_type, sizeof(int) * p->nr_cells_in);
     free(p->cells_in_type);
     p->cells_in_type = temp_type;
   }
@@ -167,11 +177,18 @@ void proxy_addcell_in(struct proxy *p, struct cell *c, char type) {
  * @param c The #cell.
  * @param type Why is this cell in the proxy (hdro, gravity, ...) ?
  */
-void proxy_addcell_out(struct proxy *p, struct cell *c, char type) {
+void proxy_addcell_out(struct proxy *p, struct cell *c, int type) {
+
+  if (type == proxy_cell_type_none) error("Invalid type for proxy");
 
   /* Check if the cell is already registered with the proxy. */
   for (int k = 0; k < p->nr_cells_out; k++)
-    if (p->cells_out[k] == c) return;
+    if (p->cells_out[k] == c) {
+
+      /* Update the type */
+      p->cells_out_type[k] |= type;
+      return;
+    }
 
   /* Do we need to grow the number of out cells? */
   if (p->nr_cells_out == p->size_cells_out) {
@@ -184,10 +201,10 @@ void proxy_addcell_out(struct proxy *p, struct cell *c, char type) {
     free(p->cells_out);
     p->cells_out = temp_cell;
 
-    char *temp_type;
-    if ((temp_type = malloc(sizeof(char) * p->size_cells_out)) == NULL)
+    int *temp_type;
+    if ((temp_type = malloc(sizeof(int) * p->size_cells_out)) == NULL)
       error("Failed to allocate outgoing cell type list.");
-    memcpy(temp_type, p->cells_out_type, sizeof(char) * p->nr_cells_out);
+    memcpy(temp_type, p->cells_out_type, sizeof(int) * p->nr_cells_out);
     free(p->cells_out_type);
     p->cells_out_type = temp_type;
   }
@@ -456,7 +473,7 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) {
     if ((p->cells_in =
              (struct cell **)malloc(sizeof(void *) * p->size_cells_in)) == NULL)
       error("Failed to allocate cells_in buffer.");
-    if ((p->cells_in_type = (char *)malloc(sizeof(char) * p->size_cells_in)) ==
+    if ((p->cells_in_type = (int *)malloc(sizeof(int) * p->size_cells_in)) ==
         NULL)
       error("Failed to allocate cells_in_type buffer.");
   }
@@ -466,8 +483,8 @@ void proxy_init(struct proxy *p, int mynodeID, int nodeID) {
     if ((p->cells_out = (struct cell **)malloc(sizeof(void *) *
                                                p->size_cells_out)) == NULL)
       error("Failed to allocate cells_out buffer.");
-    if ((p->cells_out_type =
-             (char *)malloc(sizeof(char) * p->size_cells_out)) == NULL)
+    if ((p->cells_out_type = (int *)malloc(sizeof(int) * p->size_cells_out)) ==
+        NULL)
       error("Failed to allocate cells_out_type buffer.");
   }
   p->nr_cells_out = 0;
diff --git a/src/proxy.h b/src/proxy.h
index e3249b0722145d17b26a7e47102961f3a83fe067..b45f6fcca86b0320a49b5c2b879539cbf8c73116 100644
--- a/src/proxy.h
+++ b/src/proxy.h
@@ -42,7 +42,7 @@
 enum proxy_cell_type {
   proxy_cell_type_none = 0,
   proxy_cell_type_hydro = (1 << 0),
-  proxy_cell_type_gravity = (1 << 1)
+  proxy_cell_type_gravity = (1 << 1),
 };
 
 /* Data structure for the proxy. */
@@ -53,13 +53,13 @@ struct proxy {
 
   /* Incoming cells. */
   struct cell **cells_in;
-  char *cells_in_type;
+  int *cells_in_type;
   struct pcell *pcells_in;
   int nr_cells_in, size_cells_in, size_pcells_in;
 
   /* Outgoing cells. */
   struct cell **cells_out;
-  char *cells_out_type;
+  int *cells_out_type;
   struct pcell *pcells_out;
   int nr_cells_out, size_cells_out, size_pcells_out;
 
@@ -98,8 +98,8 @@ void proxy_gparts_load(struct proxy *p, const struct gpart *gparts, int N);
 void proxy_sparts_load(struct proxy *p, const struct spart *sparts, int N);
 void proxy_parts_exch1(struct proxy *p);
 void proxy_parts_exch2(struct proxy *p);
-void proxy_addcell_in(struct proxy *p, struct cell *c, char type);
-void proxy_addcell_out(struct proxy *p, struct cell *c, char type);
+void proxy_addcell_in(struct proxy *p, struct cell *c, int type);
+void proxy_addcell_out(struct proxy *p, struct cell *c, int type);
 void proxy_cells_exch1(struct proxy *p);
 void proxy_cells_exch2(struct proxy *p);