diff --git a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp
index 5811ef67bc8434efc4857f06589990eb08e84d3c..551e910fe0d835b0e0c031674d707be41a1a70ff 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.cpp
@@ -34,12 +34,12 @@ QT_BEGIN_NAMESPACE
 QML_DEFINE_TYPE(Bauhaus,1,0,QBoxLayout,QBoxLayoutObject);
 
 QBoxLayoutObject::QBoxLayoutObject(QObject *parent)
-: QLayoutObject(parent), _widgets(this), _layout(0)
+: QLayoutObject(parent), _layout(0)
 {
 }
 
 QBoxLayoutObject::QBoxLayoutObject(QBoxLayout *layout, QObject *parent)
-: QLayoutObject(parent), _widgets(this), _layout(layout)
+: QLayoutObject(parent), _layout(layout)
 {
 }
 
diff --git a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h
index 8315129c9a82610e2d229912e4f74d49f18caa68..1a17812dcdb51da5535669e683f78ec28c19c623 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h
+++ b/src/plugins/qmldesigner/components/propertyeditor/basiclayouts.h
@@ -43,7 +43,7 @@ class QBoxLayoutObject : public QLayoutObject
 {
     Q_OBJECT
 
-    Q_PROPERTY(QmlList<QWidget *> *children READ children)
+    Q_PROPERTY(QmlListProperty<QWidget> children READ children)
 
     Q_PROPERTY(int topMargin READ topMargin WRITE setTopMargin)
     Q_PROPERTY(int bottomMargin READ bottomMargin WRITE setBottomMargin)
@@ -57,30 +57,22 @@ public:
     explicit QBoxLayoutObject(QBoxLayout *, QObject *parent=0);
     virtual QLayout *layout() const;
 
-    QmlList<QWidget *> *children() { return &_widgets; }
+    QmlListProperty<QWidget> children() {
+        return QmlListProperty<QWidget>(this, 0, children_append, 0, 0, children_clear);
+    }
 
 private:
     friend class WidgetList;
     void addWidget(QWidget *);
     void clearWidget();
 
-    //XXX need to provide real implementations once QBoxLayoutObject is finished
-    class WidgetList : public QmlList<QWidget *>
-    {
-    public:
-        WidgetList(QBoxLayoutObject *o)
-            : obj(o) {}
-
-        virtual void append(QWidget *w)  { obj->addWidget(w); }
-        virtual void clear() { obj->clearWidget(); }
-        virtual int count() const { return 0; }
-        virtual void removeAt(int) {}
-        virtual QWidget *at(int) const { return 0; }
-        virtual void insert(int, QWidget *) {}
+    static void children_append(QmlListProperty<QWidget> *property, QWidget *widget) {
+        static_cast<QBoxLayoutObject*>(property->object)->addWidget(widget);
+    }
 
-    private:
-        QBoxLayoutObject *obj;
-    };
+    static void children_clear(QmlListProperty<QWidget> *property) {
+        static_cast<QBoxLayoutObject*>(property->object)->clearWidget();
+    }
 
     void getMargins()
     {
@@ -154,7 +146,6 @@ private:
         _layout->setSpacing(spacing);
     }
 
-    WidgetList _widgets;
     QBoxLayout *_layout;
 
     int mTop, mLeft, mBottom, mRight;
diff --git a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp
index 910e40be4704fded601d0a1a913fa6e0e0cf2685..9bceaef6d915843bb211445c29d0d96bf2678232 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/basicwidgets.cpp
@@ -51,39 +51,6 @@ QT_BEGIN_NAMESPACE
 
 class QWidgetDeclarativeUI;
 
-class Actions : public QmlConcreteList<Action *>
-    {
-    public:
-        Actions(QObject *o) : widget(qobject_cast<QWidget*>(o)) {}
-        virtual void append(Action *o)
-        {
-            QmlConcreteList<Action *>::append(o);
-            o->setParent(widget);
-            widget->addAction(o);
-        }
-        virtual void clear()
-        {
-            QmlConcreteList<Action *>::clear();
-
-            while (!widget->actions().empty())
-                widget->removeAction(widget->actions().first());
-            //menu->clear();
-        }
-        virtual void removeAt(int i)
-        {
-            QmlConcreteList<Action *>::removeAt(i);
-            widget->removeAction(widget->actions().at(i));
-        }
-        virtual void insert(int i, Action *obj)
-        {
-            QmlConcreteList<Action *>::insert(i, obj);
-            obj->setParent(widget);
-            widget->addAction(obj);
-        }
-    private:
-        QWidget *widget;
-    };
-
 class ResizeEventFilter : public QObject
 {
     Q_OBJECT
@@ -104,9 +71,9 @@ class QWidgetDeclarativeUI : public QObject
 {
     Q_OBJECT
 
-    Q_PROPERTY(QmlList<QObject *> *children READ children)
+    Q_PROPERTY(QmlListProperty<QObject> children READ children)
     Q_PROPERTY(QLayoutObject *layout READ layout WRITE setLayout)
-    Q_PROPERTY(QmlList<Action *> *actions READ actions)
+    Q_PROPERTY(QmlListProperty<Action> actions READ actions)
     Q_PROPERTY(QFont font READ font CONSTANT)
 
     Q_PROPERTY(QPoint pos READ pos)
@@ -150,7 +117,7 @@ signals:
     void opacityChanged();
 
 public:
-    QWidgetDeclarativeUI(QObject *other) : QObject(other), _children(other), _layout(0), _graphicsOpacityEffect(0), _actions(other) {
+    QWidgetDeclarativeUI(QObject *other) : QObject(other), _layout(0), _graphicsOpacityEffect(0) {
         q = qobject_cast<QWidget*>(other);
         ResizeEventFilter *filter(new ResizeEventFilter(q));
         filter->setTarget(q);
@@ -162,38 +129,6 @@ public:
     virtual ~QWidgetDeclarativeUI() {
     }
 
-    class Children : public QmlConcreteList<QObject *>
-    {
-    public:
-        Children(QObject *widget) : q(qobject_cast<QWidget *>(widget)) {}
-        virtual void append(QObject *o)
-        {
-            insert(-1, o);
-        }
-        virtual void clear()
-        {
-            for (int i = 0; i < count(); ++i)
-                at(i)->setParent(0);
-            QmlConcreteList<QObject *>::clear();
-        }
-        virtual void removeAt(int i)
-        {
-            at(i)->setParent(0);
-            QmlConcreteList<QObject *>::removeAt(i);
-        }
-        virtual void insert(int i, QObject *o)
-        {
-            QmlConcreteList<QObject *>::insert(i, o);
-            if (QWidget *w = qobject_cast<QWidget *>(o))
-                w->setParent(static_cast<QWidget *>(q));
-            else
-                o->setParent(q);
-        }
-
-    private:
-        QWidget *q;
-    };
-
 public:
 
     void setMouseOver(bool _mouseOver)
@@ -223,7 +158,9 @@ public:
         emit mouseOverChanged();
     }
 
-    QmlList<QObject *> *children() { return &_children; }
+    QmlListProperty<QObject> children() {
+        return QmlListProperty<QObject>(this, 0, children_append, children_count, children_at, children_clear);
+    }
 
     QLayoutObject *layout() const { return _layout; }
     void setLayout(QLayoutObject *lo)
@@ -440,18 +377,73 @@ public:
 
     }
 
-
-    QmlList<Action *> *actions() { return &_actions; }
+    QmlListProperty<Action> actions() {
+        return QmlListProperty<Action>(this, 0, actions_append, actions_count, actions_at, actions_clear);
+    }
 
 private:
     QWidget *q;
-    Children _children;
     QLayoutObject *_layout;
     QFont _font;
     QUrl _styleSheetFile;
     QGraphicsOpacityEffect *_graphicsOpacityEffect;
     bool m_mouseOver;
-    Actions _actions;
+
+    static void children_append(QmlListProperty<QObject> *property, QObject *o) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *q = p->q;
+        if (QWidget *w = qobject_cast<QWidget *>(o))
+            w->setParent(static_cast<QWidget *>(q));
+        else
+            o->setParent(q);
+    }
+
+    static int children_count(QmlListProperty<QObject> *property) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *q = p->q;
+        return q->children().count();
+    }
+
+    static QObject * children_at(QmlListProperty<QObject> *property, int index) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *q = p->q;
+        return q->children().at(index);
+    }
+
+    static void children_clear(QmlListProperty<QObject> *property) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *q = p->q;
+        QObjectList c = q->children();
+        for (int i = 0; i < c.count(); ++i)
+            c.at(i)->setParent(0);
+    }
+
+    // ### Original had an insert, and removeAt
+    static void actions_append(QmlListProperty<Action> *property, Action *o) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *w = p->q;
+        o->setParent(w);
+        w->addAction(o);
+    }
+
+    static int actions_count(QmlListProperty<Action> *property) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *w = p->q;
+        return w->actions().count();
+    }
+    static Action *actions_at(QmlListProperty<Action> *property, int index) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *w = p->q;
+        return qobject_cast<Action *>(w->actions().at(index));
+    }
+
+    static void actions_clear(QmlListProperty<Action> *property) {
+        QWidgetDeclarativeUI *p = static_cast<QWidgetDeclarativeUI *>(property->object);
+        QWidget *w = p->q;
+
+        while (!w->actions().empty())
+            w->removeAction(w->actions().first());
+    }
 };
 
 bool ResizeEventFilter::eventFilter(QObject *obj, QEvent *event)
