diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
index f8a18ea64fb54b77e43cd9746271ec9c5e676ac4..c91609c24d2cd44c9b804177e942090b92e4ed6e 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp
@@ -51,6 +51,9 @@
 #include <QDir>
 #include <QAction>
 #include <zoomaction.h>
+#include <nodeabstractproperty.h>
+#include <nodelistproperty.h>
+
 
 namespace QmlDesigner {
 
@@ -264,6 +267,9 @@ void FormEditorView::scriptFunctionsChanged(const ModelNode &node, const QString
     QmlModelView::scriptFunctionsChanged(node, scriptFunctionList);
 }
 
+void FormEditorView::propertiesRemoved(const QList<AbstractProperty> &/*propertyList*/)
+{
+}
 
 AbstractFormEditorTool* FormEditorView::currentTool() const
 {
diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
index 4123ffdd7e0f68c0aa6af5cfe91efce349d728c7..7363f797430e1b5bc456ea7764570a5f0cbbaff8 100644
--- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h
+++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h
@@ -78,6 +78,7 @@ public:
     void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
                               const QList<ModelNode> &lastSelectedNodeList);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void propertiesRemoved(const QList<AbstractProperty> &propertyList);
 
     // FormEditorView
     FormEditorWidget *widget() const;
diff --git a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
index 9385ef83b73d9fcbb0a63becf0eb0f9bddcdc18c..2f07c5b181127dac4bc9cc56da7ed7eec9024f9e 100644
--- a/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/itemcreatortool.cpp
@@ -38,6 +38,7 @@
 #include <QGraphicsSceneMouseEvent>
 #include <QtDebug>
 #include <QClipboard>
+#include <variantproperty.h>
 
 namespace QmlDesigner {
 
diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
index 423e61d8fe314289918734babf5ea56690eab0f6..b02d2e4b4726a94cc656ebdff990dfa6f98b8076 100644
--- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp
@@ -42,6 +42,8 @@
 #include <limits>
 #include <model.h>
 #include <qmlanchors.h>
+#include <variantproperty.h>
+#include <nodeabstractproperty.h>
 
 
 namespace QmlDesigner {
diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp
index af8a9181e8f44318e4e51a04648915525714c02e..4967fe8b3d4d5b8ffeb5fb41c6b1f1fb8952a4a9 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.cpp
+++ b/src/plugins/qmldesigner/components/integration/componentview.cpp
@@ -160,7 +160,7 @@ void ComponentView::variantPropertiesChanged(const QList<VariantProperty>& /*pro
 void ComponentView::bindingPropertiesChanged(const QList<BindingProperty>& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {}
 void ComponentView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) {}
 void ComponentView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {}
-
+void ComponentView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList) {};
 
 
 void ComponentView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeList*/,
diff --git a/src/plugins/qmldesigner/components/integration/componentview.h b/src/plugins/qmldesigner/components/integration/componentview.h
index b1028b23e2f1c5f09678cba0573d74b4a3bd5bdf..d4612d0a63a8727820dea9c8c43e98b957f747d2 100644
--- a/src/plugins/qmldesigner/components/integration/componentview.h
+++ b/src/plugins/qmldesigner/components/integration/componentview.h
@@ -67,7 +67,7 @@ public:
     void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange);
     void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
-
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
 
     void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
                                       const QList<ModelNode> &lastSelectedNodeList);
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
index 71f812400b42c864dac243b8e8658fd981336af6..67daf39827ee6725cb465be6e2bc3c36b60c13d0 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp
@@ -50,6 +50,7 @@
 #include <rewritingexception.h>
 #include <nodelistproperty.h>
 #include <toolbox.h>
+#include <variantproperty.h>
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QDir>
@@ -87,6 +88,7 @@ public:
     QWeakPointer<AllPropertiesBox> allPropertiesBox;
     QWeakPointer<StatesEditorWidget> statesEditorWidget;
     QWeakPointer<QStackedWidget> stackedWidget;
+    QWeakPointer<NodeInstanceView> nodeInstanceView;
 
     QWeakPointer<QmlDesigner::Model> model;
     QWeakPointer<QmlDesigner::Model> subComponentModel;
@@ -212,6 +214,11 @@ void DesignDocumentController::setFormEditorView(FormEditorView *formEditorView)
     m_d->formEditorView = formEditorView;
 }
 
+void DesignDocumentController::setNodeInstanceView(NodeInstanceView *nodeInstanceView)
+{
+    m_d->nodeInstanceView = nodeInstanceView;
+}
+
 QString DesignDocumentController::displayName() const
 {
     if (fileName().isEmpty())
@@ -344,6 +351,7 @@ void DesignDocumentController::loadCurrentModel()
     Q_ASSERT(m_d->model);
     m_d->model->setMasterModel(m_d->masterModel.data());
 
+    m_d->model->attachView(m_d->nodeInstanceView.data());
     m_d->model->attachView(m_d->navigator.data());
     m_d->itemLibrary->setItemLibraryInfo(m_d->model->metaInfo().itemLibraryInfo());
     m_d->itemLibrary->setResourcePath(QFileInfo(m_d->fileName).absolutePath());
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h
index fc52581f1c0b99998e528c7d621f78a05d3b9bae..76bed22727030362681b827bd1194031369556fa 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.h
@@ -94,6 +94,7 @@ public:
     void setAllPropertiesBox(AllPropertiesBox* allPropertiesBox);
     void setStatesEditorWidget(StatesEditorWidget* statesEditorWidget);
     void setFormEditorView(FormEditorView *formEditorView);
+    void setNodeInstanceView(NodeInstanceView *nodeInstanceView);
 
 signals:
     void displayNameChanged(const QString &newFileName);
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
index e434c55ca57d38455af48b2b269cc19a077953db..6e63157a2b75bf0f43cc2f725b2b213a9f402a18 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp
@@ -60,6 +60,9 @@ void DesignDocumentControllerView::scriptFunctionsChanged(const ModelNode &/*nod
 {
 }
 
+void DesignDocumentControllerView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &/*propertyList*/)
+{
+}
 
 static QStringList arrayToStringList(const QByteArray &byteArray)
 {
diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
index 9632c3569a22279da2273033a3a906ee6fe75409..6fc0273029531f4e39b84c90185a457495b105b8 100644
--- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
+++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.h
@@ -58,6 +58,8 @@ public:
 
     virtual void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex);
     virtual void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
+
 
     ModelNode insertModel(const ModelNode &modelNode)
     { return m_modelMerger.insertModel(modelNode); }
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index 55281be45b9334ebbe3f53a77fa6f54f3ecd9762..3fe79262014a831b19c37b031d2377c3fe32d341 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -190,6 +190,9 @@ void NavigatorView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStr
 {
 }
 
+void NavigatorView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &/*propertyList*/)
+{
+}
 
 void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &node, int oldIndex)
 {
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index 27ffbb47bc89c0cddb104f17224eb1bce924ee0d..5b142e18b08ab22dc6e6b4bc17aab48fb2367e27 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -81,7 +81,7 @@ public:
                                       const QList<ModelNode> &lastSelectedNodeList);
     void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
