diff --git a/share/qtcreator/qml/qmljsdebugger/protocol/observerprotocol.h b/share/qtcreator/qml/qmljsdebugger/protocol/observerprotocol.h
new file mode 100644
index 0000000000000000000000000000000000000000..27d3ad70b2bfc5295c837ceef43cfae966646394
--- /dev/null
+++ b/share/qtcreator/qml/qmljsdebugger/protocol/observerprotocol.h
@@ -0,0 +1,129 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** No Commercial Usage
+**
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#ifndef OBSERVERPROTOCOL_H
+#define OBSERVERPROTOCOL_H
+
+#include <QtCore/QDebug>
+#include <QtCore/QMetaType>
+#include <QtCore/QMetaEnum>
+#include <QtCore/QObject>
+
+namespace QmlJSDebugger {
+
+class ObserverProtocol : public QObject
+{
+    Q_OBJECT
+    Q_ENUMS(Message Tool)
+
+public:
+    enum Message {
+        AnimationSpeedChanged,
+        ChangeTool,
+        ClearComponentCache,
+        ColorChanged,
+        ContextPathUpdated,
+        CreateObject,
+        CurrentObjectsChanged,
+        DestroyObject,
+        MoveObject,
+        ObjectIdList,
+        Reload,
+        Reloaded,
+        SetAnimationSpeed,
+        SetContextPathIdx,
+        SetCurrentObjects,
+        SetDesignMode,
+        ShowAppOnTop,
+        ToolChanged
+    };
+
+    enum Tool {
+        ColorPickerTool,
+        SelectMarqueeTool,
+        SelectTool,
+        ZoomTool
+    };
+
+    static inline QString toString(Message message)
+    {
+        return staticMetaObject.enumerator(0).key(message);
+    }
+
+    static inline QString toString(Tool tool)
+    {
+        return staticMetaObject.enumerator(1).key(tool);
+    }
+};
+
+inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Message message)
+{
+    return stream << static_cast<quint32>(message);
+}
+
+inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Message &message)
+{
+    quint32 i;
+    stream >> i;
+    message = static_cast<ObserverProtocol::Message>(i);
+    return stream;
+}
+
+inline QDebug operator<< (QDebug dbg, ObserverProtocol::Message message)
+{
+    dbg << ObserverProtocol::toString(message);
+    return dbg;
+}
+
+inline QDataStream & operator<< (QDataStream &stream, ObserverProtocol::Tool tool)
+{
+    return stream << static_cast<quint32>(tool);
+}
+
+inline QDataStream & operator>> (QDataStream &stream, ObserverProtocol::Tool &tool)
+{
+    quint32 i;
+    stream >> i;
+    tool = static_cast<ObserverProtocol::Tool>(i);
+    return stream;
+}
+
+inline QDebug operator<< (QDebug dbg, ObserverProtocol::Tool tool)
+{
+    dbg << ObserverProtocol::toString(tool);
+    return dbg;
+}
+
+} // namespace QmlJSDebugger
+
+#endif // OBSERVERPROTOCOL_H
diff --git a/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri b/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri
new file mode 100644
index 0000000000000000000000000000000000000000..9db20ff863c04fb2b9a1fc6525ab69646bdd7e65
--- /dev/null
+++ b/share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri
@@ -0,0 +1,3 @@
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+HEADERS += $$PWD/observerprotocol.h
diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
index 2c93bfa80648196127819577ebd0a93c5f21d34c..43a8cc183a880de71c6839c55e134e009eb1bea8 100644
--- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp
@@ -41,11 +41,11 @@
 
 #include "qdeclarativeobserverservice.h"
 
+#include <observerprotocol.h>
+
 #include <QStringList>
 #include <QColor>
 
