diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
index daefedcac027998bb85b83311f998f3a87671099..6061605f912f2df5d5e99035d03da5fccbdc785f 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
@@ -47,6 +47,7 @@
 #include <QtGui/QTextBlock>
 #include <QtCore/QVariant>
 #include <QtCore/QStack>
+#include <QtCore/QQueue>
 #include <QtCore/QFileInfo>
 #include <QtGui/QTextDocument>
 #include <QtScript/QScriptEngine>
@@ -78,7 +79,10 @@ public:
     explicit QmlV8DebuggerClientPrivate(QmlV8DebuggerClient *q) :
         q(q),
         sequence(-1),
-        engine(0)
+        engine(0),
+        debugServiceState(QmlV8DebuggerClient::RunningState),
+        requestListBreakpoints(false),
+        requestBacktrace(true)
     {
         parser = m_scriptEngine.evaluate(_("JSON.parse"));
         stringifier = m_scriptEngine.evaluate(_("JSON.stringify"));
@@ -116,6 +120,7 @@ public:
     void gc();
 
     QmlV8ObjectData extractData(const QVariant &data);
+    void clearCache();
 
 private:
     QByteArray packMessage(const QByteArray &message);
@@ -128,20 +133,28 @@ public:
     QmlEngine *engine;
     QHash<BreakpointModelId, int> breakpoints;
     QHash<int, BreakpointModelId> breakpointsSync;
-    QHash<int, QByteArray> localsAndWatchers;
-    QHash<int, QString> evaluatingWatches;
-    QStringList watchedExpressions;
-    QStack<QString> watchesToEvaluate;
 
     QScriptValue parser;
     QScriptValue stringifier;
 
-    QmlV8DebuggerClient::V8DebuggerStates state;
+    //State Information
+    QmlV8DebuggerClient::V8DebugServiceStates debugServiceState;
     int currentFrameIndex;
-    bool updateCurrentStackFrameIndex;
+    QStringList watchedExpressions;
+
+    //Flags
+    bool requestListBreakpoints;
+    bool requestBacktrace;
+
+    //Cache
+    QHash<int, QByteArray> localsAndWatchers;
+    QHash<int, QString> evaluatingWatches;
+    QStack<QString> watchesToEvaluate;
     QStack<int> currentFrameScopes;
-    QVariant refsVal;
     QList<WatchData> localDataList;
+    QVariant refsVal;
+    QHash<int, QString> evaluatingExpression;
+    QQueue<QByteArray> requestQueue;
 private:
     QScriptEngine m_scriptEngine;
 };
@@ -195,7 +208,7 @@ void QmlV8DebuggerClientPrivate::continueDebugging(QmlV8DebuggerClient::StepActi
                                                    int count)
 {
     //First reset
-    q->resetState();
+    q->resetDebugger();
 
     //    { "seq"       : <number>,
     //      "type"      : "request",
@@ -818,13 +831,23 @@ QmlV8ObjectData QmlV8DebuggerClientPrivate::extractData(const QVariant &data)
     return objectData;
 }
 
+void QmlV8DebuggerClientPrivate::clearCache()
+{
+    localsAndWatchers.clear();
+    evaluatingWatches.clear();
+    watchesToEvaluate.clear();
+    currentFrameScopes.clear();
+    localDataList.clear();
+    refsVal.clear();
+}
+
 QByteArray QmlV8DebuggerClientPrivate::packMessage(const QByteArray &message)
 {
+    SDEBUG(message);
     QByteArray reply;
     QDataStream rs(&reply, QIODevice::WriteOnly);
     QByteArray cmd = V8DEBUG;
     rs << cmd << message;
-    SDEBUG(QString(message));
     return reply;
 }
 