-
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
 
 private slots:
 //    void handleChangedItem(QStandardItem * item);
diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
index bc430d05d9f4ae3eeae93d2e6b422dcae26a350c..47a2aae2c559c91630e24fc8fb974ecb8e064e5f 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
@@ -40,6 +40,10 @@
 #include <variantproperty.h>
 #include <propertymetainfo.h>
 
+#include <bindingproperty.h>
+
+#include <nodeabstractproperty.h>
+
 #include "propertyeditorvalue.h"
 #include "basiclayouts.h"
 #include "basicwidgets.h"
diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp
index 657e696b33c36eb4cc8ab276de0205554b3320ad..1b3cde6fd5a7f8cf7fefd95023291727ea6e98c3 100644
--- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp
+++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp
@@ -36,6 +36,9 @@
 #include <QDebug>
 #include <math.h>
 
+#include <variantproperty.h>
+#include <nodelistproperty.h>
+
 enum {
     debug = false
 };
@@ -434,6 +437,21 @@ void StatesEditorView::scriptFunctionsChanged(const ModelNode &node, const QStri
     QmlModelView::scriptFunctionsChanged(node, scriptFunctionList);
 }
 
+void StatesEditorView::nodeIdChanged(const ModelNode &/*node*/, const QString &/*newId*/, const QString &/*oldId*/)
+{
+
+}
+
+void StatesEditorView::bindingPropertiesChanged(const QList<BindingProperty> &/*propertyList*/, PropertyChangeFlags /*propertyChange*/)
+{
+
+}
+
+void StatesEditorView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeList*/, const QList<ModelNode> &/*lastSelectedNodeList*/)
+{
+
+}
+
 
 QPixmap StatesEditorView::renderState(int i)
 {
diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h
index dc0acbfd1ca78fb01149d0ed089782ca9f5db9fa..9dd8d8b099cadd3bc33ef21363d297902b568cca 100644
--- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h
+++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.h
@@ -76,6 +76,9 @@ public:
 
     void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId);
+    void bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags propertyChange);
+    void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList);
 
 
 protected:
diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h
index 1351f83e9223bbee688d80108b4b2b2967fb287e..118ae560ac984f7a65632c2ec9ef04a111cf0d7f 100644
--- a/src/plugins/qmldesigner/designercore/include/abstractview.h
+++ b/src/plugins/qmldesigner/designercore/include/abstractview.h
@@ -54,6 +54,7 @@ namespace QmlDesigner {
 namespace QmlDesigner {
 
 class QmlModelView;
+class NodeInstanceView;
 
 class CORESHARED_EXPORT AbstractView : public QObject
 {
@@ -101,6 +102,8 @@ public:
     void emitCustomNotification(const QString &identifier, const QList<ModelNode> &nodeList);
     void emitCustomNotification(const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
 
+    void emitInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
+
     virtual void modelAttached(Model *model);
     virtual void modelAboutToBeDetached(Model *model);
 
@@ -115,6 +118,8 @@ public:
     virtual void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange) = 0;
     virtual void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) = 0;
 
+    virtual void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList) = 0;
+
     virtual void selectedNodesChanged(const QList<ModelNode> &selectedNodeList,
                                       const QList<ModelNode> &lastSelectedNodeList) = 0;
 
@@ -135,6 +140,8 @@ public:
 
     void changeRootNodeType(const QString &type, int majorVersion, int minorVersion);
 
+    NodeInstanceView *nodeInstanceView() const;
+
 protected:
     void setModel(Model * model);
     void removeModel();
diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
index 64835fbe36758019de73160525c96c8b3a1b3b80..d2aa710252210d3a30d689e4721e738d7109dbd6 100644
--- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
+++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h
@@ -85,6 +85,7 @@ public:
     void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex);
     void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
 
 
     QList<NodeInstance> instances() const;
@@ -100,9 +101,6 @@ public:
 
     void notifyPropertyChange(const ModelNode &modelNode, const QString &propertyName);
 