-#include <QDebug>
-
 namespace QmlJSDebugger {
 
 Q_GLOBAL_STATIC(QDeclarativeObserverService, serviceInstance)
@@ -69,10 +69,11 @@ void QDeclarativeObserverService::messageReceived(const QByteArray &message)
 {
     QDataStream ds(message);
 
-    QByteArray type;
+    ObserverProtocol::Message type;
     ds >> type;
 
-    if (type == "SET_CURRENT_OBJECTS") {
+    switch (type) {
+    case ObserverProtocol::SetCurrentObjects: {
         int itemCount = 0;
         ds >> itemCount;
 
@@ -87,50 +88,74 @@ void QDeclarativeObserverService::messageReceived(const QByteArray &message)
         }
 
         emit currentObjectsChanged(selectedObjects);
-
-    } else if (type == "RELOAD") {
+        break;
+    }
+    case ObserverProtocol::Reload: {
         emit reloadRequested();
-    } else if (type == "SET_ANIMATION_SPEED") {
+        break;
+    }
+    case ObserverProtocol::SetAnimationSpeed: {
         qreal speed;
         ds >> speed;
         emit animationSpeedChangeRequested(speed);
-    } else if (type == "CHANGE_TOOL") {
-        QByteArray toolName;
-        ds >> toolName;
-        if (toolName == "COLOR_PICKER") {
+        break;
+    }
+    case ObserverProtocol::ChangeTool: {
+        ObserverProtocol::Tool tool;
+        ds >> tool;
+        switch (tool) {
+        case ObserverProtocol::ColorPickerTool:
             emit colorPickerToolRequested();
-        } else if (toolName == "SELECT") {
+            break;
+        case ObserverProtocol::SelectTool:
             emit selectToolRequested();
-        } else if (toolName == "SELECT_MARQUEE") {
+            break;
+        case ObserverProtocol::SelectMarqueeTool:
             emit selectMarqueeToolRequested();
-        } else if (toolName == "ZOOM") {
+            break;
+        case ObserverProtocol::ZoomTool:
             emit zoomToolRequested();
+            break;
+        default:
+            qWarning() << "Warning: Unhandled tool:" << tool;
         }
-    } else if (type == "SET_DESIGN_MODE") {
+        break;
+    }
+    case ObserverProtocol::SetDesignMode: {
         bool inDesignMode;
         ds >> inDesignMode;
         emit designModeBehaviorChanged(inDesignMode);
-    } else if (type == "SHOW_APP_ON_TOP") {
+        break;
+    }
+    case ObserverProtocol::ShowAppOnTop: {
         bool showOnTop;
         ds >> showOnTop;
         emit showAppOnTopChanged(showOnTop);
-    } else if (type == "CREATE_OBJECT") {
+        break;
+    }
+    case ObserverProtocol::CreateObject: {
         QString qml;
         int parentId;
         QString filename;
         QStringList imports;
         ds >> qml >> parentId >> imports >> filename;
         emit objectCreationRequested(qml, objectForId(parentId), imports, filename);
-    } else if (type == "DESTROY_OBJECT") {
+        break;
+    }
+    case ObserverProtocol::DestroyObject: {
         int debugId;
         ds >> debugId;
         if (QObject* obj = objectForId(debugId))
             obj->deleteLater();
-    } else if (type == "MOVE_OBJECT") {
+        break;
+    }
+    case ObserverProtocol::MoveObject: {
         int debugId, newParent;
         ds >> debugId >> newParent;
         emit objectReparentRequested(objectForId(debugId), objectForId(newParent));
-    } else if (type == "OBJECT_ID_LIST") {
+        break;
+    }
+    case ObserverProtocol::ObjectIdList: {
         int itemCount;
         ds >> itemCount;
         m_stringIdForObjectId.clear();
@@ -142,12 +167,20 @@ void QDeclarativeObserverService::messageReceived(const QByteArray &message)
 
             m_stringIdForObjectId.insert(itemDebugId, itemIdString);
         }
-    } else if (type == "SET_CONTEXT_PATH_IDX") {
+        break;
+    }
+    case ObserverProtocol::SetContextPathIdx: {
         int contextPathIndex;
         ds >> contextPathIndex;
         emit contextPathIndexChanged(contextPathIndex);
-    } else if (type == "CLEAR_COMPONENT_CACHE") {
+        break;
+    }
+    case ObserverProtocol::ClearComponentCache: {
         emit clearComponentCacheRequested();
+        break;
+    }
+    default:
+        qWarning() << "Warning: Not handling message:" << type;
     }
 }
 
@@ -156,7 +189,7 @@ void QDeclarativeObserverService::setDesignModeBehavior(bool inDesignMode)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("SET_DESIGN_MODE")
+    ds << ObserverProtocol::SetDesignMode
        << inDesignMode;
 
     sendMessage(message);
@@ -167,7 +200,7 @@ void QDeclarativeObserverService::setCurrentObjects(QList<QObject*> objects)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("CURRENT_OBJECTS_CHANGED")
+    ds << ObserverProtocol::CurrentObjectsChanged
        << objects.length();
 
     foreach (QObject *object, objects) {
@@ -183,7 +216,7 @@ void QDeclarativeObserverService::setCurrentTool(QmlJSDebugger::Constants::Desig
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("TOOL_CHANGED")
+    ds << ObserverProtocol::ToolChanged
        << toolId;
 
     sendMessage(message);
@@ -195,7 +228,7 @@ void QDeclarativeObserverService::setAnimationSpeed(qreal slowdownFactor)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("ANIMATION_SPEED_CHANGED")
+    ds << ObserverProtocol::AnimationSpeedChanged
        << slowdownFactor;
 
     sendMessage(message);
@@ -206,7 +239,7 @@ void QDeclarativeObserverService::reloaded()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("RELOADED");
+    ds << ObserverProtocol::Reloaded;
 
     sendMessage(message);
 }
@@ -216,7 +249,7 @@ void QDeclarativeObserverService::setShowAppOnTop(bool showAppOnTop)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("SHOW_APP_ON_TOP") << showAppOnTop;
+    ds << ObserverProtocol::ShowAppOnTop << showAppOnTop;
 
     sendMessage(message);
 }
@@ -226,7 +259,7 @@ void QDeclarativeObserverService::selectedColorChanged(const QColor &color)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("COLOR_CHANGED")
+    ds << ObserverProtocol::ColorChanged
        << color;
 
     sendMessage(message);
@@ -237,7 +270,7 @@ void QDeclarativeObserverService::contextPathUpdated(const QStringList &contextP
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    ds << QByteArray("CONTEXT_PATH_UPDATED")
+    ds << ObserverProtocol::ContextPathUpdated
        << contextPath;
 
     sendMessage(message);
diff --git a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri
index e6fecb4968ed3218ff0149bcacc4b18ef350a6ec..570cba1da97052e70779fb153c60583fbd190f9f 100644
--- a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri
+++ b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-src.pri
@@ -1,6 +1,8 @@
 INCLUDEPATH += $$PWD/include
 DEPENDPATH += $$PWD $$PWD/include editor $$PWD/qt-private
 
+include($$PWD/protocol/protocol.pri)
+
 HEADERS += \
     $$PWD/include/jsdebuggeragent.h \
     $$PWD/include/qmljsdebugger_global.h
diff --git a/src/plugins/qmljsinspector/qmljsinspector.pro b/src/plugins/qmljsinspector/qmljsinspector.pro
index 6459785bdb8bf3e26eae25b04b3163621db36b27..a7a47c9d68acd1f9e73f762af249ae873c36f560 100644
--- a/src/plugins/qmljsinspector/qmljsinspector.pro
+++ b/src/plugins/qmljsinspector/qmljsinspector.pro
@@ -34,6 +34,7 @@ qmljsinspectorsettings.cpp \
 qmljspropertyinspector.cpp
 
 include(../../libs/qmljsdebugclient/qmljsdebugclient-lib.pri)
+include(../../../share/qtcreator/qml/qmljsdebugger/protocol/protocol.pri)
 
 RESOURCES += qmljsinspector.qrc
 
diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.cpp b/src/plugins/qmljsinspector/qmljsobserverclient.cpp
index 96edd17ba312d5278ad05872073f5b50b86102be..bd19fbb0644f1c8705af2cdd24cf484548953f02 100644
--- a/src/plugins/qmljsinspector/qmljsobserverclient.cpp
+++ b/src/plugins/qmljsinspector/qmljsobserverclient.cpp
@@ -45,6 +45,8 @@
 
 #include <QtGui/QColor>
 
+using namespace QmlJSDebugger;
+
 namespace QmlJSInspector {
 namespace Internal {
 
@@ -64,15 +66,15 @@ void QmlJSObserverClient::messageReceived(const QByteArray &message)
 {
     QDataStream ds(message);
 
-    QByteArray type;
+    ObserverProtocol::Message type;
     ds >> type;
 
-    if (type == "CURRENT_OBJECTS_CHANGED") {
+    switch (type) {
+    case ObserverProtocol::CurrentObjectsChanged: {
         int objectCount;
         ds >> objectCount;
 
-        log(LogReceive, QString("%1 %2 [list of debug ids]").arg(QString(type),
-                                                                 QString::number(objectCount)));
+        log(LogReceive, type, QString("%1 [list of debug ids]").arg(objectCount));
 
         m_currentDebugIds.clear();
 
@@ -85,11 +87,13 @@ void QmlJSObserverClient::messageReceived(const QByteArray &message)
         }
 
         emit currentObjectsChanged(m_currentDebugIds);
-    } else if (type == "TOOL_CHANGED") {
+        break;
+    }
+    case ObserverProtocol::ToolChanged: {
         int toolId;
         ds >> toolId;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), QString::number(toolId)));
+        log(LogReceive, type, QString::number(toolId));
 
         if (toolId == Constants::ColorPickerMode) {
             emit colorPickerActivated();
@@ -100,46 +104,60 @@ void QmlJSObserverClient::messageReceived(const QByteArray &message)
         } else if (toolId == Constants::MarqueeSelectionToolMode) {
             emit selectMarqueeToolActivated();
         }
-    } else if (type == "ANIMATION_SPEED_CHANGED") {
+        break;
+    }
+    case ObserverProtocol::AnimationSpeedChanged: {
         qreal slowdownFactor;
         ds >> slowdownFactor;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), QString::number(slowdownFactor)));
+        log(LogReceive, type, QString::number(slowdownFactor));
 
         emit animationSpeedChanged(slowdownFactor);
-    } else if (type == "SET_DESIGN_MODE") {
+        break;
+    }
+    case ObserverProtocol::SetDesignMode: {
         bool inDesignMode;
         ds >> inDesignMode;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), inDesignMode ? "true" : "false"));
