diff --git a/src/plugins/mercurial/clonewizard.cpp b/src/plugins/mercurial/clonewizard.cpp
index 8f257ee8de3d9f340f14510d828826bfd6284ae4..6dc14b532e3dfa53f66eba8d58dde33bcbfd3321 100644
--- a/src/plugins/mercurial/clonewizard.cpp
+++ b/src/plugins/mercurial/clonewizard.cpp
@@ -76,15 +76,15 @@ QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QList<
     if (!page)
         return QSharedPointer<VCSBase::AbstractCheckoutJob>();
 
-    MercurialSettings *settings = MercurialPlugin::instance()->settings();
+    const MercurialSettings &settings = MercurialPlugin::instance()->settings();
 
-    QStringList args = settings->standardArguments();
+    QStringList args = settings.standardArguments();
     QString path = page->path();
     QString directory = page->directory();
 
     args << QLatin1String("clone") << page->repository() << directory;
     *checkoutPath = path + QLatin1Char('/') + directory;
 
-    return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings->binary(),
+    return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings.binary(),
                                                                                         args, path));
 }
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index bf7d7b67d965746876fe12c2dbbb86383a15df89..aa54e079259d3ec9934585fd51ed760e8d44469a 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -60,11 +60,10 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
     return 0;
 }
 
-MercurialClient::MercurialClient()
-        : core(Core::ICore::instance())
+MercurialClient::MercurialClient() :
+    jobManager(0),
+    core(Core::ICore::instance())
 {
-    jobManager = new MercurialJobRunner();
-    jobManager->start();
 }
 
 MercurialClient::~MercurialClient()
@@ -118,9 +117,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin
     QProcess hgProcess;
     hgProcess.setWorkingDirectory(file.isDir() ? file.absoluteFilePath() : file.absolutePath());
 
-    const MercurialSettings *settings = MercurialPlugin::instance()->settings();
-    const QString binary = settings->binary();
-    const QStringList arguments = MercurialPlugin::instance()->standardArguments() + args;
+    const MercurialSettings &settings = MercurialPlugin::instance()->settings();
+    const QString binary = settings.binary();
+    const QStringList arguments = settings.standardArguments() + args;
 
     VCSBase::VCSBaseOutputWindow *outputWindow = VCSBase::VCSBaseOutputWindow::instance();
     outputWindow->appendCommand(MercurialJobRunner::msgExecute(binary, arguments));
@@ -134,9 +133,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin
 
     hgProcess.closeWriteChannel();
 
-    if (!hgProcess.waitForFinished(settings->timeout())) {
+    if (!hgProcess.waitForFinished(settings.timeoutMilliSeconds())) {
         hgProcess.terminate();
-        outputWindow->appendError(MercurialJobRunner::msgTimeout(settings->timeout()));
+        outputWindow->appendError(MercurialJobRunner::msgTimeout(settings.timeoutSeconds()));
         return false;
     }
 
@@ -170,7 +169,7 @@ void MercurialClient::annotate(const QFileInfo &file)
                                                      "annotate", file.absoluteFilePath());
 
     QSharedPointer<HgTask> job(new HgTask(file.absolutePath(), args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::diff(const QFileInfo &fileOrDir)
@@ -198,7 +197,7 @@ void MercurialClient::diff(const QFileInfo &fileOrDir)
                                                      "diff", id);
 
     QSharedPointer<HgTask> job(new HgTask(workingPath, args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::log(const QFileInfo &fileOrDir)
@@ -223,7 +222,7 @@ void MercurialClient::log(const QFileInfo &fileOrDir)
                                                      "log", id);
 
     QSharedPointer<HgTask> job(new HgTask(workingDir, args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision)
@@ -239,7 +238,7 @@ void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision
 
     QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
                                           fileOrDir.absolutePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::status(const QFileInfo &fileOrDir)
@@ -250,7 +249,7 @@ void MercurialClient::status(const QFileInfo &fileOrDir)
 
     QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
                                           fileOrDir.absolutePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot)
@@ -261,7 +260,7 @@ void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot)
     connect(job.data(), SIGNAL(rawData(QByteArray)),
             this, SLOT(statusParser(QByteArray)));
 
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::statusParser(const QByteArray &data)
@@ -302,7 +301,7 @@ void MercurialClient::import(const QFileInfo &repositoryRoot, const QStringList
     args += files;
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repository)
@@ -312,7 +311,7 @@ void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repos
         args.append(repository);
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repository)
@@ -322,7 +321,7 @@ void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repos
         args.append(repository);
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &repository)
@@ -341,7 +340,7 @@ void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &r
                                                      true, "incoming", id);
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::outgoing(const QFileInfo &repositoryRoot)
@@ -358,7 +357,7 @@ void MercurialClient::outgoing(const QFileInfo &repositoryRoot)
                                                      "outgoing", id);
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::view(const QString &source, const QString &id)
@@ -374,7 +373,7 @@ void MercurialClient::view(const QString &source, const QString &id)
                                                      true, "view", id);
 
     QSharedPointer<HgTask> job(new HgTask(source, args, editor));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &revision)