-    void setQmlModelView(QmlModelView *qmlModelView);
-    QmlModelView *qmlModelView() const ;
-
     void setBlockStatePropertyChanges(bool block);
 
     NodeInstance activeStateInstance() const;
diff --git a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
index f48f76fc31f53eb1214428b542faa85bdabd976e..c7a752e568b501f60a33e96d4adbd0373404a124 100644
--- a/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
+++ b/src/plugins/qmldesigner/designercore/include/qmlmodelview.h
@@ -31,7 +31,6 @@
 #define QMLMODELVIEW_H
 
 #include <corelib_global.h>
-#include <forwardview.h>
 #include <abstractview.h>
 #include "qmlitemnode.h"
 #include "qmlstate.h"
@@ -42,7 +41,7 @@ namespace QmlDesigner {
 
 class ItemLibraryEntry;
 
-class CORESHARED_EXPORT QmlModelView : public ForwardView<NodeInstanceView>
+class CORESHARED_EXPORT QmlModelView : public AbstractView
 {
     Q_OBJECT
     friend CORESHARED_EXPORT class QmlObjectNode;
@@ -90,10 +89,26 @@ public:
 
     virtual void nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName);
 
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
+
+    void nodeCreated(const ModelNode &createdNode);
+    void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);
+    void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent, const NodeAbstractProperty &oldPropertyParent, AbstractView::PropertyChangeFlags propertyChange);
+    void propertiesAboutToBeRemoved(const QList<AbstractProperty> &propertyList);
+    void rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion);
+    void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex);
+    void nodeAboutToBeRemoved(const ModelNode &removedNode);
+    void nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId);
+    void propertiesRemoved(const QList<AbstractProperty>& propertyList);
+    void variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange);
+    void bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange);
+    void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList);
+
+
 protected:
     NodeInstance instanceForModelNode(const ModelNode &modelNode);
     bool hasInstanceForModelNode(const ModelNode &modelNode);
-    NodeInstanceView *nodeInstanceView() const;
     virtual void transformChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName) ;
     virtual void parentChanged(const QmlObjectNode &qmlObjectNode);
     virtual void otherPropertyChanged(const QmlObjectNode &qmlObjectNode, const QString &propertyName);
diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h
index 77875ff64fbaa3c1adbe7559d1620e5d376efd01..3b40ba0fcb9ee74b95aed631d0cfd6e771a1fd80 100644
--- a/src/plugins/qmldesigner/designercore/include/rewriterview.h
+++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h
@@ -126,6 +126,8 @@ public:
     void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
 
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
+
     void importAdded(const Import &import);
     void importRemoved(const Import &import);
 
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index 728d5867a9a7da4224bc4c699aa1928350676554..c058a89bfd559a6ad4b422493517d2cdb1690cb3 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -379,6 +379,12 @@ void NodeInstanceView::scriptFunctionsChanged(const ModelNode &/*node*/, const Q
 
 }
 
+void NodeInstanceView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &/*propertyList*/)
+{
+
+}
+
+
 //\}
 
 void NodeInstanceView::loadNodes(const QList<ModelNode> &nodeList)
@@ -557,21 +563,9 @@ void NodeInstanceView::notifyPropertyChange(const ModelNode &node, const QString
     if (m_blockStatePropertyChanges)
         return;
 
-    if (qmlModelView()) {
-        qmlModelView()->nodeInstancePropertyChanged(ModelNode(node,qmlModelView()), propertyName);
-    }
-}
-
-
-void NodeInstanceView::setQmlModelView(QmlModelView *qmlModelView)
-{
-    m_qmlModelView = qmlModelView;
+    emitInstancePropertyChange(QList<QPair<ModelNode, QString> >() << qMakePair(node, propertyName));
 }
 
-QmlModelView *NodeInstanceView::qmlModelView() const
-{
-    return m_qmlModelView.data();
-}
 
 void NodeInstanceView::setBlockStatePropertyChanges(bool block)
 {
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index ea979b1ee586781c4d80c2f5ece1bb71cd3dbde9..9fc221a0df149762fc866253e60463ec8b3ac8f7 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -339,6 +339,15 @@ QmlModelView *AbstractView::toQmlModelView()
     return qobject_cast<QmlModelView*>(this);
 }
 