+        log(LogReceive, type, QLatin1String(inDesignMode ? "true" : "false"));
 
         emit designModeBehaviorChanged(inDesignMode);
-    } else if (type == "SHOW_APP_ON_TOP") {
+        break;
+    }
+    case ObserverProtocol::ShowAppOnTop: {
         bool showAppOnTop;
         ds >> showAppOnTop;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), showAppOnTop ? "true" : "false"));
+        log(LogReceive, type, QLatin1String(showAppOnTop ? "true" : "false"));
 
         emit showAppOnTopChanged(showAppOnTop);
-    } else if (type == "RELOADED") {
-
+        break;
+    }
+    case ObserverProtocol::Reloaded: {
         log(LogReceive, type);
-
         emit reloaded();
-    } else if (type == "COLOR_CHANGED") {
+        break;
+    }
+    case ObserverProtocol::ColorChanged: {
         QColor col;
         ds >> col;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), col.name()));
+        log(LogReceive, type, col.name());
 
         emit selectedColorChanged(col);
-    } else if (type == "CONTEXT_PATH_UPDATED") {
+        break;
+    }
+    case ObserverProtocol::ContextPathUpdated: {
         QStringList contextPath;
         ds >> contextPath;
 
-        log(LogReceive, QString("%1 %2").arg(QString(type), contextPath.join(", ")));
+        log(LogReceive, type, contextPath.join(", "));
 
         emit contextPathUpdated(contextPath);
+        break;
+    }
+    default:
+        qWarning() << "Warning: Not handling message:" << type;
     }
 }
 
