diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index e0a59d43c211a9385e6c616f139b8471142ac98b..ab84fed5f80c336c62becd877956f3b01c56d1be 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -2834,7 +2834,7 @@ static void qDumpQSharedPointer(QDumper &d)
 
 static void qDumpQString(QDumper &d)
 {
-    qCheckAccess(deref(d.data));
+    //qCheckAccess(deref(d.data));
     const QString &str = *reinterpret_cast<const QString *>(d.data);
 
     const int size = str.size();
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 6b6c2bbf956d730c3f719dc430127dadd1634d68..b0b1e7a669d6f041df8b09f7ad424b53abedc551 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -1099,6 +1099,9 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
                                             QStringList suffixes)
 {
     QMap<QString, QStringList> entriesInPaths;
+    typedef QPair<QString, QString> SymLink;
+    typedef QList<SymLink> SymLinks;
+    SymLinks symlinks;
     int processed = 0;
 
     future.setProgressRange(0, paths.size());
@@ -1111,6 +1114,11 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
             break;
 
         const QString path = paths.takeFirst();
+
+        // Skip already scanned paths
+        if (entriesInPaths.contains(path))
+            continue;
+
         QStringList entries;
 
         QDirIterator i(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
@@ -1125,11 +1133,18 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
 
                     // Also scan subdirectory, but avoid endless recursion with symbolic links
                     if (fileInfo.isSymLink()) {
-                        QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(fileInfo.canonicalFilePath());
+                        QString target = fileInfo.symLinkTarget();
+
+                        // Don't add broken symlinks
+                        if (!QFileInfo(target).exists())
+                            continue;
+
+                        QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(target);
                         if (result != entriesInPaths.constEnd()) {
                             entriesInPaths.insert(fileName, result.value());
                         } else {
-                            paths.append(fileName);
+                            paths.append(target);
+                            symlinks.append(SymLink(fileName, target));
                         }
                     } else {
                         paths.append(fileName);
@@ -1145,6 +1160,14 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
         future.setProgressRange(0, processed + paths.size());
         future.setProgressValue(processed);
     }
+    // link symlinks
+    QListIterator<SymLink> it(symlinks);
+    it.toBack();
+    while (it.hasPrevious()) {
+        SymLink v = it.previous();
+        QMap<QString, QStringList>::const_iterator result = entriesInPaths.find(v.second);
+        entriesInPaths.insert(v.first, result.value());
+    }
 
     manager->setIncludesInPaths(entriesInPaths);
 
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 6f1391015b16ceca9ca29f5840c56ffb1e6b8975..ad77ef80e3cc73a76997cf5aadb823eb903dfff9 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -316,9 +316,10 @@ void DebuggerManager::init()
     // Tooltip
     //QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);
     //tooltipView->setModel(m_watchHandler->model(TooltipsWatch));
-
+    //qRegisterMetaType<WatchData>("Debugger::Internal::WatchData");
+    qRegisterMetaType<WatchData>("WatchData");
     connect(m_watchHandler, SIGNAL(watchDataUpdateNeeded(WatchData)),
-        this, SLOT(updateWatchData(WatchData)));
+        this, SLOT(updateWatchData(WatchData)), Qt::QueuedConnection);
 
     m_continueAction = new QAction(this);
     m_continueAction->setText(tr("Continue"));
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 6fbba11e083a5d7cac790cbdeff928bad768e038..99718326c247551356672cab0e6b2857b87a4059 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -83,7 +83,7 @@ namespace Internal {
 using namespace Debugger::Constants;
 
 //#define DEBUG_PENDING  1
-//#define DEBUG_SUBITEM  1
+#define DEBUG_SUBITEM  1
 
 #if DEBUG_PENDING
 #   define PENDING_DEBUG(s) qDebug() << s
@@ -2958,6 +2958,10 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren)
 
 void GdbEngine::createGdbVariable(const WatchData &data)
 {
+    if (data.iname == _("local.flist.0")) {
+        int i = 1;
+        Q_UNUSED(i);
+    }
     postCommand(_("-var-delete \"%1\"").arg(data.iname), WatchUpdate);
     QString exp = data.exp;
     if (exp.isEmpty() && data.addr.startsWith(__("0x")))
@@ -3401,11 +3405,17 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record,
 
     setWatchDataType(data, record.data.findChild("type"));
     setWatchDataDisplayedType(data, record.data.findChild("displaytype"));
-    handleChildren(data, contents);
+    QList<WatchData> list;
+    handleChildren(data, contents, &list);
+    //for (int i = 0; i != list.size(); ++i)
+    //    qDebug() << "READ: " << list.at(i).toString();
+    qq->watchHandler()->insertBulkData(list);
 }
 
-void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item)
+void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item,
+    QList<WatchData> *list)
 {
+    //qDebug() << "HANDLE CHILDREN: " << data0.toString() << item.toString();
     WatchData data = data0;
     if (!qq->watchHandler()->isExpandedIName(data.iname))
         data.setChildrenUnneeded();
@@ -3432,16 +3442,16 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item)
     setWatchDataValueToolTip(data, item.findChild("valuetooltip"),
         item.findChild("valuetooltipencoded").data().toInt());
     setWatchDataValueDisabled(data, item.findChild("valuedisabled"));
