diff --git a/src/libs/utils/pathchooser.cpp b/src/libs/utils/pathchooser.cpp
index 650d9f6dcc72ce99e7a1fc14da1381ec01e827e2..1e246fda9c4b1de4ce3a255e4936745984b76835 100644
--- a/src/libs/utils/pathchooser.cpp
+++ b/src/libs/utils/pathchooser.cpp
@@ -105,6 +105,7 @@ PathChooser::PathChooser(QWidget *parent) :
     connect(m_d->m_lineEdit, SIGNAL(validReturnPressed()), this, SIGNAL(returnPressed()));
     connect(m_d->m_lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
     connect(m_d->m_lineEdit, SIGNAL(validChanged()), this, SIGNAL(validChanged()));
+    connect(m_d->m_lineEdit, SIGNAL(editingFinished()), this, SIGNAL(editingFinished()));
 
     m_d->m_lineEdit->setMinimumWidth(200);
     hLayout->addWidget(m_d->m_lineEdit);
diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h
index 29352cd8744c9a3bfaed7fdee47d7bcebd84cdae..99f23303715afabdb81857e8fe8d62433d44d6fd 100644
--- a/src/libs/utils/pathchooser.h
+++ b/src/libs/utils/pathchooser.h
@@ -89,6 +89,7 @@ private:
 signals:
     void validChanged();
     void changed();
+    void editingFinished();
     void beforeBrowsing();
     void browsingFinished();
     void returnPressed();
diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 1d92e59d39eac88e9f082979bad5c03d92ac7243..cba443154925b46ba54c38f56ee71747de4517ab 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -94,7 +94,6 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
     QAction *act3 = new QAction("Edit condition...", &menu);
     act0->setEnabled(index.isValid());
     QAction *act4 = new QAction("Syncronize breakpoints", &menu);
-    QAction *act5 = action(SettingsDialog);
 
     menu.addAction(act0);
     menu.addAction(act3);
@@ -102,7 +101,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
     menu.addAction(act1);
     menu.addAction(act2);
     menu.addAction(act4);
-    menu.addAction(act5);
+    menu.addAction(theDebuggerSettings()->action(SettingsDialog));
 
     QAction *act = menu.exec(ev->globalPos());
 
@@ -116,8 +115,6 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
         editCondition(index);
     else if (act == act4)
         emit breakpointSynchronizationRequested();
-    else if (act == act5)
-        act->trigger();
 }
 
 void BreakWindow::deleteBreakpoint(const QModelIndex &idx)
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index 6e2bf512bf657d152c53837241188229677ea46a..f0726d65511b79e8bdcae73e938fff2d7f92c905 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -29,73 +29,451 @@
 
 #include "debuggeractions.h"
 
+#include <utils/qtcassert.h>
+#include <utils/pathchooser.h>
+
+#include <QtCore/QSettings>
 #include <QtGui/QAction>
-#include <QtGui/QApplication>
+#include <QtGui/QAbstractButton>
+#include <QtGui/QRadioButton>
+#include <QtGui/QCheckBox>
+#include <QtGui/QLineEdit>
 
 namespace Debugger {
 namespace Internal {
 
+//////////////////////////////////////////////////////////////////////////
+//
+// QtcSettingsItem
+//
+//////////////////////////////////////////////////////////////////////////
+
+QtcSettingsItem::QtcSettingsItem(QObject *parent)
+  : QObject(parent)
+{
+    m_action = new QAction(this);
+    connect(m_action, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool)));
+}
+
+QVariant QtcSettingsItem::value() const
+{
+    return m_value;
+}
+
+void QtcSettingsItem::setValue(const QVariant &value, bool doemit)
+{
+    if (value != m_value) {
+        m_value = value;
+        if (m_action->isCheckable())
+            m_action->setChecked(m_value.toBool());
+        if (doemit) {
+            emit valueChanged(m_value);
+            emit boolValueChanged(m_value.toBool());
+            emit stringValueChanged(m_value.toString());
+        }
+    }
+}
+
+QVariant QtcSettingsItem::defaultValue() const
+{
+    return m_defaultValue;
+}
+
+void QtcSettingsItem::setDefaultValue(const QVariant &value)
+{
+    m_defaultValue = value;
+}
+
+QString QtcSettingsItem::settingsKey() const
+{
+    return m_settingsKey;
+}
+
+void QtcSettingsItem::setSettingsKey(const QString &key)
+{
+    m_settingsKey = key;
+}
+
+void QtcSettingsItem::setSettingsKey(const QString &group, const QString &key)
+{
+    m_settingsKey = key;
+    m_settingsGroup = group;
+}
+
+QString QtcSettingsItem::settingsGroup() const
+{
+    return m_settingsGroup;
+}
+
+void QtcSettingsItem::setSettingsGroup(const QString &group)
+{
+    m_settingsGroup = group;
+}
+
+QString QtcSettingsItem::text() const
+{
+    return m_action->text();
+}
+
+void QtcSettingsItem::setText(const QString &value)
+{
+    if (!value.isEmpty() && !m_textPattern.isEmpty())
+        m_action->setText(m_textPattern.arg(value));
+    else
+        m_action->setText(value);
+}
+
+QString QtcSettingsItem::textPattern() const
+{
+    return m_textPattern;
+}
+
+void QtcSettingsItem::setTextPattern(const QString &value)
+{
+    m_textPattern = value;
+}
+
+void QtcSettingsItem::readSettings(QSettings *settings)
+{
+    if (m_settingsGroup.isEmpty() || m_settingsKey.isEmpty())
+        return;
+    settings->beginGroup(m_settingsGroup);
+    setValue(settings->value(m_settingsKey, m_defaultValue), false);
+    qDebug() << "READING: " << m_settingsKey << " -> " << m_value;
+    settings->endGroup();
+}
+
+void QtcSettingsItem::writeSettings(QSettings *settings)
+{
+    if (m_settingsGroup.isEmpty() || m_settingsKey.isEmpty())
+        return;
+    settings->beginGroup(m_settingsGroup);
+    settings->setValue(m_settingsKey, m_value);
+    qDebug() << "WRITING: " << m_settingsKey << " -> " << m_value;
+    settings->endGroup();
+}
+   
+QAction *QtcSettingsItem::action() const
+{
+    return m_action;
+}
+ 
+void QtcSettingsItem::connectWidget(QWidget *widget, ApplyMode applyMode)
+{
+    using namespace Core::Utils;
+    //qDebug() << "CONNECT WIDGET " << widget << " TO " << m_settingsKey;
+    m_applyModes[widget] = applyMode;
+    m_deferedValue = m_value;
+    if (QAbstractButton *button = qobject_cast<QAbstractButton *>(widget)) {
+        if (button->isCheckable()) {
+            button->setChecked(m_value.toBool());
+            connect(button, SIGNAL(clicked(bool)),
+                this, SLOT(checkableButtonClicked(bool)));
+        } else {
+            connect(button, SIGNAL(clicked()),
+                this, SLOT(uncheckableButtonClicked()));
+        }
+    } else if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(widget)) {
+        lineEdit->setText(m_value.toString());
+        //qDebug() << "SETTING TEXT" << lineEdit->text(); 
+        connect(lineEdit, SIGNAL(editingFinished()),
+            this, SLOT(lineEditEditingFinished()));
+    } else if (PathChooser *pathChooser = qobject_cast<PathChooser *>(widget)) {
+        pathChooser->setPath(m_value.toString());
+        connect(pathChooser, SIGNAL(editingFinished()),
+            this, SLOT(pathChooserEditingFinished()));
+        connect(pathChooser, SIGNAL(browsingFinished()),
+            this, SLOT(pathChooserEditingFinished()));
+    } else {
+        qDebug() << "CANNOT CONNECT WIDGET " << widget;
+    }
+}
+
+void QtcSettingsItem::applyDeferedChange()
+{
+    setValue(m_deferedValue);
+}
+
+void QtcSettingsItem::uncheckableButtonClicked()
+{
+    QAbstractButton *button = qobject_cast<QAbstractButton *>(sender());
+    QTC_ASSERT(button, return);
+    qDebug() << "UNCHECKABLE BUTTON: " << sender();
+    m_action->trigger();
+}
+
+void QtcSettingsItem::checkableButtonClicked(bool)
+{
+    QAbstractButton *button = qobject_cast<QAbstractButton *>(sender());
+    QTC_ASSERT(button, return);
+    qDebug() << "CHECKABLE BUTTON: " << sender();
+    if (m_applyModes[sender()] == DeferedApply)
+        m_deferedValue = button->isChecked();
+    else
+        setValue(button->isChecked());
+}
+
+void QtcSettingsItem::lineEditEditingFinished()
+{
+    QLineEdit *lineEdit = qobject_cast<QLineEdit *>(sender());
+    QTC_ASSERT(lineEdit, return);
+    qDebug() << "LINEEDIT: " << sender() << lineEdit->text();
+    if (m_applyModes[sender()] == DeferedApply)
+        m_deferedValue = lineEdit->text();
+    else
+        setValue(lineEdit->text());
+}
+
+void QtcSettingsItem::pathChooserEditingFinished()
+{
+    using namespace Core::Utils;
+    PathChooser *pathChooser = qobject_cast<PathChooser *>(sender());
+    QTC_ASSERT(pathChooser, return);
+    qDebug() << "PATHCHOOSER: " << sender() << pathChooser->path();
+    if (m_applyModes[sender()] == DeferedApply)
+        m_deferedValue = pathChooser->path();
+    else
+        setValue(pathChooser->path());
+}
+
+void QtcSettingsItem::actionTriggered(bool on)
+{
+    Q_UNUSED(on);
+    if (QAction *action = qobject_cast<QAction *>(sender())) {
+        if (action->isCheckable())
+            setValue(action->isChecked());
+    }
+}
+
 
 //////////////////////////////////////////////////////////////////////////
 //
