diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
index bee93ae5001b98f5cd118db588c9de31d85b9825..94880ecf3d9c96adac061fa4d9de6d45389c1914 100644
--- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
@@ -40,6 +40,7 @@
 #include <QtGui/QGroupBox>
 #include <QtGui/QLabel>
 #include <QtGui/QRadioButton>
+#include <QtGui/QToolButton>
 
 using namespace CMakeProjectManager;
 using namespace CMakeProjectManager::Internal;
@@ -82,6 +83,8 @@ ProjectExplorer::ApplicationRunConfiguration::RunMode CMakeRunConfiguration::run
 
 QString CMakeRunConfiguration::workingDirectory() const
 {
+    if (!m_userWorkingDirectory.isEmpty())
+        return m_userWorkingDirectory;
     return m_workingDirectory;
 }
 
@@ -100,9 +103,26 @@ void CMakeRunConfiguration::setExecutable(const QString &executable)
     m_target = executable;
 }
 
-void CMakeRunConfiguration::setWorkingDirectory(const QString &workingDirectory)
+void CMakeRunConfiguration::setWorkingDirectory(const QString &wd)
 {
-    m_workingDirectory = workingDirectory;
+    const QString & oldWorkingDirectory = workingDirectory();
+
+    m_workingDirectory = wd;
+
+    const QString &newWorkingDirectory = workingDirectory();
+    if (oldWorkingDirectory != newWorkingDirectory)
+        emit workingDirectoryChanged(newWorkingDirectory);
+}
+
+void CMakeRunConfiguration::setUserWorkingDirectory(const QString &wd)
+{
+    const QString & oldWorkingDirectory = workingDirectory();
+
+    m_userWorkingDirectory = wd;
+
+    const QString &newWorkingDirectory = workingDirectory();
+    if (oldWorkingDirectory != newWorkingDirectory)
+        emit workingDirectoryChanged(newWorkingDirectory);
 }
 
 void CMakeRunConfiguration::save(ProjectExplorer::PersistentSettingsWriter &writer) const
@@ -110,11 +130,13 @@ void CMakeRunConfiguration::save(ProjectExplorer::PersistentSettingsWriter &writ
     ProjectExplorer::ApplicationRunConfiguration::save(writer);
     writer.saveValue("CMakeRunConfiguration.Target", m_target);
     writer.saveValue("CMakeRunConfiguration.WorkingDirectory", m_workingDirectory);
+    writer.saveValue("CMakeRunConfiguration.UserWorkingDirectory", m_userWorkingDirectory);
     writer.saveValue("CMakeRunConfiguration.UseTerminal", m_runMode == Console);
     writer.saveValue("CMakeRunConfiguation.Title", m_title);
     writer.saveValue("CMakeRunConfiguration.Arguments", m_arguments);
     writer.saveValue("CMakeRunConfiguration.UserEnvironmentChanges", ProjectExplorer::EnvironmentItem::toStringList(m_userEnvironmentChanges));
     writer.saveValue("BaseEnvironmentBase", m_baseEnvironmentBase);
+
 }
 
 void CMakeRunConfiguration::restore(const ProjectExplorer::PersistentSettingsReader &reader)
@@ -122,6 +144,7 @@ void CMakeRunConfiguration::restore(const ProjectExplorer::PersistentSettingsRea
     ProjectExplorer::ApplicationRunConfiguration::restore(reader);
     m_target = reader.restoreValue("CMakeRunConfiguration.Target").toString();
     m_workingDirectory = reader.restoreValue("CMakeRunConfiguration.WorkingDirectory").toString();
+    m_userWorkingDirectory = reader.restoreValue("CMakeRunConfiguration.UserWorkingDirectory").toString();
     m_runMode = reader.restoreValue("CMakeRunConfiguration.UseTerminal").toBool() ? Console : Gui;
     m_title = reader.restoreValue("CMakeRunConfiguation.Title").toString();
     m_arguments = reader.restoreValue("CMakeRunConfiguration.Arguments").toString();
@@ -208,6 +231,21 @@ CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *
             this, SLOT(setArguments(QString)));
     fl->addRow(tr("Arguments:"), argumentsLineEdit);
 
+    m_workingDirectoryEdit = new Core::Utils::PathChooser();
+    m_workingDirectoryEdit->setPath(m_cmakeRunConfiguration->workingDirectory());
+    m_workingDirectoryEdit->setExpectedKind(Core::Utils::PathChooser::Directory);
+    m_workingDirectoryEdit->setPromptDialogTitle(tr("Select the working directory"));
+
+    QToolButton *resetButton = new QToolButton();
+    resetButton->setToolTip(tr("Reset to default"));
+    resetButton->setIcon(QIcon(":/core/images/reset.png"));
+
+    QHBoxLayout *boxlayout = new QHBoxLayout();
+    boxlayout->addWidget(m_workingDirectoryEdit);
+    boxlayout->addWidget(resetButton);
+
+    fl->addRow(tr("Working Directory:"), boxlayout);
+
     QGroupBox *box = new QGroupBox(tr("Environment"),this);
     QVBoxLayout *boxLayout = new QVBoxLayout();
     box->setLayout(boxLayout);
