diff --git a/examples/groupless/basic/reader.cpp b/examples/groupless/basic/reader.cpp
index 3bdb56a2358dabab4dd99dee12dec4aa1fa3fcb5..9a1bf8d225901fc78657cb4ba069904288d48a9f 100644
--- a/examples/groupless/basic/reader.cpp
+++ b/examples/groupless/basic/reader.cpp
@@ -46,9 +46,16 @@ int main( int argc, char* argv [] )
         // this would just open with a default transport, which is "BP"
         auto bpReader = adios.Open( "myNumbers.bp", "r", bpReaderSettings );
 
+        // All the above is same as default use:
+        //auto bpReader = adios.Open( "myNumbers.bp", "r");
+
         if( bpReader == nullptr )
             throw std::ios_base::failure( "ERROR: failed to open ADIOS bpReader\n" );
 
+
+        /* Variable names are available as a vector of strings */
+        std::cout << "List of variables in file: " << bpReader->VariableNames << "\n";
+
         /* NX */
         bpReader->Read<unsigned int>( "NX", &Nx );  // read a Global scalar which has a single value in a step
 
@@ -63,9 +70,15 @@ int main( int argc, char* argv [] )
         // 1D array of Nwriters values.
         if( rank < Nwriters )
         {
+            std::shared_ptr<adios::Variable<void> > varNparts = bpReader.InquiryVariable("Nparts");
             std::unique_ptr<adios::Selection> selNparts = adios.SelectionBoundingBox( {1}, {rank} );
-            bpReader->Read<int>( "Nparts", selNparts, &Nparts );
+            varNparts->SetSelection( selNparts );
+            bpReader->Read<int>( varNparts, &Nparts );
         }
+        // or we could just read the whole array by every process
+        std::vector<int> partsV( Nwriters );
+        bpReader->Read<int>( "Nparts", &partsV ); // read with string name, no selection => read whole array
+
 
 
         /* Nice */
@@ -89,7 +102,8 @@ int main( int argc, char* argv [] )
         // Make a 1D selection to describe the local dimensions of the variable we READ and
         // its offsets in the global spaces
         std::unique_ptr<adios::Selection> bbsel = adios.SelectionBoundingBox( {ldim}, {offs} ); // local dims and offsets; both as list
-        bpReader->Read<double>( "Nice", bbsel, NiceArray.data() ); // Base class Engine own the Read<T> that will call overloaded Read from Derived
+        varNice->SetSelection( bbsel );
+        bpReader->Read<double>( varNice, NiceArray.data() );
 
 
 
@@ -112,30 +126,22 @@ int main( int argc, char* argv [] )
             RaggedArray.resize( ldim );
 
             std::unique_ptr<adios::Selection> wbsel = adios.SelectionWriteblock( rank );
-            bpReader->Read<float>( "Ragged", wbsel, RaggedArray.data() );
+            varRagged->SetSelection( wbsel );
+            bpReader->Read<float>( varRagged, RaggedArray.data() );
 
             // We can use bounding box selection as well
             std::unique_ptr<adios::Selection> rbbsel = adios.SelectionBoundingBox( {1,ldim}, {rank,0} );
-            bpReader->Read<float>( "Ragged", rbbsel, RaggedArray.data() );
+            varRagged->SetSelection( rbbsel );
+            bpReader->Read<float>( varRagged, RaggedArray.data() );
         }
 
         /* Extra help to process Ragged */
         int maxRaggedDim = varRagged->GetMaxGlobalDimensions(1); // contains the largest
-        vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
-
-
-
-        // promise to not read more from this step
-        bpReader->Release();
-
-        // want to move on to the next available step
-        //bpReader->Advance(adios::NextImmediateStep);
-        //bpReader->Advance(adios::NextAvailableStep);
-        bpReader->Advance(); // default is adios::NextAvailableStep
+        std::vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
 
 
         // Close file/stream
