diff --git a/hysop/backend/device/opencl/operator/poisson.py b/hysop/backend/device/opencl/operator/poisson.py
index 860efc46d52718026165fe40bfaf244da0d04be7..807f49a0b8091eb8b2ea82700eb3529937bea3ca 100644
--- a/hysop/backend/device/opencl/operator/poisson.py
+++ b/hysop/backend/device/opencl/operator/poisson.py
@@ -86,6 +86,7 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic):
     def setup(self, work):
         super(OpenClPoisson, self).setup(work)
         self._build_fft_plans(work)
+        self._build_ghost_exchanger()
 
     def _build_fft_plans(self, work):
         axes    = self.axes
@@ -116,6 +117,7 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic):
         self.forward_plans  = forward_plans
         self.backward_plans = backward_plans
         self.fft_buffer = fft_buffer
+        self.queue = queue
 
     def _build_callbacks(self):
         fp = dtype_to_ctype(self.dtype)
@@ -156,6 +158,8 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic):
         user_data = self.Kd.data
         return (forward_callbacks, user_data)
 
+    def _build_ghost_exchanger(self):
+        self._exchange_ghosts = self.dFout.exchange_ghosts(build_launcher=True)
 
     @op_apply
     def apply(self, **kwds):
@@ -163,4 +167,4 @@ class OpenClPoisson(PoissonOperatorBase, OpenClSymbolic):
         for (fp,bp) in zip(self.forward_plans, self.backward_plans):
             evt, = fp.enqueue()
             evt, = bp.enqueue()
-        self.dFout.exchange_ghosts()
+        evt = self._exchange_ghosts(queue=self.queue)
diff --git a/hysop/backend/device/opencl/operator/poisson_rotational.py b/hysop/backend/device/opencl/operator/poisson_rotational.py
index e8dc47a83f402a768f9e62b9cf599c8705154cb5..ef9bdf36fe322a37b60aba5e94ea2f6fdc8b56c5 100644
--- a/hysop/backend/device/opencl/operator/poisson_rotational.py
+++ b/hysop/backend/device/opencl/operator/poisson_rotational.py
@@ -95,6 +95,7 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic):
     def setup(self, work):
         super(OpenClPoissonRotational, self).setup(work)
         self._build_fft_plans(work)
+        self._build_ghost_exchanger()
 
     def _build_fft_plans(self, work):
         axes    = self.axes
@@ -134,6 +135,7 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic):
         self.forward_plans  = forward_plans
         self.backward_plans = backward_plans
         self.fft_buffer     = fft_buffer
+        self.queue          = queue
 
     def _build_forward_callbacks(self, i, in_array_offset):
         dtype = self.dtype
@@ -280,6 +282,8 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic):
         user_data = self.K1d.data
         return (backward_callbacks, user_data)
 
+    def _build_ghost_exchanger(self):
+        self._exchange_ghosts = self.dW.exchange_ghosts(build_launcher=True)
 
     @op_apply
     def apply(self, **kwds):
@@ -290,6 +294,4 @@ class OpenClPoissonRotational(PoissonRotationalOperatorBase, OpenClSymbolic):
             evt, = fp.enqueue()
         for bp in self.backward_plans:
             evt, = bp.enqueue()
-        evt = self.dW.exchange_ghosts()
-        if evt:
-            evt.wait()
+        evt = self._exchange_ghosts(queue=self.queue)
diff --git a/hysop/core/mpi/redistribute.py b/hysop/core/mpi/redistribute.py
index ecc1e30186b852cf1ea5e7b9f95c7184e511d514..8208e374ea1c5a937c8392f84fed9cf5547ccd40 100644
--- a/hysop/core/mpi/redistribute.py
+++ b/hysop/core/mpi/redistribute.py
@@ -53,7 +53,7 @@ def _memcpy(dst, src, target_indices, source_indices):
                     src_slices=source_indices, dst_slices=target_indices)
             evt = knl(queue=src.default_queue)
         elif (tkind==Backend.OPENCL):
-            assert (src.backend is dst.backend)
+            assert (src.backend.cl_env is dst.backend.cl_env)
             knl = OpenClCopyBufferRectLauncher.from_slices(varname='redistribute', src=src, dst=dst, 
                     src_slices=source_indices, dst_slices=target_indices)
             evt = knl(queue=src.default_queue)
diff --git a/hysop/fields/ghost_exchangers.py b/hysop/fields/ghost_exchangers.py
index e0dd169ee8bdadb9eae68af3da37ba8cefc6d988..dd57804e1f636739922e11d27d7240cc1463ca2e 100644
--- a/hysop/fields/ghost_exchangers.py
+++ b/hysop/fields/ghost_exchangers.py
@@ -176,6 +176,7 @@ class CartesianDiscreteFieldGhostExchanger(GhostExchanger):
             return tag
         
         dim             = self.dim
+        ghosts          = self.ghosts
         ghost_op        = self.ghost_op
         comm            = self.topology.comm
         local_rank      = self.topology.cart_rank
@@ -195,19 +196,20 @@ class CartesianDiscreteFieldGhostExchanger(GhostExchanger):
             lp.w_send_requests = {}
             lp.w_recv_requests = {}
 
-            if ghost_op is GhostOperation.EXCHANGE:
+            if (ghost_op is GhostOperation.EXCHANGE) and (dim>1):
                 # set all outer diagonal ghosts to NAN
                 for directions in all_outer_ghost_slices[dim]:
-                    for displacements in all_outer_ghost_slices[dim][directions]:
-                        ndisplacements = sum(d!=0 for d in displacements)
-                        if (ndisplacements != dim):
-                            continue
-                        slc, shape = all_outer_ghost_slices[dim][directions][displacements]
-                        value = default_invalid_value(dtype=base_dtype)
-                        lp.diagonal_ghosts.append((buf,slc,shape,value))
+                    if all(ghosts[d]>0 for d in directions):
+                        for displacements in all_outer_ghost_slices[dim][directions]:
+                            ndisplacements = sum(d!=0 for d in displacements)
+                            if (ndisplacements != dim):
+                                continue
+                            slc, shape = all_outer_ghost_slices[dim][directions][displacements]
+                            value = default_invalid_value(dtype=base_dtype)
+                            lp.diagonal_ghosts.append((buf,slc,shape,value))
 
             for d in self.directions:
-                if self.ghosts[d]==0:
+                if ghosts[d]==0:
                     continue
                 inner_left, inner_right, shape = self.inner_ghosts[d]
                 outer_left, outer_right, shape = self.outer_ghosts[d]