diff --git a/bindings/python/EnginePy.cpp b/bindings/python/EnginePy.cpp
index 3120be8a4f2445a43aa5112106494056bdc23340..f2f20b5ec6e21df69f83f64afe581213509d7e9e 100644
--- a/bindings/python/EnginePy.cpp
+++ b/bindings/python/EnginePy.cpp
@@ -18,10 +18,8 @@ namespace adios2
 {
 
 EnginePy::EnginePy(IO &io, const std::string &name, const Mode openMode,
-                   MPI_Comm mpiComm,
-                   std::map<std::string, VariableBase> &variablesPlaceholder)
-: m_Engine(io.Open(name, openMode, mpiComm)),
-  m_VariablesPlaceholder(variablesPlaceholder), m_DebugMode(io.m_DebugMode)
+                   MPI_Comm mpiComm)
+: m_Engine(io.Open(name, openMode, mpiComm)), m_DebugMode(io.m_DebugMode)
 {
 }
 
@@ -29,8 +27,6 @@ void EnginePy::BeginStep() { m_Engine.BeginStep(); }
 
 void EnginePy::PutSync(VariableBase *variable, const pybind11::array &array)
 {
-    DefineInIO(variable, array);
-
     if (variable->m_Type == "compound")
     {
         // not supported
@@ -57,15 +53,12 @@ void EnginePy::PutSync(VariableBase *variable, const pybind11::array &array)
 
 void EnginePy::PutSync(VariableBase *variable, const std::string &string)
 {
-    DefineInIO(variable, string);
     m_Engine.PutSync(*dynamic_cast<adios2::Variable<std::string> *>(variable),
                      string);
 }
 
 void EnginePy::PutDeferred(VariableBase *variable, const pybind11::array &array)
 {
-    DefineInIO(variable, array);
-
     if (variable->m_Type == "compound")
     {
         // not supported
@@ -92,7 +85,6 @@ void EnginePy::PutDeferred(VariableBase *variable, const pybind11::array &array)
 
 void EnginePy::PutDeferred(VariableBase *variable, const std::string &string)
 {
-    DefineInIO(variable, string);
     m_Engine.PutDeferred(
         *dynamic_cast<adios2::Variable<std::string> *>(variable), string);
 }
@@ -196,51 +188,11 @@ void EnginePy::PerformGets() { m_Engine.PerformGets(); }
 
 void EnginePy::EndStep() { m_Engine.EndStep(); }
 
+void EnginePy::WriteStep() { m_Engine.WriteStep(); }
+
 void EnginePy::Close(const int transportIndex)
 {
     m_Engine.Close(transportIndex);
 }
 
-// PRIVATE
-void EnginePy::DefineInIO(VariableBase *variable, const pybind11::array &array)
-{
-    if (variable->m_Type.empty()) // Define in IO
-    {
-        auto &io = m_Engine.GetIO();
-
-        if (array.is(pybind11::array()))
-        {
-            if (m_DebugMode)
-            {
-                throw std::invalid_argument(
-                    "ERROR: passing an empty numpy array for variable " +
-                    variable->m_Name + ", in call to Put/Get");
-            }
-        }
-#define declare_type(T)                                                        \
-    else if (pybind11::isinstance<                                             \
-                 pybind11::array_t<T, pybind11::array::c_style>>(array))       \
-    {                                                                          \
-        variable = &io.DefineVariable<T>(variable->m_Name, variable->m_Shape,  \
-                                         variable->m_Start, variable->m_Count, \
-                                         variable->m_ConstantDims);            \
-        m_VariablesPlaceholder.erase(variable->m_Name);                        \
-    }
-        ADIOS2_FOREACH_NUMPY_TYPE_1ARG(declare_type)
-#undef declare_type
-    }
-}
-
-void EnginePy::DefineInIO(VariableBase *variable, const std::string &string)
-{
-    if (variable->m_Type.empty()) // Define in IO
-    {
-        auto &io = m_Engine.GetIO();
-        variable = &io.DefineVariable<std::string>(
-            variable->m_Name, variable->m_Shape, variable->m_Start,
-            variable->m_Count, variable->m_ConstantDims);
-        m_VariablesPlaceholder.erase(variable->m_Name);
-    }
-}
-
 } // end namespace adios2
diff --git a/bindings/python/EnginePy.h b/bindings/python/EnginePy.h
index 7ef45d27fdcaa1867dd651abdcba9fa4039e4ddf..e3ef97538ef6dd61faf7b94ec86a36b76bfb7208 100644
--- a/bindings/python/EnginePy.h
+++ b/bindings/python/EnginePy.h
@@ -27,8 +27,7 @@ class EnginePy
 
 public:
     EnginePy(IO &io, const std::string &name, const Mode openMode,
-             MPI_Comm mpiComm,
-             std::map<std::string, VariableBase> &variablesPlaceholder);
+             MPI_Comm mpiComm);
 
     ~EnginePy() = default;
 
@@ -52,15 +51,13 @@ public:
 
     void EndStep();
 
+    void WriteStep();
+
     void Close(const int transportIndex = -1);
 
 private:
     Engine &m_Engine;
-    std::map<std::string, VariableBase> &m_VariablesPlaceholder;
     const bool m_DebugMode;
-
-    void DefineInIO(VariableBase *variable, const pybind11::array &array);
-    void DefineInIO(VariableBase *variable, const std::string &string);
 };
 
 } // end namespace adios2