-// Debugger specific stuff
+// QtcSettings
 //
 //////////////////////////////////////////////////////////////////////////
 
-struct ActionData
+
+QtcSettings::QtcSettings(QObject *parent)
+    : QObject(parent)
+{}
+
+QtcSettings::~QtcSettings()
 {
-    ActionCode code;
-    const char *text;
-    bool checkable;
-};
+    qDeleteAll(m_items);
+}
+    
+QtcSettingsItem *QtcSettings::createItem(int code)
+{
+    return m_items[code] = new QtcSettingsItem;
+}
 
-static ActionData data[] =
+void QtcSettings::insertItem(int code, QtcSettingsItem *item)
 {
-    //
-    //  General
-    // 
-    { AdjustColumnWidths,
-        QT_TR_NOOP("Adjust column widths to contents"), false },
-    { AlwaysAdjustColumnWidths,
-        QT_TR_NOOP("Adjust column widths to contents"), true },
+    m_items[code] = item;
+}
+
+void QtcSettings::readSettings(QSettings *settings)
+{
+    foreach (QtcSettingsItem *item, m_items)
+        item->readSettings(settings);
+}
+
+void QtcSettings::writeSettings(QSettings *settings)
+{
+    foreach (QtcSettingsItem *item, m_items)
+        item->writeSettings(settings);
+}
+   
+QtcSettingsItem *QtcSettings::item(int code)
+{
+    QTC_ASSERT(m_items.value(code, 0), return 0);
+    return m_items.value(code, 0);
+}
+
+bool QtcSettings::boolValue(int code)
+{
+    return item(code)->value().toBool();
+}
+
+QString QtcSettings::stringValue(int code)
+{
+    return item(code)->value().toString();
+}
+
+int QtcSettings::intValue(int code)
+{
+    return item(code)->value().toInt();
+}
+
+QAction *QtcSettings::action(int code)
+{
+    return item(code)->action();
+}
+
+void QtcSettings::applyDeferedChanges()
+{
+    foreach (QtcSettingsItem *item, m_items)
+        item->applyDeferedChange();
+}
+   
+void QtcSettings::applyDeferedChange(int code)
+{
+    return item(code)->applyDeferedChange();
+}
+
+void QtcSettings::connectWidget(int code, QWidget *widget, ApplyMode applyMode)
+{
+    item(code)->connectWidget(widget, applyMode);
+}
+
+QString QtcSettings::dump()
+{
+    QString out;
+    QTextStream ts(&out);
+    ts  << "Debugger settings: ";
+    foreach (QtcSettingsItem *item, m_items)
+        ts << "\n" << item->value().toString();
+    return out;
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Debugger specific stuff
+//
+//////////////////////////////////////////////////////////////////////////
+
+#if 0
+    QString dump();
+
+    QString m_gdbCmd;
+    QString m_gdbEnv;
+    bool m_autoRun;
+    bool m_autoQuit;
+
+    bool m_useDumpers;
+    bool m_skipKnownFrames;
+    bool m_debugDumpers;
+    bool m_useToolTips;
+    bool m_listSourceFiles;
+
+    QString m_scriptFile;
+
+    bool m_pluginAllBreakpoints;
+    bool m_pluginSelectedBreakpoints;
+    bool m_pluginNoBreakpoints;
+    QString m_pluginSelectedBreakpointsPattern;
+#endif
+
+
+QtcSettings *theDebuggerSettings()
+{
+    static QtcSettings *instance = 0;
+    if (instance)
+        return instance;
+
+    instance = new QtcSettings;
+
+    QtcSettingsItem *item = 0;
+
+    item = instance->createItem(AdjustColumnWidths);
+    item->setText(QObject::tr("Adjust column widths to contents"));
+
+    item = instance->createItem(AlwaysAdjustColumnWidths);
+    item->setText(QObject::tr("Always adjust column widths to contents"));
+    item->action()->setCheckable(true);
+
+    item = instance->createItem(WatchExpression);
+    item->setTextPattern(QObject::tr("Watch expression \"%1\""));
+
+    item = instance->createItem(RemoveWatchExpression);
+    item->setTextPattern(QObject::tr("Remove watch expression \"%1\""));
+
+    item = instance->createItem(SettingsDialog);
+    item->setText(QObject::tr("Debugger properties..."));
+
+    item = instance->createItem(DebugDumpers);
+    item->setText(QObject::tr("Debug custom dumpers"));
+    item->action()->setCheckable(true);
+
+    item = instance->createItem(RecheckDumpers);
+    item->setText(QObject::tr("Recheck custom dumper availability"));
 
     //
-    // Locals & Watchers
+    // Breakpoints
     //
-    { WatchExpression,
-        QT_TR_NOOP("Watch expression '%1'"), false },
-    { WatchExpression,
-        QT_TR_NOOP("Watch expression '%1'"), false },
-    { SettingsDialog,
-        QT_TR_NOOP("Debugger properties..."), false },
-    { UseDumpers,
-        QT_TR_NOOP("Use custom dumpers"), true },
-    { DebugDumpers,
-        QT_TR_NOOP("Debug custom dumpers"), true },
-    { RecheckDumpers,
-        QT_TR_NOOP("Recheck custom dumper availability"), true },
+    item = instance->createItem(SynchronizeBreakpoints);
+    item->setText(QObject::tr("Syncronize breakpoints"));
 
     //
-    // Breakpoints
+    item = instance->createItem(AutoQuit);
+    item->setText(QObject::tr("Automatically quit debugger"));
+    item->action()->setCheckable(true);
+
+    item = instance->createItem(SkipKnownFrames);
+    item->setText(QObject::tr("Skip known frames"));
+    item->action()->setCheckable(true);
+
+    item = instance->createItem(UseToolTips);
+    item->setText(QObject::tr("Use tooltips when debugging"));
+    item->action()->setCheckable(true);
+
+    item = instance->createItem(ListSourceFiles);
+    item->setText(QObject::tr("List source files"));
+    item->action()->setCheckable(true);
+
+
+    //
+    // Settings
     //
-    { SynchronizeBreakpoints,
-        QT_TR_NOOP("Syncronize breakpoints"), false },
-};
+    item = instance->createItem(GdbLocation);
+    item->setSettingsKey("DebugMode", "Location");
 
-QAction *action(ActionCode code)
-{
-    static QHash<ActionCode, QAction *> actions;
+    item = instance->createItem(GdbEnvironment);
+    item->setSettingsKey("DebugMode", "Environment");
 
-    if (actions.isEmpty()) {
-        for (int i = 0; i != sizeof(data)/sizeof(data[0]); ++i) {
-            const ActionData &d = data[i];
-            QAction *act = new QAction(QObject::tr(d.text), 0);
-            act->setCheckable(d.checkable);
-            actions[d.code] = act;
-        }
-    }
+    item = instance->createItem(GdbScriptFile);
+    item->setSettingsKey("DebugMode", "ScriptFile");
+
+    item = instance->createItem(GdbAutoQuit);
+    item->setSettingsKey("DebugMode", "AutoQuit");
+
+    item = instance->createItem(GdbAutoRun);
+    item->setSettingsKey("DebugMode", "AutoRun");
+
+    item = instance->createItem(UseToolTips);
+    item->setSettingsKey("DebugMode", "UseToolTips");
+
+    item = instance->createItem(UseDumpers);
+    item->setSettingsKey("DebugMode", "UseCustomDumpers");
+    item->setText(QObject::tr("Use custom dumpers"));
+    item->action()->setCheckable(true);
+
+
+    item = instance->createItem(ListSourceFiles);
+    item->setSettingsKey("DebugMode", "ListSourceFiles");
+
+    item = instance->createItem(SkipKnownFrames);
+    item->setSettingsKey("DebugMode", "SkipKnownFrames");
+
+    item = instance->createItem(DebugDumpers);
+    item->setSettingsKey("DebugMode", "DebugDumpers");
+
+    item = instance->createItem(AllPluginBreakpoints);
+    item->setSettingsKey("DebugMode", "AllPluginBreakpoints");
+
+    item = instance->createItem(SelectedPluginBreakpoints);
+    item->setSettingsKey("DebugMode", "SelectedPluginBreakpoints");
+
+    item = instance->createItem(NoPluginBreakpoints);
+    item->setSettingsKey("DebugMode", "NoPluginBreakpoints");
+
+    item = instance->createItem(SelectedPluginBreakpointsPattern);
+    item->setSettingsKey("DebugMode", "SelectedPluginBreakpointsPattern");
 
-    return actions.value(code);
+    return instance;
 }
 
 } // namespace Internal
diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index 8520b5cd20b129987f994c2d45576dc64de24634..50b76b3da95830511ddbd5d1b3a797c23315f86b 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -30,12 +30,114 @@
 #ifndef DEBUGGER_ACTIONS_H
 #define DEBUGGER_ACTIONS_H
 
-#include <QtGui/QAction>
+#include <QtCore/QHash>
+#include <QtCore/QString>
+#include <QtCore/QVariant>
+
+QT_BEGIN_NAMESPACE
+class QAction;
+class QSettings;
+QT_END_NAMESPACE
+
 
 namespace Debugger {
 namespace Internal {
 
-enum ActionCode
+enum ApplyMode { ImmediateApply, DeferedApply };
+
+class QtcSettingsItem : public QObject
+{
+    Q_OBJECT
+
+public:
+    QtcSettingsItem(QObject *parent = 0);
+
+    virtual QVariant value() const;
+    Q_SLOT virtual void setValue(const QVariant &value, bool doemit = true);
+
+    virtual QVariant defaultValue() const;
+    Q_SLOT virtual void setDefaultValue(const QVariant &value);
+
+    virtual QAction *action() const;
+
+    // used for persistency
+    virtual QString settingsKey() const;
+    Q_SLOT virtual void setSettingsKey(const QString &key);
+    Q_SLOT virtual void setSettingsKey(const QString &group, const QString &key);
+
+    virtual QString settingsGroup() const;
+    Q_SLOT virtual void setSettingsGroup(const QString &group);
+
+    virtual void readSettings(QSettings *settings);
+    Q_SLOT virtual void writeSettings(QSettings *settings);
+    
+    virtual void connectWidget(QWidget *widget, ApplyMode applyMode = DeferedApply);
+    Q_SLOT virtual void applyDeferedChange();
+
+    virtual QString text() const;
+    Q_SLOT virtual void setText(const QString &value);
+
+    virtual QString textPattern() const;
+    Q_SLOT virtual void setTextPattern(const QString &value);
+
+signals:
+    void valueChanged(const QVariant &newValue);
+    void boolValueChanged(bool newValue);
+    void stringValueChanged(const QString &newValue);
+
+private:
+    Q_SLOT void uncheckableButtonClicked();
+    Q_SLOT void checkableButtonClicked(bool);
+    Q_SLOT void lineEditEditingFinished();
+    Q_SLOT void pathChooserEditingFinished();
+    Q_SLOT void actionTriggered(bool);
+
+    QVariant m_value;
+    QVariant m_defaultValue;
+    QVariant m_deferedValue; // basically a temporary copy of m_value 
+    QString m_settingsKey;
+    QString m_settingsGroup;
+    QString m_textPattern;
+    QAction *m_action;
+    QHash<QObject *, ApplyMode> m_applyModes;
+};
+
+class QtcSettings : public QObject
+{
+    Q_OBJECT
+
+public:
+    QtcSettings(QObject *parent = 0);
+    ~QtcSettings();
+    
+    void insertItem(int code, QtcSettingsItem *item);
+
+    QAction *action(int code);
+    QtcSettingsItem *item(int code);
+    QtcSettingsItem *createItem(int code);
+
+    // Convienience
+    bool boolValue(int code);
+    int intValue(int code);
+    QString stringValue(int code);
+    virtual QString dump();
+
+    void connectWidget(int code, QWidget *, ApplyMode applyMode = DeferedApply);
+    void applyDeferedChange(int code);
+    void applyDeferedChanges();
+
+public slots:
+    void readSettings(QSettings *settings);
+    void writeSettings(QSettings *settings);
+
+private:
+    QHash<int, QtcSettingsItem *> m_items; 
+};
+
+
+///////////////////////////////////////////////////////////
+
+enum DebuggerSettingsCode
 {
     // General
     SettingsDialog,
@@ -64,7 +166,7 @@ enum ActionCode
     ListSourceFiles,
 
     // Running
-    SkipKnowFrames,
+    SkipKnownFrames,
 
     // Breakpoints
     SynchronizeBreakpoints,
@@ -72,10 +174,12 @@ enum ActionCode
     SelectedPluginBreakpoints,
     NoPluginBreakpoints,
     SelectedPluginBreakpointsPattern,
-};
 
-QAction *action(ActionCode code);
+    AutoQuit,
+};
 
+// singleton access
+QtcSettings *theDebuggerSettings();
 
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 8dcef6b53a96a60472df29b70fa44ef1ff6d58d1..28cfaf274502a6a00f63e669c8853cc4f0e7da0d 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -88,40 +88,6 @@ using namespace Debugger::Constants;
 static const QString tooltipIName = "tooltip";
 
 
-DebuggerSettings::DebuggerSettings()
-{
-    m_autoRun = false;
-    m_autoQuit = false;
-    m_skipKnownFrames = false;
-    m_debugDumpers = false;
-    m_useToolTips = false;
-    m_useDumpers = true;
-    m_listSourceFiles = false;
-}
-
-
-QString DebuggerSettings::dump()
-{
-    QString out;
-    QTextStream ts(&out);
-    ts  << "Debugger settings: "
-        << "  gdbCmd: " << m_gdbCmd
-        << "  gdbEnv: " << m_gdbEnv 
-        << "  autoRun: " << m_autoRun
-        << "  autoQuit: " << m_autoQuit
-        << "  useCustomDumpers: " << m_useDumpers
-        << "  skipKnownFrames: " << m_skipKnownFrames
-        << "  debugDumpers: " << m_debugDumpers
-        << "  useToolTips: " << m_useToolTips
-        << "  listSourceFiles: " << m_listSourceFiles
-        << "  scriptFile: " << m_scriptFile
-        << "  pluginAllBreakpoints: " << m_pluginAllBreakpoints
-        << "  pluginSelectedBreakpoints: " << m_pluginSelectedBreakpoints
-        << "  pluginNoBreakpoints: " << m_pluginNoBreakpoints
-        << "  pluginSelectedBreakpointsPattern: " << m_pluginSelectedBreakpointsPattern;
-    return out;
-}
-
 ///////////////////////////////////////////////////////////////////////
 //
 // BreakByFunctionDialog
@@ -291,8 +257,6 @@ void DebuggerManager::init()
         this, SLOT(collapseChildren(QModelIndex)));
     connect(localsView, SIGNAL(requestAssignValue(QString,QString)),
         this, SLOT(assignValueInDebugger(QString,QString)));