@@ -223,6 +261,13 @@ CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *
     boxLayout->addWidget(m_systemEnvironmentRadioButton);
     boxLayout->addWidget(m_buildEnvironmentRadioButton);
 
+    connect(m_workingDirectoryEdit, SIGNAL(changed()),
+            this, SLOT(setWorkingDirectory()));
+
+    connect(resetButton, SIGNAL(clicked()),
+            this, SLOT(resetWorkingDirectory()));
+
+
     if (cmakeRunConfiguration->baseEnvironmentBase() == CMakeRunConfiguration::CleanEnvironmentBase)
         m_cleanEnvironmentRadioButton->setChecked(true);
     else if (cmakeRunConfiguration->baseEnvironmentBase() == CMakeRunConfiguration::SystemEnvironmentBase)
@@ -250,10 +295,35 @@ CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *
     connect(m_environmentWidget, SIGNAL(userChangesUpdated()),
             this, SLOT(userChangesUpdated()));
 
+    connect(m_cmakeRunConfiguration, SIGNAL(workingDirectoryChanged(QString)),
+            this, SLOT(workingDirectoryChanged(QString)));
     connect(m_cmakeRunConfiguration, SIGNAL(baseEnvironmentChanged()),
             this, SLOT(baseEnvironmentChanged()));
     connect(m_cmakeRunConfiguration, SIGNAL(userEnvironmentChangesChanged(QList<ProjectExplorer::EnvironmentItem>)),
             this, SLOT(userEnvironmentChangesChanged()));
+
+}
+
+void CMakeRunConfigurationWidget::setWorkingDirectory()
+{
+    if (m_ignoreChange)
+        return;
+    m_ignoreChange = true;
+    m_cmakeRunConfiguration->setUserWorkingDirectory(m_workingDirectoryEdit->path());
+    m_ignoreChange = false;
+}
+
+void CMakeRunConfigurationWidget::workingDirectoryChanged(const QString &workingDirectory)
+{
+    if (!m_ignoreChange)
+        m_workingDirectoryEdit->setPath(workingDirectory);
+}
+
+void CMakeRunConfigurationWidget::resetWorkingDirectory()
+{
+    // This emits a signal connected to workingDirectoryChanged()
+    // that sets the m_workingDirectoryEdit
+    m_cmakeRunConfiguration->setUserWorkingDirectory("");
 }
 
 void CMakeRunConfigurationWidget::userChangesUpdated()
diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h
index 7e45f588cb5f7e940b67f30a1dd32f31733a7a22..89d9ba6eee4ef90f3c13b77af2ceca0114fe347d 100644
--- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h
+++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h
@@ -34,6 +34,7 @@
 #include <projectexplorer/environment.h>
 #include <projectexplorer/persistentsettings.h>
 #include <projectexplorer/environmenteditmodel.h>
+#include <utils/pathchooser.h>
 
 QT_BEGIN_NAMESPACE
 class QRadioButton;
@@ -62,6 +63,8 @@ public:
     void setExecutable(const QString &executable);
     void setWorkingDirectory(const QString &workingDirectory);
 
+    void setUserWorkingDirectory(const QString &workingDirectory);
+
     QString title() const;
 
     virtual void save(ProjectExplorer::PersistentSettingsWriter &writer) const;
@@ -71,6 +74,7 @@ public:
 signals:
     void baseEnvironmentChanged();
     void userEnvironmentChangesChanged(const QList<ProjectExplorer::EnvironmentItem> &diff);
+    void workingDirectoryChanged(const QString&);
 
 private slots:
     void setArguments(const QString &newText);
@@ -85,6 +89,7 @@ private:
     RunMode m_runMode;
     QString m_target;
     QString m_workingDirectory;
+    QString m_userWorkingDirectory;
     QString m_title;
     QString m_arguments;
     QList<ProjectExplorer::EnvironmentItem> m_userEnvironmentChanges;
@@ -101,11 +106,15 @@ private slots:
     void baseEnvironmentChanged();
     void userEnvironmentChangesChanged();
     void userChangesUpdated();
+    void setWorkingDirectory();
+    void resetWorkingDirectory();
 private slots:
     void baseEnvironmentRadioButtonChanged();
+    void workingDirectoryChanged(const QString &workingDirectory);
 private:
     bool m_ignoreChange;
     CMakeRunConfiguration *m_cmakeRunConfiguration;
+    Core::Utils::PathChooser *m_workingDirectoryEdit;
     ProjectExplorer::EnvironmentWidget *m_environmentWidget;
     QRadioButton *m_cleanEnvironmentRadioButton;
     QRadioButton *m_systemEnvironmentRadioButton;