/**
  * @brief sends a raw data chunk on the connection.
  *
- * @param data the /raw) data chunk which should be sended.
+ * @param data the (raw) data chunk which should be sended.
  */
 void T2NClientConnection::real_write(const std::string& data)
 {
         NOT_REACHED();
         return;
     }
+    module_logger().debug() << "send " << data.size() << " bytes of data";
     ptr->sendData(data);
 } // eo T2NServerConnection::real_write(const std::string)
 
         NOT_REACHED();
         return;
     }
-    buffer+= ptr->receiveData();
+    std::string new_data= ptr->receiveData();
+    buffer+= new_data;
+    module_logger().debug() << "got " << new_data.size() << " bytes of new data";
     m_got_new_data= true;
     reset_timeout();
 
  */
 T2NServerBase::T2NServerBase( ServerSocketBaseImplementationPtr server_port)
 : m_server_port(server_port)
+, m_new_data_available(false)
 {
     SCOPETRACKER();
     // register our callback for new incoming conncetions.
     server_port->setNewConnectionBaseCallback(
         boost::bind(&T2NServerBase::newConnectionSlot, this, _1)
     );
+    m_signal_client_got_new_data.connect
+    (
+        boost::bind(&T2NServerBase::clientGotNewDataSlot, this)
+    );
 } // eo T2NServerBase::T2NServerBase(ServerSocketBaseImplementationPtr)
 
 
 
 
 /**
+ * @brief callback for "new data available" signal
+ */
+void T2NServerBase::clientGotNewDataSlot()
+{
+    m_new_data_available= true;
+} // eo T2NServerBase::clientGotNewDataSlot()
+
+
+/**
  * @brief try to fill the buffers of the managed connections.
  *
  * will be called by T2NServerBase::fill_buffer().
 bool T2NServerBase::fill_buffer(long long usec_timeout, long long* timeout_remaining)
 {
     SCOPETRACKER();
+
+    if (m_new_data_available)
+    {
+        // short cut if we already know that we have new data:
+        m_new_data_available= false;
+        return true;
+    }
+
     int timeout= 0;
 
     if (usec_timeout<0)