diff --git a/include/Accessor.h b/include/Accessor.h
index f3c24f23fa39cd0e2c406da5a7b08b4c3847a21f..98fb906fde32ac92c134b0486b52f565776ba871 100644
--- a/include/Accessor.h
+++ b/include/Accessor.h
@@ -83,6 +83,9 @@ namespace ChimeraTK {
         return node;
       }
       
+      /** Return the implementation as a TransferElement */
+      virtual boost::shared_ptr<TransferElement> getTransferElement() = 0;
+      
       /** Explicitly return the node */
       VariableNetworkNode& getNode() {
         return node;
@@ -158,6 +161,10 @@ namespace ChimeraTK {
         node = VariableNetworkNode(*this);
       }
 
+      boost::shared_ptr<TransferElement> getTransferElement() override {
+        return boost::static_pointer_cast<TransferElement>(impl);
+      }
+
     protected:
 
       Module *_owner;
diff --git a/src/VariableGroup.cc b/src/VariableGroup.cc
index b20be8b59c139dd165463b71d1f23b366dd35ba8..60d647a7e557d1f7723031dd6692747283c5b7bc 100644
--- a/src/VariableGroup.cc
+++ b/src/VariableGroup.cc
@@ -16,18 +16,20 @@ namespace ChimeraTK {
 /*********************************************************************************************************************/
   
   void VariableGroup::readAny() {
-    bool gotUpdate = false;
     auto accessorList = getAccessorListRecursive();
-    while(!gotUpdate) {     /// @todo TODO FIXME make proper blocking implementation
-      boost::this_thread::yield();
-      boost::this_thread::interruption_point();
-      
-      for(auto accessor : accessorList) {       // @todo FIXME make sure no submodule is accessing the variables itself... (e.g. by forcing all submodules to be a VariablGroup and not e.g. an ApplicationModule)
-        if(accessor->getUpdateMode() == UpdateMode::push) {
-          if(accessor->readNonBlocking()) gotUpdate = true;
-        }
+
+    // put push-type transfer elements into a list suitable for TransferElement::readAny()
+    std::list<std::reference_wrapper<TransferElement>> transferElementList;
+    for(auto &accessor : accessorList) {
+      if(accessor->getUpdateMode() == UpdateMode::push) {
+        transferElementList.emplace_back(*(accessor->getTransferElement()));
       }
     }
+    
+    // wait until one of the push-type accessors receives an update
+    mtca4u::TransferElement::readAny(transferElementList);
+    
+    // trigger read on the poll-type accessors
     for(auto accessor : accessorList) {
       if(accessor->getUpdateMode() == UpdateMode::poll) {
         accessor->read();