diff --git a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
index 7e231d91315e43dfc7eb11561338d28a09e03dcc..c6a302a6f61cf2828af4139c2820de33d8e83e1f 100644
--- a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
+++ b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp
@@ -482,7 +482,7 @@ void JSDebuggerAgentPrivate::messageReceived(const QByteArray &message)
 
         fileNameToBreakpoints.clear();
         foreach (const JSAgentBreakpointData &bp, breakpoints) {
-            fileNameToBreakpoints.insert(fileName(bp.fileUrl), bp);
+            fileNameToBreakpoints.insertMulti(fileName(bp.fileUrl), bp);
         }
 
         //qDebug() << "BREAKPOINTS";
diff --git a/src/libs/utils/pathchooser.cpp b/src/libs/utils/pathchooser.cpp
index 91165f32a9336d717d1c59d30686fba690c194e7..9b28e2c36a050b6fb07a81ac275766b911083a16 100644
--- a/src/libs/utils/pathchooser.cpp
+++ b/src/libs/utils/pathchooser.cpp
@@ -406,11 +406,6 @@ bool PathChooser::validatePath(const QString &path, QString *errorMessage)
 {
     QString expandedPath = m_d->expandedPath(path);
 
-    QString displayPath = expandedPath;
-    if (expandedPath.isEmpty())
-        //: Selected path is not valid:
-        displayPath = tr("<not valid>");
-
     if (expandedPath.isEmpty()) {
         if (errorMessage)
             *errorMessage = tr("The path must not be empty.");
@@ -495,7 +490,10 @@ QString PathChooser::homePath()
 
 void PathChooser::setExpectedKind(Kind expected)
 {
+    if (m_d->m_acceptingKind == expected)
+        return;
     m_d->m_acceptingKind = expected;
+    m_d->m_lineEdit->triggerChanged();
 }
 
 PathChooser::Kind PathChooser::expectedKind() const
diff --git a/src/libs/valgrind/memcheck/memcheckrunner.cpp b/src/libs/valgrind/memcheck/memcheckrunner.cpp
index 00fefe9413696c6906d0c9540d782008304d234a..a4829d60c3d557b7ac543ae873d95462b1128c8f 100644
--- a/src/libs/valgrind/memcheck/memcheckrunner.cpp
+++ b/src/libs/valgrind/memcheck/memcheckrunner.cpp
@@ -41,10 +41,10 @@
 
 #include <utils/qtcassert.h>
 
-#include <QTcpServer>
-#include <QTcpSocket>
-#include <QEventLoop>
-#include <QNetworkInterface>
+#include <QtNetwork/QTcpServer>
+#include <QtNetwork/QTcpSocket>
+#include <QtNetwork/QNetworkInterface>
+#include <QtCore/QEventLoop>
 
 using namespace Valgrind::Memcheck;
 
diff --git a/src/libs/valgrind/valgrindprocess.cpp b/src/libs/valgrind/valgrindprocess.cpp
index 1731c80d303ab181705abbcef263166eb970b9ec..cf7775d85365725b4ef604f50d535d5e74b22d11 100644
--- a/src/libs/valgrind/valgrindprocess.cpp
+++ b/src/libs/valgrind/valgrindprocess.cpp
@@ -35,9 +35,9 @@
 
 #include "valgrindprocess.h"
 
-#include <QDebug>
-#include <QEventLoop>
-#include <QFileInfo>
+#include <QtCore/QDebug>
+#include <QtCore/QEventLoop>
+#include <QtCore/QFileInfo>
 
 namespace Valgrind {
 namespace Internal {
diff --git a/src/libs/valgrind/valgrindrunner.cpp b/src/libs/valgrind/valgrindrunner.cpp
index 009cd2654eae691662d24b6bdee5e35351a06477..becf82a917a96fa414313dcd32262c6c73653c92 100644
--- a/src/libs/valgrind/valgrindrunner.cpp
+++ b/src/libs/valgrind/valgrindrunner.cpp
@@ -40,7 +40,7 @@
 
 #include <utils/environment.h>
 
-#include <QEventLoop>
+#include <QtCore/QEventLoop>
 
 using namespace Valgrind;
 
@@ -250,4 +250,4 @@ void ValgrindRunner::stop()
 {
     if (d->process)
         d->process->close();
-}
\ No newline at end of file
+}
diff --git a/src/libs/valgrind/valgrindrunner.h b/src/libs/valgrind/valgrindrunner.h
index 67a69f93c082c0dee04bf64210969beb11a98219..05c9b5c4e058721139b1e8b80e524b62d419b741 100644
--- a/src/libs/valgrind/valgrindrunner.h
+++ b/src/libs/valgrind/valgrindrunner.h
@@ -36,7 +36,7 @@
 #ifndef VALGRIND_RUNNER_H
 #define VALGRIND_RUNNER_H
 
-#include <QProcess>
+#include <QtCore/QProcess>
 
 #include "valgrind_global.h"
 
diff --git a/src/libs/valgrind/xmlprotocol/announcethread.cpp b/src/libs/valgrind/xmlprotocol/announcethread.cpp
index 2b96f348b7d5b45c8ac7524ed84c17f54139b7bb..38fbbb9dcc9c721f7609bef80a1dec35a835337b 100644
--- a/src/libs/valgrind/xmlprotocol/announcethread.cpp
+++ b/src/libs/valgrind/xmlprotocol/announcethread.cpp
@@ -36,8 +36,8 @@
 #include "announcethread.h"
 #include "frame.h"
 
-#include <QSharedData>
-#include <QVector>
+#include <QtCore/QSharedData>
+#include <QtCore/QVector>
 
 #include <algorithm>
 
diff --git a/src/libs/valgrind/xmlprotocol/announcethread.h b/src/libs/valgrind/xmlprotocol/announcethread.h
index 8c170efc45542f45c3a68a1ebc445ec0846c2823..2b0f910e96f45cd766359df5291eacd2cb4738f2 100644
--- a/src/libs/valgrind/xmlprotocol/announcethread.h
+++ b/src/libs/valgrind/xmlprotocol/announcethread.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QSharedDataPointer>
+#include <QtCore/QSharedDataPointer>
 
 QT_BEGIN_NAMESPACE
 template <typename T> class QVector;
diff --git a/src/libs/valgrind/xmlprotocol/error.cpp b/src/libs/valgrind/xmlprotocol/error.cpp
index c05869c9325a6a8f54925c42822535256ac92966..6b43f4bf7986c8dfd1fc05413b9f3ede000c9990 100644
--- a/src/libs/valgrind/xmlprotocol/error.cpp
+++ b/src/libs/valgrind/xmlprotocol/error.cpp
@@ -38,12 +38,12 @@
 #include "stack.h"
 #include "suppression.h"
 
-#include <QSharedData>
-#include <QString>
-#include <QTextStream>
-#include <QVector>
+#include <QtCore/QSharedData>
+#include <QtCore/QString>
+#include <QtCore/QTextStream>
+#include <QtCore/QVector>
 
-#include <QtAlgorithms>
+#include <QtCore/QtAlgorithms>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/error.h b/src/libs/valgrind/xmlprotocol/error.h
index eabe1c75fa951eedf3dbadf91099986aa72c5ff5..ae2e20ac701c36b702b44e93374faced6a247b9d 100644
--- a/src/libs/valgrind/xmlprotocol/error.h
+++ b/src/libs/valgrind/xmlprotocol/error.h
@@ -38,8 +38,8 @@
 
 #include "../valgrind_global.h"
 
-#include <QMetaType>
-#include <QSharedDataPointer>
+#include <QtCore/QMetaType>
+#include <QtCore/QSharedDataPointer>
 
 QT_BEGIN_NAMESPACE
 class QString;
diff --git a/src/libs/valgrind/xmlprotocol/errorlistmodel.cpp b/src/libs/valgrind/xmlprotocol/errorlistmodel.cpp
index 599d52f08321e87c9c19a3f81b6b4dea3354b141..2c617c7129fc37c9ab9a8bf36a9403c5cd7c3897 100644
--- a/src/libs/valgrind/xmlprotocol/errorlistmodel.cpp
+++ b/src/libs/valgrind/xmlprotocol/errorlistmodel.cpp
@@ -40,8 +40,8 @@
 #include "modelhelpers.h"
 #include <utils/qtcassert.h>
 
-#include <QDir>
-#include <QVector>
+#include <QtCore/QDir>
+#include <QtCore/QVector>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/errorlistmodel.h b/src/libs/valgrind/xmlprotocol/errorlistmodel.h
index ddf5296c766248fcb4732bbe2273cefc60cbc66b..51a953011ff9744af130c98d53f518cea805fe53 100644
--- a/src/libs/valgrind/xmlprotocol/errorlistmodel.h
+++ b/src/libs/valgrind/xmlprotocol/errorlistmodel.h
@@ -38,8 +38,8 @@
 
 #include "../valgrind_global.h"
 
-#include <QAbstractItemModel>
-#include <QSharedPointer>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QSharedPointer>
 
 namespace Valgrind {
 namespace XmlProtocol {
diff --git a/src/libs/valgrind/xmlprotocol/frame.cpp b/src/libs/valgrind/xmlprotocol/frame.cpp
index da2e5c40df35efde6b03ce9591b8e928ab07f4a6..c2a3f14b21ed1c25b9c2cdcd0ff1242e8cf969b1 100644
--- a/src/libs/valgrind/xmlprotocol/frame.cpp
+++ b/src/libs/valgrind/xmlprotocol/frame.cpp
@@ -35,9 +35,8 @@
 
 #include "frame.h"
 
-#include <QString>
-
-#include <QtAlgorithms>
+#include <QtCore/QString>
+#include <QtCore/QtAlgorithms>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/frame.h b/src/libs/valgrind/xmlprotocol/frame.h
index 2dd36cc336041392ce822863fd0693989cab7c16..ab149c1dfc5ecca8d2e9fb4d8893387e71a8e6e2 100644
--- a/src/libs/valgrind/xmlprotocol/frame.h
+++ b/src/libs/valgrind/xmlprotocol/frame.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QSharedDataPointer>
+#include <QtCore/QSharedDataPointer>
 
 namespace Valgrind {
 namespace XmlProtocol {
diff --git a/src/libs/valgrind/xmlprotocol/stack.cpp b/src/libs/valgrind/xmlprotocol/stack.cpp
index 55141b92086dd6a324f6276688154b48f2b87a8a..406bc1cd637ebbf3c550e84e4dc7efb49a83b702 100644
--- a/src/libs/valgrind/xmlprotocol/stack.cpp
+++ b/src/libs/valgrind/xmlprotocol/stack.cpp
@@ -36,9 +36,9 @@
 #include "stack.h"
 #include "frame.h"
 
-#include <QSharedData>
-#include <QString>
-#include <QVector>
+#include <QtCore/QSharedData>
+#include <QtCore/QString>
+#include <QtCore/QVector>
 
 #include <algorithm>
 
diff --git a/src/libs/valgrind/xmlprotocol/stack.h b/src/libs/valgrind/xmlprotocol/stack.h
index f428191916375e92a4d371edcc03d8ad211ca3ad..630b493b184937c15dfaeace8775b25493ae6e27 100644
--- a/src/libs/valgrind/xmlprotocol/stack.h
+++ b/src/libs/valgrind/xmlprotocol/stack.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QSharedDataPointer>
+#include <QtCore/QSharedDataPointer>
 
 QT_BEGIN_NAMESPACE
 template <typename T> class QVector;
diff --git a/src/libs/valgrind/xmlprotocol/stackmodel.cpp b/src/libs/valgrind/xmlprotocol/stackmodel.cpp
index 0404b513c483b8fc8ec1c2321cf256a74e0d9b75..795a0ce5bdea9257c9f851d8999e0a910ee448fb 100644
--- a/src/libs/valgrind/xmlprotocol/stackmodel.cpp
+++ b/src/libs/valgrind/xmlprotocol/stackmodel.cpp
@@ -37,11 +37,12 @@
 #include "error.h"
 #include "frame.h"
 #include "stack.h"
+#include "modelhelpers.h"
+
 #include <utils/qtcassert.h>
 
-#include <QDir>
-#include <QVector>
-#include "modelhelpers.h"
+#include <QtCore/QDir>
+#include <QtCore/QVector>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/stackmodel.h b/src/libs/valgrind/xmlprotocol/stackmodel.h
index b04ad972ba994c738733488e67c512d5307c22e8..f813ab2dc83160b07fd0e8a4925a0fcb9ef0ecb9 100644
--- a/src/libs/valgrind/xmlprotocol/stackmodel.h
+++ b/src/libs/valgrind/xmlprotocol/stackmodel.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QAbstractItemModel>
+#include <QtCore/QAbstractItemModel>
 
 namespace Valgrind {
 namespace XmlProtocol {
diff --git a/src/libs/valgrind/xmlprotocol/status.cpp b/src/libs/valgrind/xmlprotocol/status.cpp
index 8dfe205e6b09ff221d7641b8c87cf564565cea00..a5b9cbff2c0c467785e99611c96fc9d8144e808a 100644
--- a/src/libs/valgrind/xmlprotocol/status.cpp
+++ b/src/libs/valgrind/xmlprotocol/status.cpp
@@ -35,8 +35,8 @@
 
 #include "status.h"
 
-#include <QSharedData>
-#include <QString>
+#include <QtCore/QSharedData>
+#include <QtCore/QString>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/status.h b/src/libs/valgrind/xmlprotocol/status.h
index fb88aa53e628f1bbcade6086f1e94d8cf9fd6c3e..9b72fd4e390e225e95d3fc5dcd492346224451c7 100644
--- a/src/libs/valgrind/xmlprotocol/status.h
+++ b/src/libs/valgrind/xmlprotocol/status.h
@@ -38,8 +38,8 @@
 
 #include "../valgrind_global.h"
 
-#include <QMetaType>
-#include <QSharedDataPointer>
+#include <QtCore/QMetaType>
+#include <QtCore/QSharedDataPointer>
 
 QT_BEGIN_NAMESPACE
 class QString;
diff --git a/src/libs/valgrind/xmlprotocol/suppression.cpp b/src/libs/valgrind/xmlprotocol/suppression.cpp
index 17306a97e8a2ad16690e342d6ddde78429e08e29..00439069dc70dcc79f78228159d085d092f71b23 100644
--- a/src/libs/valgrind/xmlprotocol/suppression.cpp
+++ b/src/libs/valgrind/xmlprotocol/suppression.cpp
@@ -35,10 +35,10 @@
 
 #include "suppression.h"
 
-#include <QSharedData>
-#include <QString>
-#include <QVector>
-#include <QTextStream>
+#include <QtCore/QSharedData>
+#include <QtCore/QString>
+#include <QtCore/QVector>
+#include <QtCore/QTextStream>
 
 #include <algorithm>
 
diff --git a/src/libs/valgrind/xmlprotocol/suppression.h b/src/libs/valgrind/xmlprotocol/suppression.h
index ab896a4ab4923aa47bb5225faaed628c9fea49d6..83d7998d8907671c42ec1b289528ad9c7f341ba3 100644
--- a/src/libs/valgrind/xmlprotocol/suppression.h
+++ b/src/libs/valgrind/xmlprotocol/suppression.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QSharedDataPointer>
+#include <QtCore/QSharedDataPointer>
 
 QT_BEGIN_NAMESPACE
 class QString;
diff --git a/src/libs/valgrind/xmlprotocol/threadedparser.cpp b/src/libs/valgrind/xmlprotocol/threadedparser.cpp
index 79e089207dbf3b6604bbfc77978b8ee5f7abca70..4062445e17d0e33bce63fc6861025579622b2259 100644
--- a/src/libs/valgrind/xmlprotocol/threadedparser.cpp
+++ b/src/libs/valgrind/xmlprotocol/threadedparser.cpp
@@ -41,9 +41,9 @@
 #include "suppression.h"
 #include <utils/qtcassert.h>
 
-#include <QMetaType>
-#include <QThread>
-#include <QSharedPointer>
+#include <QtCore/QMetaType>
+#include <QtCore/QThread>
+#include <QtCore/QSharedPointer>
 
 using namespace Valgrind;
 using namespace Valgrind::XmlProtocol;
diff --git a/src/libs/valgrind/xmlprotocol/threadedparser.h b/src/libs/valgrind/xmlprotocol/threadedparser.h
index ea06c729e848b6a408b7377259b97c78e024dbe0..0cbc59cb3f0b2876c14506a97b02ddece7d2e729 100644
--- a/src/libs/valgrind/xmlprotocol/threadedparser.h
+++ b/src/libs/valgrind/xmlprotocol/threadedparser.h
@@ -38,7 +38,7 @@
 
 #include "../valgrind_global.h"
 
-#include <QObject>
+#include <QtCore/QObject>
 
 QT_BEGIN_NAMESPACE
 class QIODevice;
diff --git a/src/plugins/analyzerbase/analyzerconstants.h b/src/plugins/analyzerbase/analyzerconstants.h
index 6c89899b65d233d5e76c099f13d536f95e09b2b0..ee40095ef97ff6925b4a9d57d37470e4f4008e45 100644
--- a/src/plugins/analyzerbase/analyzerconstants.h
+++ b/src/plugins/analyzerbase/analyzerconstants.h
@@ -36,14 +36,14 @@
 #ifndef ANALYZERCONSTANTS_H
 #define ANALYZERCONSTANTS_H
 
-#include <QtGlobal>
+#include <QtCore/QtGlobal>
 
 namespace Analyzer {
 namespace Constants {
 
 // modes and their priorities
 const char * const MODE_ANALYZE   = "Analyzer.Mode.Analyze";
-const int          P_MODE_ANALYZE = 60;
+const int          P_MODE_ANALYZE = 76;
 
 // context
 const char * const C_ANALYZEMODE = "Analyzer.AnalyzeMode";
diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp
index 165849576af12435811f2e183f02e63f159ff040..13c807cd2e4c6f4f4c73fe40e667d55940da0237 100644
--- a/src/plugins/analyzerbase/analyzermanager.cpp
+++ b/src/plugins/analyzerbase/analyzermanager.cpp
@@ -34,6 +34,7 @@
 **************************************************************************/
 
 #include "analyzermanager.h"
+#include "analyzerconstants.h"
 
 #include "ianalyzertool.h"
 #include "analyzerplugin.h"
@@ -51,6 +52,9 @@
 #include <coreplugin/actionmanager/actioncontainer.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/uniqueidmanager.h>
+#include <coreplugin/coreconstants.h>
+#include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/imode.h>
 
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/projectexplorer.h>
@@ -69,23 +73,22 @@
 #include <cmakeprojectmanager/cmakeprojectconstants.h>
 #include <qt4projectmanager/qt4projectmanagerconstants.h>
 
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QDockWidget>
-#include <QVariant>
-#include <QAction>
-#include <QMenu>
-#include <QMenuBar>
-#include <QToolButton>
-#include <QComboBox>
-#include <QStackedWidget>
-#include <QDebug>
-#include <QDialog>
-#include <QApplication>
-#include <QLabel>
-#include <QCheckBox>
-#include <QDialogButtonBox>
-
+#include <QtCore/QVariant>
+#include <QtCore/QDebug>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QVBoxLayout>
+#include <QtGui/QDockWidget>
+#include <QtGui/QAction>
+#include <QtGui/QMenu>
+#include <QtGui/QMenuBar>
+#include <QtGui/QToolButton>
+#include <QtGui/QComboBox>
+#include <QtGui/QStackedWidget>
+#include <QtGui/QDialog>
+#include <QtGui/QApplication>
+#include <QtGui/QLabel>
+#include <QtGui/QCheckBox>
+#include <QtGui/QDialogButtonBox>
 
 using namespace Core;
 using namespace Analyzer;
@@ -94,6 +97,20 @@ using namespace Analyzer::Internal;
 namespace Analyzer {
 namespace Internal {
 
+class DockWidgetEventFilter : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DockWidgetEventFilter(QObject *parent = 0) : QObject(parent) {}
+
+signals:
+    void widgetResized();
+
+protected:
+    virtual bool eventFilter(QObject *obj, QEvent *event);
+};
+
 bool DockWidgetEventFilter::eventFilter(QObject *obj, QEvent *event)
 {
     switch (event->type()) {
@@ -109,6 +126,44 @@ bool DockWidgetEventFilter::eventFilter(QObject *obj, QEvent *event)
 
 // AnalyzerMode ////////////////////////////////////////////////////
 
+class AnalyzerMode : public Core::IMode
+{
+    Q_OBJECT
+
+public:
+    AnalyzerMode(QObject *parent = 0)
+        : Core::IMode(parent)
+        , m_widget(0)
+    {}
+
+    ~AnalyzerMode()
+    {
+        // Make sure the editor manager does not get deleted.
+        if (m_widget) {
+            delete m_widget;
+            m_widget = 0;
+        }
+        Core::EditorManager::instance()->setParent(0);
+    }
+
+    QString displayName() const { return tr("Analyze"); }
+    QIcon icon() const { return QIcon(":/images/analyzer_mode.png"); }
+    int priority() const { return Constants::P_MODE_ANALYZE; }
+    QWidget *widget() { return m_widget; }
+    QString id() const { return QLatin1String(Constants::MODE_ANALYZE); }
+    QString type() const { return Core::Constants::MODE_EDIT_TYPE; }
+    Core::Context context() const
+    {
+        return Core::Context(Core::Constants::C_EDITORMANAGER, Constants::C_ANALYZEMODE,
+                             Core::Constants::C_NAVIGATION_PANE);
+    }
+    QString contextHelpId() const { return QString(); }
+    void setWidget(QWidget *widget) { m_widget = widget; }
+
+private:
+    QWidget *m_widget;
+};
+
 } // namespace Internal
 } // namespace Analyzer
 
@@ -181,8 +236,8 @@ AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager
 {
     m_runControlFactory = new AnalyzerRunControlFactory();
     AnalyzerPlugin::instance()->addAutoReleasedObject(m_runControlFactory);
-    connect(m_runControlFactory, SIGNAL(runControlCreated(AnalyzerRunControl *)),
-            q, SLOT(runControlCreated(AnalyzerRunControl *)));
+    connect(m_runControlFactory, SIGNAL(runControlCreated(Analyzer::Internal::AnalyzerRunControl *)),
+            q, SLOT(runControlCreated(Analyzer::Internal::AnalyzerRunControl *)));
 
     setupActions();
 }
@@ -699,3 +754,5 @@ void AnalyzerManager::updateRunActions()
     bool startEnabled = !d->m_currentRunControl && pe->canRun(project, Constants::MODE_ANALYZE);
     d->m_startAction->setEnabled(startEnabled);
 }
+
+#include "analyzermanager.moc"
diff --git a/src/plugins/analyzerbase/analyzermanager.h b/src/plugins/analyzerbase/analyzermanager.h
index 2e7c3b88ce5600fd13c0f7f1da3b931d40dd3b66..b89359c46eb2a3361b8cd72d1f658a5ab278b8df 100644
--- a/src/plugins/analyzerbase/analyzermanager.h
+++ b/src/plugins/analyzerbase/analyzermanager.h
@@ -37,14 +37,8 @@
 #define ANALYZERMANAGER_H
 
 #include "analyzerbase_global.h"
-#include "analyzerconstants.h"
 
-#include <coreplugin/coreconstants.h>
-#include <coreplugin/editormanager/editormanager.h>
-#include <coreplugin/imode.h>
-
-#include <QObject>
-#include <QIcon>
+#include <QtCore/QObject>
 
 QT_BEGIN_NAMESPACE
 class QAction;
@@ -60,68 +54,10 @@ class FancyMainWindow;
 }
 
 namespace Analyzer {
-
 class IAnalyzerTool;
-
 namespace Internal {
-
 class AnalyzerRunControl;
-
-class DockWidgetEventFilter : public QObject
-{
-    Q_OBJECT
-
-public:
-    explicit DockWidgetEventFilter(QObject *parent = 0) : QObject(parent) {}
-
-signals:
-    void widgetResized();
-
-protected:
-    virtual bool eventFilter(QObject *obj, QEvent *event);
-};
-
-class AnalyzerMode : public Core::IMode
-{
-    Q_OBJECT
-
-public:
-    AnalyzerMode(QObject *parent = 0)
-        : Core::IMode(parent)
-        , m_widget(0)
-    {}
-
-    ~AnalyzerMode()
-    {
-        // Make sure the editor manager does not get deleted.
-        if (m_widget) {
-            delete m_widget;
-            m_widget = 0;
-        }
-        Core::EditorManager::instance()->setParent(0);
-    }
-
-    QString displayName() const { return tr("Analyze"); }
-    QIcon icon() const { return QIcon(":/images/analyzer_mode.png"); }
-    int priority() const { return Constants::P_MODE_ANALYZE; }
-    QWidget *widget() { return m_widget; }
-    QString id() const { return QLatin1String(Constants::MODE_ANALYZE); }
-    QString type() const { return Core::Constants::MODE_EDIT_TYPE; }
-    Core::Context context() const
-    {
-        return Core::Context(Core::Constants::C_EDITORMANAGER, Constants::C_ANALYZEMODE,
-                             Core::Constants::C_NAVIGATION_PANE);
-    }
-    QString contextHelpId() const { return QString(); }
-    void setWidget(QWidget *widget) { m_widget = widget; }
-
-private:
-    QWidget *m_widget;
-};
-
-}
-
-using Analyzer::Internal::AnalyzerRunControl;
+} // namespace Internal
 
 class ANALYZER_EXPORT AnalyzerManager : public QObject
 {
@@ -167,10 +103,10 @@ private slots:
     void toolSelected(int);
     void toolSelected(QAction *);
     void modeChanged(Core::IMode *mode);
-    void runControlCreated(AnalyzerRunControl *);
+    void runControlCreated(Analyzer::Internal::AnalyzerRunControl *);
     void resetLayout();
-    void saveToolSettings(IAnalyzerTool *tool);
-    void loadToolSettings(IAnalyzerTool *tool);
+    void saveToolSettings(Analyzer::IAnalyzerTool *tool);
+    void loadToolSettings(Analyzer::IAnalyzerTool *tool);
     void updateRunActions();
 
 private:
diff --git a/src/plugins/analyzerbase/analyzeroptionspage.cpp b/src/plugins/analyzerbase/analyzeroptionspage.cpp
index 127ca8de6ff95e70e2fb420b9ca5bde4abedf6d8..81f7235113340906b1c85b55a3e5dc49bc5b295c 100644
--- a/src/plugins/analyzerbase/analyzeroptionspage.cpp
+++ b/src/plugins/analyzerbase/analyzeroptionspage.cpp
@@ -38,14 +38,15 @@
 #include "analyzeroptionspage.h"
 #include "analyzersettings.h"
 
-#include <QCoreApplication>
-#include <QLatin1String>
-#include <QWidget>
-#include <QDebug>
-#include <QIcon>
-
 #include <coreplugin/icore.h>
 
+#include <QtCore/QCoreApplication>
+#include <QtCore/QLatin1String>
+#include <QtCore/QDebug>
+
+#include <QtGui/QIcon>
+#include <QtGui/QWidget>
+
 using namespace Analyzer;
 using namespace Analyzer::Internal;
 
@@ -72,7 +73,7 @@ QString AnalyzerOptionsPage::category() const
 
 QString AnalyzerOptionsPage::displayCategory() const
 {
-    return QCoreApplication::tr("Analyzer", Constants::ANALYZER_SETTINGS_TR_CATEGORY);
+    return QCoreApplication::translate("Analyzer", Constants::ANALYZER_SETTINGS_TR_CATEGORY);
 }
 
 QIcon AnalyzerOptionsPage::categoryIcon() const
diff --git a/src/plugins/analyzerbase/analyzerplugin.cpp b/src/plugins/analyzerbase/analyzerplugin.cpp
index d943aa6c14f132a5c7060273a72481ed33e36e59..b202dc57c13792f18bfa7ef29c3ecaee9ae01894 100644
--- a/src/plugins/analyzerbase/analyzerplugin.cpp
+++ b/src/plugins/analyzerbase/analyzerplugin.cpp
@@ -45,10 +45,10 @@
 #include <projectexplorer/task.h>
 #include <projectexplorer/taskhub.h>
 
-#include <QtPlugin>
-#include <QMessageBox>
-#include <QMainWindow>
-#include <QApplication>
+#include <QtCore/QtPlugin>
+#include <QtGui/QMessageBox>
+#include <QtGui/QMainWindow>
+#include <QtGui/QApplication>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
diff --git a/src/plugins/analyzerbase/analyzerrunconfigwidget.cpp b/src/plugins/analyzerbase/analyzerrunconfigwidget.cpp
index fbe50a0bf9058166e9c95017cbdb367dd2ecd753..794b6107da147fca954cb3842f6916ba3b9d03ef 100644
--- a/src/plugins/analyzerbase/analyzerrunconfigwidget.cpp
+++ b/src/plugins/analyzerbase/analyzerrunconfigwidget.cpp
@@ -40,9 +40,9 @@
 #include <utils/detailswidget.h>
 #include <utils/qtcassert.h>
 
-#include <QDebug>
-#include <QGroupBox>
-#include <QVBoxLayout>
+#include <QtCore/QDebug>
+#include <QtGui/QGroupBox>
+#include <QtGui/QVBoxLayout>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
@@ -82,6 +82,7 @@ void AnalyzerRunConfigWidget::setRunConfiguration(ProjectExplorer::RunConfigurat
     QLayout* layout = m_detailsWidget->widget()->layout();
     foreach(AbstractAnalyzerSubConfig *config, settings->subConfigs()) {
         QGroupBox* box = new QGroupBox(config->displayName());
+        Q_UNUSED(box)
         QWidget* widget = config->createConfigWidget(this);
         layout->addWidget(widget);
     }
diff --git a/src/plugins/analyzerbase/analyzerruncontrol.cpp b/src/plugins/analyzerbase/analyzerruncontrol.cpp
index eb63041c804652a26c6e16d8d1d1661a5a1bddca..e853b67570c880871ba256a450e95941e45e6204 100644
--- a/src/plugins/analyzerbase/analyzerruncontrol.cpp
+++ b/src/plugins/analyzerbase/analyzerruncontrol.cpp
@@ -49,10 +49,10 @@
 #include <projectexplorer/taskhub.h>
 #include <coreplugin/ioutputpane.h>
 
-#include <QDebug>
-#include <QHBoxLayout>
-#include <QLabel>
-#include <QMessageBox>
+#include <QtCore/QDebug>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QLabel>
+#include <QtGui/QMessageBox>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
diff --git a/src/plugins/analyzerbase/analyzerruncontrol.h b/src/plugins/analyzerbase/analyzerruncontrol.h
index b3948f6103b1bfeba026e8deda1cc5b8580749b8..dbb498025f793917ddede9041fb92b6d441cb59a 100644
--- a/src/plugins/analyzerbase/analyzerruncontrol.h
+++ b/src/plugins/analyzerbase/analyzerruncontrol.h
@@ -72,7 +72,7 @@ public:
     ProjectExplorer::RunConfigWidget *createConfigurationWidget(RunConfiguration *runConfiguration);
 
 signals:
-    void runControlCreated(AnalyzerRunControl *);
+    void runControlCreated(Analyzer::Internal::AnalyzerRunControl *);
 };
 
 
diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp
index aec7128e5a681851eda03d8b3e8a4a26d646b175..b456ac5b2df6266ae36e8138d2369e91e7c257eb 100644
--- a/src/plugins/analyzerbase/analyzersettings.cpp
+++ b/src/plugins/analyzerbase/analyzersettings.cpp
@@ -44,7 +44,7 @@
 #include <valgrind/xmlprotocol/error.h>
 #include <utils/qtcassert.h>
 
-#include <QSettings>
+#include <QtCore/QSettings>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
diff --git a/src/plugins/analyzerbase/analyzersettings.h b/src/plugins/analyzerbase/analyzersettings.h
index 12e0d20d93a4401c5c9ec8933a50bcc98f85ff9c..7a4641550d2193d3387e6fd4e0322b656e77220f 100644
--- a/src/plugins/analyzerbase/analyzersettings.h
+++ b/src/plugins/analyzerbase/analyzersettings.h
@@ -36,8 +36,8 @@
 #ifndef ANALYZER_INTERNAL_ANALYZERSETTINGS_H
 #define ANALYZER_INTERNAL_ANALYZERSETTINGS_H
 
-#include <QObject>
-#include <QVariant>
+#include <QtCore/QObject>
+#include <QtCore/QVariant>
 
 #include "analyzerbase_global.h"
 
diff --git a/src/plugins/analyzerbase/ianalyzerengine.h b/src/plugins/analyzerbase/ianalyzerengine.h
index 3441075151a0c20c640c9a703e16173b670258ad..75b06dff1797d50ecb09a4051870947389d417ed 100644
--- a/src/plugins/analyzerbase/ianalyzerengine.h
+++ b/src/plugins/analyzerbase/ianalyzerengine.h
@@ -40,8 +40,8 @@
 
 #include <projectexplorer/task.h>
 
-#include <QObject>
-#include <QString>
+#include <QtCore/QObject>
+#include <QtCore/QString>
 
 namespace ProjectExplorer {
 class RunConfiguration;
diff --git a/src/plugins/analyzerbase/ianalyzertool.h b/src/plugins/analyzerbase/ianalyzertool.h
index e069ab95072e9d475057bf12099b43e206b57945..f86b0e964a067d4787ed236ead33b98abe3a91c0 100644
--- a/src/plugins/analyzerbase/ianalyzertool.h
+++ b/src/plugins/analyzerbase/ianalyzertool.h
@@ -38,7 +38,7 @@
 
 #include "analyzerbase_global.h"
 
-#include <QObject>
+#include <QtCore/QObject>
 
 namespace ProjectExplorer {
 class RunConfiguration;
diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
index 008c4f0ae549db97a5c76afad9a0ce8401f0ea47..fa746ff3a1b19c3966793b6320b371324427343c 100644
--- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp
@@ -333,9 +333,9 @@ CMakeRunConfigurationWidget::CMakeRunConfigurationWidget(CMakeRunConfiguration *
     fl->addRow(tr("Arguments:"), argumentsLineEdit);
 
     m_workingDirectoryEdit = new Utils::PathChooser();
+    m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::Directory);
     m_workingDirectoryEdit->setBaseDirectory(m_cmakeRunConfiguration->target()->project()->projectDirectory());
     m_workingDirectoryEdit->setPath(m_cmakeRunConfiguration->baseWorkingDirectory());
-    m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::ExistingDirectory);
     m_workingDirectoryEdit->setPromptDialogTitle(tr("Select Working Directory"));
 
     QToolButton *resetButton = new QToolButton();
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 8e89d741ae05d5fee293a827c0412d6a54adba5c..e4d9faaf3f081ed65d33ed11d796dccd89ceca4d 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -541,8 +541,14 @@ DEBUGGER_EXPORT ConfigurationCheck checkDebugConfiguration(const DebuggerStartPa
 #endif
     QList<DebuggerEngineType> usableTypes;
     foreach (DebuggerEngineType et, requiredTypes)
-        if (et & cmdLineEnabledEngines)
+        if (et & cmdLineEnabledEngines) {
             usableTypes.push_back(et);
+        } else {
+            const QString msg = DebuggerPlugin::tr("The debugger engine '%1' preferred for "
+                                                   "debugging binaries of type %2 is disabled.").
+                    arg(engineTypeName(et), sp.toolChainAbi.toString());
+            debuggerCore()->showMessage(msg, LogWarning);
+        }
     if (usableTypes.isEmpty()) {
         result.errorMessage = DebuggerPlugin::tr("This configuration requires the debugger engine %1, which is disabled.").
                 arg(QLatin1String(engineTypeName(usableTypes.front())));
@@ -566,6 +572,11 @@ DEBUGGER_EXPORT ConfigurationCheck checkDebugConfiguration(const DebuggerStartPa
         if (configurationOk) {
             break;
         } else {
+            const QString msg = DebuggerPlugin::tr("The debugger engine '%1' preferred "
+                                                   "for debugging binaries of type %2 is not set up correctly: %3").
+                                arg(engineTypeName(usableTypes.front()), sp.toolChainAbi.toString(),
+                                    result.errorDetails.isEmpty() ? QString() : result.errorDetails.back());
+            debuggerCore()->showMessage(msg, LogWarning);
             usableTypes.pop_front();
         }
     }
diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp
index 57f5181721a7ae8d8ee6c95fe9ea8b458626bd4a..69196ca3800c7f1df97c19df4e51b1d70ce0b0eb 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.cpp
+++ b/src/plugins/debugger/gdb/codagdbadapter.cpp
@@ -1036,7 +1036,7 @@ void CodaGdbAdapter::startAdapter()
     QSharedPointer<QTcpSocket> codaSocket;
     if (parameters.communicationChannel ==
             DebuggerStartParameters::CommunicationChannelTcpIp) {
-        m_codaDevice = QSharedPointer<CodaDevice>(new CodaDevice);
+        m_codaDevice = QSharedPointer<CodaDevice>(new CodaDevice, &CodaDevice::deleteLater);
         setupTrkDeviceSignals();
         codaSocket = QSharedPointer<QTcpSocket>(new QTcpSocket);
         m_codaDevice->setDevice(codaSocket);
diff --git a/src/plugins/memcheck/memcheckconfigwidget.cpp b/src/plugins/memcheck/memcheckconfigwidget.cpp
index 27aed4887d05d6204ed8d58a2a0b89afc83da4f8..a60f452a3de72591de27c7bc3eafe2f153ab9428 100644
--- a/src/plugins/memcheck/memcheckconfigwidget.cpp
+++ b/src/plugins/memcheck/memcheckconfigwidget.cpp
@@ -41,9 +41,9 @@
 
 #include <utils/qtcassert.h>
 
-#include <QStandardItemModel>
-#include <QFileDialog>
-#include <QDebug>
+#include <QtGui/QStandardItemModel>
+#include <QtGui/QFileDialog>
+#include <QtCore/QDebug>
 
 using namespace Analyzer::Internal;
 
diff --git a/src/plugins/memcheck/memcheckconfigwidget.h b/src/plugins/memcheck/memcheckconfigwidget.h
index e1c1f9794144632e6966f24292fb63feab7a4dac..a62ffc5dd4811ad81b7420a36e57d5e9202a997f 100644
--- a/src/plugins/memcheck/memcheckconfigwidget.h
+++ b/src/plugins/memcheck/memcheckconfigwidget.h
@@ -37,7 +37,7 @@
 #ifndef ANALYZER_INTERNAL_MEMCHECKCONFIGWIDGET_H
 #define ANALYZER_INTERNAL_MEMCHECKCONFIGWIDGET_H
 
-#include <QWidget>
+#include <QtGui/QWidget>
 
 QT_BEGIN_NAMESPACE
 class QStandardItemModel;
diff --git a/src/plugins/memcheck/memcheckerrorview.cpp b/src/plugins/memcheck/memcheckerrorview.cpp
index 3565baebfcf3afeb2ab9957eab715e211c0c2bb5..d5c262cc8130a096d665b56f07ea0ced56be0a24 100644
--- a/src/plugins/memcheck/memcheckerrorview.cpp
+++ b/src/plugins/memcheck/memcheckerrorview.cpp
@@ -152,7 +152,7 @@ static QString makeFrameName(const Frame &frame, const QString &relativeTo,
     }
 
     if (!fn.isEmpty())
-        return QCoreApplication::tr("Analyzer::Internal", "%1 in %2").arg(Qt::escape(fn), path);
+        return QCoreApplication::translate("Analyzer::Internal", "%1 in %2").arg(Qt::escape(fn), path);
     else if (!path.isEmpty())
         return path;
     else
@@ -183,7 +183,7 @@ QString errorLocation(const QModelIndex &index, const Error &error,
     };
     QTC_ASSERT(model, return QString());
 
-    return QCoreApplication::tr("Analyzer::Internal", "in %1").
+    return QCoreApplication::translate("Analyzer::Internal", "in %1").
             arg(makeFrameName(model->findRelevantFrame(error), relativeToPath(),
                               link, linkAttr));
 }
diff --git a/src/plugins/memcheck/memcheckplugin.cpp b/src/plugins/memcheck/memcheckplugin.cpp
index d39f68d0d90cf9400cf84f16c486f6b99eb630ac..da888fc14954fed1b87052982d3680b5c231dac2 100644
--- a/src/plugins/memcheck/memcheckplugin.cpp
+++ b/src/plugins/memcheck/memcheckplugin.cpp
@@ -41,8 +41,8 @@
 #include "memchecktool.h"
 #include "memchecksettings.h"
 
-#include <QStringList>
-#include <QtPlugin>
+#include <QtCore/QStringList>
+#include <QtCore/QtPlugin>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
@@ -73,4 +73,4 @@ void MemcheckPlugin::extensionsInitialized()
 
 }
 
-Q_EXPORT_PLUGIN(MemcheckPlugin)
\ No newline at end of file
+Q_EXPORT_PLUGIN(MemcheckPlugin)
diff --git a/src/plugins/memcheck/memchecktool.cpp b/src/plugins/memcheck/memchecktool.cpp
index 4b79e7a13ca7353401dfdaa4b0ad360f135aa3fb..3240c8a1ff279710cac72b0f63d3e21815f4c01b 100644
--- a/src/plugins/memcheck/memchecktool.cpp
+++ b/src/plugins/memcheck/memchecktool.cpp
@@ -73,21 +73,22 @@
 #include <utils/styledbar.h>
 #include <utils/qtcassert.h>
 
-#include <QString>
-#include <QLatin1String>
-#include <QFileInfo>
-#include <QDockWidget>
-#include <QFile>
-#include <QDir>
-#include <QHBoxLayout>
-#include <QComboBox>
-#include <QLabel>
-#include <QSpinBox>
-#include <QAction>
-#include <QMenu>
-#include <QMessageBox>
-#include <QToolButton>
-#include <QCheckBox>
+#include <QtCore/QString>
+#include <QtCore/QLatin1String>
+#include <QtCore/QFileInfo>
+#include <QtCore/QFile>
+#include <QtCore/QDir>
+
+#include <QtGui/QDockWidget>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QComboBox>
+#include <QtGui/QLabel>
+#include <QtGui/QSpinBox>
+#include <QtGui/QAction>
+#include <QtGui/QMenu>
+#include <QtGui/QMessageBox>
+#include <QtGui/QToolButton>
+#include <QtGui/QCheckBox>
 #include <utils/stylehelper.h>
 
 using namespace Analyzer;
diff --git a/src/plugins/memcheck/memchecktool.h b/src/plugins/memcheck/memchecktool.h
index 547fb14cfae473efdb628d3b335593c86758e6ab..1aa26068fe1701b4b17972bb71361c629b873048 100644
--- a/src/plugins/memcheck/memchecktool.h
+++ b/src/plugins/memcheck/memchecktool.h
@@ -38,8 +38,8 @@
 
 #include <analyzerbase/ianalyzertool.h>
 
-#include <QSortFilterProxyModel>
-#include <QSharedPointer>
+#include <QtGui/QSortFilterProxyModel>
+#include <QtCore/QSharedPointer>
 
 QT_BEGIN_NAMESPACE
 class QItemSelection;
diff --git a/src/plugins/memcheck/suppressiondialog.cpp b/src/plugins/memcheck/suppressiondialog.cpp
index 2ffb57b30b03f9a8783f95e2d27ab16b33b69cd4..dcdae5b2f238c2d7197f0a8e7b615818d0f98ba0 100644
--- a/src/plugins/memcheck/suppressiondialog.cpp
+++ b/src/plugins/memcheck/suppressiondialog.cpp
@@ -48,8 +48,8 @@
 #include <utils/pathchooser.h>
 #include <utils/qtcassert.h>
 
-#include <QFile>
-#include <QPushButton>
+#include <QtCore/QFile>
+#include <QtGui/QPushButton>
 
 #include <valgrind/xmlprotocol/suppression.h>
 #include <valgrind/xmlprotocol/errorlistmodel.h>
diff --git a/src/plugins/memcheck/suppressiondialog.h b/src/plugins/memcheck/suppressiondialog.h
index 7223ef2b3fb34d4017574c702382c70c34790d65..72ed3aaa96d1dd9e47af6f51f78ef8ef8914d17d 100644
--- a/src/plugins/memcheck/suppressiondialog.h
+++ b/src/plugins/memcheck/suppressiondialog.h
@@ -37,7 +37,7 @@
 #ifndef ANALYZER_VALGRIND_INTERNAL_SUPPRESSIONDIALOG_H
 #define ANALYZER_VALGRIND_INTERNAL_SUPPRESSIONDIALOG_H
 
-#include <QDialog>
+#include <QtGui/QDialog>
 
 #include <valgrind/xmlprotocol/error.h>
 
diff --git a/src/plugins/projectexplorer/customexecutableconfigurationwidget.cpp b/src/plugins/projectexplorer/customexecutableconfigurationwidget.cpp
index 09e426790968ec2dab63c5f774b12c857b348298..e706f151b3738f0e0bebf1600563db76d1e58f40 100644
--- a/src/plugins/projectexplorer/customexecutableconfigurationwidget.cpp
+++ b/src/plugins/projectexplorer/customexecutableconfigurationwidget.cpp
@@ -54,21 +54,6 @@
 namespace ProjectExplorer {
 namespace Internal {
 
-class CustomDirectoryPathChooser : public Utils::PathChooser
-{
-public:
-    CustomDirectoryPathChooser(QWidget *parent)
-        : Utils::PathChooser(parent)
-    {
-    }
-    virtual bool validatePath(const QString &path, QString *errorMessage = 0)
-    {
-        Q_UNUSED(path)
-        Q_UNUSED(errorMessage)
-        return true;
-    }
-};
-
 CustomExecutableConfigurationWidget::CustomExecutableConfigurationWidget(CustomExecutableRunConfiguration *rc)
     : m_ignoreChange(false), m_runConfiguration(rc)
 {
@@ -77,16 +62,16 @@ CustomExecutableConfigurationWidget::CustomExecutableConfigurationWidget(CustomE
     layout->setMargin(0);
 
     m_executableChooser = new Utils::PathChooser(this);
-    m_executableChooser->setEnvironment(rc->environment());
     m_executableChooser->setExpectedKind(Utils::PathChooser::Command);
+    m_executableChooser->setEnvironment(rc->environment());
     layout->addRow(tr("Executable:"), m_executableChooser);
 
     m_commandLineArgumentsLineEdit = new QLineEdit(this);
     m_commandLineArgumentsLineEdit->setMinimumWidth(200); // this shouldn't be fixed here...
     layout->addRow(tr("Arguments:"), m_commandLineArgumentsLineEdit);
 
-    m_workingDirectory = new CustomDirectoryPathChooser(this);
-    m_workingDirectory->setExpectedKind(Utils::PathChooser::ExistingDirectory);
+    m_workingDirectory = new Utils::PathChooser(this);
+    m_workingDirectory->setExpectedKind(Utils::PathChooser::Directory);
     m_workingDirectory->setBaseDirectory(rc->target()->project()->projectDirectory());
     m_workingDirectory->setEnvironment(rc->environment());
     layout->addRow(tr("Working directory:"), m_workingDirectory);
diff --git a/src/plugins/projectexplorer/processstep.cpp b/src/plugins/projectexplorer/processstep.cpp
index bfe666920f7d3364eaead2438d70edeeb9cb5e88..55eea5895dfc2b353b73cf9e266999ff09929199 100644
--- a/src/plugins/projectexplorer/processstep.cpp
+++ b/src/plugins/projectexplorer/processstep.cpp
@@ -258,7 +258,7 @@ ProcessStepConfigWidget::ProcessStepConfigWidget(ProcessStep *step)
         : m_step(step)
 {
     m_ui.setupUi(this);
-    m_ui.command->setExpectedKind(Utils::PathChooser::ExistingCommand);
+    m_ui.command->setExpectedKind(Utils::PathChooser::Command);
     connect(m_ui.command, SIGNAL(changed(QString)),
             this, SLOT(commandLineEditTextEdited()));
     connect(m_ui.workingDirectory, SIGNAL(changed(QString)),
diff --git a/src/plugins/projectexplorer/toolchainconfigwidget.cpp b/src/plugins/projectexplorer/toolchainconfigwidget.cpp
index 70a1c460231ce78d0e0b100f45485615b9ddc9b3..7efa4bb69ab36cf0d670c94c672b13bbe094d551 100644
--- a/src/plugins/projectexplorer/toolchainconfigwidget.cpp
+++ b/src/plugins/projectexplorer/toolchainconfigwidget.cpp
@@ -111,9 +111,9 @@ void ToolChainConfigWidget::ensureDebuggerPathChooser(const QStringList &version
     if (m_d->m_debuggerPathChooser)
         return;
     m_d->m_debuggerPathChooser = new Utils::PathChooser;
+    m_d->m_debuggerPathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
     if (!versionArguments.isEmpty())
         m_d->m_debuggerPathChooser->setCommandVersionArguments(versionArguments);
-    m_d->m_debuggerPathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
     connect(m_d->m_debuggerPathChooser, SIGNAL(changed(QString)), this, SLOT(emitDirty()));
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
index fca73a1a21ab1cc83cccde38f8629d0db627ad71..546788ac78fb8cc522f09118ccab7a2c21b42e87 100644
--- a/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-desktop/qt4runconfiguration.cpp
@@ -214,9 +214,9 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run
     toplayout->addRow(argumentsLabel, m_argumentsLineEdit);
 
     m_workingDirectoryEdit = new Utils::PathChooser(this);
+    m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::Directory);
     m_workingDirectoryEdit->setPath(m_qt4RunConfiguration->baseWorkingDirectory());
     m_workingDirectoryEdit->setBaseDirectory(m_qt4RunConfiguration->target()->project()->projectDirectory());
-    m_workingDirectoryEdit->setExpectedKind(Utils::PathChooser::ExistingDirectory);
     m_workingDirectoryEdit->setEnvironment(m_qt4RunConfiguration->environment());
     m_workingDirectoryEdit->setPromptDialogTitle(tr("Select Working Directory"));
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp
index dc2abbdc0373e637cf8f23f28007b4d8dd51f654..a09beb886b91a9794bd0f1850e79c59359781788 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.cpp
@@ -43,6 +43,9 @@
 #include <symbianutils/symbiandevicemanager.h>
 #include <codadevice.h>
 
+#include <coreplugin/helpmanager.h>
+
+#include "codaruncontrol.h"
 #include "trkruncontrol.h"
 
 #include <utils/detailswidget.h>
@@ -51,6 +54,7 @@
 #include <utils/pathchooser.h>
 
 #include <QtCore/QDir>
+#include <QtCore/QTimer>
 #include <QtGui/QLabel>
 #include <QtGui/QLineEdit>
 #include <QtGui/QComboBox>
@@ -137,7 +141,9 @@ S60DeployConfigurationWidget::S60DeployConfigurationWidget(QWidget *parent)
       m_wlanRadioButton(new QRadioButton(tr("WLAN:"))),
       m_ipAddress(new Utils::IpAddressLineEdit),
       m_trkRadioButton(new QRadioButton(tr("TRK"))),
-      m_codaRadioButton(new QRadioButton(tr("CODA")))
+      m_codaRadioButton(new QRadioButton(tr("CODA"))),
+      m_codaInfoLabel(new QLabel(tr("<a href=\"qthelp://com.nokia.qtcreator/doc/creator-developing-symbian.html\">What are the prerequisites?</a>"))),
+      m_codaTimeout(new QTimer(this))
 {
 }
 
@@ -192,7 +198,11 @@ void S60DeployConfigurationWidget::init(ProjectExplorer::DeployConfiguration *dc
             this, SLOT(updateSerialDevices()));
 
     //Debug Client
+    QVBoxLayout *debugClientContentVBoxLayout = new QVBoxLayout;
+    debugClientContentVBoxLayout->addWidget(m_codaInfoLabel);
+
     QHBoxLayout *debugClientHBoxLayout = new QHBoxLayout;
+    debugClientContentVBoxLayout->addLayout(debugClientHBoxLayout);
 
     QVBoxLayout *debugClientVBoxLayout = new QVBoxLayout;
     debugClientVBoxLayout->addWidget(m_trkRadioButton);
@@ -206,7 +216,7 @@ void S60DeployConfigurationWidget::init(ProjectExplorer::DeployConfiguration *dc
     debugClientHBoxLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored));
 
     QGroupBox *debugClientGroupBox = new QGroupBox(tr("Device Agent"));
-    debugClientGroupBox->setLayout(debugClientHBoxLayout);
+    debugClientGroupBox->setLayout(debugClientContentVBoxLayout);
 
     bool usingTrk = m_deployConfiguration->communicationChannel() == S60DeployConfiguration::CommunicationTrkSerialConnection;
     m_trkRadioButton->setChecked(usingTrk);
@@ -218,6 +228,8 @@ void S60DeployConfigurationWidget::init(ProjectExplorer::DeployConfiguration *dc
 
     connect(m_trkRadioButton, SIGNAL(clicked()), this, SLOT(updateCommunicationChannel()));
     connect(m_codaRadioButton, SIGNAL(clicked()), this, SLOT(updateCommunicationChannel()));
+    connect(m_codaInfoLabel, SIGNAL(linkActivated(QString)),
+            Core::HelpManager::instance(), SLOT(handleHelpRequest(QString)));
 
     formLayout->addRow(debugClientGroupBox);
 
@@ -239,6 +251,9 @@ void S60DeployConfigurationWidget::init(ProjectExplorer::DeployConfiguration *dc
             this, SLOT(updateInstallationDrives()));
     connect(this, SIGNAL(infoCollected()),
             this, SLOT(collectingInfoFinished()));
+
+    m_codaTimeout->setSingleShot(true);
+    connect(m_codaTimeout, SIGNAL(timeout()), this, SLOT(codaTimeout()));
 }
 
 QWidget *S60DeployConfigurationWidget::createCommunicationChannel()
@@ -274,8 +289,8 @@ QWidget *S60DeployConfigurationWidget::createCommunicationChannel()
 
     if(!m_deployConfiguration->deviceAddress().isEmpty())
         m_ipAddress->setText(QString("%1:%2")
-                         .arg(m_deployConfiguration->deviceAddress())
-                         .arg(m_deployConfiguration->devicePort()));
+                             .arg(m_deployConfiguration->deviceAddress())
+                             .arg(m_deployConfiguration->devicePort()));
 
     QHBoxLayout *wlanChannelLayout = new QHBoxLayout();
     wlanChannelLayout->addWidget(new QLabel(tr("Address:")));
@@ -473,7 +488,7 @@ void S60DeployConfigurationWidget::slotLauncherStateChanged(int s)
         connect(mb, SIGNAL(finished(int)), this, SLOT(slotWaitingForTrkClosed()));
         mb->open();
     }
-        break;
+    break;
     case trk::Launcher::DeviceDescriptionReceived: // All ok, done
         setDeviceInfoLabel(m_infoLauncher->deviceDescription());
         m_deviceInfoButton->setEnabled(true);
@@ -544,6 +559,7 @@ void S60DeployConfigurationWidget::updateDeviceInfo()
         //TODO error handling - for now just throw the command at coda
         m_codaInfoDevice->sendSymbianOsDataGetQtVersionCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getQtVersionCommandResult));
         m_deviceInfoButton->setEnabled(false);
+        m_codaTimeout->start(1000);
     } else if(m_deployConfiguration->communicationChannel() == S60DeployConfiguration::CommunicationCodaTcpConnection) {
         // collectingInfoFinished, which deletes m_codaDevice, can get called from within a coda callback, so need to use deleteLater
         m_codaInfoDevice =  QSharedPointer<Coda::CodaDevice>(new Coda::CodaDevice, &QObject::deleteLater);
@@ -554,6 +570,7 @@ void S60DeployConfigurationWidget::updateDeviceInfo()
         codaSocket->connectToHost(m_deployConfiguration->deviceAddress(),
                                   m_deployConfiguration->devicePort().toInt());
         m_deviceInfoButton->setEnabled(false);
+        m_codaTimeout->start(1500);
     } else
         setDeviceInfoLabel(tr("Currently there is no information about the device for this connection type."), true);
 }
@@ -562,7 +579,7 @@ void S60DeployConfigurationWidget::codaEvent(const Coda::CodaEvent &event)
 {
     switch (event.type()) {
     case Coda::CodaEvent::LocatorHello: // Commands accepted now
-        setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
+        codaIncreaseProgress();
         m_codaInfoDevice->sendSymbianOsDataGetQtVersionCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getQtVersionCommandResult));
         break;
     default:
@@ -570,112 +587,112 @@ void S60DeployConfigurationWidget::codaEvent(const Coda::CodaEvent &event)
     }
 }
 
- void S60DeployConfigurationWidget::getQtVersionCommandResult(const Coda::CodaCommandResult &result)
- {
-     setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
-     m_deviceInfo.clear();
-     if (result.type == Coda::CodaCommandResult::FailReply) {
-         setDeviceInfoLabel(tr("No device information available"), true);
-         SymbianUtils::SymbianDeviceManager::instance()->releaseCodaDevice(m_codaInfoDevice);
-         m_deviceInfoButton->setEnabled(true);
-         return;
-     } else if (result.type == Coda::CodaCommandResult::CommandErrorReply){
-         startTable(m_deviceInfo);
-         QTextStream str(&m_deviceInfo);
-         addErrorToTable(str, tr("Qt version: "), tr("Not installed on device"));
-         finishTable(m_deviceInfo);
-         setDeviceInfoLabel(m_deviceInfo, false);
-     } else {
-         if (result.values.count()) {
-             QHash<QString, QVariant> obj = result.values[0].toVariant().toHash();
-             QString ver = obj.value("qVersion").toString();
-
-             startTable(m_deviceInfo);
-             QTextStream str(&m_deviceInfo);
-             addToTable(str, tr("Qt version:"), ver);
-             QString systemVersion;
-
-             int symVer = obj.value("symbianVersion").toInt();
-             // Ugh why won't QSysInfo define these on non-symbian builds...
-             switch (symVer) {
-             case 10:
-                 systemVersion.append("Symbian OS v9.2");
-                 break;
-             case 20:
-                 systemVersion.append("Symbian OS v9.3");
-                 break;
-             case 30:
-                 systemVersion.append("Symbian OS v9.4 / Symbian^1");
-                 break;
-             case 40:
-                 systemVersion.append("Symbian^2");
-                 break;
-             case 50:
-                 systemVersion.append("Symbian^3");
-                 break;
-             case 60:
-                 systemVersion.append("Symbian^4");
-                 break;
-             default:
-                 systemVersion.append(tr("Unrecognised Symbian version 0x%1").arg(symVer, 0, 16));
-                 break;
-             }
-             systemVersion.append(", ");
-             int s60Ver = obj.value("s60Version").toInt();
-             switch (s60Ver) {
-             case 10:
-                 systemVersion.append("S60 3rd Edition Feature Pack 1");
-                 break;
-             case 20:
-                 systemVersion.append("S60 3rd Edition Feature Pack 2");
-                 break;
-             case 30:
-                 systemVersion.append("S60 5th Edition");
-                 break;
-             case 40:
-                 systemVersion.append("S60 5th Edition Feature Pack 1");
-                 break;
-             case 50:
-                 systemVersion.append("S60 5th Edition Feature Pack 2");
-                 break;
-             default:
-                 systemVersion.append(tr("Unrecognised S60 version 0x%1").arg(symVer, 0, 16));
-                 break;
-             }
-             addToTable(str, tr("OS version:"), systemVersion);
-             finishTable(m_deviceInfo);
-         }
-     }
-     m_codaInfoDevice->sendSymbianOsDataGetRomInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getRomInfoResult));
- }
-
- void S60DeployConfigurationWidget::getRomInfoResult(const Coda::CodaCommandResult &result)
- {
-     setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
-     if (result.type == Coda::CodaCommandResult::SuccessReply && result.values.count()) {
-         startTable(m_deviceInfo);
-         QTextStream str(&m_deviceInfo);
-
-         QVariantHash obj = result.values[0].toVariant().toHash();
-         QString romVersion = obj.value("romVersion", tr("unknown")).toString();
-         romVersion.replace('\n', " "); // The ROM string is split across multiple lines, for some reason.
-         addToTable(str, tr("ROM version:"), romVersion);
-
-         QString pr = obj.value("prInfo").toString();
-         if (pr.length())
-             addToTable(str, tr("Release:"), pr);
-         finishTable(m_deviceInfo);
-     }
-
-     QList<quint32> packagesOfInterest;
-     packagesOfInterest.append(CODA_UID);
-     packagesOfInterest.append(QTMOBILITY_UID);
-     m_codaInfoDevice->sendSymbianInstallGetPackageInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getInstalledPackagesResult), packagesOfInterest);
- }
+void S60DeployConfigurationWidget::getQtVersionCommandResult(const Coda::CodaCommandResult &result)
+{
+    codaIncreaseProgress();
+    m_deviceInfo.clear();
+    if (result.type == Coda::CodaCommandResult::FailReply) {
+        setDeviceInfoLabel(tr("No device information available"), true);
+        SymbianUtils::SymbianDeviceManager::instance()->releaseCodaDevice(m_codaInfoDevice);
+        m_deviceInfoButton->setEnabled(true);
+        return;
+    } else if (result.type == Coda::CodaCommandResult::CommandErrorReply){
+        startTable(m_deviceInfo);
+        QTextStream str(&m_deviceInfo);
+        addErrorToTable(str, tr("Qt version: "), tr("Not installed on device"));
+        finishTable(m_deviceInfo);
+        setDeviceInfoLabel(m_deviceInfo, false);
+    } else {
+        if (result.values.count()) {
+            QHash<QString, QVariant> obj = result.values[0].toVariant().toHash();
+            QString ver = obj.value("qVersion").toString();
+
+            startTable(m_deviceInfo);
+            QTextStream str(&m_deviceInfo);
+            addToTable(str, tr("Qt version:"), ver);
+            QString systemVersion;
+
+            int symVer = obj.value("symbianVersion").toInt();
+            // Ugh why won't QSysInfo define these on non-symbian builds...
+            switch (symVer) {
+            case 10:
+                systemVersion.append("Symbian OS v9.2");
+                break;
+            case 20:
+                systemVersion.append("Symbian OS v9.3");
+                break;
+            case 30:
+                systemVersion.append("Symbian OS v9.4 / Symbian^1");
+                break;
+            case 40:
+                systemVersion.append("Symbian^2");
+                break;
+            case 50:
+                systemVersion.append("Symbian^3");
+                break;
+            case 60:
+                systemVersion.append("Symbian^4");
+                break;
+            default:
+                systemVersion.append(tr("Unrecognised Symbian version 0x%1").arg(symVer, 0, 16));
+                break;
+            }
+            systemVersion.append(", ");
+            int s60Ver = obj.value("s60Version").toInt();
+            switch (s60Ver) {
+            case 10:
+                systemVersion.append("S60 3rd Edition Feature Pack 1");
+                break;
+            case 20:
+                systemVersion.append("S60 3rd Edition Feature Pack 2");
+                break;
+            case 30:
+                systemVersion.append("S60 5th Edition");
+                break;
+            case 40:
+                systemVersion.append("S60 5th Edition Feature Pack 1");
+                break;
+            case 50:
+                systemVersion.append("S60 5th Edition Feature Pack 2");
+                break;
+            default:
+                systemVersion.append(tr("Unrecognised S60 version 0x%1").arg(symVer, 0, 16));
+                break;
+            }
+            addToTable(str, tr("OS version:"), systemVersion);
+            finishTable(m_deviceInfo);
+        }
+    }
+    m_codaInfoDevice->sendSymbianOsDataGetRomInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getRomInfoResult));
+}
+
+void S60DeployConfigurationWidget::getRomInfoResult(const Coda::CodaCommandResult &result)
+{
+    codaIncreaseProgress();
+    if (result.type == Coda::CodaCommandResult::SuccessReply && result.values.count()) {
+        startTable(m_deviceInfo);
+        QTextStream str(&m_deviceInfo);
+
+        QVariantHash obj = result.values[0].toVariant().toHash();
+        QString romVersion = obj.value("romVersion", tr("unknown")).toString();
+        romVersion.replace('\n', " "); // The ROM string is split across multiple lines, for some reason.
+        addToTable(str, tr("ROM version:"), romVersion);
+
+        QString pr = obj.value("prInfo").toString();
+        if (pr.length())
+            addToTable(str, tr("Release:"), pr);
+        finishTable(m_deviceInfo);
+    }
+
+    QList<quint32> packagesOfInterest;
+    packagesOfInterest.append(CODA_UID);
+    packagesOfInterest.append(QTMOBILITY_UID);
+    m_codaInfoDevice->sendSymbianInstallGetPackageInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getInstalledPackagesResult), packagesOfInterest);
+}
 
 void S60DeployConfigurationWidget::getInstalledPackagesResult(const Coda::CodaCommandResult &result)
 {
-    setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
+    codaIncreaseProgress();
     if (result.type == Coda::CodaCommandResult::SuccessReply && result.values.count()) {
         startTable(m_deviceInfo);
         QTextStream str(&m_deviceInfo);
@@ -686,32 +703,32 @@ void S60DeployConfigurationWidget::getInstalledPackagesResult(const Coda::CodaCo
             bool ok = false;
             uint uid = obj.value("uid").toString().toUInt(&ok, 16);
             if (ok) {
-               bool error = !obj.value("error").isNull();
-               QString versionString;
-               if (!error) {
-                   QVariantList version = obj.value("version").toList();
-                   versionString = QString("%1.%2.%3").arg(version[0].toInt())
-                           .arg(version[1].toInt())
-                           .arg(version[2].toInt());
-               }
-               switch (uid) {
-               case CODA_UID: {
-                   if (error) {
-                       // How can coda not be installed? Presumably some UID wrongness...
-                       addErrorToTable(str, tr("CODA version: "), tr("Error reading CODA version"));
-                   } else
-                       addToTable(str, tr("CODA version: "), versionString);
-               }
-               break;
-               case QTMOBILITY_UID: {
-                   if (error)
-                       addErrorToTable(str, tr("QtMobility version: "), tr("Error reading QtMobility version"));
-                   else
-                       addToTable(str, tr("QtMobility version: "), versionString);
-               }
-               break;
-               default: break;
-               }
+                bool error = !obj.value("error").isNull();
+                QString versionString;
+                if (!error) {
+                    QVariantList version = obj.value("version").toList();
+                    versionString = QString("%1.%2.%3").arg(version[0].toInt())
+                            .arg(version[1].toInt())
+                            .arg(version[2].toInt());
+                }
+                switch (uid) {
+                case CODA_UID: {
+                    if (error) {
+                        // How can coda not be installed? Presumably some UID wrongness...
+                        addErrorToTable(str, tr("CODA version: "), tr("Error reading CODA version"));
+                    } else
+                        addToTable(str, tr("CODA version: "), versionString);
+                }
+                break;
+                case QTMOBILITY_UID: {
+                    if (error)
+                        addErrorToTable(str, tr("QtMobility version: "), tr("Error reading QtMobility version"));
+                    else
+                        addToTable(str, tr("QtMobility version: "), versionString);
+                }
+                break;
+                default: break;
+                }
             }
         }
         finishTable(m_deviceInfo);
@@ -724,38 +741,61 @@ void S60DeployConfigurationWidget::getInstalledPackagesResult(const Coda::CodaCo
     m_codaInfoDevice->sendSymbianOsDataGetHalInfoCommand(Coda::CodaCallback(this, &S60DeployConfigurationWidget::getHalResult), keys);
 }
 
- void S60DeployConfigurationWidget::getHalResult(const Coda::CodaCommandResult &result)
- {
-     setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
-     if (result.type == Coda::CodaCommandResult::SuccessReply && result.values.count()) {
-         QVariantList resultsList = result.values[0].toVariant().toList();
-         int x = 0;
-         int y = 0;
-         foreach (const QVariant& var, resultsList) {
-             QVariantHash obj = var.toHash();
-             if (obj.value("name").toString() == "EDisplayXPixels")
-                 x = obj.value("value").toInt();
-             else if (obj.value("name").toString() == "EDisplayYPixels")
-                 y = obj.value("value").toInt();
-         }
-         if (x && y) {
-             startTable(m_deviceInfo);
-             QTextStream str(&m_deviceInfo);
-             addToTable(str, tr("Screen size:"), QString("%1x%2").arg(x).arg(y));
-             finishTable(m_deviceInfo);
-         }
-     }
-
-     // Done with collecting info
-     emit infoCollected();
- }
-
- void S60DeployConfigurationWidget::collectingInfoFinished()
- {
-     m_deviceInfoButton->setEnabled(true);
-     setDeviceInfoLabel(m_deviceInfo);
-     SymbianUtils::SymbianDeviceManager::instance()->releaseCodaDevice(m_codaInfoDevice);
- }
+void S60DeployConfigurationWidget::getHalResult(const Coda::CodaCommandResult &result)
+{
+    codaIncreaseProgress();
+    if (result.type == Coda::CodaCommandResult::SuccessReply && result.values.count()) {
+        QVariantList resultsList = result.values[0].toVariant().toList();
+        int x = 0;
+        int y = 0;
+        foreach (const QVariant& var, resultsList) {
+            QVariantHash obj = var.toHash();
+            if (obj.value("name").toString() == "EDisplayXPixels")
+                x = obj.value("value").toInt();
+            else if (obj.value("name").toString() == "EDisplayYPixels")
+                y = obj.value("value").toInt();
+        }
+        if (x && y) {
+            startTable(m_deviceInfo);
+            QTextStream str(&m_deviceInfo);
+            addToTable(str, tr("Screen size:"), QString("%1x%2").arg(x).arg(y));
+            finishTable(m_deviceInfo);
+        }
+    }
+
+    // Done with collecting info
+    emit infoCollected();
+}
+
+void S60DeployConfigurationWidget::codaIncreaseProgress()
+{
+    m_codaTimeout->start();
+    setDeviceInfoLabel(m_deviceInfoLabel->text() + '.');
+}
+
+void S60DeployConfigurationWidget::collectingInfoFinished()
+{
+    m_codaTimeout->stop();
+    emit codaConnected();
+    m_deviceInfoButton->setEnabled(true);
+    setDeviceInfoLabel(m_deviceInfo);
+    SymbianUtils::SymbianDeviceManager::instance()->releaseCodaDevice(m_codaInfoDevice);
+}
+
+void S60DeployConfigurationWidget::codaTimeout()
+{
+    QMessageBox *mb = CodaRunControl::createCodaWaitingMessageBox(this);
+    connect(this, SIGNAL(codaConnected()), mb, SLOT(close()));
+    connect(mb, SIGNAL(finished(int)), this, SLOT(codaCanceled()));
+    mb->open();
+}
+
+void S60DeployConfigurationWidget::codaCanceled()
+{
+    clearDeviceInfo();
+    m_deviceInfoButton->setEnabled(true);
+    SymbianUtils::SymbianDeviceManager::instance()->releaseCodaDevice(m_codaInfoDevice);
+}
 
 } // namespace Internal
 } // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.h
index 1006b749df873c4b3aadba936a466bd6298be3ce..d80479db6e2b6dce7d3e6b2c92c2506ff808e633 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfigurationwidget.h
@@ -86,6 +86,7 @@ public:
 
 signals:
     void infoCollected();
+    void codaConnected();
 
 private slots:
     void updateTargetInformation();
@@ -103,6 +104,9 @@ private slots:
     void cleanWlanAddress();
     void codaEvent(const Coda::CodaEvent &event);
     void collectingInfoFinished();
+    void codaTimeout();
+    void codaCanceled();
+    void codaIncreaseProgress();
 
 private:
     inline SymbianUtils::SymbianDevice device(int i) const;
@@ -132,8 +136,10 @@ private:
     Utils::IpAddressLineEdit *m_ipAddress;
     QRadioButton *m_trkRadioButton;
     QRadioButton *m_codaRadioButton;
+    QLabel *m_codaInfoLabel;
     QSharedPointer<Coda::CodaDevice> m_codaInfoDevice;
     QString m_deviceInfo;
+    QTimer *m_codaTimeout;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp
index 93e5feb76251824ca2675c500ad733113b678d63..efd08e525b60c03f5dc306da5a945b588c25c86d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60publisherovi.cpp
@@ -264,9 +264,9 @@ void S60PublisherOvi::updateProFile(const QString &var, const QString &values)
         return;
     }
 
-    //todo: after ossi has added scope profile writing, make sure the following works
-    //QString scope("symbian");
-    ProWriter::addVarValues(profile, &lines, m_qt4project->rootProjectNode()->path(), QStringList() << values, var);
+    ProWriter::putVarValues(profile, &lines, QStringList() << values, var,
+                            ProWriter::ReplaceValues | ProWriter::OneLine | ProWriter::AssignOperator,
+                            "symbian");
 
     if (qfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
         qfile.write(lines.join("\n").toLocal8Bit());
diff --git a/src/plugins/valgrindtoolbase/valgrindconfigwidget.cpp b/src/plugins/valgrindtoolbase/valgrindconfigwidget.cpp
index 3c13f79fa7e48f6f6c1e39780cf5ec1e30ad4f4a..08f4e051ba5f9abaa4740f464c47730003ee43dc 100644
--- a/src/plugins/valgrindtoolbase/valgrindconfigwidget.cpp
+++ b/src/plugins/valgrindtoolbase/valgrindconfigwidget.cpp
@@ -39,7 +39,7 @@
 
 #include "valgrindsettings.h"
 
-#include <QDebug>
+#include <QtCore/QDebug>
 
 using namespace Analyzer::Internal;
 
diff --git a/src/plugins/valgrindtoolbase/valgrindconfigwidget.h b/src/plugins/valgrindtoolbase/valgrindconfigwidget.h
index 891f7f8fbabc2cf2d1ae06ea1a4687351d5bbf86..0d95c5eb588b7f6709800dbad22dac9743790e16 100644
--- a/src/plugins/valgrindtoolbase/valgrindconfigwidget.h
+++ b/src/plugins/valgrindtoolbase/valgrindconfigwidget.h
@@ -37,7 +37,7 @@
 #ifndef ANALYZER_INTERNAL_VALGRINDCONFIGWIDGET_H
 #define ANALYZER_INTERNAL_VALGRINDCONFIGWIDGET_H
 
-#include <QWidget>
+#include <QtGui/QWidget>
 
 QT_BEGIN_NAMESPACE
 namespace Ui {
diff --git a/src/plugins/valgrindtoolbase/valgrindengine.h b/src/plugins/valgrindtoolbase/valgrindengine.h
index d56044d2e3feb75241ef35ee1edf08abbb376674..ff9cdac264f66ac2fe52a2f3c6338b589a36ff49 100644
--- a/src/plugins/valgrindtoolbase/valgrindengine.h
+++ b/src/plugins/valgrindtoolbase/valgrindengine.h
@@ -44,9 +44,9 @@
 
 #include <valgrind/valgrindrunner.h>
 
-#include <QString>
-#include <QByteArray>
-#include <QFutureInterface>
+#include <QtCore/QString>
+#include <QtCore/QByteArray>
+#include <QtCore/QFutureInterface>
 
 namespace Analyzer {
 
diff --git a/src/plugins/valgrindtoolbase/valgrindsettings.cpp b/src/plugins/valgrindtoolbase/valgrindsettings.cpp
index 93f5088975801b44a0b6deeb3bb9ab49a7c20141..090e1a48bb434f51cb57fdc43d133bd151bbd2a9 100644
--- a/src/plugins/valgrindtoolbase/valgrindsettings.cpp
+++ b/src/plugins/valgrindtoolbase/valgrindsettings.cpp
@@ -40,7 +40,7 @@
 #include <coreplugin/icore.h>
 #include <utils/qtcassert.h>
 
-#include <QSettings>
+#include <QtCore/QSettings>
 
 using namespace Analyzer::Internal;
 using namespace Analyzer;
diff --git a/src/plugins/valgrindtoolbase/valgrindsettings.h b/src/plugins/valgrindtoolbase/valgrindsettings.h
index f857605f41d3393127a9bfd6c0f6b8608ac0dfdd..3eb1363981f1f0a09bf1bd3eb1b6e85200f61ff6 100644
--- a/src/plugins/valgrindtoolbase/valgrindsettings.h
+++ b/src/plugins/valgrindtoolbase/valgrindsettings.h
@@ -40,8 +40,8 @@
 
 #include "valgrindtoolbase_global.h"
 
-#include <QObject>
-#include <QVariant>
+#include <QtCore/QObject>
+#include <QtCore/QVariant>
 
 namespace Analyzer {
 namespace Internal {
diff --git a/src/plugins/valgrindtoolbase/valgrindtoolbaseplugin.cpp b/src/plugins/valgrindtoolbase/valgrindtoolbaseplugin.cpp
index bdf546b96205176a5f47db4f5fb8c545cd606cf8..d09100d43975ff754e613d2a896e0a08ada02c96 100644
--- a/src/plugins/valgrindtoolbase/valgrindtoolbaseplugin.cpp
+++ b/src/plugins/valgrindtoolbase/valgrindtoolbaseplugin.cpp
@@ -39,8 +39,8 @@
 
 #include <analyzerbase/analyzersettings.h>
 
-#include <QStringList>
-#include <QtPlugin>
+#include <QtCore/QStringList>
+#include <QtCore/QtPlugin>
 
 using namespace Analyzer;
 using namespace Analyzer::Internal;
@@ -68,4 +68,4 @@ void ValgrindToolbasePlugin::extensionsInitialized()
 
 }
 
-Q_EXPORT_PLUGIN(ValgrindToolbasePlugin)
\ No newline at end of file
+Q_EXPORT_PLUGIN(ValgrindToolbasePlugin)
diff --git a/src/shared/proparser/profileparser.cpp b/src/shared/proparser/profileparser.cpp
index eb131ffd4561c1d7e705a3add982e847e18cee14..3b3e700c8c73b4c4828667f4b59746da241fe094 100644
--- a/src/shared/proparser/profileparser.cpp
+++ b/src/shared/proparser/profileparser.cpp
@@ -384,6 +384,8 @@ bool ProFileParser::read(ProFile *pro, const QString &in)
                     }
                 }
                 if (end == cur) { // Line with only a comment (sans whitespace)
+                    if (m_markLine == m_lineNo)
+                        m_markLine++;
                     // Qmake bizarreness: such lines do not affect line continuations
                     goto ignore;
                 }
diff --git a/src/shared/proparser/prowriter.cpp b/src/shared/proparser/prowriter.cpp
index 7831991ae52d5c9d3db9dc699adc8fd473d047d4..2edbddbb935cd061acaeacb7ec4dd479fdfc494a 100644
--- a/src/shared/proparser/prowriter.cpp
+++ b/src/shared/proparser/prowriter.cpp
@@ -174,62 +174,132 @@ static const ushort *skipToken(ushort tok, const ushort *&tokPtr, int &lineNo)
     return 0;
 }
 
-void ProWriter::addVarValues(ProFile *profile, QStringList *lines,
-    const QDir &proFileDir, const QStringList &values, const QString &var,
-    bool valuesAreFiles)
+bool ProWriter::locateVarValues(const ushort *tokPtr,
+    const QString &scope, const QString &var, int *scopeStart, int *bestLine)
 {
-    QStringList valuesToWrite;
-    if (valuesAreFiles) {
-        foreach (const QString &v, values)
-            valuesToWrite << proFileDir.relativeFilePath(v);
-    } else {
-        valuesToWrite = values;
-    }
-
-    // Check if variable item exists as child of root item
-    const ushort *tokPtr = profile->tokPtr();
-    int lineNo = 0;
+    const bool inScope = scope.isEmpty();
+    int lineNo = *scopeStart + 1;
     QString tmp;
     const ushort *lastXpr = 0;
+    bool fresh = true;
     while (ushort tok = *tokPtr++) {
-        if (tok == TokAssign || tok == TokAppend || tok == TokAppendUnique) {
+        if (inScope && (tok == TokAssign || tok == TokAppend || tok == TokAppendUnique)) {
             if (getLiteral(lastXpr, tokPtr - 1, tmp) && var == tmp) {
-                for (--lineNo; lineNo < lines->count(); lineNo++) {
-                    QString line = lines->at(lineNo);
-                    int idx = line.indexOf(QLatin1Char('#'));
-                    if (idx >= 0)
-                        line.truncate(idx);
-                    while (line.endsWith(QLatin1Char(' ')) || line.endsWith(QLatin1Char('\t')))
-                        line.chop(1);
-                    if (line.isEmpty()) {
-                        if (idx >= 0)
-                            continue;
-                        break;
-                    }
-                    if (!line.endsWith(QLatin1Char('\\'))) {
-                        (*lines)[lineNo].insert(line.length(), QLatin1String(" \\"));
-                        lineNo++;
-                        break;
-                    }
-                }
-                QString added;
-                foreach (const QString &v, valuesToWrite)
-                    added += QLatin1String("    ") + v + QLatin1String(" \\\n");
-                added.chop(3);
-                lines->insert(lineNo, added);
-                return;
+                *bestLine = lineNo - 1;
+                return true;
             }
             skipExpression(++tokPtr, lineNo);
+            fresh = true;
         } else {
-            lastXpr = skipToken(tok, tokPtr, lineNo);
+            if (!inScope && tok == TokCondition && *tokPtr == TokBranch
+                && getLiteral(lastXpr, tokPtr - 1, tmp) && scope == tmp) {
+                *scopeStart = lineNo - 1;
+                if (locateVarValues(tokPtr + 3, QString(), var, scopeStart, bestLine))
+                    return true;
+            }
+            const ushort *oTokPtr = skipToken(tok, tokPtr, lineNo);
+            if (tok != TokLine) {
+                if (oTokPtr) {
+                    if (fresh)
+                        lastXpr = oTokPtr;
+                } else if (tok == TokNot || tok == TokAnd || tok == TokOr) {
+                    fresh = false;
+                } else {
+                    fresh = true;
+                }
+            }
+        }
+    }
+    if (inScope || *scopeStart < 0)
+        *bestLine = qMax(lineNo - 1, 0);
+    return false;
+}
+
+static int skipContLines(QStringList *lines, int lineNo, bool addCont)
+{
+    for (; lineNo < lines->count(); lineNo++) {
+        QString line = lines->at(lineNo);
+        int idx = line.indexOf(QLatin1Char('#'));
+        if (idx >= 0)
+            line.truncate(idx);
+        while (line.endsWith(QLatin1Char(' ')) || line.endsWith(QLatin1Char('\t')))
+            line.chop(1);
+        if (line.isEmpty()) {
+            if (idx >= 0)
+                continue;
+            break;
+        }
+        if (!line.endsWith(QLatin1Char('\\'))) {
+            if (addCont)
+                (*lines)[lineNo].insert(line.length(), QLatin1String(" \\"));
+            lineNo++;
+            break;
+        }
+    }
+    return lineNo;
+}
+
+void ProWriter::putVarValues(ProFile *profile, QStringList *lines,
+    const QStringList &values, const QString &var, PutFlags flags, const QString &scope)
+{
+    QString indent = scope.isEmpty() ? QString() : QLatin1String("    ");
+    int scopeStart = -1, lineNo;
+    if (locateVarValues(profile->tokPtr(), scope, var, &scopeStart, &lineNo)) {
+        if (flags & ReplaceValues) {
+            // remove continuation lines with old values
+            int lNo = skipContLines(lines, lineNo, false);
+            lines->erase(lines->begin() + lineNo + 1, lines->begin() + lNo);
+            // remove rest of the line
+            QString &line = (*lines)[lineNo];
+            int eqs = line.indexOf(QLatin1Char('='));
+            if (eqs >= 0) // If this is not true, we mess up the file a bit.
+                line.truncate(eqs + 1);
+            // put new values
+            foreach (const QString &v, values)
+                line += ((flags & MultiLine) ? QLatin1String(" \\\n    ") + indent : QString::fromLatin1(" ")) + v;
+        } else {
+            lineNo = skipContLines(lines, lineNo, true);
+            QString added;
+            foreach (const QString &v, values)
+                added += QLatin1String("    ") + indent + v + QLatin1String(" \\\n");
+            added.chop(3);
+            lines->insert(lineNo, added);
         }
+    } else {
+        // Create & append new variable item
+        QString added;
+        if (!scope.isEmpty()) {
+            if (scopeStart < 0) {
+                added = QLatin1Char('\n') + scope + QLatin1String(" {");
+            } else {
+                QRegExp rx(QLatin1String("(\\s*") + scope + QLatin1String("\\s*:\\s*).*"));
+                if (rx.exactMatch(lines->at(scopeStart))) {
+                    (*lines)[scopeStart].replace(0, rx.cap(1).length(),
+                                                 QString(scope + QLatin1String(" {\n    ")));
+                    scopeStart = -1;
+                }
+            }
+        }
+        int lNo = skipContLines(lines, lineNo, false);
+        if (lNo != scopeStart + 1)
+            added += QLatin1Char('\n');
+        added += indent + var + QLatin1String((flags & AppendOperator) ? " +=" : " =");
+        foreach (const QString &v, values)
+            added += ((flags & MultiLine) ? QLatin1String(" \\\n    ") + indent : QString::fromLatin1(" ")) + v;
+        if (!scope.isEmpty() && scopeStart < 0)
+            added += QLatin1String("\n}");
+        lines->insert(lNo, added);
     }
+}
+
+void ProWriter::addFiles(ProFile *profile, QStringList *lines,
+    const QDir &proFileDir, const QStringList &values, const QString &var)
+{
+    QStringList valuesToWrite;
+    foreach (const QString &v, values)
+        valuesToWrite << proFileDir.relativeFilePath(v);
 
-    // Create & append new variable item
-    QString added = QLatin1Char('\n') + var + QLatin1String(" +=");
-    foreach (const QString &v, valuesToWrite)
-        added += QLatin1String(" \\\n    ") + v;
-    *lines << added;
+    putVarValues(profile, lines, valuesToWrite, var, AppendValues | MultiLine | AppendOperator);
 }
 
 static void findProVariables(const ushort *tokPtr, const QStringList &vars,
@@ -256,25 +326,17 @@ static void findProVariables(const ushort *tokPtr, const QStringList &vars,
     }
 }
 
-QStringList ProWriter::removeVarValues(ProFile *profile, QStringList *lines,
-    const QDir &proFileDir, const QStringList &values, const QStringList &vars,
-    bool valuesAreFiles)
+QList<int> ProWriter::removeVarValues(ProFile *profile, QStringList *lines,
+    const QStringList &values, const QStringList &vars)
 {
-    QStringList notChanged = values;
+    QList<int> notChanged;
+    // yeah, this is a bit silly
+    for (int i = 0; i < values.size(); i++)
+        notChanged << i;
 
     QList<int> varLines;
     findProVariables(profile->tokPtr(), vars, &varLines);
 
-    QStringList valuesToFind;
-    if (valuesAreFiles) {
-        // This is a tad stupid - basically, it can remove only entries which
-        // the above code added.
-        foreach (const QString &absoluteFilePath, values)
-            valuesToFind << proFileDir.relativeFilePath(absoluteFilePath);
-    } else {
-        valuesToFind = values;
-    }
-
     // This code expects proVars to be sorted by the variables' appearance in the file.
     int delta = 1;
     foreach (int ln, varLines) {
@@ -326,9 +388,9 @@ QStringList ProWriter::removeVarValues(ProFile *profile, QStringList *lines,
                        colNo++;
                    }
                    const QString fn = line.mid(varCol, colNo - varCol);
-                   const int pos = valuesToFind.indexOf(fn);
+                   const int pos = values.indexOf(fn);
                    if (pos != -1) {
-                       notChanged.removeOne(values.at(pos));
+                       notChanged.removeOne(pos);
                        if (colNo < lineLen)
                            colNo++;
                        else if (varCol)
@@ -380,3 +442,18 @@ QStringList ProWriter::removeVarValues(ProFile *profile, QStringList *lines,
     }
     return notChanged;
 }
+
+QStringList ProWriter::removeFiles(ProFile *profile, QStringList *lines,
+    const QDir &proFileDir, const QStringList &values, const QStringList &vars)
+{
+    // This is a tad stupid - basically, it can remove only entries which
+    // the above code added.
+    QStringList valuesToFind;
+    foreach (const QString &absoluteFilePath, values)
+        valuesToFind << proFileDir.relativeFilePath(absoluteFilePath);
+
+    QStringList notChanged;
+    foreach (int i, removeVarValues(profile, lines, valuesToFind, vars))
+        notChanged.append(values.at(i));
+    return notChanged;
+}
diff --git a/src/shared/proparser/prowriter.h b/src/shared/proparser/prowriter.h
index 5aacf6a16c42663e74d819789def06413274057e..c6ab1591847f2499a1bf75b3a99622fd1f3152ca 100644
--- a/src/shared/proparser/prowriter.h
+++ b/src/shared/proparser/prowriter.h
@@ -49,43 +49,34 @@ namespace Internal {
 class ProWriter
 {
 public:
-    static void addFiles(ProFile *profile, QStringList *lines,
-         const QDir &proFileDir, const QStringList &filePaths, const QString &var)
-    {
-        addVarValues(profile, lines, proFileDir, filePaths, var, true);
-    }
-
-    static QStringList removeFiles(ProFile *profile, QStringList *lines,
-        const QDir &proFileDir, const QStringList &filePaths,
-        const QStringList &vars)
-    {
-        return removeVarValues(profile, lines, proFileDir, filePaths, vars, true);
-    }
+    enum PutFlag {
+        AppendValues = 0,
+        ReplaceValues = 1,
+        OneLine = 0, // this works only when replacing (or adding a new assignment)
+        MultiLine = 2,
+        AssignOperator = 0, // ignored when changing an existing assignment
+        AppendOperator = 4
+    };
+    Q_DECLARE_FLAGS(PutFlags, PutFlag)
 
-    static void addVarValues(ProFile *profile, QStringList *lines,
-        const QDir &proFileDir, const QStringList &values, const QString &var)
-    {
-        addVarValues(profile, lines, proFileDir, values, var, false);
-    }
+    static void putVarValues(ProFile *profile, QStringList *lines,
+        const QStringList &values, const QString &var, PutFlags flags,
+        const QString &scope = QString());
+    static QList<int> removeVarValues(ProFile *profile, QStringList *lines,
+        const QStringList &values, const QStringList &vars);
 
-    static QStringList removeVarValues(ProFile *profile, QStringList *lines,
-        const QDir &proFileDir, const QStringList &values,
-        const QStringList &vars)
-    {
-        return removeVarValues(profile, lines, proFileDir, values, vars, false);
-    }
+    static void addFiles(ProFile *profile, QStringList *lines,
+         const QDir &proFileDir, const QStringList &filePaths, const QString &var);
+    static QStringList removeFiles(ProFile *profile, QStringList *lines,
+        const QDir &proFileDir, const QStringList &filePaths, const QStringList &vars);
 
 private:
-
-    static void addVarValues(ProFile *profile, QStringList *lines,
-        const QDir &proFileDir, const QStringList &values, const QString &var,
-        bool valuesAreFiles);
-
-    static QStringList removeVarValues(ProFile *profile, QStringList *lines,
-        const QDir &proFileDir, const QStringList &values,
-        const QStringList &vars, bool valuesAreFiles);
+    static bool locateVarValues(const ushort *tokPtr,
+        const QString &scope, const QString &var, int *scopeStart, int *bestLine);
 };
 
+Q_DECLARE_OPERATORS_FOR_FLAGS(ProWriter::PutFlags)
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
 
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 92fe3c51f1c005fd16fbc154671e425e15d254a3..009cbaf80ede5f5833f3a057a3004a9eaf4a0c26 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -10,7 +10,7 @@ SUBDIRS += \
     fakevim \
     generichighlighter \
 #    icheckbuild \
-#    profilewriter \
+    profilewriter \
     ioutils \
     qtcprocess \
     utils_stringutils \
diff --git a/tests/auto/profilewriter/profilewriter.pro b/tests/auto/profilewriter/profilewriter.pro
index 9a2a551c8a137884cfa562bc5a19b48fd839bf47..8785bc733104d44fd8890fe371ca28e6336d8c76 100644
--- a/tests/auto/profilewriter/profilewriter.pro
+++ b/tests/auto/profilewriter/profilewriter.pro
@@ -1,3 +1,4 @@
+include(../qttest.pri)
 include(../../../src/shared/proparser/proparser.pri)
 
 SOURCES += \
diff --git a/tests/auto/profilewriter/tst_profilewriter.cpp b/tests/auto/profilewriter/tst_profilewriter.cpp
index 0ac3a5acc62616966f8c9b1b47b292e0d3ba4b69..34d0ee70bbdabab9336e93e96937cf454cad5a52 100644
--- a/tests/auto/profilewriter/tst_profilewriter.cpp
+++ b/tests/auto/profilewriter/tst_profilewriter.cpp
@@ -31,35 +31,70 @@
 **
 **************************************************************************/
 
-#include "profileevaluator.h"
-#include "prowriter.h"
+#include <profileparser.h>
+#include <prowriter.h>
 
 #include <QtTest/QtTest>
-//#include <QtCore/QSet>
 
 #define BASE_DIR "/some/stuff"
 
+///////////// callbacks for parser/evaluator
+
+static void print(const QString &fileName, int lineNo, const QString &msg)
+{
+    if (lineNo)
+        qWarning("%s(%d): %s", qPrintable(fileName), lineNo, qPrintable(msg));
+    else
+        qWarning("%s", qPrintable(msg));
+}
+
+class ParseHandler : public ProFileParserHandler {
+public:
+    virtual void parseError(const QString &fileName, int lineNo, const QString &msg)
+        { print(fileName, lineNo, msg); }
+};
+
+static ParseHandler parseHandler;
+
+//////////////// the actual autotest
+
+typedef Qt4ProjectManager::Internal::ProWriter PW;
+
 class tst_ProFileWriter : public QObject
 {
     Q_OBJECT
 
 private slots:
-    void edit_data();
-    void edit();
+    void adds_data();
+    void adds();
+    void removes_data();
+    void removes();
     void multiVar();
+    void addFiles();
+    void removeFiles();
 };
 
-void tst_ProFileWriter::edit_data()
+static QStringList strList(const char * const *array)
+{
+    QStringList values;
+    for (const char * const *value = array; *value; value++)
+        values << QString::fromLatin1(*value);
+    return values;
+}
+
+void tst_ProFileWriter::adds_data()
 {
-    QTest::addColumn<bool>("add");
-    QTest::addColumn<QStringList>("files");
+    QTest::addColumn<int>("flags");
+    QTest::addColumn<QStringList>("values");
+    QTest::addColumn<QString>("scope");
     QTest::addColumn<QString>("input");
     QTest::addColumn<QString>("output");
 
     struct Case {
-        bool add;
+        int flags;
         const char *title;
-        const char * const *files;
+        const char * const *values;
+        const char *scope;
         const char *input;
         const char *output;
     };
@@ -67,9 +102,16 @@ void tst_ProFileWriter::edit_data()
     static const char *f_foo[] = { "foo", 0 };
     static const char *f_foo_bar[] = { "foo", "bar", 0 };
     static const Case cases[] = {
-        // Adding entries
         {
-            true, "add new", f_foo,
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add new append multi", f_foo, 0,
+            "",
+            "SOURCES += \\\n"
+            "    foo"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add new append multi after comment", f_foo, 0,
             "# test file",
             "# test file\n"
             "\n"
@@ -77,7 +119,72 @@ void tst_ProFileWriter::edit_data()
             "    foo"
         },
         {
-            true, "add new ignoring scoped", f_foo,
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add new append multi before newlines", f_foo, 0,
+            "\n"
+            "\n"
+            "\n",
+            "SOURCES += \\\n"
+            "    foo\n"
+            "\n"
+            "\n"
+            "\n"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add new append multi after comment before newlines", f_foo, 0,
+            "# test file\n"
+            "\n"
+            "\n"
+            "\n",
+            "# test file\n"
+            "\n"
+            "SOURCES += \\\n"
+            "    foo\n"
+            "\n"
+            "\n"
+            "\n"
+        },
+        {
+            PW::AppendValues|PW::AssignOperator|PW::MultiLine,
+            "add new assign multi", f_foo, 0,
+            "# test file",
+            "# test file\n"
+            "\n"
+            "SOURCES = \\\n"
+            "    foo"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "add new append oneline", f_foo, 0,
+            "# test file",
+            "# test file\n"
+            "\n"
+            "SOURCES += foo"
+        },
+        {
+            PW::AppendValues|PW::AssignOperator|PW::OneLine,
+            "add new assign oneline", f_foo, 0,
+            "# test file",
+            "# test file\n"
+            "\n"
+            "SOURCES = foo"
+        },
+        {
+            PW::AppendValues|PW::AssignOperator|PW::OneLine,
+            "add new assign oneline after existing", f_foo, 0,
+            "# test file\n"
+            "\n"
+            "HEADERS = foo",
+            "# test file\n"
+            "\n"
+            "HEADERS = foo\n"
+            "\n"
+            "SOURCES = foo"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add new ignoring scoped", f_foo, 0,
             "unix:SOURCES = some files",
             "unix:SOURCES = some files\n"
             "\n"
@@ -85,19 +192,22 @@ void tst_ProFileWriter::edit_data()
             "    foo"
         },
         {
-            true, "add to existing", f_foo,
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add to existing (wrong operator)", f_foo, 0,
             "SOURCES = some files",
             "SOURCES = some files \\\n"
             "    foo"
         },
         {
-            true, "add to existing after comment", f_foo,
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add to existing after comment (wrong operator)", f_foo, 0,
             "SOURCES = some files   # comment",
             "SOURCES = some files \\   # comment\n"
             "    foo"
         },
         {
-            true, "add to existing after comment line", f_foo,
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "add to existing after comment line (wrong operator)", f_foo, 0,
             "SOURCES = some \\\n"
             "   # comment\n"
             "    files",
@@ -106,25 +216,223 @@ void tst_ProFileWriter::edit_data()
             "    files \\\n"
             "    foo"
         },
+        {
+            PW::AppendValues|PW::AssignOperator|PW::MultiLine,
+            "add to existing", f_foo, 0,
+            "SOURCES = some files",
+            "SOURCES = some files \\\n"
+            "    foo"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::MultiLine,
+            "replace existing multi", f_foo_bar, 0,
+            "SOURCES = some files",
+            "SOURCES = \\\n"
+            "    foo \\\n"
+            "    bar"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::OneLine,
+            "replace existing oneline", f_foo_bar, 0,
+            "SOURCES = some files",
+            "SOURCES = foo bar"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::OneLine,
+            "replace existing complex last", f_foo_bar, 0,
+            "SOURCES = some \\\n"
+            "   # comment\n"
+            "    files",
+            "SOURCES = foo bar"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::OneLine,
+            "replace existing complex middle 1", f_foo_bar, 0,
+            "SOURCES = some \\\n"
+            "   # comment\n"
+            "    files\n"
+            "HEADERS = blubb",
+            "SOURCES = foo bar\n"
+            "HEADERS = blubb"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::OneLine,
+            "replace existing complex middle 2", f_foo_bar, 0,
+            "SOURCES = some \\\n"
+            "   # comment\n"
+            "    files\n"
+            "\n"
+            "HEADERS = blubb",
+            "SOURCES = foo bar\n"
+            "\n"
+            "HEADERS = blubb"
+        },
+        {
+            PW::ReplaceValues|PW::AssignOperator|PW::OneLine,
+            "replace existing complex middle 3", f_foo_bar, 0,
+            "SOURCES = some \\\n"
+            "   # comment\n"
+            "    files \\\n"
+            "\n"
+            "HEADERS = blubb",
+            "SOURCES = foo bar\n"
+            "\n"
+            "HEADERS = blubb"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "scoped new / new scope", f_foo, "dog",
+            "# test file\n"
+            "SOURCES = yo",
+            "# test file\n"
+            "SOURCES = yo\n"
+            "\n"
+            "dog {\n"
+            "    SOURCES += foo\n"
+            "}"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "scoped new / extend scope", f_foo, "dog",
+            "# test file\n"
+            "dog {\n"
+            "    HEADERS += yo\n"
+            "}",
+            "# test file\n"
+            "dog {\n"
+            "    HEADERS += yo\n"
+            "\n"
+            "    SOURCES += foo\n"
+            "}"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "scoped new / extend elongated scope", f_foo, "dog",
+            "# test file\n"
+            "dog {\n"
+            "    HEADERS += \\\n"
+            "        yo \\\n"
+            "        blubb\n"
+            "}",
+            "# test file\n"
+            "dog {\n"
+            "    HEADERS += \\\n"
+            "        yo \\\n"
+            "        blubb\n"
+            "\n"
+            "    SOURCES += foo\n"
+            "}"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "scoped new / extend empty scope", f_foo, "dog",
+            "# test file\n"
+            "dog {\n"
+            "}",
+            "# test file\n"
+            "dog {\n"
+            "    SOURCES += foo\n"
+            "}"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::OneLine,
+            "scoped new / extend oneline scope", f_foo, "dog",
+            "# test file\n"
+            "dog:HEADERS += yo",
+            "# test file\n"
+            "dog {\n"
+            "    HEADERS += yo\n"
+            "\n"
+            "    SOURCES += foo\n"
+            "}"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "scoped append", f_foo, "dog",
+            "# test file\n"
+            "dog:SOURCES = yo",
+            "# test file\n"
+            "dog:SOURCES = yo \\\n"
+            "        foo"
+        },
+        {
+            PW::AppendValues|PW::AppendOperator|PW::MultiLine,
+            "complex scoped append", f_foo, "dog",
+            "# test file\n"
+            "animal:!dog:SOURCES = yo",
+            "# test file\n"
+            "animal:!dog:SOURCES = yo\n"
+            "\n"
+            "dog {\n"
+            "    SOURCES += \\\n"
+            "        foo\n"
+            "}"
+        },
+    };
+
+    for (uint i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
+        const Case *_case = &cases[i];
+        QTest::newRow(_case->title)
+                << _case->flags
+                << strList(_case->values)
+                << QString::fromLatin1(_case->scope)
+                << QString::fromLatin1(_case->input)
+                << QString::fromLatin1(_case->output);
+    }
+}
 
-        // Removing entries
+void tst_ProFileWriter::adds()
+{
+    QFETCH(int, flags);
+    QFETCH(QStringList, values);
+    QFETCH(QString, scope);
+    QFETCH(QString, input);
+    QFETCH(QString, output);
+
+    QStringList lines = input.isEmpty() ? QStringList() : input.split(QLatin1String("\n"));
+    QString var = QLatin1String("SOURCES");
+
+    ProFileParser parser(0, &parseHandler);
+    ProFile *proFile = parser.parsedProFile(QLatin1String(BASE_DIR "/test.pro"), false, &input);
+    QVERIFY(proFile);
+    PW::putVarValues(proFile, &lines, values, var, PW::PutFlags(flags), scope);
+
+    QCOMPARE(lines.join(QLatin1String("\n")), output);
+}
+
+void tst_ProFileWriter::removes_data()
+{
+    QTest::addColumn<QStringList>("values");
+    QTest::addColumn<QString>("input");
+    QTest::addColumn<QString>("output");
+
+    struct Case {
+        const char *title;
+        const char * const *values;
+        const char *input;
+        const char *output;
+    };
+
+    static const char *f_foo[] = { "foo", 0 };
+    static const char *f_foo_bar[] = { "foo", "bar", 0 };
+    static const Case cases[] = {
         {
-            false, "remove fail", f_foo,
+            "remove fail", f_foo,
             "SOURCES = bak bar",
             "SOURCES = bak bar"
         },
         {
-            false, "remove one-line middle", f_foo,
+            "remove one-line middle", f_foo,
             "SOURCES = bak foo bar",
             "SOURCES = bak bar"
         },
         {
-            false, "remove one-line trailing", f_foo,
+            "remove one-line trailing", f_foo,
             "SOURCES = bak bar foo",
             "SOURCES = bak bar"
         },
         {
-            false, "remove multi-line single leading", f_foo,
+            "remove multi-line single leading", f_foo,
             "SOURCES = foo \\\n"
             "    bak \\\n"
             "    bar",
@@ -133,7 +441,7 @@ void tst_ProFileWriter::edit_data()
             "    bar"
         },
         {
-            false, "remove multi-line single middle", f_foo,
+            "remove multi-line single middle", f_foo,
             "SOURCES = bak \\\n"
             "    foo \\\n"
             "    bar",
@@ -141,7 +449,7 @@ void tst_ProFileWriter::edit_data()
             "    bar"
         },
         {
-            false, "remove multi-line single trailing", f_foo,
+            "remove multi-line single trailing", f_foo,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "    foo",
@@ -149,7 +457,7 @@ void tst_ProFileWriter::edit_data()
             "    bar"
         },
         {
-            false, "remove multi-line single leading with comment", f_foo,
+            "remove multi-line single leading with comment", f_foo,
             "SOURCES = foo \\  # comment\n"
             "    bak \\\n"
             "    bar",
@@ -158,7 +466,7 @@ void tst_ProFileWriter::edit_data()
             "    bar"
         },
         {
-            false, "remove multi-line single middle with comment", f_foo,
+            "remove multi-line single middle with comment", f_foo,
             "SOURCES = bak \\\n"
             "    foo \\  # comment\n"
             "    bar",
@@ -167,7 +475,7 @@ void tst_ProFileWriter::edit_data()
             "    bar"
         },
         {
-            false, "remove multi-line single trailing with comment", f_foo,
+            "remove multi-line single trailing with comment", f_foo,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "    foo  # comment",
@@ -176,7 +484,7 @@ void tst_ProFileWriter::edit_data()
             "     # foo # comment"
         },
         {
-            false, "remove multi-line single trailing after empty line", f_foo,
+            "remove multi-line single trailing after empty line", f_foo,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "    \\\n"
@@ -185,7 +493,7 @@ void tst_ProFileWriter::edit_data()
             "    bar\n"
         },
         {
-            false, "remove multi-line single trailing after comment line", f_foo,
+            "remove multi-line single trailing after comment line", f_foo,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "       # just a comment\n"
@@ -195,7 +503,7 @@ void tst_ProFileWriter::edit_data()
             "       # just a comment"
         },
         {
-            false, "remove multi-line single trailing after empty line with comment", f_foo,
+            "remove multi-line single trailing after empty line with comment", f_foo,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "    \\ # just a comment\n"
@@ -205,27 +513,27 @@ void tst_ProFileWriter::edit_data()
             "     # just a comment"
         },
         {
-            false, "remove multiple one-line middle", f_foo_bar,
+            "remove multiple one-line middle", f_foo_bar,
             "SOURCES = bak foo bar baz",
             "SOURCES = bak baz"
         },
         {
-            false, "remove multiple one-line trailing", f_foo_bar,
+            "remove multiple one-line trailing", f_foo_bar,
             "SOURCES = bak baz foo bar",
             "SOURCES = bak baz"
         },
         {
-            false, "remove multiple one-line interleaved", f_foo_bar,
+            "remove multiple one-line interleaved", f_foo_bar,
             "SOURCES = bak foo baz bar",
             "SOURCES = bak baz"
         },
         {
-            false, "remove multiple one-line middle with comment", f_foo_bar,
+            "remove multiple one-line middle with comment", f_foo_bar,
             "SOURCES = bak foo bar baz   # comment",
             "SOURCES = bak baz   # bar # foo # comment"
         },
         {
-            false, "remove multi-line multiple trailing with empty line with comment", f_foo_bar,
+            "remove multi-line multiple trailing with empty line with comment", f_foo_bar,
             "SOURCES = bak \\\n"
             "    bar \\\n"
             "    \\ # just a comment\n"
@@ -237,36 +545,26 @@ void tst_ProFileWriter::edit_data()
 
     for (uint i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) {
         const Case *_case = &cases[i];
-        QStringList files;
-        for (const char * const *file = _case->files; *file; file++)
-            files << QString::fromLatin1(BASE_DIR "/") + QString::fromLatin1(*file);
         QTest::newRow(_case->title)
-                << _case->add
-                << files
+                << strList(_case->values)
                 << QString::fromLatin1(_case->input)
                 << QString::fromLatin1(_case->output);
     }
 }
 
-void tst_ProFileWriter::edit()
+void tst_ProFileWriter::removes()
 {
-    QFETCH(bool, add);
-    QFETCH(QStringList, files);
+    QFETCH(QStringList, values);
     QFETCH(QString, input);
     QFETCH(QString, output);
 
-    QDir baseDir(BASE_DIR);
     QStringList lines = input.split(QLatin1String("\n"));
     QStringList vars; vars << QLatin1String("SOURCES");
 
-    ProFileOption option;
-    ProFileEvaluator reader(&option);
-    ProFile *proFile = reader.parsedProFile(BASE_DIR "/test.pro", input);
+    ProFileParser parser(0, &parseHandler);
+    ProFile *proFile = parser.parsedProFile(QLatin1String(BASE_DIR "/test.pro"), false, &input);
     QVERIFY(proFile);
-    if (add)
-        Qt4ProjectManager::Internal::ProWriter::addFiles(proFile, &lines, baseDir, files, vars);
-    else
-        Qt4ProjectManager::Internal::ProWriter::removeFiles(proFile, &lines, baseDir, files, vars);
+    Qt4ProjectManager::Internal::ProWriter::removeVarValues(proFile, &lines, values, vars);
 
     QCOMPARE(lines.join(QLatin1String("\n")), output);
 }
@@ -290,14 +588,55 @@ void tst_ProFileWriter::multiVar()
             << QString::fromLatin1(BASE_DIR "/bak");
     QStringList vars; vars << QLatin1String("SOURCES") << QLatin1String("HEADERS");
 
-    ProFileOption option;
-    ProFileEvaluator reader(&option);
-    ProFile *proFile = reader.parsedProFile(BASE_DIR "/test.pro", input);
+    ProFileParser parser(0, &parseHandler);
+    ProFile *proFile = parser.parsedProFile(QLatin1String(BASE_DIR "/test.pro"), false, &input);
     QVERIFY(proFile);
     Qt4ProjectManager::Internal::ProWriter::removeFiles(proFile, &lines, baseDir, files, vars);
 
     QCOMPARE(lines.join(QLatin1String("\n")), output);
 }
 
+void tst_ProFileWriter::addFiles()
+{
+    QString input = QLatin1String(
+            "SOURCES = foo.cpp"
+            );
+    QStringList lines = input.split(QLatin1String("\n"));
+    QString output = QLatin1String(
+            "SOURCES = foo.cpp \\\n"
+            "    sub/bar.cpp"
+            );
+
+    ProFileParser parser(0, &parseHandler);
+    ProFile *proFile = parser.parsedProFile(QLatin1String(BASE_DIR "/test.pro"), false, &input);
+    QVERIFY(proFile);
+    Qt4ProjectManager::Internal::ProWriter::addFiles(proFile, &lines, QDir(BASE_DIR),
+            QStringList() << QString::fromLatin1(BASE_DIR "/sub/bar.cpp"),
+            QLatin1String("SOURCES"));
+
+    QCOMPARE(lines.join(QLatin1String("\n")), output);
+}
+
+void tst_ProFileWriter::removeFiles()
+{
+    QString input = QLatin1String(
+            "SOURCES = foo.cpp sub/bar.cpp"
+            );
+    QStringList lines = input.split(QLatin1String("\n"));
+    QString output = QLatin1String(
+            "SOURCES = foo.cpp"
+            );
+
+    ProFileParser parser(0, &parseHandler);
+    ProFile *proFile = parser.parsedProFile(QLatin1String(BASE_DIR "/test.pro"), false, &input);
+    QVERIFY(proFile);
+    Qt4ProjectManager::Internal::ProWriter::removeFiles(proFile, &lines, QDir(BASE_DIR),
+            QStringList() << QString::fromLatin1(BASE_DIR "/sub/bar.cpp"),
+            QStringList() << QLatin1String("SOURCES") << QLatin1String("HEADERS"));
+
+    QCOMPARE(lines.join(QLatin1String("\n")), output);
+}
+
+
 QTEST_MAIN(tst_ProFileWriter)
 #include "tst_profilewriter.moc"