@@ -160,7 +178,7 @@ void QmlJSObserverClient::setCurrentObjects(const QList<int> &debugIds) {
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "SET_CURRENT_OBJECTS";
+    ObserverProtocol::Message cmd = ObserverProtocol::SetCurrentObjects;
     ds << cmd
        << debugIds.length();
 
@@ -168,8 +186,7 @@ void QmlJSObserverClient::setCurrentObjects(const QList<int> &debugIds) {
         ds << id;
     }
 
-    log(LogSend, QString("%1 %2 [list of ids]").arg(QString(cmd),
-                                                    QString::number(debugIds.length())));
+    log(LogSend, cmd, QString("%1 [list of ids]").arg(debugIds.length()));
 
     sendMessage(message);
 }
@@ -195,7 +212,7 @@ void QmlJSObserverClient::setObjectIdList(const QList<QDeclarativeDebugObjectRef
         recurseObjectIdList(ref, debugIds, objectIds);
     }
 
-    QByteArray cmd = "OBJECT_ID_LIST";
+    ObserverProtocol::Message cmd = ObserverProtocol::ObjectIdList;
     ds << cmd
        << debugIds.length();
 
@@ -205,8 +222,7 @@ void QmlJSObserverClient::setObjectIdList(const QList<QDeclarativeDebugObjectRef
         ds << debugIds[i] << objectIds[i];
     }
 