@@ -1073,7 +1065,7 @@ void QGroupBoxDeclarativeUI::collapse()
         return;
     m_contens = QPixmap::grabWidget (gb, 5, 5, gb->width() - 5, gb->height() - 5);
     gb->setPixmap(m_contens,1);
-    hideChildren(); 
+    hideChildren();
     m_expanded = false;
     m_timeLine.start();
 }
@@ -1113,50 +1105,28 @@ class QTabWidgetDeclarativeUI : public QObject
 {
     Q_OBJECT
 
-    Q_PROPERTY(QmlList<QTabObject *> *tabs READ tabs)
+    Q_PROPERTY(QmlListProperty<QTabObject> tabs READ tabs)
     Q_CLASSINFO("DefaultProperty", "tabs")
 public:
-    QTabWidgetDeclarativeUI(QObject *other) : QObject(other), _tabs(other) {}
+    QTabWidgetDeclarativeUI(QObject *other) : QObject(other) {}
 
-    QmlList<QTabObject *> *tabs() { return &_tabs; }
+    QmlListProperty<QTabObject> tabs() {
+        return QmlListProperty<QTabObject>(this, 0, tabs_append, 0, 0, tabs_clear);
+    }
 
 private:
-    //if not for the at() function, we could use QmlList instead
-    class Tabs : public QmlConcreteList<QTabObject *>
-    {
-    public:
-        Tabs(QObject *o) : tw(o) {}
-        virtual void append(QTabObject *o)
-        {
-            QmlConcreteList<QTabObject *>::append(o);
-            //XXX can we insertTab(-1, o) instead?
-            if (!o->icon().isNull())
-                static_cast<QTabWidget *>(tw)->addTab(o->content(), o->icon(), o->label());
-            else
-                static_cast<QTabWidget *>(tw)->addTab(o->content(), o->label());
-        }
-        virtual void clear()
-        {
-            QmlConcreteList<QTabObject *>::clear();
-            static_cast<QTabWidget *>(tw)->clear();
-        }
-        virtual void removeAt(int i)
-        {
-            QmlConcreteList<QTabObject *>::removeAt(i);
-            static_cast<QTabWidget *>(tw)->removeTab(i);
-        }
-        virtual void insert(int i, QTabObject *obj)
-        {
-            QmlConcreteList<QTabObject *>::insert(i, obj);
-            if (!obj->icon().isNull())
-                static_cast<QTabWidget *>(tw)->insertTab(i, obj->content(), obj->icon(), obj->label());
-            else
-                static_cast<QTabWidget *>(tw)->insertTab(i, obj->content(), obj->label());
-        }
-    private:
-        QObject *tw;
-    };
-    Tabs _tabs;
+    static void tabs_append(QmlListProperty<QTabObject> *property, QTabObject *o) {
+        QTabWidget *tw = static_cast<QTabWidget*>(property->object->parent());
+        if (!o->icon().isNull())
+            tw->addTab(o->content(), o->icon(), o->label());
+        else
+            tw->addTab(o->content(), o->label());
+    }
+
+    static void tabs_clear(QmlListProperty<QTabObject> *property) {
+        QTabWidget *tw = static_cast<QTabWidget*>(property->object->parent());
+        tw->clear();
+    }
 };
 
 