-    connect(localsView, SIGNAL(requestWatchExpression(QString)),
-        this, SLOT(watchExpression(QString)));
 
     // Watchers 
     QTreeView *watchersView = qobject_cast<QTreeView *>(m_watchersWindow);
@@ -303,10 +267,6 @@ void DebuggerManager::init()
         this, SLOT(expandChildren(QModelIndex)));
     connect(watchersView, SIGNAL(requestCollapseChildren(QModelIndex)),
         this, SLOT(collapseChildren(QModelIndex)));
-    connect(watchersView, SIGNAL(requestWatchExpression(QString)),
-        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)),
@@ -467,11 +427,6 @@ void DebuggerManager::init()
     setDebuggerType(GdbDebugger);
     if (Debugger::Constants::Internal::debug)
         qDebug() << Q_FUNC_INFO << gdbEngine << winEngine << scriptEngine;
-
-    connect(action(UseDumpers), SIGNAL(triggered(bool)),
-        this, SLOT(setUseDumpers(bool)));
-    connect(action(DebugDumpers), SIGNAL(triggered(bool)),
-        this, SLOT(setDebugDumpers(bool)));
 }
 
 void DebuggerManager::setDebuggerType(DebuggerType type)
@@ -777,12 +732,6 @@ void DebuggerManager::collapseChildren(const QModelIndex &idx)
     m_watchHandler->collapseChildren(idx);
 }
 
-void DebuggerManager::removeWatchExpression(const QString &exp)
-{
-    QTC_ASSERT(m_watchHandler, return);
-    m_watchHandler->removeWatchExpression(exp);
-}
-
 QVariant DebuggerManager::sessionValue(const QString &name)
 {
     // this is answered by the plugin
@@ -1143,13 +1092,7 @@ void DebuggerManager::addToWatchWindow()
     if (!editor)
         return;
     QTextCursor tc = editor->textCursor();
-    watchExpression(tc.selectedText());
-}
-
-void DebuggerManager::watchExpression(const QString &expression)
-{
-    QTC_ASSERT(m_watchHandler, return);
-    m_watchHandler->watchExpression(expression);
+    theDebuggerSettings()->item(WatchExpression)->setValue(tc.selectedText());
 }
 
 void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber)
@@ -1278,38 +1221,6 @@ void DebuggerManager::setBusyCursor(bool busy)
     m_watchersWindow->setCursor(cursor);
 }
 
-bool DebuggerManager::skipKnownFrames() const
-{
-    return m_settings.m_skipKnownFrames;
-}
-
-bool DebuggerManager::debugDumpers() const
-{
-    return m_settings.m_debugDumpers;
-}
-
-bool DebuggerManager::useDumpers() const
-{
-    return m_settings.m_useDumpers;
-}
-
-void DebuggerManager::setUseDumpers(bool on)
-{
-    QTC_ASSERT(m_engine, return);
-    m_settings.m_useDumpers = on;
-}
-
-void DebuggerManager::setDebugDumpers(bool on)
-{
-    QTC_ASSERT(m_engine, return);
-    m_settings.m_debugDumpers = on;
-}
-
-void DebuggerManager::setSkipKnownFrames(bool on)
-{
-    m_settings.m_skipKnownFrames = on;
-}
-
 void DebuggerManager::queryCurrentTextEditor(QString *fileName, int *lineNumber,
     QObject **object)
 {
@@ -1335,7 +1246,6 @@ void DebuggerManager::interruptDebuggingRequest()
     }
 }
 
-
 void DebuggerManager::runToLineExec()
 {
     QTC_ASSERT(m_engine, return);
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 419f3cb64de57ddba6b6208d0fb4f6dab1ce0bfe..deeb4375e7e4feb3984ae6bf5745d0fffb533f93 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -160,16 +160,7 @@ private:
     virtual SourceFilesWindow *sourceFileWindow() = 0;
 
     virtual void showApplicationOutput(const QString &data) = 0;
-    virtual bool skipKnownFrames() const = 0;
-    virtual bool debugDumpers() const = 0;
-    virtual bool useDumpers() const = 0;
     
-    virtual bool wantsSourceFileList() const = 0;
-    virtual bool wantsAllPluginBreakpoints() const = 0;
-    virtual bool wantsSelectedPluginBreakpoints() const = 0;
-    virtual bool wantsNoPluginBreakpoints() const = 0;
-    virtual QString selectedPluginBreakpointsPattern() const = 0;
-
     virtual void reloadDisassembler() = 0;
     virtual void reloadModules() = 0;
     virtual void reloadSourceFiles() = 0;
@@ -177,36 +168,6 @@ private:
 };
 
 