-        bpReader->Close( );
+        bpReader->Close();
     }
     catch( std::invalid_argument& e )
     {
diff --git a/examples/groupless/multistep/reader_allsteps.cpp b/examples/groupless/multistep/reader_allsteps.cpp
index 50438c0ae23aa4bce9e77dcc584c1f3a254a0971..46415c1bba62028d7773b0a54f8c28a3d7d562c2 100644
--- a/examples/groupless/multistep/reader_allsteps.cpp
+++ b/examples/groupless/multistep/reader_allsteps.cpp
@@ -25,7 +25,7 @@ int main( int argc, char* argv [] )
     //Application variable
     std::vector<double> NiceArray;
     std::vector<float> RaggedArray;
-    unsigned int Nx;
+
     int Nparts;
     int Nwriters;
     int Nsteps;
@@ -49,26 +49,55 @@ int main( int argc, char* argv [] )
         // this would just open with a default transport, which is "BP"
         auto bpReader = adios.Open( "myNumbers.bp", "r", bpReaderSettings );
 
+        // All the above is same as default use:
+        //auto bpReader = adios.Open( "myNumbers.bp", "r");
+
         if( bpReader == nullptr )
             throw std::ios_base::failure( "ERROR: failed to open ADIOS bpReader\n" );
 
+
+        /* Note: there is no global number of steps. Each variable has its own number of steps */
+
         /* NX */
+        /* There is a single value for each step. We can read all into a 1D array with a step selection.
+         * We can also just conveniently get the first with a simple read statement.
+         * Steps are not automatically presented as an array dimension and read does not read it as array.
+         */
+        unsigned int Nx;
         bpReader->Read<unsigned int>( "NX", &Nx );  // read a Global scalar which has a single value in a step
 
+        std::shared_ptr<adios::Variable<void> > varNx = bpReader.InquiryVariable("Nx");
+        std::vector<int> Nxs( varNx->nsteps() );  // number of steps available
+        // make a StepSelection to select multiple steps. Args: From, #of consecutive steps
+        std::unique_ptr<adios::StepSelection> stepsNx = adios.StepSelection( 0, varNx->nsteps() );
+        // ? How do we make a selection for an arbitrary list of steps ?
+        varNX.SetStepSelection( stepsNx );
+        bpReader->Read<unsigned int>( varNx, Nxs.data() );
+
+        auto itmax = std::max_element(std::begin(Nxs), std::end(Nxs));
+        auto itmin = std::min_element(std::begin(Nxs), std::end(Nxs));
+        if (*itmin != *itmax)
+        {
+            throw std::ios_base::failure( "ERROR: NX is not the same at all steps!\n" );
+        }
+
+
         /* nproc */
         bpReader->Read<int>( "nproc", &Nwriters );  // also a global scalar
 
 
+
         /* Nparts */
         // Nparts local scalar is presented as a 1D array of Nwriters elements.
-        // We need to read a specific value the same way as reading from any 1D array.
-        // Make a single-value selection to describe our rank's position in the
-        // 1D array of Nwriters values.
-        if( rank < Nwriters )
-        {
-            std::unique_ptr<adios::Selection> selNparts = adios.SelectionBoundingBox( {1}, {rank} );
-            bpReader->Read<int>( "Nparts", selNparts, &Nparts );
-        }
+        // We can read all steps into a 2D array of nproc * Nwriters
+        std::shared_ptr<adios::Variable<void> > varNparts = bpReader.InquiryVariable("Nparts");
+        std::vector<int> partsV( Nproc*Nwriters );
+        varNparts->SetStepSelection(
+                                    adios.StepSelection( 0, varNparts->nsteps() )
+                                   );
+        bpReader->Read<int>( varNparts, partsV.data() ); // missing spatial selection = whole array at each step
+
+
 
 
         /* Nice */
@@ -124,20 +153,14 @@ int main( int argc, char* argv [] )
 
         /* Extra help to process Ragged */
         int maxRaggedDim = varRagged->GetMaxGlobalDimensions(1); // contains the largest
-        vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
+        std::vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
 
 
 
-        // promise to not read more from this step
-        bpReader->Release();
 
-        // want to move on to the next available step
-        //bpReader->Advance(adios::NextImmediateStep);
-        //bpReader->Advance(adios::NextAvailableStep);
-        bpReader->Advance(); // default is adios::NextAvailableStep
 
         // Close file/stream
-        bpReader->Close( );
+        bpReader->Close();
 
     }
     catch( std::invalid_argument& e )
