diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index 0cfc1f658514e8e4b743f89c1c25bdce421092ca..81c4d2c3a14ce6652ed0b542be4d5623ff71b350 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -32,7 +32,6 @@
 #include <nodeabstractproperty.h>
 #include <nodelistproperty.h>
 #include <abstractview.h>
-#include <qmlitemnode.h>
 #include <invalididexception.h>
 
 #include <QMimeData>
@@ -142,7 +141,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
     QByteArray encodedData = data->data("application/vnd.modelnode.list");
     QDataStream stream(&encodedData, QIODevice::ReadOnly);
 
-    QmlItemNode parentItemNode(nodeForIndex(parentIdIndex));
+    ModelNode parentNode(nodeForIndex(parentIdIndex));
 
     QList<ModelNode> nodeList;
 
@@ -150,7 +149,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
         uint nodeHash;
         stream >> nodeHash;
         ModelNode node(nodeForHash(nodeHash));
-        if (!node.isValid() || (parentItemNode == node) || node.isAncestorOf(parentItemNode))
+        if (!node.isValid() || (parentNode == node) || node.isAncestorOf(parentNode))
             continue;
         nodeList.append(node);
     }
@@ -158,10 +157,9 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
     RewriterTransaction transaction = m_view->beginRewriterTransaction();
     foreach (const ModelNode &node, nodeList) {
         if (!isAnchestorInList(node, nodeList)) {
-            if (node.parentProperty().parentModelNode() != parentItemNode) {
-                QmlItemNode itemNode(node);
-                if (node != parentItemNode) {
-                    itemNode.setParent(parentItemNode);
+            if (node.parentProperty().parentModelNode() != parentNode) {
+                if (node != parentNode) {
+                    reparentModelNode(parentNode, node);
                 }
             }
 
@@ -177,7 +175,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
         }
     }
 
-    propagateInvisible(parentItemNode, isNodeInvisible(parentItemNode));
+    propagateInvisible(parentNode, isNodeInvisible(parentNode));
 
     return false; // don't let the view do drag&drop on its own
 }
@@ -436,12 +434,23 @@ void NavigatorTreeModel::removeSubTree(const ModelNode &node)
     m_nodeItemHash.remove(node);
 }
 
+void NavigatorTreeModel::reparentModelNode(const ModelNode &parentNode, const ModelNode &node)
+{
+    parentNode.nodeListProperty("data").reparentHere(node);
+}
+
 QList<ModelNode> NavigatorTreeModel::modelNodeChildren(const ModelNode &parentNode)
 {
     QList<ModelNode> children;
-    if (QmlItemNode(parentNode).isValid())
-        foreach (const QmlItemNode &childNode, QmlItemNode(parentNode).children())
-            children << childNode.modelNode();
+
+    if (parentNode.hasProperty("children")) {
+        children.append(parentNode.nodeListProperty("children").toModelNodeList());
+    }
+
+    if (parentNode.hasProperty("data")) {
+        children.append(parentNode.nodeListProperty("data").toModelNodeList());
+    }
+
     return children;
 }
 
@@ -467,6 +476,4 @@ void NavigatorTreeModel::setVisible(const QModelIndex &index, bool visible)
     itemRow.visibilityItem->setCheckState(visible ? Qt::Checked : Qt::Unchecked);
 }
 
-
-}
-
+} // QmlDesigner
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
index 9c9d86bb09d6a997639614a28a684840ce88b34c..279ef7abf9cce794955984c490b8b8740845a3ef 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
@@ -123,6 +123,7 @@ private:
     ItemRow createItemRow(const ModelNode &node);
     void updateItemRow(const ModelNode &node, ItemRow row);
 
+    void reparentModelNode(const ModelNode &parentNode, const ModelNode &node);
     QList<ModelNode> modelNodeChildren(const ModelNode &parentNode);
 
     bool blockItemChangedSignal(bool block);
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index ef560e4a4b57ef51d3974036b1e176d516cb6d56..d542ba9a4f289ce3ac2824a1c73f976252564cd7 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -32,13 +32,14 @@
 #include "navigatorwidget.h"
 
 #include <nodeproperty.h>
