diff --git a/bin/gdbmacros/gdbmacros.cpp b/bin/gdbmacros/gdbmacros.cpp
index 199b783f45d137abf09d79d56ddcb25e43cf6bc0..9ea2a9aff56749af04c68e2572a8ea5e5fc31079 100644
--- a/bin/gdbmacros/gdbmacros.cpp
+++ b/bin/gdbmacros/gdbmacros.cpp
@@ -122,6 +122,7 @@ int qtGhVersion = QT_VERSION;
 #   include <QImage>
 #endif
 
+#include <list>
 #include <string>
 #include <vector>
 
@@ -406,12 +407,13 @@ struct QDumper
     QDumper &operator<<(unsigned int i);
     QDumper &operator<<(const void *p);
     QDumper &operator<<(qulonglong c);
-    void put(char c);
-    void addCommaIfNeeded();
-    void putBase64Encoded(const char *buf, int n);
     QDumper &operator<<(const char *str);
     QDumper &operator<<(const QByteArray &ba);
     QDumper &operator<<(const QString &str);
+    void put(char c);
+    void addCommaIfNeeded();
+    void putBase64Encoded(const char *buf, int n);
+    void putEllipsis();
     void disarm();
 
     void beginHash(); // start of data hash output
@@ -657,6 +659,11 @@ void QDumper::endHash()
     put('}');
 }
 
+void QDumper::putEllipsis()
+{
+    addCommaIfNeeded();
+    *this << "{name=\"<incomplete>\",value=\"\",type=\"" << innertype << "\"}";
+}
 
 //
 // Some helpers to keep the dumper code short
@@ -815,6 +822,27 @@ static void qDumpInnerValue(QDumper &d, const char *type, const void *addr)
 }
 
 
+static void qDumpInnerValueOrPointer(QDumper &d,
+    const char *type, const char *strippedtype, const void *addr)
+{
+    if (strippedtype) {
+        if (deref(addr)) {
+            P(d, "addr", deref(addr));
+            P(d, "type", strippedtype);
+            qDumpInnerValueHelper(d, strippedtype, deref(addr));
+        } else {
+            P(d, "addr", addr);
+            P(d, "type", strippedtype);
+            P(d, "value", "<null>");
+            P(d, "numchild", "0");
+        }
+    } else {
+        P(d, "addr", addr);
+        P(d, "type", type);
+        qDumpInnerValueHelper(d, type, addr);
+    }
+}
+
 //////////////////////////////////////////////////////////////////////////////
 
 static void qDumpQByteArray(QDumper &d)
@@ -1212,9 +1240,8 @@ static void qDumpQList(QDumper &d)
         bool isInternal = innerSize <= int(sizeof(void*))
             && isMovableType(d.innertype);
 
-    P(d, "internal", (int)isInternal);
-
-    P(d, "childtype", d.innertype);
+        P(d, "internal", (int)isInternal);
+        P(d, "childtype", d.innertype);
         if (n > 1000)
             n = 1000;
         d << ",children=[";
@@ -1244,11 +1271,8 @@ static void qDumpQList(QDumper &d)
             }
             d.endHash();
         }
-        if (n < nn) {
-            d.beginHash();
-            P(d, "value", "<incomplete>");
-            d.endHash();
-        }
+        if (n < nn)
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -1490,7 +1514,6 @@ static void qDumpQObject(QDumper &d)
         d.beginHash();
             P(d, "name", "methods");
             P(d, "exp", "*(class '"NS"QObject'*)" << d.data);
-            P(d, "type", NS"QObjectMethodList");
             P(d, "value", "<" << mo->methodCount() << " items>");
             P(d, "numchild", mo->methodCount());
         d.endHash();
@@ -1876,11 +1899,7 @@ static void qDumpQSet(QDumper &d)
                 d.endHash();
                 ++i;
                 if (i > 10000) {
-                    d.beginHash();
-                    P(d, "name", "Warning:");
-                    P(d, "value", "<incomplete>");
-                    P(d, "type", "");
-                    d.endHash();
+                    d.putEllipsis();
                     break;
                 }
             }
@@ -1935,13 +1954,8 @@ static void qDumpQStringList(QDumper &d)
             P(d, "valueencoded", "1");
             d.endHash();
         }
-        if (n < list.size()) {
-            d.beginHash();
-            P(d, "name", "Warning:");
-            P(d, "value", "<incomplete>");
-            P(d, "type", "");
-            d.endHash();
-        }
+        if (n < list.size())
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2065,37 +2079,68 @@ static void qDumpQVector(QDumper &d)
     P(d, "valuedisabled", "true");
     P(d, "numchild", n);
     if (d.dumpChildren) {
-        bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
-
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
         d << ",children=[";
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             P(d, "name", "[" << i << "]");
-            const void *p = addOffset(v, i * innersize + typeddatasize);
-            if (innerTypeIsPointer) {
-                if (deref(p)) {
-                    //P(d, "value","@" << p);
-                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
-                } else {
-                    P(d, "type", d.innertype);
-                    P(d, "value", "<null>");
-                    P(d, "numchild", "0");
-                }
-            } else {
-                qDumpInnerValue(d, d.innertype, p);
-            }
+            qDumpInnerValueOrPointer(d, d.innertype, stripped,
+                addOffset(v, i * innersize + typeddatasize));
             d.endHash();
         }
