diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp
index a3b3de6a4de92e51bbc0d50788010beefd2460f8..e99c4dc8a1f1723a5deb7990005a26e7408a914a 100644
--- a/bin/gdbmacros/gdbmacros.cpp
+++ b/bin/gdbmacros/gdbmacros.cpp
@@ -2157,6 +2157,7 @@ static void qDumpStdMap(QDumper &d)
 
     // HACK: we need a properly const qualified version of the
     // std::pair used. We extract it from the allocator parameter
+    // (#4, "std::allocator<std::pair<key, value> >")
     // as it is there, and, equally importantly, in an order that
     // gdb accepts when fed with it.
     char *pairType = (char *)(d.templateParameters[3]) + 16;
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index ae32033b0dd43a7f4f71719568be46c9fcb76c5e..62820b3fd1b03627da623d0bf0f8c3722a509bf7 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -250,6 +250,10 @@ void DebuggerManager::init()
         this, SLOT(watchExpression(QString)));
     connect(watchersView, SIGNAL(requestRemoveWatchExpression(QString)),
         this, SLOT(removeWatchExpression(QString)));
+    connect(m_watchHandler, SIGNAL(sessionValueRequested(QString,QVariant*)),
+        this, SIGNAL(sessionValueRequested(QString,QVariant*)));
+    connect(m_watchHandler, SIGNAL(setSessionValueRequested(QString,QVariant)),
+        this, SIGNAL(setSessionValueRequested(QString,QVariant)));
 
     // Tooltip
     QTreeView *tooltipView = qobject_cast<QTreeView *>(m_tooltipWindow);
@@ -948,6 +952,7 @@ void DebuggerManager::aboutToSaveSession()
 void DebuggerManager::loadSessionData()
 {
     m_breakHandler->loadSessionData();
+    m_watchHandler->loadSessionData();
 
     QVariant value;
     querySessionValue(QLatin1String("UseFastStart"), &value);
@@ -964,6 +969,7 @@ void DebuggerManager::loadSessionData()
 void DebuggerManager::saveSessionData()
 {
     m_breakHandler->saveSessionData();
+    m_watchHandler->saveSessionData();
 
     setSessionValue(QLatin1String("UseFastStart"),
         m_useFastStartAction->isChecked());
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 59e37f2acb3144ca23a15ba8c0bef3fa246710af..152011c26ea04a2bde505d77900eb7578e1adfc0 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -888,6 +888,8 @@ void WatchHandler::watchExpression(const QString &exp)
     data.name = exp;
     data.iname = "watch." + exp;
     insertData(data);
+    m_watchers.append(exp);
+    saveWatchers();
     emit watchModelUpdateRequested();
 }
 
@@ -965,7 +967,9 @@ void WatchHandler::showEditValue(const WatchData &data)
 void WatchHandler::removeWatchExpression(const QString &iname)
 {
     MODEL_DEBUG("REMOVE WATCH: " << iname);
-    (void) takeData(iname);
+    WatchData data = takeData(iname);
+    m_watchers.removeOne(data.iname);
+    saveWatchers();
     emit watchModelUpdateRequested();
 }
 
@@ -973,19 +977,26 @@ void WatchHandler::reinitializeWatchers()
 {
     m_completeSet = initialSet();
     m_incompleteSet.clear();
+    reinitializeWatchersHelper();
+}
 
+void WatchHandler::reinitializeWatchersHelper()
+{
     // copy over all watchers and mark all watchers as incomplete
-    for (int i = 0, n = m_oldSet.size(); i < n; ++i) {
-        WatchData data = m_oldSet.at(i);
-        if (data.isWatcher()) {
-            data.level = -1;
-            data.row = -1;
-            data.parentIndex = -1;
-            data.variable.clear();
-            data.setAllNeeded();
-            data.valuedisabled = false;
-            insertData(data); // properly handles "neededChildren"
-        }
+    int i = 0;
+    foreach (const QString &exp, m_watchers) {
+        WatchData data;
+        data.level = -1;
+        data.row = -1;
+        data.parentIndex = -1;
+        data.variable.clear();
+        data.setAllNeeded();
+        data.valuedisabled = false;
+        data.iname = "watch." + QString::number(i);
+        data.name = exp;
+        data.exp = exp;
+        insertData(data);
+        ++i;
     }
 }
 
@@ -1180,3 +1191,29 @@ bool WatchHandler::checkIndex(int id) const
     }
     return true;
 }
+
+void WatchHandler::loadWatchers()
+{
+    QVariant value;
+    sessionValueRequested("Watchers", &value);
+    m_watchers = value.toStringList();
+    qDebug() << "LOAD WATCHERS: " << m_watchers;
+    reinitializeWatchersHelper();
+}
+
+void WatchHandler::saveWatchers()
+{
+    qDebug() << "SAVE WATCHERS: " << m_watchers;
+    setSessionValueRequested("Watchers", m_watchers);
+}
+
+void WatchHandler::saveSessionData()
+{
+    saveWatchers();
+}
+
+void WatchHandler::loadSessionData()
+{
+    loadWatchers();
+    rebuildModel();
+}
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 4ac2218a47118024fb9a253005f1df715aba4747..4c2a20b167f8f64560f665a1e6ff21f5e1444869 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -186,13 +186,23 @@ public:
 
     WatchData *findData(const QString &iname);
 
+    void loadSessionData();
+    void saveSessionData();
+
 signals:
     void watchModelUpdateRequested();
 
+    void sessionValueRequested(const QString &name, QVariant *value);
+    void setSessionValueRequested(const QString &name, const QVariant &value);
+
 private:
+    void reinitializeWatchersHelper();
     WatchData takeData(const QString &iname);
     QString toString() const;
 
+    void loadWatchers();
+    void saveWatchers();
+
     bool m_expandPointers;
     bool m_inChange;
 
@@ -203,6 +213,7 @@ private:
     QList<WatchData> m_completeSet;
     QList<WatchData> m_oldSet;
     QList<WatchData> m_displaySet;
+    QStringList m_watchers;
 
     void setDisplayedIName(const QString &iname, bool on);
     QSet<QString> m_expandedINames;  // those expanded in the treeview
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 24626064e4f1fb4d66484cdedd5da404df3e5774..5156e6fb5fd2e58944a397033a2fdc2aff7ab815 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -116,7 +116,7 @@ private:
 
 void testArray()
 {
-    QString x[4];
+    QString x[20];
     x[0] = "a";
     x[1] = "b";
     x[2] = "c";