diff --git a/src/Morton_shuffler.cpp b/src/Morton_shuffler.cpp
index 670ce2cf9deb5bd83b46e233cc4c5d09af27f823..b771b69b07bef0daf739b99dc742b31855f27c70 100644
--- a/src/Morton_shuffler.cpp
+++ b/src/Morton_shuffler.cpp
@@ -55,11 +55,9 @@ Morton_shuffler::~Morton_shuffler()
 
 int Morton_shuffler::shuffle(
         float *a,
+        float *rtmp,
         const char *base_fname)
 {
-    // array where shuffled data will be placed
-    float *rtmp = fftwf_alloc_real(this->drcubbie->local_size);
-
     // shuffle into z order
     ptrdiff_t z, zz;
     int rid, zid;
@@ -125,7 +123,6 @@ int Morton_shuffler::shuffle(
             base_fname,
             this->out_group*this->doutput->sizes[0]);
     this->doutput->write(temp_char, rtmp);
-    fftwf_free(rtmp);
     return EXIT_SUCCESS;
 }
 
diff --git a/src/Morton_shuffler.hpp b/src/Morton_shuffler.hpp
index 3e98ac323bbac60f8e5c70d7c24406197f6e2a48..431b437d817a48d0fcaafa983f663c5aa4799245 100644
--- a/src/Morton_shuffler.hpp
+++ b/src/Morton_shuffler.hpp
@@ -70,7 +70,10 @@ class Morton_shuffler
                 int nfiles);
         ~Morton_shuffler();
 
-        int shuffle(float *a, const char *base_fname);
+        int shuffle(
+                float *regular_data,
+                float *shuffled_data,
+                const char *base_fname);
 };
 
 #endif//MORTON_SHUFFLER
diff --git a/src/RMHD_converter.cpp b/src/RMHD_converter.cpp
index d368980df54946a238b7b81399927c97d4f526e7..3f8e1749e76c67a93630169d16e36fedca75ddad 100644
--- a/src/RMHD_converter.cpp
+++ b/src/RMHD_converter.cpp
@@ -133,7 +133,7 @@ int RMHD_converter::convert(
     // mix components
     this->f3r->interleave(this->r3, rtmp, 2);
 
-    this->s->shuffle(rtmp, ofile);
+    this->s->shuffle(rtmp, this->r3, ofile);
 
     fftwf_free(rtmp);
     return EXIT_SUCCESS;
diff --git a/src/field_descriptor.cpp b/src/field_descriptor.cpp
index df101d1b75bd62d8bc7b5ecd00d5b0405bd34045..df6fe39d583fa3024a93159a41882b5895d30d90 100644
--- a/src/field_descriptor.cpp
+++ b/src/field_descriptor.cpp
@@ -232,6 +232,7 @@ int field_descriptor::interleave(
         float *output,
         int dim)
 {
+    // TODO: implement inplace interleaver
     for (int k = 0; k < this->local_size; k++)
         for (int j = 0; j < dim; j++)
                 output[k*dim + j] = input[j*this->local_size + k];
diff --git a/test.ipynb b/test.ipynb
index da3b33fc4b6d26e6f111c98f39cb83a6f6476658..8a3ffb294494925123fd726303d1f8e1e9094b54 100644
--- a/test.ipynb
+++ b/test.ipynb
@@ -1,7 +1,7 @@
 {
  "metadata": {
   "name": "",
-  "signature": "sha256:3746adfc6567f394973ab357f8a68759f766ba127e0a9a388298c16ebbafbe4e"
+  "signature": "sha256:b66beda6c64119cb0725443436f940cc3d6a7269d12b4d537c8d44881b89be2c"
  },
  "nbformat": 3,
  "nbformat_minor": 0,
@@ -195,7 +195,7 @@
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 5
+     "prompt_number": 23
     },
     {
      "cell_type": "code",
@@ -226,7 +226,7 @@
        ]
       }
      ],
-     "prompt_number": 6
+     "prompt_number": 24
     },
     {
      "cell_type": "code",