diff --git a/examples/groupless/multistep/reader_allsteps.cpp b/examples/groupless/multistep/reader_allsteps.cpp
index d710647fd7a57bd7c92017611aaa0e5994cac49a..07341753ab6a7c0a696dfd4b9177e1609e4dad8e 100644
--- a/examples/groupless/multistep/reader_allsteps.cpp
+++ b/examples/groupless/multistep/reader_allsteps.cpp
@@ -134,7 +134,8 @@ int main(int argc, char *argv[])
 
         adios::Variable<int> *vNproc = bpReader->InquireVariableInt("Nproc");
         Nwriters = vNproc->m_Data[0];
-        std::cout << "# of writers = " << Nwriters << std::endl;
+        if (rank == 0)
+            std::cout << "# of writers = " << Nwriters << std::endl;
 
         /* NX */
         /* There is a single value written once.
@@ -144,7 +145,8 @@ int main(int argc, char *argv[])
             bpReader->InquireVariableUInt("NX");
         Nx = vNX->m_Data[0];
         // bpReader->Read<unsigned int>("NX", &Nx);
-        std::cout << "NX = " << Nx << std::endl;
+        if (rank == 0)
+            std::cout << "NX = " << Nx << std::endl;
 
         /* NY */
         /* We can read all into a 1D array with a step selection.
@@ -159,7 +161,8 @@ int main(int argc, char *argv[])
         // ? How do we make a selection for an arbitrary list of steps ?
         vNY->SetStepSelection(0, vNY->GetNSteps());
         bpReader->Read<unsigned int>(*vNY, Nys.data());
-        Print1DArray(Nys.data(), Nys.size(), "NY");
+        if (rank == 0)
+            Print1DArray(Nys.data(), Nys.size(), "NY");
 
         /* ProcessID */
         adios::Variable<int> *vProcessID =
@@ -172,7 +175,8 @@ int main(int argc, char *argv[])
         }
         ProcessID.resize(vProcessID->m_Shape[0]);
         bpReader->Read<int>(*vProcessID, ProcessID.data());
-        Print1DArray(ProcessID.data(), ProcessID.size(), "ProcessID");
+        if (rank == 0)
+            Print1DArray(ProcessID.data(), ProcessID.size(), "ProcessID");
 
         /* Nparts */
         // Nparts local scalar is presented as a 1D array of Nwriters
@@ -184,8 +188,10 @@ int main(int argc, char *argv[])
             Make2DArray<unsigned int>(vNparts->GetNSteps(), Nwriters);
         vNparts->SetStepSelection(0, vNparts->GetNSteps());
         bpReader->Read<unsigned int>(*vNparts, Nparts[0]);
-        Print2DArray(Nparts, vNparts->GetNSteps(), Nwriters, "Nparts");
+        if (rank == 0)
+            Print2DArray(Nparts, vNparts->GetNSteps(), Nwriters, "Nparts");
         Delete2DArray(Nparts);
