diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index eed534ee8d4481a245203461f8538cb6510fafb6..4faf6470ac7592ceaea3d7b4fd5bcf8e0c9b93ae 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -52,7 +52,13 @@
 
 int qtGhVersion = QT_VERSION;
 
-#ifdef QT_GUI_LIB
+#ifndef USE_QT_GUI
+#   ifdef QT_GUI_LIB
+#        define USE_QT_GUI 1
+#   endif
+#endif
+
+#if USE_QT_GUI
 #   include <QtGui/QWidget>
 #   include <QtGui/QPixmap>
 #   include <QtGui/QImage>
@@ -1296,9 +1302,9 @@ static void qDumpQHashNode(QDumper &d)
     d.disarm();
 }
 
+#if USE_QT_GUI
 static void qDumpQImage(QDumper &d)
 {
-#ifdef QT_GUI_LIB
     const QImage &im = *reinterpret_cast<const QImage *>(d.data);
     P(d, "value", "(" << im.width() << "x" << im.height() << ")");
     P(d, "type", NS"QImage");
@@ -1312,14 +1318,12 @@ static void qDumpQImage(QDumper &d)
         d.endHash();
     }
     d.disarm();
-#else
-    Q_UNUSED(d);
-#endif
 }
+#endif
 
+#if USE_QT_GUI
 static void qDumpQImageData(QDumper &d)
 {
-#ifdef QT_GUI_LIB
     const QImage &im = *reinterpret_cast<const QImage *>(d.data);
     const QByteArray ba(QByteArray::fromRawData((const char*)im.bits(), im.numBytes()));
     P(d, "type", NS"QImageData");
@@ -1334,10 +1338,8 @@ static void qDumpQImageData(QDumper &d)
     P(d, "value", ba);
 #endif
     d.disarm();
-#else
-    Q_UNUSED(d);
-#endif
 }
+#endif
 
 static void qDumpQList(QDumper &d)
 {
@@ -2020,18 +2022,16 @@ static void qDumpQObjectSlotList(QDumper &d)
 }
 
 
+#if USE_QT_GUI
 static void qDumpQPixmap(QDumper &d)
 {
-#ifdef QT_GUI_LIB
     const QPixmap &im = *reinterpret_cast<const QPixmap *>(d.data);
     P(d, "value", "(" << im.width() << "x" << im.height() << ")");
     P(d, "type", NS"QPixmap");
     P(d, "numchild", "0");
     d.disarm();
-#else
-    Q_UNUSED(d);
-#endif
 }