-        if (n < nn) {
+        if (n < nn)
+            d.putEllipsis();
+        d << "]";
+    }
+    d.disarm();
+}
+
+static void qDumpStdList(QDumper &d)
+{
+    const std::list<int> &list = *reinterpret_cast<const std::list<int> *>(d.data);
+    const void *p = d.data;
+    qCheckAccess(p);
+    p = deref(p);
+    qCheckAccess(p);
+    p = deref(p);
+    qCheckAccess(p);
+    p = deref(addOffset(d.data, sizeof(void*)));
+    qCheckAccess(p);
+    p = deref(addOffset(p, sizeof(void*)));
+    qCheckAccess(p);
+    p = deref(addOffset(p, sizeof(void*)));
+    qCheckAccess(p);
+
+    int nn = 0;
+    std::list<int>::const_iterator it = list.begin();
+    for (; nn < 101 && it != list.end(); ++nn, ++it)
+        qCheckAccess(it.operator->());
+
+    if (nn > 100)
+        P(d, "value", "<more than 100 items>");
+    else
+        P(d, "value", "<" << nn << " items>");
+    P(d, "numchild", nn);
+
+    P(d, "valuedisabled", "true");
+    if (d.dumpChildren) {
+        QByteArray strippedInnerType = stripPointerType(d.innertype);
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
+        d << ",children=[";
+        it = list.begin();
+        for (int i = 0; i < 1000 && it != list.end(); ++i, ++it) {
             d.beginHash();
-            P(d, "name", "[...]");
-            P(d, "value", "<incomplete>");
-            P(d, "type", d.innertype);
+            P(d, "name", "[" << i << "]");
+            qDumpInnerValueOrPointer(d, d.innertype, stripped, it.operator->());
             d.endHash();
         }
+        if (it != list.end())
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2167,37 +2212,21 @@ static void qDumpStdVector(QDumper &d)
     P(d, "numchild", n);
     if (d.dumpChildren) {
         unsigned innersize = d.extraInt[0];
-        bool innerTypeIsPointer = isPointerType(d.innertype);
         QByteArray strippedInnerType = stripPointerType(d.innertype);
-
+        const char *stripped =
+            isPointerType(d.innertype) ? strippedInnerType.data() : 0;
         if (n > 1000)
             n = 1000;
         d << ",children=[";
         for (int i = 0; i != n; ++i) {
             d.beginHash();
             P(d, "name", "[" << i << "]");
-            const void *p = addOffset(v->start, i * innersize);
-            if (innerTypeIsPointer) {
-                if (deref(p)) {
-                    //P(d, "value","@" << p);
-                    qDumpInnerValue(d, strippedInnerType.data(), deref(p));
-                } else {
-                    P(d, "type", d.innertype);
-                    P(d, "value", "<null>");
-                    P(d, "numchild", "0");
-                }
-            } else {
-                qDumpInnerValue(d, d.innertype, p);
-            }
-            d.endHash();
-        }
-        if (n < nn) {
-            d.beginHash();
-            P(d, "name", "[...]");
-            P(d, "value", "<incomplete>");
-            P(d, "type", d.innertype);
+            qDumpInnerValueOrPointer(d, d.innertype, stripped,
+                addOffset(v->start, i * innersize));
             d.endHash();
         }
+        if (n < nn)
+            d.putEllipsis();
         d << "]";
     }
     d.disarm();
@@ -2325,6 +2354,8 @@ static void handleProtocolVersion2and3(QDumper & d)
                 qDumpStdVector(d);
             else if (isEqual(type, "std::vector::bool"))
                 qDumpStdVectorBool(d);
+            else if (isEqual(type, "std::list"))
+                qDumpStdList(d);
             else if (isEqual(type, "string"))
                 qDumpStdString(d);
             else if (isEqual(type, "std::string"))
diff --git a/shared/cplusplus/Keywords.cpp b/shared/cplusplus/Keywords.cpp
index 0e19b6b1d4f1be79f24c048cc18adbe41e71068e..d5ec6b5d432ead6b2454c6f92ac2f58a6591471b 100644
--- a/shared/cplusplus/Keywords.cpp
+++ b/shared/cplusplus/Keywords.cpp
@@ -1208,4 +1208,141 @@ int Lexer::classify(const char *s, int n, bool q) {
   } // switch
 }
 
+static inline int classifyOperator2(const char *s) {
+  if (s[0] == 'o') {
+    if (s[1] == 'r') {
+      return T_OR;
+    }
+  }
+  return T_IDENTIFIER;
+}
+
+static inline int classifyOperator3(const char *s) {
+  if (s[0] == 'a') {
+    if (s[1] == 'n') {
+      if (s[2] == 'd') {
+        return T_AND;
+      }
+    }
+  }
+  else if (s[0] == 'n') {
+    if (s[1] == 'o') {
+      if (s[2] == 't') {
+        return T_NOT;
+      }
+    }
+  }
+  else if (s[0] == 'x') {
+    if (s[1] == 'o') {
+      if (s[2] == 'r') {
+        return T_XOR;
+      }
+    }
+  }
+  return T_IDENTIFIER;
+}
+
+static inline int classifyOperator5(const char *s) {
+  if (s[0] == 'b') {
+    if (s[1] == 'i') {
+      if (s[2] == 't') {
+        if (s[3] == 'o') {
+          if (s[4] == 'r') {
+            return T_BITOR;
+          }
+        }
+      }
+    }
+  }
+  else if (s[0] == 'c') {
+    if (s[1] == 'o') {
+      if (s[2] == 'm') {
+        if (s[3] == 'p') {
+          if (s[4] == 'l') {
+            return T_COMPL;
+          }
+        }
+      }
+    }
+  }
+  else if (s[0] == 'o') {
+    if (s[1] == 'r') {
+      if (s[2] == '_') {
+        if (s[3] == 'e') {
+          if (s[4] == 'q') {
+            return T_OR_EQ;
+          }
+        }
+      }
+    }
+  }
+  return T_IDENTIFIER;
+}
+
+static inline int classifyOperator6(const char *s) {
+  if (s[0] == 'a') {
+    if (s[1] == 'n') {
+      if (s[2] == 'd') {
+        if (s[3] == '_') {
+          if (s[4] == 'e') {
+            if (s[5] == 'q') {
+              return T_AND_EQ;
+            }
+          }
+        }
+      }
+    }
+  }
+  else if (s[0] == 'b') {
+    if (s[1] == 'i') {
+      if (s[2] == 't') {
+        if (s[3] == 'a') {
+          if (s[4] == 'n') {
+            if (s[5] == 'd') {
+              return T_BITAND;
+            }
+          }
+        }
+      }
+    }
+  }
+  else if (s[0] == 'n') {
+    if (s[1] == 'o') {
+      if (s[2] == 't') {
+        if (s[3] == '_') {
+          if (s[4] == 'e') {
+            if (s[5] == 'q') {
+              return T_NOT_EQ;
+            }
+          }
+        }
+      }
+    }
+  }
+  else if (s[0] == 'x') {
+    if (s[1] == 'o') {
+      if (s[2] == 'r') {
+        if (s[3] == '_') {
+          if (s[4] == 'e') {
+            if (s[5] == 'q') {
+              return T_XOR_EQ;
+            }
+          }
+        }
+      }
+    }
+  }
+  return T_IDENTIFIER;
+}
+
+int Lexer::classifyOperator(const char *s, int n) {
+  switch (n) {
+    case 2: return classifyOperator2(s);
+    case 3: return classifyOperator3(s);
+    case 5: return classifyOperator5(s);
+    case 6: return classifyOperator6(s);
+    default: return T_IDENTIFIER;
+  } // switch
+}
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/shared/cplusplus/Lexer.cpp b/shared/cplusplus/Lexer.cpp
index af6f09f74d211d285249c8601829bd2af4cee89f..2e9ae98c1e0c90aac35c1f44387903a9650b52eb 100644
--- a/shared/cplusplus/Lexer.cpp
+++ b/shared/cplusplus/Lexer.cpp
@@ -589,8 +589,13 @@ void Lexer::scan_helper(Token *tok)
                 tok->kind = classify(yytext, yylen, _qtMocRunEnabled);
             else
                 tok->kind = T_IDENTIFIER;
-            if (tok->kind == T_IDENTIFIER && control())
-                tok->identifier = control()->findOrInsertIdentifier(yytext, yylen);
+
+            if (tok->kind == T_IDENTIFIER) {
+                tok->kind = classifyOperator(yytext, yylen);
+
+                if (control())
+                    tok->identifier = control()->findOrInsertIdentifier(yytext, yylen);
+            }
             break;
         } else if (std::isdigit(ch)) {
             const char *yytext = _currentChar - 1;
diff --git a/shared/cplusplus/Lexer.h b/shared/cplusplus/Lexer.h
index 1d85a58eb9fb41664b4b21de4f2c66e32b1e4f6b..57f9d3e1362244dff7456957410fd97ad4977404 100644
--- a/shared/cplusplus/Lexer.h
+++ b/shared/cplusplus/Lexer.h
@@ -112,6 +112,7 @@ private:
     void scan_helper(Token *tok);
     void setSource(const char *firstChar, const char *lastChar);
     static int classify(const char *string, int length, bool q);
+    static int classifyOperator(const char *string, int length);
 
     inline void yyinp()
     {
diff --git a/shared/cplusplus/Token.h b/shared/cplusplus/Token.h
index e172fea568059b365014a66c28a972136b57babd..f017bbc8e7ed9a3acdfa54b48ee3052fee34baa3 100644
--- a/shared/cplusplus/Token.h
+++ b/shared/cplusplus/Token.h
@@ -209,7 +209,19 @@ enum Kind {
 
     T_LAST_KEYWORD = T_SLOTS,
 
-    // ### aliases
+    // aliases
+    T_OR = T_PIPE_PIPE,
+    T_AND = T_AMPER_AMPER,
+    T_NOT = T_EXCLAIM,
+    T_XOR = T_CARET,
+    T_BITOR = T_PIPE,
+    T_COMPL = T_TILDE,
+    T_OR_EQ = T_PIPE_EQUAL,
+    T_AND_EQ = T_AMPER_EQUAL,
+    T_BITAND = T_AMPER,
+    T_NOT_EQ = T_EXCLAIM_EQUAL,
+    T_XOR_EQ = T_CARET_EQUAL,
+
     T___ASM = T_ASM,
     T___ASM__ = T_ASM,
 
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 3e619548a2334a64790d5973612b06cca5c90dfe..d670e7e0018ba051a62f037959d1feeb59f6370d 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -33,8 +33,6 @@
 
 #include "CppDocument.h"
 
-#include <utils/qtcassert.h>
-
 #include <Control.h>
 #include <TranslationUnit.h>
 #include <DiagnosticClient.h>
@@ -133,12 +131,16 @@ QString Document::fileName() const
 
 QStringList Document::includedFiles() const
 {
-    return _includedFiles;
+    QStringList files;
+    foreach (const Include &i, _includes)
+        files.append(i.fileName());
+    files.removeDuplicates();
+    return files;
 }
 
-void Document::addIncludeFile(const QString &fileName)
+void Document::addIncludeFile(const QString &fileName, unsigned line)
 {
-    _includedFiles.append(fileName);
+    _includes.append(Include(fileName, line));
 }
 
 void Document::appendMacro(const Macro &macro)
@@ -273,7 +275,7 @@ bool Document::parse(ParseMode mode)
 
 void Document::check()
 {
-    QTC_ASSERT(!_globalNamespace, return);
+    Q_ASSERT(!_globalNamespace);
 
     Semantic semantic(_control);
 
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index aaca36c18eee38455cb94d8ab09db826ad4145b0..b31f0d2bc6456617e7ad1c4a4171b07c2f77a324 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -65,7 +65,7 @@ public:
     QString fileName() const;
 
     QStringList includedFiles() const;
-    void addIncludeFile(const QString &fileName);
+    void addIncludeFile(const QString &fileName, unsigned line);
 
     void appendMacro(const Macro &macro);
     void addMacroUse(const Macro &macro, unsigned offset, unsigned length);
@@ -181,6 +181,22 @@ public:
         { return pos >= _begin && pos < _end; }
     };
 
+    class Include {
+        QString _fileName;
+        unsigned _line;
+
+    public:
+        Include(const QString &fileName, unsigned line)
+            : _fileName(fileName), _line(line)
+        { }
+
+        QString fileName() const
+        { return _fileName; }
+
+        unsigned line() const
+        { return _line; }
+    };
+
     class MacroUse: public Block {
         Macro _macro;
 
@@ -196,6 +212,9 @@ public:
         { return _macro; }
     };
 
+    QList<Include> includes() const
+    { return _includes; }
+
     QList<Block> skippedBlocks() const
     { return _skippedBlocks; }
 
@@ -207,11 +226,11 @@ private:
 
 private:
     QString _fileName;
-    QStringList _includedFiles;
     Control *_control;
     TranslationUnit *_translationUnit;
     Namespace *_globalNamespace;
     QList<DiagnosticMessage> _diagnosticMessages;
+    QList<Include> _includes;
     QList<Macro> _definedMacros;
     QList<Block> _skippedBlocks;
     QList<MacroUse> _macroUses;
diff --git a/src/libs/cplusplus/OverviewModel.cpp b/src/libs/cplusplus/OverviewModel.cpp
index 7f38cb8ba1a2fb8d06deaecfceddc2e23bd162ba..b1b7267027c3b659f018c235923e8ec9ff74e2f2 100644
--- a/src/libs/cplusplus/OverviewModel.cpp
+++ b/src/libs/cplusplus/OverviewModel.cpp
@@ -34,8 +34,6 @@
 #include "OverviewModel.h"
 #include "Overview.h"
 
-#include <utils/qtcassert.h>
-
 #include <Scope.h>
 #include <Semantic.h>
 #include <Literals.h>
@@ -83,13 +81,13 @@ QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent)
         return createIndex(row, column, symbol);
     } else {
         Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
-        QTC_ASSERT(parentSymbol, return QModelIndex());
+        Q_ASSERT(parentSymbol);
 
         ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol();
-        QTC_ASSERT(scopedSymbol, return QModelIndex());
+        Q_ASSERT(scopedSymbol);
 
         Scope *scope = scopedSymbol->members();
-        QTC_ASSERT(scope, return QModelIndex());
+        Q_ASSERT(scope);
 
         return createIndex(row, 0, scope->symbolAt(row));
     }
@@ -126,12 +124,12 @@ int OverviewModel::rowCount(const QModelIndex &parent) const
             if (!parent.parent().isValid() && parent.row() == 0) // account for no symbol item
                 return 0;
             Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
-            QTC_ASSERT(parentSymbol, return 0);
+            Q_ASSERT(parentSymbol);
 
             if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) {
                 if (!scopedSymbol->isFunction()) {
                     Scope *parentScope = scopedSymbol->members();
-                    QTC_ASSERT(parentScope, return 0);
+                    Q_ASSERT(parentScope);
 
                     return parentScope->symbolCount();
                 }
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 6915e1169b0b532e06c797018c883b651fc771f7..0ea9018a353de6936ae0feaece98a7af24d60286 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -45,8 +45,6 @@
 #include <TypeVisitor.h>
 #include <NameVisitor.h>
 
-#include <utils/qtcassert.h>
-
 #include <QtCore/QList>
 #include <QtCore/QtDebug>
 
@@ -100,7 +98,7 @@ protected:
     // types
     virtual void visit(PointerToMemberType * /*ty*/)
     {
-        QTC_ASSERT(false, /**/);
+        Q_ASSERT(false);
     }
 
     virtual void visit(PointerType *ty)
@@ -152,32 +150,32 @@ protected:
     { /* nothing to do*/ }
 
     virtual void visit(Namespace *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(Class *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(Enum *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     // names
     virtual void visit(NameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(TemplateNameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(DestructorNameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(OperatorNameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(ConversionNameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 
     virtual void visit(QualifiedNameId *)
-    { QTC_ASSERT(false, /**/); }
+    { Q_ASSERT(false); }
 };
 
 } // end of anonymous namespace
diff --git a/src/libs/cplusplus/pp-client.h b/src/libs/cplusplus/pp-client.h
index 2fc781f22f559a60cea8595cc7ab1c3690649b55..eead5bf460012dbab5fdf40a63f451a5da3af88c 100644
--- a/src/libs/cplusplus/pp-client.h
+++ b/src/libs/cplusplus/pp-client.h
@@ -63,7 +63,8 @@ public:
   { }
 
   virtual void macroAdded(const Macro &macro) = 0;
-  virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
+  virtual void sourceNeeded(QString &fileName, IncludeType mode,
+                            unsigned line) = 0; // ### FIX the signature.
 
   virtual void startExpandingMacro(unsigned offset,
                                    const Macro &macro,
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index d2ed3ee73f37515cc21fae046765761266e05eda..c33fc8cb15157632632cb7905cf8be1421667d65 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -164,7 +164,15 @@ protected:
     bool process_primary()
     {
         if ((*_lex)->is(T_INT_LITERAL)) {
-            _value.set_long(tokenSpell().toLong());
+            int base = 10;
+            const QByteArray spell = tokenSpell();
+            if (spell.at(0) == '0') {
+                if (spell.size() > 1 && (spell.at(1) == 'x' || spell.at(1) == 'X'))
+                    base = 16;
+                else
+                    base = 8;
+            }
+            _value.set_long(tokenSpell().toLong(0, base));
             ++(*_lex);
             return true;
         } else if (isTokenDefined()) {
@@ -367,7 +375,7 @@ protected:
     {
         process_xor();
 
-        while ((*_lex)->is(T_CARET)) {
+        while ((*_lex)->is(T_PIPE)) {
             const Token op = *(*_lex);
             ++(*_lex);
 
@@ -810,7 +818,7 @@ void pp::processInclude(bool skipCurentPath,
         QString fn = QString::fromUtf8(path.constData(), path.length());
 
         if (client)
-            client->sourceNeeded(fn, Client::IncludeGlobal);
+            client->sourceNeeded(fn, Client::IncludeGlobal, firstToken->lineno);
     } else if (tk->is(T_ANGLE_STRING_LITERAL) || tk->is(T_STRING_LITERAL)) {
         const QByteArray spell = tokenSpell(*tk);
         const char *beginOfPath = spell.constBegin();
@@ -823,7 +831,7 @@ void pp::processInclude(bool skipCurentPath,
             QString fn = QString::fromUtf8(path.constData(), path.length());
 
             if (client)
-                client->sourceNeeded(fn, Client::IncludeLocal);
+                client->sourceNeeded(fn, Client::IncludeLocal, firstToken->lineno);
         }
     }
 }
diff --git a/src/libs/cplusplus/pp-environment.cpp b/src/libs/cplusplus/pp-environment.cpp
index 20491727a4ceb2cb9be060cc0d7e9a998ea92794..dd839087a40c54e8281067ed26571eff80f624d5 100644
--- a/src/libs/cplusplus/pp-environment.cpp
+++ b/src/libs/cplusplus/pp-environment.cpp
@@ -53,8 +53,6 @@
 #include "pp-environment.h"
 #include "pp.h"
 
-#include <utils/qtcassert.h>
-
 #include <cstring>
 
 using namespace CPlusPlus;
@@ -93,7 +91,7 @@ Macro *Environment::macroAt(unsigned index) const
 
 Macro *Environment::bind(const Macro &__macro)
 {
-    QTC_ASSERT(! __macro.name.isEmpty(), return 0);
+    Q_ASSERT(! __macro.name.isEmpty());
 
     Macro *m = new Macro (__macro);
     m->hashcode = hash_code(m->name);
diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp
index 83c8ec397ee4ef01e4555c3a29815fca59a2a9c2..615ba5ec2aca73b7d88e68f149820c70c0153b7c 100644
--- a/src/plugins/bookmarks/bookmarksplugin.cpp
+++ b/src/plugins/bookmarks/bookmarksplugin.cpp
@@ -201,14 +201,18 @@ void BookmarksPlugin::updateActions(int state)
 
 void BookmarksPlugin::editorOpened(Core::IEditor *editor)
 {
-    connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
-            this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
+    if (qobject_cast<ITextEditor *>(editor)) {
+        connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
+                this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
+    }
 }
 
 void BookmarksPlugin::editorAboutToClose(Core::IEditor *editor)
 {
-    disconnect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
-            this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
+    if (qobject_cast<ITextEditor *>(editor)) {
+        disconnect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
+                this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
+    }
 }
 
 void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
index 2d8531f3ed7e0c2a620cca6dc86c33a2fce75e2b..0f9758b1429e4c19c1ee3943d8831a73ff889693 100644
--- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp
@@ -47,6 +47,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
     setupUi(this);
     buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
 
+    splitter->setCollapsible(1, false);
     pageTree->header()->setVisible(false);
 
     connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
@@ -59,7 +60,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
 
     int index = 0;
     foreach (IOptionsPage *page, pages) {
-        QTreeWidgetItem *item = new QTreeWidgetItem();
+        QTreeWidgetItem *item = new QTreeWidgetItem;
         item->setText(0, page->name());
         item->setData(0, Qt::UserRole, index);
 
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 8d4a36178ce5150221d75c93bbe216532d935dc0..f233c0121f8f5ce105dce12b72037e4f8cf98842 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -480,13 +480,23 @@ void CPPEditor::jumpToDefinition()
     Document::Ptr doc = m_modelManager->document(file()->fileName());
     if (!doc)
         return;
+
+    QTextCursor tc = textCursor();
+    unsigned lineno = tc.blockNumber() + 1;
+    foreach (const Document::Include &incl, doc->includes()) {
+        if (incl.line() == lineno) {
+            if (TextEditor::BaseTextEditor::openEditorAt(incl.fileName(), 0, 0))
+                return; // done
+            break;
+        }
+    }
+
     Symbol *lastSymbol = doc->findSymbolAt(line, column);
     if (!lastSymbol)
         return;
 
     // Get the expression under the cursor
     const int endOfName = endOfNameUnderCursor();
-    QTextCursor tc = textCursor();
     tc.setPosition(endOfName);
     ExpressionUnderCursor expressionUnderCursor;
     const QString expression = expressionUnderCursor(tc);
diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp
index 1265ef9da7f691a359485df9f547ca6eee688017..f3831e5394d0263ce0be9840ea2ee33019c0f5b3 100644
--- a/src/plugins/cpptools/cpphoverhandler.cpp
+++ b/src/plugins/cpptools/cpphoverhandler.cpp
@@ -175,13 +175,14 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
                 break;
             }
         }
+    }
 
-        if (m_toolTip.isEmpty()) {
-            foreach (const Document::MacroUse use, doc->macroUses()) {
-                if (use.contains(pos)) {
-                    m_toolTip = use.macro().toString();
-                    break;
-                }
+    if (m_toolTip.isEmpty()) {
+        unsigned lineno = tc.blockNumber() + 1;
+        foreach (const Document::Include &incl, doc->includes()) {
+            if (lineno == incl.line()) {
+                m_toolTip = incl.fileName();
+                break;
             }
         }
     }
@@ -240,6 +241,16 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
         }
     }
 
+    if (doc && m_toolTip.isEmpty()) {
+        foreach (const Document::MacroUse &use, doc->macroUses()) {
+            if (use.contains(pos)) {
+                m_toolTip = use.macro().toString();
+                m_helpId = use.macro().name;
+                break;
+            }
+        }
+    }
+
     if (m_helpEngineNeedsSetup
         && m_helpEngine->registeredDocumentations().count() > 0) {
         m_helpEngine->setupData();
@@ -248,7 +259,8 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
 
     if (!m_helpId.isEmpty() && !m_helpEngine->linksForIdentifier(m_helpId).isEmpty()) {
         m_toolTip = QString(QLatin1String("<table><tr><td valign=middle><nobr>%1</td>"
-                                          "<td><img src=\":/cpptools/images/f1.svg\"></td></tr></table>")).arg(Qt::escape(m_toolTip));
+                                          "<td><img src=\":/cpptools/images/f1.svg\"></td></tr></table>"))
+                    .arg(Qt::escape(m_toolTip));
         editor->setContextHelpId(m_helpId);
     } else if (!m_toolTip.isEmpty()) {
         m_toolTip = QString(QLatin1String("<nobr>%1")).arg(Qt::escape(m_toolTip));
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 40888d99f3f770af4f6461e007a6230503ce0eb9..9adc892713d54fb6e8cf8a411d6ed378b01e9e5e 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -138,7 +138,8 @@ protected:
     virtual void stopExpandingMacro(unsigned offset, const Macro &macro);
     virtual void startSkippingBlocks(unsigned offset);
     virtual void stopSkippingBlocks(unsigned offset);
-    virtual void sourceNeeded(QString &fileName, IncludeType type);
+    virtual void sourceNeeded(QString &fileName, IncludeType type,
+                              unsigned line);
 
 private:
     QPointer<CppModelManager> m_modelManager;
@@ -176,7 +177,7 @@ void CppPreprocessor::setProjectFiles(const QStringList &files)
 { m_projectFiles = files; }
 
 void CppPreprocessor::run(QString &fileName)
-{ sourceNeeded(fileName, IncludeGlobal); }
+{ sourceNeeded(fileName, IncludeGlobal, /*line = */ 0); }
 
 void CppPreprocessor::operator()(QString &fileName)
 { run(fileName); }
@@ -361,7 +362,8 @@ void CppPreprocessor::stopSkippingBlocks(unsigned offset)
         m_currentDoc->stopSkippingBlocks(offset);
 }
 
-void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
+void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
+                                   unsigned line)
 {
     if (fileName.isEmpty())
         return;
@@ -369,7 +371,7 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type)
     QByteArray contents = tryIncludeFile(fileName, type);
 
     if (m_currentDoc) {
-        m_currentDoc->addIncludeFile(fileName);
+        m_currentDoc->addIncludeFile(fileName, line);
         if (contents.isEmpty() && ! QFileInfo(fileName).isAbsolute()) {
             QString msg;
             msg += fileName;
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index a01a3ddc57e0d81e136e2945c7bdc8ed5e520ad7..4981f199790ee9a70885b03028a7d0dfbbeb2e6f 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1033,7 +1033,6 @@ void DebuggerManager::addToWatchWindow()
 void DebuggerManager::watchExpression(const QString &expression)
 {
     watchHandler()->watchExpression(expression);
-    //engine()->updateWatchModel();
 }
 
 void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber)
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index d7ac5b1aaa1b4897e1c51bcdcb415aefc75ec271..83473674782dd90e230b7cde2cfdbb2b487dbd15 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -2939,6 +2939,8 @@ bool GdbEngine::isCustomValueDumperAvailable(const QString &type) const
             if (tmplate == "QSet")
                 return true;
         }
+        if (tmplate == "std::list")
+            return true;
         if (tmplate == "std::vector" && inner != "bool")
             return true;
         if (tmplate == "std::basic_string") {
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 053fcadcd199ea8915dc09342b8b9d4462239ec7..6f443c92b47f0af150244046bb326cbd4e06bc15 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -402,18 +402,30 @@ bool WatchHandler::setData(const QModelIndex &idx,
 static QString niceType(QString type)
 {
     if (type.contains("std::")) {
-        static QRegExp re("std::vector<(.*)\\s*,std::allocator<(.*)>\\s*>");
-        re.setMinimal(true);
-
+        // std::string
         type.replace("std::basic_string<char, std::char_traits<char>, "
                      "std::allocator<char> >", "std::string");
+
+        // std::wstring
         type.replace("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
                      "std::allocator<wchar_t> >", "std::wstring");
 
+        // std::vector
+        static QRegExp re1("std::vector<(.*)\\s*,std::allocator<(.*)>\\s*>");
+        re1.setMinimal(true);
+        for (int i = 0; i != 10; ++i) {
+            if (re1.indexIn(type) == -1 || re1.cap(1) != re1.cap(2)) 
+                break;
+            type.replace(re1.cap(0), "std::vector<" + re1.cap(1) + ">");
+        }
+
+        // std::list
+        static QRegExp re2("std::list<(.*)\\s*,std::allocator<(.*)>\\s*>");
+        re2.setMinimal(true);
         for (int i = 0; i != 10; ++i) {
-            if (re.indexIn(type) == -1 || re.cap(1) != re.cap(2)) 
+            if (re2.indexIn(type) == -1 || re2.cap(1) != re2.cap(2)) 
                 break;
-            type.replace(re.cap(0), "std::vector<" + re.cap(1) + ">");
+            type.replace(re2.cap(0), "std::list<" + re2.cap(1) + ">");
         }
 
         type.replace(" >", ">");
@@ -865,9 +877,9 @@ void WatchHandler::watchExpression(const QString &exp)
     data.name = exp;
     data.iname = "watch." + exp;
     insertData(data);
+    emit watchModelUpdateRequested();
 }
 
-
 void WatchHandler::setDisplayedIName(const QString &iname, bool on)
 {
     WatchData *d = findData(iname);
diff --git a/src/plugins/find/findwidget.ui b/src/plugins/find/findwidget.ui
index c85f33629970dc20682ad6155d02ae012028caeb..f4b0c82ed2594414284ba031070350bcb8f9a49d 100644
--- a/src/plugins/find/findwidget.ui
+++ b/src/plugins/find/findwidget.ui
@@ -56,6 +56,9 @@
      </item>
      <item>
       <widget class="QToolButton" name="findPreviousButton">
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
        <property name="arrowType">
         <enum>Qt::LeftArrow</enum>
        </property>
@@ -66,6 +69,9 @@
        <property name="font">
         <font/>
        </property>
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
        <property name="arrowType">
         <enum>Qt::RightArrow</enum>
        </property>
@@ -103,6 +109,9 @@
      </item>
      <item>
       <widget class="QToolButton" name="replacePreviousButton">
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
        <property name="arrowType">
         <enum>Qt::LeftArrow</enum>
        </property>
@@ -113,6 +122,9 @@
        <property name="font">
         <font/>
        </property>
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
        <property name="arrowType">
         <enum>Qt::RightArrow</enum>
        </property>
diff --git a/src/plugins/git/changeselectiondialog.cpp b/src/plugins/git/changeselectiondialog.cpp
index 70004dbadfa7bb5e39320eb99ca5b0646d84b447..46eab385ac817c0273268e08d809cfcb8ff15b32 100644
--- a/src/plugins/git/changeselectiondialog.cpp
+++ b/src/plugins/git/changeselectiondialog.cpp
@@ -43,6 +43,7 @@ ChangeSelectionDialog::ChangeSelectionDialog(QWidget *parent)
 {
     m_ui.setupUi(this);
     connect(m_ui.repositoryButton, SIGNAL(clicked()), this, SLOT(selectWorkingDirectory()));
+    setWindowTitle(tr("Select a Git commit"));
 }
 
 void ChangeSelectionDialog::selectWorkingDirectory()
@@ -59,7 +60,7 @@ void ChangeSelectionDialog::selectWorkingDirectory()
     // the head directory of the repository.
     QDir repository(location);
     do {
-        if (repository.entryList(QDir::AllDirs).contains(QLatin1String(".git"))) {
+        if (repository.entryList(QDir::AllDirs|QDir::Hidden).contains(QLatin1String(".git"))) {
             m_ui.repositoryEdit->setText(repository.absolutePath());
             return;
         }
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index ff0cdbde5e40ca31e081f0f0bb58aae6e39d5eca..466307b4de39cd1c6fbe27979e56cda4ebe90ca1 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -197,7 +197,7 @@ void GitClient::diff(const QString &workingDirectory, const QStringList &fileNam
     const QString title = tr("Git Diff");
 
     VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, workingDirectory, true, "originalFileName", workingDirectory);
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
+    executeGit(workingDirectory, arguments, editor);
 
 }
 
@@ -215,14 +215,14 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName)
     const QString sourceFile = source(workingDirectory, fileName);
 
     VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "originalFileName", sourceFile);
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
+    executeGit(workingDirectory, arguments, editor);
 }
 
 void GitClient::status(const QString &workingDirectory)
 {
     QStringList statusArgs(QLatin1String("status"));
     statusArgs << QLatin1String("-u");
-    executeGit(workingDirectory, statusArgs, m_plugin->outputWindow(), 0,true);
+    executeGit(workingDirectory, statusArgs, 0, true);
 }
 
 void GitClient::log(const QString &workingDirectory, const QString &fileName)
@@ -242,7 +242,7 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName)
     const QString kind = QLatin1String(Git::Constants::GIT_LOG_EDITOR_KIND);
     const QString sourceFile = source(workingDirectory, fileName);
     VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, false, "logFileName", sourceFile);
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
+    executeGit(workingDirectory, arguments, editor);
 }
 
 void GitClient::show(const QString &source, const QString &id)
@@ -258,7 +258,7 @@ void GitClient::show(const QString &source, const QString &id)
 
     const QFileInfo sourceFi(source);
     const QString workDir = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath();
-    executeGit(workDir, arguments, m_plugin->outputWindow(), editor);
+    executeGit(workDir, arguments, editor);
 }
 
 void GitClient::blame(const QString &workingDirectory, const QString &fileName)
@@ -273,7 +273,7 @@ void GitClient::blame(const QString &workingDirectory, const QString &fileName)
     const QString sourceFile = source(workingDirectory, fileName);
 
     VCSBase::VCSBaseEditor *editor = createVCSEditor(kind, title, sourceFile, true, "blameFileName", sourceFile);
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), editor);
+    executeGit(workingDirectory, arguments, editor);
 }
 
 void GitClient::checkout(const QString &workingDirectory, const QString &fileName)
@@ -287,7 +287,7 @@ void GitClient::checkout(const QString &workingDirectory, const QString &fileNam
     arguments << QLatin1String("checkout") << QLatin1String("HEAD") << QLatin1String("--")
             << fileName;
 
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 void GitClient::hardReset(const QString &workingDirectory, const QString &commit)
@@ -297,7 +297,7 @@ void GitClient::hardReset(const QString &workingDirectory, const QString &commit
     if (!commit.isEmpty())
         arguments << commit;
 
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 void GitClient::addFile(const QString &workingDirectory, const QString &fileName)
@@ -305,7 +305,7 @@ void GitClient::addFile(const QString &workingDirectory, const QString &fileName
     QStringList arguments;
     arguments << QLatin1String("add") << fileName;
 
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0,true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 bool GitClient::synchronousAdd(const QString &workingDirectory, const QStringList &files)
@@ -380,13 +380,14 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory,
 }
 
 void GitClient::executeGit(const QString &workingDirectory, const QStringList &arguments,
-                           GitOutputWindow *outputWindow, VCSBase::VCSBaseEditor* editor,
+                           VCSBase::VCSBaseEditor* editor,
                            bool outputToWindow)
 {
     if (Git::Constants::debug)
         qDebug() << "executeGit" << workingDirectory << arguments << editor;
 
-    m_plugin->outputWindow()->append(formatCommand(QLatin1String(kGitCommand), arguments));
+    GitOutputWindow *outputWindow = m_plugin->outputWindow();
+    outputWindow->append(formatCommand(QLatin1String(kGitCommand), arguments));
 
     QProcess process;
     ProjectExplorer::Environment environment = ProjectExplorer::Environment::systemEnvironment();
@@ -396,8 +397,13 @@ void GitClient::executeGit(const QString &workingDirectory, const QStringList &a
 
     GitCommand* command = new GitCommand();
     if (outputToWindow) {
-        connect(command, SIGNAL(outputText(QString)), outputWindow, SLOT(append(QString)));
-        connect(command, SIGNAL(outputData(QByteArray)), outputWindow, SLOT(appendData(QByteArray)));
+        if (!editor) { // assume that the commands output is the important thing
+            connect(command, SIGNAL(outputText(QString)), this, SLOT(appendAndPopup(QString)));
+            connect(command, SIGNAL(outputData(QByteArray)), this, SLOT(appendDataAndPopup(QByteArray)));
+        } else {
+            connect(command, SIGNAL(outputText(QString)), outputWindow, SLOT(append(QString)));
+            connect(command, SIGNAL(outputData(QByteArray)), outputWindow, SLOT(appendData(QByteArray)));
+        }
     } else {
         QTC_ASSERT(editor, /**/);
         connect(command, SIGNAL(outputText(QString)), editor, SLOT(setPlainText(QString)));
@@ -405,11 +411,23 @@ void GitClient::executeGit(const QString &workingDirectory, const QStringList &a
     }
 
     if (outputWindow)
-        connect(command, SIGNAL(errorText(QString)), outputWindow, SLOT(append(QString)));
+        connect(command, SIGNAL(errorText(QString)), this, SLOT(appendAndPopup(QString)));
 
     command->execute(arguments, workingDirectory, environment);
 }
 
+void GitClient::appendDataAndPopup(const QByteArray &data)
+{
+    m_plugin->outputWindow()->appendData(data);
+    m_plugin->outputWindow()->popup(false);
+}
+
+void GitClient::appendAndPopup(const QString &text)
+{
+    m_plugin->outputWindow()->append(text);
+    m_plugin->outputWindow()->popup(false);
+}
+
 bool GitClient::synchronousGit(const QString &workingDirectory,
                                const QStringList &arguments,
                                QByteArray* outputText,
@@ -810,12 +828,12 @@ void GitClient::revert(const QStringList &files)
 
 void GitClient::pull(const QString &workingDirectory)
 {
-    executeGit(workingDirectory, QStringList(QLatin1String("pull")), m_plugin->outputWindow(), 0, true);
+    executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true);
 }
 
 void GitClient::push(const QString &workingDirectory)
 {
-    executeGit(workingDirectory, QStringList(QLatin1String("push")), m_plugin->outputWindow(), 0, true);
+    executeGit(workingDirectory, QStringList(QLatin1String("push")), 0, true);
 }
 
 QString GitClient::msgNoChangedFiles()
@@ -829,7 +847,7 @@ void GitClient::stash(const QString &workingDirectory)
     QString errorMessage;
     switch (gitStatus(workingDirectory, false, 0, &errorMessage)) {
     case  StatusChanged:
-        executeGit(workingDirectory, QStringList(QLatin1String("stash")), m_plugin->outputWindow(), 0, true);
+        executeGit(workingDirectory, QStringList(QLatin1String("stash")), 0, true);
         break;
     case StatusUnchanged:
         m_plugin->outputWindow()->append(msgNoChangedFiles());
@@ -846,21 +864,21 @@ void GitClient::stashPop(const QString &workingDirectory)
 {
     QStringList arguments(QLatin1String("stash"));
     arguments << QLatin1String("pop");
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 void GitClient::branchList(const QString &workingDirectory)
 {
     QStringList arguments(QLatin1String("branch"));
     arguments << QLatin1String("-r");
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 void GitClient::stashList(const QString &workingDirectory)
 {
     QStringList arguments(QLatin1String("stash"));
     arguments << QLatin1String("list");
-    executeGit(workingDirectory, arguments, m_plugin->outputWindow(), 0, true);
+    executeGit(workingDirectory, arguments, 0, true);
 }
 
 QString GitClient::readConfig(const QString &workingDirectory, const QStringList &configVar)
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index efc767e54095e98e8be96022f1bd5ed04cf4989f..eb42b27efcb65501de3c8618713c1103e6b0b9a7 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -130,6 +130,10 @@ public:
 public slots:
     void show(const QString &source, const QString &id);
 
+private slots:
+    void appendAndPopup(const QString &text);
+    void appendDataAndPopup(const QByteArray &data);
+
 private:
     VCSBase::VCSBaseEditor *createVCSEditor(const QString &kind,
                                                  QString title,
@@ -141,7 +145,6 @@ private:
 
     void executeGit(const QString &workingDirectory,
                                            const QStringList &arguments,
-                                           GitOutputWindow *outputWindow,
                                            VCSBase::VCSBaseEditor* editor = 0,
                                            bool outputToWindow = false);
 
diff --git a/src/plugins/git/gitoutputwindow.cpp b/src/plugins/git/gitoutputwindow.cpp
index 375be9095973414a65bf715b3c2c38e7a394ffd0..fbaed2c8413f8118379458bf37cdbb955da9b7e6 100644
--- a/src/plugins/git/gitoutputwindow.cpp
+++ b/src/plugins/git/gitoutputwindow.cpp
@@ -105,7 +105,6 @@ void GitOutputWindow::append(const QString &text)
     foreach (const QString &s, lines)
         m_outputListWidget->addItem(s);
     m_outputListWidget->scrollToBottom();
-    popup();
 }
 
 void GitOutputWindow::setData(const QByteArray &data)
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index d9187f542a9852f7e04bea63f428dcf4e108fd20..f7647fb2d1a83f6a98464e66d2d62e5e4462d3da 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -496,7 +496,7 @@ QString GitPlugin::getWorkingDirectory()
     if (workingDirectory.isEmpty()) {
         m_outputWindow->clearContents();
         m_outputWindow->append(tr("Could not find working directory"));
-        m_outputWindow->popup();
+        m_outputWindow->popup(false);
         return QString();
     }
     return workingDirectory;
@@ -612,6 +612,7 @@ void GitPlugin::startCommit()
     changeTmpFile->setAutoRemove(true);
     if (!changeTmpFile->open()) {
         m_outputWindow->append(tr("Cannot create temporary file: %1").arg(changeTmpFile->errorString()));
+        m_outputWindow->popup(false);
         delete changeTmpFile;
         return;
     }
diff --git a/src/plugins/git/settingspage.ui b/src/plugins/git/settingspage.ui
index aa2337605b8bf95f21521e9e0fdb8fb790ace6d8..151608d03b01d3a8d77e2c725a86fe32bfddf70b 100644
--- a/src/plugins/git/settingspage.ui
+++ b/src/plugins/git/settingspage.ui
@@ -6,114 +6,97 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>436</width>
-    <height>186</height>
+    <width>389</width>
+    <height>183</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QHBoxLayout" name="horizontalLayout">
+  <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <layout class="QVBoxLayout" name="verticalLayout">
-     <item>
-      <widget class="QGroupBox" name="environmentGroupBox">
-       <property name="enabled">
-        <bool>true</bool>
-       </property>
-       <property name="title">
-        <string>Environment variables</string>
-       </property>
-       <property name="checkable">
-        <bool>true</bool>
-       </property>
-       <layout class="QFormLayout" name="formLayout">
-        <item row="0" column="0">
-         <widget class="QLabel" name="pathlabel">
-          <property name="text">
-           <string>PATH:</string>
-          </property>
-         </widget>
-        </item>
-        <item row="0" column="1">
-         <layout class="QHBoxLayout" name="horizontalLayout_2">
-          <item>
-           <widget class="QLineEdit" name="pathLineEdit"/>
-          </item>
-          <item>
-           <widget class="QPushButton" name="adoptButton">
-            <property name="text">
-             <string>From system</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </item>
-        <item row="1" column="0">
-         <widget class="QLabel" name="noteLabel">
-          <property name="text">
-           <string>&lt;b&gt;Note:&lt;/b&gt;</string>
-          </property>
-         </widget>
+    <widget class="QGroupBox" name="environmentGroupBox">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="title">
+      <string>Environment variables</string>
+     </property>
+     <property name="checkable">
+      <bool>true</bool>
+     </property>
+     <layout class="QFormLayout" name="formLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="pathlabel">
+        <property name="text">
+         <string>PATH:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <item>
+         <widget class="QLineEdit" name="pathLineEdit"/>
         </item>
-        <item row="1" column="1">
-         <widget class="QLabel" name="noteFieldlabel">
+        <item>
+         <widget class="QPushButton" name="adoptButton">
           <property name="text">
-           <string>Git needs to find Perl in the environment as well.</string>
+           <string>From system</string>
           </property>
          </widget>
         </item>
        </layout>
-      </widget>
-     </item>
-     <item>
-      <layout class="QFormLayout" name="logFormLayout">
-       <property name="fieldGrowthPolicy">
-        <enum>QFormLayout::ExpandingFieldsGrow</enum>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="noteLabel">
+        <property name="text">
+         <string>&lt;b&gt;Note:&lt;/b&gt;</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLabel" name="noteFieldlabel">
+        <property name="text">
+         <string>Git needs to find Perl in the environment as well.</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <layout class="QFormLayout" name="logFormLayout">
+     <property name="fieldGrowthPolicy">
+      <enum>QFormLayout::ExpandingFieldsGrow</enum>
+     </property>
+     <item row="0" column="1">
+      <widget class="QSpinBox" name="logCountSpinBox">
+       <property name="toolTip">
+        <string>Note that huge amount of commits might take some time.</string>
        </property>
-       <item row="0" column="1">
-        <widget class="QSpinBox" name="logCountSpinBox">
-         <property name="toolTip">
-          <string>Note that huge amount of commits might take some time.</string>
-         </property>
-         <property name="maximum">
-          <number>1000</number>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="0">
-        <widget class="QLabel" name="logCountLabel">
-         <property name="text">
-          <string>Log commit display count:</string>
-         </property>
-        </widget>
-       </item>
-      </layout>
-     </item>
-     <item>
-      <spacer name="verticalSpacer">
-       <property name="orientation">
-        <enum>Qt::Vertical</enum>
+       <property name="maximum">
+        <number>1000</number>
        </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>20</width>
-         <height>40</height>
-        </size>
+      </widget>
+     </item>
+     <item row="0" column="0">
+      <widget class="QLabel" name="logCountLabel">
+       <property name="text">
+        <string>Log commit display count:</string>
        </property>
-      </spacer>
+      </widget>
      </item>
     </layout>
    </item>
    <item>
-    <spacer name="horizontalSpacer">
+    <spacer name="verticalSpacer">
      <property name="orientation">
-      <enum>Qt::Horizontal</enum>
+      <enum>Qt::Vertical</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
-       <width>40</width>
-       <height>20</height>
+       <width>20</width>
+       <height>40</height>
       </size>
      </property>
     </spacer>
diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp
index 6285bb81dee49a304e10cbd99f75607eeef22758..c2197a2dc7c7042ab3cc6c6a6c2dc5b235355391 100644
--- a/src/plugins/projectexplorer/projecttreewidget.cpp
+++ b/src/plugins/projectexplorer/projecttreewidget.cpp
@@ -90,6 +90,20 @@ protected:
         if (event->reason() != Qt::PopupFocusReason)
             QTreeView::focusOutEvent(event);
     }
+
+#ifdef Q_OS_MAC
+    void keyPressEvent(QKeyEvent *event)
+    {
+        if ((event->key() == Qt::Key_Return
+                || event->key() == Qt::Key_Enter)
+                && event->modifiers() == 0
+                && currentIndex().isValid()) {
+            emit activated(currentIndex());
+            return;
+        }
+        QTreeView::keyPressEvent(event);
+    }
+#endif
 };
 
 /*!
diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp
index c725c915c9e37692fb39507ca46d6881511714e3..e6732387424c2832b804bd5e37d9b4b26419f1c2 100644
--- a/src/plugins/projectexplorer/projectwindow.cpp
+++ b/src/plugins/projectexplorer/projectwindow.cpp
@@ -45,6 +45,7 @@
 #include <coreplugin/icore.h>
 
 #include <QtCore/QDebug>
+#include <QtGui/QApplication>
 #include <QtGui/QBoxLayout>
 #include <QtGui/QComboBox>
 #include <QtGui/QTabWidget>
@@ -190,7 +191,14 @@ void ProjectWindow::updateTreeWidget()
     // That one runs fully thorough and deletes all widgets, even that one that we are currently removing
     // from m_panelsTabWidget.
     // To prevent that, we simply prevent the focus switching....
-    m_treeWidget->setFocus();
+    QWidget *focusWidget = qApp->focusWidget();
+    while (focusWidget) {
+        if (focusWidget == this) {
+            m_treeWidget->setFocus();
+            break;
+        }
+        focusWidget = focusWidget->parentWidget();
+    }
     m_treeWidget->clear();
 
     foreach(Project *project, m_session->projects()) {
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index a9bded02c61ec0ba57ef1701041f957b8afc4c8a..89716ce3f68ab22a905a51f71ce7e5913e2e45be 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -628,8 +628,10 @@ bool SessionManager::loadImpl(const QString &fileName)
     if (success) {
         // restore the active mode
         const QString &modeIdentifier = value(QLatin1String("ActiveMode")).toString();
-        if (!modeIdentifier.isEmpty())
+        if (!modeIdentifier.isEmpty()) {
             m_core->modeManager()->activateMode(modeIdentifier);
+            m_core->modeManager()->setFocusToCurrentMode();
+        }
     }
 
     if (debug)
diff --git a/src/plugins/quickopen/quickopenconstants.h b/src/plugins/quickopen/quickopenconstants.h
index 8ae0380f371113043f1855a46ebf3e58839bb54b..9cce426877073af1513350da7fbaeb204a25df48 100644
--- a/src/plugins/quickopen/quickopenconstants.h
+++ b/src/plugins/quickopen/quickopenconstants.h
@@ -38,7 +38,7 @@ namespace QuickOpen {
 namespace Constants {
 
 const char * const FILTER_OPTIONS_PAGE = "Filters";
-const char * const QUICKOPEN_CATEGORY = "QuickOpen";
+const char * const QUICKOPEN_CATEGORY = "Locator";
 const char * const TASK_INDEX = "QuickOpen.Task.Index";
 
 } // namespace Constants
diff --git a/src/plugins/quickopen/quickopentoolwindow.cpp b/src/plugins/quickopen/quickopentoolwindow.cpp
index cd279fd7638e65b2902f083ac459fa9b63080f67..211947be8d056facedf447e9107cb81e02c66928 100644
--- a/src/plugins/quickopen/quickopentoolwindow.cpp
+++ b/src/plugins/quickopen/quickopentoolwindow.cpp
@@ -264,7 +264,7 @@ QuickOpenToolWindow::QuickOpenToolWindow(QuickOpenPlugin *qop) :
     // Explcitly hide the completion list popup.
     m_completionList->hide();
 
-    setWindowTitle("Quick Open");
+    setWindowTitle("Locate...");
     resize(200, 90);
     QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
     sizePolicy.setHorizontalStretch(0);
@@ -281,7 +281,7 @@ QuickOpenToolWindow::QuickOpenToolWindow(QuickOpenPlugin *qop) :
     QPixmap image(Core::Constants::ICON_MAGNIFIER);
     m_fileLineEdit->setPixmap(image);
     m_fileLineEdit->setUseLayoutDirection(true);
-    m_fileLineEdit->setHintText(tr("Type to QuickOpen"));
+    m_fileLineEdit->setHintText(tr("Type to locate"));
     m_fileLineEdit->setFocusPolicy(Qt::ClickFocus);
 
     m_fileLineEdit->installEventFilter(this);
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 0d5bd8c2dea21d19ddc1e94ebe0cbeec2e6f1570..3758b1332789b5cbfaa59ea5efe5aa96cf1abab2 100644
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -302,6 +302,18 @@ void BaseTextDocument::setSyntaxHighlighter(QSyntaxHighlighter *highlighter)
     m_highlighter->setDocument(m_document);
 }
 
+
+
+void BaseTextDocument::cleanWhitespace()
+{
+    QTextCursor cursor(m_document);
+    cursor.beginEditBlock();
+    cleanWhitespace(cursor, true);
+    if (m_storageSettings.m_addFinalNewLine)
+        ensureFinalNewLine(cursor);
+    cursor.endEditBlock();
+}
+
 void BaseTextDocument::cleanWhitespace(QTextCursor& cursor, bool inEntireDocument)
 {
 
diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h
index ee8e5eb427a14da649ff631f18df220a6cc1b989..b945129c474a95e83b1052f204b1c57380bb575c 100644
--- a/src/plugins/texteditor/basetextdocument.h
+++ b/src/plugins/texteditor/basetextdocument.h
@@ -118,6 +118,8 @@ public:
 
     void reload(QTextCodec *codec);
 
+    void cleanWhitespace();
+
 signals:
     void titleChanged(QString title);
     void changed();
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index e6b42c553286a571d1dab42b628a3d8bf691ea2f..db5413c3446c8370c5d99db1a79d0c380508c424 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -685,6 +685,10 @@ void BaseTextEditor::selectBlockDown()
 }
 
 
+void BaseTextEditor::cleanWhitespace()
+{
+        d->m_document->cleanWhitespace();
+}
 
 void BaseTextEditor::keyPressEvent(QKeyEvent *e)
 {
@@ -2751,7 +2755,9 @@ void BaseTextEditor::handleBackspaceKey()
 void BaseTextEditor::format()
 {
     QTextCursor cursor = textCursor();
+    cursor.beginEditBlock();
     indent(document(), cursor, QChar::Null);
+    cursor.endEditBlock();
 }
 
 void BaseTextEditor::unCommentSelection()
@@ -3319,16 +3325,13 @@ void BaseTextEditor::collapse()
     TextEditDocumentLayout *documentLayout = qobject_cast<TextEditDocumentLayout*>(doc->documentLayout());
     QTC_ASSERT(documentLayout, return);
     QTextBlock block = textCursor().block();
-    qDebug() << "collapse at block" << block.blockNumber();
     while (block.isValid()) {
-        qDebug() << "test block" << block.blockNumber();
         if (TextBlockUserData::canCollapse(block) && block.next().isVisible()) {
             if ((block.next().userState()) >> 8 <= (textCursor().block().userState() >> 8))
                 break;
         }
         block = block.previous();
     }
-    qDebug() << "found" << block.blockNumber();
     if (block.isValid()) {
         TextBlockUserData::doCollapse(block, false);
         d->moveCursorVisible();
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index 40454a9c7d430dc6b188567843a7e13323f98f88..1219439fc986264c6e55230cac59b0b00c507a4e 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -329,6 +329,8 @@ public slots:
     void selectBlockUp();
     void selectBlockDown();
 
+    void cleanWhitespace();
+
 signals:
     void changed();
 
diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp
index f87ab2ac8cf27efb0fb792aa948234b3609c3a88..19145a7cd9748d6e3860db950719fda621c7d8dd 100644
--- a/src/plugins/texteditor/tabsettings.cpp
+++ b/src/plugins/texteditor/tabsettings.cpp
@@ -132,7 +132,7 @@ bool TabSettings::isIndentationClean(const QString &text) const
 
         if (c == QLatin1Char(' ')) {
             ++spaceCount;
-            if (spaceCount == m_tabSize)
+            if (!m_spacesForTabs && spaceCount == m_tabSize)
                 return false;
         } else if (c == QLatin1Char('\t')) {
             if (m_spacesForTabs || spaceCount != m_indentSize)
diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp
index 5ffd79e6d02fc410101e90a05bcd7a25f96eb599..12fc7d1fac5a3d2b55f6c76d412e008238a86d75 100644
--- a/src/plugins/texteditor/texteditoractionhandler.cpp
+++ b/src/plugins/texteditor/texteditoractionhandler.cpp
@@ -63,7 +63,7 @@ TextEditorActionHandler::TextEditorActionHandler(Core::ICore *core,
 {
     m_undoAction = m_redoAction = m_copyAction = m_cutAction = m_pasteAction
                  = m_selectAllAction = m_gotoAction = m_printAction = m_formatAction
-                 = m_visualizeWhitespaceAction = m_textWrappingAction
+                 = m_visualizeWhitespaceAction = m_cleanWhitespaceAction = m_textWrappingAction
                  = m_unCommentSelectionAction = m_unCollapseAllAction
                  = m_collapseAction = m_expandAction
                  = m_deleteLineAction = m_selectEncodingAction
@@ -128,17 +128,23 @@ void TextEditorActionHandler::createActions()
     connect(m_formatAction, SIGNAL(triggered(bool)), this, SLOT(formatAction()));
 
 
-    m_visualizeWhitespaceAction = new QAction(tr("Visualize &Whitespace"), this);
+    m_visualizeWhitespaceAction = new QAction(tr("&Visualize Whitespace"), this);
     m_visualizeWhitespaceAction->setCheckable(true);
     command = am->registerAction(m_visualizeWhitespaceAction,
                                                  TextEditor::Constants::VISUALIZE_WHITESPACE, m_contextId);
 #ifndef Q_OS_MAC
     command->setDefaultKeySequence(QKeySequence(tr("Ctrl+E, Ctrl+V")));
 #endif
-
     advancedMenu->addAction(command);
     connect(m_visualizeWhitespaceAction, SIGNAL(triggered(bool)), this, SLOT(setVisualizeWhitespace(bool)));
 
+    m_cleanWhitespaceAction = new QAction(tr("Clean Whitespace"), this);
+    command = am->registerAction(m_cleanWhitespaceAction,
+                                 TextEditor::Constants::CLEAN_WHITESPACE, m_contextId);
+
+    advancedMenu->addAction(command);
+    connect(m_cleanWhitespaceAction, SIGNAL(triggered()), this, SLOT(cleanWhitespace()));
+
     m_textWrappingAction = new QAction(tr("Enable Text &Wrapping"), this);
     m_textWrappingAction->setCheckable(true);
     command = am->registerAction(m_textWrappingAction,
@@ -285,6 +291,7 @@ void TextEditorActionHandler::updateActions(UpdateMode um)
     m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
     if (m_currentEditor)
         m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace);
+    m_cleanWhitespaceAction->setEnabled(um != NoEditor);
     if (m_textWrappingAction) {
         m_textWrappingAction->setEnabled(um != NoEditor);
         if (m_currentEditor)
@@ -317,42 +324,6 @@ void TextEditorActionHandler::updateCopyAction()
         m_copyAction->setEnabled(hasCopyableText);
 }
 
-void TextEditorActionHandler::undoAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->undo();
-}
-
-void TextEditorActionHandler::redoAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->redo();
-}
-
-void TextEditorActionHandler::copyAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->copy();
-}
-
-void TextEditorActionHandler::cutAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->cut();
-}
-
-void TextEditorActionHandler::pasteAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->paste();
-}
-
-void TextEditorActionHandler::selectAllAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->selectAll();
-}
-
 void TextEditorActionHandler::gotoAction()
 {
     QuickOpen::QuickOpenManager *quickopen = QuickOpen::QuickOpenManager::instance();
@@ -367,13 +338,6 @@ void TextEditorActionHandler::printAction()
         m_currentEditor->print(m_core->printer());
 }
 
-void TextEditorActionHandler::formatAction()
-{
-    if (m_currentEditor)
-        m_currentEditor->format();
-}
-
-
 void TextEditorActionHandler::setVisualizeWhitespace(bool checked)
 {
     if (m_currentEditor) {
@@ -403,6 +367,15 @@ void TextEditorActionHandler::setTextWrapping(bool checked)
         m_currentEditor->funcname2 ();\
 }
 
+
+FUNCTION2(undoAction, undo)
+FUNCTION2(redoAction, redo)
+FUNCTION2(copyAction, copy)
+FUNCTION2(cutAction, cut)
+FUNCTION2(pasteAction, paste)
+FUNCTION2(formatAction, format)
+FUNCTION2(selectAllAction, selectAll)
+FUNCTION(cleanWhitespace)
 FUNCTION(unCommentSelection)
 FUNCTION(deleteLine)
 FUNCTION(unCollapseAll)
diff --git a/src/plugins/texteditor/texteditoractionhandler.h b/src/plugins/texteditor/texteditoractionhandler.h
index 9a8c7b9f57c89ceb4a6bd1e1971b1c06bce7ed61..520ae26ddf6618e0a09d18cc80f8751592901fbc 100644
--- a/src/plugins/texteditor/texteditoractionhandler.h
+++ b/src/plugins/texteditor/texteditoractionhandler.h
@@ -100,6 +100,7 @@ private slots:
     void printAction();
     void formatAction();
     void setVisualizeWhitespace(bool);
+    void cleanWhitespace();
     void setTextWrapping(bool);
     void unCommentSelection();
     void unCollapseAll();
@@ -128,6 +129,7 @@ private:
     QAction *m_printAction;
     QAction *m_formatAction;
     QAction *m_visualizeWhitespaceAction;
+    QAction *m_cleanWhitespaceAction;
     QAction *m_textWrappingAction;
     QAction *m_unCommentSelectionAction;
     QAction *m_unCollapseAllAction;
diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h
index 9ac9fdff0e4c368ecb3d43f6ad13da8f86f7660d..192a07c257e86ec089721fc19f27edbfc3b857b7 100644
--- a/src/plugins/texteditor/texteditorconstants.h
+++ b/src/plugins/texteditor/texteditorconstants.h
@@ -40,6 +40,7 @@ namespace Constants {
 const char * const C_TEXTEDITOR          = "Text Editor";
 const char * const COMPLETE_THIS         = "TextEditor.CompleteThis";
 const char * const VISUALIZE_WHITESPACE  = "TextEditor.VisualizeWhitespace";
+const char * const CLEAN_WHITESPACE      = "TextEditor.CleanWhitespace";
 const char * const TEXT_WRAPPING         = "TextEditor.TextWrapping";
 const char * const UN_COMMENT_SELECTION  = "TextEditor.UnCommentSelection";
 const char * const COLLAPSE              = "TextEditor.Collapse";
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 958c8985b058c560a6e642a3cb16c6cba79ebb3d..dbc7eebcd3cf2f87c4a6b81618595d8089912ee7 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -53,6 +53,8 @@
 #include <QtNetwork/QHostAddress>
 
 #include <iostream>
+#include <list>
+#include <stack>
 #include <string>
 #include <vector>
 
@@ -71,6 +73,9 @@ uint qHash(const double & f)
     return int(f);
 }
 
+#define X myns
+X::QString str;
+
 class  Foo
 {
 public:
@@ -127,7 +132,7 @@ void testArray()
 }
 
 
-void testByteArray()
+void testQByteArray()
 {
     QByteArray ba = "Hello";
     ba += '"';
@@ -138,7 +143,7 @@ void testByteArray()
 }
 
 
-void testHash()
+void testQHash()
 {
     QHash<int, float> hgg0;
     hgg0[11] = 11.0;
@@ -162,7 +167,7 @@ void testHash()
     hash.insert(".", QPointer<QObject>(&ob));
 }
 
-void testImage()
+void testQImage()
 {
     QImage im(QSize(200, 200), QImage::Format_RGB32);
     im.fill(QColor(200, 100, 130).rgba());
@@ -190,7 +195,7 @@ void testIO()
 }
 
 
-void testList()
+void testQList()
 {
 #if 1
     QList<int> li;
@@ -252,7 +257,7 @@ void testList()
     v.push_back("dd");
  }
 
-void testMap()
+void testQMap()
 {
     QMap<uint, QStringList> ggl;
     ggl[11] = QStringList() << "11";
@@ -287,7 +292,7 @@ void testMap()
 #endif
 }
 
-void testObject(int &argc, char *argv[])
+void testQObject(int &argc, char *argv[])
 {
     QApplication app(argc, argv);
     QAction act("xxx", &app);
@@ -315,7 +320,7 @@ void testObject(int &argc, char *argv[])
     app.exec();
 }
 
-void testPixmap()
+void testQPixmap()
 {
     QImage im(QSize(200, 200), QImage::Format_RGB32);
     im.fill(QColor(200, 100, 130).rgba());
@@ -351,7 +356,7 @@ void testPlugin()
     }
 }
 
-void testSet()
+void testQSet()
 {
     QSet<int> hgg0;
     hgg0.insert(11);
@@ -373,65 +378,63 @@ void stringRefTest(const QString &refstring)
     Q_UNUSED(refstring);
 }
 
-
-int F(int a, int b)
+void testStdList()
 {
-   return a + b;
-}
-
-int add(int i) { return i + 2; }
-
-int mul(int i) { return i * 2; }
-
-
-void testStdVector()
-{
-    int x = F(add(1), mul(2));
-    Q_UNUSED(x);
-    std::vector<int *> plist1;
+    std::list<int *> plist1;
     plist1.push_back(new int(1));
     plist1.push_back(0);
     plist1.push_back(new int(2));
 
-    std::vector<int> flist2;
+    std::list<int> flist2;
     flist2.push_back(1);
     flist2.push_back(2);
     flist2.push_back(3);
     flist2.push_back(4);
 
-    int a = 1;
-    int b = 0;
-
-    while (0) {
-        a += 1;
-        if (b)
-            break;
-    }
-
     flist2.push_back(1);
     flist2.push_back(2);
     flist2.push_back(3);
     flist2.push_back(4);
 
-    std::vector<Foo *> plist;
+    std::list<Foo *> plist;
     plist.push_back(new Foo(1));
     plist.push_back(0);
     plist.push_back(new Foo(2));
 
-    std::vector<Foo> flist;
+    std::list<Foo> flist;
     flist.push_back(1);
-
     flist.push_back(2);
     flist.push_back(3);
     flist.push_back(4);
-    //flist.takeFirst();
-    //flist.takeFirst();
 
-    std::vector<bool> vec;
+    std::list<bool> vec;
     vec.push_back(true);
     vec.push_back(false);
 }
 
+void testStdStack()
+{
+    std::stack<int *> plist1;
+    plist1.push(new int(1));
+    plist1.push(0);
+    plist1.push(new int(2));
+    plist1.pop();
+    plist1.pop();
+    plist1.pop();
+
+    std::stack<int> flist2;
+    flist2.push(1);
+    flist2.push(2);
+
+    std::stack<Foo *> plist;
+    plist.push(new Foo(1));
+    plist.push(new Foo(2));
+
+    std::stack<Foo> flist;
+    flist.push(1);
+    flist.push(2);
+}
+
 void testStdString()
 {
     QString foo;
@@ -470,7 +473,43 @@ void testStdString()
     v.push_back(str);
 }
 
-void testString()
+void testStdVector()
+{
+    std::vector<int *> plist1;
+    plist1.push_back(new int(1));
+    plist1.push_back(0);
+    plist1.push_back(new int(2));
+
+    std::vector<int> flist2;
+    flist2.push_back(1);
+    flist2.push_back(2);
+    flist2.push_back(3);
+    flist2.push_back(4);
+
+    flist2.push_back(1);
+    flist2.push_back(2);
+    flist2.push_back(3);
+    flist2.push_back(4);
+
+    std::vector<Foo *> plist;
+    plist.push_back(new Foo(1));
+    plist.push_back(0);
+    plist.push_back(new Foo(2));
+
+    std::vector<Foo> flist;
+    flist.push_back(1);
+    flist.push_back(2);
+    flist.push_back(3);
+    flist.push_back(4);
+    //flist.takeFirst();
+    //flist.takeFirst();
+
+    std::vector<bool> vec;
+    vec.push_back(true);
+    vec.push_back(false);
+}
+
+void testQString()
 {
     QString str = "Hello ";
     str += " big, ";
@@ -480,19 +519,9 @@ void testString()
     str += " World ";
     str += " World ";
     str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
-    str += " World ";
 }
 
-void testString3()
+void testQString3()
 {
     QString str = "Hello ";
     str += " big, ";
@@ -508,7 +537,7 @@ void testString3()
     delete pstring;
 }
 
-void testStringList()
+void testQStringList()
 {
     QStringList l;
     l << "Hello ";
@@ -542,7 +571,7 @@ private:
     int m_id;
 };
 
-void testThreads()
+void testQThread()
 {
     Thread thread1(1);
     Thread thread2(2);
@@ -552,7 +581,7 @@ void testThreads()
     thread2.wait();
 }
 
-void testVariant1()
+void testQVariant1()
 {
     QVariant v;
     v = 1;
@@ -561,7 +590,7 @@ void testVariant1()
     v = 1;
 }
 
-void testVariant2()
+void testQVariant2()
 {
     QVariant var;
 #if 0
@@ -586,7 +615,7 @@ void testVariant2()
     var.setValue(my);
 }
 
-void testVariant3()
+void testQVariant3()
 {
     QList<int> list;
     list << 1 << 2 << 3;
@@ -595,8 +624,10 @@ void testVariant3()
     list = qVariantValue<QList<int> >(variant);
 }
 
-void testVector()
+void testQVector()
 {
+    QVector<int> big(10000);
+
     QVector<Foo *> plist;
     plist.append(new Foo(1));
     plist.append(0);
@@ -616,7 +647,7 @@ void testVector()
     vec.append(false);
 }
 
-void testVectorOfList()
+void testQVectorOfQList()
 {
     QVector<QList<int> > v;
     QVector<QList<int> > *pv = &v;
@@ -729,16 +760,9 @@ void testNamespace()
     bar.doit(1);
 }
 
-int main(int argc, char *argv[])
-{
-    testIO();
-    //QString s;
-    //s = "hallo";
-    //QList<QVector<int> *> vi;
-    //QList<QVector<double> *> vd;
-    //int n = A::barz();
-
 
+void testHidden()
+{
     int  n = 1;
     n = 2;
     n = 3;
@@ -762,34 +786,42 @@ int main(int argc, char *argv[])
     }
     ++n;
     ++n;
+}
 
+int main(int argc, char *argv[])
+{
+    //testIO();
+    testHidden();
     testArray();
-    testStdVector();
+
+    testStdList();
+    testStdStack();
     testStdString();
+    testStdVector();
 
     testPlugin();
-    testList();
+    testQList();
     testNamespace();
     //return 0;
-    testByteArray();
-    testHash();
-    testImage();
-    testMap();
-    testString();
-    testSet();
-    testStringList();
+    testQByteArray();
+    testQHash();
+    testQImage();
+    testQMap();
+    testQString();
+    testQSet();
+    testQStringList();
     testStruct();
     //testThreads();
-    testVariant1();
-    testVariant2();
-    testVariant3();
-    testVector();
-    testVectorOfList();
+    testQVariant1();
+    testQVariant2();
+    testQVariant3();
+    testQVector();
+    testQVectorOfQList();
 
 
     *(int *)0 = 0;
 
-    testObject(argc, argv);
+    testQObject(argc, argv);
 
 
     //QColor color(255,128,10);