diff --git a/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp
index 141019e0a267d5363efd3d23510b587339ae5d59..94dcea07110b6bf8f931686703565089fcde6e0a 100644
--- a/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/core/instances/objectnodeinstance.cpp
@@ -52,7 +52,6 @@
 #include <QEvent>
 #include <QGraphicsScene>
 #include <QmlContext>
-#include <QmlList>
 #include <QmlError>
 #include <QmlBinding>
 #include <QmlMetaType>
@@ -327,7 +326,7 @@ QPair<QString, NodeInstance> ObjectNodeInstance::anchor(const QString &/*name*/)
 
 static bool isList(const QmlMetaProperty &metaProperty)
 {
-    return metaProperty.propertyCategory() == QmlMetaProperty::List || metaProperty.propertyCategory() == QmlMetaProperty::QmlList;
+    return metaProperty.propertyCategory() == QmlMetaProperty::List;
 }
 
 static bool isObject(const QmlMetaProperty &metaProperty)
@@ -342,15 +341,7 @@ static QVariant objectToVariant(QObject *object)
 
 static void removeObjectFromList(const QmlMetaProperty &metaProperty, QObject *object, QmlEngine *engine)
 {
-    QmlListAccessor listAccessor;
-    listAccessor.setList(metaProperty.read(), engine);
-
-    for (int i = 0; i < listAccessor.count(); ++i)  {
-        if (QmlMetaType::toQObject(listAccessor.at(i)) == object) {
-            listAccessor.removeAt(i);
-            break;
-        }
-    }
+    // ### Very few QML lists ever responded to removes
 }
 
 void ObjectNodeInstance::removeFromOldProperty(QObject *object, QObject *oldParent, const QString &oldParentProperty)
