diff --git a/source/adios2/core/VariableBase.h b/source/adios2/core/VariableBase.h
index ad81e63ea15cfdbfab9211aa0d26c6b4e5ca8013..c8953777d82669384fac8bf66d6c37ca4365f392 100644
--- a/source/adios2/core/VariableBase.h
+++ b/source/adios2/core/VariableBase.h
@@ -145,18 +145,40 @@ public:
         ConvertUint64VectorToSizetVector(sel.m_Start, m_MemoryOffsets);
     }
 
+    /**
+     * Set the steps for the variable to read from. The pointer passed at
+     * reading must be able to hold enough memory to store multiple steps in a
+     * single read.
+     * @param fromStep  The first step to read. Steps start from 0
+     * @param nSteps    Number of consecutive steps to read at once.
+     *
+     */
+    void SetStepSelection(const unsigned int fromStep,
+                          const unsigned int nSteps)
+    {
+        m_ReadFromStep = fromStep;
+        m_ReadNSteps = nSteps;
+    }
+
     /** Return the number of steps available for the variable
      *  @return Number of steps
      */
-    unsigned int GetNSteps() { return m_nsteps; }
+    unsigned int GetNSteps() { return m_NStepsAvailable; }
 
     ///< Should only be called by read engines
-    void SetNSteps(unsigned int steps) { m_nsteps = steps; }
+    void SetNSteps(unsigned int steps) { m_NStepsAvailable = steps; }
+    unsigned int GetReadFromStep() { return m_ReadFromStep; }
+    unsigned int GetReadNSteps() { return m_ReadNSteps; }
 
 private:
+    ///< Read from this step (must be 0 in staging)
+    unsigned int m_ReadFromStep = 0;
+    ///< Read this many steps at once (must be 1 in staging)
+    unsigned int m_ReadNSteps = 1;
+
     /* Values filled by InquireVariable() */
-    unsigned int m_nsteps =
-        1; ///< number of steps available in a file (or 1 in staging),
+    ///< number of steps available in a file (or 1 in staging),
+    unsigned int m_NStepsAvailable = 1;
 };
 
 } // end namespace
diff --git a/source/adios2/engine/adios1/ADIOS1Reader.cpp b/source/adios2/engine/adios1/ADIOS1Reader.cpp
index 680e2186f16c45fb8be18342861e9ad2ed62a8b6..407b93c59b99134489acd3d178cce45a5ad70366 100644
--- a/source/adios2/engine/adios1/ADIOS1Reader.cpp
+++ b/source/adios2/engine/adios1/ADIOS1Reader.cpp
@@ -173,9 +173,9 @@ ADIOS1Reader::InquireVariableCompound(const std::string &variableName,
     return nullptr;
 }
 
-void ADIOS1Reader::ScheduleReadCommon(const std::string &name,
-                                      const Dims &ldims, const Dims &offs,
-                                      void *data)
+void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs,
+                                      const Dims &ldims, const int fromStep,
+                                      const int nSteps, void *data)
 {
 
     uint64_t start[32], count[32];
@@ -184,100 +184,120 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name,
         start[i] = (uint64_t)offs[i];
         count[i] = (uint64_t)ldims[i];
     }
-    ADIOS_SELECTION *sel =
+    ADIOS_SELECTION *sel = nullptr;
+    if (ldims.size() > 0)
+    {
         adios_selection_boundingbox(ldims.size(), start, count);
-    adios_schedule_read(m_fh, sel, name.c_str(), 1, 0, data);
+    }
+    adios_schedule_read(m_fh, sel, name.c_str(), (int)fromStep, (int)nSteps,
+                        data);
     adios_selection_delete(sel);
 }
 
 void ADIOS1Reader::ScheduleRead(Variable<char> &variable, char *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<unsigned char> &variable,
                                 unsigned char *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<short> &variable, short *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<unsigned short> &variable,
                                 unsigned short *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<int> &variable, int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<unsigned int> &variable,
                                 unsigned int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<long int> &variable, long int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<unsigned long int> &variable,
                                 unsigned long int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<long long int> &variable,
                                 long long int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<unsigned long long int> &variable,
                                 unsigned long long int *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<float> &variable, float *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<double> &variable, double *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<long double> &variable,
                                 long double *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<std::complex<float>> &variable,
                                 std::complex<float> *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<std::complex<double>> &variable,
                                 std::complex<double> *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 void ADIOS1Reader::ScheduleRead(Variable<std::complex<long double>> &variable,
                                 std::complex<long double> *values)
 {
-    ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start,
+    ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count,
+                       variable.GetReadFromStep(), variable.GetReadNSteps(),
                        (void *)values);
 }
 
diff --git a/source/adios2/engine/adios1/ADIOS1Reader.h b/source/adios2/engine/adios1/ADIOS1Reader.h
index cd455f2a74b39cd9e86154d3da9287b229415486..15f6ce7426f49c9b3ca59b7e0295603bf0c8d4a8 100644
--- a/source/adios2/engine/adios1/ADIOS1Reader.h
+++ b/source/adios2/engine/adios1/ADIOS1Reader.h
@@ -169,8 +169,6 @@ private:
     Variable<T> *InquireVariableCommon(const std::string &name,
                                        const bool readIn)
     {
-        std::cout << "Hello ADIOS1Reader::InquireVariableCommon\n";
-
         // here read variable metadata (dimensions, type, etc.)...then create a
         // Variable like below:
         // Variable<T>& variable = m_ADIOS.DefineVariable<T>( m_Name + "/" +
@@ -202,8 +200,9 @@ private:
         return var;
     }
 
-    void ScheduleReadCommon(const std::string &name, const Dims &ldims,
-                            const Dims &offs, void *data);
+    void ScheduleReadCommon(const std::string &name, const Dims &offs,
+                            const Dims &ldims, const int fromStep,
+                            const int nSteps, void *data);
 
     bool CheckADIOS1TypeCompatibility(const std::string &name,
                                       std::string adios2Type,
diff --git a/source/adios2/engine/adios1/ADIOS1Writer.cpp b/source/adios2/engine/adios1/ADIOS1Writer.cpp
index 5d5f547e5bc63acec28fe8f4282ca0336b30988e..801adcb7c636fe73b1e99a1e261762f0138ba10f 100644
--- a/source/adios2/engine/adios1/ADIOS1Writer.cpp
+++ b/source/adios2/engine/adios1/ADIOS1Writer.cpp
@@ -117,10 +117,10 @@ static std::string DimsToCSV_LocalAware(const std::vector<std::size_t> &dims)
         dimsCSV.pop_back();
     }
 
-    if (localVar)
+    /*if (localVar)
     {
         dimsCSV.clear();
-    }
+    }*/
 
     return dimsCSV;
 }