@@ -384,7 +383,7 @@ void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &rev
         args << revision;
 
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList &files,
@@ -395,7 +394,7 @@ void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList
         args << QLatin1String("-u") << committerInfo;
     args << QLatin1String("-l") << commitMessageFile << files;
     QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
-    jobManager->enqueueJob(job);
+    enqueueJob(job);
 }
 
 QString MercurialClient::findTopLevelForFile(const QFileInfo &file)
@@ -443,3 +442,12 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS
     core->editorManager()->activateEditor(outputEditor);
     return baseEditor;
 }
+
+void MercurialClient::enqueueJob(const QSharedPointer<HgTask> &job)
+{
+    if (!jobManager) {
+        jobManager = new MercurialJobRunner();
+        jobManager->start();
+    }
+    jobManager->enqueueJob(job);
+}
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index a6894e5ba1bd769b2d5ea869a4b95abd3ecd7a8c..bd0c9f8771e0d5db0cfa10e313bb282b681e84ba 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -32,6 +32,7 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QPair>
+#include <QtCore/QSharedPointer>
 
 QT_BEGIN_NAMESPACE
 class QFileInfo;
@@ -49,6 +50,7 @@ namespace Mercurial {
 namespace Internal {
 
 class MercurialJobRunner;
+class HgTask;
 
 class MercurialClient : public QObject
 {
@@ -90,6 +92,7 @@ private slots:
 private:
     bool executeHgSynchronously(const QFileInfo &file, const QStringList &args,
                                 QByteArray *output=0) const;
+    void enqueueJob(const QSharedPointer<HgTask> &);
 
     MercurialJobRunner *jobManager;
     Core::ICore *core;
diff --git a/src/plugins/mercurial/mercurialjobrunner.cpp b/src/plugins/mercurial/mercurialjobrunner.cpp
index eda9f806d7915cfe22900751fd784f58eca8a81b..3b27594f339b9a21be2c60bf89ee1b7fcf8b2d00 100644
--- a/src/plugins/mercurial/mercurialjobrunner.cpp
+++ b/src/plugins/mercurial/mercurialjobrunner.cpp
@@ -97,10 +97,10 @@ void MercurialJobRunner::restart()
 
 void MercurialJobRunner::getSettings()
 {
-    const MercurialSettings *settings = MercurialPlugin::instance()->settings();
-    binary = settings->binary();
-    timeout = settings->timeout();
-    standardArguments = settings->standardArguments();
+    const MercurialSettings &settings = MercurialPlugin::instance()->settings();
+    binary = settings.binary();
+    timeout = settings.timeoutMilliSeconds();
+    standardArguments = settings.standardArguments();
 }
 
 void MercurialJobRunner::enqueueJob(const QSharedPointer<HgTask> &job)
@@ -142,9 +142,9 @@ QString MercurialJobRunner::msgStartFailed(const QString &binary, const QString
     return tr("Unable to start mercurial process '%1': %2").arg(binary, why);
 }
 
-QString MercurialJobRunner::msgTimeout(int timeoutMS)
+QString MercurialJobRunner::msgTimeout(int timeoutSeconds)
 {
-    return tr("Timed out after %1ms waiting for mercurial process to finish.").arg(timeoutMS);
+    return tr("Timed out after %1s waiting for mercurial process to finish.").arg(timeoutSeconds);
 }
 
 void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
@@ -192,7 +192,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
 
     if (!hgProcess.waitForFinished(timeout)) {
         hgProcess.terminate();
-        emit error(msgTimeout(timeout));
+        emit error(msgTimeout(timeout / 1000));
         return;
     }
 
diff --git a/src/plugins/mercurial/mercurialjobrunner.h b/src/plugins/mercurial/mercurialjobrunner.h
index 8f477abd88305441ca703a8059e8302ba97c9a00..bac9c650d57a92c1db523cc62d0d141e66b21dea 100644
--- a/src/plugins/mercurial/mercurialjobrunner.h
+++ b/src/plugins/mercurial/mercurialjobrunner.h
@@ -83,7 +83,7 @@ public:
 
     static QString msgExecute(const QString &binary, const QStringList &args);
     static QString msgStartFailed(const QString &binary, const QString &why);
-    static QString msgTimeout(int timeoutMS);
+    static QString msgTimeout(int timeoutSeconds);
 
 protected:
     void run();
diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp
index c3a020a95d9a7753b206ed300314c1b939562cf8..97f8df943765d6c6302615c0303476fe64dfea5b 100644
--- a/src/plugins/mercurial/mercurialplugin.cpp
+++ b/src/plugins/mercurial/mercurialplugin.cpp
@@ -121,8 +121,7 @@ static inline const VCSBase::VCSBaseEditorParameters *findType(int ie)
 
 MercurialPlugin *MercurialPlugin::m_instance = 0;
 
-MercurialPlugin::MercurialPlugin()
-        :   mercurialSettings(new MercurialSettings),
+MercurialPlugin::MercurialPlugin() :
         optionsPage(0),
         client(0),
         mercurialVC(0),
@@ -139,11 +138,6 @@ MercurialPlugin::~MercurialPlugin()
         client = 0;
     }
 
-    if (mercurialSettings) {
-        delete mercurialSettings;
-        mercurialSettings = 0;
-    }
-
     deleteCommitLog();
 
     m_instance = 0;
@@ -161,6 +155,7 @@ bool MercurialPlugin::initialize(const QStringList &arguments, QString *error_me
 
     optionsPage = new OptionsPage();
     addAutoReleasedObject(optionsPage);
+    mercurialSettings.readSettings(core->settings());
 
     client = new MercurialClient();
     connect(optionsPage, SIGNAL(settingsChanged()), client, SLOT(settingsChanged()));
@@ -194,14 +189,21 @@ void MercurialPlugin::extensionsInitialized()
                 this, SLOT(currentProjectChanged(ProjectExplorer::Project *)));
 }
 
-MercurialSettings *MercurialPlugin::settings()
+const MercurialSettings &MercurialPlugin::settings() const
 {
     return mercurialSettings;
 }
 
+void MercurialPlugin::setSettings(const MercurialSettings &settings)
+{
+    if (settings != mercurialSettings) {
+        mercurialSettings = settings;
+    }
+}
+
 QStringList MercurialPlugin::standardArguments() const
 {
-    return mercurialSettings->standardArguments();
+    return mercurialSettings.standardArguments();
 }
 
 void MercurialPlugin::createMenu()
@@ -530,8 +532,8 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st
 
     QString branch = client->branchQuerySync(currentProjectRoot());
 
-    commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings->userName(),
-                            mercurialSettings->email(), status);
+    commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings.userName(),
+                            mercurialSettings.email(), status);
 
     commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff);
     connect(commitEditor, SIGNAL(diffSelectedFiles(const QStringList &)),
@@ -564,11 +566,11 @@ bool MercurialPlugin::closeEditor(Core::IEditor *editor)
     if (!editorFile || !commitEditor)
         return true;
 
-    bool dummyPrompt = settings()->prompt();
+    bool dummyPrompt = mercurialSettings.prompt();
     const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult response =
             commitEditor->promptSubmit(tr("Close commit editor"), tr("Do you want to commit the changes?"),
                                        tr("Message check failed. Do you want to proceed?"),
-                                       &dummyPrompt, settings()->prompt());
+                                       &dummyPrompt, mercurialSettings.prompt());
 
     switch (response) {
     case VCSBase::VCSBaseSubmitEditor::SubmitCanceled:
diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h
index 3cd397c6bcc1940b976a2f24042d697557406807..84654eb1f9c0a6e0c16b5d7743ab90dbd3305179 100644
--- a/src/plugins/mercurial/mercurialplugin.h
+++ b/src/plugins/mercurial/mercurialplugin.h
@@ -30,6 +30,8 @@
 #ifndef MERCURIALPLUGIN_H
 #define MERCURIALPLUGIN_H
 
+#include "mercurialsettings.h"
+
 #include <extensionsystem/iplugin.h>
 #include <coreplugin/icorelistener.h>
 
@@ -85,7 +87,8 @@ public:
     bool closeEditor(Core::IEditor *editor);
     QStringList standardArguments() const;
 
-    MercurialSettings *settings();
+    const MercurialSettings &settings() const;
+    void setSettings(const MercurialSettings &settings);
 
 private slots:
     // File menu action Slots
@@ -146,7 +149,7 @@ private:
 
     //Variables
     static MercurialPlugin *m_instance;
-    MercurialSettings *mercurialSettings;
+    MercurialSettings mercurialSettings;
     OptionsPage *optionsPage;
     MercurialClient *client;
 
diff --git a/src/plugins/mercurial/mercurialsettings.cpp b/src/plugins/mercurial/mercurialsettings.cpp
index 55a3ae31fa3f76cd4a7ec7c769d337e3d4cbf354..1105b308f40a9f21fa54564f133e5a96c74e2744 100644
--- a/src/plugins/mercurial/mercurialsettings.cpp
+++ b/src/plugins/mercurial/mercurialsettings.cpp
@@ -30,40 +30,53 @@
 #include "mercurialsettings.h"
 #include "constants.h"
 
-#include <coreplugin/icore.h>
 #include <QtCore/QSettings>
 
-
 using namespace Mercurial::Internal;
 
-MercurialSettings::MercurialSettings()
+enum { timeOutDefaultSeconds = 30 };
+
+MercurialSettings::MercurialSettings() :
+   m_binary(QLatin1String(Constants::MERCURIALDEFAULT)),
+   m_logCount(0),
+   m_timeoutSeconds(timeOutDefaultSeconds),
+   m_prompt(true)
 {
-    readSettings();
 }
 
 QString MercurialSettings::binary() const
 {
-    return bin;
+    return m_binary;
 }
 
-QString MercurialSettings::application() const
+void MercurialSettings::setBinary(const QString &b)
 {
-    return app;
+    m_binary = b;
 }
 
 QStringList MercurialSettings::standardArguments() const
 {
-    return standardArgs;
+    return m_standardArguments;
 }
 
 QString MercurialSettings::userName() const
 {
-    return user;
+    return m_user;
+}
+
+void MercurialSettings::setUserName(const QString &u)
+{
+    m_user = u;
 }
 
 QString MercurialSettings::email() const
 {
-    return mail;
+    return m_mail;
+}
+
+void MercurialSettings::setEmail(const QString &m)
+{
+    m_mail = m;
 }
 
 int MercurialSettings::logCount() const
@@ -71,16 +84,26 @@ int MercurialSettings::logCount() const
     return m_logCount;
 }
 
