diff --git a/share/qtcreator/templates/qt4project/widget.ui b/share/qtcreator/templates/qt4project/widget.ui
index f4e94939e46edcd6e9cecf706a21a2947c3de60a..a804f2044eb4fa69dd5833134fcf3a29e9f5cba3 100644
--- a/share/qtcreator/templates/qt4project/widget.ui
+++ b/share/qtcreator/templates/qt4project/widget.ui
@@ -1,5 +1,5 @@
 <ui version="4.0">
- <class>%CLASS%Class</class>
+ <class>%CLASS%</class>
  <widget class="%BASECLASS%" name="%CLASS%" >
   <property name="geometry" >
    <rect>
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 8805d4555dca6c56a47753d6558d2767e5683eef..6157204867fb29585d7214ce28d8a9daef33229d 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1128,7 +1128,7 @@ void CppCodeCompletion::complete(const TextEditor::CompletionItem &item)
                     if (function->argumentCount() == 0) {
                         extraChars += QLatin1Char('<');
                     }
-                } else {
+                } else if (! function->isAmbiguous()) {
                     extraChars += QLatin1Char('(');
 
                     // If the function takes no arguments, automatically place the closing parenthesis
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 5eda4b77e54ff171c2f081bc3b6f916807352a1a..43bc047f35d53c15d00db55713baf3c664b0c7e2 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -214,7 +214,6 @@ private:
     Document::Ptr m_currentDoc;
     QSet<QString> m_todo;
     QSet<QString> m_processed;
-    QFutureSynchronizer<void> m_synchronizer;
 };
 
 } // namespace Internal
@@ -224,9 +223,7 @@ CppPreprocessor::CppPreprocessor(QPointer<CppModelManager> modelManager)
     : snapshot(modelManager->snapshot()),
       m_modelManager(modelManager),
       preprocess(this, &env)
-{
-    m_synchronizer.setCancelOnWait(true);
-}
+{ }
 
 CppPreprocessor::~CppPreprocessor()
 { }
@@ -510,7 +507,9 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
     snapshot.insert(doc->fileName(), doc);
     m_todo.remove(fileName);
 
-    m_synchronizer.addFuture(QtConcurrent::run(Process(m_modelManager), doc));
+    Process process(m_modelManager);
+
+    process(doc);
 
     (void) switchDocument(previousDoc);
 }