@@ -371,9 +362,8 @@ void ObjectNodeInstance::addToNewProperty(QObject *object, QObject *newParent, c
     QmlMetaProperty metaProperty = QmlMetaProperty::createProperty(newParent, newParentProperty, context());
 
     if (isList(metaProperty)) {
-        QmlListAccessor listAccessor;
-        listAccessor.setList(metaProperty.read(), nodeInstanceView()->engine());
-        listAccessor.append(objectToVariant(object));
+        QmlListReference list = qvariant_cast<QmlListReference>(metaProperty.read());
+        list.append(object);
     } else if (isObject(metaProperty)) {
         metaProperty.write(objectToVariant(object));
     }
@@ -438,14 +428,13 @@ void ObjectNodeInstance::setPropertyBinding(const QString &name, const QString &
 void ObjectNodeInstance::deleteObjectsInList(const QmlMetaProperty &metaProperty)
 {
     QObjectList objectList;
-    QmlListAccessor listAccessor;
-    listAccessor.setList(metaProperty.read());
+    QmlListReference list = qvariant_cast<QmlListReference>(metaProperty.read());
 
-    for(int i = 0; i < listAccessor.count(); i++) {
-        objectList += QmlMetaType::toQObject(listAccessor.at(i));
+    for(int i = 0; i < list.count(); i++) {
+        objectList += list.at(i);
     }
 
-    listAccessor.clear();
+    list.clear();
 }
 
 void ObjectNodeInstance::resetProperty(const QString &name)
@@ -489,9 +478,8 @@ void ObjectNodeInstance::resetProperty(QObject *object, const QString &propertyN
         if (qmlMetaProperty.read() == resetValue(propertyName))
             return;
         qmlMetaProperty.write(resetValue(propertyName));
-    } else if (QmlMetaType::isList(qmlMetaProperty.propertyType()) ||
-               QmlMetaType::isQmlList(qmlMetaProperty.propertyType())) {
-        QmlMetaType::clear(object->property(propertyName.toLatin1()));
+    } else if (qmlMetaProperty.propertyCategory() == QmlMetaProperty::List) {
+        qvariant_cast<QmlListReference>(qmlMetaProperty.read()).clear();
     }
 }
 
diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
index 3da27455a443dee3a05a93ae1c336719680efb69..40ad97937f4c38589ec4a0ccdeffd9a389338c51 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
@@ -14,7 +14,7 @@ public:
     QList<QmlFileFilterItem*> qmlFileFilters() const;
 
     // content property
-    QmlConcreteList<QmlProjectContentItem*> content;
+    QList<QmlProjectContentItem*> content;
 };
 
 QList<QmlFileFilterItem*> QmlProjectItemPrivate::qmlFileFilters() const
@@ -45,10 +45,10 @@ QmlProjectItem::~QmlProjectItem()
     delete d_ptr;
 }
 
-QmlList<QmlProjectContentItem*> *QmlProjectItem::content()
+QmlListProperty<QmlProjectContentItem> QmlProjectItem::content()
 {
     Q_D(QmlProjectItem);
-    return &d->content;
+    return QmlListProperty<QmlProjectContentItem>(this, d->content);
 }
 
 QString QmlProjectItem::sourceDirectory() const
diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
index d64e95c0bc61944f7f7e4964eb968dcbbc43bc64..58bff010d9c042e76f899fbb29a0fb03850148d0 100644
--- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
+++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
@@ -21,7 +21,7 @@ class QmlProjectItem : public QObject {
     Q_DECLARE_PRIVATE(QmlProjectItem)
     Q_DISABLE_COPY(QmlProjectItem)
 
-    Q_PROPERTY(QmlList<QmlProjectManager::QmlProjectContentItem*> *content READ content DESIGNABLE false)
+    Q_PROPERTY(QmlListProperty<QmlProjectManager::QmlProjectContentItem> content READ content DESIGNABLE false)
     Q_PROPERTY(QString sourceDirectory READ sourceDirectory NOTIFY sourceDirectoryChanged)
     Q_PROPERTY(QStringList libraryPaths READ libraryPaths WRITE setLibraryPaths NOTIFY libraryPathsChanged)
 
@@ -31,7 +31,7 @@ public:
     QmlProjectItem(QObject *parent = 0);
     ~QmlProjectItem();
 
-    QmlList<QmlProjectContentItem*> *content();
+    QmlListProperty<QmlProjectContentItem> content();
 
     QString sourceDirectory() const;
     void setSourceDirectory(const QString &directoryPath);