-int MercurialSettings::timeout() const
+void MercurialSettings::setLogCount(int l)
+{
+    m_logCount = l;
+}
+
+int MercurialSettings::timeoutMilliSeconds() const
 {
     //return timeout is in Ms
-    return m_timeout * 1000;
+    return m_timeoutSeconds * 1000;
 }
 
 int MercurialSettings::timeoutSeconds() const
 {
     //return timeout in seconds (as the user specifies on the options page
-    return m_timeout;
+    return m_timeoutSeconds;
+}
+
+void MercurialSettings::setTimeoutSeconds(int s)
+{
+    m_timeoutSeconds = s;
 }
 
 bool MercurialSettings::prompt() const
@@ -88,50 +111,39 @@ bool MercurialSettings::prompt() const
     return m_prompt;
 }
 
-void MercurialSettings::writeSettings(const QString &application, const QString &userName,
-                                      const QString &email, int logCount, int timeout, bool prompt)
-{
-    QSettings *settings = Core::ICore::instance()->settings();
-    if (settings) {
-        settings->beginGroup(QLatin1String("Mercurial"));
-        settings->setValue(QLatin1String(Constants::MERCURIALPATH), application);
-        settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), userName);
-        settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), email);
-        settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), logCount);
-        settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), timeout);
-        settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), prompt);
-        settings->endGroup();
-    }
-
-    app = application;
-    user = userName;
-    mail = email;
-    m_logCount = logCount;
-    m_timeout = timeout;
-    m_prompt = prompt;
-    setBinAndArgs();
-}
-
-void MercurialSettings::readSettings()
-{
-    QSettings *settings = Core::ICore::instance()->settings();
-    if (settings) {
-        settings->beginGroup(QLatin1String("Mercurial"));
-        app = settings->value(QLatin1String(Constants::MERCURIALPATH),
-                              QLatin1String(Constants::MERCURIALDEFAULT)).toString();
-        user = settings->value(QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString();
-        mail = settings->value(QLatin1String(Constants::MERCURIALEMAIL), QString()).toString();
-        m_logCount = settings->value(QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt();
-        m_timeout = settings->value(QLatin1String(Constants::MERCURIALTIMEOUT), 30).toInt();
-        m_prompt = settings->value(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool();
-        settings->endGroup();
-    }
-
-    setBinAndArgs();
-}
-
-void MercurialSettings::setBinAndArgs()
-{
-    standardArgs.clear();
-    bin = app;
+void MercurialSettings::setPrompt(bool b)
+{
+    m_prompt = b;
+}
+
+void MercurialSettings::writeSettings(QSettings *settings) const
+{
+    settings->beginGroup(QLatin1String("Mercurial"));
+    settings->setValue(QLatin1String(Constants::MERCURIALPATH), m_binary);
+    settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), m_user);
+    settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), m_mail);
+    settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), m_logCount);
+    settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), m_timeoutSeconds);
+    settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), m_prompt);
+    settings->endGroup();
+}
+
+void MercurialSettings::readSettings(const QSettings *settings)
+{
+    const QString keyRoot = QLatin1String("Mercurial/");
+    m_binary = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPATH),
+                               QLatin1String(Constants::MERCURIALDEFAULT)).toString();
+    m_user = settings->value(keyRoot + QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString();
+    m_mail = settings->value(keyRoot + QLatin1String(Constants::MERCURIALEMAIL), QString()).toString();
+    m_logCount = settings->value(keyRoot + QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt();
+    m_timeoutSeconds = settings->value(keyRoot + QLatin1String(Constants::MERCURIALTIMEOUT), timeOutDefaultSeconds).toInt();
+    m_prompt = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool();
+}
+
+bool MercurialSettings::equals(const MercurialSettings &rhs) const
+{
+ return m_binary == rhs.m_binary && m_standardArguments == rhs.m_standardArguments
+         && m_user == rhs.m_user && m_mail == rhs.m_mail
+         && m_logCount == rhs.m_logCount && m_timeoutSeconds == rhs.m_timeoutSeconds
+         && m_prompt == rhs.m_prompt;
 }
diff --git a/src/plugins/mercurial/mercurialsettings.h b/src/plugins/mercurial/mercurialsettings.h
index e4a91628a190a0582b0b712848cc27e4e36b02d8..57304fa78111a547ae7c1e0633ac753a6fa2386d 100644
--- a/src/plugins/mercurial/mercurialsettings.h
+++ b/src/plugins/mercurial/mercurialsettings.h
@@ -33,6 +33,10 @@
 #include <QtCore/QString>
 #include <QtCore/QStringList>
 
+QT_BEGIN_NAMESPACE
+class QSettings;
+QT_END_NAMESPACE
+
 namespace Mercurial {
 namespace Internal {
 
@@ -42,32 +46,50 @@ public:
     MercurialSettings();
 
     QString binary() const;
-    QString application() const;
+    void setBinary(const QString &);
+
+    // Calculated.
     QStringList standardArguments() const;
+
     QString userName() const;
+    void setUserName(const QString &);
+
     QString email() const;
+    void setEmail(const QString &);
+
     int logCount() const;
-    int timeout() const;
+    void setLogCount(int l);
+
+    int timeoutMilliSeconds() const;
     int timeoutSeconds() const;
+    void setTimeoutSeconds(int s);
+
     bool prompt() const;
-    void writeSettings(const QString &application, const QString &userName,
-                       const QString &email, int logCount, int timeout, bool prompt);
+    void setPrompt(bool b);
+
+    void writeSettings(QSettings *settings) const;
+    void readSettings(const QSettings *settings);
+
+    bool equals(const MercurialSettings &rhs) const;
+
 private:
 
     void readSettings();
-    void setBinAndArgs();
-
-    QString bin; // used because windows requires cmd.exe to run the mercurial binary
-                 // in this case the actual mercurial binary will be part of the standard args
-    QString app; // this is teh actual mercurial executable
-    QStringList standardArgs;
-    QString user;
-    QString mail;
+
+    QString m_binary;
+    QStringList m_standardArguments;
+    QString m_user;
+    QString m_mail;
     int m_logCount;
-    int m_timeout;
+    int m_timeoutSeconds;
     bool m_prompt;
 };
 
+inline bool operator==(const MercurialSettings &s1, const MercurialSettings &s2)
+{ return s1.equals(s2); }
+inline bool operator!=(const MercurialSettings &s1, const MercurialSettings &s2)
+{ return !s1.equals(s2); }
+
 } //namespace Internal
 } //namespace Mercurial
 