-    log(LogSend, QString("%1 %2 [list of debug / object ids]").arg(QString(cmd),
-                                                                   QString::number(debugIds.length())));
+    log(LogSend, cmd, QString("%1 %2 [list of debug / object ids]").arg(debugIds.length()));
 
     sendMessage(message);
 }
@@ -219,11 +235,11 @@ void QmlJSObserverClient::setContextPathIndex(int contextPathIndex)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "SET_CONTEXT_PATH_IDX";
+    ObserverProtocol::Message cmd = ObserverProtocol::SetContextPathIdx;
     ds << cmd
        << contextPathIndex;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), contextPathIndex));
+    log(LogSend, cmd, QString::number(contextPathIndex));
 
     sendMessage(message);
 }
@@ -236,7 +252,7 @@ void QmlJSObserverClient::clearComponentCache()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CLEAR_COMPONENT_CACHE";
+    ObserverProtocol::Message cmd = ObserverProtocol::ClearComponentCache;
     ds << cmd;
 
     log(LogSend, cmd);
@@ -252,7 +268,7 @@ void QmlJSObserverClient::reloadViewer()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "RELOAD";
+    ObserverProtocol::Message cmd = ObserverProtocol::Reload;
     ds << cmd;
 
     log(LogSend, cmd);
@@ -268,11 +284,11 @@ void QmlJSObserverClient::setDesignModeBehavior(bool inDesignMode)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "SET_DESIGN_MODE";
+    ObserverProtocol::Message cmd = ObserverProtocol::SetDesignMode;
     ds << cmd
        << inDesignMode;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), inDesignMode ? "true" : "false"));
+    log(LogSend, cmd, QLatin1String(inDesignMode ? "true" : "false"));
 
     sendMessage(message);
 }
@@ -285,12 +301,12 @@ void QmlJSObserverClient::setAnimationSpeed(qreal slowdownFactor)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "SET_ANIMATION_SPEED";
+    ObserverProtocol::Message cmd = ObserverProtocol::SetAnimationSpeed;
     ds << cmd
        << slowdownFactor;
 
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd),  QString::number(slowdownFactor)));
+    log(LogSend, cmd, QString::number(slowdownFactor));
 
     sendMessage(message);
 }
@@ -303,12 +319,12 @@ void QmlJSObserverClient::changeToColorPickerTool()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CHANGE_TOOL";
-    QByteArray tool = "COLOR_PICKER";
+    ObserverProtocol::Message cmd = ObserverProtocol::ChangeTool;
+    ObserverProtocol::Tool tool = ObserverProtocol::ColorPickerTool;
     ds << cmd
        << tool;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), QString(tool)));
+    log(LogSend, cmd, ObserverProtocol::toString(tool));
 
     sendMessage(message);
 }
@@ -321,12 +337,12 @@ void QmlJSObserverClient::changeToSelectTool()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CHANGE_TOOL";
-    QByteArray tool = "SELECT";
+    ObserverProtocol::Message cmd = ObserverProtocol::ChangeTool;
+    ObserverProtocol::Tool tool = ObserverProtocol::SelectTool;
     ds << cmd
        << tool;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), QString(tool)));
+    log(LogSend, cmd, ObserverProtocol::toString(tool));
 
     sendMessage(message);
 }
@@ -339,12 +355,12 @@ void QmlJSObserverClient::changeToSelectMarqueeTool()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CHANGE_TOOL";
-    QByteArray tool = "SELECT_MARQUEE";
+    ObserverProtocol::Message cmd = ObserverProtocol::ChangeTool;
+    ObserverProtocol::Tool tool = ObserverProtocol::SelectMarqueeTool;
     ds << cmd
        << tool;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), QString(tool)));
+    log(LogSend, cmd, ObserverProtocol::toString(tool));
 
     sendMessage(message);
 }
@@ -357,12 +373,12 @@ void QmlJSObserverClient::changeToZoomTool()
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CHANGE_TOOL";
-    QByteArray tool = "ZOOM";
+    ObserverProtocol::Message cmd = ObserverProtocol::ChangeTool;
+    ObserverProtocol::Tool tool = ObserverProtocol::ZoomTool;
     ds << cmd
        << tool;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), QString(tool)));
