diff --git a/monitor.c b/monitor.c
index cadf422..4b7067a 100644
--- a/monitor.c
+++ b/monitor.c
@@ -76,11 +76,16 @@
  *
  */
 
+/* Handler flags */
+#define HANDLER_HANDSHAKE      0x01 /* allowed to run on handshake mode */
+#define HANDLER_HANDSHAKE_ONLY 0x02 /* can ONLY run on handshake mode */
+
 typedef struct mon_cmd_t {
     const char *name;
     const char *args_type;
     const char *params;
     const char *help;
+    unsigned int flags;
     void (*user_print)(Monitor *mon, const QObject *data);
     union {
         void (*info)(Monitor *mon);
@@ -98,8 +103,14 @@ struct mon_fd_t {
     QLIST_ENTRY(mon_fd_t) next;
 };
 
+typedef enum QMPMode {
+    QMODE_OPERATIONAL,
+    QMODE_HANDSHAKE,
+} QMPMode;
+
 typedef struct MonitorControl {
     QObject *id;
+    QMPMode mode;
     int print_enabled;
     JSONMessageParser parser;
 } MonitorControl;
@@ -2364,6 +2375,7 @@ static const mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "show the version of QEMU",
+        .flags      = HANDLER_HANDSHAKE,
         .user_print = do_info_version_print,
         .mhandler.info_new = do_info_version,
     },
@@ -2372,6 +2384,7 @@ static const mon_cmd_t info_cmds[] = {
         .args_type  = "",
         .params     = "",
         .help       = "list QMP available commands",
+        .flags      = HANDLER_HANDSHAKE,
         .user_print = monitor_user_noop,
         .mhandler.info_new = do_info_commands,
     },
@@ -4264,6 +4277,7 @@ void monitor_init(CharDriverState *chr, int flags)
 
     if (monitor_ctrl_mode(mon)) {
         mon->mc = qemu_mallocz(sizeof(MonitorControl));
+        mon->mc->mode = QMODE_HANDSHAKE;
         /* Control mode requires special handlers */
         qemu_chr_add_handlers(chr, monitor_can_read, monitor_control_read,
                               monitor_control_event, mon);