diff --git a/bindings/python/IOPy.cpp b/bindings/python/IOPy.cpp
index e9f14099301189b6690ccb2f03ff0bc52ccfd094..78e065b3755124da41722114a82d19b38e256f12 100644
--- a/bindings/python/IOPy.cpp
+++ b/bindings/python/IOPy.cpp
@@ -42,30 +42,15 @@ unsigned int IOPy::AddTransport(const std::string type,
     return m_IO.AddTransport(type, parameters);
 }
 
-VariableBase &IOPy::DefineVariable(const std::string &name, const Dims &shape,
+VariableBase *IOPy::DefineVariable(const std::string &name, const Dims &shape,
                                    const Dims &start, const Dims &count,
                                    const bool isConstantDims,
                                    pybind11::array &array)
 {
-    if (m_DebugMode)
-    {
-        if (m_VariablesPlaceholder.count(name) == 1)
-        {
-            throw std::invalid_argument("ERROR: variable " + name +
-                                        " already exists, in "
-                                        "call to DefineVariable\n");
-        }
-    }
-
     VariableBase *variable = nullptr;
 
-    if (array.is(pybind11::array()))
+    if (false)
     {
-        // put in placeholder
-        auto itVariableEmplace = m_VariablesPlaceholder.emplace(
-            name, VariableBase(name, "unknown", 0, shape, start, count,
-                               isConstantDims, m_DebugMode));
-        variable = &itVariableEmplace.first->second;
     }
 #define declare_type(T)                                                        \
     else if (pybind11::isinstance<                                             \
@@ -89,33 +74,16 @@ VariableBase &IOPy::DefineVariable(const std::string &name, const Dims &shape,
         }
     }
 
-    return *variable;
+    return variable;
 }
 
 VariableBase *IOPy::InquireVariable(const std::string &name) noexcept
 {
-    // first check in placeholder
-    if (!m_VariablesPlaceholder.empty())
-    {
-        auto itVariablePlaceholder = m_VariablesPlaceholder.find(name);
-
-        if (itVariablePlaceholder != m_VariablesPlaceholder.end())
-        {
-            return &itVariablePlaceholder->second;
-        }
-    }
-
     const std::string type(m_IO.InquireVariableType(name));
-    if (type.empty())
-    {
-        return nullptr;
-    }
-
     adios2::VariableBase *variable = nullptr;
 
-    if (type == "compound")
+    if (type == "unknown")
     {
-        // not supported
     }
 #define declare_template_instantiation(T)                                      \
     else if (type == adios2::GetType<T>())                                     \
@@ -131,7 +99,7 @@ VariableBase *IOPy::InquireVariable(const std::string &name) noexcept
 EnginePy IOPy::Open(const std::string &name, const int openMode)
 {
     return EnginePy(m_IO, name, static_cast<adios2::Mode>(openMode),
-                    m_IO.m_MPIComm, m_VariablesPlaceholder);
+                    m_IO.m_MPIComm);
 }
 
 } // end namespace adios2