+    log(LogSend, cmd, ObserverProtocol::toString(tool));
 
     sendMessage(message);
 }
@@ -375,10 +391,10 @@ void QmlJSObserverClient::showAppOnTop(bool showOnTop)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "SHOW_APP_ON_TOP";
+    ObserverProtocol::Message cmd = ObserverProtocol::ShowAppOnTop;
     ds << cmd << showOnTop;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), showOnTop ? "true" : "false"));
+    log(LogSend, cmd, QLatin1String(showOnTop ? "true" : "false"));
 
     sendMessage(message);
 }
@@ -392,15 +408,15 @@ void QmlJSObserverClient::createQmlObject(const QString &qmlText, int parentDebu
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "CREATE_OBJECT";
+    ObserverProtocol::Message cmd = ObserverProtocol::CreateObject;
     ds << cmd
        << qmlText
        << parentDebugId
        << imports
        << filename;
 
-    log(LogSend, QString("%1 %2 %3 [%4] %5").arg(QString(cmd), qmlText, QString::number(parentDebugId),
-                                               imports.join(","), filename));
+    log(LogSend, cmd, QString("%1 %2 [%3] %4").arg(qmlText, QString::number(parentDebugId),
+                                                   imports.join(","), filename));
 
     sendMessage(message);
 }
@@ -412,10 +428,10 @@ void QmlJSObserverClient::destroyQmlObject(int debugId)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "DESTROY_OBJECT";
+    ObserverProtocol::Message cmd = ObserverProtocol::DestroyObject;
     ds << cmd << debugId;
 
-    log(LogSend, QString("%1 %2").arg(QString(cmd), debugId));
+    log(LogSend, cmd, QString::number(debugId));
 
     sendMessage(message);
 }
@@ -427,13 +443,13 @@ void QmlJSObserverClient::reparentQmlObject(int debugId, int newParent)
     QByteArray message;
     QDataStream ds(&message, QIODevice::WriteOnly);
 
-    QByteArray cmd = "MOVE_OBJECT";
+    ObserverProtocol::Message cmd = ObserverProtocol::MoveObject;
     ds << cmd
        << debugId
        << newParent;
 
-    log(LogSend, QString("%1 %2 %3").arg(QString(cmd), QString::number(debugId),
-                                         QString::number(newParent)));
+    log(LogSend, cmd, QString("%1 %2").arg(QString::number(debugId),
+                                           QString::number(newParent)));
 
     sendMessage(message);
 }
@@ -455,15 +471,18 @@ void QmlJSObserverClient::applyChangesFromQmlFile()
     // TODO
 }
 
-void QmlJSObserverClient::log(LogDirection direction, const QString &message)
+void QmlJSObserverClient::log(LogDirection direction, ObserverProtocol::Message message,
+                              const QString &extra)
 {
     QString msg;
-    if (direction == LogSend) {
-        msg += " sending ";
-    } else {
-        msg += " receiving ";
-    }
-    msg += message;
+    if (direction == LogSend)
+        msg += QLatin1String(" sending ");
+    else
+        msg += QLatin1String(" receiving ");
+
+    msg += ObserverProtocol::toString(message);
+    msg += QLatin1Char(' ');
+    msg += extra;
     emit logActivity(name(), msg);
 }
 
diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.h b/src/plugins/qmljsinspector/qmljsobserverclient.h
index 4d6c9d6e99d82b91d19280ec9a9fe35ac750bcb0..6688c9c8acb220eaf0c1fd89d6b3e0bb73ac2c54 100644
--- a/src/plugins/qmljsinspector/qmljsobserverclient.h
+++ b/src/plugins/qmljsinspector/qmljsobserverclient.h
@@ -44,6 +44,8 @@
 
 #include "qmljsprivateapi.h"
 
+#include <observerprotocol.h>
+
 namespace QmlJSInspector {
 namespace Internal {
 
@@ -107,7 +109,9 @@ private:
         LogReceive
     };
 
-    void log(LogDirection direction, const QString &str);
+    void log(LogDirection direction,
+             QmlJSDebugger::ObserverProtocol::Message message,
+             const QString &extra = QString());
 
     QList<int> m_currentDebugIds;
     QDeclarativeDebugConnection *m_connection;