diff --git a/src/plugins/mercurial/optionspage.cpp b/src/plugins/mercurial/optionspage.cpp
index f3f1d55b6ba5e089a78401fa3ff390f7b43cce21..538dd77275c58f80ca66460ed3b639172b18c7bd 100644
--- a/src/plugins/mercurial/optionspage.cpp
+++ b/src/plugins/mercurial/optionspage.cpp
@@ -31,6 +31,7 @@
 #include "mercurialsettings.h"
 #include "mercurialplugin.h"
 
+#include <coreplugin/icore.h>
 #include <utils/pathchooser.h>
 #include <vcsbase/vcsbaseconstants.h>
 
@@ -45,24 +46,26 @@ OptionsPageWidget::OptionsPageWidget(QWidget *parent) :
     m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command"));
 }
 
-void OptionsPageWidget::updateOptions()
+MercurialSettings OptionsPageWidget::settings() const
 {
-    MercurialSettings *settings = MercurialPlugin::instance()->settings();
-    m_ui.commandChooser->setPath(settings->application());
-    m_ui.defaultUsernameLineEdit->setText(settings->userName());
-    m_ui.defaultEmailLineEdit->setText(settings->email());
-    m_ui.logEntriesCount->setValue(settings->logCount());
-    m_ui.timeout->setValue(settings->timeoutSeconds());
-    m_ui.promptOnSubmitCheckBox->setChecked(settings->prompt());
+    MercurialSettings rc;
+    rc.setBinary(m_ui.commandChooser->path());
+    rc.setUserName(m_ui.defaultUsernameLineEdit->text().trimmed());
+    rc.setEmail(m_ui.defaultEmailLineEdit->text().trimmed());
+    rc.setLogCount(m_ui.logEntriesCount->value());
+    rc.setTimeoutSeconds(m_ui.timeout->value());
+    rc.setPrompt(m_ui.promptOnSubmitCheckBox->isChecked());
+    return rc;
 }
 