-//
-// DebuggerSettings
-//
-
-class DebuggerSettings
-{
-public:
-    DebuggerSettings();
-    QString dump();
-
-public:
-    QString m_gdbCmd;
-    QString m_gdbEnv;
-    bool m_autoRun;
-    bool m_autoQuit;
-
-    bool m_useDumpers;
-    bool m_skipKnownFrames;
-    bool m_debugDumpers;
-    bool m_useToolTips;
-    bool m_listSourceFiles;
-
-    QString m_scriptFile;
-
-    bool m_pluginAllBreakpoints;
-    bool m_pluginSelectedBreakpoints;
-    bool m_pluginNoBreakpoints;
-    QString m_pluginSelectedBreakpointsPattern;
-};
-
 //
 // DebuggerManager
 //
@@ -223,7 +184,6 @@ public:
     IDebuggerManagerAccessForEngines *engineInterface();
     QMainWindow *mainWindow() const { return m_mainWindow; }
     QLabel *statusLabel() const { return m_statusLabel; }
-    DebuggerSettings *settings() { return &m_settings; }
 
     enum DebuggerType { GdbDebugger, ScriptDebugger, WinDebugger };
 
@@ -258,7 +218,6 @@ public slots:
     void breakByFunction();
     void breakByFunction(const QString &functionName);
     void setBreakpoint(const QString &fileName, int lineNumber);
-    void watchExpression(const QString &expression);
     void breakAtMain();
     void activateFrame(int index);
     void selectThread(int index);
@@ -272,7 +231,6 @@ public slots:
 
     void addToWatchWindow();
     void updateWatchModel();
-    void removeWatchExpression(const QString &iname);
     void expandChildren(const QModelIndex &idx);
     void collapseChildren(const QModelIndex &idx);
     
@@ -284,11 +242,7 @@ public slots:
 
     void showStatusMessage(const QString &msg, int timeout = -1); // -1 forever
 
-    void setSkipKnownFrames(bool on);
-
 private slots:
-    void setDebugDumpers(bool on);
-    void setUseDumpers(bool on);
     void showDebuggerOutput(const QString &prefix, const QString &msg);
     void showDebuggerInput(const QString &prefix, const QString &msg);
     void showApplicationOutput(const QString &data);
@@ -323,20 +277,6 @@ private:
     WatchHandler *watchHandler() { return m_watchHandler; }
     SourceFilesWindow *sourceFileWindow() { return m_sourceFilesWindow; }
 
-    bool skipKnownFrames() const;
-    bool debugDumpers() const;
-    bool useDumpers() const;
-    bool wantsSourceFileList() const
-        { return m_settings.m_listSourceFiles; }
-    bool wantsAllPluginBreakpoints() const
-        { return m_settings.m_pluginAllBreakpoints; }
-    bool wantsSelectedPluginBreakpoints() const
-        { return m_settings.m_pluginSelectedBreakpoints; }
-    bool wantsNoPluginBreakpoints() const
-        { return m_settings.m_pluginNoBreakpoints; }
-    QString selectedPluginBreakpointsPattern() const
-        { return m_settings.m_pluginSelectedBreakpointsPattern; }
-
     void notifyInferiorStopped();
     void notifyInferiorRunningRequested();
     void notifyInferiorStopRequested();
@@ -383,7 +323,6 @@ signals:
     void configValueRequested(const QString &name, QVariant *value);
     void setConfigValueRequested(const QString &name, const QVariant &value);
     void applicationOutputAvailable(const QString &output);
-    void settingsDialogRequested();
 
 public:
     // FIXME: make private
@@ -473,7 +412,6 @@ private:
 
     IDebuggerEngine *engine();
     IDebuggerEngine *m_engine;
-    DebuggerSettings m_settings;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index c0ca6eda1d9793af694b524066057927fb284bb0..6fab94119cbff389ccb8e7b2b34491e3efa81a14 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -257,40 +257,41 @@ private:
     friend class DebuggerPlugin;
     Ui::GdbOptionPage m_ui;
 
-    DebuggerSettings m_settings;
     DebuggerPlugin *m_plugin;
 };
 
 QWidget *GdbOptionPage::createPage(QWidget *parent)
 {
     QWidget *w = new QWidget(parent);
-    m_settings = *m_plugin->m_manager->settings();
     m_ui.setupUi(w);
+    QtcSettings *s = theDebuggerSettings();
     m_ui.gdbLocationChooser->setExpectedKind(Core::Utils::PathChooser::Command);
     m_ui.gdbLocationChooser->setPromptDialogTitle(tr("Choose Gdb Location"));
-    m_ui.gdbLocationChooser->setPath(m_settings.m_gdbCmd);
     m_ui.scriptFileChooser->setExpectedKind(Core::Utils::PathChooser::File);
     m_ui.scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File"));
-    m_ui.scriptFileChooser->setPath(m_settings.m_scriptFile);
-    m_ui.environmentEdit->setText(m_settings.m_gdbEnv);
-
-    m_ui.radioButtonAllPluginBreakpoints->
-        setChecked(m_settings.m_pluginAllBreakpoints);
-    m_ui.radioButtonSelectedPluginBreakpoints->
-        setChecked(m_settings.m_pluginSelectedBreakpoints);
-    m_ui.radioButtonNoPluginBreakpoints->
-        setChecked(m_settings.m_pluginNoBreakpoints);
-    m_ui.lineEditSelectedPluginBreakpointsPattern->
-        setText(m_settings.m_pluginSelectedBreakpointsPattern);
-    m_ui.lineEditSelectedPluginBreakpointsPattern->
-        setEnabled(m_settings.m_pluginSelectedBreakpoints);
 
-    m_ui.checkBoxListSourceFiles->setChecked(m_settings.m_listSourceFiles);
-    m_ui.checkBoxSkipKnownFrames->setChecked(m_settings.m_skipKnownFrames);
-    m_ui.checkBoxDebugDumpers->setChecked(m_settings.m_debugDumpers);
-    m_ui.checkBoxUseDumpers->setChecked(m_settings.m_useDumpers);
-    m_ui.checkBoxUseToolTips->setChecked(m_settings.m_useToolTips);
+    s->connectWidget(GdbLocation, m_ui.gdbLocationChooser);
+    s->connectWidget(GdbScriptFile, m_ui.scriptFileChooser);
+    s->connectWidget(GdbEnvironment, m_ui.environmentEdit);
+
+    s->connectWidget(AllPluginBreakpoints,
+        m_ui.radioButtonAllPluginBreakpoints);
+    s->connectWidget(SelectedPluginBreakpoints,
+        m_ui.radioButtonSelectedPluginBreakpoints);
+    s->connectWidget(NoPluginBreakpoints,
+        m_ui.radioButtonNoPluginBreakpoints);
+    s->connectWidget(SelectedPluginBreakpointsPattern,
+        m_ui.lineEditSelectedPluginBreakpointsPattern);
+
+    s->connectWidget(UseDumpers, m_ui.checkBoxUseDumpers);
+    s->connectWidget(SkipKnownFrames, m_ui.checkBoxSkipKnownFrames);
+    s->connectWidget(UseToolTips, m_ui.checkBoxUseToolTips);
+    s->connectWidget(DebugDumpers, m_ui.checkBoxDebugDumpers);
+    s->connectWidget(SelectedPluginBreakpointsPattern,
+        m_ui.lineEditSelectedPluginBreakpointsPattern);
 
+    m_ui.lineEditSelectedPluginBreakpointsPattern->
+        setEnabled(s->boolValue(SelectedPluginBreakpoints));
     connect(m_ui.radioButtonSelectedPluginBreakpoints, SIGNAL(toggled(bool)),
         m_ui.lineEditSelectedPluginBreakpointsPattern, SLOT(setEnabled(bool)));
 
@@ -310,36 +311,15 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
 
     //m_dumpLogAction = new QAction(this);
     //m_dumpLogAction->setText(tr("Dump Log File for Debugging Purposes"));
-    //
-    connect(m_ui.checkBoxUseDumpers, SIGNAL(clicked()),
-        action(UseDumpers), SLOT(trigger()));
 
     return w;
 }
 
 void GdbOptionPage::apply()
 {
-    m_settings.m_gdbCmd   = m_ui.gdbLocationChooser->path();
-    m_settings.m_gdbEnv   = m_ui.environmentEdit->text();
-    m_settings.m_scriptFile = m_ui.scriptFileChooser->path();
-
-    m_settings.m_skipKnownFrames = m_ui.checkBoxSkipKnownFrames->isChecked();
-    m_settings.m_listSourceFiles = m_ui.checkBoxListSourceFiles->isChecked();
-    m_settings.m_debugDumpers = m_ui.checkBoxDebugDumpers->isChecked();
-    m_settings.m_useDumpers = m_ui.checkBoxUseDumpers->isChecked();
-    m_settings.m_useToolTips = m_ui.checkBoxUseToolTips->isChecked();
-
-    m_settings.m_pluginAllBreakpoints =
-        m_ui.radioButtonAllPluginBreakpoints->isChecked();
-    m_settings.m_pluginSelectedBreakpoints =
-        m_ui.radioButtonSelectedPluginBreakpoints->isChecked();
-    m_settings.m_pluginNoBreakpoints =
-        m_ui.radioButtonNoPluginBreakpoints->isChecked();
-    m_settings.m_pluginSelectedBreakpointsPattern =
-        m_ui.lineEditSelectedPluginBreakpointsPattern->text();
-
-    *m_plugin->m_manager->settings() = m_settings;
-    m_plugin->writeSettings();
+    QtcSettings *s = theDebuggerSettings();
+    s->applyDeferedChanges();
+    s->writeSettings(ICore::instance()->settings());
 }
 
 } // namespace Internal