diff --git a/bindings/python/IOPy.h b/bindings/python/IOPy.h
index 8104f7a4c090e482dca81135d10fa6670592a357..a52e75085292a7dc02e82955abe00131bf0ad9b4 100644
--- a/bindings/python/IOPy.h
+++ b/bindings/python/IOPy.h
@@ -39,7 +39,7 @@ public:
 
     const Params &GetParameters() const noexcept;
 
-    VariableBase &DefineVariable(const std::string &name, const Dims &shape,
+    VariableBase *DefineVariable(const std::string &name, const Dims &shape,
                                  const Dims &start, const Dims &count,
                                  const bool isConstantDims,
                                  pybind11::array &array);
@@ -50,11 +50,6 @@ public:
 
 private:
     const bool m_DebugMode;
-    /**
-     *  Placeholder map needed as Variables are not created in ADIOS at
-     *  DefineVariable, but until Put when type is known from numpy
-     */
-    std::map<std::string, VariableBase> m_VariablesPlaceholder;
 };
 
 } // end namespace adios2
diff --git a/bindings/python/gluePyBind11.cpp b/bindings/python/gluePyBind11.cpp
index 374b72a11313a8289d6215a0943a4164186b28cc..012a069179267436594fdc56d9e7ce1bec9ac9d9 100644
--- a/bindings/python/gluePyBind11.cpp
+++ b/bindings/python/gluePyBind11.cpp
@@ -135,6 +135,7 @@ PYBIND11_MODULE(adios2, m)
 
     pybind11::class_<adios2::VariableBase>(m, "Variable")
         .def("SetSelection", &adios2::VariableBase::SetSelection)
+        .def("SetStepSelection", &adios2::VariableBase::SetStepSelection)
         .def("SelectionSize", &adios2::VariableBase::SelectionSize);
 
     pybind11::class_<adios2::IOPy>(m, "IOPy")
@@ -188,6 +189,7 @@ PYBIND11_MODULE(adios2, m)
                                 adios2::EnginePy::GetDeferred)
         .def("PerformGets", &adios2::EnginePy::PerformGets)
         .def("EndStep", &adios2::EnginePy::EndStep)
+        .def("WriteStep", &adios2::EnginePy::WriteStep)
         .def("Close", &adios2::EnginePy::Close,
              pybind11::arg("transportIndex") = -1);
 }