-void OptionsPageWidget::saveOptions()
+void OptionsPageWidget::setSettings(const MercurialSettings &s)
 {
-    MercurialSettings *settings = MercurialPlugin::instance()->settings();
-
-    settings->writeSettings(m_ui.commandChooser->path(), m_ui.defaultUsernameLineEdit->text(),
-                            m_ui.defaultEmailLineEdit->text(), m_ui.logEntriesCount->value(),
-                            m_ui.timeout->value(), m_ui.promptOnSubmitCheckBox->isChecked());
+    m_ui.commandChooser->setPath(s.binary());
+    m_ui.defaultUsernameLineEdit->setText(s.userName());
+    m_ui.defaultEmailLineEdit->setText(s.email());
+    m_ui.logEntriesCount->setValue(s.logCount());
+    m_ui.timeout->setValue(s.timeoutSeconds());
+    m_ui.promptOnSubmitCheckBox->setChecked(s.prompt());
 }
 
 OptionsPage::OptionsPage()
@@ -93,7 +96,7 @@ QWidget *OptionsPage::createPage(QWidget *parent)
 {
     if (!optionsPageWidget)
         optionsPageWidget = new OptionsPageWidget(parent);
-    optionsPageWidget.data()->updateOptions();
+    optionsPageWidget->setSettings(MercurialPlugin::instance()->settings());
     return optionsPageWidget;
 }
 