@@ -847,7 +870,7 @@ QmlV8DebuggerClient::QmlV8DebuggerClient(QmlJsDebugClient::QDeclarativeDebugConn
     : QmlDebuggerClient(client, QLatin1String("V8Debugger")),
       d(new QmlV8DebuggerClientPrivate(this))
 {
-    resetState();
+    resetDebugger();
 }
 
 QmlV8DebuggerClient::~QmlV8DebuggerClient()
@@ -857,55 +880,48 @@ QmlV8DebuggerClient::~QmlV8DebuggerClient()
 
 void QmlV8DebuggerClient::startSession()
 {
+    resetDebugger();
+    d->debugServiceState = QmlV8DebuggerClient::RunningState;
     d->connect();
 }
 
 void QmlV8DebuggerClient::endSession()
 {
-    resetState();
     d->disconnect();
 }
 
 void QmlV8DebuggerClient::executeStep()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->continueDebugging(In);
 }
 
 void QmlV8DebuggerClient::executeStepOut()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->continueDebugging(Out);
 }
 
 void QmlV8DebuggerClient::executeNext()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->continueDebugging(Next);
 }
 
 void QmlV8DebuggerClient::executeStepI()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->continueDebugging(In);
 }
 
 void QmlV8DebuggerClient::continueInferior()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->continueDebugging(Continue);
 }
 
 void QmlV8DebuggerClient::interruptInferior()
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState
-              || d->state == QmlV8DebuggerClient::RunningState);
     d->interrupt();
 }
 
 void QmlV8DebuggerClient::activateFrame(int index)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     d->backtrace(index);
 }
 
@@ -919,9 +935,6 @@ bool QmlV8DebuggerClient::acceptsBreakpoint(const BreakpointModelId &id)
 
 void QmlV8DebuggerClient::insertBreakpoint(const BreakpointModelId &id)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState
-              || d->state == QmlV8DebuggerClient::RunningState);
-    SDEBUG(QString(_("State: %1")).arg(d->state));
     BreakHandler *handler = d->engine->breakHandler();
     const BreakpointParameters &params = handler->breakpointData(id);
 
@@ -949,8 +962,6 @@ void QmlV8DebuggerClient::insertBreakpoint(const BreakpointModelId &id)
 
 void QmlV8DebuggerClient::removeBreakpoint(const BreakpointModelId &id)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState
-              || d->state == QmlV8DebuggerClient::RunningState);
     BreakHandler *handler = d->engine->breakHandler();
 
     int breakpoint = d->breakpoints.value(id);
@@ -965,8 +976,6 @@ void QmlV8DebuggerClient::removeBreakpoint(const BreakpointModelId &id)
 
 void QmlV8DebuggerClient::changeBreakpoint(const BreakpointModelId &id)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState
-              || d->state == QmlV8DebuggerClient::RunningState);
     BreakHandler *handler = d->engine->breakHandler();
     const BreakpointParameters &params = handler->breakpointData(id);
 
@@ -993,12 +1002,9 @@ void QmlV8DebuggerClient::synchronizeBreakpoints()
 void QmlV8DebuggerClient::assignValueInDebugger(const QByteArray /*expr*/, const quint64 &/*id*/,
                                                 const QString &property, const QString &value)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
     StackHandler *stackHandler = d->engine->stackHandler();
     QString expression = QString(_("%1 = %2;")).arg(property).arg(value);
     if (stackHandler->isContentsValid()) {
-        d->state = QmlV8DebuggerClient::BacktraceRequestedState;
-        d->updateCurrentStackFrameIndex = false;
         d->evaluate(expression, false, false, stackHandler->currentIndex());
     }
 }
@@ -1016,14 +1022,10 @@ void QmlV8DebuggerClient::updateWatchData(const WatchData &data)
 
 void QmlV8DebuggerClient::executeDebuggerCommand(const QString &command)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState
-              || d->state == QmlV8DebuggerClient::RunningState);
     StackHandler *stackHandler = d->engine->stackHandler();
     if (stackHandler->isContentsValid()) {
-        //Set the state
-        d->state = QmlV8DebuggerClient::BacktraceRequestedState;
-        d->updateCurrentStackFrameIndex = false;
         d->evaluate(command, false, false, stackHandler->currentIndex());
+        d->evaluatingExpression.insert(d->sequence, command);
     } else {
         //Currently cannot evaluate if not in a javascript break
         d->engine->showMessage(_("Request Was Unsuccessful"), ScriptConsoleOutput);
@@ -1051,9 +1053,12 @@ void QmlV8DebuggerClient::synchronizeWatchers(const QStringList &watchers)
 
 void QmlV8DebuggerClient::expandObject(const QByteArray &iname, quint64 objectId)
 {
-    QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
-    d->localsAndWatchers.insertMulti(objectId, iname);
-    d->lookup(QList<int>() << objectId);
+    if (d->debugServiceState != QmlV8DebuggerClient::RunningState) {
+        if (!d->localsAndWatchers.contains(objectId)) {
+            d->lookup(QList<int>() << objectId);
+            d->localsAndWatchers.insert(objectId, iname);
+        }
+    }
 }
 
 void QmlV8DebuggerClient::setEngine(QmlEngine *engine)
@@ -1077,6 +1082,7 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
         const QVariantMap resp = d->parser.call(QScriptValue(),
                                                 QScriptValueList() <<
                                                 QScriptValue(responseString)).toVariant().toMap();
+        bool isV8Running = resp.value(_("running")).toBool();
         const QString type(resp.value(_(TYPE)).toString());
 
         if (type == _("response")) {
@@ -1097,26 +1103,33 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
             } else if (debugCommand == _(DISCONNECT)) {
                 //debugging session ended
 
+            } else if (debugCommand == _(CONTINEDEBUGGING)) {
+                d->requestBacktrace = true;
+
             } else if (debugCommand == _(BACKTRACE)) {
-                if (success) {
+                if (success && d->debugServiceState != QmlV8DebuggerClient::RunningState) {
                     updateStack(resp.value(_(BODY)), resp.value(_(REFS)));
                 }
 
             } else if (debugCommand == _(LOOKUP)) {
-                expandLocalsAndWatchers(resp.value(_(BODY)), resp.value(_(REFS)));
+                if (success && d->debugServiceState != QmlV8DebuggerClient::RunningState) {
+                    expandLocalsAndWatchers(resp.value(_(BODY)), resp.value(_(REFS)));
+                }
 
             } else if (debugCommand == _(EVALUATE)) {
                 int seq = resp.value(_("request_seq")).toInt();
                 if (success) {
+                    d->requestBacktrace = true;
                     updateEvaluationResult(seq, resp.value(_(BODY)), resp.value(_(REFS)));
                 } else {
                     d->engine->showMessage(resp.value(_("message")).toString(), ScriptConsoleOutput);
-                    if (d->evaluatingWatches.contains(seq))
-                        updateEvaluationResult(seq, QVariant(), QVariant());
+                    updateEvaluationResult(seq, QVariant(), QVariant());
                 }
 
             } else if (debugCommand == _(LISTBREAKPOINTS)) {
-                updateBreakpoints(resp.value(_(BODY)));
+                if (success && d->debugServiceState != QmlV8DebuggerClient::RunningState) {
+                    updateBreakpoints(resp.value(_(BODY)));
+                }
 
             } else if (debugCommand == _(SETBREAKPOINT)) {
                 //                { "seq"         : <number>,
@@ -1160,7 +1173,7 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
                 //TODO::
 
             } else if (debugCommand == _(FRAME)) {
-                if (success) {
+                if (success && d->debugServiceState != QmlV8DebuggerClient::RunningState) {
                     const QVariant body = resp.value(_(BODY));
                     const QVariant refs = resp.value(_(REFS));
                     const QVariant locals = body.toMap().value(_("locals"));
@@ -1170,7 +1183,7 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
                 }
 
             } else if (debugCommand == _(SCOPE)) {
-                if (success) {
+                if (success && d->debugServiceState != QmlV8DebuggerClient::RunningState) {
                     const QVariant body = resp.value(_(BODY)).toMap().value(_("object"));
                     const QVariant refs = resp.value(_(REFS));
                     updateScope(body, refs);
@@ -1185,11 +1198,19 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
             } else {
                 // DO NOTHING
             }
+
+            if (!isV8Running
+                    && d->debugServiceState == QmlV8DebuggerClient::ProcessingRequestState)
+                d->debugServiceState = QmlV8DebuggerClient::WaitingForRequestState;
+
         } else if (type == _(EVENT)) {
             const QString eventType(resp.value(_(EVENT)).toString());
 
             if (eventType == _("break")) {
-                //DO NOTHING
+                if (d->engine->state() == InferiorRunOk)
+                    d->engine->inferiorSpontaneousStop();
+                isV8Running = false;
+
             } else if (eventType == _("exception")) {
                 const QVariantMap body = resp.value(_(BODY)).toMap();
                 int lineNumber = body.value(_("sourceLine")).toInt() + 1;
@@ -1202,32 +1223,60 @@ void QmlV8DebuggerClient::messageReceived(const QByteArray &data)
                 QString errorMessage = exception.value(_("text")).toString();
 
                 highlightExceptionCode(lineNumber, filePath, errorMessage);
+
+                if (d->engine->state() == InferiorRunOk)
+                    d->engine->inferiorSpontaneousStop();
+                isV8Running = false;
+                d->requestBacktrace = true;
+
+            } else if (eventType == _("afterCompile")) {
+                d->requestListBreakpoints = true;
             }
+
+            if (!isV8Running
+                    && d->debugServiceState == QmlV8DebuggerClient::RunningState)
+                d->debugServiceState = QmlV8DebuggerClient::WaitingForRequestState;
         }
 
-        if (resp.value(_("running")).toBool()) {
-            d->state = QmlV8DebuggerClient::RunningState;
-            SDEBUG(QString(_("State: %1")).arg(d->state));
+        if (isV8Running) {
+            resetDebugger();
+            d->debugServiceState = QmlV8DebuggerClient::RunningState;
+
         } else {
-            if (d->state == QmlV8DebuggerClient::RunningState) {
-                d->state = QmlV8DebuggerClient::BreakpointsRequestedState;
-                SDEBUG(QString(_("State: %1")).arg(d->state));
+            if (d->requestListBreakpoints) {
+                d->listBreakpoints();
+                d->requestListBreakpoints = false;
+            }
+
+            if (d->requestBacktrace) {
+                d->backtrace(d->currentFrameIndex);
+                d->requestBacktrace = false;
+            }
+
+            if (d->debugServiceState == QmlV8DebuggerClient::WaitingForRequestState
+                    && !d->requestQueue.isEmpty()) {
+                QmlDebuggerClient::sendMessage(d->requestQueue.dequeue());
+                d->debugServiceState = QmlV8DebuggerClient::ProcessingRequestState;
             }
-            d->engine->inferiorSpontaneousStop();
-        }
 
-        if (d->state == QmlV8DebuggerClient::BreakpointsRequestedState) {
-            d->state = QmlV8DebuggerClient::BacktraceRequestedState;
-            SDEBUG(QString(_("State: %1")).arg(d->state));
-            d->listBreakpoints();
-        } else if (d->state == QmlV8DebuggerClient::BacktraceRequestedState) {
-            d->state = QmlV8DebuggerClient::WaitingForRequestState;
-            SDEBUG(QString(_("State: %1")).arg(d->state));
-            d->backtrace(d->currentFrameIndex);
         }
+
     } else {
         //DO NOTHING
     }
+    SDEBUG(QString(_("State: %1")).arg(d->debugServiceState));
+}
+
+void QmlV8DebuggerClient::sendMessage(const QByteArray &msg)
+{
+    if (d->debugServiceState == QmlV8DebuggerClient::RunningState) {
+        QmlDebuggerClient::sendMessage(msg);
+    } else if (d->debugServiceState == QmlV8DebuggerClient::WaitingForRequestState) {
+        QmlDebuggerClient::sendMessage(msg);
+        d->debugServiceState = QmlV8DebuggerClient::ProcessingRequestState;
+    } else {
+         d->requestQueue.enqueue(msg);
+    }
 
 }
 
@@ -1249,9 +1298,10 @@ void QmlV8DebuggerClient::updateStack(const QVariant &bodyVal, const QVariant &r
     const QVariantMap body = bodyVal.toMap();
     const QVariantList frames = body.value(_("frames")).toList();
 
-    d->currentFrameIndex = body.value(_("fromFrame")).toInt();
+    int fromFrameIndex = body.value(_("fromFrame")).toInt();
+
 
-    if (!d->currentFrameIndex ) {
+    if (0 == fromFrameIndex) {
         StackFrames stackFrames;
         foreach (const QVariant &frame, frames) {
             stackFrames << createStackFrame(frame, refsVal);
@@ -1259,50 +1309,50 @@ void QmlV8DebuggerClient::updateStack(const QVariant &bodyVal, const QVariant &r
         d->engine->stackHandler()->setFrames(stackFrames);
     }
 
-    if (d->updateCurrentStackFrameIndex) {
+    if (d->currentFrameIndex != fromFrameIndex) {
         StackHandler *stackHandler = d->engine->stackHandler();
-        stackHandler->setCurrentIndex(d->currentFrameIndex);
+        stackHandler->setCurrentIndex(fromFrameIndex);
         d->engine->gotoLocation(stackHandler->currentFrame());
+        d->currentFrameIndex = fromFrameIndex;
+    }
 
-        //Update all Locals visible in current scope
-        //Traverse the scope chain and store the local properties
-        //in a list and show them in the Locals Window.
-        const QVariantMap currentFrame = frames.value(0).toMap();
-        d->localDataList.clear();
-        d->currentFrameScopes.clear();
-        d->refsVal = refsVal;
-        //Set "this" variable
-        {
-            WatchData data;
-            data.exp = QByteArray("this");
-            data.name = QString(data.exp);
-            data.iname = "local." + data.exp;
-            QVariantMap receiver = currentFrame.value(_("receiver")).toMap();
-            if (receiver.contains(_(REF))) {
-                receiver = valueFromRef(receiver.value(_(REF)).toInt(), refsVal).toMap();
-            }
-            data.id = receiver.value(_("handle")).toInt();
-            QmlV8ObjectData receiverData = d->extractData(QVariant(receiver));
-            data.type = receiverData.type;
-            data.value = receiverData.value.toString();
-            data.setHasChildren(receiverData.properties.toList().count());
-            d->localDataList << data;
-        }
-
-        const QVariantList currentFrameScopes = currentFrame.value(_("scopes")).toList();
-        foreach (const QVariant &scope, currentFrameScopes) {
-            d->currentFrameScopes.push(scope.toMap().value(_("index")).toInt());
-        }
-        if (!d->currentFrameScopes.isEmpty()) {
-            QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
-            d->scope(d->currentFrameScopes.pop(), d->currentFrameIndex);
-        } else {
-            updateLocalsAndWatchers();
+    //Update all Locals visible in current scope
+    //Traverse the scope chain and store the local properties
+    //in a list and show them in the Locals Window.
+    const QVariantMap currentFrame = frames.value(0).toMap();
+    d->clearCache();
+    d->refsVal = refsVal;
+    //Set "this" variable
+    {
+        WatchData data;
+        data.exp = QByteArray("this");
+        data.name = QString(data.exp);
+        data.iname = QByteArray("local.") + data.exp;
+        QVariantMap receiver = currentFrame.value(_("receiver")).toMap();
+        if (receiver.contains(_(REF))) {
+            receiver = valueFromRef(receiver.value(_(REF)).toInt(), refsVal).toMap();
         }
+        data.id = receiver.value(_("handle")).toInt();
+        QmlV8ObjectData receiverData = d->extractData(QVariant(receiver));
+        data.type = receiverData.type;
+        data.value = receiverData.value.toString();
+        data.setHasChildren(receiverData.properties.toList().count());
+        d->localDataList << data;
     }
 
-    d->updateCurrentStackFrameIndex = true;
-
+    const QVariantList currentFrameScopes = currentFrame.value(_("scopes")).toList();
+    foreach (const QVariant &scope, currentFrameScopes) {
+        //Do not query for global types (0)
+        //Showing global properties increases clutter.
+        if (scope.toMap().value(_("type")).toInt() == 0)
+            continue;
+        d->currentFrameScopes.push(scope.toMap().value(_("index")).toInt());
+    }
+    if (!d->currentFrameScopes.isEmpty()) {
+        d->scope(d->currentFrameScopes.pop(), d->currentFrameIndex);
+    } else {
+        updateLocalsAndWatchers();
+    }
 }
 
 StackFrame QmlV8DebuggerClient::createStackFrame(const QVariant &bodyVal, const QVariant &refsVal)
@@ -1364,7 +1414,6 @@ StackFrame QmlV8DebuggerClient::createStackFrame(const QVariant &bodyVal, const
 
     stackFrame.line = body.value(_("line")).toInt() + 1;
 
-
     return stackFrame;
 }
 
@@ -1434,10 +1483,6 @@ void QmlV8DebuggerClient::updateScope(const QVariant &bodyVal, const QVariant &r
 
     foreach (const QVariant &property, properties) {
         QVariantMap localData = property.toMap();
-        //Do Not show global types (0)
-        //Showing global properties increases clutter.
-        if (!localData.value(_("propertyType")).toInt())
-            continue;
         WatchData data;
         data.exp = localData.value(_(NAME)).toByteArray();
         //Check for v8 specific local data
@@ -1452,8 +1497,10 @@ void QmlV8DebuggerClient::updateScope(const QVariant &bodyVal, const QVariant &r
         if (localData.isEmpty()) {
             //Fetch Data asynchronously and insert later
             // see expandLocalsAndWatchers()
-            d->localsAndWatchers.insert(handle, data.exp);
-            d->lookup(QList<int>() << handle);
+            if (!d->localsAndWatchers.contains(handle)) {
+                d->lookup(QList<int>() << handle);
+                d->localsAndWatchers.insert(handle, data.exp);
+            }
 
         } else {
             data.id = localData.value(_(HANDLE)).toInt();
@@ -1469,7 +1516,6 @@ void QmlV8DebuggerClient::updateScope(const QVariant &bodyVal, const QVariant &r
     }
 
     if (!d->currentFrameScopes.isEmpty()) {
-        QTC_CHECK(d->state == QmlV8DebuggerClient::WaitingForRequestState);
         d->scope(d->currentFrameScopes.pop(), d->currentFrameIndex);
     } else {
         updateLocalsAndWatchers();
@@ -1495,11 +1541,13 @@ void QmlV8DebuggerClient::updateEvaluationResult(int sequence, const QVariant &b
 
     QmlV8ObjectData body = d->extractData(QVariant(bodyMap));
 
-    if (!d->evaluatingWatches.contains(sequence)) {
+    if (d->evaluatingExpression.contains(sequence)) {
+        d->evaluatingExpression.take(sequence);
         //Console
         d->engine->showMessage(body.value.toString(), ScriptConsoleOutput);
 
-    } else {
+    } else if (d->evaluatingWatches.contains(sequence)) {
+        d->requestBacktrace = false;
         QString exp = d->evaluatingWatches.take(sequence);
         QByteArray iname = d->engine->watchHandler()->watcherName(exp.toLatin1());
         SDEBUG(QString(iname));
@@ -1636,62 +1684,68 @@ void QmlV8DebuggerClient::expandLocalsAndWatchers(const QVariant &bodyVal, const
     //    }
     const QVariantMap body = bodyVal.toMap();
 
-    QString handle = body.keys().value(0);
-    QmlV8ObjectData bodyObjectData = d->extractData(
-                body.value(handle));
-    QByteArray prepend = d->localsAndWatchers.take(handle.toInt());
     QList<WatchData> watchDataList;
+    QStringList handlesList = body.keys();
+    foreach (const QString &handle, handlesList) {
+        QmlV8ObjectData bodyObjectData = d->extractData(
+                    body.value(handle));
+        QByteArray prepend = d->localsAndWatchers.take(handle.toInt());
+
+
+        if (prepend.isEmpty())
+            return;
+
+        if (bodyObjectData.properties.isValid()) {
+            //Could be an object or function
+            const WatchData *parent = d->engine->watchHandler()->findItem(prepend);
+            const QVariantList properties = bodyObjectData.properties.toList();
+            foreach (const QVariant &property, properties) {
+                QVariantMap propertyData = property.toMap();
+                WatchData data;
+                data.name = propertyData.value(_(NAME)).toString();
+
+                //Check for v8 specific local data
+                if (data.name.startsWith(".") || data.name.isEmpty())
+                    continue;
+                if (parent && parent->type == "object") {
+                    if (parent->value == _("Array"))
+                        data.exp = parent->exp + QByteArray("[") + data.name.toLatin1() + QByteArray("]");
+                    else if (parent->value == _("Object"))
+                        data.exp = parent->exp + QByteArray(".") + data.name.toLatin1();
+                } else {
+                    data.exp = data.name.toLatin1();
+                }
 
-    if (bodyObjectData.properties.isValid()) {
-        //Could be an object or function
-        const WatchData *parent = d->engine->watchHandler()->findItem(prepend);
-        const QVariantList properties = bodyObjectData.properties.toList();
-        foreach (const QVariant &property, properties) {
-            QVariantMap propertyData = property.toMap();
-            WatchData data;
-            data.name = propertyData.value(_(NAME)).toString();
+                if (prepend.startsWith("local."))
+                    data.iname = prepend + '.' + data.name.toLatin1();
+                if (prepend.startsWith("watch."))
+                    data.iname = prepend;
+                propertyData = valueFromRef(propertyData.value(_(REF)).toInt(),
+                                            refsVal).toMap();
+                data.id = propertyData.value(_(HANDLE)).toInt();
 
-            //Check for v8 specific local data
-            if (data.name.startsWith(".") || data.name.isEmpty())
-                continue;
-            if (parent && parent->type == "object") {
-                if (parent->value == _("Array"))
-                    data.exp = parent->exp + QByteArray("[") + data.name.toLatin1() + QByteArray("]");
-                else if (parent->value == _("Object"))
-                    data.exp = parent->exp + QByteArray(".") + data.name.toLatin1();
-            } else {
-                data.exp = data.name.toLatin1();
+                QmlV8ObjectData objectData = d->extractData(QVariant(propertyData));
+                data.type = objectData.type;
+                data.value = objectData.value.toString();
+
+                data.setHasChildren(objectData.properties.toList().count());
+                watchDataList << data;
             }
+        } else {
+            //rest
+            WatchData data;
+            data.exp = prepend;
+            data.name = data.exp;
+            data.iname = QByteArray("local.") + data.exp;
+            data.id = handle.toInt();
 
-            if (prepend.startsWith("local."))
-                data.iname = prepend + '.' + data.name.toLatin1();
-            if (prepend.startsWith("watch."))
-                data.iname = prepend;
-            propertyData = valueFromRef(propertyData.value(_(REF)).toInt(),
-                                        refsVal).toMap();
-            data.id = propertyData.value(_(HANDLE)).toInt();
+            data.type = bodyObjectData.type;
+            data.value = bodyObjectData.value.toString();
 
-            QmlV8ObjectData objectData = d->extractData(QVariant(propertyData));
-            data.type = objectData.type;
-            data.value = objectData.value.toString();
+            data.setHasChildren(bodyObjectData.properties.toList().count());
 
-            data.setHasChildren(objectData.properties.toList().count());
             watchDataList << data;
         }
-    } else {
-        //rest
-        WatchData data;
-        data.exp = prepend;
-        data.name = data.exp;
-        data.iname = "local." + data.exp;
-        data.id = handle.toInt();
-
-        data.type = bodyObjectData.type;
-        data.value = bodyObjectData.value.toString();
-
-        data.setHasChildren(bodyObjectData.properties.toList().count());
-
-        watchDataList << data;
     }
 
     d->engine->watchHandler()->beginCycle(false);
@@ -1760,13 +1814,11 @@ void QmlV8DebuggerClient::clearExceptionSelection()
 
 }
 
-void QmlV8DebuggerClient::resetState()
+void QmlV8DebuggerClient::resetDebugger()
 {
     clearExceptionSelection();
-    d->currentFrameIndex = 0;
-    d->updateCurrentStackFrameIndex = true;
-    d->state = QmlV8DebuggerClient::RunningState;
-    SDEBUG(QString(_("State: %1")).arg(d->state));
+    d->currentFrameIndex = -1;
+    SDEBUG(QString(_("State: %1")).arg(d->debugServiceState));
 }
 
 void QmlV8DebuggerClient::updateLocalsAndWatchers()
diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.h b/src/plugins/debugger/qml/qmlv8debuggerclient.h
index d3ce6fe6c093540d7f8d57fed62e254548bd2e83..1121133e66d463370b04542083f42ce2e87f2aa0 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.h
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.h
@@ -61,12 +61,11 @@ class QmlV8DebuggerClient : public QmlDebuggerClient
         Next
     };
 
-    enum V8DebuggerStates
+    enum V8DebugServiceStates
     {
         RunningState,
-        BreakpointsRequestedState,
-        BacktraceRequestedState,
-        WaitingForRequestState
+        WaitingForRequestState,
+        ProcessingRequestState
     };
 
 public:
@@ -106,6 +105,7 @@ public:
 
 protected:
     void messageReceived(const QByteArray &data);
+    void sendMessage(const QByteArray &msg);
 
 private:
     void updateStack(const QVariant &bodyVal, const QVariant &refsVal);
@@ -125,7 +125,7 @@ private:
                                 const QString &errorMessage);
     void clearExceptionSelection();
 
-    void resetState();
+    void resetDebugger();
 
     void updateLocalsAndWatchers();