while (!IsStopped())
   {
     bool bParseFrame(false);
+    cec_frame msg;
+    msg.clear();
+
     {
       CLockObject lock(&m_mutex);
-      cec_frame msg;
-      msg.clear();
-
-      if (m_communication->IsOpen() && m_communication->Read(msg, CEC_BUTTON_TIMEOUT))
+      if (m_communication->IsOpen() && m_communication->Read(msg, 50))
         bParseFrame = ParseMessage(msg) && !IsStopped();
+
+      if (bParseFrame)
+      {
+        msg.clear();
+        msg = m_currentframe;
+      }
     }
 
     if (bParseFrame)
-      ParseCurrentFrame();
+      ParseCurrentFrame(msg);
 
     m_controller->CheckKeypressTimeout();
 
   return bReturn;
 }
 
-void CCECProcessor::ParseCurrentFrame(void)
+void CCECProcessor::ParseCurrentFrame(cec_frame &frame)
 {
-  cec_frame frame = m_currentframe;
-  m_currentframe.clear();
-
   uint8_t initiator = frame.data[0] >> 4;
   uint8_t destination = frame.data[0] & 0xF;
 
 
     private:
       bool WaitForAck(uint32_t iTimeout = 1000);
       bool ParseMessage(cec_frame &msg);
-      void ParseCurrentFrame(void);
+      void ParseCurrentFrame(cec_frame &frame);
 
       cec_frame                  m_currentframe;
       uint16_t                   m_physicaladdress;