@@ -101,8 +104,13 @@ void OptionsPage::apply()
 {
     if (!optionsPageWidget)
         return;
-    optionsPageWidget.data()->saveOptions();
-    //assume success and emit signal that settings are changed;
-    emit settingsChanged();
+    MercurialPlugin *plugin = MercurialPlugin::instance();
+    const MercurialSettings newSettings = optionsPageWidget->settings();
+    if (newSettings != plugin->settings()) {
+        //assume success and emit signal that settings are changed;
+        plugin->setSettings(newSettings);
+        newSettings.writeSettings(Core::ICore::instance()->settings());
+        emit settingsChanged();
+    }
 }
 
diff --git a/src/plugins/mercurial/optionspage.h b/src/plugins/mercurial/optionspage.h
index 1e68c31b95444a35590b2e30b0437094d278a06a..362a435a07a7d5b398baaa4e18520f97b5c8f000 100644
--- a/src/plugins/mercurial/optionspage.h
+++ b/src/plugins/mercurial/optionspage.h
@@ -40,13 +40,16 @@
 namespace Mercurial {
 namespace Internal {
 
+class MercurialSettings;
+
 class OptionsPageWidget : public QWidget
 {
     Q_OBJECT
 public:
     explicit OptionsPageWidget(QWidget *parent = 0);
-    void updateOptions();
-    void saveOptions();
+
+    MercurialSettings settings() const;
+    void setSettings(const MercurialSettings &s);
 
 private:
     Ui::OptionsPage m_ui;