diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
index 9300cc6f3f48eeea7986cfa160cb0a74a4ef99b1..777a609582417ef92ae09e817636f43f9bd21b76 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
@@ -286,23 +286,34 @@ bool ClientProxy::setBindingForObject(int objectDebugId,
                                       const QVariant &value,
                                       bool isLiteralValue)
 {
-    if (propertyName == QLatin1String("id") || objectDebugId == -1)
+    qDebug() << "setBindingForObject():" << objectDebugId << propertyName << value;
+    if (objectDebugId == -1)
         return false;
 
-//    qDebug() << "setBindingForObject():" << objectDebugId << propertyName << value << "isLiteral:" << isLiteralValue;
+    if (propertyName == QLatin1String("id"))
+        return false; // Crashes the QMLViewer.
 
     return m_client->setBindingForObject(objectDebugId, propertyName, value.toString(), isLiteralValue);
 }
 
 bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody)
 {
+    qDebug() << "setMethodBodyForObject():" << objectDebugId << methodName << methodBody;
     if (objectDebugId == -1)
         return 0;
-
-//    qDebug() << "setMethodBodyForObject():" << objectDebugId << methodName;
     return m_client->setMethodBody(objectDebugId, methodName, methodBody);
 }
 
+bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& propertyName)
+{
+    qDebug() << "resetBindingForObject():" << objectDebugId << propertyName;
+    if (objectDebugId == -1)
+        return false;
+    //    if (propertyName == QLatin1String("id"))  return false;
+    return m_client->resetBindingForObject(objectDebugId, propertyName);
+}
+
+
 void ClientProxy::queryEngineContext(int id)
 {
     if (id < 0)
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h
index 85d002425db36532ebde17889173d069dee91217..b231195d3a09faefbad4ad4eacad9f6382083e18 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.h
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.h
@@ -57,6 +57,7 @@ public:
                              bool isLiteralValue);
 
     bool setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody);
+    bool resetBindingForObject(int objectDebugId, const QString &propertyName);
 
     // returns the object references for the given url.
     QList<QDeclarativeDebugObjectReference> objectReferences(const QUrl &url = QUrl()) const;
diff --git a/src/plugins/qmljsinspector/qmljsdelta.cpp b/src/plugins/qmljsinspector/qmljsdelta.cpp
index 5a304dc51de44c31c025ea9c1d273411ea7307d4..35e9d7abca03d75e49130b0e4016ce97ffaa6f02 100644
--- a/src/plugins/qmljsinspector/qmljsdelta.cpp
+++ b/src/plugins/qmljsinspector/qmljsdelta.cpp
@@ -306,6 +306,87 @@ void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const Q
     }
 }
 