diff --git a/examples/groupless/multistep/reader_stepping.cpp b/examples/groupless/multistep/reader_stepping.cpp
index c049ebef489c6389c3072652e434e09ebc3d4099..3bf7022e9e0c3b2ea136a6c7280ce956d57595e2 100644
--- a/examples/groupless/multistep/reader_stepping.cpp
+++ b/examples/groupless/multistep/reader_stepping.cpp
@@ -50,104 +50,110 @@ int main( int argc, char* argv [] )
         {
             auto bpReader = adios.Open( "myNumbers.bp", "r", bpReaderSettings );
 
-        while (true)
-        {
-            /* NX */
-            bpReader->Read<unsigned int>( "NX", &Nx );  // read a Global scalar which has a single value in a step
+            while (true)
+            {
+                /* NX */
+                bpReader->Read<unsigned int>( "NX", &Nx );  // read a Global scalar which has a single value in a step
 
-            /* nproc */
-            bpReader->Read<int>( "nproc", &Nwriters );  // also a global scalar
+                /* nproc */
+                bpReader->Read<int>( "nproc", &Nwriters );  // also a global scalar
 
 
-            /* Nparts */
-            // Nparts local scalar is presented as a 1D array of Nwriters elements.
-            // We need to read a specific value the same way as reading from any 1D array.
-            // Make a single-value selection to describe our rank's position in the
-            // 1D array of Nwriters values.
-            if( rank < Nwriters )
-            {
-                std::unique_ptr<adios::Selection> selNparts = adios.SelectionBoundingBox( {1}, {rank} );
-                bpReader->Read<int>( "Nparts", selNparts, &Nparts );
-            }
+                /* Nparts */
+                // Nparts local scalar is presented as a 1D array of Nwriters elements.
+                // We can read all as a 1D array
+                std::vector<int> partsV( Nwriters );
+                bpReader->Read<int>( "Nparts", &partsV ); // read with string name, no selection => read whole array
 
 
-            /* Nice */
-            // inquiry about a variable, whose name we know
-            std::shared_ptr<adios::Variable<void> > varNice = bpReader.InquiryVariable("Nice");
+                /* Nice */
+                // inquiry about a variable, whose name we know
+                std::shared_ptr<adios::Variable<void> > varNice = bpReader.InquiryVariable("Nice");
 
-            if( varNice == nullptr )
-                throw std::ios_base::failure( "ERROR: failed to find variable 'myDoubles' in input file\n" );
+                if( varNice == nullptr )
+                    throw std::ios_base::failure( "ERROR: failed to find variable 'myDoubles' in input file\n" );
 
-            // ? how do we know about the type? std::string varNice->m_Type
-            unsigned long long int gdim = varMyDoubles->m_GlobalDimensions[0];  // ?member var or member func?
-            unsigned long long int ldim = gdim / nproc;
-            unsigned long long int offs = rank * ldim;
-            if( rank == nproc-1 )
-            {
-                ldim = gdim - (ldim * gdim);
-            }
-
-            NiceArray.reserve(ldim);
+                // ? how do we know about the type? std::string varNice->m_Type
+                unsigned long long int gdim = varMyDoubles->m_GlobalDimensions[0];  // ?member var or member func?
+                unsigned long long int ldim = gdim / nproc;
+                unsigned long long int offs = rank * ldim;
+                if( rank == nproc-1 )
+                {
+                    ldim = gdim - (ldim * gdim);
+                }
 
-            // Make a 1D selection to describe the local dimensions of the variable we READ and
-            // its offsets in the global spaces
-            std::unique_ptr<adios::Selection> bbsel = adios.SelectionBoundingBox( {ldim}, {offs} ); // local dims and offsets; both as list
-            bpReader->Read<double>( "Nice", bbsel, NiceArray.data() ); // Base class Engine own the Read<T> that will call overloaded Read from Derived
+                NiceArray.reserve(ldim);
 
+                // Make a 1D selection to describe the local dimensions of the variable we READ and
+                // its offsets in the global spaces
+                std::unique_ptr<adios::Selection> bbsel = adios.SelectionBoundingBox( {ldim}, {offs} ); // local dims and offsets; both as list
+                varNice->SetSelection( bbsel );
+                bpReader->Read<double>( varNice, NiceArray.data() );
 
 
-            /* Ragged */
-            // inquiry about a variable, whose name we know
-            std::shared_ptr<adios::Variable<void> > varRagged = bpReader.InquiryVariable("Ragged");
-            if( varRagged->m_GlobalDimensions[1] != adios::VARYING_DIMENSION)
-            {
-                throw std::ios_base::failure( "Unexpected condition: Ragged array's fast dimension "
-                        "is supposed to be VARYING_DIMENSION\n" );
-            }
-            // We have here varRagged->sum_nblocks, nsteps, nblocks[], global
-            if( rank < varRagged->nblocks[0] ) // same as rank < Nwriters in this example
-            {
-                // get per-writer size information
-                varRagged->InquiryBlocks();
-                // now we have the dimensions per block
+                /* Ragged */
+                // inquiry about a variable, whose name we know
+                std::shared_ptr<adios::Variable<void> > varRagged = bpReader.InquiryVariable("Ragged");
+                if( varRagged->m_GlobalDimensions[1] != adios::VARYING_DIMENSION)
+                {
+                    throw std::ios_base::failure( "Unexpected condition: Ragged array's fast dimension "
+                            "is supposed to be VARYING_DIMENSION\n" );
+                }
+                // We have here varRagged->sum_nblocks, nsteps, nblocks[], global
+                if( rank < varRagged->nblocks[0] ) // same as rank < Nwriters in this example
+                {
+                    // get per-writer size information
+                    varRagged->InquiryBlocks();
+                    // now we have the dimensions per block
 
-                unsigned long long int ldim = varRagged->blockinfo[rank].m_Dimensions[0];
-                RaggedArray.resize( ldim );
+                    unsigned long long int ldim = varRagged->blockinfo[rank].m_Dimensions[0];
+                    RaggedArray.resize( ldim );
 
-                std::unique_ptr<adios::Selection> wbsel = adios.SelectionWriteblock( rank );
-                bpReader->Read<float>( "Ragged", wbsel, RaggedArray.data() );
+                    std::unique_ptr<adios::Selection> wbsel = adios.SelectionWriteblock( rank );
+                    varRagged->SetSelection( wbsel );
+                    bpReader->Read<float>( varRagged, RaggedArray.data() );
 
-                // We can use bounding box selection as well
-                std::unique_ptr<adios::Selection> rbbsel = adios.SelectionBoundingBox( {1,ldim}, {rank,0} );
-                bpReader->Read<float>( "Ragged", rbbsel, RaggedArray.data() );
-            }
+                    // We can use bounding box selection as well
+                    std::unique_ptr<adios::Selection> rbbsel = adios.SelectionBoundingBox( {1,ldim}, {rank,0} );
+                    varRagged->SetSelection( rbbsel );
+                    bpReader->Read<float>( varRagged, RaggedArray.data() );
+                }
 
-            /* Extra help to process Ragged */
-            int maxRaggedDim = varRagged->GetMaxGlobalDimensions(1); // contains the largest
-            vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
+                /* Extra help to process Ragged */
+                int maxRaggedDim = varRagged->GetMaxGlobalDimensions(1); // contains the largest
+                std::vector<int> raggedDims = varRagged->GetVaryingGlobalDimensions(1); // contains all individual sizes in that dimension
 
 
 
-            // promise to not read more from this step
-            bpReader->Release();
+                // promise to not read more from this step
+                bpReader->Release();
 
-            // want to move on to the next available step
-            //bpReader->Advance(adios::NextImmediateStep);
-            //bpReader->Advance(adios::NextAvailableStep);
-            bpReader->Advance(); // default is adios::NextAvailableStep
+                // want to move on to the next available step
+                //bpReader->Advance(adios::NextStep);
+                //bpReader->Advance(adios::LatestStep);
+                bpReader->Advance(); // default is adios::NextStep
 
-        }
+            }
 
-        // Close file/stream
-        bpReader->Close( );
+            // Close file/stream
+            bpReader->Close();
 
         }
         catch( adios::end_of_stream& e )
         {
+            if( rank == 0 )
+            {
+                std::cout << "Reached end of stream, end processing loop.\n";
+            }
+            // Close file/stream
+            bpReader->Close();
         }
         catch( adios::file_not_found& e )
         {
-
+            if( rank == 0 )
+            {
+                std::cout << "File/stream does not exist, quit.\n";
+            }
         }
     }
     catch( std::invalid_argument& e )