+NodeInstanceView *AbstractView::nodeInstanceView() const
+{
+    if (model()) {
+        return model()->m_d->nodeInstanceView();
+    } else {
+        return 0;
+    }
+}
+
 QList<ModelNode> AbstractView::allModelNodes()
 {
    return toModelNodeList(model()->m_d->allNodes());
@@ -359,6 +368,12 @@ void AbstractView::emitCustomNotification(const QString &identifier, const QList
     model()->m_d->notifyCustomNotification(this, identifier, nodeList, data);
 }
 
+void AbstractView::emitInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList)
+{
+    if (model())
+        model()->m_d->notifyInstancePropertyChange(propertyList);
+}
+
 void AbstractView::changeRootNodeType(const QString &type, int majorVersion, int minorVersion)
 {
     Internal::WriteLocker locker(m_model.data());
diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index dc66a9c97055a0030ef534eeeefaa16aa83642fb..181418dbc84609487cd18eaae28e52ffce07a557 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -44,7 +44,7 @@
 #include <QPlainTextEdit>
 
 #include "abstractview.h"
-#include "widgetqueryview.h"
+#include "nodeinstanceview.h"
 #include "metainfo.h"
 #include "model_p.h"
 #include "modelutilities.h"
@@ -88,14 +88,13 @@ namespace Internal {
 
 ModelPrivate::ModelPrivate(Model *model) :
         m_q(model),
-        m_rootInternalNode(createNode("Qt/Rectangle", 4, 7, PropertyListType())),
         m_writeLock(false)
 {
+    m_rootInternalNode = createNode("Qt/Item", 4, 7, PropertyListType());
 }
 
 ModelPrivate::~ModelPrivate()
 {
-
     detachAllViews();
 }
 
@@ -135,16 +134,55 @@ void ModelPrivate::removeImport(const Import &import)
     notifyImportRemoved(import);
 }
 
-void ModelPrivate::notifyImportAdded(const Import &import) const
+void ModelPrivate::notifyImportAdded(const Import &import)
 {
+    bool resetModel = false;
+    QString description;
+
+    try {
+        if (rewriterView()) {
+            rewriterView()->importAdded(import);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    if (rewriterView())
     foreach (const QWeakPointer<AbstractView> &view, m_viewList)
         view->importAdded(import);
+
+    if (nodeInstanceView())
+        nodeInstanceView()->importAdded(import);
+
+    if (resetModel) {
+        resetModelByRewriter(description);
+    }
 }
 
-void ModelPrivate::notifyImportRemoved(const Import &import) const
+void ModelPrivate::notifyImportRemoved(const Import &import)
 {
+    bool resetModel = false;
+    QString description;
+
+    try {
+        if (rewriterView()) {
+            rewriterView()->importRemoved(import);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList)
         view->importRemoved(import);
+
+    if (nodeInstanceView())
+        nodeInstanceView()->importRemoved(import);
+
+    if (resetModel) {
+        resetModelByRewriter(description);
+    }
 }
 
 QUrl ModelPrivate::fileUrl() const
@@ -286,15 +324,26 @@ void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &interna
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode node(internalNode, model(), rewriterView());
+            rewriterView()->auxiliaryDataChanged(node, name, data);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
         ModelNode node(internalNode, model(), view.data());
-        try {
-            view->auxiliaryDataChanged(node, name, data);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->auxiliaryDataChanged(node, name, data);
+
+    }
+
+    if (nodeInstanceView()) {
+        ModelNode node(internalNode, model(), nodeInstanceView());
+        nodeInstanceView()->auxiliaryDataChanged(node, name, data);
     }
 
     if (resetModel) {
@@ -307,35 +356,68 @@ void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersi
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView())
+            rewriterView()->rootNodeTypeChanged(type, majorVersion, minorVersion);
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
-        try {
-            view->rootNodeTypeChanged(type, majorVersion, minorVersion);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->rootNodeTypeChanged(type, majorVersion, minorVersion);
+
     }
 
+    if (nodeInstanceView())
+        nodeInstanceView()->rootNodeTypeChanged(type, majorVersion, minorVersion);
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
 }
 
+void ModelPrivate::notifyInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyPairList)
+{
+    // no need to notify the rewriter or the instance view
+
+    typedef QPair<ModelNode, QString> ModelNodePropertyPair;
+    foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
+        Q_ASSERT(view != 0);
+
+        QList<QPair<ModelNode, QString> > adaptedPropertyList;
+        foreach (const ModelNodePropertyPair &propertyPair, propertyPairList) {
+            ModelNodePropertyPair newPair(ModelNode(propertyPair.first.internalNode(), model(), view.data()), propertyPair.second);
+            adaptedPropertyList.append(newPair);
+        }
+
+        view->instancePropertyChange(adaptedPropertyList);
+    }
+}
+
 void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data)
 {
     bool resetModel = false;
     QString description;
 
     QList<Internal::InternalNode::Pointer> internalList(toInternalNodeList(nodeList));
+
+    try {
+        if (rewriterView())
+            rewriterView()->customNotification(senderView, identifier, toModelNodeList(internalList, rewriterView()), data);
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
-        try {
-            view->customNotification(senderView, identifier, toModelNodeList(internalList, view.data()), data);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->customNotification(senderView, identifier, toModelNodeList(internalList, view.data()), data);
+    }
+
+    if (nodeInstanceView()) {
+        rewriterView()->customNotification(senderView, identifier, toModelNodeList(internalList, nodeInstanceView()), data);
     }
 
     if (resetModel) {
@@ -349,6 +431,33 @@ void ModelPrivate::notifyPropertiesRemoved(const QList<PropertyPair> &propertyPa
     bool resetModel = false;
     QString description;
 
+
+
+    try {
+        if (rewriterView()) {
+            QList<AbstractProperty> propertyList;
+            foreach (const PropertyPair &propertyPair, propertyPairList) {
+                AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), rewriterView());
+                propertyList.append(newProperty);
+            }
+
+            rewriterView()->propertiesRemoved(propertyList);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    if (nodeInstanceView()) {
+        QList<AbstractProperty> propertyList;
+        foreach (const PropertyPair &propertyPair, propertyPairList) {
+            AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), nodeInstanceView());
+            propertyList.append(newProperty);
+        }
+
+        nodeInstanceView()->propertiesRemoved(propertyList);
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         QList<AbstractProperty> propertyList;
         Q_ASSERT(view != 0);
@@ -356,12 +465,8 @@ void ModelPrivate::notifyPropertiesRemoved(const QList<PropertyPair> &propertyPa
             AbstractProperty newProperty(propertyPair.second, propertyPair.first, model(), view.data());
             propertyList.append(newProperty);
         }
-        try {
-            view->propertiesRemoved(propertyList);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+
+        view->propertiesRemoved(propertyList);
     }
 
     if (resetModel) {
@@ -374,6 +479,23 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList<InternalProperty
     bool resetModel = false;
     QString description;
 
+
+
+    try {
+        if (rewriterView()) {
+            QList<AbstractProperty> propertyList;
+            foreach (const InternalProperty::Pointer &property, internalPropertyList) {
+                AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), rewriterView());
+                propertyList.append(newProperty);
+            }
+
+            rewriterView()->propertiesAboutToBeRemoved(propertyList);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         QList<AbstractProperty> propertyList;
         Q_ASSERT(view != 0);
@@ -389,6 +511,16 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList<InternalProperty
         }
     }
 
+    if (nodeInstanceView()) {
+        QList<AbstractProperty> propertyList;
+        foreach (const InternalProperty::Pointer &property, internalPropertyList) {
+            AbstractProperty newProperty(property->name(), property->propertyOwner(), model(), nodeInstanceView());
+            propertyList.append(newProperty);
+        }
+
+        nodeInstanceView()->propertiesAboutToBeRemoved(propertyList);
+    }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -437,17 +569,28 @@ void ModelPrivate::notifyNodeCreated(const InternalNode::Pointer &newInternalNod
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode createdNode(newInternalNodePointer, model(), rewriterView());
+            rewriterView()->nodeCreated(createdNode);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
         ModelNode createdNode(newInternalNodePointer, model(), view.data());
+        view->nodeCreated(createdNode);
+    }
 
-        try {
-            view->nodeCreated(createdNode);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+
+    if (nodeInstanceView()) {
+        ModelNode createdNode(newInternalNodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->nodeCreated(createdNode);
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -458,16 +601,28 @@ void ModelPrivate::notifyNodeAboutToBeRemoved(const InternalNode::Pointer &nodeP
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode node(nodePointer, model(), rewriterView());
+            rewriterView()->nodeAboutToBeRemoved(node);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    if (nodeInstanceView()) {
+        ModelNode node(nodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->nodeAboutToBeRemoved(node);
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
         ModelNode node(nodePointer, model(), view.data());
-        try {
-            view->nodeAboutToBeRemoved(node);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->nodeAboutToBeRemoved(node);
     }
+
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -478,17 +633,31 @@ void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &nodePointer, con
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode node(nodePointer, model(), rewriterView());
+            NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), rewriterView());
+            rewriterView()->nodeRemoved(node, parentProperty, propertyChange);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    if (nodeInstanceView()) {
+        ModelNode node(nodePointer, model(), nodeInstanceView());
+        NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->nodeRemoved(node, parentProperty, propertyChange);
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
         ModelNode node(nodePointer, model(), view.data());
         NodeAbstractProperty parentProperty(parentPropertyName, parentNodePointer, model(), view.data());
-        try {
-            view->nodeRemoved(node, parentProperty, propertyChange);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->nodeRemoved(node, parentProperty, propertyChange);
+
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -499,16 +668,27 @@ void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer& nodePointer,
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode node(nodePointer, model(), rewriterView());
+            rewriterView()->nodeIdChanged(node, newId, oldId);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
         ModelNode node(nodePointer, model(), view.data());
-        try {
-            view->nodeIdChanged(node, newId, oldId);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->nodeIdChanged(node, newId, oldId);
+    }
+
+    if (nodeInstanceView()) {
+        ModelNode node(nodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->nodeIdChanged(node, newId, oldId);
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -519,19 +699,37 @@ void ModelPrivate::notifyBindingPropertiesChanged(const QList<InternalBindingPro
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            QList<BindingProperty> propertyList;
+            foreach (const InternalBindingPropertyPointer &bindingProperty, internalBropertyList) {
+                propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), rewriterView()));
+            }
+            rewriterView()->bindingPropertiesChanged(propertyList, propertyChange);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
-        QList<BindingProperty> propertyList;
         Q_ASSERT(view != 0);
+        QList<BindingProperty> propertyList;
         foreach (const InternalBindingPropertyPointer &bindingProperty, internalBropertyList) {
             propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), view.data()));
         }
-        try {
-            view->bindingPropertiesChanged(propertyList, propertyChange);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
+        view->bindingPropertiesChanged(propertyList, propertyChange);
+
+    }
+
+    if (nodeInstanceView()) {
+        QList<BindingProperty> propertyList;
+        foreach (const InternalBindingPropertyPointer &bindingProperty, internalBropertyList) {
+            propertyList.append(BindingProperty(bindingProperty->name(), bindingProperty->propertyOwner(), model(), nodeInstanceView()));
         }
+        nodeInstanceView()->bindingPropertiesChanged(propertyList, propertyChange);
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -542,18 +740,29 @@ void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &inter
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            ModelNode node(internalNodePointer, model(), rewriterView());
+            rewriterView()->scriptFunctionsChanged(node, scriptFunctionList);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+    if (nodeInstanceView()) {
+        ModelNode node(internalNodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->scriptFunctionsChanged(node, scriptFunctionList);
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         Q_ASSERT(view != 0);
 
-
         ModelNode node(internalNodePointer, model(), view.data());
-        try {
-            view->scriptFunctionsChanged(node, scriptFunctionList);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+        view->scriptFunctionsChanged(node, scriptFunctionList);
+
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -565,6 +774,25 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &int
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            QList<VariantProperty> propertyList;
+            foreach (const QString &propertyName, propertyNameList) {
+                Q_ASSERT(internalNodePointer->hasProperty(propertyName));
+                Q_ASSERT(internalNodePointer->property(propertyName)->isVariantProperty());
+                VariantProperty property(propertyName, internalNodePointer, model(), rewriterView());
+                propertyList.append(property);
+            }
+
+            ModelNode node(internalNodePointer, model(), rewriterView());
+            rewriterView()->variantPropertiesChanged(propertyList, propertyChange);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         QList<VariantProperty> propertyList;
         Q_ASSERT(view != 0);
@@ -575,13 +803,23 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &int
             propertyList.append(property);
         }
         ModelNode node(internalNodePointer, model(), view.data());
-        try {
-            view->variantPropertiesChanged(propertyList, propertyChange);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
+        view->variantPropertiesChanged(propertyList, propertyChange);
+
+    }
+
+    if (nodeInstanceView()) {
+        QList<VariantProperty> propertyList;
+        foreach (const QString &propertyName, propertyNameList) {
+            Q_ASSERT(internalNodePointer->hasProperty(propertyName));
+            Q_ASSERT(internalNodePointer->property(propertyName)->isVariantProperty());
+            VariantProperty property(propertyName, internalNodePointer, model(), nodeInstanceView());
+            propertyList.append(property);
         }
+
+        ModelNode node(internalNodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->variantPropertiesChanged(propertyList, propertyChange);
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -592,6 +830,24 @@ void ModelPrivate::notifyNodeReparent(const InternalNode::Pointer &internalNodeP
     bool resetModel = false;
     QString description;
 
+    try {
+        if (rewriterView()) {
+            NodeAbstractProperty newProperty;
+            NodeAbstractProperty oldProperty;
+
+            if (!oldPropertyName.isEmpty() && oldParent->isValid())
+                oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), rewriterView());
+
+            if (!newPropertyParent.isNull())
+                newProperty = NodeAbstractProperty(newPropertyParent, model(), rewriterView());
+            ModelNode node(internalNodePointer, model(), rewriterView());
+            rewriterView()->nodeReparented(node, newProperty, oldProperty, propertyChange);
+        }
+    } catch (RewritingException &e) {
+        description = e.description();
+        resetModel = true;
+    }
+
     foreach (const QWeakPointer<AbstractView> &view, m_viewList) {
         NodeAbstractProperty newProperty;
         NodeAbstractProperty oldProperty;
@@ -603,13 +859,24 @@ void ModelPrivate::notifyNodeReparent(const InternalNode::Pointer &internalNodeP
         if (!newPropertyParent.isNull())
             newProperty = NodeAbstractProperty(newPropertyParent, model(), view.data());
         ModelNode node(internalNodePointer, model(), view.data());
-        try {
-            view->nodeReparented(node, newProperty, oldProperty, propertyChange);
-        } catch (RewritingException &e) {
-            description = e.description();
-            resetModel = true;
-        }
+
+        view->nodeReparented(node, newProperty, oldProperty, propertyChange);
+
+    }
+
+    if (nodeInstanceView()) {
+        NodeAbstractProperty newProperty;
+        NodeAbstractProperty oldProperty;
+
+        if (!oldPropertyName.isEmpty() && oldParent->isValid())
+            oldProperty = NodeAbstractProperty(oldPropertyName, oldParent, model(), nodeInstanceView());
+
+        if (!newPropertyParent.isNull())
+            newProperty = NodeAbstractProperty(newPropertyParent, model(), nodeInstanceView());
+        ModelNode node(internalNodePointer, model(), nodeInstanceView());
+        nodeInstanceView()->nodeReparented(node, newProperty, oldProperty, propertyChange);
     }
+
     if (resetModel) {
         resetModelByRewriter(description);
     }
@@ -895,6 +1162,45 @@ void ModelPrivate::setRootNode(const InternalNode::Pointer& newRootNode)
         notifyNodeCreated(m_rootInternalNode);
 }
 
+void  ModelPrivate::setRewriterView(RewriterView *rewriterView)
+{
+    if (rewriterView == m_rewriterView.data())
+        return;
+
+    Q_ASSERT(!(rewriterView && m_rewriterView));
+
+    m_rewriterView = rewriterView;
+
+    if (rewriterView)
+        rewriterView->modelAttached(model());
+    else if (m_rewriterView)
+        m_rewriterView->modelAboutToBeDetached(model());
+}
+
+RewriterView  *ModelPrivate::rewriterView() const
+{
+    return m_rewriterView.data();
+}
+
+void ModelPrivate::setNodeInstanceView(NodeInstanceView *nodeInstanceView)
+{
+    if (nodeInstanceView == m_nodeInstanceView.data())
+        return;
+
+    Q_ASSERT(!(nodeInstanceView && m_nodeInstanceView));
+
+    m_nodeInstanceView = nodeInstanceView;
+
+    if (nodeInstanceView)
+        nodeInstanceView->modelAttached(m_q);
+    else if (m_nodeInstanceView)
+        m_nodeInstanceView->modelAttached(m_q);
+}
+
+NodeInstanceView *ModelPrivate::nodeInstanceView() const
+{
+    return m_nodeInstanceView.data();
+}
 
 InternalNodePointer ModelPrivate::nodeForId(const QString &id) const
 {
@@ -1144,6 +1450,18 @@ The view is informed that it has been registered within the model by a call to A
 void Model::attachView(AbstractView *view)
 {
 //    Internal::WriteLocker locker(m_d);
+    RewriterView *rewriterView = qobject_cast<RewriterView*>(view);
+    if (rewriterView) {
+        m_d->setRewriterView(rewriterView);
+        return;
+    }
+
+    NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view);
+    if (nodeInstanceView) {
+        m_d->setNodeInstanceView(nodeInstanceView);
+        return;
+    }
+
     m_d->attachView(view);
 }
 
@@ -1159,6 +1477,19 @@ void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify)
 {
 //    Internal::WriteLocker locker(m_d);
     bool emitNotify = (emitDetachNotify == NotifyView);
+
+    RewriterView *rewriterView = qobject_cast<RewriterView*>(view);
+    if (rewriterView) {
+        m_d->setRewriterView(0);
+        return;
+    }
+
+    NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view);
+    if (nodeInstanceView) {
+        m_d->setNodeInstanceView(0);
+        return;
+    }
+
     m_d->detachView(view, emitNotify);
 }
 
diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h
index f678e362db73c894fadcce2d9c2c45f1b001681d..7589f462a811165a61ab28e971373dfb1d3f3418 100644
--- a/src/plugins/qmldesigner/designercore/model/model_p.h
+++ b/src/plugins/qmldesigner/designercore/model/model_p.h
@@ -48,7 +48,8 @@ QT_END_NAMESPACE
 namespace QmlDesigner {
 
 class AbstractProperty;
-
+class RewriterView;
+class NodeInstanceView;
 
 namespace Internal {
 
@@ -140,6 +141,7 @@ public:
     void notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion);
 
     void notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
+    void notifyInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
 
 
 
@@ -160,8 +162,8 @@ public:
     QList<Import> imports() const { return m_imports; }
     void addImport(const Import &import);
     void removeImport(const Import &import);
-    void notifyImportAdded(const Import &import) const;
-    void notifyImportRemoved(const Import &import) const;
+    void notifyImportAdded(const Import &import);
+    void notifyImportRemoved(const Import &import);
 
 
     //node state property manipulation
@@ -190,6 +192,11 @@ public:
 
     WriteLocker createWriteLocker() const;
 
+    void setRewriterView(RewriterView *rewriterView);
+    RewriterView *rewriterView() const;
+    void setNodeInstanceView(NodeInstanceView *nodeInstanceView);
+    NodeInstanceView *nodeInstanceView() const;
+
 private: //functions
     void removePropertyWithoutNotification(const InternalPropertyPointer &property);
     void removeAllSubNodes(const InternalNodePointer &node);
@@ -212,8 +219,9 @@ private:
     QUrl m_fileUrl;
 
     QWeakPointer<Model> m_masterModel;
-
-    bool m_writeLock;
+    QWeakPointer<RewriterView> m_rewriterView;
+    QWeakPointer<NodeInstanceView> m_nodeInstanceView;
+    bool m_writeLock;  
 };
 
 }
diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
index d0885e77df84ddfd616e286ba132c443ffb3f63c..21baa1eabec7ea38f8ae9089e90e675c6a8c75d0 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp
@@ -38,6 +38,8 @@
 #include <QFileInfo>
 #include <QDebug>
 #include <QMessageBox>
+#include "nodeabstractproperty.h"
+#include "variantproperty.h"
 
 enum {
     debug = false
@@ -47,11 +49,8 @@ enum {
 namespace QmlDesigner {
 
 QmlModelView::QmlModelView(QObject *parent)
-    : ForwardView<NodeInstanceView>(parent)
+    : AbstractView(parent)
 {
-    NodeInstanceView *nodeInstanceView = new NodeInstanceView(this);
-    nodeInstanceView->setQmlModelView(this);
-    appendView(nodeInstanceView);
 }
 
 void QmlModelView::setCurrentState(const QmlModelState &state)
@@ -302,23 +301,18 @@ bool QmlModelView::hasInstanceForModelNode(const ModelNode &modelNode)
     return nodeInstanceView()->hasInstanceForNode(modelNode);
 }
 
-NodeInstanceView *QmlModelView::nodeInstanceView() const
-{
-    return firstView();
-}
-
 void QmlModelView::modelAttached(Model *model)
 {
+    AbstractView::modelAttached(model);
     m_state = QmlModelState();
-    ForwardView<NodeInstanceView>::modelAttached(model);
     m_state = baseState();
     Q_ASSERT(m_state.isBaseState());
 }
 
 void QmlModelView::modelAboutToBeDetached(Model *model)
 {
-    ForwardView<NodeInstanceView>::modelAboutToBeDetached(model);
     m_state = QmlModelState();
+    AbstractView::modelAboutToBeDetached(model);
 }
 
 static bool isTransformProperty(const QString &name)
@@ -335,6 +329,32 @@ static bool isTransformProperty(const QString &name)
     return transformProperties.contains(name);
 }
 
+void QmlModelView::nodeOrderChanged(const NodeListProperty &/*listProperty*/, const ModelNode &/*movedNode*/, int /*oldIndex*/)
+{
+
+}
+
+void QmlModelView::nodeCreated(const ModelNode &/*createdNode*/) {}
+void QmlModelView::nodeAboutToBeRemoved(const ModelNode &/*removedNode*/) {}
+void QmlModelView::nodeRemoved(const ModelNode &/*removedNode*/, const NodeAbstractProperty &/*parentProperty*/, PropertyChangeFlags /*propertyChange*/) {}
+void QmlModelView::nodeReparented(const ModelNode &/*node*/, const NodeAbstractProperty &/*newPropertyParent*/, const NodeAbstractProperty &/*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) {}
+void QmlModelView::nodeIdChanged(const ModelNode& /*node*/, const QString& /*newId*/, const QString& /*oldId*/) {}
+void QmlModelView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& /*propertyList*/) {}
+void QmlModelView::propertiesRemoved(const QList<AbstractProperty>& /*propertyList*/) {}
+void QmlModelView::variantPropertiesChanged(const QList<VariantProperty>& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {}
+void QmlModelView::bindingPropertiesChanged(const QList<BindingProperty>& /*propertyList*/, PropertyChangeFlags /*propertyChange*/) {}
+void QmlModelView::rootNodeTypeChanged(const QString &/*type*/, int, int /*minorVersion*/) {}
+void QmlModelView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStringList &/*scriptFunctionList*/) {}
+void QmlModelView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeList*/, const QList<ModelNode> &/*lastSelectedNodeList*/) {}
+
+void QmlModelView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList)
+{
+    typedef QPair<ModelNode, QString> ModelNodePropertyPair;
+    foreach (const ModelNodePropertyPair &propertyPair, propertyList) {
+        nodeInstancePropertyChanged(propertyPair.first, propertyPair.second);
+    }
+}
+
 void QmlModelView::nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName)
 {
     if (debug)
diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
index 41ff3507249fa6409ed3e6bb3d627d2800608fac..e237956988fbd3c4a791f2c7437184b7c793d505 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp
@@ -38,6 +38,8 @@
 #include "nodeinstanceview.h"
 #include "nodeinstance.h"
 #include "nodemetainfo.h"
+#include "bindingproperty.h"
+#include "nodelistproperty.h"
 
 namespace QmlDesigner {
 
diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
index 2c21384598da7a117873614ad2d5c60d19a02b3f..bd17f083f17c5861ceced091925fe7ad30d91cc1 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp
@@ -33,6 +33,7 @@
 #include <variantproperty.h>
 #include <metainfo.h>
 #include <invalidmodelnodeexception.h>
+#include "bindingproperty.h"
 
 
 namespace QmlDesigner {
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index 7a042b75116ea4b6f632be3d20bedb071aad871c..f610f3f6b307eda2d570a700ba0a3ae95861b6dc 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -356,6 +356,11 @@ void RewriterView::scriptFunctionsChanged(const ModelNode &/*node*/, const QStri
 {
 }
 
+void RewriterView::instancePropertyChange(const QList<QPair<ModelNode, QString> > &/*propertyList*/)
+{
+}
+
+
 void RewriterView::selectedNodesChanged(const QList<ModelNode> & /* selectedNodeList, */, const QList<ModelNode> & /*lastSelectedNodeList */)
 {
 }
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
index 9fb44e8e1b36438246ee33c81cb60c9a1a6dd457..dd477e69514813d44aa868d502b005cde4e0ec08 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp
@@ -195,7 +195,15 @@ void ViewLogger::customNotification(const AbstractView *view, const QString &ide
 void ViewLogger::scriptFunctionsChanged(const ModelNode &node, const QStringList &/*scriptFunctionList*/)
 {
     m_output << time() << indent("function scripts changed:") << node << endl;
+}
+
+void ViewLogger::instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList)
+{
+    typedef QPair<ModelNode, QString> PropertyPair;
+    m_output << time() << indent("instancePropertyChange:") << endl;
 
+    foreach(const PropertyPair &propertyPair, propertyList)
+        m_output << time() << indent("property: ") << propertyPair.first << propertyPair.second << endl;
 }
 
 
diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h
index cdadd6237341023c941e6f09116b8486fbd39389..5bff84bad58df9d924c1bf1a934cc22dc00218f5 100644
--- a/src/plugins/qmldesigner/designercore/model/viewlogger.h
+++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h
@@ -71,6 +71,7 @@ public:
 
     void customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data);
     void scriptFunctionsChanged(const ModelNode &node, const QStringList &scriptFunctionList);
+    void instancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyList);
 
 protected:
     QString time() const;
diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index 4c708a2c0ab6e727415e2d1de5f4b4c34d2b479c..6826e4324d619b1051e0d8387c667744da800e35 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -259,12 +259,14 @@ void DesignModeWidget::showEditor(Core::IEditor *editor)
         } else {
             DesignDocumentController *newDocument = new DesignDocumentController(this);
 
+            newDocument->setNodeInstanceView(m_nodeInstanceView.data());
             newDocument->setAllPropertiesBox(m_allPropertiesBox.data());
             newDocument->setNavigator(m_navigator.data());
             newDocument->setStatesEditorWidget(m_statesEditorWidget.data());
             newDocument->setItemLibrary(m_itemLibrary.data());
             newDocument->setFormEditorView(m_formEditorView.data());
 
+
             newDocument->setFileName(fileName);
 
             document = newDocument;          
@@ -620,6 +622,7 @@ void DesignModeWidget::setup()
         }
     }
 
+    m_nodeInstanceView = new NodeInstanceView(this);
      // Sidebar takes ownership
     m_navigator = new NavigatorView;
     m_allPropertiesBox = new AllPropertiesBox;
diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h
index 9ae1abdadc21f6f99e9f911e4f13f1ff4c8b7734..ad18ece10b1c986c7bf11cc1752909b37347a3c9 100644
--- a/src/plugins/qmldesigner/designmodewidget.h
+++ b/src/plugins/qmldesigner/designmodewidget.h
@@ -177,6 +177,7 @@ private:
     QWeakPointer<AllPropertiesBox> m_allPropertiesBox;
     QWeakPointer<StatesEditorWidget> m_statesEditorWidget;
     QWeakPointer<FormEditorView> m_formEditorView;
+    QWeakPointer<NodeInstanceView> m_nodeInstanceView;
 
     bool m_syncWithTextEdit;