diff --git a/doc/qtcreator-vcs-annotate.png b/doc/qtcreator-vcs-annotate.png
new file mode 100644
index 0000000000000000000000000000000000000000..87b7ed117352fe8b04cf6ce032560a5e93a3eb93
Binary files /dev/null and b/doc/qtcreator-vcs-annotate.png differ
diff --git a/doc/qtcreator-vcs-commit.png b/doc/qtcreator-vcs-commit.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c58ad57732edbbd1d83f96dce548ffd65c34bf9
Binary files /dev/null and b/doc/qtcreator-vcs-commit.png differ
diff --git a/doc/qtcreator-vcs-describe.png b/doc/qtcreator-vcs-describe.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0949b1e59e657fa34f1f9c926eae082533973af
Binary files /dev/null and b/doc/qtcreator-vcs-describe.png differ
diff --git a/doc/qtcreator-vcs-diff.png b/doc/qtcreator-vcs-diff.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdb9a0f5da83259e30a92995bba2349349cef858
Binary files /dev/null and b/doc/qtcreator-vcs-diff.png differ
diff --git a/doc/qtcreator-vcs-gitbranch.png b/doc/qtcreator-vcs-gitbranch.png
new file mode 100644
index 0000000000000000000000000000000000000000..398de10ee6595f196b5dac31407a310c1b201f31
Binary files /dev/null and b/doc/qtcreator-vcs-gitbranch.png differ
diff --git a/doc/qtcreator-vcs-log.png b/doc/qtcreator-vcs-log.png
new file mode 100644
index 0000000000000000000000000000000000000000..e74cd3dade8ba9bffbb30affe5a688fbdd38d315
Binary files /dev/null and b/doc/qtcreator-vcs-log.png differ
diff --git a/doc/qtcreator-vcs-pane.png b/doc/qtcreator-vcs-pane.png
new file mode 100644
index 0000000000000000000000000000000000000000..faea0cf32e1a20cfceb71e79274d694cfdb04354
Binary files /dev/null and b/doc/qtcreator-vcs-pane.png differ
diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc
index 4918da9f61aec137311f837e1387775e1e2083cf..68dc857c0ae0a0e907163d271006dd205d4ae3eb 100644
--- a/doc/qtcreator.qdoc
+++ b/doc/qtcreator.qdoc
@@ -53,6 +53,7 @@
        \o \l{Build Settings}
        \o \l{Qt Version Management}
        \o \l{Writing a Simple Program with Qt Creator}
+       \o \l{Qt Creator and Version Control Systems}
        \o \l{Navigating Quickly Around Your Code with Locator}
        \o \l{Debugging with Qt Creator}
        \o \l{Tips and Tricks}
@@ -237,10 +238,14 @@
             \i
 
         \row
-            \i  Indenting
+            \i  Indenting Blocks
             \i
         \row
-            \i  Commenting or Uncommenting
+            \i  Commenting or Uncommenting Blocks
+            \i
+
+        \row
+            \i  Switch between Header and Source
             \i
     \endtable
 
@@ -265,6 +270,11 @@
 */
 
 
+/*!
+
+*/
+
+
 
 /*!
     \contentspage index.html
@@ -758,6 +768,136 @@
 
 */
 