diff --git a/examples/hello/bpReader/helloBPReaderHeatMap2D.py b/examples/hello/bpReader/helloBPReaderHeatMap2D.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b5ff89e9016ab74ab8e456cbeb97b10ff98290e
--- /dev/null
+++ b/examples/hello/bpReader/helloBPReaderHeatMap2D.py
@@ -0,0 +1,77 @@
+#
+# Distributed under the OSI-approved Apache License, Version 2.0.  See
+# accompanying file Copyright.txt for details.
+#
+# helloBPReaderHeatMap2D.py
+#
+#
+#  Created on: Dec 5th, 2017
+#      Author: William F Godoy godoywf@ornl.gov
+#
+
+from mpi4py import MPI
+import numpy
+import adios2
+
+# MPI
+comm = MPI.COMM_WORLD
+rank = comm.Get_rank()
+size = comm.Get_size()
+
+# User data
+Nx = 10
+Ny = 10
+
+count = [Nx, Ny]
+start = [rank * Nx, 0]
+shape = [size * Nx, Ny]
+
+temperatures = numpy.zeros(Nx * Ny, dtype=numpy.int)
+
+for i in range(0, Nx):
+    iGlobal = start[0] + i
+
+    for j in range(0, Ny):
+        value = iGlobal * shape[1] + j
+        temperatures[i * Nx + j] = value
+        print(str(i) + "," + str(j) + " " + str(value))
+
+
+# ADIOS portion
+adios = adios2.ADIOS(comm)
+ioWrite = adios.DeclareIO("ioWriter")
+
+varTemperature = ioWrite.DefineVariable("temperature2D", shape,
+                                        start, count, adios2.ConstantDims,
+                                        temperatures)
+
+obpStream = ioWrite.Open('HeatMap2D_py.bp', adios2.Mode.Write)
+obpStream.PutSync(varTemperature, temperatures)
+obpStream.Close()
+
+
+if rank == 0:
+    ioRead = adios.DeclareIO("ioReader")
+
+    ibpStream = ioRead.Open('HeatMap2D_py.bp', adios2.Mode.Read)
+
+    var_inTemperature = ioRead.InquireVariable("temperature2D")
+
+    if var_inTemperature is not None:
+        var_inTemperature.SetSelection([[2, 2], [4, 4]])
+
+        inSize = var_inTemperature.SelectionSize()
+        print('Incoming size ' + str(inSize))
+        inTemperatures = numpy.zeros(inSize, dtype=numpy.int)
+
+        ibpStream.GetSync(var_inTemperature, inTemperatures)
+
+        print('Incoming temperature map')
+
+        for i in range(0, inTemperatures.size):
+            print(str(inTemperatures[i]) + ' ')
+
+            if (i + 1) % 4 == 0:
+                print()
+
+    ibpStream.Close()
diff --git a/examples/hello/bpReader/helloBPReaderHeatMap3D.f90 b/examples/hello/bpReader/helloBPReaderHeatMap3D.f90
index 89805866bb9d83d6b2079890d07fa73aec7da020..d95cad710038960d6f9198f22813cd5dec4ebbe9 100644
--- a/examples/hello/bpReader/helloBPReaderHeatMap3D.f90
+++ b/examples/hello/bpReader/helloBPReaderHeatMap3D.f90
@@ -88,7 +88,7 @@ program helloBPReaderHeatMap3D
             do k=1,sel_count(3)
               do j=1,sel_count(2)
                 do i=1,sel_count(1)
-                    write(6,'(I4) ', advance="no") sel_temperatures(i,j,k)
+                    write(6,'(I5) ', advance="no") sel_temperatures(i,j,k)
                 end do
                 write(*,*)
               end do
@@ -99,6 +99,10 @@ program helloBPReaderHeatMap3D
 
         end if
 
+        call adios2_close( bpReader, ierr )
+
     end if
 
+    call MPI_Finalize(ierr)
+
 end program helloBPReaderHeatMap3D
diff --git a/testing/adios2/bindings/python/TestBPWriteTypes.py b/testing/adios2/bindings/python/TestBPWriteTypes.py
index 405b3150ec2a180685dbb27b8de952734e560594..35128f0accff2d74ee9c7c9c0e7cdcb7f2f6e768 100644
--- a/testing/adios2/bindings/python/TestBPWriteTypes.py
+++ b/testing/adios2/bindings/python/TestBPWriteTypes.py
@@ -25,28 +25,28 @@ bpIO = adios.DeclareIO("NPTypes")
 # ADIOS Variable name, shape, start, offset, constant dims
 # All local variables
 varI8 = bpIO.DefineVariable(
-    "varI8", [], [], [data.I8.size], adios2.ConstantDims)
+    "varI8", [], [], [data.I8.size], adios2.ConstantDims, data.I8)
 varI16 = bpIO.DefineVariable(
-    "varI16", [], [], [data.I16.size], adios2.ConstantDims)
+    "varI16", [], [], [data.I16.size], adios2.ConstantDims, data.I16)
 varI32 = bpIO.DefineVariable(
-    "varI32", [], [], [data.I32.size], adios2.ConstantDims)
+    "varI32", [], [], [data.I32.size], adios2.ConstantDims, data.I32)
 varI64 = bpIO.DefineVariable(
-    "varI64", [], [], [data.I64.size], adios2.ConstantDims)
+    "varI64", [], [], [data.I64.size], adios2.ConstantDims, data.I64)
 
 varU8 = bpIO.DefineVariable(
-    "varUI8", [], [], [data.U8.size], adios2.ConstantDims)
+    "varUI8", [], [], [data.U8.size], adios2.ConstantDims, data.U8)
 varU16 = bpIO.DefineVariable(
-    "varUI16", [], [], [data.U16.size], adios2.ConstantDims)
+    "varUI16", [], [], [data.U16.size], adios2.ConstantDims, data.U16)
 varU32 = bpIO.DefineVariable(
-    "varUI32", [], [], [data.U32.size], adios2.ConstantDims)
+    "varUI32", [], [], [data.U32.size], adios2.ConstantDims, data.U32)
 varU64 = bpIO.DefineVariable(
-    "varUI64", [], [], [data.U64.size], adios2.ConstantDims)
+    "varUI64", [], [], [data.U64.size], adios2.ConstantDims, data.U64)
 
 varR32 = bpIO.DefineVariable(
-    "varR32", [], [], [data.R32.size], adios2.ConstantDims)
+    "varR32", [], [], [data.R32.size], adios2.ConstantDims, data.R32)
 
 varR64 = bpIO.DefineVariable(
-    "varR64", [], [], [data.R64.size], adios2.ConstantDims)
+    "varR64", [], [], [data.R64.size], adios2.ConstantDims, data.R64)
 
 
 # ADIOS Engine
