diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp
index f28a8768ab565281018ca0a809fc62fb76326119..d47bf05fe373d5050f39dfe6784848e7d85d4617 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.cpp
@@ -26,10 +26,16 @@ void NodeInstanceSignalSpy::setObjectNodeInstance(const ObjectNodeInstance::Poin
 
 void NodeInstanceSignalSpy::registerObject(QObject *spiedObject, const QString &prefix)
 {
+    if (registeredObjectList.contains(spiedObject)) // prevent cycles
+        return;
+
+    registeredObjectList.append(spiedObject);
     for (int index = QObject::staticMetaObject.propertyOffset();
          index < spiedObject->metaObject()->propertyCount();
          index++) {
              QMetaProperty metaProperty = spiedObject->metaObject()->property(index);
+
+             // handle dot properties and connect the signals to the object
              if (metaProperty.isReadable()
                  && !metaProperty.isWritable()
                  && QDeclarativeMetaType::isQObject(metaProperty.userType())) {
@@ -43,6 +49,28 @@ void NodeInstanceSignalSpy::registerObject(QObject *spiedObject, const QString &
                  m_indexPropertyHash.insert(methodeOffset, prefix + metaProperty.name());
                  methodeOffset++;
              }
+
+             // search recursive in objects
+             if (metaProperty.isReadable()
+                 && metaProperty.isWritable()
+                 && QDeclarativeMetaType::isQObject(metaProperty.userType())) {
+                 QObject *propertyObject = QDeclarativeMetaType::toQObject(metaProperty.read(spiedObject));
+                 if (propertyObject)
+                     registerObject(propertyObject, prefix + metaProperty.name() + "/");
+             }
+
+             // search recursive in objects list
+             if (metaProperty.isReadable()
+                 && QDeclarativeMetaType::isList(metaProperty.userType())) {
+                 QDeclarativeListReference list(spiedObject, metaProperty.name());
+                 if (list.canCount() && list.canAt()) {
+                     for (int i = 0; i < list.count(); i++) {
+                         QObject *propertyObject = list.at(i);
+                         if (propertyObject)
+                             registerObject(propertyObject, prefix + metaProperty.name() + "/");
+                     }
+                 }
+             }
          }
 }
 
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h
index ff33b8cdbef6a038ec211d419612aa5ef17c7e32..94cef6d2321c8c0090f21a9bda030751a853e606 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstancesignalspy.h
@@ -27,6 +27,7 @@ protected:
 private:
     int methodeOffset;
     QHash<int, QString> m_indexPropertyHash;
+    QObjectList registeredObjectList;
     ObjectNodeInstanceWeakPointer m_objectNodeInstance;
 };