+#endif
 
 static void qDumpQSet(QDumper &d)
 {
@@ -2691,10 +2691,12 @@ static void handleProtocolVersion2and3(QDumper & d)
                 qDumpStdList(d);
             break;
         case 'I':
+            #if USE_QT_GUI
             if (isEqual(type, "QImage"))
                 qDumpQImage(d);
             else if (isEqual(type, "QImageData"))
                 qDumpQImageData(d);
+            #endif
             break;
         case 'L':
             if (isEqual(type, "QList"))
@@ -2731,8 +2733,10 @@ static void handleProtocolVersion2and3(QDumper & d)
                 qDumpQObjectSlotList(d);
             break;
         case 'P':
+            #if USE_QT_GUI
             if (isEqual(type, "QPixmap"))
                 qDumpQPixmap(d);
+            #endif
             break;
         case 'S':
             if (isEqual(type, "QSet"))
@@ -2854,7 +2858,9 @@ void *qDumpObjectData440(
             "\""NS"QVariant\","
             "\""NS"QVector\","
             "\""NS"QWeakPointer\","
+#if USE_QT_GUI
             "\""NS"QWidget\","
+#endif
 #ifdef Q_OS_WIN            
             "\"basic_string\","
             "\"list\","
@@ -2884,7 +2890,7 @@ void *qDumpObjectData440(
           << ""NS"QString=\"" << sizeof(QString) << "\","
           << ""NS"QStringList=\"" << sizeof(QStringList) << "\","
           << ""NS"QObject=\"" << sizeof(QObject) << "\","
-#ifdef QT_GUI_LIB
+#if USE_QT_GUI
           << ""NS"QWidget=\"" << sizeof(QWidget)<< "\","
 #endif
 #ifdef Q_OS_WIN
diff --git a/share/qtcreator/gdbmacros/gdbmacros.pro b/share/qtcreator/gdbmacros/gdbmacros.pro
index 5aacbfb84ad759718f92dddc19d227548bd063eb..67133e732e88e30dd557d051c5270f24641f39a5 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.pro
+++ b/share/qtcreator/gdbmacros/gdbmacros.pro
@@ -1,11 +1,20 @@
 TEMPLATE = lib
 CONFIG += shared
+QT = core
 linux-* {
 CONFIG -= release
 CONFIG += debug
 }
 SOURCES=gdbmacros.cpp
 
+true {
+    DEFINES += USE_QT_GUI=0
+    QT = core
+} else {
+    DEFINES += USE_QT_GUI=1
+    QT = core gui
+}
+
 exists($$QMAKE_INCDIR_QT/QtCore/private/qobject_p.h) {
    DEFINES+=HAS_QOBJECT_P_H
 }
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index e8110c54dae796f00e31a6786b7d9d5bc6ea84f5..cf7403953fcdce3a02a980150fadd517c0a90340 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -529,6 +529,47 @@ protected:
         return true;
     }
 
+    virtual bool visit(CastExpressionAST *ast)
+    {
+        if (ast->lparen_token && ast->type_id && ast->rparen_token && ast->expression) {
+            if (TypeIdAST *cast_type_id = ast->type_id->asTypeId()) {
+                SpecifierAST *type_specifier = cast_type_id->type_specifier;
+                if (! cast_type_id->declarator && type_specifier && ! type_specifier->next &&
+                    type_specifier->asNamedTypeSpecifier() && ast->expression &&
+                    ast->expression->asUnaryExpression()) {
+                    // this ast node is ambigious, e.g.
+                    //   (a) + b
+                    // it can be parsed as
+                    //   ((a) + b)
+                    // or
+                    //   (a) (+b)
+                    accept(ast->expression);
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    virtual bool visit(SizeofExpressionAST *ast)
+    {
+        if (ast->lparen_token && ast->expression && ast->rparen_token) {
+            if (TypeIdAST *type_id = ast->expression->asTypeId()) {
+                SpecifierAST *type_specifier = type_id->type_specifier;
+                if (! type_id->declarator && type_specifier && ! type_specifier->next &&
+                    type_specifier->asNamedTypeSpecifier()) {
+                    // this sizeof expression is ambiguos, e.g.
+                    // sizeof (a)
+                    //   `a' can be a typeid or a nested-expression.
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
     LookupContext lookupContext(unsigned line, unsigned column) const;
 
 private:
diff --git a/src/plugins/debugger/debuggeroutputwindow.cpp b/src/plugins/debugger/debuggeroutputwindow.cpp
index 518551185a7026270267672ada7161c8ab3ec048..a953abc502a455117704835e0a00ec98b6b0617b 100644
--- a/src/plugins/debugger/debuggeroutputwindow.cpp
+++ b/src/plugins/debugger/debuggeroutputwindow.cpp
@@ -68,6 +68,7 @@ public:
     DebuggerPane(QWidget *parent)
         : QPlainTextEdit(parent)
     {
+        setMaximumBlockCount(100000);
         m_clearContentsAction = new QAction(this);
         m_clearContentsAction->setText(tr("Clear contents"));
         m_clearContentsAction->setEnabled(true);
diff --git a/src/plugins/debugger/dumper.pro b/src/plugins/debugger/dumper.pro
index 5d373abdd2db43b0cc5d9dde4e7b005646ea1c4a..fda9873f851a9ca53de6c70698596462af2ac8b5 100644
--- a/src/plugins/debugger/dumper.pro
+++ b/src/plugins/debugger/dumper.pro
@@ -14,5 +14,13 @@ CONFIG += debug
 QMAKE_CXXFLAGS *= -O2
 }
 
+true {
+    DEFINES += USE_QT_GUI=0
+    QT = core
+} else {
+    DEFINES += USE_QT_GUI=1
+    QT = core gui
+}
+
 SOURCES += ../../../share/qtcreator/gdbmacros/gdbmacros.cpp
 
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index f9ae90d9cfe0c5b235ae7ac4d4d780705bc48774..21a09cc058ea1ceaf8160bc8976a77509efcdf57 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -81,16 +81,16 @@ static int generationCounter = 0;
 class WatchItem : public WatchData
 {
 public:
-    WatchItem() { parent = 0; fetched = 0; }
+    WatchItem() { parent = 0; fetchedTriggered = 0; }
 
     WatchItem(const WatchData &data) : WatchData(data)
-        { parent = 0; fetched = 0; }
+        { parent = 0; fetchedTriggered = 0; }
 
     void setData(const WatchData &data)
         { static_cast<WatchData &>(*this) = data; }
 
     WatchItem *parent;
-    bool fetched;      // children fetch has been triggered
+    bool fetchedTriggered;      // children fetch has been triggered
     QList<WatchItem *> children;  // fetched children
 };
 
@@ -309,7 +309,7 @@ WatchModel::WatchModel(WatchHandler *handler, WatchType type)
     item->childCount = 1;
     item->state = 0;
     item->parent = m_root;
-    item->fetched = true;
+    item->fetchedTriggered = true;
 
     m_root->children.append(item);
 }
@@ -501,14 +501,15 @@ static QString niceType(QString type)
 
 bool WatchModel::canFetchMore(const QModelIndex &index) const
 {
-    return index.isValid() && !watchItem(index)->fetched;
+    return index.isValid() && !watchItem(index)->fetchedTriggered;
 }
 
 void WatchModel::fetchMore(const QModelIndex &index)
 {
     QTC_ASSERT(index.isValid(), return);
-    QTC_ASSERT(!watchItem(index)->fetched, return);
+    QTC_ASSERT(!watchItem(index)->fetchedTriggered, return);
     if (WatchItem *item = watchItem(index)) {
+        item->fetchedTriggered = true;
         WatchData data = *item;
         data.setChildrenNeeded();
         emit m_handler->watchDataUpdateNeeded(data);
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 5869b1a14d67b9c8bbf1b37a41748d99ece86694..bf4da2014a5815e152796ce2beb5468f89cc3d98 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1980,7 +1980,9 @@ class CPLUSPLUS_EXPORT SizeofExpressionAST: public ExpressionAST
 {
 public:
     unsigned sizeof_token;
+    unsigned lparen_token;
     ExpressionAST *expression;
+    unsigned rparen_token;
 
 public:
     virtual SizeofExpressionAST *asSizeofExpression()
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index a2c0d2edda566dd53c1bbd316c9561a92a393465..d70d8f40d771034f2652a477e081b3e5b38aa2f4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3158,7 +3158,8 @@ bool Parser::parseUnaryExpression(ExpressionAST *&node)
         if (LA() == T_LPAREN) {
             unsigned lparen_token = consumeToken();
             if (parseTypeId(ast->expression) && LA() == T_RPAREN) {
-                consumeToken();
+                ast->lparen_token = lparen_token;
+                ast->rparen_token = consumeToken();
                 node = ast;
                 return true;
             } else {