+        MPI_Barrier(MPI_COMM_WORLD);
 
         /*
          * GlobalArrayFixedDims
@@ -209,6 +215,9 @@ int main(int argc, char *argv[])
             count = gdim - (count * (nproc - 1));
         }
 
+        if (rank == 0)
+            std::cout << "GlobalArrayFixedDims parallel read" << std::endl;
+
         double **GlobalArrayFixedDims =
             Make2DArray<double>(vGlobalArrayFixedDims->GetNSteps(), count);
 
@@ -218,8 +227,19 @@ int main(int argc, char *argv[])
         vGlobalArrayFixedDims->SetStepSelection(
             0, vGlobalArrayFixedDims->GetNSteps());
         bpReader->Read<double>(*vGlobalArrayFixedDims, GlobalArrayFixedDims[0]);
+        MPI_Barrier(MPI_COMM_WORLD);
+        MPI_Status status;
+        int token = 0;
+        if (rank > 0)
+            MPI_Recv(&token, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status);
+        std::cout << "Rank " << rank << " read start = " << start
+                  << " count = " << count << std::endl;
         Print2DArray(GlobalArrayFixedDims, vGlobalArrayFixedDims->GetNSteps(),
                      count, "GlobalArrayFixedDims");
+        if (rank < nproc - 1)
+            MPI_Send(&token, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
+        Delete2DArray(GlobalArrayFixedDims);
+        MPI_Barrier(MPI_COMM_WORLD);
 
         /*
          * LocalArrayFixedDims
@@ -236,6 +256,7 @@ int main(int argc, char *argv[])
         }
         std::cout << "LocalArrayFixedDims is irregular. Cannot read this "
                      "variable yet...\n";
+        MPI_Barrier(MPI_COMM_WORLD);
 
         /*
          * LocalArrayFixedDimsJoined
@@ -243,9 +264,25 @@ int main(int argc, char *argv[])
         // inquiry about a variable, whose name we know
         adios::Variable<float> *vLocalArrayFixedDimsJoined =
             bpReader->InquireVariableFloat("LocalArrayFixedDimsJoined");
-        std::cout << "LocalArrayFixedDimsJoined ["
-                  << vLocalArrayFixedDimsJoined->m_Shape[0] << "]";
-        std::cout << " = Cannot read this variable yet...\n";
+        float **LocalArrayFixedDimsJoined =
+            Make2DArray<float>(vLocalArrayFixedDimsJoined->GetNSteps(),
+                               vLocalArrayFixedDimsJoined->m_Shape[0]);
+
+        // Make a 1D selection to describe the local dimensions of the variable
+        // we READ and its offsets in the global spaces
+        vLocalArrayFixedDimsJoined->SetSelection(
+            {0}, {vLocalArrayFixedDimsJoined->m_Shape[0]});
+        vLocalArrayFixedDimsJoined->SetStepSelection(
+            0, vLocalArrayFixedDimsJoined->GetNSteps());
+        bpReader->Read<float>(*vLocalArrayFixedDimsJoined,
+                              LocalArrayFixedDimsJoined[0]);
+        if (rank == 0)
+            Print2DArray(LocalArrayFixedDimsJoined,
+                         vLocalArrayFixedDimsJoined->GetNSteps(),
+                         vLocalArrayFixedDimsJoined->m_Shape[0],
+                         "LocalArrayFixedDimsJoined");
+        Delete2DArray(LocalArrayFixedDimsJoined);
+        MPI_Barrier(MPI_COMM_WORLD);
 
         /*
          * GlobalArray which changes size over time
@@ -262,6 +299,7 @@ int main(int argc, char *argv[])
                 "dimension is supposed to be adios::IrregularDim indicating an "
                 "Irregular array\n");
         }
+        MPI_Barrier(MPI_COMM_WORLD);
 
         // Close file/stream
         bpReader->Close();
@@ -292,6 +330,7 @@ int main(int argc, char *argv[])
     }
 
 #ifdef ADIOS2_HAVE_MPI
+    MPI_Barrier(MPI_COMM_WORLD);
     MPI_Finalize();
 #endif
     return 0;
diff --git a/source/adios2/engine/adios1/ADIOS1Reader.cpp b/source/adios2/engine/adios1/ADIOS1Reader.cpp
index 1fd84c523fc92274a409d062971d6e8bd93c2b08..2571139cbf93b40488b78787872b9b5412e47a82 100644
--- a/source/adios2/engine/adios1/ADIOS1Reader.cpp
+++ b/source/adios2/engine/adios1/ADIOS1Reader.cpp
@@ -173,99 +173,6 @@ ADIOS1Reader::InquireVariableCompound(const std::string &variableName,
     return nullptr;
 }
 
-//#include "core/adios_selection_util.h"
-//#include "core/util.h"
-void ADIOS1Reader::ReadJoinedArray(const std::string &name, const Dims &offs,
-                                   const Dims &ldims, const int fromStep,
-                                   const int nSteps, void *data)
-{
-#if 0
-    ADIOS_VARINFO *vi = adios_inq_var(m_fh, name.c_str());
-    if (vi)
-    {
-        /* Update blockinfo: calculate start offsets now */
-        adios_inq_var_blockinfo(m_fh, vi);
-        int block = 0;
-        int firstblock = 0; // first block in fromStep
-        for (int step = 0; step < vi->nsteps; step++)
-        {
-            uint64_t offs = 0;
-            if (step == fromStep)
-                firstblock = block;
-            for (int j = 0; j < vi->nblocks[step]; j++)
-            {
-                vi->blockinfo[block].start[0] = offs;
-                offs += vi->blockinfo[block].count[0];
-                ++block;
-            }
-        }
-        ADIOS_SELECTION *bb =
-            adios_selection_boundingbox(vi->ndim, offs.data(), ldims.data());
-        /* Implement block-based reading here and now */
-        for (int step = fromStep; step < fromStep + nSteps && step < vi->nsteps;
-             step++)
-        {
-            /* read blocks that intersect with the selection */
-            block = firstblock;
-            for (int j = 0; j < vi->nblocks[step]; j++)
-            {
-                ADIOS_SELECTION *blockbb = adios_selection_boundingbox(
-                    vi->ndim, vi->blockinfo[block].start,
-                    vi->blockinfo[block].count);
-                ADIOS_SELECTION *intersectbb =
-                    adios_selection_intersect_global(bb, blockbb);
-                if (intersectbb)
-                {
-                    size_t ele_num = 0;
-                    for (int i = 0; i < vi->ndim; i++)
-                        ele_num += vi->blockinfo[block].count[i];
-                    int size_of_type = adios_type_size(vi->type, nullptr);
-                    char *blockdata = malloc(ele_num * size_of_type);
-                    ADIOS_SELECTION *wb = adios_selection_writeblock(j);
-                    adios_schedule_read(m_fh, wb, name.c_str(), step, 1,
-                                        blockdata);
-                    adios_perform_reads(m_fh, 1);
-
-                    /* Copy data into place */
-                    uint64_t dst_stride;
-                    uint64_t src_stride;
-                    uint64_t dst_offset;
-                    uint64_t src_offset;
-                    std::vector<uint64_t> size_in_dset[32];
-
-                    /* determine how many (fastest changing) dimensions can we
-                     * copy in one swoop */
-                    int i;
-                    for (i = vi->ndim - 1; i > -1; i--)
-                    {
-                        if (blockbb->u.bb.start[i] == offs[i] &&
-                            blockbb->u.bb.count[i] == ldims[i])
-                        {
-                            datasize *= ldims[i];
-                        }
-                        else
-                            break;
-                    }
-
-                    adios_util_copy_data(data, blockdata, 0, vi->ndim,
-                                         size_in_dset.data(), bbsize,
-                                         ldims.data(), dst_stride, src_stride,
-                                         dst_offset, src_offset, ele_num,
-                                         size_of_type, adios_flag_no, vi->type);
-
-                    adios_selection_delete(intersectbb);
-                    free(blockdata);
-                }
-                adios_selection_delete(blockbb);
-                block++;
-            }
-        }
-        adios_selection_delete(bb);
-    }
-    adios_free_varinfo(vi);
-#endif
-}
-
 void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs,
                                       const Dims &ldims, const int fromStep,
                                       const int nSteps,
@@ -298,10 +205,6 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs,
             }
         }
     }
-    else if (readAsJoinedArray)
-    {
-        ReadJoinedArray(name, offs, ldims, fromStep, nSteps, data);
-    }
     else
     {
         uint64_t start[32], count[32];
@@ -313,7 +216,7 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs,
         ADIOS_SELECTION *sel = nullptr;
         if (ldims.size() > 0)
         {
-            adios_selection_boundingbox(ldims.size(), start, count);
+            sel = adios_selection_boundingbox(ldims.size(), start, count);
         }
         adios_schedule_read(m_fh, sel, name.c_str(), (int)fromStep, (int)nSteps,
                             data);