+#include <nodelistproperty.h>
 #include <QHeaderView>
 
 
 namespace QmlDesigner {
 
 NavigatorView::NavigatorView(QObject* parent) :
-        QmlModelView(parent),
+        AbstractView(parent),
         m_blockSelectionChangedSignal(false),
         m_widget(new NavigatorWidget),
         m_treeModel(new NavigatorTreeModel(this))
@@ -81,7 +82,7 @@ QWidget *NavigatorView::widget()
 
 void NavigatorView::modelAttached(Model *model)
 {
-    QmlModelView::modelAttached(model);
+    AbstractView::modelAttached(model);
 
     m_treeModel->setView(this);
 
@@ -100,14 +101,33 @@ void NavigatorView::modelAttached(Model *model)
 void NavigatorView::modelAboutToBeDetached(Model *model)
 {
     m_treeModel->clearView();
-    QmlModelView::modelAboutToBeDetached(model);
+    AbstractView::modelAboutToBeDetached(model);
+}
+
+void NavigatorView::nodeCreated(const ModelNode &createdNode)
+{
+}
+
+void NavigatorView::nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange)
+{
+}
+
+void NavigatorView::propertiesRemoved(const QList<AbstractProperty> &propertyList)
+{
+}
+
+void NavigatorView::variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange)
+{
+}
+
+void NavigatorView::bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags propertyChange)
+{
 }
 
 void NavigatorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
 {
     if (m_treeModel->isInTree(removedNode))
         m_treeModel->removeSubTree(removedNode);
-    QmlModelView::nodeAboutToBeRemoved(removedNode);
 }
 
 void NavigatorView::nodeReparented(const ModelNode &node, const NodeAbstractProperty & /*newPropertyParent*/, const NodeAbstractProperty & /*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/)
@@ -127,14 +147,12 @@ void NavigatorView::nodeReparented(const ModelNode &node, const NodeAbstractProp
 
 void NavigatorView::nodeIdChanged(const ModelNode& node, const QString& newId, const QString& oldId)
 {
-    QmlModelView::nodeIdChanged(node, newId, oldId);
     if (m_treeModel->isInTree(node))
         m_treeModel->updateItemRow(node);
 }
 
 void NavigatorView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& propertyList)
 {
-    QmlModelView::propertiesAboutToBeRemoved(propertyList);
     foreach (const AbstractProperty &property, propertyList) {
         if (property.isNodeProperty()) {
             NodeProperty nodeProperty(property.toNodeProperty());
@@ -150,14 +168,12 @@ void NavigatorView::propertiesAboutToBeRemoved(const QList<AbstractProperty>& pr
 
 void NavigatorView::rootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion)
 {
-    QmlModelView::rootNodeTypeChanged(type, majorVersion, minorVersion);
     if (m_treeModel->isInTree(rootModelNode()))
         m_treeModel->updateItemRow(rootModelNode());
 }
 
 void NavigatorView::auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data)
 {
-    QmlModelView::auxiliaryDataChanged(node, name, data);
     if (m_treeModel->isInTree(node))
     {
         // update model
@@ -172,16 +188,10 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &node, const QString &n
 
 void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &node, int oldIndex)
 {
-    QmlModelView::nodeOrderChanged(listProperty, node, oldIndex);
-
     if (m_treeModel->isInTree(node))
         m_treeModel->updateItemRowOrder(node);
 }
 
-void NavigatorView::stateChanged(const QmlModelState &/*newQmlModelState*/, const QmlModelState &/*oldQmlModelState*/)
-{
-}
-
 void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, const QItemSelection &/*deselected*/)
 {
     if (m_blockSelectionChangedSignal)
@@ -198,8 +208,6 @@ void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, con
 
 void NavigatorView::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList)
 {
-    QmlModelView::selectedNodesChanged(selectedNodeList, lastSelectedNodeList);
-
     updateItemSelection();
 }
 
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index d354e397165bf96a42049acc51d27a2d2ecfefe1..791498297c6d9d59fa0d739b6ae2f151c649d05d 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -30,7 +30,7 @@
 #ifndef NAVIGATORVIEW_H
 #define NAVIGATORVIEW_H
 
-#include <qmlmodelview.h>
+#include <abstractview.h>
 
 #include <QWeakPointer>
 
@@ -48,7 +48,7 @@ class NavigatorTreeModel;
 class IconCheckboxItemDelegate;
 class IdItemDelegate;
 
-class NavigatorView : public QmlModelView
+class NavigatorView : public AbstractView
 {
     Q_OBJECT
 
@@ -62,6 +62,12 @@ public:
     void modelAttached(Model *model);
     void modelAboutToBeDetached(Model *model);
 
+    void nodeCreated(const ModelNode &createdNode);
+    void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);
+    void propertiesRemoved(const QList<AbstractProperty> &propertyList);
+    void variantPropertiesChanged(const QList<VariantProperty> &propertyList, PropertyChangeFlags propertyChange);
+    void bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags propertyChange);
+
     void nodeAboutToBeRemoved(const ModelNode &removedNode);
     void nodeReparented(const ModelNode &node, const ModelNode &oldParent, const ModelNode &newParent);
     void nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &movedNode, int oldIndex);
@@ -75,7 +81,6 @@ public:
                                       const QList<ModelNode> &lastSelectedNodeList);
     void auxiliaryDataChanged(const ModelNode &node, const QString &name, const QVariant &data);
 
-    void stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState);
 
 private slots:
 //    void handleChangedItem(QStandardItem * item);