+/*!
+    \contentspage index.html
+    \previouspage creator-navigation.html
+    \page creator-version-control.html
+    \nextpage creator-debugging.html
+
+    \title Qt Creator and Version Control Systems
+
+    \table
+        \caption    Version control systems supported by Qt Creator
+        \row
+            \i  \bold{git}
+            \i  \l{http://git-scm.com/}
+        \row
+            \i  \bold{Subversion}
+            \i  \l{http://subversion.tigris.org/}
+        \row
+            \i  \bold{Perforce}
+            \i  \l{http://www.perforce.com}
+    \endtable
+
+
+    \section1 Setup
+
+    Qt Creator uses the version control system's command line clients to
+    access your repositories. To set it up, you must ensure that these command
+    line clients can be located via the \c{PATH} environment variable. You can
+    specify the path to the command line client's executable in the settings    
+    pages that can be found under \gui{Options...} in the \gui{Tools} menu.
+
+
+    \section1 Usage
+
+    You can find the version control menu entires in a sub-menu of the
+    \gui{Tools} menu. The version control system displayed here is the system
+    that manages the current project.
+
+    Each version control system adds a pane to the \gui{Application Output}
+    panes within which it will log the commands it executes, prepended by a
+    timestamp and the relevant output.
+
+    \image qtcreator-vcs-pane.png
+
+
+    \section2 Addings Files
+
+    When you create a new file or a new project, the wizards will display page
+    requesting whether the files should be added to a version control system.
+    This depends on whether the parent directory or the project is already
+    under version control and the system supports the concept of adding files,
+    e.g., \bold{Perforce} and \bold{Subversion}. Alternatively, you can also
+    add files later on using the version control tool menus.
+
+    With \bold{git}, there is no concept of adding files. Instead, all modified
+    files must be \e{staged} for a commit.
+
+
+    \section2 Viewing Diff Output
+
+    All version control systems provide menu options to \e{diff} the current
+    file or project - comparing with the latest version stored in the
+    repository and displaying the differences. In Qt Creator, a diff is
+    displayed in a read-only editor. If the file is accessible, you can double
+    -click on a selected diff chunk and Qt Creator will open an editor
+    displaying the file, scrolled to the line in question.
+
+    \image qtcreator-vcs-diff.png
+
+
+    \section2 Viewing Versioning History and Change Details
+
+    The versioning history of a file can be displayed by selecting the
+    \gui{Log} (for \bold{git}) or \gui{Filelog (for \bold{Perforce} and
+    \bold{Subversion})} option. Typically, the log output will contain the
+    date, the commit message, and a change or revision identifier. If you
+    click on the identifier, a description of the change including the diff
+    will be displayed.
+
+    \image qtcreator-vcs-log.png
+    \image qtcreator-vcs-describe.png
+
+
+    \section2 Annotating Files
+
+    Annotation views are obtained by selecting \gui{Annotate} or \gui{Blame}.
+    This will display the lines of the file prepended by the change identifier
+    they originate from. Clicking on the change identifier shows a detailed
+    description of the file.
+
+
+    \section2 Committing Changes
+
+    Once you have finished making changes, you can submit them to the version
+    control system by choosing \gui{Commit} or \gui{Submit}. Qt Creator will
+    display a commit page containing a text editor, where you can enter your
+    commit message, and a checkable list of modified files to be included.
+    When you are done, click \gui{Commit} to start committing. In addition,
+    there is a \gui{Diff selected} button that brings up a diff view of the
+    files selected in the file list. Since the commit page is just another
+    editor, you can go back to it by closing the diff view. Alternatively, you
+    can view it from the editor combo box showing the \gui{Opened files}.
+
+    \image qtcreator-vcs-commit.png
+
+
+    \section2 Menu Entries Specific to git
+
+    The git sub-menu contains additional entries:
+
+    \table
+        \row
+            \i  \gui{Stash}
+            \i  Stash local changes prior to executing a \bold{pull}.
+        \row
+            \i  \gui{Pull}
+            \i  Pull changes from the remote repository. If there are locally
+                modified files, you will be prompted to stash those changes.
+        \row
+            \i  \gui{Branches...}
+            \i  Displays the branch dialog showing the local branches at the
+                top and remote branches at the bottom. To switch to the local
+                branch, simply double-click on it. Double-clicking on a remote
+                branch will first create a local branch with the same name that
+                tracks the remote branch, and then switch to it.
+
+                \image qtcreator-vcs-gitbranch.png
+    \endtable
+
+*/
+
 
 /*!
     \contentspage index.html
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index d98539969afc79073744f6da6b35c387245a1dcb..65bf70fe584a8668b134a6329c6cbf2265ba8d4f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -87,6 +87,7 @@ void CMakeProject::parseCMakeLists(const QDir &directory)
     CMakeCbpParser cbpparser;
     qDebug()<<"Parsing file "<<cbpFile;
     if (cbpparser.parseCbpFile(cbpFile)) {
+        m_projectName = cbpparser.projectName();
         qDebug()<<"Building Tree";
         // TODO do a intelligent updating of the tree
         buildTree(m_rootNode, cbpparser.fileList());
@@ -200,8 +201,7 @@ ProjectExplorer::FolderNode *CMakeProject::findOrCreateFolder(CMakeProjectNode *
 
 QString CMakeProject::name() const
 {
-    // TODO
-    return "";
+    return m_projectName;
 }
 
 Core::IFile *CMakeProject::file() const
@@ -469,6 +469,8 @@ void CMakeCbpParser::parseProject()
         readNext();
         if (isEndElement()) {
             return;
+        } else if (name() == "Option") {
+            parseOption();
         } else if (name() == "Unit") {
             parseUnit();
         } else if (name() == "Build") {
@@ -537,6 +539,26 @@ void CMakeCbpParser::parseTargetOption()
     }
 }
 
+QString CMakeCbpParser::projectName() const
+{
+    return m_projectName;
+}
+
+void CMakeCbpParser::parseOption()
+{
+    if (attributes().hasAttribute("title"))
+        m_projectName = attributes().value("title").toString();
+
+    while (!atEnd()) {
+        readNext();
+        if (isEndElement()) {
+            return;
+        } else if(isStartElement()) {
+            parseUnknownElement();
+        }
+    }
+}
+
 void CMakeCbpParser::parseMakeCommand()
 {
     while (!atEnd()) {
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index cad7b5fe5df1dd46042d36edf963380031a6a88a..cdabdf1d0845d1bb77b732352fbed79df44a48d1 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -118,6 +118,7 @@ private:
     CMakeManager *m_manager;
     QString m_fileName;
     CMakeFile *m_file;
+    QString m_projectName;
 
     // TODO probably need a CMake specific node structure
     CMakeProjectNode* m_rootNode;
@@ -137,10 +138,12 @@ public:
     QList<ProjectExplorer::FileNode *> fileList();
     QStringList includeFiles();
     QList<CMakeTarget> targets();
+    QString projectName() const;
 private:
     void parseCodeBlocks_project_file();
     void parseProject();
     void parseBuild();
+    void parseOption();
     void parseTarget();
     void parseTargetOption();
     void parseMakeCommand();
@@ -157,6 +160,7 @@ private:
     CMakeTarget m_target;
     bool m_targetType;
     QList<CMakeTarget> m_targets;
+    QString m_projectName;
 };
 
 class CMakeFile : public Core::IFile
diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro
index 5a21d6a42d7a56248d4d2d0e1b21896f98a23985..469ea3460112218d7cec8eb0cfa7b2f5d836494b 100644
--- a/src/plugins/debugger/debugger.pro
+++ b/src/plugins/debugger/debugger.pro
@@ -30,6 +30,7 @@ HEADERS += attachexternaldialog.h \
     imports.h \
     moduleshandler.h \
     moduleswindow.h \
+    outputcollector.h \
     procinterrupt.h \
     registerhandler.h \
     registerwindow.h \
@@ -40,7 +41,7 @@ HEADERS += attachexternaldialog.h \
     threadswindow.h \
     watchhandler.h \
     watchwindow.h
-    
+
 SOURCES += attachexternaldialog.cpp \
     attachremotedialog.cpp \
     breakhandler.cpp \
@@ -54,9 +55,9 @@ SOURCES += attachexternaldialog.cpp \
     disassemblerwindow.cpp \
     gdbengine.cpp \
     gdbmi.cpp \
-    gdbengine.h \
     moduleshandler.cpp \
     moduleswindow.cpp \
+    outputcollector.cpp \
     procinterrupt.cpp \
     registerhandler.cpp \
     registerwindow.cpp \
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index ea0e6623b067aec04e98f8b272e476c426d3da36..7b0e6c24273b37bf50216f8b1d113fa56396dec0 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -94,7 +94,7 @@ DebuggerSettings::DebuggerSettings()
     m_skipKnownFrames = false;
     m_debugDumpers = false;
     m_useToolTips = false;
-    m_useToolTips = false;
+    m_useTerminal = false;
     m_useCustomDumpers = true;
 }
 
@@ -590,9 +590,9 @@ void DebuggerManager::notifyInferiorPidChanged(int pid)
     emit inferiorPidChanged(pid);
 }
 
-void DebuggerManager::showApplicationOutput(const QString &prefix, const QString &str)
+void DebuggerManager::showApplicationOutput(const QString &str)
 {
-     emit applicationOutputAvailable(prefix, str);
+     emit applicationOutputAvailable(str);
 }
 
 void DebuggerManager::shutdown()
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 9a5b5da37d3e2e55dc7dcf7054e7755aeecd6f27..5d5e7abd0da7f5e475fde605698004d4d4aa9cd0 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -166,7 +166,7 @@ private:
     virtual ThreadsHandler *threadsHandler() = 0;
     virtual WatchHandler *watchHandler() = 0;
 
-    virtual void showApplicationOutput(const QString &prefix, const QString &data) = 0;
+    virtual void showApplicationOutput(const QString &data) = 0;
     //virtual QAction *useCustomDumpersAction() const = 0;
     //virtual QAction *debugDumpersAction() const = 0;
     virtual bool skipKnownFrames() const = 0;
@@ -200,6 +200,7 @@ public:
     bool m_debugDumpers;
     bool m_useFastStart;
     bool m_useToolTips;
+    bool m_useTerminal;
 
     QString m_scriptFile;
 };
@@ -285,7 +286,7 @@ public slots:
 private slots:
     void showDebuggerOutput(const QString &prefix, const QString &msg);
     void showDebuggerInput(const QString &prefix, const QString &msg);
-    void showApplicationOutput(const QString &prefix, const QString &msg);
+    void showApplicationOutput(const QString &data);
 
     void reloadDisassembler();
     void disassemblerDockToggled(bool on);
@@ -365,7 +366,7 @@ signals:
     void setSessionValueRequested(const QString &name, const QVariant &value);
     void configValueRequested(const QString &name, QVariant *value);
     void setConfigValueRequested(const QString &name, const QVariant &value);
-    void applicationOutputAvailable(const QString &prefix, const QString &msg);
+    void applicationOutputAvailable(const QString &output);
 
 public:
     // FIXME: make private
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index bf8edf404e29f6458d29162b3c246d9f07efe476..204345a0220d35fa2ec4f00bed50dbf4f960b33b 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -106,13 +106,7 @@ const char * const JUMP_TO_LINE         = "Debugger.JumpToLine";
 const char * const TOGGLE_BREAK         = "Debugger.ToggleBreak";
 const char * const BREAK_BY_FUNCTION    = "Debugger.BreakByFunction";
 const char * const BREAK_AT_MAIN        = "Debugger.BreakAtMain";
-const char * const DEBUG_DUMPERS        = "Debugger.DebugDumpers";
 const char * const ADD_TO_WATCH         = "Debugger.AddToWatch";
-const char * const USE_CUSTOM_DUMPERS   = "Debugger.UseCustomDumpers";
-const char * const USE_FAST_START       = "Debugger.UseFastStart";
-const char * const USE_TOOL_TIPS        = "Debugger.UseToolTips";
-const char * const SKIP_KNOWN_FRAMES    = "Debugger.SkipKnownFrames";
-const char * const DUMP_LOG             = "Debugger.DumpLog";
 
 #ifdef Q_OS_MAC
 const char * const INTERRUPT_KEY            = "Shift+F5";
@@ -283,6 +277,7 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
     m_ui.checkBoxUseCustomDumpers->setChecked(m_settings.m_useCustomDumpers);
     m_ui.checkBoxFastStart->setChecked(m_settings.m_useFastStart);
     m_ui.checkBoxUseToolTips->setChecked(m_settings.m_useToolTips);
+    m_ui.checkBoxUseTerminal->setChecked(m_settings.m_useTerminal);
 
 #ifndef QT_DEBUG
 #if 0
@@ -291,10 +286,6 @@ QWidget *GdbOptionPage::createPage(QWidget *parent)
     //cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L")));
     cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11")));
     mdebug->addAction(cmd);
-
-    cmd = am->registerAction(m_manager->m_debugDumpersAction,
-        Constants::DEBUG_DUMPERS, debuggercontext);
-    mdebug->addAction(cmd);
 #endif
 #endif
 
@@ -325,6 +316,7 @@ void GdbOptionPage::apply()
     m_settings.m_useCustomDumpers = m_ui.checkBoxUseCustomDumpers->isChecked();
     m_settings.m_useFastStart = m_ui.checkBoxFastStart->isChecked();
     m_settings.m_useToolTips = m_ui.checkBoxUseToolTips->isChecked();
+    m_settings.m_useTerminal = m_ui.checkBoxUseTerminal->isChecked();
 
     *m_plugin->m_manager->settings() = m_settings;
     m_plugin->writeSettings();
@@ -907,6 +899,7 @@ void DebuggerPlugin::writeSettings() const
 
     s->setValue("UseFastStart", m->m_useFastStart);
     s->setValue("UseToolTips", m->m_useToolTips);
+    s->setValue("UseTerminal", m->m_useTerminal);
     s->setValue("UseCustomDumpers", m->m_useCustomDumpers);
     s->setValue("SkipKnowFrames", m->m_skipKnownFrames);
     s->setValue("DebugDumpers", m->m_debugDumpers);
@@ -940,6 +933,7 @@ void DebuggerPlugin::readSettings()
     m->m_useCustomDumpers = s->value("UseCustomDupers", false).toBool();
     m->m_useFastStart = s->value("UseFastStart", false).toBool();
     m->m_useToolTips = s->value("UseToolTips", false).toBool();
+    m->m_useTerminal = s->value("UseTerminal", false).toBool();
     s->endGroup();
 
     m_manager->mainWindow()->restoreState(ba);
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 45eecd6514e5919d3142043353c5bb721143d5bb..7f3e42f47fa122af31fd00454dbd7ca595c141ee 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -108,8 +108,8 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager,
 {
     connect(m_manager, SIGNAL(debuggingFinished()),
             this, SLOT(debuggingFinished()));
-    connect(m_manager, SIGNAL(applicationOutputAvailable(QString, QString)),
-            this, SLOT(slotAddToOutputWindow(QString, QString)));
+    connect(m_manager, SIGNAL(applicationOutputAvailable(QString)),
+            this, SLOT(slotAddToOutputWindowInline(QString)));
     connect(m_manager, SIGNAL(inferiorPidChanged(qint64)),
             this, SLOT(bringApplicationToForeground(qint64)));
 }
@@ -138,12 +138,9 @@ void DebuggerRunControl::start()
         debuggingFinished();
 }
 
-void DebuggerRunControl::slotAddToOutputWindow(const QString &prefix, const QString &line)
+void DebuggerRunControl::slotAddToOutputWindowInline(const QString &data)
 {  
-    Q_UNUSED(prefix);
-    foreach (const QString &l, line.split('\n'))
-        emit addToOutputWindow(this, prefix + Qt::escape(l));
-    //emit addToOutputWindow(this, prefix + Qt::escape(line));
+    emit addToOutputWindowInline(this, data);
 }
 
 void DebuggerRunControl::stop()
diff --git a/src/plugins/debugger/debuggerrunner.h b/src/plugins/debugger/debuggerrunner.h
index c10a84e479513583acbc5c642f78edb7ff30f24e..0c6d979c0107f89e79ce196beb4511ac5e577abb 100644
--- a/src/plugins/debugger/debuggerrunner.h
+++ b/src/plugins/debugger/debuggerrunner.h
@@ -84,7 +84,7 @@ public:
 
 private slots:
     void debuggingFinished();
-    void slotAddToOutputWindow(const QString &prefix, const QString &line);
+    void slotAddToOutputWindowInline(const QString &output);
 
 private:
     DebuggerManager *m_manager;
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 2370a55eed2ec637c359c595bfe95268495d3012..78d2522639b22d572a29c9c915516465bcddc200 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -252,6 +252,7 @@ void GdbEngine::init()
     m_pendingRequests = 0;
     m_gdbVersion = 100;
     m_shared = 0;
+    m_outputCodec = QTextCodec::codecForLocale();
 
     m_oldestAcceptableToken = -1;
 
@@ -266,6 +267,8 @@ void GdbEngine::init()
         SLOT(exitDebugger()));
 
     // Output
+    connect(&m_outputCollector, SIGNAL(byteDelivery(QByteArray)),
+            SLOT(readDebugeeOutput(QByteArray)));
     connect(this, SIGNAL(gdbResponseAvailable()),
         this, SLOT(handleResponse()), Qt::QueuedConnection);
 
@@ -275,8 +278,8 @@ void GdbEngine::init()
     connect(this, SIGNAL(gdbInputAvailable(QString,QString)),
         q, SLOT(showDebuggerInput(QString,QString)),
         Qt::QueuedConnection);
-    connect(this, SIGNAL(applicationOutputAvailable(QString,QString)),
-        q, SLOT(showApplicationOutput(QString,QString)),
+    connect(this, SIGNAL(applicationOutputAvailable(QString)),
+        q, SLOT(showApplicationOutput(QString)),
         Qt::QueuedConnection);
 }
 
@@ -355,6 +358,12 @@ static void skipTerminator(const char *&from, const char *to)
     skipSpaces(from, to);
 }
 
+void GdbEngine::readDebugeeOutput(const QByteArray &data)
+{
+    emit applicationOutputAvailable(m_outputCodec->toUnicode(
+            data.constData(), data.length(), &m_outputCodecState));
+}
+
 // called asyncronously as response to Gdb stdout output in
 // gdbResponseAvailable()
 void GdbEngine::handleResponse()
@@ -407,22 +416,6 @@ void GdbEngine::handleResponse()
             break;
         }
 
-        if (token == -1 && *from != '&' && *from != '~' && *from != '*') {
-            // FIXME: On Linux the application's std::out is merged in here.
-            // High risk of falsely interpreting this as MI output.
-            // We assume that we _always_ use tokens, so not finding a token
-            // is a positive indication for the presence of application output.
-            QString s;
-            while (from != to && *from != '\n')
-                s += *from++;
-            //qDebug() << "UNREQUESTED DATA " << s << " TAKEN AS APPLICATION OUTPUT";
-            //s += '\n';
-
-            m_inbuffer = QByteArray(from, to - from);
-            emit applicationOutputAvailable("app-stdout: ", s);
-            continue;
-        }
-
         // next char decides kind of record
         const char c = *from++;
         //qDebug() << "CODE:" << c;
@@ -590,8 +583,7 @@ static void fixMac(QByteArray &out)
 
 void GdbEngine::readGdbStandardError()
 {
-    QByteArray err = m_gdbProc.readAllStandardError();
-    emit applicationOutputAvailable("app-stderr:", err);
+    qWarning() << "Unexpected gdb stderr:" << m_gdbProc.readAllStandardError();
 }
 
 void GdbEngine::readGdbStandardOutput()
@@ -1078,7 +1070,7 @@ void GdbEngine::handleStreamOutput(const QString &data, char code)
             // On Windows, the contents seem to depend on the debugger
             // version and/or OS version used.
             if (data.startsWith("warning:"))
-                qq->showApplicationOutput(QString(), data);
+                qq->showApplicationOutput(data);
             break;
     }
 
@@ -1484,6 +1476,7 @@ void GdbEngine::exitDebugger()
     m_varToType.clear();
     m_dataDumperState = DataDumperUninitialized;
     m_shared = 0;
+    m_outputCollector.shutdown();
     //q->settings()->m_debugDumpers = false;
 }
 
@@ -1506,6 +1499,15 @@ bool GdbEngine::startDebugger()
         return false;
     }
 
+    if (!m_outputCollector.listen()) {
+        QMessageBox::critical(q->mainWindow(), tr("Debugger Startup Failure"),
+                              tr("Cannot set up communication with child process: %1")
+                              .arg(m_outputCollector.errorString()));
+        return false;
+    }
+
+    gdbArgs.prepend(QLatin1String("--tty=") + m_outputCollector.serverName());
+
     //gdbArgs.prepend(QLatin1String("--quiet"));
     gdbArgs.prepend(QLatin1String("mi"));
     gdbArgs.prepend(QLatin1String("-i"));
@@ -1530,8 +1532,12 @@ bool GdbEngine::startDebugger()
     m_gdbProc.start(q->settings()->m_gdbCmd, gdbArgs);
     m_gdbProc.waitForStarted();
 
-    if (m_gdbProc.state() != QProcess::Running)
+    if (m_gdbProc.state() != QProcess::Running) {
+        QMessageBox::critical(q->mainWindow(), tr("Debugger Startup Failure"),
+                              tr("Cannot start debugger: %1").arg(m_gdbProc.errorString()));
+        m_outputCollector.shutdown();
         return false;
+    }
 
     q->showStatusMessage(tr("Gdb Running"));
 
diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h
index e07e6a228c39950761b53c41542f7930d2b6e459..60493a53e582233c19efbd7cd42e3b95f82cf17b 100644
--- a/src/plugins/debugger/gdbengine.h
+++ b/src/plugins/debugger/gdbengine.h
@@ -36,6 +36,7 @@
 
 #include "idebuggerengine.h"
 #include "gdbmi.h"
+#include "outputcollector.h"
 
 #include <QtCore/QByteArray>
 #include <QtCore/QHash>
@@ -43,6 +44,7 @@
 #include <QtCore/QObject>
 #include <QtCore/QProcess>
 #include <QtCore/QPoint>
+#include <QtCore/QTextCodec>
 #include <QtCore/QVariant>
 
 QT_BEGIN_NAMESPACE
@@ -93,7 +95,7 @@ signals:
     void gdbResponseAvailable();
     void gdbInputAvailable(const QString &prefix, const QString &msg);
     void gdbOutputAvailable(const QString &prefix, const QString &msg);
-    void applicationOutputAvailable(const QString &prefix, const QString &msg);
+    void applicationOutputAvailable(const QString &output);
 
 private:
     //
@@ -173,6 +175,7 @@ private slots:
     void gdbProcError(QProcess::ProcessError error);
     void readGdbStandardOutput();
     void readGdbStandardError();
+    void readDebugeeOutput(const QByteArray &data);
 
 private:
     int terminationIndex(const QByteArray &buffer, int &length);
@@ -190,6 +193,10 @@ private:
     void handleQueryPwd(const GdbResultRecord &response);
     void handleQuerySources(const GdbResultRecord &response);
 
+    OutputCollector m_outputCollector;
+    QTextCodec *m_outputCodec;
+    QTextCodec::ConverterState m_outputCodecState;
+
     QByteArray m_inbuffer;
 
     QProcess m_gdbProc;
diff --git a/src/plugins/debugger/gdboptionpage.ui b/src/plugins/debugger/gdboptionpage.ui
index 354eb64233ff5753b73150f81e9f8ca27f4ce886..dcd5744335028aed9ba39145733e2d222d153695 100644
--- a/src/plugins/debugger/gdboptionpage.ui
+++ b/src/plugins/debugger/gdboptionpage.ui
@@ -36,7 +36,7 @@
        <widget class="QLineEdit" name="environmentEdit"/>
       </item>
       <item row="0" column="0">
-       <widget class="QLabel" name="labelGdbLocaltion">
+       <widget class="QLabel" name="labelGdbLocation">
         <property name="toolTip">
          <string>This is either a full abolute path leading to the gdb binary you intend to use or the name of a gdb binary that wiull be searched in your PATH.</string>
         </property>
@@ -84,6 +84,16 @@
      </property>
     </widget>
    </item>
+   <item>
+    <widget class="QCheckBox" name="checkBoxUseTerminal">
+     <property name="toolTip">
+      <string>Start debugged process in a separte terminal.</string>
+     </property>
+     <property name="text">
+      <string>Start in terminal</string>
+     </property>
+    </widget>
+   </item>
    <item>
     <widget class="QCheckBox" name="checkBoxFastStart">
      <property name="toolTip">
diff --git a/src/plugins/debugger/outputcollector.cpp b/src/plugins/debugger/outputcollector.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f091ca9208409a73817d9d9fe241c8e87f181c9f
--- /dev/null
+++ b/src/plugins/debugger/outputcollector.cpp
@@ -0,0 +1,180 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#include "outputcollector.h"
+
+#ifdef Q_OS_WIN
+
+#include <QtNetwork/QLocalServer>
+#include <QtNetwork/QLocalSocket>
+#include <QtCore/QCoreApplication>
+
+#else
+
+#include <QtCore/QFile>
+#include <QtCore/QSocketNotifier>
+#include <QtCore/QTemporaryFile>
+#include <QtCore/QVarLengthArray>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+
+#endif
+
+namespace Debugger {
+namespace Internal {
+
+OutputCollector::OutputCollector(QObject *parent)
+        : QObject(parent)
+{
+#ifdef Q_OS_WIN
+    m_server = 0;
+    m_socket = 0;
+#endif
+}
+
+OutputCollector::~OutputCollector()
+{
+    shutdown();
+}
+
+bool OutputCollector::listen()
+{
+#ifdef Q_OS_WIN
+    if (m_server)
+        return m_server->isListening();
+    m_server = new QLocalServer(this);
+    connect(m_server, SIGNAL(newConnection()), SLOT(newConnectionAvailable()));
+    return m_server->listen(QLatin1String("creator-") + QCoreApplication::applicationPid()); // XXX how to make that secure?
+#else
+    if (!m_serverPath.isEmpty())
+        return true;
+    QByteArray codedServerPath;
+    forever {
+        {
+            QTemporaryFile tf;
+            if (!tf.open()) {
+                m_errorString = tr("Cannot create temporary file: %2").arg(tf.errorString());
+                m_serverPath.clear();
+                return false;
+            }
+            m_serverPath = tf.fileName();
+        }
+        // By now the temp file was deleted again
+        codedServerPath = QFile::encodeName(m_serverPath);
+        if (!::mkfifo(codedServerPath.constData(), 0600))
+            break;
+        if (errno != EEXIST) {
+            m_errorString = tr("Cannot create FiFo %1: %2").arg(m_serverPath, strerror(errno));
+            m_serverPath.clear();
+            return false;
+        }
+    }
+    if ((m_serverFd = ::open(codedServerPath.constData(), O_RDONLY|O_NONBLOCK)) < 0) {
+        m_errorString = tr("Cannot open FiFo %1: %2").arg(m_serverPath, strerror(errno));
+        m_serverPath.clear();
+        return false;
+    }
+    m_serverNotifier = new QSocketNotifier(m_serverFd, QSocketNotifier::Read, this);
+    connect(m_serverNotifier, SIGNAL(activated(int)), SLOT(bytesAvailable()));
+    return true;
+#endif
+}
+
+void OutputCollector::shutdown()
+{
+#ifdef Q_OS_WIN
+    delete m_server; // Deletes socket as well (QObject parent)
+    m_server = 0;
+    m_socket = 0;
+#else
+    if (!m_serverPath.isEmpty()) {
+        ::close(m_serverFd);
+        ::unlink(QFile::encodeName(m_serverPath).constData());
+        delete m_serverNotifier;
+        m_serverPath.clear();
+    }
+#endif
+}
+
+QString OutputCollector::errorString() const
+{
+#ifdef Q_OS_WIN
+    return m_socket ? m_socket->errorString() : m_server->errorString();
+#else
+    return m_errorString;
+#endif
+}
+
+QString OutputCollector::serverName() const
+{
+#ifdef Q_OS_WIN
+    return m_server->fullServerName();
+#else
+    return m_serverPath;
+#endif
+}
+
+#ifdef Q_OS_WIN
+void OutputCollector::newConnectionAvailable()
+{
+    if (m_socket)
+        return;
+    m_socket = m_server->nextPendingConnection();
+    connect(m_socket, SIGNAL(bytesAvailable()), SLOT(bytesAvailable()));
+}
+#endif
+
+void OutputCollector::bytesAvailable()
+{
+#ifdef Q_OS_WIN
+    emit byteDelivery(m_socket->readAll());
+#else
+    size_t nbytes = 0;
+    if (::ioctl(m_serverFd, FIONREAD, (char *) &nbytes) < 0)
+        return;
+    QVarLengthArray<char, 8192> buff(nbytes);
+    if (::read(m_serverFd, buff.data(), nbytes) != (int)nbytes)
+        return;
+    if (nbytes) // Skip EOF notifications
+        emit byteDelivery(QByteArray::fromRawData(buff.data(), nbytes));
+#endif
+}
+
+} // namespace Internal
+} // namespace Debugger
diff --git a/src/plugins/debugger/outputcollector.h b/src/plugins/debugger/outputcollector.h
new file mode 100644
index 0000000000000000000000000000000000000000..b84a1b361001de100bedae5a1c6859139adaf4a2
--- /dev/null
+++ b/src/plugins/debugger/outputcollector.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#ifndef OUTPUT_COLLECTOR_H
+#define OUTPUT_COLLECTOR_H
+
+#include <QtCore/QByteArray>
+#include <QtCore/QObject>
+
+QT_BEGIN_NAMESPACE
+class QLocalServer;
+class QLocalSocket;
+class QSocketNotifier;
+QT_END_NAMESPACE
+
+namespace Debugger {
+namespace Internal {
+
+///////////////////////////////////////////////////////////////////////
+//
+// OutputCollector
+//
+///////////////////////////////////////////////////////////////////////
+
+class OutputCollector : public QObject
+{
+    Q_OBJECT
+
+public:
+    OutputCollector(QObject *parent = 0);
+    ~OutputCollector();
+    bool listen();
+    void shutdown();
+    QString serverName() const;
+    QString errorString() const;
+
+signals:
+    void byteDelivery(const QByteArray &data);
+
+private slots:
+    void bytesAvailable();
+#ifdef Q_OS_WIN
+    void newConnectionAvailable();
+#endif
+
+private:
+#ifdef Q_OS_WIN
+    QLocalServer *m_server;
+    QLocalSocket *m_socket;
+#else
+    QString m_serverPath;
+    int m_serverFd;
+    QSocketNotifier *m_serverNotifier;
+    QString m_errorString;
+#endif
+};
+
+} // namespace Internal
+} // namespace Debugger
+
+#endif // OUTPUT_COLLECTOR_H
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 4a69ff97ea67da35e9c7cdf6ce011a52869a3155..087d225207f76bf440fe9800f54e6d0a6fb83d01 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -35,6 +35,13 @@
 
 #include "fakevimconstants.h"
 
+// Please do not add any direct dependencies to other Qt Creator code  here. 
+// Instead emit signals and let the FakeVimPlugin channel the information to
+// Qt Creator. The idea is to keep this file here in a "clean" state that
+// allows easy reuse with any QTextEdit or QPlainTextEdit derived class.
+
+//#include <indenter.h>
+
 #include <QtCore/QDebug>
 #include <QtCore/QFile>
 #include <QtCore/QObject>
@@ -53,11 +60,6 @@
 #include <QtGui/QTextDocumentFragment>
 #include <QtGui/QTextEdit>
 
-//#include <texteditor/basetexteditor.h>
-//#include <texteditor/textblockiterator.h>
-//#include <cppeditor/cppeditor.h>
-
-//#include <indenter.h>
 
 using namespace FakeVim::Internal;
 using namespace FakeVim::Constants;
@@ -382,6 +384,9 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         return;
     }
 
+    if (m_visualMode != NoVisualMode)
+        m_marks['>'] = m_tc.position();
+
     if (m_submode == ChangeSubMode) {
         if (!dotCommand.isEmpty())
             m_dotCommand = "c" + dotCommand;
@@ -613,10 +618,8 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
     } else if (key == ':') {
         m_mode = ExMode;
         m_commandBuffer.clear();
-        if (m_visualMode != NoVisualMode) {
+        if (m_visualMode != NoVisualMode)
             m_commandBuffer = "'<,'>";
-            leaveVisualMode();
-        }
         m_commandHistory.append(QString());
         m_commandHistoryIndex = m_commandHistory.size() - 1;
         updateMiniBuffer();
@@ -638,7 +641,6 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         m_submode = FilterSubMode;
     } else if (key == '!' && m_visualMode == VisualLineMode) {
         m_mode = ExMode;
-        m_marks['>'] = m_tc.position();
         m_commandBuffer = "'<,'>!";
         m_commandHistory.append(QString());
         m_commandHistoryIndex = m_commandHistory.size() - 1;
@@ -724,7 +726,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
     } else if (key == 'G') {
         int n = m_mvcount.isEmpty() ? linesInDocument() : count();
         m_tc.setPosition(positionForLine(n), KeepAnchor);
-        if (m_config.contains(ConfigStartOfLine))
+        if (m_config[ConfigStartOfLine] == ConfigOn)
             moveToFirstNonBlankOnLine();
         finishMovement();
     } else if (key == 'h' || key == Key_Left) {
@@ -1019,6 +1021,7 @@ bool FakeVimHandler::Private::handleMiniBufferModes(int key, const QString &text
             m_commandHistory.takeLast();
             m_commandHistory.append(m_commandBuffer);
             handleExCommand(m_commandBuffer);
+            leaveVisualMode();
         }
     } else if (key == Key_Return && isSearchMode()) {
         if (!m_commandBuffer.isEmpty()) {
@@ -1138,7 +1141,6 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
     if (cmd.startsWith("%"))
         cmd = "1,$" + cmd.mid(1);
     
-    m_marks['>'] = m_tc.position();
     int beginLine = -1;
     int endLine = -1;
 
@@ -1192,10 +1194,9 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
             showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName));
         } else if (file.open(QIODevice::ReadWrite)) {
             QTextCursor tc = selectRange(beginLine, endLine);
-            qDebug() << "ANCHOR: " << tc.position() << tc.anchor()
-                << tc.selection().toPlainText();
-            { QTextStream ts(&file); ts << tc.selection().toPlainText(); }
-            file.close();
+            QString contents = tc.selection().toPlainText();
+            emit q->writeFile(fileName, contents);
+            // check by reading back
             file.open(QIODevice::ReadOnly);
             QByteArray ba = file.readAll();
             showBlackMessage(tr("\"%1\" %2 %3L, %4C written")
@@ -1813,3 +1814,8 @@ void FakeVimHandler::quit()
 {
     d->quit();
 }
+
+void FakeVimHandler::setCurrentFileName(const QString &fileName)
+{
+   d->m_currentFileName = fileName;
+}
diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h
index 08df6d21b12a526f307b34346e3517cd2c662673..aeba5ace87005fbb9a88460335122ac8743aa722 100644
--- a/src/plugins/fakevim/fakevimhandler.h
+++ b/src/plugins/fakevim/fakevimhandler.h
@@ -58,6 +58,7 @@ public slots:
     // FIXME: good idea?
     void addWidget(QWidget *widget);
     void removeWidget(QWidget *widget);
+    void setCurrentFileName(const QString &fileName);
 
     // This executes an "ex" style command taking context
     // information from \p widget;
@@ -72,6 +73,7 @@ signals:
     void quitRequested(QWidget *);
     void selectionChanged(QWidget *widget,
         const QList<QTextEdit::ExtraSelection> &selection);
+    void writeFile(const QString &fileName, const QString &contents);
 
 private:
     bool eventFilter(QObject *ob, QEvent *ev);
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index 0a06fe7c112700e3fc54a8b108b10c25218d0c85..a27e988f4b4fd7fe81a5b4fa980446ad38ca3801 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -39,7 +39,9 @@
 #include <coreplugin/actionmanager/actionmanager.h>
 #include <coreplugin/coreconstants.h>
 #include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/filemanager.h>
 #include <coreplugin/icore.h>
+#include <coreplugin/ifile.h>
 #include <coreplugin/messagemanager.h>
 #include <coreplugin/modemanager.h>
 #include <coreplugin/uniqueidmanager.h>
@@ -117,12 +119,14 @@ private slots:
     void editorAboutToClose(Core::IEditor *);
     void changeSelection(QWidget *widget,
         const QList<QTextEdit::ExtraSelection> &selections);
+    void writeFile(const QString &fileName, const QString &contents);
 
 private:
     FakeVimPlugin *q;
     FakeVimHandler *m_handler;
     QAction *m_installHandlerAction; 
     Core::ICore *m_core;
+    Core::IFile *m_currentFile;
 };
 
 } // namespace Internal
@@ -134,6 +138,7 @@ FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
     m_handler = 0;
     m_installHandlerAction = 0;
     m_core = 0;
+    m_currentFile = 0;
 }
 
 FakeVimPluginPrivate::~FakeVimPluginPrivate()
@@ -206,6 +211,12 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget)
         this, SLOT(changeSelection(QWidget*,QList<QTextEdit::ExtraSelection>)));
 
     m_handler->addWidget(widget);
+    TextEditor::BaseTextEditor* editor =
+        qobject_cast<TextEditor::BaseTextEditor*>(widget);
+    if (editor) {
+        m_currentFile = editor->file();
+        m_handler->setCurrentFileName(editor->file()->fileName());
+    }
 
     BaseTextEditor *bt = qobject_cast<BaseTextEditor *>(widget);
     if (bt) {
@@ -225,12 +236,29 @@ void FakeVimPluginPrivate::installHandler(QWidget *widget)
     }
 }
 
+void FakeVimPluginPrivate::writeFile(const QString &fileName,
+    const QString &contents)
+{
+    if (m_currentFile && fileName == m_currentFile->fileName()) {
+        // Handle that as a special case for nicer interaction with core
+        m_core->fileManager()->blockFileChange(m_currentFile);
+        m_currentFile->save(fileName);
+        m_core->fileManager()->unblockFileChange(m_currentFile);
+    } else {
+        QFile file(fileName);
+        file.open(QIODevice::ReadWrite);
+        { QTextStream ts(&file); ts << contents; }
+        file.close();
+    }
+}
+
 void FakeVimPluginPrivate::removeHandler(QWidget *widget)
 {
     Q_UNUSED(widget);
     m_handler->removeWidget(widget);
     Core::EditorManager::instance()->hideEditorInfoBar(
         QLatin1String(Constants::MINI_BUFFER));
+    m_currentFile = 0;
 }
 
 void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor)
diff --git a/src/plugins/projectexplorer/applicationlauncher.h b/src/plugins/projectexplorer/applicationlauncher.h
index ead2799453e5722472b2508577c62fb1ed7869c3..82876e61f76b372da90ea9694331e3ee953069af 100644
--- a/src/plugins/projectexplorer/applicationlauncher.h
+++ b/src/plugins/projectexplorer/applicationlauncher.h
@@ -37,6 +37,9 @@
 #include <QtCore/QObject>
 #include <QtCore/QStringList>
 #include <QtCore/QProcess>
+#ifndef Q_OS_WIN
+#include <QtCore/QTextCodec>
+#endif
 
 namespace ProjectExplorer {
 namespace Internal {
@@ -88,7 +91,12 @@ private:
     ConsoleProcess *m_consoleProcess;
     Mode m_currentMode;
 
+#ifdef Q_OS_WIN
     WinGuiProcess *m_winGuiProcess;
+#else
+    QTextCodec *m_outputCodec;
+    QTextCodec::ConverterState m_outputCodecState;
+#endif
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/applicationlauncher_win.cpp b/src/plugins/projectexplorer/applicationlauncher_win.cpp
index c6279b4c3cffd0b6da3508b1e44aa594b06808cd..374d26c97b15ea52280e047ba0d59070ea058710 100644
--- a/src/plugins/projectexplorer/applicationlauncher_win.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_win.cpp
@@ -116,10 +116,7 @@ qint64 ApplicationLauncher::applicationPID() const
 
 void ApplicationLauncher::readWinDebugOutput(const QString &output)
 {
-    QString s = output;
-    if (s.endsWith(QLatin1Char('\n')))
-            s.chop(1);
-    emit appendOutput(s);
+    emit appendOutput(output);
 }
 
 void ApplicationLauncher::processStopped()
diff --git a/src/plugins/projectexplorer/applicationlauncher_x11.cpp b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
index 79933d4518bddc89cf995ea2d33f1e8f3e86bb07..78214746a2ee8d0f7de68978a7c29b5c5a57cf6e 100644
--- a/src/plugins/projectexplorer/applicationlauncher_x11.cpp
+++ b/src/plugins/projectexplorer/applicationlauncher_x11.cpp
@@ -41,6 +41,7 @@ using namespace ProjectExplorer::Internal;
 ApplicationLauncher::ApplicationLauncher(QObject *parent)
     : QObject(parent)
 {
+    m_outputCodec = QTextCodec::codecForLocale();
     m_currentMode = Gui;
     m_guiProcess = new QProcess(this);
     m_guiProcess->setReadChannelMode(QProcess::MergedChannels);
@@ -132,13 +133,9 @@ void ApplicationLauncher::guiProcessError()
 
 void ApplicationLauncher::readStandardOutput()
 {
-    m_guiProcess->setReadChannel(QProcess::StandardOutput);
-    while (m_guiProcess->canReadLine()) {
-        QString line = QString::fromLocal8Bit(m_guiProcess->readLine());
-        if (line.endsWith(QLatin1Char('\n')))
-            line.chop(1);
-        emit appendOutput(line);
-    }
+    QByteArray data = m_guiProcess->readAllStandardOutput();
+    emit appendOutput(m_outputCodec->toUnicode(
+            data.constData(), data.length(), &m_outputCodecState));
 }
 
 void ApplicationLauncher::processStopped()
diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.cpp b/src/plugins/projectexplorer/applicationrunconfiguration.cpp
index fc936d2c4311abe7911f03e6af8e20bc3baa42f2..0eeae6e8eef955d0a5dc30ee3710e03d847c6900 100644
--- a/src/plugins/projectexplorer/applicationrunconfiguration.cpp
+++ b/src/plugins/projectexplorer/applicationrunconfiguration.cpp
@@ -141,7 +141,7 @@ void ApplicationRunControl::start()
                                 m_executable, rc->commandLineArguments());
     emit started();
 
-    emit addToOutputWindow(this, tr("Starting %1").arg(m_executable));
+    emit addToOutputWindow(this, tr("Starting %1...").arg(m_executable));
 }
 
 void ApplicationRunControl::stop()
@@ -162,7 +162,7 @@ void ApplicationRunControl::slotError(const QString & err)
 
 void ApplicationRunControl::slotAddToOutputWindow(const QString &line)
 {
-    emit addToOutputWindow(this, Qt::escape(line));
+    emit addToOutputWindowInline(this, line);
 }
 
 void ApplicationRunControl::processExited(int exitCode)
diff --git a/src/plugins/projectexplorer/outputwindow.cpp b/src/plugins/projectexplorer/outputwindow.cpp
index c02f21ff34b32bc597edbf25fc8e3ae669e93ae3..d34c3f2bb0e3645d0928731c72c6b1587d3e5916 100644
--- a/src/plugins/projectexplorer/outputwindow.cpp
+++ b/src/plugins/projectexplorer/outputwindow.cpp
@@ -215,6 +215,12 @@ void OutputPane::appendOutput(RunControl *rc, const QString &out)
     ow->appendOutput(out);
 }
 
+void OutputPane::appendOutputInline(RunControl *rc, const QString &out)
+{
+    OutputWindow *ow = m_outputWindows.value(rc);
+    ow->appendOutputInline(out);
+}
+
 void OutputPane::showTabFor(RunControl *rc)
 {
     OutputWindow *ow = m_outputWindows.value(rc);
@@ -318,7 +324,16 @@ OutputWindow::~OutputWindow()
 
 void OutputWindow::appendOutput(const QString &out)
 {
-    appendPlainText(out);
+    if (out.endsWith('\n'))
+        appendPlainText(out);
+    else
+        appendPlainText(out + '\n');
+}
+
+void OutputWindow::appendOutputInline(const QString &out)
+{
+    moveCursor(QTextCursor::End);
+    insertPlainText(out);
 }
 
 void OutputWindow::insertLine()
diff --git a/src/plugins/projectexplorer/outputwindow.h b/src/plugins/projectexplorer/outputwindow.h
index 6bda6121af66f36e9b81ccc80ea60f1469f2ac8b..674f25cd51d728f41fd45b216e3faa73ee7e6fa4 100644
--- a/src/plugins/projectexplorer/outputwindow.h
+++ b/src/plugins/projectexplorer/outputwindow.h
@@ -83,6 +83,7 @@ public:
     // ApplicationOutputspecifics
     void createNewOutputWindow(RunControl *rc);
     void appendOutput(RunControl *rc, const QString &out);
+    void appendOutputInline(RunControl *rc, const QString &out);
     void showTabFor(RunControl *rc);
     
 public slots:
@@ -119,6 +120,7 @@ public:
     ~OutputWindow();
 
     void appendOutput(const QString &out);
+    void appendOutputInline(const QString &out);
     void insertLine();
 };
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2d6224bbdda90745ef71dee7fa8f90e7084f4f4a..c6cb624fb86bcc68d1bac08a803dc8049de768cd 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1084,6 +1084,8 @@ void ProjectExplorerPlugin::buildQueueFinished(bool success)
 
             connect(control, SIGNAL(addToOutputWindow(RunControl *, const QString &)),
                     this, SLOT(addToApplicationOutputWindow(RunControl *, const QString &)));
+            connect(control, SIGNAL(addToOutputWindowInline(RunControl *, const QString &)),
+                    this, SLOT(addToApplicationOutputWindowInline(RunControl *, const QString &)));
             connect(control, SIGNAL(error(RunControl *, const QString &)),
                     this, SLOT(addErrorToApplicationOutputWindow(RunControl *, const QString &)));
             connect(control, SIGNAL(finished()),
@@ -1379,6 +1381,11 @@ void ProjectExplorerPlugin::addToApplicationOutputWindow(RunControl *rc, const Q
     m_outputPane->appendOutput(rc, line);
 }
 
+void ProjectExplorerPlugin::addToApplicationOutputWindowInline(RunControl *rc, const QString &line)
+{
+    m_outputPane->appendOutputInline(rc, line);
+}
+
 void ProjectExplorerPlugin::addErrorToApplicationOutputWindow(RunControl *rc, const QString &error)
 {
     m_outputPane->appendOutput(rc, error);
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 2c1127ff5c63b06ef201db6f6a41d4359bace26e..1d270226d1ae1c370634be30a06fcd4720f698d3 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -180,6 +180,7 @@ private slots:
     void updateRunAction();
 
     void addToApplicationOutputWindow(RunControl *, const QString &line);
+    void addToApplicationOutputWindowInline(RunControl *, const QString &line);
     void addErrorToApplicationOutputWindow(RunControl *, const QString &error);
     void updateTaskActions();
 
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index acc11cd932ad0bdd68495d5287ddbc9968e8ea33..0bd593c20e24c40abd388252924694f234776908 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -143,6 +143,7 @@ public:
     QSharedPointer<RunConfiguration> runConfiguration();
 signals:
     void addToOutputWindow(RunControl *, const QString &line);
+    void addToOutputWindowInline(RunControl *, const QString &line);
     void error(RunControl *, const QString &error);
     void started();
     void finished();
diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp
index 14fb56a38e951e040bc2e3bdc527a38e391605cb..c7bf1e5803503c0e085fcb8ffacc02cf47adf403 100644
--- a/src/plugins/qt4projectmanager/qt4nodes.cpp
+++ b/src/plugins/qt4projectmanager/qt4nodes.cpp
@@ -730,9 +730,7 @@ namespace {
 // updateSourceFiles() for files that changed
 // It does so by storing a modification time for each ui file we know about.
 
-// TODO this function should also be called if the build configuration changes
-// since the build directory could change, and thus the generated files that are present
-// TODO check that it works
+// TODO this function should also be called if the build directory is changed
 void Qt4ProFileNode::updateUiFiles()
 {
     // Only those two project types can have ui files for us
diff --git a/src/plugins/qt4projectmanager/speinfo.cpp b/src/plugins/qt4projectmanager/speinfo.cpp
index 04df918bb518e1a877a620382cddcadabf0c5196..16fa58741275bfbace74948515f5dd36e805df75 100644
--- a/src/plugins/qt4projectmanager/speinfo.cpp
+++ b/src/plugins/qt4projectmanager/speinfo.cpp
@@ -491,7 +491,7 @@ public:
 class InfoItemModulesTest : public SPEInfoItem
 {
 public:
-    InfoItemModulesTest(): SPEInfoItem("qtestlib", QtModule)
+    InfoItemModulesTest(): SPEInfoItem("testlib", QtModule)
     {
         m_data.insert(keyIncludedByDefault, false);
     }
diff --git a/tests/manual/gdbdebugger/simple/plugin.cpp b/tests/manual/gdbdebugger/simple/plugin.cpp
index 4e02c7f9f7e5628c7b000cfa93a41684dc0905d8..5e140d5811e85b65fbabd3307d2a2e0ada9aeade 100644
--- a/tests/manual/gdbdebugger/simple/plugin.cpp
+++ b/tests/manual/gdbdebugger/simple/plugin.cpp
@@ -39,6 +39,6 @@ extern "C" Q_DECL_EXPORT int pluginTest()
     int s = 0;
     for (int i = 1; i != 2000; ++i)
         s += i; 
-    fprintf(stderr, "in plugin test");
+    fprintf(stderr, "in plugin test\n");
     return s;
 }