diff --git a/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py b/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py
index 10ae2b4b55477323d6956b3ab06ecfe3f172a86e..23adc6b2a6ed5e613467f410534ac8e65769e2b4 100644
--- a/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py
+++ b/testing/adios2/bindings/python/TestBPWriteTypes_nompi.py
@@ -23,28 +23,28 @@ bpIO = adios.DeclareIO("NPTypes")
 # ADIOS Variable name, shape, start, offset, constant dims
 # All local variables
 varI8 = bpIO.DefineVariable(
-    "varI8", [], [], [data.I8.size], adios2.ConstantDims)
+    "varI8", [], [], [data.I8.size], adios2.ConstantDims, data.I8)
 varI16 = bpIO.DefineVariable(
-    "varI16", [], [], [data.I16.size], adios2.ConstantDims)
+    "varI16", [], [], [data.I16.size], adios2.ConstantDims, data.I16)
 varI32 = bpIO.DefineVariable(
-    "varI32", [], [], [data.I32.size], adios2.ConstantDims)
+    "varI32", [], [], [data.I32.size], adios2.ConstantDims, data.I32)
 varI64 = bpIO.DefineVariable(
-    "varI64", [], [], [data.I64.size], adios2.ConstantDims)
+    "varI64", [], [], [data.I64.size], adios2.ConstantDims, data.I64)
 
 varU8 = bpIO.DefineVariable(
-    "varUI8", [], [], [data.U8.size], adios2.ConstantDims)
+    "varUI8", [], [], [data.U8.size], adios2.ConstantDims, data.U8)
 varU16 = bpIO.DefineVariable(
-    "varUI16", [], [], [data.U16.size], adios2.ConstantDims)
+    "varUI16", [], [], [data.U16.size], adios2.ConstantDims, data.U16)
 varU32 = bpIO.DefineVariable(
-    "varUI32", [], [], [data.U32.size], adios2.ConstantDims)
+    "varUI32", [], [], [data.U32.size], adios2.ConstantDims, data.U32)
 varU64 = bpIO.DefineVariable(
-    "varUI64", [], [], [data.U64.size], adios2.ConstantDims)
+    "varUI64", [], [], [data.U64.size], adios2.ConstantDims, data.U64)
 
 varR32 = bpIO.DefineVariable(
-    "varR32", [], [], [data.R32.size], adios2.ConstantDims)
+    "varR32", [], [], [data.R32.size], adios2.ConstantDims, data.R32)
 
 varR64 = bpIO.DefineVariable(
-    "varR64", [], [], [data.R64.size], adios2.ConstantDims)
+    "varR64", [], [], [data.R64.size], adios2.ConstantDims, data.R64)
 
 
 # ADIOS Engine