CEC_USER_CONTROL_CODE_UNKNOWN
 } cec_user_control_code;
 
+typedef enum cec_an_user_control_code
+{
+  CEC_AN_USER_CONTROL_CODE_RETURN = 0x91
+} cec_an_user_control_code;
+
 typedef enum cec_logical_address
 {
   CECDEVICE_UNKNOWN = -1, //not a valid logical address
 
   {
     switch(command.opcode)
     {
-    // TODO
+    case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN:
+      if (command.parameters.size > 0)
+      {
+        m_controller->AddKey();
+
+        uint8_t iButton = 0;
+        switch (command.parameters[0])
+        {
+        case CEC_AN_USER_CONTROL_CODE_RETURN:
+          iButton = CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL;
+          break;
+        default:
+          break;
+        }
+
+        if (iButton > 0 && iButton <= CEC_USER_CONTROL_CODE_MAX)
+        {
+          CStdString strLog;
+          strLog.Format("key pressed: %1x", iButton);
+          m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str());
+
+          m_controller->SetCurrentButton((cec_user_control_code) command.parameters[0]);
+        }
+      }
+      break;
+    case CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP:
+      m_controller->AddKey();
+      break;
     default:
       bHandled = false;
       break;