diff --git a/src/plugins/designer/cpp/formclasswizardparameters.cpp b/src/plugins/designer/cpp/formclasswizardparameters.cpp
index 2c2cde09cf3ad4ced2bc5a3b75808fee2a1ec23c..c7f7407e92588ed568cfa9675ebcfc122cf32968 100644
--- a/src/plugins/designer/cpp/formclasswizardparameters.cpp
+++ b/src/plugins/designer/cpp/formclasswizardparameters.cpp
@@ -162,6 +162,7 @@ bool FormClassWizardParameters::generateCpp(QString *header, QString *source, in
     if (languageChange) {
         sourceStr  << '\n' << namespaceIndent << "void " << unqualifiedClassName << "::" << "changeEvent(QEvent *e)\n"
         << namespaceIndent << "{\n"
+        << namespaceIndent << indent << formBaseClass << "::changeEvent(e);\n"
         << namespaceIndent << indent << "switch (e->type()) {\n" << namespaceIndent << indent << "case QEvent::LanguageChange:\n"
         << namespaceIndent << indent << indent;
         if (embedding != InheritedUiClass)
diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp
index 9c778555d9db379a56c82cc74723be66255ef850..23c597b204e112c03fcb45e125ce3a4dbfcbd3bd 100644
--- a/src/plugins/git/branchmodel.cpp
+++ b/src/plugins/git/branchmodel.cpp
@@ -109,7 +109,8 @@ bool RemoteBranchModel::refreshBranches(const QString &workingDirectory, bool re
                                         int *currentBranch, QString *errorMessage)
 {
     // Run branch command with verbose.
-    QStringList branchArgs(QLatin1String("-v"));
+    QStringList branchArgs;
+    branchArgs << QLatin1String(GitClient::noColorOption) << QLatin1String("-v");
     QString output;
     *currentBranch = -1;
     if (remoteBranches)
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 25a134bd46a9c8767b0dde54499d86094275f005..c7558f1a18f9ce111512e6f0b10e8a3e76ea4449 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -57,8 +57,8 @@
 using namespace Git;
 using namespace Git::Internal;
 
-const char *const kGitDirectoryC = ".git";
-const char *const kBranchIndicatorC = "# On branch";
+static const char *const kGitDirectoryC = ".git";
+static const char *const kBranchIndicatorC = "# On branch";
 
 static inline QString msgServerFailure()
 {
@@ -108,6 +108,8 @@ GitClient::~GitClient()
 {
 }
 
+const char *GitClient::noColorOption = "--no-color";
+
 QString GitClient::findRepositoryForFile(const QString &fileName)
 {
     const QString gitDirectory = QLatin1String(kGitDirectoryC);
@@ -201,22 +203,24 @@ void GitClient::diff(const QString &workingDirectory,
     // when using the submit dialog.
     GitCommand *command = createCommand(workingDirectory, editor);
     // Directory diff?
+    QStringList commonDiffArgs;
+    commonDiffArgs << QLatin1String("diff") << QLatin1String(noColorOption);
     if (unstagedFileNames.empty() && stagedFileNames.empty()) {
-       QStringList arguments;
-       arguments << QLatin1String("diff") << diffArgs;
+       QStringList arguments(commonDiffArgs);
+       arguments << diffArgs;
        m_plugin->outputWindow()->append(formatCommand(binary, arguments));
        command->addJob(arguments, m_settings.timeout);
     } else {
         // Files diff.
         if (!unstagedFileNames.empty()) {
-           QStringList arguments;
-           arguments << QLatin1String("diff") << diffArgs << QLatin1String("--") << unstagedFileNames;
+           QStringList arguments(commonDiffArgs);
+           arguments << QLatin1String("--") << unstagedFileNames;
            m_plugin->outputWindow()->append(formatCommand(binary, arguments));
            command->addJob(arguments, m_settings.timeout);
         }
         if (!stagedFileNames.empty()) {
-           QStringList arguments;
-           arguments << QLatin1String("diff") << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames;
+           QStringList arguments(commonDiffArgs);
+           arguments << QLatin1String("--cached") << diffArgs << QLatin1String("--") << stagedFileNames;
            m_plugin->outputWindow()->append(formatCommand(binary, arguments));
            command->addJob(arguments, m_settings.timeout);
         }
@@ -231,9 +235,9 @@ void GitClient::diff(const QString &workingDirectory,
     if (Git::Constants::debug)
         qDebug() << "diff" << workingDirectory << fileName;
     QStringList arguments;
-    arguments << QLatin1String("diff");
+    arguments << QLatin1String("diff") << QLatin1String(noColorOption);
     if (!fileName.isEmpty())
-        arguments << diffArgs << QLatin1String("--") << fileName;
+        arguments << diffArgs  << QLatin1String("--") << fileName;
 
     const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND);
     const QString title = tr("Git Diff %1").arg(fileName);
@@ -245,6 +249,7 @@ void GitClient::diff(const QString &workingDirectory,
 
 void GitClient::status(const QString &workingDirectory)
 {
+    // @TODO: Use "--no-color" once it is supported
     QStringList statusArgs(QLatin1String("status"));
     statusArgs << QLatin1String("-u");
     executeGit(workingDirectory, statusArgs, 0, true);
@@ -255,7 +260,8 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName)
     if (Git::Constants::debug)
         qDebug() << "log" << workingDirectory << fileName;
 
-    QStringList arguments(QLatin1String("log"));
+    QStringList arguments;
+    arguments << QLatin1String("log") << QLatin1String(noColorOption);
 
     if (m_settings.logCount > 0)
          arguments << QLatin1String("-n") << QString::number(m_settings.logCount);
@@ -274,8 +280,8 @@ void GitClient::show(const QString &source, const QString &id)
 {
     if (Git::Constants::debug)
         qDebug() << "show" << source << id;
-    QStringList arguments(QLatin1String("show"));
-    arguments << id;
+    QStringList arguments;
+    arguments << QLatin1String("show") << QLatin1String(noColorOption) << id;
 
     const QString title =  tr("Git Show %1").arg(id);
     const QString kind = QLatin1String(Git::Constants::GIT_DIFF_EDITOR_KIND);
@@ -450,7 +456,7 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString &
     if (Git::Constants::debug)
         qDebug() << Q_FUNC_INFO << workingDirectory << id;
     QStringList args(QLatin1String("show"));
-    args << id;
+    args << QLatin1String(noColorOption) << id;
     QByteArray outputText;
     QByteArray errorText;
     const bool rc = synchronousGit(workingDirectory, args, &outputText, &errorText);
@@ -633,10 +639,12 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
     // Run 'status'. Note that git returns exitcode 1 if there are no added files.
     QByteArray outputText;
     QByteArray errorText;
+    // @TODO: Use "--no-color" once it is supported
     QStringList statusArgs(QLatin1String("status"));
     if (untracked)
         statusArgs << QLatin1String("-u");
     const bool statusRc = synchronousGit(workingDirectory, statusArgs, &outputText, &errorText);
+    GitCommand::removeColorCodes(&outputText);
     if (output)
         *output = QString::fromLocal8Bit(outputText).remove(QLatin1Char('\r'));
     // Is it something really fatal?
@@ -958,14 +966,14 @@ void GitClient::stashPop(const QString &workingDirectory)
 void GitClient::branchList(const QString &workingDirectory)
 {
     QStringList arguments(QLatin1String("branch"));
-    arguments << QLatin1String("-r");
+    arguments << QLatin1String("-r") << QLatin1String(noColorOption);
     executeGit(workingDirectory, arguments, 0, true);
 }
 
 void GitClient::stashList(const QString &workingDirectory)
 {
     QStringList arguments(QLatin1String("stash"));
-    arguments << QLatin1String("list");
+    arguments << QLatin1String("list") << QLatin1String(noColorOption);
     executeGit(workingDirectory, arguments, 0, true);
 }
 
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 5a9d96e7b986d35dc5826f9a8722cc420672f3e2..046e08bc239ea275c5e105435b0926c5d1b6112a 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -135,6 +135,8 @@ public:
 
     static QString msgNoChangedFiles();
 
+    static const char *noColorOption;
+
 public slots:
     void show(const QString &source, const QString &id);
 
diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp
index dd1c3882b04c4801fef52b15b46ce3da9973dfc8..47d792d53af90a2ca13bc35752157df00b4bbb51 100644
--- a/src/plugins/git/gitcommand.cpp
+++ b/src/plugins/git/gitcommand.cpp
@@ -121,6 +121,10 @@ void GitCommand::run()
     // Special hack: Always produce output for diff
     if (ok && output.isEmpty() && m_jobs.front().arguments.at(0) == QLatin1String("diff")) {
         output += "The file does not differ from HEAD";
+    } else {
+        // @TODO: Remove, see below
+        if (ok && m_jobs.front().arguments.at(0) == QLatin1String("status"))
+            removeColorCodes(&output);
     }
 
     if (ok && !output.isEmpty())
@@ -133,5 +137,28 @@ void GitCommand::run()
     this->deleteLater();
 }
 
+// Clean output from carriage return and ANSI color codes.
+// @TODO: Remove once all relevant commands support "--no-color",
+//("status" is  missing it as of git 1.6.2)
+
+void GitCommand::removeColorCodes(QByteArray *data)
+{
+    // Remove ansi color codes that look like "ESC[<stuff>m"
+    const QByteArray ansiColorEscape("\033[");
+    int escapePos = 0;
+    while (true) {
+        const int nextEscapePos = data->indexOf(ansiColorEscape, escapePos);
+        if (nextEscapePos == -1)
+            break;
+        const int endEscapePos = data->indexOf('m', nextEscapePos + ansiColorEscape.size());
+        if (endEscapePos != -1) {
+            data->remove(nextEscapePos, endEscapePos - nextEscapePos + 1);
+            escapePos = nextEscapePos;
+        } else {
+            escapePos = nextEscapePos + ansiColorEscape.size();
+        }
+    }
+}
+
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h
index 8f32bd6862b53100656d959452c82137e731f4cb..f4bdb34768a2594bdcffa9f2d85ba2c77bc25553 100644
--- a/src/plugins/git/gitcommand.h
+++ b/src/plugins/git/gitcommand.h
@@ -50,6 +50,10 @@ public:
     void addJob(const QStringList &arguments, int timeout);
     void execute();
 
+    // Clean output from carriage return and ANSI color codes.
+    // Workaround until all relevant commands support "--no-color".
+    static void removeColorCodes(QByteArray *data);
+
 private:
     void run();
 
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 19373cdadae9678ae11f8e1bf2399b48102f3ba0..1f051146bf497c85167c933b7cc27738f44d7aaa 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1682,6 +1682,10 @@ FunctionDeclaratorAST *FunctionDeclaratorAST::clone(MemoryPool *pool) const
 void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
+        accept(parameters, visitor);
+        for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
+            accept(it, visitor);
+        accept(exception_specification, visitor);
     }
     visitor->endVisit(this);
 }
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 9093cb650f49ea9cdd03ab5e2ba4cd76e530022e..3f3f802506f462246e200d112f832a4ab47a2b27 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -805,6 +805,7 @@ public:
     unsigned rparen_token;
     SpecifierAST *cv_qualifier_seq;
     ExceptionSpecificationAST *exception_specification;
+    ExpressionAST *as_cpp_initializer;
 
 public: // annotations
     Function *symbol;
diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp
index f1cc0a3f981d754515ea54c6db505f7cd491bca3..ceef0d1d0559e7cce77719b7a1c87cd4f546220f 100644
--- a/src/shared/cplusplus/CheckDeclarator.cpp
+++ b/src/shared/cplusplus/CheckDeclarator.cpp
@@ -157,6 +157,7 @@ bool CheckDeclarator::visit(NestedDeclaratorAST *ast)
 bool CheckDeclarator::visit(FunctionDeclaratorAST *ast)
 {
     Function *fun = control()->newFunction(ast->firstToken());
+    fun->setAmbiguous(ast->as_cpp_initializer != 0);
     ast->symbol = fun;
     fun->setReturnType(_fullySpecifiedType);
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index dac159bf22b2c08e973d92b44499fca666b9d080..423a05e05be8352e4ebccc5b24166fbbefc9bfbb 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -977,7 +977,7 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node)
     return false;
 }
 
-bool Parser::parseDeclarator(DeclaratorAST *&node)
+bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer)
 {
     if (! parseCoreDeclarator(node))
         return false;
@@ -988,6 +988,47 @@ bool Parser::parseDeclarator(DeclaratorAST *&node)
         unsigned startOfPostDeclarator = cursor();
 
         if (LA() == T_LPAREN) {
+            if (stopAtCppInitializer) {
+                unsigned lparen_token = cursor();
+                ExpressionAST *initializer = 0;
+
+                bool blocked = blockErrors(true);
+                if (parseInitializer(initializer)) {
+                    if (NestedExpressionAST *expr = initializer->asNestedExpression()) {
+                        if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) {
+                            rewind(lparen_token);
+
+                            // check for ambiguous declarators.
+
+                            consumeToken();
+                            ParameterDeclarationClauseAST *parameter_declaration_clause = 0;
+                            if (parseParameterDeclarationClause(parameter_declaration_clause) && LA() == T_RPAREN) {
+                                unsigned rparen_token = consumeToken();
+
+                                FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST;
+                                ast->lparen_token = lparen_token;
+                                ast->parameters = parameter_declaration_clause;
+                                ast->as_cpp_initializer = initializer;
+                                ast->rparen_token = rparen_token;
+                                *postfix_ptr = ast;
+                                postfix_ptr = &(*postfix_ptr)->next;
+
+                                blockErrors(blocked);
+                                return true;
+                            }
+
+
+                            blockErrors(blocked);
+                            rewind(lparen_token);
+                            return true;
+                        }
+                    }
+                }
+
+                blockErrors(blocked);
+                rewind(lparen_token);
+            }
+
             FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST;
             ast->lparen_token = consumeToken();
             parseParameterDeclarationClause(ast->parameters);
@@ -1494,7 +1535,7 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node,
     if (acceptStructDeclarator && LA() == T_COLON) {
         // anonymous bit-field declaration.
         // ### TODO create the AST
-    } else if (! parseDeclarator(node)) {
+    } else if (! parseDeclarator(node, /*stopAtCppInitializer = */ ! acceptStructDeclarator)) {
         return false;
     }
 
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 638c1147bdd54a54644ae44d19cefb128e7e5dfc..b2d55f3868fe4ac6750740b390054d3700e2a5c9 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -107,7 +107,7 @@ public:
     bool parseSimpleDeclaration(DeclarationAST *&node, bool acceptStructDeclarator = false);
     bool parseDeclarationStatement(StatementAST *&node);
     bool parseCoreDeclarator(DeclaratorAST *&node);
-    bool parseDeclarator(DeclaratorAST *&node);
+    bool parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer = false);
     bool parseDeleteExpression(ExpressionAST *&node);
     bool parseDoStatement(StatementAST *&node);
     bool parseElaboratedTypeSpecifier(SpecifierAST *&node);
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 35d2d9c6906739322d5986500a44b05d10c75b13..5185aa82659a8fd1f5e6897f21abfeab6cc4a5d0 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -255,6 +255,12 @@ bool Function::isPureVirtual() const
 void Function::setPureVirtual(bool isPureVirtual)
 { _isPureVirtual = isPureVirtual; }
 
+bool Function::isAmbiguous() const
+{ return _isAmbiguous; }
+
+void Function::setAmbiguous(bool isAmbiguous)
+{ _isAmbiguous = isAmbiguous; }
+
 void Function::visitSymbol0(SymbolVisitor *visitor)
 {
     if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index a9f8cda5479c26f8d26efd5f7951011318517eb4..8efc0fbdbed0c104a843564817f77520b8131223 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -322,6 +322,9 @@ public:
     virtual Function *asFunctionType()
     { return this; }
 
+    bool isAmbiguous() const; // internal
+    void setAmbiguous(bool isAmbiguous); // internal
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
     virtual void accept0(TypeVisitor *visitor);
@@ -337,6 +340,7 @@ private:
             unsigned _isPureVirtual: 1;
             unsigned _isConst: 1;
             unsigned _isVolatile: 1;
+            unsigned _isAmbiguous: 1;
             unsigned _methodKey: 3;
         };
     };