+void QmlJSInspector::Internal::Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc,
+                                             UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc,
+                                             const QList< QDeclarativeDebugObjectReference >& debugReferences)
+{
+    Q_ASSERT (oldObject && newObject);
+    QSet<QString> presentBinding;
+
+    for (UiObjectMemberList *objectMemberIt = objectMembers(newObject); objectMemberIt; objectMemberIt = objectMemberIt->next) {
+        if (UiScriptBinding *script = cast<UiScriptBinding *>(objectMemberIt->member)) {
+            bool found = false;
+            const QString property = _propertyName(script->qualifiedId);
+            presentBinding.insert(property);
+            for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(oldObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) {
+                if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) {
+                    if (compare(script->qualifiedId, previousScript->qualifiedId)) {
+                        found = true;
+                        const QString scriptCode = _scriptCode(script, newDoc);
+                        const QString previousScriptCode = _scriptCode(previousScript, oldDoc);
+
+                        if (scriptCode != previousScriptCode) {
+                            foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) {
+                                if (ref.debugId() != -1)
+                                    updateScriptBinding(ref, script, property, scriptCode);
+                            }
+                        }
+                    }
+                }
+            }
+            if (!found) {
+                const QString scriptCode = _scriptCode(script, newDoc);
+                foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) {
+                    if (ref.debugId() != -1)
+                        updateScriptBinding(ref, script, property, scriptCode);
+                }
+            }
+        } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(objectMemberIt->member)) {
+            bool found = false;
+            const QString methodName = _methodName(uiSource);
+            for (UiObjectMemberList *previousObjectMemberIt = objectMembers(oldObject);
+                previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) {
+                if (UiSourceElement *previousSource = cast<UiSourceElement*>(previousObjectMemberIt->member)) {
+                    if (compare(uiSource, previousSource)) {
+                        found = true;
+                        const QString methodCode = _methodCode(uiSource, newDoc);
+                        const QString previousMethodCode = _methodCode(previousSource, oldDoc);
+
+                        if (methodCode != previousMethodCode) {
+                            foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) {
+                                if (ref.debugId() != -1)
+                                    updateMethodBody(ref, script, methodName, methodCode);
+                            }
+                        }
+                    }
+                }
+            }
+            if (!found) {
+                const QString methodCode = _methodCode(uiSource, newDoc);
+                foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) {
+                    if (ref.debugId() != -1)
+                        updateMethodBody(ref, script, methodName, methodCode);
+                }
+            }
+        }
+    }
+
+    //reset property that are not present in the new object.
+    for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(oldObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) {
+        if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) {
+            const QString property = _propertyName(previousScript->qualifiedId);
+            if (!presentBinding.contains(property)) {
+                foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) {
+                    if (ref.debugId() != -1)
+                        ClientProxy::instance()->resetBindingForObject(ref.debugId(), property); // ### remove
+                }
+            }
+        }
+    }
+}
+
+
+
 Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::Ptr &doc2, const DebugIdMap &debugIds)
 {
     Q_ASSERT(doc1->qmlProgram());
@@ -327,81 +408,29 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P
         UiObjectMember *y = todo.takeFirst();
         todo += children(y);
 
+        if (!cast<UiObjectDefinition *>(y))
+            continue;
+
         if (!M.way2.contains(y)) {
+            qDebug () << "Delta::operator():  insert " << label(y, doc2) << " to " << label(parents2.parent.value(y), doc2);
             insert(y, parents2.parent.value(y), newDebuggIds.value(parents2.parent.value(y)), doc2);
-            qDebug () << "insert " << label(y, doc2) << " to " << label(parents2.parent.value(y), doc2);
             continue;
         }
         UiObjectMember *x = M.way2[y];
+        Q_ASSERT(cast<UiObjectDefinition *>(x));
 
-//--8<---------------------------------------------------------------------------------------
         if (debugIds.contains(x)) {
-            newDebuggIds[y] = debugIds[x];
-
-#if 1
-            UiObjectMember *object = y;
-            UiObjectMember *previousObject = x;
-
-            for (UiObjectMemberList *objectMemberIt = objectMembers(object); objectMemberIt; objectMemberIt = objectMemberIt->next) {
-                if (UiScriptBinding *script = cast<UiScriptBinding *>(objectMemberIt->member)) {
-                    bool found = false;
-                    for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(previousObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) {
-                        if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) {
-                            if (compare(script->qualifiedId, previousScript->qualifiedId)) {
-                                found = true;
-                                const QString scriptCode = _scriptCode(script, doc2);
-                                const QString previousScriptCode = _scriptCode(previousScript, doc1);
-
-                                if (scriptCode != previousScriptCode) {
-                                    const QString property = _propertyName(script->qualifiedId);
-                                    foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) {
-                                        if (ref.debugId() != -1)
-                                            updateScriptBinding(ref, script, property, scriptCode);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    if (!found) {
-                        const QString scriptCode = _scriptCode(script, doc2);
-                        const QString property = _propertyName(script->qualifiedId);
-                        foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) {
-                            if (ref.debugId() != -1)
-                                updateScriptBinding(ref, script, property, scriptCode);
-                        }
-                    }
-                } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(objectMemberIt->member)) {
-                    for (UiObjectMemberList *previousObjectMemberIt = objectMembers(previousObject);
-                    previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next)
-                    {
-                        if (UiSourceElement *previousSource = cast<UiSourceElement*>(previousObjectMemberIt->member)) {
-                            if (compare(uiSource, previousSource))
-                            {
-                                const QString methodCode = _methodCode(uiSource, doc2);
-                                const QString previousMethodCode = _methodCode(previousSource, doc1);
-
-                                if (methodCode != previousMethodCode) {
-                                    const QString methodName = _methodName(uiSource);
-                                    foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) {
-                                        if (ref.debugId() != -1)
-                                            updateMethodBody(ref, script, methodName, methodCode);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-#endif
+            QList< QDeclarativeDebugObjectReference > ids = debugIds[x];
+            newDebuggIds[y] = ids;
+            update(cast<UiObjectDefinition *>(x), doc1, cast<UiObjectDefinition *>(y), doc2, ids);
         }
-
-//--8<--------------------------------------------------------------------------------------------------
-
-        //qDebug() << "match "<< label(x, doc1) << "with parent " << label(parents1.parent.value(x), doc1)
+        //qDebug() << "Delta::operator():  match "<< label(x, doc1) << "with parent " << label(parents1.parent.value(x), doc1)
         //     << " to "<< label(y, doc2) << "with parent " << label(parents2.parent.value(y), doc2);
+        
+
         if (!M.contains(parents1.parent.value(x),parents2.parent.value(y))) {
-            qDebug () << "move " << label(y, doc2) << " from " << label(parents1.parent.value(x), doc1)
-            << " to " << label(parents2.parent.value(y), doc2);
+            qDebug () << "Delta::operator():  move " << label(y, doc2) << " from " << label(parents1.parent.value(x), doc1)
+            << " to " << label(parents2.parent.value(y), doc2)  << " ### TODO";
             continue;
         }
     }
@@ -410,8 +439,10 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P
     while(!todo.isEmpty()) {
         UiObjectMember *x = todo.takeFirst();
         todo += children(x);
+        if (!cast<UiObjectDefinition *>(x))
+            continue;
         if (!M.way1.contains(x)) {
-            qDebug () << "remove " << label(x, doc1);
+            qDebug () << "Delta::operator():  remove " << label(x, doc1) << " ### TODO";
             continue;
         }
     }
diff --git a/src/plugins/qmljsinspector/qmljsdelta.h b/src/plugins/qmljsinspector/qmljsdelta.h
index 0138e88031bbca3747068b1a927c09395d701ff1..e4220e2fbeda4d7d7169f3a11bf16311b87dedf1 100644
--- a/src/plugins/qmljsinspector/qmljsdelta.h
+++ b/src/plugins/qmljsinspector/qmljsdelta.h
@@ -81,6 +81,10 @@ private:
     void insert(UiObjectMember *member, UiObjectMember *parentMember,
                 const QList<QDeclarativeDebugObjectReference> &debugReferences, const Document::Ptr &doc);
 
+    void update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc,
+                UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc,
+                const QList<QDeclarativeDebugObjectReference >& debugReferences);
+
 private:
     QmlJS::Document::Ptr _doc;
     QmlJS::Document::Ptr _previousDoc;