diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index bd5b799049e4f5230e435bb7ba51103c9da72a88..42e42f5f0b6dbfbdbf9058128287fce22a3d7ab0 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -66,6 +66,8 @@ using namespace Debugger::Internal;
 
 static const QString strNotInScope = QLatin1String("<not in scope>");
 
+static int watcherCounter = 0;
+
 ////////////////////////////////////////////////////////////////////
 //
 // WatchData
@@ -922,17 +924,21 @@ void WatchHandler::watchExpression()
         watchExpression(action->data().toString());
 }
 
+QString WatchHandler::watcherName(const QString &exp)
+{
+    return QLatin1String("watch.") + QString::number(m_watchers[exp]);
+}
+
 void WatchHandler::watchExpression(const QString &exp)
 {
     // FIXME: 'exp' can contain illegal characters
     //MODEL_DEBUG("WATCH: " << exp);
-    static int counter = 0;
+    m_watchers[exp] = watcherCounter++;
     WatchData data;
     data.exp = exp;
     data.name = exp;
-    data.iname = QLatin1String("watch.") + QString::number(counter++);
+    data.iname = watcherName(exp);
     insertData(data);
-    m_watchers.append(exp);
     saveWatchers();
     emit watchModelUpdateRequested();
 }
@@ -1017,7 +1023,7 @@ void WatchHandler::removeWatchExpression()
 void WatchHandler::removeWatchExpression(const QString &exp)
 {
     MODEL_DEBUG("REMOVE WATCH: " << exp);
-    m_watchers.removeOne(exp);
+    m_watchers.remove(exp);
     for (int i = m_completeSet.size(); --i >= 0;) {
         const WatchData & data = m_completeSet.at(i);
         if (data.iname.startsWith(QLatin1String("watch.")) && data.exp == exp) {
@@ -1041,8 +1047,9 @@ void WatchHandler::reinitializeWatchersHelper()
 {
     // copy over all watchers and mark all watchers as incomplete
     int i = 0;
-    foreach (const QString &exp, m_watchers) {
+    foreach (const QString &exp, m_watchers.keys()) {
         WatchData data;
+        data.iname = watcherName(exp);
         data.level = -1;
         data.row = -1;
         data.parentIndex = -1;
@@ -1252,15 +1259,16 @@ void WatchHandler::loadWatchers()
 {
     QVariant value;
     sessionValueRequested("Watchers", &value);
-    m_watchers = value.toStringList();
+    foreach (const QString &exp, value.toStringList())
+        m_watchers[exp] = watcherCounter++;
     //qDebug() << "LOAD WATCHERS: " << m_watchers;
     reinitializeWatchersHelper();
 }
 
 void WatchHandler::saveWatchers()
 {
-    //qDebug() << "SAVE WATCHERS: " << m_watchers;
-    setSessionValueRequested("Watchers", m_watchers);
+    //qDebug() << "SAVE WATCHERS: " << m_watchers.keys();
+    setSessionValueRequested("Watchers", QVariant(m_watchers.keys()));
 }
 
 void WatchHandler::saveSessionData()
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 3f773ac1df37923c8ea6f525654d88d98b9fb4c9..13f37dabf49c2a1cb1d6a206bdb708c78a1fa3dd 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -216,7 +216,8 @@ private:
     QList<WatchData> m_completeSet;
     QList<WatchData> m_oldSet;
     QList<WatchData> m_displaySet;
-    QStringList m_watchers;
+    QHash<QString, int> m_watchers;
+    QString watcherName(const QString &exp);
 
     void setDisplayedIName(const QString &iname, bool on);
     QSet<QString> m_expandedINames;  // those expanded in the treeview