+    //qDebug() << "HANDLE CHILDREN: " << data.toString();
+    list->append(data);
 
     // try not to repeat data too often
     WatchData childtemplate;
     setWatchDataType(childtemplate, item.findChild("childtype"));
     setWatchDataChildCount(childtemplate, item.findChild("childnumchild"));
-    //qDebug() << "CHILD TEMPLATE:" << childtemplate.toString();
+    qDebug() << "CHILD TEMPLATE:" << childtemplate.toString();
 
-    qq->watchHandler()->insertData(data); 
     int i = 0;
-    QList<WatchData> list;
     foreach (GdbMi child, children.children()) {
         WatchData data1 = childtemplate;
         GdbMi name = child.findChild("name");
@@ -3463,11 +3473,9 @@ void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item)
             //data1.name += " (" + skey + ")";
             data1.name = skey;
         }
-        handleChildren(data1, child);
-        list.append(data1);
+        handleChildren(data1, child, list);
         ++i;
     }
-    qq->watchHandler()->insertBulkData(list); 
 }
 
 void GdbEngine::handleDebuggingHelperValue3(const GdbResultRecord &record,
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index b041c63eb2b0c6e78dd34ca68d0cd95f22b76b3b..07ef3bb8b8a76e9f631ec802990d3a5e7598089f 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -241,7 +241,8 @@ private:
     void debugMessage(const QString &msg);
     bool showToolTip();
 
-    void handleChildren(const WatchData &parent, const GdbMi &child);
+    void handleChildren(const WatchData &parent, const GdbMi &child,
+        QList<WatchData> *insertions);
     const bool m_dumperInjectionLoad;
 
     OutputCollector m_outputCollector;
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 3ab57db6fd6f64ed31727056b4488ff70e99c2ab..fd6745014b9f87c78bd445c5edaf55b707bd5f57 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -1003,7 +1003,7 @@ void WatchHandler::insertBulkData(const QList<WatchData> &list)
 {
     if (list.isEmpty())
         return;
-    QHash<QString, QList<WatchData> > hash;
+    QMap<QString, QList<WatchData> > hash;
 
     foreach (const WatchData &data, list) {
         if (data.isSomethingNeeded())
diff --git a/src/plugins/helloworld/helloworldplugin.cpp b/src/plugins/helloworld/helloworldplugin.cpp
index 245e6cda309747985b892e75112566d48f17749f..f898651c1bf99abe0d0156cf1bc38655e868ffac 100644
--- a/src/plugins/helloworld/helloworldplugin.cpp
+++ b/src/plugins/helloworld/helloworldplugin.cpp
@@ -114,6 +114,7 @@ bool HelloWorldPlugin::initialize(const QStringList &arguments, QString *error_m
     baseMode->setIcon(QIcon());
     baseMode->setPriority(0);
     baseMode->setWidget(new QPushButton(tr("Hello World PushButton!")));
+    baseMode->setContext(context);
     addAutoReleasedObject(baseMode);
 
     // Add the Hello World action command to the mode manager (with 0 priority)