@@ -716,7 +696,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
     connect(m_manager, SIGNAL(debugModeRequested()),
         this, SLOT(activateDebugMode()));
 
-    connect(m_manager, SIGNAL(settingsDialogRequested()),
+    connect(theDebuggerSettings()->action(SettingsDialog), SIGNAL(triggered()),
         this, SLOT(showSettingsDialog()));
 
     return true;
@@ -810,7 +790,7 @@ void DebuggerPlugin::requestMark(TextEditor::ITextEditor *editor, int lineNumber
 void DebuggerPlugin::showToolTip(TextEditor::ITextEditor *editor,
     const QPoint &point, int pos)
 {
-    if (!m_manager->settings()->m_useToolTips)
+    if (!theDebuggerSettings()->boolValue(UseToolTips))
         return;
 
     QPlainTextEdit *plaintext = qobject_cast<QPlainTextEdit*>(editor->widget());
@@ -899,34 +879,17 @@ void DebuggerPlugin::writeSettings() const
     QTC_ASSERT(m_manager->mainWindow(), return);
 
     QSettings *s = settings();
-    DebuggerSettings *m = m_manager->settings();
+    theDebuggerSettings()->writeSettings(s);
     s->beginGroup(QLatin1String("DebugMode"));
     s->setValue("State", m_manager->mainWindow()->saveState());
     s->setValue("Locked", m_toggleLockedAction->isChecked());
-    s->setValue("Location", m->m_gdbCmd);
-    s->setValue("Environment", m->m_gdbEnv);
-    s->setValue("ScriptFile", m->m_scriptFile);
-    s->setValue("AutoRun", m->m_autoRun);
-    s->setValue("AutoQuit", m->m_autoQuit);
-
-    s->setValue("UseToolTips", m->m_useToolTips);
-    s->setValue("UseCustomDumpers", m->m_useDumpers);
-    s->setValue("ListSourceFiles", m->m_listSourceFiles);
-    s->setValue("SkipKnowFrames", m->m_skipKnownFrames);
-    s->setValue("DebugDumpers", m->m_debugDumpers);
-
-    s->setValue("AllPluginBreakpoints", m->m_pluginAllBreakpoints);
-    s->setValue("SelectedPluginBreakpoints", m->m_pluginSelectedBreakpoints);
-    s->setValue("NoPluginBreakpoints", m->m_pluginNoBreakpoints);
-    s->setValue("SelectedPluginBreakpointsPattern", m->m_pluginSelectedBreakpointsPattern);
-
     s->endGroup();
 }
 
 void DebuggerPlugin::readSettings()
 {
     QSettings *s = settings();
-    DebuggerSettings *m = &m_manager->m_settings; 
+    theDebuggerSettings()->readSettings(s);
 
     QString defaultCommand("gdb");
 #if defined(Q_OS_WIN32)
@@ -937,31 +900,8 @@ void DebuggerPlugin::readSettings()
     QString defaultScript;
 
     s->beginGroup(QLatin1String("DebugMode"));
-
     QByteArray ba = s->value("State", QByteArray()).toByteArray();
     m_toggleLockedAction->setChecked(s->value("Locked", true).toBool());
-    m->m_gdbCmd     = s->value("Location", defaultCommand).toString();
-    m->m_scriptFile = s->value("ScriptFile", defaultScript).toString();
-    m->m_gdbEnv     = s->value("Environment", "").toString();
-    m->m_autoRun    = s->value("AutoRun", true).toBool();
-    m->m_autoQuit   = s->value("AutoQuit", true).toBool();
-
-    m->m_skipKnownFrames  = s->value("SkipKnownFrames", false).toBool();
-    m->m_debugDumpers     = s->value("DebugDumpers", false).toBool();
-    m->m_useDumpers       = s->value("UseCustomDumpers", true).toBool();
-    action(UseDumpers)->setChecked(m->m_useDumpers);
-    m->m_useToolTips      = s->value("UseToolTips", false).toBool();
-    m->m_listSourceFiles  = s->value("ListSourceFiles", false).toBool();
-
-    m->m_pluginAllBreakpoints =
-        s->value("AllPluginBreakpoints", true).toBool();
-    m->m_pluginSelectedBreakpoints =
-        s->value("SelectedPluginBreakpoints", false).toBool();
-    m->m_pluginNoBreakpoints =
-        s->value("NoPluginBreakpoints", false).toBool();
-    m->m_pluginSelectedBreakpointsPattern =
-        s->value("SelectedPluginBreakpointsPattern").toString();
-
     s->endGroup();
 
     m_manager->mainWindow()->restoreState(ba);
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index aafc019fd5601c32dee530b6b1b05876caf407f4..fcad2395c35295a2cab77ee505b0028bbf61d52f 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -285,11 +285,12 @@ void GdbEngine::initializeConnections()
         q, SLOT(showApplicationOutput(QString)),
         Qt::QueuedConnection);
 
-    connect(action(UseDumpers), SIGNAL(triggered(bool)),
+    QtcSettings *s = theDebuggerSettings();
+    connect(s->item(UseDumpers), SIGNAL(boolValueChanged(bool)),
         this, SLOT(setUseDumpers(bool)));
-    connect(action(DebugDumpers), SIGNAL(triggered(bool)),
+    connect(s->item(DebugDumpers), SIGNAL(boolValueChanged(bool)),
         this, SLOT(setDebugDumpers(bool)));
-    connect(action(RecheckDumpers), SIGNAL(triggered()),
+    connect(s->action(RecheckDumpers), SIGNAL(triggered()),
         this, SLOT(recheckCustomDumperAvailability()));
 }
 
@@ -319,7 +320,8 @@ void GdbEngine::gdbProcError(QProcess::ProcessError error)
         case QProcess::FailedToStart:
             msg = QString(tr("The Gdb process failed to start. Either the "
                 "invoked program '%1' is missing, or you may have insufficient "
-                "permissions to invoke the program.")).arg(q->settings()->m_gdbCmd);
+                "permissions to invoke the program."))
+                .arg(theDebuggerSettings()->stringValue(GdbLocation));
             break;
         case QProcess::Crashed:
             msg = tr("The Gdb process crashed some time after starting "
@@ -1144,22 +1146,24 @@ void GdbEngine::handleAqcuiredInferior()
     #if defined(Q_OS_MAC)
     sendCommand("info pid", GdbInfoProc, QVariant(), NeedsStop);
     #endif
-    if (qq->wantsSourceFileList())
+    if (theDebuggerSettings()->boolValue(UseDumpers))
         reloadSourceFiles();
     tryLoadCustomDumpers();
 
     #ifndef Q_OS_MAC
     // intentionally after tryLoadCustomDumpers(),
     // otherwise we'd interupt solib loading.
-    if (qq->wantsAllPluginBreakpoints()) {
+    QtcSettings *s = theDebuggerSettings();
+    if (s->boolValue(AllPluginBreakpoints)) {
         sendCommand("set auto-solib-add on");
         sendCommand("set stop-on-solib-events 0");
         sendCommand("sharedlibrary .*");
-    } else if (qq->wantsSelectedPluginBreakpoints()) {
+    } else if (s->boolValue(SelectedPluginBreakpoints)) {
         sendCommand("set auto-solib-add on");
         sendCommand("set stop-on-solib-events 1");
-        sendCommand("sharedlibrary " + qq->selectedPluginBreakpointsPattern());
-    } else if (qq->wantsNoPluginBreakpoints()) {
+        sendCommand("sharedlibrary "
+            + s->stringValue(SelectedPluginBreakpointsPattern));
+    } else if (s->boolValue(NoPluginBreakpoints)) {
         // should be like that already
         sendCommand("set auto-solib-add off");
         sendCommand("set stop-on-solib-events 0");
@@ -1232,11 +1236,13 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
     }
 
     QString msg = data.findChild("consolestreamoutput").data();
+    QtcSettings *s = theDebuggerSettings();
     if (msg.contains("Stopped due to shared library event") || reason.isEmpty()) {
-        if (qq->wantsSelectedPluginBreakpoints()) {
+        if (s->boolValue(SelectedPluginBreakpoints)) {
             debugMessage("SHARED LIBRARY EVENT: " + data.toString());
-            debugMessage("PATTERN: " + qq->selectedPluginBreakpointsPattern());
-            sendCommand("sharedlibrary " + qq->selectedPluginBreakpointsPattern());
+            QString pattern =  s->stringValue(SelectedPluginBreakpointsPattern);
+            debugMessage("PATTERN: " + pattern);
+            sendCommand("sharedlibrary " + pattern);
             continueInferior();
             q->showStatusMessage(tr("Loading %1...").arg(QString(data.toString())));
             return;
@@ -1260,7 +1266,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
 
     // jump over well-known frames
     static int stepCounter = 0;
-    if (qq->skipKnownFrames()) {
+    if (s->boolValue(SkipKnownFrames)) {
         if (reason == "end-stepping-range" || reason == "function-finished") {
             GdbMi frame = data.findChild("frame");
             //debugMessage(frame.toString());
@@ -1302,7 +1308,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
                  frame.findChild("func").data() + '%';
 
             QApplication::alert(q->mainWindow(), 3000);
-            if (qq->wantsSourceFileList())
+            if (s->boolValue(ListSourceFiles))
                 reloadSourceFiles();
             sendCommand("-break-list", BreakList);
             QVariant var = QVariant::fromValue<GdbMi>(data);
@@ -1562,7 +1568,7 @@ int GdbEngine::currentFrame() const
 
 bool GdbEngine::startDebugger()
 {
-    debugMessage(q->settings()->dump());
+    debugMessage(theDebuggerSettings()->dump());
     QStringList gdbArgs;
 
     if (m_gdbProc.state() != QProcess::NotRunning) {
@@ -1608,8 +1614,9 @@ bool GdbEngine::startDebugger()
     qDebug() << "ExeFile: " << q->m_executable;
     #endif
 
-    q->showStatusMessage(tr("Starting Debugger: ") + q->settings()->m_gdbCmd + ' ' + gdbArgs.join(" "));
-    m_gdbProc.start(q->settings()->m_gdbCmd, gdbArgs);
+    QString loc = theDebuggerSettings()->stringValue(GdbLocation);
+    q->showStatusMessage(tr("Starting Debugger: ") + loc + ' ' + gdbArgs.join(" "));
+    m_gdbProc.start(loc, gdbArgs);
     if (!m_gdbProc.waitForStarted()) {
         QMessageBox::critical(q->mainWindow(), tr("Debugger Startup Failure"),
                               tr("Cannot start debugger: %1").arg(m_gdbProc.errorString()));
@@ -1683,7 +1690,7 @@ bool GdbEngine::startDebugger()
             "dyld \".*CarbonDataFormatters.*\" all");
     #endif
 
-    QString scriptFileName = q->settings()->m_scriptFile;
+    QString scriptFileName = theDebuggerSettings()->stringValue(GdbScriptFile);
     if (!scriptFileName.isEmpty()) {
         QFile scriptFile(scriptFileName);
         if (scriptFile.open(QIODevice::ReadOnly)) {
@@ -2759,7 +2766,7 @@ void GdbEngine::setToolTipExpression(const QPoint &pos, const QString &exp0)
         return;
     }
 
-    if (q->settings()->m_debugDumpers) {
+    if (theDebuggerSettings()->boolValue(DebugDumpers)) {
         // minimize interference
         return;
     }
@@ -3093,8 +3100,7 @@ void GdbEngine::setUseDumpers(bool on)
 
 bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
 {
-    DebuggerSettings *s = q->settings();
-    if (!s->m_useDumpers)
+    if (!theDebuggerSettings()->boolValue(UseDumpers))
         return false;
 
     if (q->startMode() == AttachCore) {
@@ -3103,8 +3109,10 @@ bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
             || type == "QStringList" || type.endsWith("::QStringList");
     }
 
-    if (s->m_debugDumpers && qq->stackHandler()->isDebuggingDumpers())
+    if (theDebuggerSettings()->boolValue(DebugDumpers)
+            && qq->stackHandler()->isDebuggingDumpers())
         return false;
+
     if (m_dataDumperState != DataDumperAvailable)
         return false;
 
@@ -3696,7 +3704,7 @@ void GdbEngine::handleDumpCustomValue1(const GdbResultRecord &record,
         //qDebug() << "CUSTOM DUMPER ERROR MESSAGE: " << msg;
 #ifdef QT_DEBUG
         // Make debugging of dumpers easier
-        if (q->settings()->m_debugDumpers
+        if (theDebuggerSettings()->boolValue(DebugDumpers)
                 && msg.startsWith("The program being debugged stopped while")
                 && msg.contains("qDumpObjectData440")) {
             // Fake full stop
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index b369bb63aa49efe848afe5f5b575bc0102909362..053ae00e5f239fb0cd739fd68329b8453c78db87 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -28,6 +28,7 @@
 **************************************************************************/
 
 #include "watchhandler.h"
+#include "debuggeractions.h"
 
 #if USE_MODEL_TEST
 #include "modeltest.h"
@@ -38,6 +39,7 @@
 #include <QtCore/QDebug>
 #include <QtCore/QEvent>
 
+#include <QtGui/QAction>
 #include <QtGui/QApplication>
 #include <QtGui/QLabel>
 #include <QtGui/QToolTip>
@@ -365,6 +367,14 @@ WatchHandler::WatchHandler()
     m_completeSet = initialSet();
     m_incompleteSet.clear();
     m_displaySet = m_completeSet;
+
+    QtcSettings *s = theDebuggerSettings();
+
+    connect(s->item(WatchExpression), SIGNAL(stringValueChanged(QString)),
+        this, SLOT(watchExpression(QString)));
+
+    connect(s->item(RemoveWatchExpression), SIGNAL(stringValueChanged(QString)),
+        this, SLOT(removeWatchExpression(QString)));
 }
 
 bool WatchHandler::setData(const QModelIndex &idx,
diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h
index 11c7c69450d9d1dbec1657a62a184aaed9e1eb10..d94418a4311663a2a9b9221ef1eea9ff5e7d4218 100644
--- a/src/plugins/debugger/watchhandler.h
+++ b/src/plugins/debugger/watchhandler.h
@@ -160,8 +160,8 @@ public:
     
 //public slots:
     void cleanup();
-    void watchExpression(const QString &exp);
-    void removeWatchExpression(const QString &exp);
+    Q_SLOT void watchExpression(const QString &exp);
+    Q_SLOT void removeWatchExpression(const QString &exp);
     void reinitializeWatchers();
 
     void collapseChildren(const QModelIndex &idx);
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 4f8c4fed5f73b4529df5103629527516173ccd47..56f1b1773a2ebe1c8ef34ce80f82f3b78908f001 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -92,23 +92,20 @@ void WatchWindow::keyPressEvent(QKeyEvent *ev)
         QModelIndex idx = currentIndex();
         QModelIndex idx1 = idx.sibling(idx.row(), 0);
         QString exp = model()->data(idx1).toString();
-        emit requestRemoveWatchExpression(exp); 
+        theDebuggerSettings()->item(RemoveWatchExpression)->setValue(exp);
     }
     QTreeView::keyPressEvent(ev);
 }
 
 void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
 {
+    QtcSettings *s = theDebuggerSettings();
     QMenu menu;
     QAction *act1 = new QAction("Adjust column widths to contents", &menu);
     QAction *act2 = new QAction("Always adjust column widths to contents", &menu);
     act2->setCheckable(true);
     act2->setChecked(m_alwaysResizeColumnsToContents);
-    QAction *act3 = 0;
     QAction *act4 = 0;
-    QAction *act5 = action(RecheckDumpers);
-    QAction *act6 = action(UseDumpers);
-    QAction *act7 = action(SettingsDialog);
 
     menu.addAction(act1);
     menu.addAction(act2);
@@ -121,10 +118,9 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     bool visual = false;
     if (idx.isValid()) {
         menu.addSeparator();
-        if (m_type == LocalsType)
-            act3 = new QAction("Watch expression '" + exp + "'", &menu);
-        else 
-            act3 = new QAction("Remove expression '" + exp + "'", &menu);
+        int type = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression;
+        QAction *act3 = s->action(type);
+        act3->setText(exp);
         menu.addAction(act3);
     
         visual = model()->data(mi0, VisualRole).toBool();
@@ -134,28 +130,19 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
         // FIXME: menu.addAction(act4);
     }
     menu.addSeparator();
-    menu.addAction(act5);
-    menu.addAction(act6);
+    menu.addAction(s->action(RecheckDumpers));
+    menu.addAction(s->action(UseDumpers));
     menu.addSeparator();
-    menu.addAction(act7);
+    menu.addAction(s->action(SettingsDialog));
 
     QAction *act = menu.exec(ev->globalPos());
 
-    if (!act)
-        ;
-    else if (act == act1)
+    if (act == act1)
         resizeColumnsToContents();
     else if (act == act2)
         setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents);
-    else if (act == act3)
-        if (m_type == LocalsType)
-            emit requestWatchExpression(exp);
-        else
-            emit requestRemoveWatchExpression(exp);
     else if (act == act4)
         model()->setData(mi0, !visual, VisualRole);
-    else 
-        act->trigger();
 }
 
 void WatchWindow::resizeColumnsToContents()
diff --git a/src/plugins/debugger/watchwindow.h b/src/plugins/debugger/watchwindow.h
index db1718f0348d484180bf1fcc28cfb2e9867594c0..71beffb43f047c7e88661d8f9cdb37b073cb5f7f 100644
--- a/src/plugins/debugger/watchwindow.h
+++ b/src/plugins/debugger/watchwindow.h
@@ -58,8 +58,6 @@ public slots:
     void setModel(QAbstractItemModel *model);
 
 signals:
-    void requestWatchExpression(const QString &exp);
-    void requestRemoveWatchExpression(const QString &exp);
     void requestAssignValue(const QString &exp, const QString &value);
     void requestExpandChildren(const QModelIndex &idx);
     void requestCollapseChildren(const QModelIndex &idx);
diff --git a/tests/manual/gdbdebugger/simple/README b/tests/manual/gdbdebugger/simple/README
index 8fc47fe1a75825783c167b2d2fc3a442fc02b334..5c76bc48ce9f332be66af7e1aa6c2a33d83d5d73 100644
--- a/tests/manual/gdbdebugger/simple/README
+++ b/tests/manual/gdbdebugger/simple/README
@@ -5,6 +5,6 @@ Thinks to check:
 - availability of Qt debug information (custom display of QObject derived
 class)
 - availabitily of Qt sources (single step into some Qt *._cpp_ file)
-- setting of breakpoints on dynamically loaded plugins (try plugin.cpp here)
+- setting of breakpoints on dynamically loaded plugins (try plugin.cpp here, especially in constructors)
 - check I/O  (qDebug, std::cout, std::cerr)