diff --git a/doc/addressbook-sdk.qdoc b/doc/addressbook-sdk.qdoc
index 7d7734bea7860c98ddfd9795a0515b98721a1ef5..9737100f2557b3baed5e15e5023fde52e8d0f864 100644
--- a/doc/addressbook-sdk.qdoc
+++ b/doc/addressbook-sdk.qdoc
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the documentation of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,24 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 /*!
     \page tutorials-addressbook-sdk.html
diff --git a/qtcreator.pri b/qtcreator.pri
index 42fb50e36cf2419512b76ad18cfc1a3adb9edeb4..f78baa33f0d2269a63ab94921b9dc280ea729146 100644
--- a/qtcreator.pri
+++ b/qtcreator.pri
@@ -93,11 +93,11 @@ DEFINES += QT_NO_CAST_TO_ASCII
 #DEFINES += QT_USE_FAST_CONCATENATION
 
 unix {
-    debug:OBJECTS_DIR = $${OUT_PWD}/.obj/debug-shared
-    release:OBJECTS_DIR = $${OUT_PWD}/.obj/release-shared
+    CONFIG(debug, debug|release):OBJECTS_DIR = $${OUT_PWD}/.obj/debug-shared
+    CONFIG(release, debug|release):OBJECTS_DIR = $${OUT_PWD}/.obj/release-shared
 
-    debug:MOC_DIR = $${OUT_PWD}/.moc/debug-shared
-    release:MOC_DIR = $${OUT_PWD}/.moc/release-shared
+    CONFIG(debug, debug|release):MOC_DIR = $${OUT_PWD}/.moc/debug-shared
+    CONFIG(release, debug|release):MOC_DIR = $${OUT_PWD}/.moc/release-shared
 
     RCC_DIR = $${OUT_PWD}/.rcc
     UI_DIR = $${OUT_PWD}/.uic
diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index b5283d42e3fb5d973351d9d70ec1efcd1f0ad3bd..ae677bcdb69b34885009ff9c41e97a6b17a63710 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -3120,7 +3120,6 @@ static void qDumpStdMapHelper(QDumper &d)
     const char *valueType = d.templateParameters[1];
     const void *p = d.data;
     qCheckAccess(p);
-    p = deref(p);
 
     const int nn = map.size();
     if (nn < 0)
@@ -3236,7 +3235,6 @@ static void qDumpStdSetHelper(QDumper &d)
     const DummyType &set = *reinterpret_cast<const DummyType*>(d.data);
     const void *p = d.data;
     qCheckAccess(p);
-    p = deref(p);
 
     const int nn = set.size();
     if (nn < 0)
diff --git a/share/qtcreator/gdbmacros/gdbmacros_p.h b/share/qtcreator/gdbmacros/gdbmacros_p.h
index fc6b665e9ad22014dedc07a7613d7ed3b4fd5553..88867b02b2fda372dde113f99a0c6a56f1b4a468 100644
--- a/share/qtcreator/gdbmacros/gdbmacros_p.h
+++ b/share/qtcreator/gdbmacros/gdbmacros_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the Qt Assistant of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,24 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 #ifndef GDBMACROS_P_H
 #define GDBMACROS_P_H
diff --git a/share/qtcreator/translations/translations.pro b/share/qtcreator/translations/translations.pro
index 46fb2242527ca975122d75f41ef2f4ef27df1e27..5c384ccb7f06870f19bbcd4d5d9b816228a48612 100644
--- a/share/qtcreator/translations/translations.pro
+++ b/share/qtcreator/translations/translations.pro
@@ -61,4 +61,5 @@ isEmpty(vcproj) {
 
 qmfiles.files = $$prependAll(LANGUAGES, $$OUT_PWD/qtcreator_,.qm)
 qmfiles.path = /share/qtcreator/translations
+qmfiles.CONFIG += no_check_exist
 INSTALLS += qmfiles
diff --git a/src/libs/cplusplus/ExpressionUnderCursor.cpp b/src/libs/cplusplus/ExpressionUnderCursor.cpp
index 26a2b3a961a13d94485320a96ec205b759ef55d9..995eeace37dc8129dd7001b1a1e29d85144c6b03 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.cpp
+++ b/src/libs/cplusplus/ExpressionUnderCursor.cpp
@@ -38,6 +38,7 @@
 using namespace CPlusPlus;
 
 ExpressionUnderCursor::ExpressionUnderCursor()
+    : _jumpedComma(false)
 { }
 
 ExpressionUnderCursor::~ExpressionUnderCursor()
diff --git a/src/libs/cplusplus/ExpressionUnderCursor.h b/src/libs/cplusplus/ExpressionUnderCursor.h
index b72f790f977c850cc9ab1560984f60e392c7c89f..faf969662b8cb0ee829e5491693b01b4d1ae2907 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.h
+++ b/src/libs/cplusplus/ExpressionUnderCursor.h
@@ -59,6 +59,7 @@ private:
     int previousBlockState(const QTextBlock &block);
     bool isAccessToken(const SimpleToken &tk);
 
+private:
     bool _jumpedComma;
 };
 
diff --git a/src/libs/cplusplus/GenTemplateInstance.cpp b/src/libs/cplusplus/GenTemplateInstance.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..07555932505a659c2069f01cbddc01d0c485e50c
--- /dev/null
+++ b/src/libs/cplusplus/GenTemplateInstance.cpp
@@ -0,0 +1,145 @@
+
+#include "GenTemplateInstance.h"
+#include <Control.h>
+#include <Scope.h>
+#include <Names.h>
+#include <Symbols.h>
+#include <CoreTypes.h>
+#include <QtCore/QVarLengthArray>
+
+using namespace CPlusPlus;
+
+GenTemplateInstance::GenTemplateInstance(Control *control, const Substitution &substitution)
+    : _control(control),
+      _substitution(substitution)
+{ }
+
+FullySpecifiedType GenTemplateInstance::operator()(const FullySpecifiedType &ty)
+{ return subst(ty); }
+
+FullySpecifiedType GenTemplateInstance::subst(Name *name)
+{
+    if (TemplateNameId *t = name->asTemplateNameId()) {
+        QVarLengthArray<FullySpecifiedType, 8> args(t->templateArgumentCount());
+
+        for (unsigned i = 0; i < t->templateArgumentCount(); ++i)
+            args[i] = subst(t->templateArgumentAt(i));
+
+        TemplateNameId *n = _control->templateNameId(t->identifier(),
+                                                     args.data(), args.size());
+
+        return FullySpecifiedType(_control->namedType(n));
+    } else if (name->isQualifiedNameId()) {
+        // ### implement me
+    }
+
+    for (int i = 0; i < _substitution.size(); ++i) {
+        const QPair<Name *, FullySpecifiedType> s = _substitution.at(i);
+        if (name->isEqualTo(s.first))
+            return s.second;
+    }
+
+    return FullySpecifiedType(_control->namedType(name));
+}
+
+FullySpecifiedType GenTemplateInstance::subst(const FullySpecifiedType &ty)
+{
+    FullySpecifiedType previousType = switchType(ty);
+    TypeVisitor::accept(ty.type());
+    return switchType(previousType);
+}
+
+FullySpecifiedType GenTemplateInstance::switchType(const FullySpecifiedType &type)
+{
+    FullySpecifiedType previousType = _type;
+    _type = type;
+    return previousType;
+}
+
+// types
+void GenTemplateInstance::visit(PointerToMemberType * /*ty*/)
+{
+    Q_ASSERT(false);
+}
+
+void GenTemplateInstance::visit(PointerType *ty)
+{
+    FullySpecifiedType elementType = subst(ty->elementType());
+    _type.setType(_control->pointerType(elementType));
+}
+
+void GenTemplateInstance::visit(ReferenceType *ty)
+{
+    FullySpecifiedType elementType = subst(ty->elementType());
+    _type.setType(_control->referenceType(elementType));
+}
+
+void GenTemplateInstance::visit(ArrayType *ty)
+{
+    FullySpecifiedType elementType = subst(ty->elementType());
+    _type.setType(_control->arrayType(elementType, ty->size()));
+}
+
+void GenTemplateInstance::visit(NamedType *ty)
+{
+    Name *name = ty->name();
+    _type.setType(subst(name).type());
+}
+
+void GenTemplateInstance::visit(Function *ty)
+{
+    Name *name = ty->name();
+    FullySpecifiedType returnType = subst(ty->returnType());
+
+    Function *fun = _control->newFunction(0, name);
+    fun->setScope(ty->scope());
+    fun->setConst(ty->isConst());
+    fun->setVolatile(ty->isVolatile());
+    fun->setReturnType(returnType);
+    for (unsigned i = 0; i < ty->argumentCount(); ++i) {
+        Symbol *arg = ty->argumentAt(i);
+        FullySpecifiedType argTy = subst(arg->type());
+        Argument *newArg = _control->newArgument(0, arg->name());
+        newArg->setType(argTy);
+        fun->arguments()->enterSymbol(newArg);
+    }
+    _type.setType(fun);
+}
+
+void GenTemplateInstance::visit(VoidType *)
+{ /* nothing to do*/ }
+
+void GenTemplateInstance::visit(IntegerType *)
+{ /* nothing to do*/ }
+
+void GenTemplateInstance::visit(FloatType *)
+{ /* nothing to do*/ }
+
+void GenTemplateInstance::visit(Namespace *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(Class *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(Enum *)
+{ Q_ASSERT(false); }
+
+// names
+void GenTemplateInstance::visit(NameId *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(TemplateNameId *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(DestructorNameId *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(OperatorNameId *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(ConversionNameId *)
+{ Q_ASSERT(false); }
+
+void GenTemplateInstance::visit(QualifiedNameId *)
+{ Q_ASSERT(false); }
+
diff --git a/src/libs/cplusplus/GenTemplateInstance.h b/src/libs/cplusplus/GenTemplateInstance.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4845f8bc3d151ce8e6adc5e17a7be7be0b8ae06
--- /dev/null
+++ b/src/libs/cplusplus/GenTemplateInstance.h
@@ -0,0 +1,58 @@
+#ifndef GENTEMPLATEINSTANCE_H
+#define GENTEMPLATEINSTANCE_H
+
+#include <TypeVisitor.h>
+#include <NameVisitor.h>
+#include <FullySpecifiedType.h>
+
+#include <QtCore/QList>
+#include <QtCore/QPair>
+
+namespace CPlusPlus {
+
+class CPLUSPLUS_EXPORT GenTemplateInstance: protected TypeVisitor, protected NameVisitor
+{
+public:
+    typedef QList< QPair<Name *, FullySpecifiedType> > Substitution;
+
+public:
+    GenTemplateInstance(Control *control, const Substitution &substitution);
+
+    FullySpecifiedType operator()(const FullySpecifiedType &ty);
+
+protected:
+    FullySpecifiedType subst(Name *name);
+    FullySpecifiedType subst(const FullySpecifiedType &ty);
+
+    FullySpecifiedType switchType(const FullySpecifiedType &type);
+
+    virtual void visit(PointerToMemberType * /*ty*/);
+    virtual void visit(PointerType *ty);
+    virtual void visit(ReferenceType *ty);
+    virtual void visit(ArrayType *ty);
+    virtual void visit(NamedType *ty);
+    virtual void visit(Function *ty);
+    virtual void visit(VoidType *);
+    virtual void visit(IntegerType *);
+    virtual void visit(FloatType *);
+    virtual void visit(Namespace *);
+    virtual void visit(Class *);
+    virtual void visit(Enum *);
+
+    // names
+    virtual void visit(NameId *);
+    virtual void visit(TemplateNameId *);
+    virtual void visit(DestructorNameId *);
+    virtual void visit(OperatorNameId *);
+    virtual void visit(ConversionNameId *);
+    virtual void visit(QualifiedNameId *);
+
+private:
+    Control *_control;
+    FullySpecifiedType _type;
+    const Substitution _substitution;
+};
+
+} // end of namespace CPlusPlus
+
+#endif // GENTEMPLATEINSTANCE_H
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 7c9eedebd56f43d1ec86b2943c4f206492383e5b..f89c2c9afd5bb0c0c3c6a5f905e51e1f5e384282 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -30,6 +30,7 @@
 #include "ResolveExpression.h"
 #include "LookupContext.h"
 #include "Overview.h"
+#include "GenTemplateInstance.h"
 
 #include <Control.h>
 #include <AST.h>
@@ -49,151 +50,6 @@ using namespace CPlusPlus;
 
 namespace {
 
-typedef QList< QPair<Name *, FullySpecifiedType> > Substitution;
-
-class GenerateInstance: protected TypeVisitor, protected NameVisitor
-{
-    Control *_control;
-    FullySpecifiedType _type;
-    const Substitution _substitution;
-
-public:
-    GenerateInstance(Control *control, const Substitution &substitution)
-        : _control(control),
-          _substitution(substitution)
-    { }
-
-    FullySpecifiedType operator()(const FullySpecifiedType &ty)
-    { return subst(ty); }
-
-protected:
-    FullySpecifiedType subst(Name *name)
-    {
-        if (TemplateNameId *t = name->asTemplateNameId()) {
-            QVarLengthArray<FullySpecifiedType, 8> args(t->templateArgumentCount());
-
-            for (unsigned i = 0; i < t->templateArgumentCount(); ++i)
-                args[i] = subst(t->templateArgumentAt(i));
-
-            TemplateNameId *n = _control->templateNameId(t->identifier(),
-                                                         args.data(), args.size());
-
-            return FullySpecifiedType(_control->namedType(n));
-        } else if (name->isQualifiedNameId()) {
-            // ### implement me
-        }
-
-        for (int i = 0; i < _substitution.size(); ++i) {
-            const QPair<Name *, FullySpecifiedType> s = _substitution.at(i);
-            if (name->isEqualTo(s.first))
-                return s.second;
-        }
-
-        return FullySpecifiedType(_control->namedType(name));
-    }
-
-    FullySpecifiedType subst(const FullySpecifiedType &ty)
-    {
-        FullySpecifiedType previousType = switchType(ty);
-        TypeVisitor::accept(ty.type());
-        return switchType(previousType);
-    }
-
-    FullySpecifiedType switchType(const FullySpecifiedType &type)
-    {
-        FullySpecifiedType previousType = _type;
-        _type = type;
-        return previousType;
-    }
-
-    // types
-    virtual void visit(PointerToMemberType * /*ty*/)
-    {
-        Q_ASSERT(false);
-    }
-
-    virtual void visit(PointerType *ty)
-    {
-        FullySpecifiedType elementType = subst(ty->elementType());
-        _type.setType(_control->pointerType(elementType));
-    }
-
-    virtual void visit(ReferenceType *ty)
-    {
-        FullySpecifiedType elementType = subst(ty->elementType());
-        _type.setType(_control->referenceType(elementType));
-    }
-
-    virtual void visit(ArrayType *ty)
-    {
-        FullySpecifiedType elementType = subst(ty->elementType());
-        _type.setType(_control->arrayType(elementType, ty->size()));
-    }
-
-    virtual void visit(NamedType *ty)
-    {
-        Name *name = ty->name();
-        _type.setType(subst(name).type());
-    }
-
-    virtual void visit(Function *ty)
-    {
-        Name *name = ty->name();
-        FullySpecifiedType returnType = subst(ty->returnType());
-
-        Function *fun = _control->newFunction(0, name);
-        fun->setScope(ty->scope());
-        fun->setConst(ty->isConst());
-        fun->setVolatile(ty->isVolatile());
-        fun->setReturnType(returnType);
-        for (unsigned i = 0; i < ty->argumentCount(); ++i) {
-            Symbol *arg = ty->argumentAt(i);
-            FullySpecifiedType argTy = subst(arg->type());
-            Argument *newArg = _control->newArgument(0, arg->name());
-            newArg->setType(argTy);
-            fun->arguments()->enterSymbol(newArg);
-        }
-        _type.setType(fun);
-    }
-
-    virtual void visit(VoidType *)
-    { /* nothing to do*/ }
-
-    virtual void visit(IntegerType *)
-    { /* nothing to do*/ }
-
-    virtual void visit(FloatType *)
-    { /* nothing to do*/ }
-
-    virtual void visit(Namespace *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(Class *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(Enum *)
-    { Q_ASSERT(false); }
-
-    // names
-    virtual void visit(NameId *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(TemplateNameId *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(DestructorNameId *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(OperatorNameId *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(ConversionNameId *)
-    { Q_ASSERT(false); }
-
-    virtual void visit(QualifiedNameId *)
-    { Q_ASSERT(false); }
-};
-
 template <typename _Tp>
 static QList<_Tp> removeDuplicates(const QList<_Tp> &results)
 {
@@ -286,9 +142,14 @@ bool ResolveExpression::visit(ConditionAST *)
     return false;
 }
 
-bool ResolveExpression::visit(ConditionalExpressionAST *)
+bool ResolveExpression::visit(ConditionalExpressionAST *ast)
 {
-    // nothing to do.
+    if (ast->left_expression)
+        accept(ast->left_expression);
+
+    else if (ast->right_expression)
+        accept(ast->right_expression);
+
     return false;
 }
 
@@ -300,7 +161,8 @@ bool ResolveExpression::visit(CppCastExpressionAST *ast)
 
 bool ResolveExpression::visit(DeleteExpressionAST *)
 {
-    // nothing to do.
+    FullySpecifiedType ty(control()->voidType());
+    addResult(ty);
     return false;
 }
 
@@ -310,8 +172,15 @@ bool ResolveExpression::visit(ArrayInitializerAST *)
     return false;
 }
 
-bool ResolveExpression::visit(NewExpressionAST *)
+bool ResolveExpression::visit(NewExpressionAST *ast)
 {
+    if (ast->new_type_id) {
+        Scope *scope = _context.expressionDocument()->globalSymbols();
+        FullySpecifiedType ty = sem.check(ast->new_type_id->type_specifier, scope);
+        ty = sem.check(ast->new_type_id->ptr_operators, ty, scope);
+        FullySpecifiedType ptrTy(control()->pointerType(ty));
+        addResult(ptrTy);
+    }
     // nothing to do.
     return false;
 }
@@ -836,7 +705,7 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass,
             unqualifiedNameId = q->unqualifiedNameId();
         
         if (TemplateNameId *templId = unqualifiedNameId->asTemplateNameId()) {
-            Substitution subst;
+            GenTemplateInstance::Substitution subst;
             
             for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
                 FullySpecifiedType templArgTy = templId->templateArgumentAt(i);
@@ -846,7 +715,7 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass,
                                            templArgTy));
             }
             
-            GenerateInstance inst(control(), subst);
+            GenTemplateInstance inst(control(), subst);
             ty = inst(ty);
         }
         
diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri
index 34caa520a80b538ac0af4d7eb9ad637cf9b23899..812dbe0c9a41bbd6f73642fedf25422b67ae1596 100644
--- a/src/libs/cplusplus/cplusplus-lib.pri
+++ b/src/libs/cplusplus/cplusplus-lib.pri
@@ -32,6 +32,7 @@ HEADERS += \
     $$PWD/LookupContext.h \
     $$PWD/CppBindings.h \
     $$PWD/ASTParent.h \
+    $$PWD/GenTemplateInstance.h \
     $$PWD/CheckUndefinedSymbols.h \
     $$PWD/PreprocessorClient.h \
     $$PWD/PreprocessorEnvironment.h \
@@ -54,6 +55,7 @@ SOURCES += \
     $$PWD/LookupContext.cpp \
     $$PWD/CppBindings.cpp \
     $$PWD/ASTParent.cpp \
+    $$PWD/GenTemplateInstance.cpp \
     $$PWD/CheckUndefinedSymbols.cpp \
     $$PWD/PreprocessorClient.cpp \
     $$PWD/PreprocessorEnvironment.cpp \
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 5ce662b9981af2aca9d19b8914bd7ef94fcc892b..c2bb068bced63fd7b9fcfa78481c12e020a31a06 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -545,6 +545,9 @@ Preprocessor::Preprocessor(Client *client, Environment *env)
     : client(client),
       env(env),
       _expand(env),
+      _skipping(MAX_LEVEL),
+      _trueTest(MAX_LEVEL),
+      _dot(_tokens.end()),
       _result(0),
       _markGeneratedTokens(false),
       _expandMacros(true)
@@ -1268,7 +1271,7 @@ void Preprocessor::processIf(TokenIterator firstToken, TokenIterator lastToken)
                                             tokens.constEnd() - 1,
                                             condition);
 
-        _true_test[iflevel] = ! result.is_zero ();
+        _trueTest[iflevel] = ! result.is_zero ();
         _skipping[iflevel]  =   result.is_zero ();
     }
 }
@@ -1282,7 +1285,7 @@ void Preprocessor::processElse(TokenIterator firstToken, TokenIterator lastToken
     } else if (iflevel > 0 && _skipping[iflevel - 1]) {
         _skipping[iflevel] = true;
     } else {
-        _skipping[iflevel] = _true_test[iflevel];
+        _skipping[iflevel] = _trueTest[iflevel];
     }
 }
 
@@ -1296,7 +1299,7 @@ void Preprocessor::processElif(TokenIterator firstToken, TokenIterator lastToken
         // std::cerr << "*** WARNING: " << __FILE__ << __LINE__ << std::endl;
     } else if (iflevel == 0 && !skipping()) {
         // std::cerr << "*** WARNING #else without #if" << std::endl;
-    } else if (!_true_test[iflevel] && !_skipping[iflevel - 1]) {
+    } else if (!_trueTest[iflevel] && !_skipping[iflevel - 1]) {
 
         const char *first = startOfToken(*tk);
         const char *last = startOfToken(*lastToken);
@@ -1312,7 +1315,7 @@ void Preprocessor::processElif(TokenIterator firstToken, TokenIterator lastToken
                                             tokens.constEnd() - 1,
                                             condition);
 
-        _true_test[iflevel] = ! result.is_zero ();
+        _trueTest[iflevel] = ! result.is_zero ();
         _skipping[iflevel]  =   result.is_zero ();
     } else {
         _skipping[iflevel] = true;
@@ -1325,7 +1328,7 @@ void Preprocessor::processEndif(TokenIterator, TokenIterator)
         // std::cerr << "*** WARNING #endif without #if" << std::endl;
     } else {
         _skipping[iflevel] = false;
-        _true_test[iflevel] = false;
+        _trueTest[iflevel] = false;
 
         --iflevel;
     }
@@ -1347,7 +1350,7 @@ void Preprocessor::processIfdef(bool checkUndefined,
             if (checkUndefined)
                 value = ! value;
 
-            _true_test[iflevel] =   value;
+            _trueTest[iflevel] =   value;
             _skipping [iflevel] = ! value;
         }
     }
@@ -1373,7 +1376,7 @@ void Preprocessor::resetIfLevel ()
 {
     iflevel = 0;
     _skipping[iflevel] = false;
-    _true_test[iflevel] = false;
+    _trueTest[iflevel] = false;
 }
 
 Preprocessor::PP_DIRECTIVE_TYPE Preprocessor::classifyDirective(const QByteArray &directive) const
@@ -1431,7 +1434,7 @@ bool Preprocessor::testIfLevel()
 {
     const bool result = !_skipping[iflevel++];
     _skipping[iflevel] = _skipping[iflevel - 1];
-    _true_test[iflevel] = false;
+    _trueTest[iflevel] = false;
     return result;
 }
 
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index 5203f7db0ea1fe2f074e9dbdc3d5e8ee81ca8d43..596a223e0583ad358ec8e1388e03fe44579df37c 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -54,6 +54,7 @@
 
 #include <Token.h>
 #include <QVector>
+#include <QBitArray>
 
 namespace CPlusPlus {
 
@@ -177,8 +178,8 @@ private:
     Environment *env;
     MacroExpander _expand;
 
-    bool _skipping[MAX_LEVEL]; // ### move in state
-    bool _true_test[MAX_LEVEL]; // ### move in state
+    QBitArray _skipping; // ### move in state
+    QBitArray _trueTest; // ### move in state
     int iflevel; // ### move in state
 
     QList<State> _savedStates;
diff --git a/src/libs/cplusplus/pp-scanner.h b/src/libs/cplusplus/pp-scanner.h
index 16baa57c372afb212ae079cc34ae0d89ea415de1..a7e005146029fa351962bcaa770fc6f16371cc81 100644
--- a/src/libs/cplusplus/pp-scanner.h
+++ b/src/libs/cplusplus/pp-scanner.h
@@ -54,6 +54,8 @@ namespace CPlusPlus {
 struct pp_skip_blanks
 {
   int lines;
+
+  pp_skip_blanks(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -61,6 +63,7 @@ struct pp_skip_whitespaces
 {
   int lines;
 
+  pp_skip_whitespaces(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -68,6 +71,7 @@ struct pp_skip_comment_or_divop
 {
   int lines;
 
+  pp_skip_comment_or_divop(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -75,6 +79,7 @@ struct pp_skip_identifier
 {
   int lines;
 
+  pp_skip_identifier(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -82,6 +87,7 @@ struct pp_skip_number
 {
   int lines;
 
+  pp_skip_number(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -89,6 +95,7 @@ struct pp_skip_string_literal
 {
   int lines;
 
+  pp_skip_string_literal(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -96,6 +103,7 @@ struct pp_skip_char_literal
 {
   int lines;
 
+  pp_skip_char_literal(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
@@ -108,6 +116,7 @@ struct pp_skip_argument
   pp_skip_comment_or_divop skip_comment_or_divop;
   int lines;
 
+  pp_skip_argument(): lines(0) {}
   const char *operator () (const char *first, const char *last);
 };
 
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec1.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec1.xml
index 31cebf441464d2db8e2e2e04911e47c0590ce26a..994f330bbe6c58cb4ebec5aaa1a3ee00e6cdbcf8 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec1.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec1.xml
@@ -1,6 +1,6 @@
 <plugin name="test" version="1.0.1" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.noki.com</url>
     <dependencyList>
         <dependency name="SomeOtherPlugin" version="2.3.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong1.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong1.xml
index e6fe956c98e0f72229e4b1178a8a27b3a30547bd..ffcb61241e9f59be9dd797203e8b9dd892f75f6a 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong1.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong1.xml
@@ -1,6 +1,6 @@
 <something name="test" version="1.0.1" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.nokia.com</url>
     <dependencyList>
         <dependency name="SomeOtherPlugin" version="2.3.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong2.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong2.xml
index 200a1fd1ac1be23cdebc6e7f713cf7e9057495bf..917acf78ad70ceaf1cd2dce8030b9853d6ef6c5a 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong2.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong2.xml
@@ -1,6 +1,6 @@
 <plugin version="1.0.1" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.nokia.com</url>
     <dependencyList>
         <dependency name="SomeOtherPlugin" version="2.3.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong3.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong3.xml
index 13bbdb09a8d5bd2bd13cb1ff21ebd5e322155ad2..d79ab4492bc982ab6764048e213c17eed70a6b87 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong3.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong3.xml
@@ -1,6 +1,6 @@
 <plugin name="test" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.nokia.com</url>
     <dependencyList>
         <dependency name="SomeOtherPlugin" version="2.3.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong4.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong4.xml
index b904f9013872abeb27256356d7f3ba7e92c54971..849f165f9cac0e2c71d2772ffeccb1c1bddadd92 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong4.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong4.xml
@@ -1,6 +1,6 @@
 <plugin name="test" version="1.0.1" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.nokia.com</url>
     <dependencyList>
         <dependency version="2.3.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong5.xml b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong5.xml
index 1c110d1eeae516128c76558ece0d0da06cf67e7f..03936fd88c0af6b389932455330a4fe3ecc8cbe8 100644
--- a/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong5.xml
+++ b/src/libs/extensionsystem/test/auto/pluginspec/testspecs/spec_wrong5.xml
@@ -1,6 +1,6 @@
 <plugin name="test" version="1.0.1" compatVersion="1.0.0">
-    <vendor>Trolltech</vendor>
-    <copyright>(C) 2007 Trolltech ASA</copyright>
+    <vendor>Nokia Corporation</vendor>
+    <copyright>(C) 2007 Nokia Corporation</copyright>
     <license>
 This is a default license bla
 blubbblubb
@@ -10,7 +10,7 @@ end of terms
 This plugin is just a test.
     it demonstrates the great use of the plugin spec.
     </description>
-    <url>http://www.trolltech.com</url>
+    <url>http://qt.nokia.com</url>
     <dependencyList>
         <dependency name="SomeOtherPlugin" version="2.3aa.0_2"/>
         <dependency name="EvenOther" version="1.0.0"/>
diff --git a/src/libs/utils/basevalidatinglineedit.cpp b/src/libs/utils/basevalidatinglineedit.cpp
index c70aa59e1f5020fe5d4c072af15ec77e4b6ef77c..255c9e6a34703be5f390721a0fa062672e051976 100644
--- a/src/libs/utils/basevalidatinglineedit.cpp
+++ b/src/libs/utils/basevalidatinglineedit.cpp
@@ -138,8 +138,10 @@ void BaseValidatingLineEdit::slotChanged(const QString &t)
         m_bd->m_state = newState;
         m_bd->m_firstChange = false;
         setTextColor(this, newState == Invalid ? m_bd->m_errorTextColor : m_bd->m_okTextColor);
-        if (validHasChanged)
+        if (validHasChanged) {
+            emit validChanged(newState == Valid);
             emit validChanged();
+        }
     }
 }
 
diff --git a/src/libs/utils/basevalidatinglineedit.h b/src/libs/utils/basevalidatinglineedit.h
index 77031bbd96c0efa2929c5e965d59c51aa0b6d0c1..5773d4f74516b771802152777a268f58379eb22d 100644
--- a/src/libs/utils/basevalidatinglineedit.h
+++ b/src/libs/utils/basevalidatinglineedit.h
@@ -81,6 +81,7 @@ public:
 
 signals:
     void validChanged();
+    void validChanged(bool validState);
     void validReturnPressed();
 
 protected:
diff --git a/src/libs/utils/newclasswidget.cpp b/src/libs/utils/newclasswidget.cpp
index 42265a062e1cfb4fc51c49486ab2310f44e16546..b3378281a9d7ae6d83aea33dd4af01aac2856a78 100644
--- a/src/libs/utils/newclasswidget.cpp
+++ b/src/libs/utils/newclasswidget.cpp
@@ -57,6 +57,7 @@ struct NewClassWidgetPrivate {
     bool m_baseClassInputVisible;
     bool m_formInputVisible;
     bool m_pathInputVisible;
+    bool m_qobjectCheckBoxVisible;
     bool m_formInputCheckable;
 };
 
@@ -69,7 +70,9 @@ NewClassWidgetPrivate:: NewClassWidgetPrivate() :
     m_baseClassInputVisible(true),
     m_formInputVisible(true),
     m_pathInputVisible(true),
+    m_qobjectCheckBoxVisible(false),
     m_formInputCheckable(false)
+
 {
 }
 
@@ -169,6 +172,17 @@ void NewClassWidget::setBaseClassInputVisible(bool visible)
     m_d->m_ui.baseClassComboBox->setVisible(visible);
 }
 
+void NewClassWidget::setQObjectCheckBoxVisible(bool visible)
+{
+    m_d->m_qobjectCheckBoxVisible = visible;
+    m_d->m_ui.qobjectCheckBox->setVisible(visible);
+}
+
+bool NewClassWidget::isQObjectCheckBoxVisible() const
+{
+    return m_d->m_qobjectCheckBoxVisible;
+}
+
 void NewClassWidget::setBaseClassEditable(bool editable)
 {
     m_d->m_ui.baseClassComboBox->setEditable(editable);
@@ -356,6 +370,16 @@ void NewClassWidget::setAllowDirectories(bool v)
     }
 }
 
+bool NewClassWidget::inheritsQObject() const
+{
+    return m_d->m_ui.qobjectCheckBox->isChecked();
+}
+
+void NewClassWidget::setInheritsQObject(bool v)
+{
+    m_d->m_ui.qobjectCheckBox->setChecked(v);
+}
+
 bool NewClassWidget::lowerCaseFiles() const
 {
     return m_d->m_ui.classLineEdit->lowerCaseFileName();
diff --git a/src/libs/utils/newclasswidget.h b/src/libs/utils/newclasswidget.h
index 52d03720a8eb487014f056d47d60d4da7f28f6d2..1a43877761c50439aa4d28c95b7acaec32d64337 100644
--- a/src/libs/utils/newclasswidget.h
+++ b/src/libs/utils/newclasswidget.h
@@ -57,6 +57,7 @@ class QTCREATOR_UTILS_EXPORT NewClassWidget : public QWidget
     Q_PROPERTY(bool baseClassEditable READ isBaseClassEditable WRITE setBaseClassEditable DESIGNABLE false)
     Q_PROPERTY(bool formInputVisible READ isFormInputVisible WRITE setFormInputVisible DESIGNABLE true)
     Q_PROPERTY(bool pathInputVisible READ isPathInputVisible WRITE setPathInputVisible DESIGNABLE true)
+    Q_PROPERTY(bool qobjectCheckBoxVisible READ isQObjectCheckBoxVisible WRITE setQObjectCheckBoxVisible DESIGNABLE true)
     Q_PROPERTY(QString className READ className WRITE setClassName DESIGNABLE true)
     Q_PROPERTY(QString baseClassName READ baseClassName WRITE setBaseClassName DESIGNABLE true)
     Q_PROPERTY(QString sourceFileName READ sourceFileName DESIGNABLE false)
@@ -70,6 +71,7 @@ class QTCREATOR_UTILS_EXPORT NewClassWidget : public QWidget
     Q_PROPERTY(bool formInputCheckable READ formInputCheckable WRITE setFormInputCheckable DESIGNABLE true)
     Q_PROPERTY(bool formInputChecked READ formInputChecked WRITE setFormInputChecked DESIGNABLE true)
     Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories)
+    Q_PROPERTY(bool inheritsQObject READ inheritsQObject WRITE setInheritsQObject)
     Q_PROPERTY(bool lowerCaseFiles READ lowerCaseFiles WRITE setLowerCaseFiles)
     // Utility "USER" property for wizards containing file names.
     Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true)
@@ -82,6 +84,7 @@ public:
     bool isBaseClassEditable() const;
     bool isFormInputVisible() const;
     bool isPathInputVisible() const;
+    bool isQObjectCheckBoxVisible() const;
     bool formInputCheckable() const;
     bool formInputChecked() const;
 
@@ -95,6 +98,7 @@ public:
     QString sourceExtension() const;
     QString headerExtension() const;
     QString formExtension() const;
+    bool inheritsQObject() const;
     bool allowDirectories() const;
     bool lowerCaseFiles() const;
 
@@ -114,6 +118,7 @@ public slots:
     void setPathInputVisible(bool visible);
     void setFormInputCheckable(bool v);
     void setFormInputChecked(bool v);
+    void setQObjectCheckBoxVisible(bool v);
 
     /**
      * The name passed into the new class widget will be reformatted to be a
@@ -126,6 +131,7 @@ public slots:
     void setSourceExtension(const QString &e);
     void setHeaderExtension(const QString &e);
     void setFormExtension(const QString &e);
+    void setInheritsQObject(bool v);
     void setAllowDirectories(bool v);
     void setLowerCaseFiles(bool v);
 
diff --git a/src/libs/utils/newclasswidget.ui b/src/libs/utils/newclasswidget.ui
index 76a093a76fb37673085abae10cfd0c8b50dfed3c..bb2e465cc011c908cef6bf925366ccceac058b5d 100644
--- a/src/libs/utils/newclasswidget.ui
+++ b/src/libs/utils/newclasswidget.ui
@@ -2,6 +2,14 @@
 <ui version="4.0">
  <class>Utils::NewClassWidget</class>
  <widget class="QWidget" name="Utils::NewClassWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>213</width>
+    <height>190</height>
+   </rect>
+  </property>
   <layout class="QFormLayout" name="formLayout">
    <property name="fieldGrowthPolicy">
     <enum>QFormLayout::ExpandingFieldsGrow</enum>
@@ -36,7 +44,7 @@
      </property>
     </widget>
    </item>
-   <item row="2" column="0">
+   <item row="3" column="0">
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -52,7 +60,7 @@
      </property>
     </spacer>
    </item>
-   <item row="2" column="1">
+   <item row="3" column="1">
     <spacer name="verticalSpacer_2">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
@@ -68,60 +76,67 @@
      </property>
     </spacer>
    </item>
-   <item row="3" column="0">
+   <item row="4" column="0">
     <widget class="QLabel" name="headerLabel">
      <property name="text">
       <string>Header file:</string>
      </property>
     </widget>
    </item>
-   <item row="3" column="1">
+   <item row="4" column="1">
     <widget class="Utils::FileNameValidatingLineEdit" name="headerFileLineEdit"/>
    </item>
-   <item row="4" column="0">
+   <item row="5" column="0">
     <widget class="QLabel" name="sourceLabel">
      <property name="text">
       <string>Source file:</string>
      </property>
     </widget>
    </item>
-   <item row="4" column="1">
+   <item row="5" column="1">
     <widget class="Utils::FileNameValidatingLineEdit" name="sourceFileLineEdit"/>
    </item>
-   <item row="5" column="0">
+   <item row="6" column="0">
     <widget class="QLabel" name="generateFormLabel">
      <property name="text">
       <string>Generate form:</string>
      </property>
     </widget>
    </item>
-   <item row="6" column="0">
+   <item row="7" column="0">
     <widget class="QLabel" name="formLabel">
      <property name="text">
       <string>Form file:</string>
      </property>
     </widget>
    </item>
-   <item row="6" column="1">
+   <item row="7" column="1">
     <widget class="Utils::FileNameValidatingLineEdit" name="formFileLineEdit"/>
    </item>
-   <item row="7" column="0">
+   <item row="8" column="0">
     <widget class="QLabel" name="pathLabel">
      <property name="text">
       <string>Path:</string>
      </property>
     </widget>
    </item>
-   <item row="7" column="1">
+   <item row="8" column="1">
     <widget class="Utils::PathChooser" name="pathChooser" native="true"/>
    </item>
-   <item row="5" column="1">
+   <item row="6" column="1">
     <widget class="QCheckBox" name="generateFormCheckBox">
      <property name="text">
       <string/>
      </property>
     </widget>
    </item>
+   <item row="2" column="1">
+    <widget class="QCheckBox" name="qobjectCheckBox">
+     <property name="text">
+      <string>Inherits QObject</string>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <customwidgets>
diff --git a/src/libs/utils/pathchooser.cpp b/src/libs/utils/pathchooser.cpp
index c550ecbc39f5a7c5815dd767ca8f14c68789b3c5..76e4247931bb384915a8a2ac59365007ec6ba99c 100644
--- a/src/libs/utils/pathchooser.cpp
+++ b/src/libs/utils/pathchooser.cpp
@@ -108,6 +108,7 @@ PathChooser::PathChooser(QWidget *parent) :
     connect(m_d->m_lineEdit, SIGNAL(validReturnPressed()), this, SIGNAL(returnPressed()));
     connect(m_d->m_lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed(QString)));
     connect(m_d->m_lineEdit, SIGNAL(validChanged()), this, SIGNAL(validChanged()));
+    connect(m_d->m_lineEdit, SIGNAL(validChanged(bool)), this, SIGNAL(validChanged(bool)));
     connect(m_d->m_lineEdit, SIGNAL(editingFinished()), this, SIGNAL(editingFinished()));
 
     m_d->m_lineEdit->setMinimumWidth(200);
diff --git a/src/libs/utils/pathchooser.h b/src/libs/utils/pathchooser.h
index ee3e6eaf40cc29576a418718a5de5fb5d80006a7..d974e90d0319fdc6c7a0ad2d1be364a0970eb80a 100644
--- a/src/libs/utils/pathchooser.h
+++ b/src/libs/utils/pathchooser.h
@@ -99,6 +99,7 @@ private:
 
 signals:
     void validChanged();
+    void validChanged(bool validState);
     void changed(const QString &text);
     void editingFinished();
     void beforeBrowsing();
diff --git a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
index 0939a1c43f3ef99207f4c2f9df4a08bdaeae616d..f9526756e799b3d76d39436ecce69abcacb0d486 100644
--- a/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeopenprojectwizard.cpp
@@ -435,9 +435,10 @@ void CMakeRunPage::runCMake()
     m_output->clear();
 
     if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) {
-        m_cmakeProcess = cmakeManager->createXmlFile(arguments, m_cmakeWizard->sourceDirectory(), m_buildDirectory, env, generator);
+        m_cmakeProcess = new QProcess();
         connect(m_cmakeProcess, SIGNAL(readyRead()), this, SLOT(cmakeReadyRead()));
         connect(m_cmakeProcess, SIGNAL(finished(int)), this, SLOT(cmakeFinished()));
+        cmakeManager->createXmlFile(m_cmakeProcess, arguments, m_cmakeWizard->sourceDirectory(), m_buildDirectory, env, generator);
     } else {
         m_runCMake->setEnabled(true);
         m_argumentsLineEdit->setEnabled(true);
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
index fbab5af5d8f773ef6c4fb89a38b7a8bc4ab927f8..d0b683c8b38c29571ced06da61c1f3d412943f83 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
@@ -99,7 +99,7 @@ bool CMakeManager::hasCodeBlocksMsvcGenerator() const
 // we probably want the process instead of this function
 // cmakeproject then could even run the cmake process in the background, adding the files afterwards
 // sounds like a plan
-QProcess *CMakeManager::createXmlFile(const QStringList &arguments, const QString &sourceDirectory, const QDir &buildDirectory, const ProjectExplorer::Environment &env, const QString &generator)
+void CMakeManager::createXmlFile(QProcess *proc, const QStringList &arguments, const QString &sourceDirectory, const QDir &buildDirectory, const ProjectExplorer::Environment &env, const QString &generator)
 {
     // We create a cbp file, only if we didn't find a cbp file in the base directory
     // Yet that can still override cbp files in subdirectories
@@ -111,14 +111,12 @@ QProcess *CMakeManager::createXmlFile(const QStringList &arguments, const QStrin
     // TODO we need to pass on the same paremeters as the cmakestep
     QString buildDirectoryPath = buildDirectory.absolutePath();
     buildDirectory.mkpath(buildDirectoryPath);
-    QProcess *cmake = new QProcess;
-    cmake->setWorkingDirectory(buildDirectoryPath);
-    cmake->setProcessChannelMode(QProcess::MergedChannels);
-    cmake->setEnvironment(env.toStringList());
+    proc->setWorkingDirectory(buildDirectoryPath);
+    proc->setProcessChannelMode(QProcess::MergedChannels);
+    proc->setEnvironment(env.toStringList());
 
     const QString srcdir = buildDirectory.exists(QLatin1String("CMakeCache.txt")) ? QString(QLatin1Char('.')) : sourceDirectory;    
-    cmake->start(cmakeExecutable(), QStringList() << srcdir << arguments << generator);
-    return cmake;
+    proc->start(cmakeExecutable(), QStringList() << srcdir << arguments << generator);
 }
 
 QString CMakeManager::findCbpFile(const QDir &directory)
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
index a33055235ab0f88b92099aaab1dcf3055d0af089..2c8a3ee3fc03f2524b9235895055bce3c70bf1de 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h
@@ -63,11 +63,12 @@ public:
 
     void setCMakeExecutable(const QString &executable);
 
-    QProcess* createXmlFile(const QStringList &arguments,
-                            const QString &sourceDirectory,
-                            const QDir &buildDirectory,
-                            const ProjectExplorer::Environment &env,
-                            const QString &generator);
+    void createXmlFile(QProcess *process,
+                       const QStringList &arguments,
+                       const QString &sourceDirectory,
+                       const QDir &buildDirectory,
+                       const ProjectExplorer::Environment &env,
+                       const QString &generator);
     bool hasCodeBlocksMsvcGenerator() const;
     static QString findCbpFile(const QDir &);
 
diff --git a/src/plugins/coreplugin/messagemanager.cpp b/src/plugins/coreplugin/messagemanager.cpp
index 6252d119d48c88d4d60b4e9274032bc3f6d5e049..7ff9cee01cdf6bd03e9857fb72dbd1855a80248f 100644
--- a/src/plugins/coreplugin/messagemanager.cpp
+++ b/src/plugins/coreplugin/messagemanager.cpp
@@ -82,3 +82,14 @@ void MessageManager::printToOutputPane(const QString &text, bool bringToForegrou
         m_messageOutputWindow->popup(false);
     m_messageOutputWindow->append(text);
 }
+
+void MessageManager::printToOutputPanePopup(const QString &text)
+{
+    printToOutputPane(text, true);
+}
+
+void MessageManager::printToOutputPane(const QString &text)
+{
+    printToOutputPane(text, false);
+}
+
diff --git a/src/plugins/coreplugin/messagemanager.h b/src/plugins/coreplugin/messagemanager.h
index 664269cda67b8ed1e7c49c6b1f1a0d98fdf32e39..4191145cd88f197db18bb220fbe63ba110607530 100644
--- a/src/plugins/coreplugin/messagemanager.h
+++ b/src/plugins/coreplugin/messagemanager.h
@@ -55,7 +55,9 @@ public:
     void showOutputPane();
 
 public slots:
-    void printToOutputPane(const QString &text, bool bringToForeground = true);
+    void printToOutputPane(const QString &text, bool bringToForeground);
+    void printToOutputPanePopup(const QString &text); // pops up
+    void printToOutputPane(const QString &text);
 
 private:
     Internal::MessageOutputWindow *m_messageOutputWindow;
diff --git a/src/plugins/cpaster/pastebindotcomsettings.cpp b/src/plugins/cpaster/pastebindotcomsettings.cpp
index 6205facfdb89906680b0cd3532d68ebece20f82b..3823524c0b7ea446b664424f2663fa3ba491d395 100644
--- a/src/plugins/cpaster/pastebindotcomsettings.cpp
+++ b/src/plugins/cpaster/pastebindotcomsettings.cpp
@@ -65,11 +65,11 @@ QString PasteBinDotComSettings::trCategory() const
 
 QWidget *PasteBinDotComSettings::createPage(QWidget *parent)
 {
-    Ui_PasteBinComSettingsWidget* ui = new Ui_PasteBinComSettingsWidget;
+    Ui_PasteBinComSettingsWidget ui;
     QWidget *w = new QWidget(parent);
-    ui->setupUi(w);
-    ui->lineEdit->setText(hostPrefix());
-    connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(serverChanged(QString)));
+    ui.setupUi(w);
+    ui.lineEdit->setText(hostPrefix());
+    connect(ui.lineEdit, SIGNAL(textChanged(QString)), this, SLOT(serverChanged(QString)));
     return w;
 }
 
diff --git a/src/plugins/cppeditor/cppclasswizard.cpp b/src/plugins/cppeditor/cppclasswizard.cpp
index 1c994c6ebcb9a58a17a5d2097a6ee25079ddeeb8..02ce50a5e1fd98d58a81aa15b19b8ec5e1628211 100644
--- a/src/plugins/cppeditor/cppclasswizard.cpp
+++ b/src/plugins/cppeditor/cppclasswizard.cpp
@@ -74,6 +74,7 @@ ClassNamePage::ClassNamePage(QWidget *parent) :
     m_newClassWidget->setFormInputVisible(false);
     m_newClassWidget->setNamespacesEnabled(true);
     m_newClassWidget->setAllowDirectories(true);
+    m_newClassWidget->setBaseClassInputVisible(true);
 
     connect(m_newClassWidget, SIGNAL(validChanged()), this, SLOT(slotValidChanged()));
 
@@ -154,6 +155,7 @@ CppClassWizardParameters  CppClassWizardDialog::parameters() const
     rc.sourceFile = ncw->sourceFileName();
     rc.baseClass = ncw->baseClassName();
     rc.path = ncw->path();
+    rc.inheritsQObject = ncw->inheritsQObject();
     return rc;
 }
 
@@ -253,6 +255,8 @@ bool CppClassWizard::generateHeaderAndSource(const CppClassWizardParameters &par
     else
         headerStr << "\n";
     headerStr << namespaceIndent << "{\n";
+    if (params.inheritsQObject)
+        headerStr << namespaceIndent << "Q_OBJECT\n";
     headerStr << namespaceIndent << "public:\n"
               << namespaceIndent << indent << unqualifiedClassName << "();\n";
     headerStr << namespaceIndent << "};\n";
diff --git a/src/plugins/cppeditor/cppclasswizard.h b/src/plugins/cppeditor/cppclasswizard.h
index 1bc26d1b56f942a8ab08d7a871294c2257c89bfa..0d2f2ae11fafcb00820a96ce8f09e04f8742f830 100644
--- a/src/plugins/cppeditor/cppclasswizard.h
+++ b/src/plugins/cppeditor/cppclasswizard.h
@@ -74,6 +74,7 @@ struct CppClassWizardParameters
     QString sourceFile;
     QString baseClass;
     QString path;
+    bool inheritsQObject;
 };
 
 class CppClassWizardDialog : public QWizard
diff --git a/src/plugins/cppeditor/cpphoverhandler.cpp b/src/plugins/cppeditor/cpphoverhandler.cpp
index 508eec2854cc65fad7f809535775e08f3f2e3cd1..ff671da25afaf8cbd2c54d45f23ec5cb76402693 100644
--- a/src/plugins/cppeditor/cpphoverhandler.cpp
+++ b/src/plugins/cppeditor/cpphoverhandler.cpp
@@ -337,7 +337,8 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
             firstType = resolve(firstType, typeOfExpression.lookupContext(),
                                 &resolvedSymbol, &resolvedName);
 
-            if (resolvedSymbol && resolvedSymbol->scope()->isClassScope()) {
+            if (resolvedSymbol && resolvedSymbol->scope()
+                && resolvedSymbol->scope()->isClassScope()) {
                 Class *enclosingClass = resolvedSymbol->scope()->owner()->asClass();
                 if (Identifier *id = enclosingClass->identifier()) {
                     if (id->isEqualTo(resolvedSymbol->identifier()))
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index edaafcc890fe4e8a500edd7c863e600704a0c715..5cea0c14c9e0c76d645808dfcef192465b18c160 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -510,8 +510,11 @@ void CppQuickFixCollector::cleanup()
 CppCodeCompletion::CppCodeCompletion(CppModelManager *manager)
     : ICompletionCollector(manager),
       m_manager(manager),
+      m_editor(0),
+      m_startPosition(-1),
       m_caseSensitivity(Qt::CaseSensitive),
       m_autoInsertBrackets(true),
+      m_partialCompletionEnabled(true),
       m_forcedCompletion(false),
       m_completionOperator(T_EOF_SYMBOL),
       m_objcEnabled(true)
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index 56cf85150e8613e12836e51f93220ac9f05965e6..7f710d0e32ab13ef71644e9fd3143cdc8d5dcf52 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -149,28 +149,26 @@ private:
 
     int findStartOfName(int pos = -1) const;
 
-    QList<TextEditor::CompletionItem> m_completions;
+private:
+    bool objcKeywordsWanted() const;
 
+    CppModelManager *m_manager;
     TextEditor::ITextEditable *m_editor;
     int m_startPosition;     // Position of the cursor from which completion started
 
-    CppModelManager *m_manager;
     Qt::CaseSensitivity m_caseSensitivity;
     bool m_autoInsertBrackets;
     bool m_partialCompletionEnabled;
-
     bool m_forcedCompletion;
+    unsigned m_completionOperator;
+    bool m_objcEnabled;
 
     CPlusPlus::Icons m_icons;
     CPlusPlus::Overview overview;
     CPlusPlus::TypeOfExpression typeOfExpression;
-
-    unsigned m_completionOperator;
-
     QPointer<FunctionArgumentWidget> m_functionArgumentWidget;
 
-    bool objcKeywordsWanted() const;
-    bool m_objcEnabled;
+    QList<TextEditor::CompletionItem> m_completions;
 };
 
 } // namespace Internal
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index db9e984b1ac5521773266a2c0c06f908804da937..90811aad5a38636229777826110316c3261f4857 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -165,7 +165,8 @@ class CheckDocument: protected ASTVisitor
 
 public:
     CheckDocument(Document::Ptr doc, Snapshot snapshot)
-        : ASTVisitor(doc->control()), _doc(doc), _snapshot(snapshot)
+        : ASTVisitor(doc->control()), _doc(doc), _snapshot(snapshot),
+          _line(0), _column(0)
     { }
 
     QList<QuickFixOperationPtr> operator()(QTextCursor tc)
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h
index d788ebbb28216c6e5c789f07796a03162b4043e5..86f5867493ca0fc0e5fb28688b1951724edd1d40 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.h
+++ b/src/plugins/cpptools/cpptoolseditorsupport.h
@@ -89,7 +89,6 @@ protected:
     QTextCursor moveAtEndOfToken(unsigned index) const;
 
 private:
-    CPlusPlus::AST *_node;
     CPlusPlus::Document::Ptr _doc;
     CPlusPlus::Snapshot _snapshot;
     QTextCursor _textCursor;
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index 10ceeae373c2f1e731835ccda43a3b66cf9def32..69df0bdc672fc8e9b748ac3e122a26ff0726e347 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -51,6 +51,8 @@ struct ModelItemInfo
     enum ItemType { Enum, Class, Method, Declaration };
 
     ModelItemInfo()
+        : type(Declaration),
+          line(0)
     { }
 
     ModelItemInfo(const QString &symbolName,
diff --git a/src/plugins/debugger/cdb/cdb.pri b/src/plugins/debugger/cdb/cdb.pri
index ca08a11bb6167f230a2d8806da795b02204c5b40..34a89b7042a17bb614fc8d62472d6f2a187ae9c3 100644
--- a/src/plugins/debugger/cdb/cdb.pri
+++ b/src/plugins/debugger/cdb/cdb.pri
@@ -5,7 +5,7 @@ win32 {
 contains(QMAKE_CXX, cl) {
 
 CDB_PATH=$$(CDB_PATH)
-isEmpty($$CDB_PATH):CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows/sdk"
+isEmpty(CDB_PATH):CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows/sdk"
 
 !exists($$CDB_PATH):CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows (x86)/sdk"
 !exists($$CDB_PATH):CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows (x64)/sdk"
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index f4b4ed0385d85a37bfa8160c016b108fc47ea654..48d2f418a970274448d94d6ac159bebbd366c09e 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -216,6 +216,7 @@ static const char *stateName(int s)
 DebuggerStartParameters::DebuggerStartParameters()
   : attachPID(-1),
     useTerminal(false),
+    remoteChannelType(-1),
     toolChainType(ProjectExplorer::ToolChain::UNKNOWN),
     startMode(NoStartMode)
 {}
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 7272584754a7b373d5a8749b54bee01092095d47..ff40707d7d0609c76b9aa6b67b88db5ec9b4d298 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -113,6 +113,7 @@ public:
     QString crashParameter; // for AttachCrashedExternal
     // for remote debugging
     QString remoteChannel;
+    int remoteChannelType;
     QString remoteArchitecture;
     QString symbolFileName;
     QString serverStartScript;
diff --git a/src/plugins/debugger/gdb/gdb.pri b/src/plugins/debugger/gdb/gdb.pri
index e7763cecb6f939efe2862d7bb3cc3adada4438d7..19f453ba7d6512fa22b509bf763c42f1c67470c3 100644
--- a/src/plugins/debugger/gdb/gdb.pri
+++ b/src/plugins/debugger/gdb/gdb.pri
@@ -19,6 +19,7 @@ HEADERS += \
     $$PWD/termgdbadapter.h \
     $$PWD/remotegdbadapter.h \
     $$PWD/trkgdbadapter.h \
+    $$PWD/s60debuggerbluetoothstarter.h
 
 SOURCES += \
     $$PWD/gdbmi.cpp \
@@ -34,6 +35,7 @@ SOURCES += \
     $$PWD/termgdbadapter.cpp \
     $$PWD/remotegdbadapter.cpp \
     $$PWD/trkgdbadapter.cpp \
+    $$PWD/s60debuggerbluetoothstarter.cpp
 
 FORMS +=  $$PWD/gdboptionspage.ui \
 $$PWD/trkoptionswidget.ui
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index c1881fb2982da75ada3f4d500a794f7ece66441a..a0ac59ca7339aa1cfd8a213029bec58d0371a6ed 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -225,7 +225,9 @@ QMainWindow *GdbEngine::mainWindow() const
 GdbEngine::~GdbEngine()
 {
     // prevent sending error messages afterwards
+    disconnect(&m_gdbProc);
     delete m_gdbAdapter;
+    m_gdbAdapter = 0;
 }
 
 void GdbEngine::connectAdapter()
@@ -250,13 +252,15 @@ void GdbEngine::initializeVariables()
     m_debuggingHelperState = DebuggingHelperUninitialized;
     m_gdbVersion = 100;
     m_gdbBuildVersion = -1;
+    m_isMacGdb = false;
     m_isSynchroneous = false;
 
     m_fullToShortName.clear();
     m_shortToFullName.clear();
     m_varToType.clear();
 
-    m_modulesListOutdated = true;
+    m_modulesListOutdated = m_sourcesListOutdated = true;
+    m_sourcesListUpdating = false;
     m_oldestAcceptableToken = -1;
     m_outputCodec = QTextCodec::codecForLocale();
     m_pendingRequests = 0;
@@ -416,12 +420,14 @@ void GdbEngine::handleResponse(const QByteArray &buff)
                 QByteArray id = result.findChild("id").data();
                 if (!id.isEmpty())
                     showStatusMessage(tr("Library %1 loaded.").arg(_(id)));
+                m_modulesListOutdated = m_sourcesListOutdated = true;
             } else if (asyncClass == "library-unloaded") {
                 // Archer has 'id="/usr/lib/libdrm.so.2",
                 // target-name="/usr/lib/libdrm.so.2",
                 // host-name="/usr/lib/libdrm.so.2"
                 QByteArray id = result.findChild("id").data();
                 showStatusMessage(tr("Library %1 unloaded.").arg(_(id)));
+                m_modulesListOutdated = m_sourcesListOutdated = true;
             } else if (asyncClass == "thread-group-created") {
                 // Archer has "{id="28902"}" 
                 QByteArray id = result.findChild("id").data();
@@ -450,6 +456,7 @@ void GdbEngine::handleResponse(const QByteArray &buff)
             #if defined(Q_OS_MAC)
             } else if (asyncClass == "shlibs-updated") {
                 // MAC announces updated libs
+                m_modulesListOutdated = m_sourcesListOutdated = true;
             } else if (asyncClass == "shlibs-added") {
                 // MAC announces added libs
                 // {shlib-info={num="2", name="libmathCommon.A_debug.dylib",
@@ -457,6 +464,7 @@ void GdbEngine::handleResponse(const QByteArray &buff)
                 // state="Y", path="/usr/lib/system/libmathCommon.A_debug.dylib",
                 // description="/usr/lib/system/libmathCommon.A_debug.dylib",
                 // loaded_addr="0x7f000", slide="0x7f000", prefix=""}}
+                m_modulesListOutdated = m_sourcesListOutdated = true;
             #endif
             } else {
                 qDebug() << "IGNORED ASYNC OUTPUT"
@@ -488,12 +496,14 @@ void GdbEngine::handleResponse(const QByteArray &buff)
             }
 
             // Show some messages to give the impression something happens.
-            if (data.startsWith("Reading symbols from "))
+            if (data.startsWith("Reading symbols from ")) {
                 showStatusMessage(tr("Reading %1...").arg(_(data.mid(21))), 1000);
-            if (data.endsWith('\n'))
-                data.chop(1);
-            if (data.startsWith("[New ") || data.startsWith("[Thread "))
+                m_modulesListOutdated = m_sourcesListOutdated = true;
+            } else if (data.startsWith("[New ") || data.startsWith("[Thread ")) {
+                if (data.endsWith('\n'))
+                    data.chop(1);
                 showStatusMessage(_(data), 1000);
+            }
             break;
         }
 
@@ -561,7 +571,7 @@ void GdbEngine::handleResponse(const QByteArray &buff)
             m_pendingLogStreamOutput.clear();
             m_pendingConsoleStreamOutput.clear();
 
-            handleResultRecord(response);
+            handleResultRecord(&response);
             break;
         }
         default: {
@@ -608,18 +618,12 @@ void GdbEngine::readGdbStandardOutput()
 
 void GdbEngine::interruptInferior()
 {
-    QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
-
-    if (state() == DebuggerNotReady) {
-        debugMessage(_("TRYING TO INTERRUPT INFERIOR WITHOUT RUNNING GDB"));
-        shutdown();
-        return;
-    }
+    QTC_ASSERT(state() == InferiorRunning, qDebug() << state(); return);
 
     setState(InferiorStopping);
     showStatusMessage(tr("Stop requested..."), 5000);
 
-    debugMessage(_("TRYING TO INTERUPT INFERIOR"));
+    debugMessage(_("TRYING TO INTERRUPT INFERIOR"));
     m_gdbAdapter->interruptInferior();
 }
 
@@ -695,17 +699,19 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd)
             << "LEAVES PENDING AT:" << m_pendingRequests << cmd.command);
     }
 
-    if (cmd.flags & NeedsStop) {
+    if ((cmd.flags & NeedsStop) || !m_commandsToRunOnTemporaryBreak.isEmpty()) {
         if (state() == InferiorStopped
             || state() == InferiorStarting || state() == AdapterStarted) {
             // Can be safely sent now.
             flushCommand(cmd);
         } else {
             // Queue the commands that we cannot send at once.
-            showStatusMessage(tr("Stopping temporarily."), 1000);
             debugMessage(_("QUEUING COMMAND ") + cmd.command);
             m_commandsToRunOnTemporaryBreak.append(cmd);
-            interruptInferior();
+            if (state() != InferiorStopping) {
+                showStatusMessage(tr("Stopping temporarily."), 1000);
+                interruptInferior(); // FIXME: race condition between gdb and kill()
+            }
         }
     } else if (!cmd.command.isEmpty()) {
         flushCommand(cmd);
@@ -732,13 +738,13 @@ void GdbEngine::flushCommand(const GdbCommand &cmd0)
     m_gdbAdapter->write(cmd.command.toLatin1() + "\r\n");
 }
 
-void GdbEngine::handleResultRecord(const GdbResponse &response)
+void GdbEngine::handleResultRecord(GdbResponse *response)
 {
     //qDebug() << "TOKEN:" << response.token
     //    << " ACCEPTABLE:" << m_oldestAcceptableToken;
     //qDebug() << "\nRESULT" << response.token << response.toString();
 
-    int token = response.token;
+    int token = response->token;
     if (token == -1)
         return;
 
@@ -749,8 +755,8 @@ void GdbEngine::handleResultRecord(const GdbResponse &response)
         // Ideally, this code should not be present at all.
         debugMessage(_("COOKIE FOR TOKEN %1 ALREADY EATEN. "
             "TWO RESPONSES FOR ONE COMMAND?").arg(token));
-        if (response.resultClass == GdbResultError) {
-            QByteArray msg = response.data.findChild("msg").data();
+        if (response->resultClass == GdbResultError) {
+            QByteArray msg = response->data.findChild("msg").data();
             if (msg == "Cannot find new threads: generic error") {
                 // Handle a case known to occur on Linux/gdb 6.8 when debugging moc
                 // with helpers enabled. In this case we get a second response with
@@ -787,26 +793,25 @@ void GdbEngine::handleResultRecord(const GdbResponse &response)
             .arg(cmd.postTime.msecsTo(QTime::currentTime()) / 1000.));
     }
 
-    if (response.token < m_oldestAcceptableToken && (cmd.flags & Discardable)) {
+    if (response->token < m_oldestAcceptableToken && (cmd.flags & Discardable)) {
         //debugMessage(_("### SKIPPING OLD RESULT") + response.toString());
         return;
     }
 
-    GdbResponse responseWithCookie = response;
-    responseWithCookie.cookie = cmd.cookie;
+    response->cookie = cmd.cookie;
 
-    if (response.resultClass != GdbResultError &&
-        response.resultClass != ((cmd.flags & RunRequest) ? GdbResultRunning :
-                                 (cmd.flags & ExitRequest) ? GdbResultExit :
-                                 GdbResultDone)) {
-        QString rsp = _(GdbResponse::stringFromResultClass(response.resultClass));
+    if (response->resultClass != GdbResultError &&
+        response->resultClass != ((cmd.flags & RunRequest) ? GdbResultRunning :
+                                  (cmd.flags & ExitRequest) ? GdbResultExit :
+                                  GdbResultDone)) {
+        QString rsp = _(GdbResponse::stringFromResultClass(response->resultClass));
         qWarning() << "UNEXPECTED RESPONSE " << rsp << " TO COMMAND" << cmd.command << " AT " __FILE__ ":" STRINGIFY(__LINE__);
         debugMessage(_("UNEXPECTED RESPONSE %1 TO COMMAND %2").arg(rsp).arg(cmd.command));
     } else {
         if (cmd.callback)
-            (this->*cmd.callback)(responseWithCookie);
+            (this->*cmd.callback)(*response);
         else if (cmd.adapterCallback)
-            (m_gdbAdapter->*cmd.adapterCallback)(responseWithCookie);
+            (m_gdbAdapter->*cmd.adapterCallback)(*response);
     }
 
     if (cmd.flags & RebuildModel) {
@@ -864,6 +869,7 @@ void GdbEngine::updateAll()
 
 void GdbEngine::handleQuerySources(const GdbResponse &response)
 {
+    m_sourcesListUpdating = false;
     if (response.resultClass == GdbResultDone) {
         QMap<QString, QString> oldShortToFull = m_shortToFullName;
         m_shortToFullName.clear();
@@ -874,13 +880,15 @@ void GdbEngine::handleQuerySources(const GdbResponse &response)
         foreach (const GdbMi &item, files.children()) {
             QString fileName = QString::fromLocal8Bit(item.findChild("file").data());
             GdbMi fullName = item.findChild("fullname");
-            QString full = QString::fromLocal8Bit(fullName.data());
-            #ifdef Q_OS_WIN
-            full = QDir::cleanPath(full);
-            #endif
-            if (fullName.isValid() && QFileInfo(full).isReadable()) {
-                m_shortToFullName[fileName] = full;
-                m_fullToShortName[full] = fileName;
+            if (fullName.isValid()) {
+                QString full = QString::fromLocal8Bit(fullName.data());
+                if (QFileInfo(full).isReadable()) {
+                    #ifdef Q_OS_WIN
+                    full = QDir::cleanPath(full);
+                    #endif
+                    m_shortToFullName[fileName] = full;
+                    m_fullToShortName[full] = fileName;
+                }
             }
         }
         if (m_shortToFullName != oldShortToFull)
@@ -939,21 +947,6 @@ static bool isExitedReason(const QByteArray &reason)
         || reason == "exited";           // inferior exited
 }
 
-static bool isStoppedReason(const QByteArray &reason)
-{
-    return reason == "function-finished"  // -exec-finish
-        || reason == "signal-received"  // handled as "isExitedReason"
-        || reason == "breakpoint-hit"     // -exec-continue
-        || reason == "end-stepping-range" // -exec-next, -exec-step
-        || reason == "location-reached"   // -exec-until
-        || reason == "access-watchpoint-trigger"
-        || reason == "read-watchpoint-trigger"
-        #ifdef Q_OS_MAC
-        || reason.isEmpty()
-        #endif
-    ;
-}
-
 #if 0
 void GdbEngine::handleAqcuiredInferior()
 {
@@ -1054,8 +1047,28 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
     }
     setState(InferiorStopped);
 
+#ifdef Q_OS_LINUX
+    // For some reason, attaching to a stopped process causes *two* stops
+    // when trying to continue (kernel 2.6.24-23-ubuntu).
+    // Interestingly enough, on MacOSX no signal is delivered at all.
+    if (reason == "signal-received"
+        && data.findChild("signal-name").data() == "SIGSTOP") {
+        GdbMi frameData = data.findChild("frame");
+        if (frameData.findChild("func").data() == "_start"
+            && frameData.findChild("from").data() == "/lib/ld-linux.so.2") {
+            continueInferiorInternal();
+            return;
+        }
+    }
+#endif
+
+#if 0
+    // The related code (handleAqcuiredInferior()) is disabled as well.
+    // When re-enabling, try something to avoid spurious source list updates
+    // due to unrelated no-reason stops.
     const QByteArray &msg = data.findChild("consolestreamoutput").data();
     if (msg.contains("Stopped due to shared library event") || reason.isEmpty()) {
+        m_modulesListOutdated = m_sourcesListOutdated = true;
         if (theDebuggerBoolSetting(SelectedPluginBreakpoints)) {
             QString dataStr = _(data.toString());
             debugMessage(_("SHARED LIBRARY EVENT: ") + dataStr);
@@ -1066,9 +1079,9 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
             showStatusMessage(tr("Loading %1...").arg(dataStr));
             return;
         }
-        m_modulesListOutdated = true;
         // fall through
     }
+#endif
 
     // seen on XP after removing a breakpoint while running
     //  >945*stopped,reason="signal-received",signal-name="SIGTRAP",
@@ -1087,9 +1100,6 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
         if (reason == "end-stepping-range" || reason == "function-finished") {
             GdbMi frame = data.findChild("frame");
             //debugMessage(frame.toString());
-            m_currentFrame = _(frame.findChild("addr").data() + '%' +
-                 frame.findChild("func").data() + '%');
-
             QString funcName = _(frame.findChild("func").data());
             QString fileName = QString::fromLocal8Bit(frame.findChild("file").data());
             if (isLeavableFunction(funcName, fileName)) {
@@ -1111,47 +1121,24 @@ void GdbEngine::handleStopResponse(const GdbMi &data)
         }
     }
 
-    if (isStoppedReason(reason) || reason.isEmpty()) {
-        if (initHelpers && m_debuggingHelperState != DebuggingHelperUninitialized)
+    if (initHelpers && m_debuggingHelperState != DebuggingHelperUninitialized)
+        initHelpers = false;
+    // Don't load helpers on stops triggered by signals unless it's
+    // an intentional trap.
+    if (initHelpers && reason == "signal-received") {
+        QByteArray name = data.findChild("signal-name").data();
+        if (name != STOP_SIGNAL
+            && (startParameters().startMode != StartRemote
+                || name != CROSS_STOP_SIGNAL))
             initHelpers = false;
-        // Don't load helpers on stops triggered by signals unless it's
-        // an intentional trap.
-        if (initHelpers && reason == "signal-received") {
-            QByteArray name = data.findChild("signal-name").data();
-            if (name != STOP_SIGNAL
-                && (startParameters().startMode != StartRemote
-                    || name != CROSS_STOP_SIGNAL))
-                initHelpers = false;
-        }
-
-        if (initHelpers) {
-            tryLoadDebuggingHelpers();
-            QVariant var = QVariant::fromValue<GdbMi>(data);
-            postCommand(_("p 4"), CB(handleStop1), var);  // dummy
-        } else {
-            handleStop1(data);
-        }
-        return;
     }
-
-    debugMessage(_("STOPPED FOR UNKNOWN REASON: " + data.toString()));
-    // Ignore it. Will be handled with full response later in the
-    // JumpToLine or RunToFunction handlers
-#if 1
-    // FIXME: remove this special case as soon as there's a real
-    // reason given when the temporary breakpoint is hit.
-    // right now we get:
-    // 14*stopped,thread-id="1",frame={addr="0x0000000000403ce4",
-    // func="foo",args=[{name="str",value="@0x7fff0f450460"}],
-    // file="main.cpp",fullname="/tmp/g/main.cpp",line="37"}
-    //
-    // MAC yields sometimes:
-    // >3661*stopped,time={wallclock="0.00658",user="0.00142",
-    // system="0.00136",start="1218810678.805432",end="1218810678.812011"}
-    showStatusMessage(tr("Run to Function finished. Stopped."));
-    StackFrame f = parseStackFrame(data.findChild("frame"), 0);
-    gotoLocation(f, true);
-#endif
+    if (initHelpers) {
+        tryLoadDebuggingHelpers();
+        QVariant var = QVariant::fromValue<GdbMi>(data);
+        postCommand(_("p 4"), CB(handleStop1), var);  // dummy
+    } else {
+        handleStop1(data);
+    }
 }
 
 void GdbEngine::handleStop1(const GdbResponse &response)
@@ -1161,39 +1148,18 @@ void GdbEngine::handleStop1(const GdbResponse &response)
 
 void GdbEngine::handleStop1(const GdbMi &data)
 {
+    if (m_modulesListOutdated)
+        reloadModules(); // This is for display only
+    if (m_sourcesListOutdated)
+        reloadSourceFiles(); // This needs to be done before fullName() may need it
     QByteArray reason = data.findChild("reason").data();
-    if (m_modulesListOutdated) {
-        reloadModules();
-        m_modulesListOutdated = false;
-    }
-    // Need another round trip
     if (reason == "breakpoint-hit") {
         showStatusMessage(tr("Stopped at breakpoint."));
-        GdbMi frame = data.findChild("frame");
         //debugMessage(_("HIT BREAKPOINT: " + frame.toString()));
-        m_currentFrame = _(frame.findChild("addr").data() + '%' +
-             frame.findChild("func").data() + '%');
-
-        if (theDebuggerAction(ListSourceFiles)->value().toBool())
-            reloadSourceFiles();
         postCommand(_("-break-list"), CB(handleBreakList));
         QVariant var = QVariant::fromValue<GdbMi>(data);
         postCommand(_("p 2"), CB(handleStop2), var);  // dummy
     } else {
-#ifdef Q_OS_LINUX
-        // For some reason, attaching to a stopped process causes *two* stops
-        // when trying to continue (kernel 2.6.24-23-ubuntu).
-        // Interestingly enough, on MacOSX no signal is delivered at all.
-        if (reason == "signal-received"
-            && data.findChild("signal-name").data() == "SIGSTOP") {
-            GdbMi frameData = data.findChild("frame");
-            if (frameData.findChild("func").data() == "_start"
-                && frameData.findChild("from").data() == "/lib/ld-linux.so.2") {
-                continueInferiorInternal();
-                return;
-            }
-        }
-#endif
         if (reason == "signal-received"
             && theDebuggerBoolSetting(UseMessageBoxForSignals)) {
             QByteArray name = data.findChild("signal-name").data();
@@ -1229,18 +1195,10 @@ void GdbEngine::handleStop2(const GdbResponse &response)
 
 void GdbEngine::handleStop2(const GdbMi &data)
 {
-    // Sometimes we get some interesting extra information. Grab it.
     const GdbMi gdbmiFrame = data.findChild("frame");
-    GdbMi shortName = gdbmiFrame.findChild("file");
-    GdbMi fullName = gdbmiFrame.findChild("fullname");
-    if (shortName.isValid() && fullName.isValid()) {
-        QString file = QFile::decodeName(shortName.data());
-        QString full = QFile::decodeName(fullName.data());
-        if (file != full) {
-            m_shortToFullName[file] = full;
-            m_fullToShortName[full] = file;
-        }
-    }
+
+    m_currentFrame = _(gdbmiFrame.findChild("addr").data() + '%' +
+         gdbmiFrame.findChild("func").data() + '%');
 
     // Quick shot: Jump to stack frame #0.
     StackFrame frame;
@@ -1277,10 +1235,12 @@ void GdbEngine::handleShowVersion(const GdbResponse &response)
     if (response.resultClass == GdbResultDone) {
         m_gdbVersion = 100;
         m_gdbBuildVersion = -1;
+        m_isMacGdb = false;
         QString msg = QString::fromLocal8Bit(response.data.findChild("consolestreamoutput").data());
         QRegExp supported(_("GNU gdb(.*) (\\d+)\\.(\\d+)(\\.(\\d+))?(-(\\d+))?"));
         if (supported.indexIn(msg) == -1) {
             debugMessage(_("UNSUPPORTED GDB VERSION ") + msg);
+#if 0
             QStringList list = msg.split(_c('\n'));
             while (list.size() > 2)
                 list.removeLast();
@@ -1296,14 +1256,16 @@ void GdbEngine::handleShowVersion(const GdbResponse &response)
             err->showMessage(msg);
 #else
             //showMessageBox(QMessageBox::Information, tr("Warning"), msg);
+#endif
 #endif
         } else {
             m_gdbVersion = 10000 * supported.cap(2).toInt()
                          +   100 * supported.cap(3).toInt()
                          +     1 * supported.cap(5).toInt();
             m_gdbBuildVersion = supported.cap(7).toInt();
-            debugMessage(_("GDB VERSION: %1, BUILD: %2 ").arg(m_gdbVersion)
-                .arg(m_gdbBuildVersion));
+            m_isMacGdb = msg.contains(__("Apple version"));
+            debugMessage(_("GDB VERSION: %1, BUILD: %2%3").arg(m_gdbVersion)
+                .arg(m_gdbBuildVersion).arg(_(m_isMacGdb ? " (APPLE)" : "")));
         }
         //qDebug () << "VERSION 3:" << m_gdbVersion << m_gdbBuildVersion;
     }
@@ -1345,6 +1307,8 @@ QString GdbEngine::fullName(const QString &fileName)
 {
     if (fileName.isEmpty())
         return QString();
+    QTC_ASSERT(!m_sourcesListOutdated, /* */)
+    QTC_ASSERT(!m_sourcesListUpdating, /* */)
     QString full = m_shortToFullName.value(fileName, QString());
     //debugMessage(_("RESOLVING: ") + fileName + " " +  full);
     if (!full.isEmpty())
@@ -1362,21 +1326,6 @@ QString GdbEngine::fullName(const QString &fileName)
     return full;
 }
 
-QString GdbEngine::fullName(const QStringList &candidates)
-{
-    QString full;
-    foreach (const QString &fileName, candidates) {
-        full = fullName(fileName);
-        if (!full.isEmpty())
-            return full;
-    }
-    foreach (const QString &fileName, candidates) {
-        if (!fileName.isEmpty())
-            return fileName;
-    }
-    return full;
-}
-
 void GdbEngine::shutdown()
 {
     debugMessage(_("INITIATE GDBENGINE SHUTDOWN"));
@@ -1392,7 +1341,11 @@ void GdbEngine::shutdown()
         // fall-through
     case AdapterStartFailed: // Adapter "did something", but it did not help
         // FIXME set some timeout?
-        postCommand(_("-gdb-exit"), GdbEngine::ExitRequest, CB(handleGdbExit));
+        if (m_gdbProc.state() == QProcess::Running) {
+            postCommand(_("-gdb-exit"), GdbEngine::ExitRequest, CB(handleGdbExit));
+        } else {
+            setState(DebuggerNotReady);
+        }
         break;
     case InferiorRunningRequested:
     case InferiorRunning:
@@ -1541,7 +1494,8 @@ void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
 
 void GdbEngine::continueInferiorInternal()
 {
-    QTC_ASSERT(state() == InferiorStopped, qDebug() << state());
+    QTC_ASSERT(state() == InferiorStopped || state() == InferiorStarting,
+               qDebug() << state());
     setState(InferiorRunningRequested);
     postCommand(_("-exec-continue"), RunRequest, CB(handleExecContinue));
 }
@@ -1605,8 +1559,7 @@ void GdbEngine::nextExec()
 #if 1
         postCommand(_("-exec-next"), RunRequest, CB(handleExecContinue));
 #else
-        postCommand(_("tbreak %1:%2").arg(QFileInfo(lastFile).fileName())
-            .arg(lastLine + 1));
+        postCommand(_("tbreak \"%2\":%1").arg(lastLine + 1).arg(breakLocation(lastFile)));
         postCommand(_("-exec-continue"), RunRequest, CB(handleExecContinue));
 #endif
     }
@@ -1630,7 +1583,8 @@ void GdbEngine::runToLineExec(const QString &fileName, int lineNumber)
     setTokenBarrier();
     setState(InferiorRunningRequested);
     showStatusMessage(tr("Run to line %1 requested...").arg(lineNumber), 5000);
-    postCommand(_("-exec-until %1:%2").arg(fileName).arg(lineNumber));
+    postCommand(_("-exec-until \"%2\":%1").arg(lineNumber).arg(breakLocation(fileName)),
+                RunRequest, CB(handleExecContinue));
 }
 
 void GdbEngine::runToFunctionExec(const QString &functionName)
@@ -1651,12 +1605,12 @@ void GdbEngine::jumpToLineExec(const QString &fileName, int lineNumber)
     frame.file = fileName;
     frame.line = lineNumber;
 #if 1
-    // not available everywhere?
-    //sendCliCommand(_("tbreak ") + fileName + ':' + QString::number(lineNumber));
-    postCommand(_("-break-insert -t ") + fileName + _c(':') + QString::number(lineNumber));
-    postCommand(_("jump ") + fileName + _c(':') + QString::number(lineNumber));
+    QString loc = breakLocation(fileName);
+    postCommand(_("tbreak \"%2\":%1").arg(lineNumber).arg(loc));
+    setState(InferiorRunningRequested);
+    postCommand(_("jump \"%2\":%1").arg(lineNumber).arg(loc), RunRequest);
     // will produce something like
-    //  &"jump /home/apoenitz/dev/work/test1/test1.cpp:242"
+    //  &"jump \"/home/apoenitz/dev/work/test1/test1.cpp\":242"
     //  ~"Continuing at 0x4058f3."
     //  ~"run1 (argc=1, argv=0x7fffbf1f5538) at test1.cpp:242"
     //  ~"242\t x *= 2;"
@@ -1667,7 +1621,8 @@ void GdbEngine::jumpToLineExec(const QString &fileName, int lineNumber)
 #else
     gotoLocation(frame,  true);
     setBreakpoint(fileName, lineNumber);
-    postCommand(_("jump ") + fileName + ':' + QString::number(lineNumber));
+    setState(InferiorRunningRequested);
+    postCommand(_("jump ") + fileName + ':' + QString::number(lineNumber), RunRequest);
 #endif
 }
 
@@ -1724,7 +1679,7 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
     data->bpMultiple = false;
     data->bpEnabled = true;
     data->bpCondition.clear();
-    QStringList files;
+    QByteArray file, fullName;
     foreach (const GdbMi &child, bkpt.children()) {
         if (child.hasName("number")) {
             data->bpNumber = _(child.data());
@@ -1738,13 +1693,9 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
             else
                 data->bpAddress = _(child.data());
         } else if (child.hasName("file")) {
-            files.append(QFile::decodeName(child.data()));
+            file = child.data();
         } else if (child.hasName("fullname")) {
-            QString fullName = QFile::decodeName(child.data());
-            #ifdef Q_OS_WIN
-            fullName = QDir::cleanPath(fullName);
-            #endif
-            files.prepend(fullName);
+            fullName = child.data();
         } else if (child.hasName("line")) {
             data->bpLineNumber = _(child.data());
             if (child.data().toInt())
@@ -1758,17 +1709,8 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
             data->bpEnabled = (child.data() == "y");
         } else if (child.hasName("pending")) {
             data->pending = true;
-            int pos = child.data().lastIndexOf(':');
-            if (pos > 0) {
-                data->bpLineNumber = _(child.data().mid(pos + 1));
-                data->markerLineNumber = child.data().mid(pos + 1).toInt();
-                QString file = QString::fromLocal8Bit(child.data().left(pos));
-                if (file.startsWith(_c('"')) && file.endsWith(_c('"')))
-                    file = file.mid(1, file.size() - 2);
-                files.prepend(file);
-            } else {
-                files.prepend(QString::fromLocal8Bit(child.data()));
-            }
+            // Any content here would be interesting only if we did accept
+            // spontaneously appearing breakpoints (user using gdb commands).
         } else if (child.hasName("at")) {
             // Happens with (e.g.?) gdb 6.4 symbianelf
             QByteArray ba = child.data();
@@ -1782,11 +1724,30 @@ void GdbEngine::breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt
     //else if (child.hasName("ignore"))
     //    data->bpIgnoreCount = child.data();
 
-    QString name = fullName(files);
-    if (data->bpFileName.isEmpty())
-        data->bpFileName = name;
-    if (data->markerFileName.isEmpty())
-        data->markerFileName = name;
+    QString name;
+    if (!fullName.isEmpty()) {
+        name = QFile::decodeName(fullName);
+        #ifdef Q_OS_WIN
+        name = QDir::cleanPath(name);
+        #endif
+        if (data->markerFileName.isEmpty())
+            data->markerFileName = name;
+    } else {
+        name = QFile::decodeName(file);
+        // Use fullName() once we have a mapping which is more complete than gdb's own ...
+        // No point in assigning markerFileName for now.
+    }
+    data->bpFileName = name;
+}
+
+QString GdbEngine::breakLocation(const QString &file) const
+{
+    QTC_ASSERT(!m_sourcesListOutdated, /* */)
+    QTC_ASSERT(!m_sourcesListUpdating, /* */)
+    QString where = m_fullToShortName.value(file);
+    if (where.isEmpty())
+        return QFileInfo(file).fileName();
+    return where;
 }
 
 void GdbEngine::sendInsertBreakpoint(int index)
@@ -1794,37 +1755,25 @@ void GdbEngine::sendInsertBreakpoint(int index)
     const BreakpointData *data = manager()->breakHandler()->at(index);
     QString where;
     if (data->funcName.isEmpty()) {
-        if (data->useFullPath) {
-            where = data->fileName;
-        } else {
-            QFileInfo fi(data->fileName);
-            where = fi.fileName();
-        }
+        where = data->useFullPath ? data->fileName : breakLocation(data->fileName);
         // The argument is simply a C-quoted version of the argument to the
         // non-MI "break" command, including the "original" quoting it wants.
-        where = _("\"\\\"%1\\\":%2\"")
-            .arg(GdbMi::escapeCString(where)).arg(data->lineNumber);
+        where = _("\"\\\"%2\\\":%1\"").arg(data->lineNumber).arg(GdbMi::escapeCString(where));
     } else {
         where = data->funcName;
     }
 
     // set up fallback in case of pending breakpoints which aren't handled
     // by the MI interface
-#if defined(Q_OS_WIN)
-    QString cmd = _("-break-insert ");
-    //if (!data->condition.isEmpty())
-    //    cmd += "-c " + data->condition + " ";
-#elif defined(Q_OS_MAC)
-    QString cmd = _("-break-insert -l -1 ");
-    //if (!data->condition.isEmpty())
-    //    cmd += "-c " + data->condition + " ";
-#else
-    QString cmd = _("-break-insert -f ");
-    if (m_gdbAdapter->isTrkAdapter())
+    QString cmd;
+    if (m_isMacGdb)
+        cmd = _("-break-insert -l -1 -f ");
+    else if (m_gdbVersion >= 60800) // Probably some earlier version would work as well ...
+        cmd = _("-break-insert -f ");
+    else
         cmd = _("-break-insert ");
     //if (!data->condition.isEmpty())
-    //    cmd += _("-c ") + data->condition + ' ';
-#endif
+    //    cmd += _("-c ") + data->condition + _c(' ');
     cmd += where;
     gdbOutputAvailable(LogStatus, _("Current state: %1").arg(state()));
     postCommand(cmd, NeedsStop, CB(handleBreakInsert), index);
@@ -1947,20 +1896,11 @@ void GdbEngine::handleBreakInsert(const GdbResponse &response)
         attemptBreakpointSynchronization();
         handler->updateMarkers();
     } else {
-        const BreakpointData *data = handler->at(index);
-        // Note that it is perfectly correct that the file name is put
-        // in quotes but not escaped. GDB simply is like that.
-#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
-        QFileInfo fi(data->fileName);
-        QString where = _c('"') + fi.fileName() + _("\":")
-            + data->lineNumber;
-#else
-        QString where = _c('"') + data->fileName + _("\":")
-            + data->lineNumber;
-        // Should not happen with -break-insert -f. gdb older than 6.8?
-        QTC_ASSERT(false, /**/);
-#endif
-        postCommand(_("break ") + where, CB(handleBreakInsert1), index);
+        if (m_gdbVersion < 60800 && !m_isMacGdb) {
+            // This gdb version doesn't "do" pending breakpoints.
+        } else {
+            QTC_ASSERT(false, /**/);
+        }
     }
 }
 
@@ -2041,8 +1981,32 @@ void GdbEngine::handleBreakInsert1(const GdbResponse &response)
     handler->updateMarkers();
 }
 
+void GdbEngine::attemptBreakpointSynchronization2(const GdbResponse &)
+{
+    attemptBreakpointSynchronization();
+}
+
 void GdbEngine::attemptBreakpointSynchronization()
 {
+    switch (state()) {
+    case InferiorStarting:
+    case InferiorRunningRequested:
+    case InferiorRunning:
+    case InferiorStopping:
+    case InferiorStopped:
+        break;
+    default:
+        //qDebug() << "attempted breakpoint sync in state" << state();
+        return;
+    }
+
+    // For best results, we rely on an up-to-date fullname mapping.
+    if (m_sourcesListOutdated) {
+        reloadSourceFiles();
+        postCommand(_("p 5"), CB(attemptBreakpointSynchronization2));
+        return;
+    }
+
     BreakHandler *handler = manager()->breakHandler();
 
     foreach (BreakpointData *data, handler->takeDisabledBreakpoints()) {
@@ -2095,15 +2059,6 @@ void GdbEngine::attemptBreakpointSynchronization()
             }
         }
     }
-
-    for (int index = 0; index != handler->size(); ++index) {
-        // happens sometimes on Mac. Brush over symptoms
-        BreakpointData *data = handler->at(index);
-        if (data->markerFileName.startsWith(__("../"))) {
-            data->markerFileName = fullName(data->markerFileName);
-            handler->updateMarkers();
-        }
-    }
 }
 
 
@@ -2162,6 +2117,7 @@ QList<Symbol> GdbEngine::moduleSymbols(const QString &moduleName)
 
 void GdbEngine::reloadModules()
 {
+    m_modulesListOutdated = false;
     postCommand(_("info shared"), CB(handleModulesList));
 }
 
@@ -2175,15 +2131,21 @@ void GdbEngine::handleModulesList(const GdbResponse &response)
         QTextStream ts(&data, QIODevice::ReadOnly);
         while (!ts.atEnd()) {
             QString line = ts.readLine();
-            if (!line.startsWith(__("0x")))
-                continue;
             Module module;
             QString symbolsRead;
             QTextStream ts(&line, QIODevice::ReadOnly);
-            ts >> module.startAddress >> module.endAddress >> symbolsRead;
-            module.moduleName = ts.readLine().trimmed();
-            module.symbolsRead = (symbolsRead == __("Yes"));
-            modules.append(module);
+            if (line.startsWith(__("0x"))) {
+                ts >> module.startAddress >> module.endAddress >> symbolsRead;
+                module.moduleName = ts.readLine().trimmed();
+                module.symbolsRead = (symbolsRead == __("Yes"));
+                modules.append(module);
+            } else if (line.trimmed().startsWith(__("No"))) {
+                // gdb 6.4 symbianelf
+                ts >> symbolsRead;
+                QTC_ASSERT(symbolsRead == __("No"), continue);
+                module.moduleName = ts.readLine().trimmed();
+                modules.append(module);
+            }
         }
         if (modules.isEmpty()) {
             // Mac has^done,shlib-info={num="1",name="dyld",kind="-",
@@ -2214,7 +2176,9 @@ void GdbEngine::handleModulesList(const GdbResponse &response)
 
 void GdbEngine::reloadSourceFiles()
 {
-    postCommand(_("-file-list-exec-source-files"), CB(handleQuerySources));
+    m_sourcesListUpdating = true;
+    m_sourcesListOutdated = false;
+    postCommand(_("-file-list-exec-source-files"), NeedsStop, CB(handleQuerySources));
 }
 
 
@@ -2274,12 +2238,11 @@ void GdbEngine::reloadStack(bool forceGotoLocation)
 StackFrame GdbEngine::parseStackFrame(const GdbMi &frameMi, int level)
 {
     //qDebug() << "HANDLING FRAME:" << frameMi.toString();
-    QStringList files;
-    files.append(QFile::decodeName(frameMi.findChild("fullname").data()));
-    files.append(QFile::decodeName(frameMi.findChild("file").data()));
     StackFrame frame;
     frame.level = level;
-    frame.file = fullName(files);
+    // We might want to fall back to "file" once we have a mapping which
+    // is more complete than gdb's own ...
+    frame.file = QFile::decodeName(frameMi.findChild("fullname").data());
     frame.function = _(frameMi.findChild("func").data());
     frame.from = _(frameMi.findChild("from").data());
     frame.line = frameMi.findChild("line").data().toInt();
@@ -2289,11 +2252,7 @@ StackFrame GdbEngine::parseStackFrame(const GdbMi &frameMi, int level)
 
 void GdbEngine::handleStackListFrames(const GdbResponse &response)
 {
-    #if defined(Q_OS_MAC)
-    bool handleIt = true;
-    #else
-    bool handleIt = response.resultClass == GdbResultDone;
-    #endif
+    bool handleIt = (m_isMacGdb || response.resultClass == GdbResultDone);
     if (!handleIt) {
         // That always happens on symbian gdb with
         // ^error,data={msg="Previous frame identical to this frame (corrupt stack?)"
@@ -2328,7 +2287,10 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response)
 
         // Immediately leave bogus frames.
         if (targetFrame == -1 && isBogus) {
-            postCommand(_("-exec-finish"));
+            setTokenBarrier();
+            setState(InferiorRunningRequested);
+            postCommand(_("-exec-finish"), RunRequest, CB(handleExecContinue));
+            showStatusMessage(tr("Jumping out of bogus frame..."), 1000);
             return;
         }
         #endif
@@ -2361,15 +2323,11 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response)
     if (targetFrame == -1)
         targetFrame = 0;
 
-    #ifdef Q_OS_MAC
     // Mac gdb does not add the location to the "stopped" message,
     // so the early gotoLocation() was not triggered. Force it here.
-    bool jump = true;
-    #else
     // For targetFrame == 0 we already issued a 'gotoLocation'
     // when reading the *stopped message.
-    bool jump = targetFrame != 0;
-    #endif
+    bool jump = (m_isMacGdb || targetFrame != 0);
   
     manager()->stackHandler()->setCurrentIndex(targetFrame);
     if (jump || cookie.gotoLocation) {
@@ -2510,12 +2468,9 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response)
 
 bool GdbEngine::supportsThreads() const
 {
-#ifdef Q_OS_MAC
-    return true;
-#endif
     // FSF gdb 6.3 crashes happily on -thread-list-ids. So don't use it.
     // The test below is a semi-random pick, 6.8 works fine
-    return m_gdbVersion > 60500;
+    return m_isMacGdb || m_gdbVersion > 60500;
 }
 
 
@@ -3458,7 +3413,7 @@ void GdbEngine::handleStackFrame1(const GdbResponse &response)
         //qDebug() << "FIRST CHUNK: " << out;
         m_firstChunk = out;
     } else {
-        QTC_ASSERT(false, /**/);
+        QTC_ASSERT(false, qDebug() << response.toString());
     }
 }
 
@@ -3578,16 +3533,17 @@ WatchData GdbEngine::localVariable(const GdbMi &item,
     // numchild="1",type="const QtSharedPointer::Basic<CPlusPlus::..."}}
     // We do not want these at all. Current hypotheses is that those
     // "spurious" locals have _two_ "exp" field. Try to filter them:
-#ifdef Q_OS_MAC
-    int numExps = 0;
-    foreach (const GdbMi &child, item.children())
-        numExps += int(child.name() == "exp");
-    if (numExps > 1)
-        return WatchData();
-    QByteArray name = item.findChild("exp").data();
-#else
-    QByteArray name = item.findChild("name").data();
-#endif
+    QByteArray name;
+    if (m_isMacGdb) {
+        int numExps = 0;
+        foreach (const GdbMi &child, item.children())
+            numExps += int(child.name() == "exp");
+        if (numExps > 1)
+            return WatchData();
+        name = item.findChild("exp").data();
+    } else {
+        name = item.findChild("name").data();
+    }
     const QMap<QByteArray, int>::iterator it  = seen->find(name);
     if (it != seen->end()) {
         const int n = it.value();
@@ -3886,10 +3842,8 @@ void GdbEngine::tryLoadDebuggingHelpers()
                 + _("\", " STRINGIFY(RTLD_NOW) ")"),
         CB(handleDebuggingHelperSetup));
     //postCommand(_("sharedlibrary ") + dotEscape(dlopenLib));
-    m_debuggingHelperState = DebuggingHelperLoadTried;
 #else
     //postCommand(_("p dlopen"));
-    QString flag = QString::number(RTLD_NOW);
     postCommand(_("sharedlibrary libc")); // for malloc
     postCommand(_("sharedlibrary libdl")); // for dlopen
     postCommand(_("call (void*)dlopen(\"") + GdbMi::escapeCString(dlopenLib)
@@ -4080,14 +4034,14 @@ QString GdbEngine::parseDisassembler(const GdbMi &lines)
     foreach (const GdbMi &child, lines.children()) {
         if (child.hasName("src_and_asm_line")) {
             // mixed mode
-            int line = child.findChild("line").data().toInt();
-            QString fileName = QFile::decodeName(child.findChild("file").data());
             if (!fileLoaded) {
+                QString fileName = QFile::decodeName(child.findChild("file").data());
                 QFile file(fullName(fileName));
                 file.open(QIODevice::ReadOnly);
                 fileContents = file.readAll().split('\n');
                 fileLoaded = true;
             }
+            int line = child.findChild("line").data().toInt();
             if (line >= 0 && line < fileContents.size())
                 ba += "    " + fileContents.at(line) + '\n';
             GdbMi insn = child.findChild("line_asm_insn");
@@ -4174,7 +4128,7 @@ void GdbEngine::gotoLocation(const StackFrame &frame, bool setMarker)
 // Starting up & shutting down
 //
 
-bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
+bool GdbEngine::startGdb(const QStringList &args, const QString &gdb, const QString &settingsIdHint)
 {
     debugMessage(_("STARTING GDB ") + gdb);
 
@@ -4190,7 +4144,8 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
     m_gdbProc.start(location, gdbArgs);
 
     if (!m_gdbProc.waitForStarted()) {
-        handleAdapterStartFailed(m_gdbProc.errorString());
+        const QString msg = tr("Unable to start gdb '%1': %2").arg(gdb, m_gdbProc.errorString());
+        handleAdapterStartFailed(msg, settingsIdHint);
         return false;
     }
 
@@ -4241,7 +4196,6 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
     //  /build/buildd/gdb-6.8/gdb/valops.c:2069: internal-error:
     postCommand(_("set overload-resolution off"));
     //postCommand(_("set demangle-style none"));
-
     // From the docs:
     //  Stop means reenter debugger if this signal happens (implies print).
     //  Print means print a message if this signal happens.
@@ -4261,9 +4215,9 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
     postCommand(_("set width 0"));
     postCommand(_("set height 0"));
 
-    #ifdef Q_OS_MAC
-    postCommand(_("-gdb-set inferior-auto-start-cfm off"));
-    postCommand(_("-gdb-set sharedLibrary load-rules "
+    if (m_isMacGdb) {
+        postCommand(_("-gdb-set inferior-auto-start-cfm off"));
+        postCommand(_("-gdb-set sharedLibrary load-rules "
             "dyld \".*libSystem.*\" all "
             "dyld \".*libauto.*\" all "
             "dyld \".*AppKit.*\" all "
@@ -4272,7 +4226,7 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb)
             "dyld \".*CFDataFormatters.*\" all "
             "dyld \".*libobjc.*\" all "
             "dyld \".*CarbonDataFormatters.*\" all"));
-    #endif
+    }
 
     QString scriptFileName = theDebuggerStringSetting(GdbScriptFile);
     if (!scriptFileName.isEmpty()) {
@@ -4313,6 +4267,8 @@ void GdbEngine::handleGdbError(QProcess::ProcessError error)
 void GdbEngine::handleGdbFinished(int code, QProcess::ExitStatus type)
 {
     debugMessage(_("GDB PROCESS FINISHED, status %1, code %2").arg(type).arg(code));
+    if (!m_gdbAdapter)
+        return;
     if (state() == EngineShuttingDown) {
         m_gdbAdapter->shutdown();
     } else if (state() != AdapterStartFailed) {
@@ -4330,9 +4286,14 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &sett
 {
     setState(AdapterStartFailed);
     debugMessage(_("ADAPTER START FAILED"));
-    Core::ICore::instance()->showWarningWithOptions(
-            tr("Adapter start failed"), msg, QString(),
-            _(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY), settingsIdHint);
+    const QString title = tr("Adapter start failed");
+    if (settingsIdHint.isEmpty()) {
+        Core::ICore::instance()->showWarningWithOptions(title, msg);
+    } else {
+        Core::ICore::instance()->showWarningWithOptions(title, msg, QString(),
+                    _(Debugger::Constants::DEBUGGER_SETTINGS_CATEGORY),
+                    settingsIdHint);
+    }
     shutdown();
 }
 
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index a891a557472fe80b30fa780b10eec5cbd9f1348f..786ac7696a66937d82c9cf78a76e28f8d847c69b 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -126,7 +126,9 @@ private: ////////// Gdb Process Management //////////
 
     AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp);
     void connectAdapter();
-    bool startGdb(const QStringList &args = QStringList(), const QString &gdb = QString());
+    bool startGdb(const QStringList &args = QStringList(),
+                  const QString &gdb = QString(),
+                  const QString &settingsIdHint = QString());
     void startInferiorPhase2();
 
     void handleInferiorShutdown(const GdbResponse &response);
@@ -246,7 +248,7 @@ private: ////////// Gdb Output, State & Capability Handling //////////
 
     void handleResponse(const QByteArray &buff);
     void handleStopResponse(const GdbMi &data);
-    void handleResultRecord(const GdbResponse &response);
+    void handleResultRecord(GdbResponse *response);
     void handleStop1(const GdbResponse &response);
     void handleStop1(const GdbMi &data);
     void handleStop2(const GdbResponse &response);
@@ -260,13 +262,16 @@ private: ////////// Gdb Output, State & Capability Handling //////////
     void handleShowVersion(const GdbResponse &response);
     void handleIsSynchroneous(const GdbResponse &response);
 
-    int m_gdbVersion; // 6.8.0 is 680
+    int m_gdbVersion; // 6.8.0 is 60800
     int m_gdbBuildVersion; // MAC only?
+    bool m_isMacGdb;
     bool m_isSynchroneous; // Can act synchroneously?
 
 private: ////////// Inferior Management //////////
 
+    // This should be always the last call in a function.
     Q_SLOT virtual void attemptBreakpointSynchronization();
+    void attemptBreakpointSynchronization2(const GdbResponse &);
 
     virtual void stepExec();
     virtual void stepOutExec();
@@ -310,6 +315,7 @@ private: ////////// View & Data Stuff //////////
     void extractDataFromInfoBreak(const QString &output, BreakpointData *data);
     void breakpointDataFromOutput(BreakpointData *data, const GdbMi &bkpt);
     void sendInsertBreakpoint(int index);
+    QString breakLocation(const QString &file) const;
 
     //
     // Modules specific stuff
@@ -349,13 +355,14 @@ private: ////////// View & Data Stuff //////////
     void handleQuerySources(const GdbResponse &response);
 
     QString fullName(const QString &fileName);
-    // get one usable name out of these, try full names first
-    QString fullName(const QStringList &candidates);
 
     // awful hack to keep track of used files
     QMap<QString, QString> m_shortToFullName;
     QMap<QString, QString> m_fullToShortName;
 
+    bool m_sourcesListOutdated;
+    bool m_sourcesListUpdating;
+
     //
     // Stack specific stuff
     //
diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp
index 226bfb7283a0ce1ab3c6c45b0e7a144e86da0ecc..b030e44977f0abe3bba41ea6b6f8e19e7eb2118a 100644
--- a/src/plugins/debugger/gdb/gdboptionspage.cpp
+++ b/src/plugins/debugger/gdb/gdboptionspage.cpp
@@ -51,6 +51,9 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent)
     m_group.insert(theDebuggerAction(GdbEnvironment),
         m_ui.environmentEdit);
 
+#if 1
+    m_ui.groupBoxPluginDebugging->hide();
+#else // The related code (handleAqcuiredInferior()) is disabled as well.
     m_group.insert(theDebuggerAction(AllPluginBreakpoints),
         m_ui.radioButtonAllPluginBreakpoints);
     m_group.insert(theDebuggerAction(SelectedPluginBreakpoints),
@@ -59,6 +62,7 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent)
         m_ui.radioButtonNoPluginBreakpoints);
     m_group.insert(theDebuggerAction(SelectedPluginBreakpointsPattern),
         m_ui.lineEditSelectedPluginBreakpointsPattern);
+#endif
 
     m_ui.lineEditSelectedPluginBreakpointsPattern->
         setEnabled(theDebuggerAction(SelectedPluginBreakpoints)->value().toBool());
diff --git a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8dcfa4b9042a9a3d0cb5d417943a354d9279ee42
--- /dev/null
+++ b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.cpp
@@ -0,0 +1,52 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "s60debuggerbluetoothstarter.h"
+#include "bluetoothlistener.h"
+#include "debuggermanager.h"
+
+namespace Debugger {
+namespace Internal {
+
+S60DebuggerBluetoothStarter::S60DebuggerBluetoothStarter(const  TrkDevicePtr& trkDevice, QObject *parent) :
+    trk::AbstractBluetoothStarter(trkDevice, parent)
+{
+}
+
+trk::BluetoothListener *S60DebuggerBluetoothStarter::createListener()
+{
+    DebuggerManager *dm = DebuggerManager::instance();
+    trk::BluetoothListener *rc = new trk::BluetoothListener(dm);
+    rc->setMode(trk::BluetoothListener::Listen);
+    connect(rc, SIGNAL(message(QString)), dm, SLOT(showDebuggerOutput(QString)));
+    return rc;
+}
+
+} // namespace Internal
+} // namespace Debugger
diff --git a/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h
new file mode 100644
index 0000000000000000000000000000000000000000..226e00072ac4af1403bf411162cf70a28df2d537
--- /dev/null
+++ b/src/plugins/debugger/gdb/s60debuggerbluetoothstarter.h
@@ -0,0 +1,55 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef S60DEBUGGERBLUETOOTHSTARTER_H
+#define S60DEBUGGERBLUETOOTHSTARTER_H
+
+#include "communicationstarter.h"
+
+namespace Debugger {
+namespace Internal {
+
+/* S60DebuggerBluetoothStarter: Creates a listener in 'Listen' mode
+ * parented on the Debugger manager which outputs to the debugger window.
+ * Note: This is a "last resort" starter, normally, the run configuration
+ * should have already started a listener. */
+
+class S60DebuggerBluetoothStarter : public trk::AbstractBluetoothStarter
+{
+public:
+    explicit S60DebuggerBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0);
+
+protected:
+    virtual trk::BluetoothListener *createListener();
+};
+
+} // namespace Internal
+} // namespace Debugger
+
+#endif // S60DEBUGGERBLUETOOTHSTARTER_H
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index c62a31b9678dfd0f6872c2553a378cd11e3f82f8..e954396c30aeb00ad7860778c229eecf570e332b 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -30,6 +30,8 @@
 #include "trkgdbadapter.h"
 #include "trkoptions.h"
 #include "trkoptionspage.h"
+#include "s60debuggerbluetoothstarter.h"
+#include "bluetoothlistener_gui.h"
 
 #include "debuggerstringutils.h"
 #ifndef STANDALONE_RUNNER
@@ -191,11 +193,12 @@ void Snapshot::insertMemory(const MemoryRange &range, const QByteArray &ba)
 TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     AbstractGdbAdapter(engine),
     m_options(options),
+    m_overrideTrkDeviceType(-1),
     m_running(false),
+    m_trkDevice(new trk::TrkDevice),
     m_gdbAckMode(true),
     m_verbose(2),
-    m_bufferedMemoryRead(true),
-    m_waitCount(0)
+    m_bufferedMemoryRead(true)
 {
     m_gdbServer = 0;
     m_gdbConnection = 0;
@@ -206,28 +209,15 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
 #endif
     m_gdbServerName = _("127.0.0.1:%1").arg(2222 + portOffset);
 
-    connect(&m_rfcommProc, SIGNAL(readyReadStandardError()),
-        this, SLOT(handleRfcommReadyReadStandardError()));
-    connect(&m_rfcommProc, SIGNAL(readyReadStandardOutput()),
-        this, SLOT(handleRfcommReadyReadStandardOutput()));
-    connect(&m_rfcommProc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleRfcommError(QProcess::ProcessError)));
-    connect(&m_rfcommProc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleRfcommFinished(int, QProcess::ExitStatus)));
-    connect(&m_rfcommProc, SIGNAL(started()),
-        this, SLOT(handleRfcommStarted()));
-    connect(&m_rfcommProc, SIGNAL(stateChanged(QProcess::ProcessState)),
-        this, SLOT(handleRfcommStateChanged(QProcess::ProcessState)));
-
-    connect(&m_trkDevice, SIGNAL(messageReceived(trk::TrkResult)),
+    connect(m_trkDevice.data(), SIGNAL(messageReceived(trk::TrkResult)),
         this, SLOT(handleTrkResult(trk::TrkResult)));
-    connect(&m_trkDevice, SIGNAL(error(QString)),
+    connect(m_trkDevice.data(), SIGNAL(error(QString)),
         this, SLOT(handleTrkError(QString)));
 
-    m_trkDevice.setVerbose(m_verbose);
-    m_trkDevice.setSerialFrame(m_options->mode != TrkOptions::BlueTooth);
+    m_trkDevice->setVerbose(m_verbose);
+    m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
 
-    connect(&m_trkDevice, SIGNAL(logMessage(QString)),
+    connect(m_trkDevice.data(), SIGNAL(logMessage(QString)),
         this, SLOT(trkLogMessage(QString)));
 }
 
@@ -237,16 +227,6 @@ TrkGdbAdapter::~TrkGdbAdapter()
     logMessage("Shutting down.\n");
 }
 
-QString TrkGdbAdapter::overrideTrkDevice() const
-{
-    return m_overrideTrkDevice;
-}
-
-void TrkGdbAdapter::setOverrideTrkDevice(const QString &d)
-{
-    m_overrideTrkDevice = d;
-}
-
 QString TrkGdbAdapter::effectiveTrkDevice() const
 {
     if (!m_overrideTrkDevice.isEmpty())
@@ -256,6 +236,13 @@ QString TrkGdbAdapter::effectiveTrkDevice() const
     return m_options->serialPort;
 }
 
+int TrkGdbAdapter::effectiveTrkDeviceType() const
+{
+    if (m_overrideTrkDeviceType >= 0)
+        return m_overrideTrkDeviceType;
+    return m_options->mode;
+}
+
 void TrkGdbAdapter::trkLogMessage(const QString &msg)
 {
     logMessage("TRK " + msg);
@@ -389,44 +376,6 @@ void TrkGdbAdapter::slotEmitDelayedInferiorStartFailed()
     emit inferiorStartFailed(m_adapterFailMessage);
 }
 
-void TrkGdbAdapter::waitForTrkConnect()
-{
-    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
-    QString errorMessage;
-    const QString device = effectiveTrkDevice();
-    if (!m_trkDevice.open(device, &errorMessage)) {
-        logMessage(_("Waiting on %1 (%2)").arg(device, errorMessage));
-        if (errorMessage.contains(_("ermission denied"))) {
-            static int direction = 0;
-            direction = (direction + 1) % 4;
-            showStatusMessage(_("Please start TRK on your device! %1")
-                .arg(QChar("/-\\|"[direction])));
-        }
-        // Do not loop forever
-        if (m_waitCount++ < (m_options->mode == TrkOptions::BlueTooth ? 60 : 5)) {
-            QTimer::singleShot(1000, this, SLOT(waitForTrkConnect()));
-        } else {
-            QString msg = _("Failed to connect to %1 after "
-                "%2 attempts").arg(device).arg(m_waitCount);
-            logMessage(msg);
-            emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
-        }
-        return;
-    }
-
-    m_trkDevice.sendTrkInitialPing();
-    sendTrkMessage(0x02); // Disconnect, as trk might be still connected
-    sendTrkMessage(0x01); // Connect
-    sendTrkMessage(0x05, TrkCB(handleSupportMask));
-    sendTrkMessage(0x06, TrkCB(handleCpuType));
-    sendTrkMessage(0x04, TrkCB(handleTrkVersions)); // Versions
-    //sendTrkMessage(0x09); // Unrecognized command
-    //sendTrkMessage(0x4a, 0,
-    //    "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File
-    //sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File
-
-    emit adapterStarted();
-}
 
 void TrkGdbAdapter::logMessage(const QString &msg)
 {
@@ -802,10 +751,29 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd)
     }
 
     else if (cmd == "qfDllInfo") {
-        // happens with  gdb 6.4.50.20060226-cvs / CodeSourcery
-        // never made it into FSF gdb?
+        // That's the _first_ query package.
+        // Happens with  gdb 6.4.50.20060226-cvs / CodeSourcery.
+        // Never made it into FSF gdb that got qXfer:libraries:read instead.
+        // http://sourceware.org/ml/gdb/2007-05/msg00038.html
+        // Name=hexname,TextSeg=textaddr[,DataSeg=dataaddr]
         sendGdbServerAck();
-        sendGdbServerMessage("", "FIXME: nothing?");
+        QByteArray response = "m";
+        // FIXME: Limit packet length by using qsDllInfo packages?
+        for (int i = 0; i != m_session.libraries.size(); ++i) {
+            if (i)
+                response += ';';
+            const Library &lib = m_session.libraries.at(i);
+            response += "Name=" + lib.name.toHex()
+                + ",TextSeg=" + hexNumber(lib.codeseg)
+                + ",DataSeg=" + hexNumber(lib.dataseg);
+        }
+        sendGdbServerMessage(response, "library information transfered");
+    }
+
+    else if (cmd == "qsDllInfo") {
+        // That's a following query package
+        sendGdbServerAck();
+        sendGdbServerMessage("l", "library information transfer finished");
     }
 
     else if (cmd == "qPacketInfo") {
@@ -964,13 +932,13 @@ i        */
 void TrkGdbAdapter::sendTrkMessage(byte code, TrkCallback callback,
     const QByteArray &data, const QVariant &cookie)
 {
-    m_trkDevice.sendTrkMessage(code, callback, data, cookie);
+    m_trkDevice->sendTrkMessage(code, callback, data, cookie);
 }
 
 void TrkGdbAdapter::sendTrkAck(byte token)
 {
     //logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN %1").arg(int(token)));
-    m_trkDevice.sendTrkAck(token);
+    m_trkDevice->sendTrkAck(token);
 }
 
 void TrkGdbAdapter::handleTrkError(const QString &msg)
@@ -1069,7 +1037,10 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
             // With CS gdb 6.4 we get a non-standard $qfDllInfo#7f+ request
             // afterwards, so don't use it for now.
             //sendGdbServerMessage("T05library:;");
-            sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
+            sendGdbServerMessage("T05load:Name=" + lib.name.toHex()
+                + ",TextSeg=" + hexNumber(lib.codeseg)
+                + ",DataSeg=" + hexNumber(lib.dataseg) + ';');
+            //sendTrkMessage(0x18, TrkCallback(), trkContinueMessage(), "CONTINUE");
             break;
         }
         case 0xa1: { // NotifyDeleted
@@ -1475,7 +1446,7 @@ void TrkGdbAdapter::handleSupportMask(const TrkResult &result)
     logMessage("SUPPORTED: " + str);
  }
 
-void TrkGdbAdapter::handleTrkVersions(const TrkResult &result)
+void TrkGdbAdapter::handleTrkVersionsStartGdb(const TrkResult &result)
 {
     QString logMsg;
     QTextStream str(&logMsg);
@@ -1487,6 +1458,13 @@ void TrkGdbAdapter::handleTrkVersions(const TrkResult &result)
              << '.' << int(result.data.at(4));
     }
     logMessage(logMsg);
+    QStringList gdbArgs;
+    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
+    if (!m_engine->startGdb(gdbArgs, m_options->gdb, TrkOptionsPage::settingsId())) {
+        cleanup();
+        return;
+    }
+    emit adapterStarted();
 }
 
 void TrkGdbAdapter::handleDisconnect(const TrkResult & /*result*/)
@@ -1510,8 +1488,6 @@ void TrkGdbAdapter::readMemory(uint addr, uint len, bool buffered)
 
 void TrkGdbAdapter::interruptInferior()
 {
-    QTC_ASSERT(state() == AdapterStarted, qDebug() << state());
-    logMessage("TRYING TO INTERRUPT INFERIOR");
     sendTrkMessage(0x1a, TrkCallback(), trkInterruptMessage(), "Interrupting...");
 }
 
@@ -1519,7 +1495,8 @@ void TrkGdbAdapter::startAdapter()
 {
     // Retrieve parameters
     const DebuggerStartParameters &parameters = startParameters();
-    setOverrideTrkDevice(parameters.remoteChannel);
+    m_overrideTrkDevice = parameters.remoteChannel;
+    m_overrideTrkDeviceType = parameters.remoteChannelType;
     m_remoteExecutable = parameters.executable;
     m_symbolFile = parameters.symbolFileName;
     // FIXME: testing hack, remove!
@@ -1534,29 +1511,32 @@ void TrkGdbAdapter::startAdapter()
     setState(AdapterStarting);
     debugMessage(_("TRYING TO START ADAPTER"));
     logMessage(QLatin1String("### Starting TrkGdbAdapter"));
-    if (m_options->mode == TrkOptions::BlueTooth) {
-        const QString device = effectiveTrkDevice();
-        const QString blueToothListener = QLatin1String("rfcomm");
-        QStringList blueToothListenerArguments;
-        blueToothListenerArguments.append(_("-r"));
-        blueToothListenerArguments.append(_("listen"));
-        blueToothListenerArguments.append(m_options->blueToothDevice);
-        blueToothListenerArguments.append(_("1"));
-        logMessage(_("### Starting BlueTooth listener %1 on %2: %3 %4")
-            .arg(blueToothListener).arg(device).arg(blueToothListener)
-            .arg(blueToothListenerArguments.join(" ")));
-        m_rfcommProc.start(blueToothListener, blueToothListenerArguments);
-        m_rfcommProc.waitForStarted();
-        if (m_rfcommProc.state() != QProcess::Running) {
-            QString msg = _("Failed to start BlueTooth "
-                "listener %1 on %2: %3\n");
-            msg = msg.arg(blueToothListener, device, m_rfcommProc.errorString());
-            msg += QString::fromLocal8Bit(m_rfcommProc.readAllStandardError());
-            emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
+    m_trkDevice->setSerialFrame(effectiveTrkDeviceType() != TrkOptions::BlueTooth);
+    // Prompt the user for a bluetooth connection
+    const QString device = effectiveTrkDevice();
+    QString message;    
+    if (effectiveTrkDeviceType() == TrkOptions::BlueTooth) {
+        S60DebuggerBluetoothStarter starter(m_trkDevice);
+        starter.setDevice(device);
+        const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, 0, &message);
+        switch (src) {
+        case trk::BluetoothGuiConnected:
+            break;
+        case trk::BluetoothGuiCanceled:
+            emit adapterStartFailed(message, QString());
+            return;
+        case trk::BluetoothGuiError:
+            emit adapterStartFailed(message, TrkOptionsPage::settingsId());
+            return;
+        };
+    } else {
+        if (!m_trkDevice->isOpen() && !m_trkDevice->open(device, &message)) {
+            message = tr("Failed to connect to %1: %2\nCheck whether TRK is running.").arg(device).arg(message);
+            logMessage(message);
+            emit adapterStartFailed(message, TrkOptionsPage::settingsId());
             return;
         }
     }
-    m_waitCount = 0;
 
     QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer);
     QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0);
@@ -1576,14 +1556,12 @@ void TrkGdbAdapter::startAdapter()
     connect(m_gdbServer, SIGNAL(newConnection()),
         this, SLOT(handleGdbConnection()));
 
-    QStringList gdbArgs;
-    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
-    if (!m_engine->startGdb(gdbArgs, m_options->gdb)) {
-        cleanup();
-        return;
-    }
-
-    waitForTrkConnect();
+    m_trkDevice->sendTrkInitialPing();
+    sendTrkMessage(0x02); // Disconnect, as trk might be still connected
+    sendTrkMessage(0x01); // Connect
+    sendTrkMessage(0x05, TrkCB(handleSupportMask));
+    sendTrkMessage(0x06, TrkCB(handleCpuType));
+    sendTrkMessage(0x04, TrkCB(handleTrkVersionsStartGdb)); // Versions
 }
 
 void TrkGdbAdapter::startInferior()
@@ -1620,11 +1598,11 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
     m_session.tid = extractInt(data + 5);
     m_session.codeseg = extractInt(data + 9);
     m_session.dataseg = extractInt(data + 13);
+    const QString startMsg = tr("Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4.")
+                             .arg(m_session.pid, 0, 16).arg(m_session.tid, 0, 16)
+                             .arg(m_session.codeseg, 0, 16).arg(m_session.dataseg, 0, 16);
 
-    logMessage("PID: " + hexxNumber(m_session.pid));
-    logMessage("TID: " + hexxNumber(m_session.tid));
-    logMessage("COD: " + hexxNumber(m_session.codeseg));
-    logMessage("DAT: " + hexxNumber(m_session.dataseg));
+    logMessage(startMsg);
 
     const QString fileName = m_symbolFile;
     if (m_symbolFile.isEmpty()) {
@@ -1655,45 +1633,6 @@ void TrkGdbAdapter::startInferiorPhase2()
     m_engine->continueInferiorInternal();
 }
 
-//
-// Rfcomm process handling
-//
-
-void TrkGdbAdapter::handleRfcommReadyReadStandardError()
-{
-    QByteArray ba = m_rfcommProc.readAllStandardError();
-    logMessage(QString("RFCONN stderr: %1").arg(_(ba)));
-}
-
-void TrkGdbAdapter::handleRfcommReadyReadStandardOutput()
-{
-    QByteArray ba = m_rfcommProc.readAllStandardOutput();
-    logMessage(QString("RFCONN stdout: %1").arg(_(ba)));
-}
-
-
-void TrkGdbAdapter::handleRfcommError(QProcess::ProcessError error)
-{
-    logMessage(QString("RFCOMM: Process Error %1: %2")
-        .arg(error).arg(m_rfcommProc.errorString()));
-}
-
-void TrkGdbAdapter::handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus)
-{
-    logMessage(QString("RFCOMM: ProcessFinished %1 %2")
-        .arg(exitCode).arg(exitStatus));
-}
-
-void TrkGdbAdapter::handleRfcommStarted()
-{
-    logMessage(QString("RFCOMM: Process Started"));
-}
-
-void TrkGdbAdapter::handleRfcommStateChanged(QProcess::ProcessState newState)
-{
-    logMessage(QString("RFCOMM: Process State %1").arg(newState));
-}
-
 //
 // AbstractGdbAdapter interface implementation
 //
@@ -1919,7 +1858,7 @@ void TrkGdbAdapter::handleDirectStep3(const TrkResult &result)
 
 void TrkGdbAdapter::cleanup()
 {
-    m_trkDevice.close();
+    m_trkDevice->close();
     delete m_gdbServer;
     m_gdbServer = 0;
 }
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 9bc68b430981f39ea246d85622b238f4c07b8a80..a4e01f3258a6ab5bda1b3574b489f0eb64e9d6db 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -43,10 +43,12 @@
 #include <QtCore/QQueue>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
+#include <QtCore/QSharedPointer>
 
 #include <QtNetwork/QTcpServer>
 #include <QtNetwork/QTcpSocket>
 
+
 namespace Debugger {
 namespace Internal {
 
@@ -142,20 +144,16 @@ public:
     void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; }
     trk::Session &session() { return m_session; }
 
-    // Set a device (from the project) to override the settings.
-    QString overrideTrkDevice() const;
-    void setOverrideTrkDevice(const QString &);
-
 signals:
     void output(const QString &msg);
 
 private:
     const TrkOptionsPtr m_options;
     QString m_overrideTrkDevice;
+    int m_overrideTrkDeviceType;
 
     QString m_gdbServerName; // 127.0.0.1:(2222+uid)
 
-    QProcess m_rfcommProc;
     bool m_running;
 
 public:
@@ -179,7 +177,6 @@ private:
     void emitDelayedInferiorStartFailed(const QString &msg);
     Q_SLOT void slotEmitDelayedInferiorStartFailed();
 
-    Q_SLOT void waitForTrkConnect();
     void handleTargetRemote(const GdbResponse &response);
 
     //
@@ -201,7 +198,7 @@ private:
     void handleSignalContinue(const TrkResult &result);
     void handleStop(const TrkResult &result);
     void handleSupportMask(const TrkResult &result);
-    void handleTrkVersions(const TrkResult &result);
+    void handleTrkVersionsStartGdb(const TrkResult &result);
     void handleDisconnect(const TrkResult &result);
     void handleDeleteProcess(const TrkResult &result);
     void handleDeleteProcess2(const TrkResult &result);
@@ -251,7 +248,7 @@ private:
     QByteArray trkDeleteProcessMessage();    
     QByteArray trkInterruptMessage();
 
-    trk::TrkDevice m_trkDevice;
+    QSharedPointer<trk::TrkDevice> m_trkDevice;
     QString m_adapterFailMessage;
 
     //
@@ -291,17 +288,8 @@ private:
 
     QHash<int, GdbCommand> m_gdbCookieForToken;
 
-    //
-    // Rfcomm
-    //
-    Q_SLOT void handleRfcommReadyReadStandardError();
-    Q_SLOT void handleRfcommReadyReadStandardOutput();
-    Q_SLOT void handleRfcommError(QProcess::ProcessError error);
-    Q_SLOT void handleRfcommFinished(int exitCode, QProcess::ExitStatus exitStatus);
-    Q_SLOT void handleRfcommStarted();
-    Q_SLOT void handleRfcommStateChanged(QProcess::ProcessState newState);
-
     QString effectiveTrkDevice() const;
+    int effectiveTrkDeviceType() const;
 
     // Debuggee state
     trk::Session m_session; // global-ish data (process id, target information)
@@ -310,7 +298,6 @@ private:
     QString m_symbolFile;
     int m_verbose;
     bool m_bufferedMemoryRead;
-    int m_waitCount;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index 55e03207bdb65d8a1bda5e6134e6760f06205164..3e18cd43f7d3cb1d78a49a992382062fb0c16210 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -636,6 +636,12 @@ QString decodeData(const QByteArray &ba, int encoding)
         case 5: { //  base64 encoded 8 bit data, without quotes (see 1)
             return quoteUnprintableLatin1(QByteArray::fromBase64(ba));
         }
+        case 6: { //  %02x encoded 8 bit data
+            const QChar doubleQuote(QLatin1Char('"'));
+            const QByteArray decodedBa = QByteArray::fromHex(ba);
+            //qDebug() << quoteUnprintableLatin1(decodedBa) << "\n\n";
+            return doubleQuote + QString::fromLatin1(decodedBa) + doubleQuote;
+        }
         case 7: { //  %04x encoded 16 bit data
             const QChar doubleQuote(QLatin1Char('"'));
             const QByteArray decodedBa = QByteArray::fromHex(ba);
@@ -644,6 +650,7 @@ QString decodeData(const QByteArray &ba, int encoding)
                 (decodedBa.data()), decodedBa.size() / 2) + doubleQuote;
         }
     }
+    qDebug() << "ENCODING ERROR: " << encoding;
     return QCoreApplication::translate("Debugger", "<Encoding error>");
 }
 
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index abec06d97eaf6f56f18e57936c84843a3067a291..8d99049488377b72b822b8ae1a49068f089ee7e4 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -78,6 +78,10 @@
 
 #include <climits>
 
+// FIXME: Restrict this as soon the availableUndoSteps has been merged to Qt
+//#if QT_VERSION < 0x040600
+#define availableUndoSteps revision
+//#endif
 
 //#define DEBUG_KEY  1
 #if DEBUG_KEY
@@ -88,7 +92,7 @@
 
 //#define DEBUG_UNDO  1
 #if DEBUG_UNDO
-#   define UNDO_DEBUG(s) qDebug() << << m_tc.document()->revision() << s
+#   define UNDO_DEBUG(s) qDebug() << << m_tc.document()->availableUndoSteps() << s
 #else
 #   define UNDO_DEBUG(s)
 #endif
@@ -661,7 +665,7 @@ void FakeVimHandler::Private::restoreWidget()
 EventResult FakeVimHandler::Private::handleKey(int key, int unmodified,
     const QString &text)
 {
-    m_undoCursorPosition[m_tc.document()->revision()] = m_tc.position();
+    m_undoCursorPosition[m_tc.document()->availableUndoSteps()] = m_tc.position();
     //qDebug() << "KEY: " << key << text << "POS: " << m_tc.position();
     if (m_mode == InsertMode)
         return handleInsertMode(key, unmodified, text);
@@ -1574,6 +1578,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     } else if (key == 'Z') {
         m_submode = CapitalZSubMode;
     } else if (key == '~' && !atEndOfLine()) {
+        beginEditBlock();
         setAnchor();
         moveRight(qMin(count(), rightDist()));
         QString str = selectedText();
@@ -1583,6 +1588,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             str[i] = c.isUpper() ? c.toLower() : c.toUpper();
         }
         m_tc.insertText(str);
+        endEditBlock();
     } else if (key == Key_PageDown || key == control('f')) {
         moveDown(count() * (linesOnScreen() - 2) - cursorLineOnScreen());
         scrollToLineInDocument(cursorLineInDocument());
@@ -2726,30 +2732,32 @@ QWidget *FakeVimHandler::Private::editor() const
 
 void FakeVimHandler::Private::undo()
 {
-    int current = m_tc.document()->revision();
+    int current = m_tc.document()->availableUndoSteps();
     //endEditBlock();
     EDITOR(undo());
     //beginEditBlock();
-    int rev = m_tc.document()->revision();
+    int rev = m_tc.document()->availableUndoSteps();
     if (current == rev)
         showBlackMessage(FakeVimHandler::tr("Already at oldest change"));
     else
         showBlackMessage(QString());
+
     if (m_undoCursorPosition.contains(rev))
         m_tc.setPosition(m_undoCursorPosition[rev]);
 }
 
 void FakeVimHandler::Private::redo()
 {
-    int current = m_tc.document()->revision();
+    int current = m_tc.document()->availableUndoSteps();
     //endEditBlock();
     EDITOR(redo());
     //beginEditBlock();
-    int rev = m_tc.document()->revision();
+    int rev = m_tc.document()->availableUndoSteps();
     if (rev == current)
         showBlackMessage(FakeVimHandler::tr("Already at newest change"));
     else
         showBlackMessage(QString());
+
     if (m_undoCursorPosition.contains(rev))
         m_tc.setPosition(m_undoCursorPosition[rev]);
 }
diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp
index b7382315419ad97c7ce0ab59cbefc9767265f42d..a5aed6fe1fb21c4b9c3ab8bdbb3f52169ad9a3a0 100644
--- a/src/plugins/help/helpplugin.cpp
+++ b/src/plugins/help/helpplugin.cpp
@@ -618,7 +618,7 @@ void HelpPlugin::extensionsInitialized()
                 + QLatin1String("../../share/doc/qtcreator/qtcreator.qch"));
 #endif
             if (!hc.registerDocumentation(qchFileName))
-                qDebug() << hc.error();
+                qDebug() << qPrintable(hc.error());
             needsSetup = true;
         }
 
diff --git a/src/plugins/qmleditor/QmlEditor.pluginspec b/src/plugins/qmleditor/QmlEditor.pluginspec
index 5c30283018170e4b5156c7eaa08704802307ee3a..7b1a91c8cecdf32ecb24166bc842b2b95aba9f48 100644
--- a/src/plugins/qmleditor/QmlEditor.pluginspec
+++ b/src/plugins/qmleditor/QmlEditor.pluginspec
@@ -21,5 +21,6 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
     <dependencyList>
         <dependency name="Core" version="1.3.80"/>
         <dependency name="TextEditor" version="1.3.80"/>
+        <dependency name="Help" version="1.3.80"/>
     </dependencyList>
 </plugin>
diff --git a/src/plugins/qmleditor/parser/qmljs.g b/src/plugins/qmleditor/parser/qmljs.g
index 8531ed51079477ab376d6276d3ddd802234614ae..eb9a8abcfdcbb086a9fb964cec47c3eb32a36fe7 100644
--- a/src/plugins/qmleditor/parser/qmljs.g
+++ b/src/plugins/qmleditor/parser/qmljs.g
@@ -1,20 +1,18 @@
 ----------------------------------------------------------------------------
 --
--- This file is part of Qt Creator
+-- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+-- Contact: Qt Software Information (qt-info@nokia.com)
 --
--- Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+-- This file is part of the QtDeclarative module of the Qt Toolkit.
 --
--- Contact: Nokia Corporation (qt-info@nokia.com)
---
--- Commercial Usage
---
--- Licensees holding valid Qt Commercial licenses may use this file in
--- accordance with the Qt Commercial License Agreement provided with the
--- Software or, alternatively, in accordance with the terms contained in
--- a written agreement between you and Nokia.
+-- $QT_BEGIN_LICENSE:LGPL$
+-- No Commercial Usage
+-- This file contains pre-release code and may not be distributed.
+-- You may use this file in accordance with the terms and conditions
+-- contained in the either Technology Preview License Agreement or the
+-- Beta Release License Agreement.
 --
 -- GNU Lesser General Public License Usage
---
 -- Alternatively, this file may be used under the terms of the GNU Lesser
 -- General Public License version 2.1 as published by the Free Software
 -- Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,8 +20,25 @@
 -- ensure the GNU Lesser General Public License version 2.1 requirements
 -- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 --
+-- In addition, as a special exception, Nokia gives you certain
+-- additional rights. These rights are described in the Nokia Qt LGPL
+-- Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+-- package.
+--
+-- GNU General Public License Usage
+-- Alternatively, this file may be used under the terms of the GNU
+-- General Public License version 3.0 as published by the Free Software
+-- Foundation and appearing in the file LICENSE.GPL included in the
+-- packaging of this file.  Please review the following information to
+-- ensure the GNU General Public License version 3.0 requirements will be
+-- met: http://www.gnu.org/copyleft/gpl.html.
+--
 -- If you are unsure which license is appropriate for your use, please
--- contact the sales department at http://qt.nokia.com/contact.
+-- contact the sales department at qt-sales@nokia.com.
+-- $QT_END_LICENSE$
+--
+-- This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+-- WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 --
 ----------------------------------------------------------------------------
 
@@ -85,23 +100,21 @@
 %start TopLevel
 
 /.
-/**************************************************************************
-**
-** This file is part of Qt Creator
+/****************************************************************************
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -109,12 +122,27 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #include <QtCore/QtDebug>
+#include <QtGui/QApplication>
 
 #include <string.h>
 
@@ -126,23 +154,21 @@
 ./
 
 /:
-/**************************************************************************
-**
-** This file is part of Qt Creator
-**
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+/****************************************************************************
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Commercial Usage
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -150,10 +176,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 //
 //  W A R N I N G
@@ -2920,7 +2960,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
             yylloc.startColumn += yylloc.length;
             yylloc.length = 0;
 
-            //const QString msg = QString::fromUtf8("Missing `;'");
+            //const QString msg = qApp->translate("QmlParser", "Missing `;'");
             //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
 
             first_token = &token_buffer[0];
@@ -2945,7 +2985,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
         token_buffer[1].loc   = yylloc  = location(lexer);
 
         if (t_action(errorState, yytoken)) {
-            const QString msg = QString::fromUtf8("Unexpected token `%1'").arg(QLatin1String(spell[token_buffer[0].token]));
+            const QString msg = qApp->translate("QmlParser", "Unexpected token `%1'").arg(QLatin1String(spell[token_buffer[0].token]));
             diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
             action = errorState;
@@ -2973,7 +3013,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
         for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
             int a = t_action(errorState, *tk);
             if (a > 0 && t_action(a, yytoken)) {
-                const QString msg = QString::fromUtf8("Expected token `%1'").arg(QLatin1String(spell[*tk]));
+                const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
                 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
                 yytoken = *tk;
@@ -2996,7 +3036,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
 
             int a = t_action(errorState, tk);
             if (a > 0 && t_action(a, yytoken)) {
-                const QString msg = QString::fromUtf8("Expected token `%1'").arg(QLatin1String(spell[tk]));
+                const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
                 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
                 yytoken = tk;
@@ -3009,7 +3049,7 @@ PropertyNameAndValueListOpt: PropertyNameAndValueList ;
             }
         }
 
-        const QString msg = QString::fromUtf8("Syntax error");
+        const QString msg = qApp->translate("QmlParser", "Syntax error");
         diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
     }
 
diff --git a/src/plugins/qmleditor/parser/qmljsast.cpp b/src/plugins/qmleditor/parser/qmljsast.cpp
index ec199e80ae7a168a8dedf5c528835c91b23be21c..4c45bc89d9eeee28410dab67608575e68f1d430a 100644
--- a/src/plugins/qmleditor/parser/qmljsast.cpp
+++ b/src/plugins/qmleditor/parser/qmljsast.cpp
@@ -1,20 +1,18 @@
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #include "qmljsast_p.h"
 #include "qmljsastvisitor_p.h"
diff --git a/src/plugins/qmleditor/parser/qmljsast_p.h b/src/plugins/qmleditor/parser/qmljsast_p.h
index 94a26096ee25a7ba239d21536d327d8085a218bb..ef8a66bd949f62bd345cc35f1db73109becd8411 100644
--- a/src/plugins/qmleditor/parser/qmljsast_p.h
+++ b/src/plugins/qmleditor/parser/qmljsast_p.h
@@ -1,20 +1,18 @@
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSAST_P_H
 #define QMLJSAST_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsastfwd_p.h b/src/plugins/qmleditor/parser/qmljsastfwd_p.h
index dd164e9e3c83f7072d3542aa5cfd313a56c9a3e5..fcb97ad870a70e37dd43c92c91f764779e7cc416 100644
--- a/src/plugins/qmleditor/parser/qmljsastfwd_p.h
+++ b/src/plugins/qmleditor/parser/qmljsastfwd_p.h
@@ -1,20 +1,18 @@
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSAST_FWD_P_H
 #define QMLJSAST_FWD_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsastvisitor.cpp b/src/plugins/qmleditor/parser/qmljsastvisitor.cpp
index 6a0d55a4f1636f0653bfa5ed67b6eb22a9e55735..642bcee26b9818a524f6c1067c65163e047f7e04 100644
--- a/src/plugins/qmleditor/parser/qmljsastvisitor.cpp
+++ b/src/plugins/qmleditor/parser/qmljsastvisitor.cpp
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,14 +20,28 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #include "qmljsastvisitor_p.h"
 
-QT_QML_BEGIN_NAMESPACE
+QT_BEGIN_NAMESPACE
 
 namespace QmlJS { namespace AST {
 
@@ -43,4 +55,4 @@ Visitor::~Visitor()
 
 } } // namespace QmlJS::AST
 
-QT_QML_END_NAMESPACE
+QT_END_NAMESPACE
diff --git a/src/plugins/qmleditor/parser/qmljsastvisitor_p.h b/src/plugins/qmleditor/parser/qmljsastvisitor_p.h
index 09714ee0a0a677b7f4b1ea8b9c9783ca2c6ccbcf..eea492a057214090e378ae0cc2bf7f910d4a416a 100644
--- a/src/plugins/qmleditor/parser/qmljsastvisitor_p.h
+++ b/src/plugins/qmleditor/parser/qmljsastvisitor_p.h
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSASTVISITOR_P_H
 #define QMLJSASTVISITOR_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsengine_p.cpp b/src/plugins/qmleditor/parser/qmljsengine_p.cpp
index 6e7a45a5065f4e7abde4f7828755425abfece4d6..32068c032050cbfe8140f797c27ef5fa50513dcd 100644
--- a/src/plugins/qmleditor/parser/qmljsengine_p.cpp
+++ b/src/plugins/qmleditor/parser/qmljsengine_p.cpp
@@ -1,20 +1,18 @@
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #include "qmljsglobal_p.h"
 #include "qmljsengine_p.h"
@@ -152,7 +164,7 @@ double integerFromString(const char *buf, int size, int radix)
 
 double integerFromString(const QString &str, int radix)
 {
-    QByteArray ba = str.trimmed().toUtf8();
+    QByteArray ba = str.trimmed().toLatin1();
     return integerFromString(ba.constData(), ba.size(), radix);
 }
 
diff --git a/src/plugins/qmleditor/parser/qmljsengine_p.h b/src/plugins/qmleditor/parser/qmljsengine_p.h
index 98e71c88790a618072566876745a18424a809336..8627a9902431e310e748a44a65016e95d1c98770 100644
--- a/src/plugins/qmleditor/parser/qmljsengine_p.h
+++ b/src/plugins/qmleditor/parser/qmljsengine_p.h
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSENGINE_P_H
 #define QMLJSENGINE_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsgrammar.cpp b/src/plugins/qmleditor/parser/qmljsgrammar.cpp
index 67f14032fa7c5d3cad96bd8c89f41b2d12a43a22..da3ce2a0770ca7c3d4803653bed1224ab58e0561 100644
--- a/src/plugins/qmleditor/parser/qmljsgrammar.cpp
+++ b/src/plugins/qmleditor/parser/qmljsgrammar.cpp
@@ -2,8 +2,7 @@
 /****************************************************************************
 **
 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
 ** This file is part of the QtCore module of the Qt Toolkit.
 **
@@ -11,8 +10,8 @@
 ** No Commercial Usage
 ** This file contains pre-release code and may not be distributed.
 ** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU Lesser
@@ -22,20 +21,21 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
 **
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
 **
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
diff --git a/src/plugins/qmleditor/parser/qmljsgrammar_p.h b/src/plugins/qmleditor/parser/qmljsgrammar_p.h
index 7de77c03a099c626e847eb858ac1714121d616e5..b297f81cff533b44359969ec97a7e2d03a97b185 100644
--- a/src/plugins/qmleditor/parser/qmljsgrammar_p.h
+++ b/src/plugins/qmleditor/parser/qmljsgrammar_p.h
@@ -2,8 +2,7 @@
 /****************************************************************************
 **
 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
 ** This file is part of the QtCore module of the Qt Toolkit.
 **
@@ -11,8 +10,8 @@
 ** No Commercial Usage
 ** This file contains pre-release code and may not be distributed.
 ** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU Lesser
@@ -22,20 +21,21 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
 **
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
 **
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
diff --git a/src/plugins/qmleditor/parser/qmljslexer.cpp b/src/plugins/qmleditor/parser/qmljslexer.cpp
index a52ea7c089628c01a0675b3ce78619de87853554..2c03c2149704f04f2cab3ccf8d4cd38f2242c496 100644
--- a/src/plugins/qmleditor/parser/qmljslexer.cpp
+++ b/src/plugins/qmleditor/parser/qmljslexer.cpp
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -36,6 +48,8 @@
 #include "qmljslexer_p.h"
 #include "qmljsgrammar_p.h"
 
+#include <QtGui/qapplication.h>
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -536,7 +550,7 @@ int Lexer::lex()
                 else {
                     setDone(Bad);
                     err = IllegalCharacter;
-                    errmsg = QLatin1String("Illegal character");
+                    errmsg = qApp->translate("QmlParser", "Illegal character");
                 }
             }
             break;
@@ -550,7 +564,7 @@ int Lexer::lex()
             } else if (current == 0 || isLineTerminator()) {
                 setDone(Bad);
                 err = UnclosedStringLiteral;
-                errmsg = QLatin1String("Unclosed string at end of line");
+                errmsg = qApp->translate("QmlParser", "Unclosed string at end of line");
             } else if (current == '\\') {
                 state = InEscapeSequence;
             } else {
@@ -576,7 +590,7 @@ int Lexer::lex()
                 } else {
                     setDone(Bad);
                     err = IllegalEscapeSequence;
-                    errmsg = QLatin1String("Illegal escape squence");
+                    errmsg = qApp->translate("QmlParser", "Illegal escape squence");
                 }
             } else if (current == 'x')
                 state = InHexEscape;
@@ -622,7 +636,7 @@ int Lexer::lex()
             } else {
                 setDone(Bad);
                 err = IllegalUnicodeEscapeSequence;
-                errmsg = QLatin1String("Illegal unicode escape sequence");
+                errmsg = qApp->translate("QmlParser", "Illegal unicode escape sequence");
             }
             break;
         case InSingleLineComment:
@@ -648,7 +662,7 @@ int Lexer::lex()
             if (current == 0) {
                 setDone(Bad);
                 err = UnclosedComment;
-                errmsg = QLatin1String("Unclosed comment at end of file");
+                errmsg = qApp->translate("QmlParser", "Unclosed comment at end of file");
                 driver->addComment(startpos, tokenLength(), startlineno, startcolumn);
             } else if (isLineTerminator()) {
                 shiftWindowsLineBreak();
@@ -735,7 +749,7 @@ int Lexer::lex()
             } else {
                 setDone(Bad);
                 err = IllegalExponentIndicator;
-                errmsg = QLatin1String("Illegal syntax for exponential number");
+                errmsg = qApp->translate("QmlParser", "Illegal syntax for exponential number");
             }
             break;
         case InExponent:
@@ -761,7 +775,7 @@ int Lexer::lex()
          && isIdentLetter(current)) {
         state = Bad;
         err = IllegalIdentifier;
-        errmsg = QLatin1String("Identifier cannot start with numeric literal");
+        errmsg = qApp->translate("QmlParser", "Identifier cannot start with numeric literal");
     }
 
     // terminate string
@@ -855,11 +869,16 @@ bool Lexer::isLineTerminator() const
 
 bool Lexer::isIdentLetter(ushort c)
 {
-    /* TODO: allow other legitimate unicode chars */
-    return ((c >= 'a' && c <= 'z')
+    // ASCII-biased, since all reserved words are ASCII, aand hence the
+    // bulk of content to be parsed.
+    if ((c >= 'a' && c <= 'z')
             || (c >= 'A' && c <= 'Z')
             || c == '$'
-            || c == '_');
+            || c == '_')
+        return true;
+    if (c < 128)
+        return false;
+    return QChar(c).isLetterOrNumber();
 }
 
 bool Lexer::isDecimalDigit(ushort c)
@@ -1087,7 +1106,7 @@ bool Lexer::scanRegExp(RegExpBodyPrefix prefix)
 
     while (1) {
         if (isLineTerminator() || current == 0) {
-            errmsg = QLatin1String("Unterminated regular expression literal");
+            errmsg = qApp->translate("QmlParser", "Unterminated regular expression literal");
             return false;
         }
         else if (current != '/' || lastWasEscape == true)
@@ -1111,7 +1130,7 @@ bool Lexer::scanRegExp(RegExpBodyPrefix prefix)
     while (isIdentLetter(current)) {
         int flag = Ecma::RegExp::flagFromChar(current);
         if (flag == 0) {
-            errmsg = QString::fromLatin1("Invalid regular expression flag '%0'")
+            errmsg = qApp->translate("QmlParser", "Invalid regular expression flag '%0'")
                      .arg(QChar(current));
             return false;
         }
diff --git a/src/plugins/qmleditor/parser/qmljslexer_p.h b/src/plugins/qmleditor/parser/qmljslexer_p.h
index 1be466c3e620303b9713672d158c9e6744dbe850..50f7c4b279d4be7e7ef59eac39d4f745c8cfe26a 100644
--- a/src/plugins/qmleditor/parser/qmljslexer_p.h
+++ b/src/plugins/qmleditor/parser/qmljslexer_p.h
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSLEXER_P_H
 #define QMLJSLEXER_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsmemorypool_p.h b/src/plugins/qmleditor/parser/qmljsmemorypool_p.h
index 4b79f174fb0095d4fb640ec1733e04c8c0f02d8c..70e77371127320cc5c9c24e301401453a37c9199 100644
--- a/src/plugins/qmleditor/parser/qmljsmemorypool_p.h
+++ b/src/plugins/qmleditor/parser/qmljsmemorypool_p.h
@@ -1,20 +1,18 @@
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSMEMORYPOOL_P_H
 #define QMLJSMEMORYPOOL_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsnodepool_p.h b/src/plugins/qmleditor/parser/qmljsnodepool_p.h
index ba0c3678efd67d3bc475cc7824c5d044557467ba..dfe3bac46522d1b596e5ea0c70d22f16ac717403 100644
--- a/src/plugins/qmleditor/parser/qmljsnodepool_p.h
+++ b/src/plugins/qmleditor/parser/qmljsnodepool_p.h
@@ -1,20 +1,18 @@
-/**************************************************************************
+/****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,10 +20,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #ifndef QMLJSNODEPOOL_P_H
 #define QMLJSNODEPOOL_P_H
diff --git a/src/plugins/qmleditor/parser/qmljsparser.cpp b/src/plugins/qmleditor/parser/qmljsparser.cpp
index f5fab00f4cc32d5c0d727ad747044e8ed6204498..402aaeb3959a8d9c7ccbd19800aee8e35b0a8fe6 100644
--- a/src/plugins/qmleditor/parser/qmljsparser.cpp
+++ b/src/plugins/qmleditor/parser/qmljsparser.cpp
@@ -2,21 +2,19 @@
 
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -24,12 +22,27 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 #include <QtCore/QtDebug>
+#include <QtGui/QApplication>
 
 #include <string.h>
 
@@ -1711,7 +1724,7 @@ case 337: {
             yylloc.startColumn += yylloc.length;
             yylloc.length = 0;
 
-            //const QString msg = QString::fromUtf8("Missing `;'");
+            //const QString msg = qApp->translate("QmlParser", "Missing `;'");
             //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
 
             first_token = &token_buffer[0];
@@ -1736,7 +1749,7 @@ case 337: {
         token_buffer[1].loc   = yylloc  = location(lexer);
 
         if (t_action(errorState, yytoken)) {
-            const QString msg = QString::fromUtf8("Unexpected token `%1'").arg(QLatin1String(spell[token_buffer[0].token]));
+            const QString msg = qApp->translate("QmlParser", "Unexpected token `%1'").arg(QLatin1String(spell[token_buffer[0].token]));
             diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
             action = errorState;
@@ -1764,7 +1777,7 @@ case 337: {
         for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
             int a = t_action(errorState, *tk);
             if (a > 0 && t_action(a, yytoken)) {
-                const QString msg = QString::fromUtf8("Expected token `%1'").arg(QLatin1String(spell[*tk]));
+                const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
                 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
                 yytoken = *tk;
@@ -1787,7 +1800,7 @@ case 337: {
 
             int a = t_action(errorState, tk);
             if (a > 0 && t_action(a, yytoken)) {
-                const QString msg = QString::fromUtf8("Expected token `%1'").arg(QLatin1String(spell[tk]));
+                const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
                 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
 
                 yytoken = tk;
@@ -1800,7 +1813,7 @@ case 337: {
             }
         }
 
-        const QString msg = QString::fromUtf8("Syntax error");
+        const QString msg = qApp->translate("QmlParser", "Syntax error");
         diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
     }
 
diff --git a/src/plugins/qmleditor/parser/qmljsparser_p.h b/src/plugins/qmleditor/parser/qmljsparser_p.h
index 7ee69a57d567803b09862ef8b4e4db96d90afdad..b35bec32b38da836e117dc6afaa4d3d9ee240f63 100644
--- a/src/plugins/qmleditor/parser/qmljsparser_p.h
+++ b/src/plugins/qmleditor/parser/qmljsparser_p.h
@@ -2,21 +2,19 @@
 
 /****************************************************************************
 **
-** This file is part of Qt Creator
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
 **
-** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** This file is part of the QtScript module of the Qt Toolkit.
 **
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** Commercial Usage
-**
-** Licensees holding valid Qt Commercial licenses may use this file in
-** accordance with the Qt Commercial License Agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Nokia.
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
 **
 ** GNU Lesser General Public License Usage
-**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -24,10 +22,24 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
 ** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
 **
-**************************************************************************/
+****************************************************************************/
 
 //
 //  W A R N I N G
diff --git a/src/plugins/qmleditor/qmleditor.pro b/src/plugins/qmleditor/qmleditor.pro
index 3dfa9367bc924a239535f53b46878b98ce2914cc..8f71e4ffc61498c039c3722ca153b40c902b5977 100644
--- a/src/plugins/qmleditor/qmleditor.pro
+++ b/src/plugins/qmleditor/qmleditor.pro
@@ -46,3 +46,4 @@ SOURCES += qmleditor.cpp \
     qmlsymbol.cpp \
     qmlfilewizard.cpp
 RESOURCES += qmleditor.qrc
+OTHER_FILES += QmlEditor.pluginspec
diff --git a/src/plugins/qmleditor/qmleditor_dependencies.pri b/src/plugins/qmleditor/qmleditor_dependencies.pri
index 6163cfc764f83269aff57b079420f1a26fa54396..885ef8bc1ec42923a7088a33cc324191f823421e 100644
--- a/src/plugins/qmleditor/qmleditor_dependencies.pri
+++ b/src/plugins/qmleditor/qmleditor_dependencies.pri
@@ -1,5 +1,6 @@
 include(../../plugins/coreplugin/coreplugin.pri)
 include(../../plugins/texteditor/texteditor.pri)
+include(../../plugins/help/help.pri)
 include(../../shared/qscripthighlighter/qscripthighlighter.pri)
 include(../../shared/indenter/indenter.pri)
 
diff --git a/src/plugins/qmleditor/qmleditorplugin.cpp b/src/plugins/qmleditor/qmleditorplugin.cpp
index 466fef432cb2abf4bc149f7c82bc268a0b940d36..e0bfedc94de34d8133ece81366b67bc15b758f51 100644
--- a/src/plugins/qmleditor/qmleditorplugin.cpp
+++ b/src/plugins/qmleditor/qmleditorplugin.cpp
@@ -51,11 +51,14 @@
 #include <texteditor/textfilewizard.h>
 #include <texteditor/texteditoractionhandler.h>
 #include <texteditor/completionsupport.h>
+#include <help/helpplugin.h>
 #include <utils/qtcassert.h>
 
 #include <QtCore/QtPlugin>
 #include <QtCore/QDebug>
 #include <QtCore/QSettings>
+#include <QtCore/QDir>
+#include <QtCore/QCoreApplication>
 #include <QtGui/QAction>
 
 using namespace QmlEditor;
@@ -132,6 +135,27 @@ bool QmlEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
 
 void QmlEditorPlugin::extensionsInitialized()
 {
+    //
+    // Explicitly register qml.qch if located in creator directory.
+    //
+    // This is only needed for the creator-qml package, were we
+    // want to ship the documentation without a qt development version.
+    //
+
+    ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+    Help::HelpManager *helpManager = pluginManager->getObject<Help::HelpManager>();
+
+    Q_ASSERT(helpManager);
+
+    const QString qmlHelpFile =
+            QDir::cleanPath(QCoreApplication::applicationDirPath()
+#if defined(Q_OS_MAC)
+            + QLatin1String("/../Resources/doc/qml.qch"));
+#else
+            + QLatin1String("../../share/doc/qtcreator/qml.qch"));
+#endif
+
+    helpManager->registerDocumentation(QStringList(qmlHelpFile));
 }
 
 void QmlEditorPlugin::initializeEditor(QmlEditor::Internal::ScriptEditor *editor)
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index 4e891641d1960f177373ac71085d0654a1784adb..43707de1ad4244d4afebc727502d487451e7e824 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -338,7 +338,12 @@ QmlRunConfiguration::QmlRunConfiguration(QmlProject *pro)
 {
     setName(tr("QML Viewer"));
 
-    m_qmlViewer = Utils::SynchronousProcess::locateBinary(QLatin1String("qmlviewer"));
+    // append creator/bin dir to search path (only useful for special creator-qml package)
+    const QString searchPath = QString(qgetenv("PATH"))
+                               + Utils::SynchronousProcess::pathSeparator()
+                               + QCoreApplication::applicationDirPath()
+;
+    m_qmlViewer = Utils::SynchronousProcess::locateBinary(searchPath, QLatin1String("qmlviewer"));
 }
 
 QmlRunConfiguration::~QmlRunConfiguration()
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
index 836db091a9901cffa791f7388e66020c51a6656c..5d21971a35417c5ac57e044730e6b6186d4a53e4 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
@@ -42,7 +42,6 @@
 #include <texteditor/texteditoractionhandler.h>
 
 #include <QtCore/QtPlugin>
-#include <QtCore/QDebug>
 
 using namespace QmlProjectManager;
 using namespace QmlProjectManager::Internal;
diff --git a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.cpp b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.cpp
index dca4ab11936575399547907889a486eb755fd314..a85023a2404055eabe36b96f161e81362077183e 100644
--- a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.cpp
+++ b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.cpp
@@ -33,6 +33,8 @@
 #include <coreplugin/icore.h>
 #include <coreplugin/coreconstants.h>
 
+#include <utils/pathchooser.h>
+
 #include <extensionsystem/pluginmanager.h>
 
 #include <help/helpplugin.h>
@@ -42,8 +44,12 @@
 #include <QtCore/QFileInfo>
 #include <QtCore/QDebug>
 #include <QtCore/QUrl>
+#include <QtCore/QSettings>
 #include <QtCore/QXmlStreamReader>
+#include <QtGui/QDialogButtonBox>
 #include <QtGui/QFont>
+#include <QtGui/QMessageBox>
+#include <QtGui/QPushButton>
 
 namespace Qt4ProjectManager {
 namespace Internal {
@@ -159,17 +165,92 @@ void GettingStartedWelcomePageWidget::slotEnableExampleButton(int index)
     ui->openExampleButton->setEnabled(!fileName.isEmpty());
 }
 
+namespace {
+void copyRecursive(const QDir& from, const QDir& to, const QString& dir)
+{
+    QDir dest(to);
+    dest.mkdir(dir);
+    dest.cd(dir);
+    QDir src(from);
+    src.cd(dir);
+    foreach(const QFileInfo& roFile, src.entryInfoList(QDir::Files)) {
+        QFile::copy(roFile.absoluteFilePath(), dest.absolutePath() + '/' + roFile.fileName());
+    }
+    foreach(const QString& roDir, src.entryList(QDir::NoDotAndDotDot|QDir::Dirs)) {
+        copyRecursive(src, dest, QDir(roDir).dirName());
+    }   
+}
+} // namespace
+
 void GettingStartedWelcomePageWidget::slotOpenExample()
 {
     QComboBox *box = ui->examplesComboBox;
     QString proFile = box->itemData(box->currentIndex(), Qt::UserRole).toString();
     QString helpFile = box->itemData(box->currentIndex(), Qt::UserRole + 1).toString();
     QStringList files;
-    QFileInfo fi(proFile);
-    QString tryFile = fi.path() + "/main.cpp";
+    QFileInfo proFileInfo(proFile);
+    // If the Qt is a distro Qt on Linux, it will not be writable, hence compilation will fail
+    if (!proFileInfo.isWritable())
+    {
+        QDialog d;
+        QGridLayout *lay = new QGridLayout(&d);
+        QLabel *descrLbl = new QLabel;
+        d.setWindowTitle(tr("Copy Project to writable Location?"));
+        descrLbl->setTextFormat(Qt::RichText);
+        descrLbl->setWordWrap(true);
+        descrLbl->setText(tr("<p>The project you are about to open is located in the "
+                             "write-protected location:</p><blockquote>%1</blockquote>"
+                             "<p>Please select a writable location below and click \"Copy Project and Open\" "
+                             "to open a modifiable copy of the project or click \"Keep Project and Open\" "
+                             "to open the project in location.</p><p><b>Note:</b> You will not "
+                             "be able to alter or compile your project in the current location.</p>")
+                          .arg(QDir::toNativeSeparators(proFileInfo.dir().absolutePath())));
+        lay->addWidget(descrLbl, 0, 0, 1, 2);
+        QLabel *txt = new QLabel(tr("&Location:"));
+        Utils::PathChooser *chooser = new Utils::PathChooser;
+        txt->setBuddy(chooser);
+        chooser->setExpectedKind(Utils::PathChooser::Directory);
+        QSettings *settings = Core::ICore::instance()->settings();
+        chooser->setPath(settings->value(
+                QString::fromLatin1("General/ProjectsFallbackRoot"), QDir::homePath()).toString());
+        lay->addWidget(txt, 1, 0);
+        lay->addWidget(chooser, 1, 1);
+        QDialogButtonBox *bb = new QDialogButtonBox;
+        connect(bb, SIGNAL(accepted()), &d, SLOT(accept()));
+        connect(bb, SIGNAL(rejected()), &d, SLOT(reject()));
+        QPushButton *copyBtn = bb->addButton(tr("&Copy Project and Open"), QDialogButtonBox::AcceptRole);
+        copyBtn->setDefault(true);
+        bb->addButton(tr("&Keep Project and Open"), QDialogButtonBox::RejectRole);
+        lay->addWidget(bb, 2, 0, 1, 2);
+        connect(chooser, SIGNAL(validChanged(bool)), copyBtn, SLOT(setEnabled(bool)));
+        if (d.exec() == QDialog::Accepted) {
+            QString exampleDirName = proFileInfo.dir().dirName();
+            QString toDir = chooser->path();
+            settings->setValue(QString::fromLatin1("General/ProjectsFallbackRoot"), toDir);
+            QDir toDirWithExamplesDir(toDir);
+            if (toDirWithExamplesDir.cd(exampleDirName)) {
+                toDirWithExamplesDir.cdUp(); // step out, just to not be in the way
+                QMessageBox::warning(topLevelWidget(), tr("Warning"),
+                                     tr("The specified location already exists. "
+                                        "Please specify a valid location."),
+                                     QMessageBox::Ok, QMessageBox::NoButton);
+                return;
+            } else {
+                QDir from = proFileInfo.dir();
+                from.cdUp();
+                copyRecursive(from, toDir, exampleDirName);
+                // set vars to new location
+                proFileInfo = QFileInfo(toDir + '/'+ exampleDirName + '/' + proFileInfo.fileName());
+                proFile = proFileInfo.absoluteFilePath();
+            }
+        }
+    }
+
+
+    QString tryFile = proFileInfo.path() + "/main.cpp";
     files << proFile;
     if(!QFile::exists(tryFile))
-        tryFile = fi.path() + '/' + fi.baseName() + ".cpp";
+        tryFile = proFileInfo.path() + '/' + proFileInfo.baseName() + ".cpp";
     if(QFile::exists(tryFile))
         files << tryFile;
     Core::ICore::instance()->openFiles(files);
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
index d66632169280af1f5e5c4bdda56e21e1b719c2d3..c1f2e8576524b7d938321d4dd4525cf37db6d7e9 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
@@ -8,8 +8,11 @@
         $$PWD/gccetoolchain.cpp \
         $$PWD/s60emulatorrunconfiguration.cpp \
         $$PWD/s60devicerunconfiguration.cpp \
+        $$PWD/s60devicerunconfigurationwidget.cpp \
         $$PWD/serialdevicelister.cpp \
-        $$PWD/rvcttoolchain.cpp
+        $$PWD/rvcttoolchain.cpp \
+        $$PWD/s60runconfigbluetoothstarter.cpp
+
     HEADERS += $$PWD/s60devices.h \
         $$PWD/s60devicespreferencepane.h \
         $$PWD/s60manager.h \
@@ -17,8 +20,11 @@
         $$PWD/gccetoolchain.h \
         $$PWD/s60emulatorrunconfiguration.h \
         $$PWD/s60devicerunconfiguration.h \
+        $$PWD/s60devicerunconfigurationwidget.h \
         $$PWD/serialdevicelister.h \
-        $$PWD/rvcttoolchain.h
+        $$PWD/rvcttoolchain.h \
+        $$PWD/s60runconfigbluetoothstarter.h
+
     FORMS += $$PWD/s60devicespreferencepane.ui
     OTHER_FILES += $$PWD/qt-s60-todo.txt
     include(../../../shared/trk/trk.pri)||error("could not include trk.pri")
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index 43606da69f9b0950e0ff3abd7fd008941c03287c..d547c3b6d83d77568d2764459da2766ec9479b3d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -28,12 +28,14 @@
 **************************************************************************/
 
 #include "s60devicerunconfiguration.h"
-
+#include "s60devicerunconfigurationwidget.h"
 #include "qt4project.h"
 #include "qtversionmanager.h"
 #include "profilereader.h"
 #include "s60manager.h"
 #include "s60devices.h"
+#include "s60runconfigbluetoothstarter.h"
+#include "bluetoothlistener_gui.h"
 #include "serialdevicelister.h"
 
 #include <coreplugin/icore.h>
@@ -48,11 +50,6 @@
 
 #include <debugger/debuggermanager.h>
 
-#include <QtGui/QRadioButton>
-#include <QtGui/QLabel>
-#include <QtGui/QLineEdit>
-#include <QtGui/QComboBox>
-
 using namespace ProjectExplorer;
 using namespace Qt4ProjectManager::Internal;
 
@@ -65,12 +62,19 @@ static QString lsFile(const QString &f)
     str << fi.size() << ' ' << fi.lastModified().toString(Qt::ISODate) << ' ' << QDir::toNativeSeparators(fi.absoluteFilePath());
     return rc;
 }
+
 // ======== S60DeviceRunConfiguration
 S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, const QString &proFilePath)
     : RunConfiguration(project),
     m_proFilePath(proFilePath),
     m_cachedTargetInformationValid(false),
-    m_serialPortName("COM5"),
+#ifdef Q_OS_WIN
+    m_serialPortName(QLatin1String("COM5")),
+    m_communicationType(SerialPortCommunication),
+#else
+    m_serialPortName(QLatin1String(SerialDeviceLister::linuxBlueToothDeviceRootC) + QLatin1Char('0')),
+    m_communicationType(BlueToothCommunication),
+#endif
     m_signingMode(SignSelf)
 {
     if (!m_proFilePath.isEmpty())
@@ -120,6 +124,7 @@ void S60DeviceRunConfiguration::save(PersistentSettingsWriter &writer) const
     writer.saveValue("CustomSignaturePath", m_customSignaturePath);
     writer.saveValue("CustomKeyPath", m_customKeyPath);
     writer.saveValue("SerialPortName", m_serialPortName);
+    writer.saveValue("CommunicationType", m_communicationType);
     RunConfiguration::save(writer);
 }
 
@@ -132,6 +137,7 @@ void S60DeviceRunConfiguration::restore(const PersistentSettingsReader &reader)
     m_customSignaturePath = reader.restoreValue("CustomSignaturePath").toString();
     m_customKeyPath = reader.restoreValue("CustomKeyPath").toString();
     m_serialPortName = reader.restoreValue("SerialPortName").toString().trimmed();
+    m_communicationType = reader.restoreValue("CommunicationType").toInt();
 }
 
 QString S60DeviceRunConfiguration::serialPortName() const
@@ -144,6 +150,16 @@ void S60DeviceRunConfiguration::setSerialPortName(const QString &name)
     m_serialPortName = name.trimmed();
 }
 
+int S60DeviceRunConfiguration::communicationType() const
+{
+    return m_communicationType;
+}
+
+void S60DeviceRunConfiguration::setCommunicationType(int t)
+{
+    m_communicationType = t;
+}
+
 QString S60DeviceRunConfiguration::targetName() const
 {
     const_cast<S60DeviceRunConfiguration *>(this)->updateTarget();
@@ -313,139 +329,6 @@ void S60DeviceRunConfiguration::invalidateCachedTargetInformation()
     emit targetInformationChanged();
 }
 
-// ======== S60DeviceRunConfigurationWidget
-
-S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(
-        S60DeviceRunConfiguration *runConfiguration,
-        QWidget *parent)
-    : QWidget(parent),
-    m_runConfiguration(runConfiguration)
-{
-    QVBoxLayout *mainBoxLayout = new QVBoxLayout();
-    mainBoxLayout->setMargin(0);
-    setLayout(mainBoxLayout);
-    QFormLayout *formLayout = new QFormLayout();
-    formLayout->setMargin(0);
-    mainBoxLayout->addLayout(formLayout);
-
-    QLabel *nameLabel = new QLabel(tr("Name:"));
-    m_nameLineEdit = new QLineEdit(m_runConfiguration->name());
-    nameLabel->setBuddy(m_nameLineEdit);
-    formLayout->addRow(nameLabel, m_nameLineEdit);
-
-    m_sisxFileLabel = new QLabel(m_runConfiguration->basePackageFilePath() + ".sisx");
-    formLayout->addRow(tr("Install File:"), m_sisxFileLabel);
-
-    m_serialPorts = new QComboBox;
-    updateSerialDevices();
-    connect(S60Manager::instance()->serialDeviceLister(), SIGNAL(updated()),
-            this, SLOT(updateSerialDevices()));
-    connect(m_serialPorts, SIGNAL(activated(int)), this, SLOT(setSerialPort(int)));
-    formLayout->addRow(tr("Device on Serial Port:"), m_serialPorts);
-
-    QWidget *signatureWidget = new QWidget();
-    QVBoxLayout *layout = new QVBoxLayout();
-    signatureWidget->setLayout(layout);
-    mainBoxLayout->addWidget(signatureWidget);
-    QRadioButton *selfSign = new QRadioButton(tr("Self-signed certificate"));
-    QHBoxLayout *customHBox = new QHBoxLayout();
-    customHBox->setMargin(0);
-    QVBoxLayout *radioLayout = new QVBoxLayout();
-    QRadioButton *customSignature = new QRadioButton();
-    radioLayout->addWidget(customSignature);
-    radioLayout->addStretch(10);
-    customHBox->addLayout(radioLayout);
-    QFormLayout *customLayout = new QFormLayout();
-    customLayout->setMargin(0);
-    customLayout->setLabelAlignment(Qt::AlignRight);
-    Utils::PathChooser *signaturePath = new Utils::PathChooser();
-    signaturePath->setExpectedKind(Utils::PathChooser::File);
-    signaturePath->setPromptDialogTitle(tr("Choose certificate file (.cer)"));
-    customLayout->addRow(new QLabel(tr("Custom certificate:")), signaturePath);
-    Utils::PathChooser *keyPath = new Utils::PathChooser();
-    keyPath->setExpectedKind(Utils::PathChooser::File);
-    keyPath->setPromptDialogTitle(tr("Choose key file (.key / .pem)"));
-    customLayout->addRow(new QLabel(tr("Key file:")), keyPath);
-    customHBox->addLayout(customLayout);
-    customHBox->addStretch(10);
-    layout->addWidget(selfSign);
-    layout->addLayout(customHBox);
-    layout->addStretch(10);
-
-    switch (m_runConfiguration->signingMode()) {
-    case S60DeviceRunConfiguration::SignSelf:
-        selfSign->setChecked(true);
-        break;
-    case S60DeviceRunConfiguration::SignCustom:
-        customSignature->setChecked(true);
-        break;
-    }
-
-    signaturePath->setPath(m_runConfiguration->customSignaturePath());
-    keyPath->setPath(m_runConfiguration->customKeyPath());
-
-    connect(m_nameLineEdit, SIGNAL(textEdited(QString)),
-        this, SLOT(nameEdited(QString)));
-    connect(m_runConfiguration, SIGNAL(targetInformationChanged()),
-            this, SLOT(updateTargetInformation()));
-    connect(selfSign, SIGNAL(toggled(bool)), this, SLOT(selfSignToggled(bool)));
-    connect(customSignature, SIGNAL(toggled(bool)), this, SLOT(customSignatureToggled(bool)));
-    connect(signaturePath, SIGNAL(changed(QString)), this, SLOT(signaturePathChanged(QString)));
-    connect(keyPath, SIGNAL(changed(QString)), this, SLOT(keyPathChanged(QString)));
-}
-
-void S60DeviceRunConfigurationWidget::updateSerialDevices()
-{
-    m_serialPorts->clear();
-    QString runConfigurationPortName = m_runConfiguration->serialPortName();
-    QList<SerialDeviceLister::SerialDevice> serialDevices = S60Manager::instance()->serialDeviceLister()->serialDevices();
-    for (int i = 0; i < serialDevices.size(); ++i) {
-        const SerialDeviceLister::SerialDevice &device = serialDevices.at(i);
-        m_serialPorts->addItem(device.friendlyName, device.portName);
-        if (device.portName == runConfigurationPortName)
-            m_serialPorts->setCurrentIndex(i);
-    }
-    QString selectedPortName = m_serialPorts->itemData(m_serialPorts->currentIndex()).toString();
-    if (m_serialPorts->count() > 0 && runConfigurationPortName != selectedPortName)
-        m_runConfiguration->setSerialPortName(selectedPortName);
-}
-
-void S60DeviceRunConfigurationWidget::nameEdited(const QString &text)
-{
-    m_runConfiguration->setName(text);
-}
-
-void S60DeviceRunConfigurationWidget::updateTargetInformation()
-{
-    m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + ".sisx");
-}
-
-void S60DeviceRunConfigurationWidget::setSerialPort(int index)
-{
-    m_runConfiguration->setSerialPortName(m_serialPorts->itemData(index).toString());
-}
-
-void S60DeviceRunConfigurationWidget::selfSignToggled(bool toggle)
-{
-    if (toggle)
-        m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignSelf);
-}
-
-void S60DeviceRunConfigurationWidget::customSignatureToggled(bool toggle)
-{
-    if (toggle)
-        m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignCustom);
-}
-
-void S60DeviceRunConfigurationWidget::signaturePathChanged(const QString &path)
-{
-    m_runConfiguration->setCustomSignaturePath(path);
-}
-
-void S60DeviceRunConfigurationWidget::keyPathChanged(const QString &path)
-{
-    m_runConfiguration->setCustomKeyPath(path);
-}
 
 // ======== S60DeviceRunConfigurationFactory
 
@@ -532,6 +415,7 @@ S60DeviceRunControlBase::S60DeviceRunControlBase(const QSharedPointer<RunConfigu
 
     m_serialPortName = s60runConfig->serialPortName();
     m_serialPortFriendlyName = S60Manager::instance()->serialDeviceLister()->friendlyNameForPort(m_serialPortName);
+    m_communicationType = s60runConfig->communicationType();
     m_targetName = s60runConfig->targetName();
     m_baseFileName = s60runConfig->basePackageFilePath();
     m_symbianPlatform = s60runConfig->symbianPlatform();
@@ -551,6 +435,14 @@ S60DeviceRunControlBase::S60DeviceRunControlBase(const QSharedPointer<RunConfigu
     m_packageFile = QFileInfo(m_packageFilePath).fileName();
 }
 
+S60DeviceRunControlBase::~S60DeviceRunControlBase()
+{
+    if (m_launcher) {
+        m_launcher->deleteLater();
+        m_launcher = 0;
+    }
+}
+
 void S60DeviceRunControlBase::start()
 {
     emit started();
@@ -681,6 +573,7 @@ void S60DeviceRunControlBase::signsisProcessFinished()
 
     //TODO sisx destination and file path user definable
     m_launcher->setTrkServerName(m_serialPortName);
+    m_launcher->setSerialFrame(m_communicationType == SerialPortCommunication);
     const QString copySrc(m_baseFileName + ".sisx");
     const QString copyDst = QString("C:\\Data\\%1.sisx").arg(QFileInfo(m_baseFileName).fileName());
     const QString runFileName = QString("C:\\sys\\bin\\%1.exe").arg(m_targetName);
@@ -689,6 +582,21 @@ void S60DeviceRunControlBase::signsisProcessFinished()
     initLauncher(runFileName, m_launcher);
     emit addToOutputWindow(this, tr("Package: %1\nDeploying application to '%2'...").arg(lsFile(copySrc), m_serialPortFriendlyName));
     QString errorMessage;
+    // Prompt the user to start up the Blue tooth connection
+    if (m_communicationType == BlueToothCommunication) {
+        S60RunConfigBluetoothStarter starter(m_launcher->trkDevice());
+        switch (trk::startBluetoothGui(starter, 0, &errorMessage)) {
+        case trk::BluetoothGuiConnected:
+            break;
+        case trk::BluetoothGuiCanceled:
+        case trk::BluetoothGuiError:
+            delete m_launcher;
+            m_launcher = 0;
+            error(this, errorMessage);
+            emit finished();
+            return;
+        };
+    }
     if (!m_launcher->startServer(&errorMessage)) {
         delete m_launcher;
         m_launcher = 0;
@@ -828,6 +736,7 @@ S60DeviceDebugRunControl::S60DeviceDebugRunControl(const QSharedPointer<ProjectE
             Qt::QueuedConnection);
 
     m_startParams->remoteChannel = rc->serialPortName();
+    m_startParams->remoteChannelType = rc->communicationType();
     m_startParams->startMode = Debugger::StartInternal;
     m_startParams->toolChainType = rc->toolChainType();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
index 775804cb201781bac4ac2a142e7c63571792d62c..444e8855f65e62ccc56dc606622a834e57ba410f 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h
@@ -35,16 +35,8 @@
 #include <projectexplorer/runconfiguration.h>
 #include <projectexplorer/toolchain.h>
 
-#include <QtGui/QWidget>
-
 #include <QtCore/QProcess>
 
-QT_BEGIN_NAMESPACE
-class QLabel;
-class QLineEdit;
-class QComboBox;
-QT_END_NAMESPACE
-
 namespace Debugger {
     class DebuggerStartParameters;
 }
@@ -72,6 +64,10 @@ public:
 
     QString serialPortName() const;
     void setSerialPortName(const QString &name);
+    // See SerialDeviceListener
+    int communicationType() const;
+    void setCommunicationType(int t);
+
     QString targetName() const;
     QString basePackageFilePath() const;
     QString symbianPlatform() const;
@@ -106,35 +102,12 @@ private:
     QString m_packageTemplateFileName;
     bool m_cachedTargetInformationValid;
     QString m_serialPortName;
-    SigningMode m_signingMode;
+    int m_communicationType;
+    SigningMode m_signingMode;    
     QString m_customSignaturePath;
     QString m_customKeyPath;
 };
 
-class S60DeviceRunConfigurationWidget : public QWidget
-{
-    Q_OBJECT
-public:
-    explicit S60DeviceRunConfigurationWidget(S60DeviceRunConfiguration *runConfiguration,
-                                      QWidget *parent = 0);
-
-private slots:
-    void nameEdited(const QString &text);
-    void updateTargetInformation();
-    void updateSerialDevices();
-    void setSerialPort(int index);
-    void selfSignToggled(bool toggle);
-    void customSignatureToggled(bool toggle);
-    void signaturePathChanged(const QString &path);
-    void keyPathChanged(const QString &path);
-
-private:
-    S60DeviceRunConfiguration *m_runConfiguration;
-    QComboBox *m_serialPorts;
-    QLineEdit *m_nameLineEdit;
-    QLabel *m_sisxFileLabel;
-};
-
 class S60DeviceRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory
 {
     Q_OBJECT
@@ -156,7 +129,7 @@ class S60DeviceRunControlBase : public ProjectExplorer::RunControl
     Q_OBJECT
 public:
     explicit S60DeviceRunControlBase(const QSharedPointer<ProjectExplorer::RunConfiguration> &runConfiguration);
-    ~S60DeviceRunControlBase() {}
+    ~S60DeviceRunControlBase();
     virtual void start();
     virtual void stop();
     virtual bool isRunning() const;
@@ -195,6 +168,7 @@ private:
 
     QString m_serialPortName;
     QString m_serialPortFriendlyName;
+    int     m_communicationType;
     QString m_targetName;
     QString m_baseFileName;
     QString m_symbianPlatform;
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b1554b1bae58ab3191eb1ee110c454751ae3613
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.cpp
@@ -0,0 +1,351 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "s60devicerunconfigurationwidget.h"
+#include "s60devicerunconfiguration.h"
+#include "s60runconfigbluetoothstarter.h"
+#include "bluetoothlistener_gui.h"
+#include "s60manager.h"
+#include "launcher.h"
+#include "bluetoothlistener.h"
+#include "bluetoothlistener_gui.h"
+#include "serialdevicelister.h"
+
+#include <utils/detailswidget.h>
+#include <utils/qtcassert.h>
+#include <utils/pathchooser.h>
+
+#include <QtCore/QTimer>
+#include <QtGui/QRadioButton>
+#include <QtGui/QLabel>
+#include <QtGui/QLineEdit>
+#include <QtGui/QComboBox>
+#include <QtGui/QVBoxLayout>
+#include <QtGui/QHBoxLayout>
+#include <QtGui/QFormLayout>
+#include <QtGui/QToolButton>
+#include <QtGui/QStyle>
+#include <QtGui/QApplication>
+#include <QtGui/QSpacerItem>
+
+Q_DECLARE_METATYPE(Qt4ProjectManager::Internal::CommunicationDevice)
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(
+            S60DeviceRunConfiguration *runConfiguration,
+            QWidget *parent)
+    : QWidget(parent),
+    m_runConfiguration(runConfiguration),
+    m_detailsWidget(new Utils::DetailsWidget),
+    m_serialPortsCombo(new QComboBox),
+    m_nameLineEdit(new QLineEdit(m_runConfiguration->name())),
+    m_sisxFileLabel(new QLabel(m_runConfiguration->basePackageFilePath() + QLatin1String(".sisx"))),
+    m_deviceInfoButton(new QToolButton),
+    m_deviceInfoDescriptionLabel(new QLabel(tr("Device:"))),
+    m_deviceInfoLabel(new QLabel),
+    m_infoTimeOutTimer(0)
+{
+    QVBoxLayout *mainBoxLayout = new QVBoxLayout();
+    mainBoxLayout->setMargin(0);
+    setLayout(mainBoxLayout);
+    mainBoxLayout->addWidget(m_detailsWidget);
+    QWidget *detailsContainer = new QWidget;
+    m_detailsWidget->setWidget(detailsContainer);
+
+    QVBoxLayout *detailsBoxLayout = new QVBoxLayout();
+    detailsBoxLayout->setMargin(0);
+    detailsContainer->setLayout(detailsBoxLayout);
+
+    QFormLayout *formLayout = new QFormLayout();
+    formLayout->setMargin(0);
+    detailsBoxLayout->addLayout(formLayout);
+    // Name control
+    QLabel *nameLabel = new QLabel(tr("Name:"));
+    nameLabel->setBuddy(m_nameLineEdit);
+    formLayout->addRow(nameLabel, m_nameLineEdit);
+    formLayout->addRow(tr("Install File:"), m_sisxFileLabel);
+
+    updateSerialDevices();    
+    connect(S60Manager::instance()->serialDeviceLister(), SIGNAL(updated()),
+            this, SLOT(updateSerialDevices()));
+    // Serial devices control
+    connect(m_serialPortsCombo, SIGNAL(activated(int)), this, SLOT(setSerialPort(int)));
+    QHBoxLayout *serialPortHBoxLayout = new QHBoxLayout;
+    serialPortHBoxLayout->addWidget(m_serialPortsCombo);
+    serialPortHBoxLayout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored));
+
+    formLayout->addRow(tr("Device on Serial Port:"), serialPortHBoxLayout);
+
+    // Device Info with button. Widgets are enabled in above call to updateSerialDevices()
+    QHBoxLayout *infoHBoxLayout = new QHBoxLayout;
+    m_deviceInfoLabel->setWordWrap(true);
+    m_deviceInfoLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+    infoHBoxLayout->addWidget(m_deviceInfoLabel);
+    infoHBoxLayout->addWidget(m_deviceInfoButton);
+    m_deviceInfoButton->setIcon(qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation));
+    m_deviceInfoButton->setToolTip(tr("Queries the device for information"));
+    connect(m_deviceInfoButton, SIGNAL(clicked()), this, SLOT(updateDeviceInfo()));
+    formLayout->addRow(m_deviceInfoDescriptionLabel, infoHBoxLayout);
+
+    // Signature/certificate stuff.
+    QWidget *signatureWidget = new QWidget();
+    QVBoxLayout *layout = new QVBoxLayout();
+    signatureWidget->setLayout(layout);
+    detailsBoxLayout->addWidget(signatureWidget);
+    QRadioButton *selfSign = new QRadioButton(tr("Self-signed certificate"));
+    QHBoxLayout *customHBox = new QHBoxLayout();
+    customHBox->setMargin(0);
+    QVBoxLayout *radioLayout = new QVBoxLayout();
+    QRadioButton *customSignature = new QRadioButton();
+    radioLayout->addWidget(customSignature);
+    radioLayout->addStretch(10);
+    customHBox->addLayout(radioLayout);
+    QFormLayout *customLayout = new QFormLayout();
+    customLayout->setMargin(0);
+    customLayout->setLabelAlignment(Qt::AlignRight);
+    Utils::PathChooser *signaturePath = new Utils::PathChooser();
+    signaturePath->setExpectedKind(Utils::PathChooser::File);
+    signaturePath->setPromptDialogTitle(tr("Choose certificate file (.cer)"));
+    customLayout->addRow(new QLabel(tr("Custom certificate:")), signaturePath);
+    Utils::PathChooser *keyPath = new Utils::PathChooser();
+    keyPath->setExpectedKind(Utils::PathChooser::File);
+    keyPath->setPromptDialogTitle(tr("Choose key file (.key / .pem)"));
+    customLayout->addRow(new QLabel(tr("Key file:")), keyPath);
+    customHBox->addLayout(customLayout);
+    customHBox->addStretch(10);
+    layout->addWidget(selfSign);
+    layout->addLayout(customHBox);
+    layout->addStretch(10);
+
+    switch (m_runConfiguration->signingMode()) {
+    case S60DeviceRunConfiguration::SignSelf:
+        selfSign->setChecked(true);
+        break;
+    case S60DeviceRunConfiguration::SignCustom:
+        customSignature->setChecked(true);
+        break;
+    }
+
+    signaturePath->setPath(m_runConfiguration->customSignaturePath());
+    keyPath->setPath(m_runConfiguration->customKeyPath());
+
+    connect(m_nameLineEdit, SIGNAL(textEdited(QString)),
+            this, SLOT(nameEdited(QString)));
+    connect(m_runConfiguration, SIGNAL(targetInformationChanged()),
+            this, SLOT(updateTargetInformation()));
+    connect(selfSign, SIGNAL(toggled(bool)), this, SLOT(selfSignToggled(bool)));
+    connect(customSignature, SIGNAL(toggled(bool)), this, SLOT(customSignatureToggled(bool)));
+    connect(signaturePath, SIGNAL(changed(QString)), this, SLOT(signaturePathChanged(QString)));
+    connect(keyPath, SIGNAL(changed(QString)), this, SLOT(keyPathChanged(QString)));
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::updateSerialDevices()
+{
+    m_serialPortsCombo->clear();
+    clearDeviceInfo();
+    const QString previousRunConfigurationPortName = m_runConfiguration->serialPortName();
+    const QList<CommunicationDevice> devices = S60Manager::instance()->serialDeviceLister()->communicationDevices();
+    int newIndex = -1;
+    for (int i = 0; i < devices.size(); ++i) {
+        const CommunicationDevice &device = devices.at(i);
+        m_serialPortsCombo->addItem(device.friendlyName, qVariantFromValue(device));
+        if (device.portName == previousRunConfigurationPortName)
+            newIndex = i;
+    }
+    // Set new index: prefer to keep old or set to 0, if available.
+    if (newIndex == -1 && !devices.empty())
+        newIndex = 0;
+    m_serialPortsCombo->setCurrentIndex(newIndex);
+    if (newIndex == -1) {
+        m_deviceInfoButton->setEnabled(false);
+        m_runConfiguration->setSerialPortName(QString());
+    } else {
+        m_deviceInfoButton->setEnabled(true);
+        const QString newPortName = device(newIndex).portName;
+        if (newPortName != previousRunConfigurationPortName)
+            m_runConfiguration->setSerialPortName(newPortName);
+    }
+}
+
+CommunicationDevice S60DeviceRunConfigurationWidget::device(int i) const
+{
+    if (i >= 0) {
+        const QVariant data = m_serialPortsCombo->itemData(i);
+        if (qVariantCanConvert<Qt4ProjectManager::Internal::CommunicationDevice>(data))
+            return qVariantValue<Qt4ProjectManager::Internal::CommunicationDevice>(data);
+    }
+    return CommunicationDevice(SerialPortCommunication);
+}
+
+CommunicationDevice S60DeviceRunConfigurationWidget::currentDevice() const
+{
+    return device(m_serialPortsCombo->currentIndex());
+}
+
+void S60DeviceRunConfigurationWidget::nameEdited(const QString &text)
+{
+    m_runConfiguration->setName(text);
+}
+
+void S60DeviceRunConfigurationWidget::updateTargetInformation()
+{
+    m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + QLatin1String(".sisx"));
+}
+
+void S60DeviceRunConfigurationWidget::setSerialPort(int index)
+{
+    const CommunicationDevice d = device(index);
+    m_runConfiguration->setSerialPortName(d.portName);
+    m_runConfiguration->setCommunicationType(d.type);
+    m_deviceInfoButton->setEnabled(index >= 0);
+    clearDeviceInfo();
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::selfSignToggled(bool toggle)
+{
+    if (toggle)
+        m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignSelf);
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::customSignatureToggled(bool toggle)
+{
+    if (toggle)
+        m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignCustom);
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::signaturePathChanged(const QString &path)
+{
+    m_runConfiguration->setCustomSignaturePath(path);
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::keyPathChanged(const QString &path)
+{
+    m_runConfiguration->setCustomKeyPath(path);
+    updateSummary();
+}
+
+void S60DeviceRunConfigurationWidget::updateSummary()
+{
+    //: Summary text of S60 device run configuration
+    const QString device = m_serialPortsCombo->currentIndex() != -1 ?
+                           m_serialPortsCombo->currentText() :
+                           tr("<No Device>");
+    const QString signature = m_runConfiguration->signingMode() == S60DeviceRunConfiguration::SignCustom ?
+                              tr("(custom certificate)") :
+                              tr("(self-signed certificate)");    
+    m_detailsWidget->setSummaryText(tr("Summary: Run on '%1' %2").arg(device, signature));
+}
+
+void S60DeviceRunConfigurationWidget::clearDeviceInfo()
+{
+    // Restore text & color
+    m_deviceInfoLabel->clear();
+    m_deviceInfoLabel->setStyleSheet(QString());
+}
+
+void S60DeviceRunConfigurationWidget::setDeviceInfoLabel(const QString &message, bool isError)
+{
+    m_deviceInfoLabel->setStyleSheet(isError ?
+                                     QString(QLatin1String("background-color: red;")) :
+                                     QString());
+    m_deviceInfoLabel->setText(message);
+    m_deviceInfoLabel->adjustSize();
+}
+
+void S60DeviceRunConfigurationWidget::updateDeviceInfo()
+{
+    QString message;
+    setDeviceInfoLabel(tr("Connecting..."));
+    const bool ok = getDeviceInfo(&message);
+    setDeviceInfoLabel(message, !ok);
+}
+
+bool S60DeviceRunConfigurationWidget::getDeviceInfo(QString *message)
+{
+    message->clear();
+    // Do a launcher run with the ping protocol. Instantiate launcher on heap
+    // as not to introduce delays when destructing a device with timeout
+    trk::Launcher *launcher = new trk::Launcher(trk::Launcher::ActionPingOnly, QSharedPointer<trk::TrkDevice>(), this);
+    const CommunicationDevice commDev = currentDevice();
+    launcher->setSerialFrame(commDev.type == SerialPortCommunication);
+    launcher->setTrkServerName(commDev.portName);
+    // Prompt the user to start
+    if (commDev.type == BlueToothCommunication) {
+        S60RunConfigBluetoothStarter starter(launcher->trkDevice());
+        starter.setDevice(launcher->trkServerName());
+        const trk::StartBluetoothGuiResult src = trk::startBluetoothGui(starter, this, message);
+        switch (src) {
+        case trk::BluetoothGuiConnected:
+            break;
+        case trk::BluetoothGuiCanceled:
+            launcher->deleteLater();
+            return true;
+        case trk::BluetoothGuiError:
+            launcher->deleteLater();
+            return false;
+        };
+    }
+    if (!launcher->startServer(message)) {
+        launcher->deleteLater();
+        return false;
+    }
+    // Set up event loop in the foreground with a timer to quit in case of  timeout.
+    QEventLoop eventLoop;
+    if (!m_infoTimeOutTimer) {
+        m_infoTimeOutTimer = new QTimer(this);
+        m_infoTimeOutTimer->setInterval(3000);
+        m_infoTimeOutTimer->setSingleShot(true);
+    }
+    connect(m_infoTimeOutTimer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
+    connect(launcher, SIGNAL(finished()), &eventLoop, SLOT(quit()));
+    // Go!
+    QApplication::setOverrideCursor(Qt::BusyCursor);
+    m_infoTimeOutTimer->start();
+    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+    m_infoTimeOutTimer->disconnect();
+    QApplication::restoreOverrideCursor();
+    // Anything received?
+    *message = launcher->deviceDescription();
+    launcher->deleteLater();
+    if (message->isEmpty()) {
+        *message = tr("A timeout occurred while querying the device. Check whether Trk is running");
+        return false;
+    }
+    return true;
+}
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..1863f5d5e5e0684f64a68f2e2c64c64e991be46a
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfigurationwidget.h
@@ -0,0 +1,97 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef S60DEVICERUNCONFIGURATIONWIDGET_H
+#define S60DEVICERUNCONFIGURATIONWIDGET_H
+
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+class QLabel;
+class QTimer;
+class QLineEdit;
+class QComboBox;
+class QToolButton;
+QT_END_NAMESPACE
+
+namespace Utils {
+    class DetailsWidget;
+}
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+struct CommunicationDevice;
+class S60DeviceRunConfiguration;
+
+/* Configuration widget for S60 devices on serial ports that are
+ * provided by the SerialDeviceLister class. Has an info/test
+ * button connecting to the device and showing info. */
+class S60DeviceRunConfigurationWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit S60DeviceRunConfigurationWidget(S60DeviceRunConfiguration *runConfiguration,
+                                      QWidget *parent = 0);
+
+private slots:
+    void nameEdited(const QString &text);
+    void updateTargetInformation();
+    void updateSerialDevices();
+    void setSerialPort(int index);
+    void selfSignToggled(bool toggle);
+    void customSignatureToggled(bool toggle);
+    void signaturePathChanged(const QString &path);
+    void keyPathChanged(const QString &path);
+    void updateSummary();
+    void updateDeviceInfo();
+    void clearDeviceInfo();
+
+private:
+    inline CommunicationDevice device(int i) const;
+    inline CommunicationDevice currentDevice() const;
+
+    bool getDeviceInfo(QString *message);
+    void setDeviceInfoLabel(const QString &message, bool isError = false);
+
+    S60DeviceRunConfiguration *m_runConfiguration;
+    Utils::DetailsWidget *m_detailsWidget;
+    QComboBox *m_serialPortsCombo;
+    QLineEdit *m_nameLineEdit;
+    QLabel *m_sisxFileLabel;
+    QToolButton *m_deviceInfoButton;
+    QLabel *m_deviceInfoDescriptionLabel;
+    QLabel *m_deviceInfoLabel;
+    QTimer *m_infoTimeOutTimer;
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // S60DEVICERUNCONFIGURATIONWIDGET_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
index 08343e58d5d07c845e10d43f5f840d3d2541d43a..a9aa6dceb58d548eac57c3e8cf7df448dcea1411 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
@@ -31,8 +31,11 @@
 
 #include <QtCore/QSettings>
 #include <QtCore/QXmlStreamReader>
+#include <QtCore/QTextStream>
 #include <QtCore/QFile>
 #include <QtCore/QDir>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
 
 namespace {
     const char * const SYMBIAN_SDKS_KEY = "HKEY_LOCAL_MACHINE\\Software\\Symbian\\EPOC SDKs";
@@ -47,17 +50,58 @@ namespace {
     const char * const DEVICE_TOOLSROOT = "toolsroot";
 }
 
-using namespace Qt4ProjectManager::Internal;
+namespace Qt4ProjectManager {
+namespace Internal {
+
+S60Devices::Device::Device() :
+    isDefault(false)
+{
+}
+
+QString S60Devices::Device::toHtml() const
+{
+    QString rc;
+    QTextStream str(&rc);
+    str << "<html><body><table>"
+            << "<tr><td><b>" << QCoreApplication::translate("Qt4ProjectManager::Internal::S60Devices::Device", "Id:")
+            << "</b></td><td>" << id << "</td></tr>"
+            << "<tr><td><b>" << QCoreApplication::translate("Qt4ProjectManager::Internal::S60Devices::Device", "Name:")
+            << "</b></td><td>" << name << "</td></tr>"
+            << "<tr><td><b>" << QCoreApplication::translate("Qt4ProjectManager::Internal::S60Devices::Device", "EPOC:")
+            << "</b></td><td>" << epocRoot << "</td></tr>"
+            << "<tr><td><b>" << QCoreApplication::translate("Qt4ProjectManager::Internal::S60Devices::Device", "Tools:")
+            << "</b></td><td>" << toolsRoot << "</td></tr>"
+            << "<tr><td><b>" << QCoreApplication::translate("Qt4ProjectManager::Internal::S60Devices::Device", "Qt:")
+            << "</b></td><td>" << qt << "</td></tr>";
+    return rc;
+}
 
 S60Devices::S60Devices(QObject *parent)
         : QObject(parent)
 {
 }
 
+bool S60Devices::readLinux()
+{
+    m_errorString = QLatin1String("not implemented.");
+    return false;
+}
+
 bool S60Devices::read()
 {
     m_devices.clear();
-    m_errorString = QString();
+    m_errorString.clear();
+#ifdef Q_OS_WIN
+    return readWin();
+#else
+    return readLinux();
+#endif
+}
+
+// Windows EPOC
+
+bool S60Devices::readWin()
+{
     // Check the windows registry via QSettings for devices.xml path
     QSettings settings(SYMBIAN_SDKS_KEY, QSettings::NativeFormat);
     QString devicesXmlPath = settings.value(SYMBIAN_PATH_KEY).toString();
@@ -180,3 +224,22 @@ QString S60Devices::cleanedRootPath(const QString &deviceRoot)
     }
     return path;
 }
+
+QDebug operator<<(QDebug db, const S60Devices::Device &d)
+{
+    QDebug nospace = db.nospace();
+    nospace << "id='" << d.id << "' name='" << d.name << "' default="
+            << d.isDefault << " Epoc='" << d.epocRoot << "' tools='"
+            << d.toolsRoot << "' Qt='" << d.qt << '\'';
+    return db;
+}
+
+QDebug operator<<(QDebug dbg, const S60Devices &d)
+{
+    foreach(const S60Devices::Device &device, d.devices())
+        dbg << device;
+    return dbg;
+}
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devices.h b/src/plugins/qt4projectmanager/qt-s60/s60devices.h
index cb57aac8a1bfe75a8230c19abcbaa87e65a7e60e..839fd32967a8896ec5714ba1e18f81e8d900ff41 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devices.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devices.h
@@ -34,6 +34,10 @@
 #include <QtCore/QString>
 #include <QtCore/QList>
 
+QT_BEGIN_NAMESPACE
+class QDebug;
+QT_END_NAMESPACE
+
 namespace Qt4ProjectManager {
 namespace Internal {
 
@@ -42,6 +46,9 @@ class S60Devices : public QObject
     Q_OBJECT
 public:
     struct Device {
+        Device();
+        QString toHtml() const;
+
         QString id;
         QString name;
         bool isDefault;
@@ -62,10 +69,15 @@ signals:
     void qtVersionsChanged();
 
 private:
+    bool readLinux();
+    bool readWin();
     QString m_errorString;
     QList<Device> m_devices;
 };
 
+QDebug operator<<(QDebug dbg, const S60Devices::Device &d);
+QDebug operator<<(QDebug dbg, const S60Devices &d);
+
 } // namespace Internal
 } // namespace Qt4ProjectManager
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
index f9a4f216e2dc8692a76ae4144daeddb3e58b8d8a..81023915f0267dc830aec2d25c244359c3cc0f95 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicespreferencepane.cpp
@@ -64,8 +64,13 @@ void S60DevicesWidget::updateDevicesList()
     QList<S60Devices::Device> devices = m_devices->devices();
     m_ui->list->clear();
     foreach (const S60Devices::Device &device, devices) {
-        m_ui->list->addTopLevelItem(new QTreeWidgetItem(QStringList() << device.epocRoot
-          << (device.qt.isEmpty()?tr("No Qt installed"):device.qt)));
+        QStringList columns;
+        columns << device.epocRoot << (device.qt.isEmpty()?tr("No Qt installed"):device.qt);
+        QTreeWidgetItem *item = new QTreeWidgetItem(columns);
+        const QString tooltip = device.toHtml();
+        item->setToolTip(0, tooltip);
+        item->setToolTip(1, tooltip);
+        m_ui->list->addTopLevelItem(item);
     }
 }
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
index aeabbebc24b2464f464147be24917544e837b869..b1c65fa0e926273cce012300e9c7f20dce4580ea 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp
@@ -38,10 +38,14 @@
 #include <coreplugin/icore.h>
 #include <coreplugin/messagemanager.h>
 #include <utils/qtcassert.h>
+#include <utils/detailswidget.h>
 #include <projectexplorer/projectexplorerconstants.h>
 #include <projectexplorer/project.h>
 #include <projectexplorer/persistentsettings.h>
 
+#include <QtGui/QLabel>
+#include <QtGui/QLineEdit>
+
 using namespace ProjectExplorer;
 using namespace Qt4ProjectManager::Internal;
 
@@ -175,24 +179,34 @@ void S60EmulatorRunConfiguration::invalidateCachedTargetInformation()
 S60EmulatorRunConfigurationWidget::S60EmulatorRunConfigurationWidget(S60EmulatorRunConfiguration *runConfiguration,
                                                                      QWidget *parent)
     : QWidget(parent),
-    m_runConfiguration(runConfiguration)
+    m_runConfiguration(runConfiguration),
+    m_detailsWidget(new Utils::DetailsWidget),
+    m_nameLineEdit(new QLineEdit(m_runConfiguration->name())),
+    m_executableLabel(new QLabel(m_runConfiguration->executable()))
 {
-    QFormLayout *toplayout = new QFormLayout();
-    toplayout->setMargin(0);
-    setLayout(toplayout);
+    QVBoxLayout *mainBoxLayout = new QVBoxLayout();
+    mainBoxLayout->setMargin(0);
+    setLayout(mainBoxLayout);
+    mainBoxLayout->addWidget(m_detailsWidget);
+    QWidget *detailsContainer = new QWidget;
+    m_detailsWidget->setWidget(detailsContainer);
+
+    QFormLayout *detailsFormLayout = new QFormLayout();
+    detailsFormLayout->setMargin(0);
+    detailsContainer->setLayout(detailsFormLayout);
 
     QLabel *nameLabel = new QLabel(tr("Name:"));
-    m_nameLineEdit = new QLineEdit(m_runConfiguration->name());
+
     nameLabel->setBuddy(m_nameLineEdit);
-    toplayout->addRow(nameLabel, m_nameLineEdit);
+    detailsFormLayout->addRow(nameLabel, m_nameLineEdit);
 
-    m_executableLabel = new QLabel(m_runConfiguration->executable());
-    toplayout->addRow(tr("Executable:"), m_executableLabel);
+    detailsFormLayout->addRow(tr("Executable:"), m_executableLabel);
 
     connect(m_nameLineEdit, SIGNAL(textEdited(QString)),
         this, SLOT(nameEdited(QString)));
     connect(m_runConfiguration, SIGNAL(targetInformationChanged()),
             this, SLOT(updateTargetInformation()));
+    updateSummary();
 }
 
 void S60EmulatorRunConfigurationWidget::nameEdited(const QString &text)
@@ -205,6 +219,11 @@ void S60EmulatorRunConfigurationWidget::updateTargetInformation()
     m_executableLabel->setText(m_runConfiguration->executable());
 }
 
+void S60EmulatorRunConfigurationWidget::updateSummary()
+{
+    m_detailsWidget->setSummaryText(tr("Summary: Run %1 in emulator").arg(m_runConfiguration->executable()));
+}
+
 // ======== S60EmulatorRunConfigurationFactory
 
 S60EmulatorRunConfigurationFactory::S60EmulatorRunConfigurationFactory(QObject *parent)
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
index 1682478d95a234789994d7574b9eb56a9db35be9..8ba0aeded4d6a9a5ee533cfa9f74a0ff514c17a2 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h
@@ -34,8 +34,15 @@
 #include <projectexplorer/applicationlauncher.h>
 
 #include <QtGui/QWidget>
-#include <QtGui/QLabel>
-#include <QtGui/QLineEdit>
+
+QT_BEGIN_NAMESPACE
+class QLabel;
+class QLineEdit;
+QT_END_NAMESPACE
+
+namespace Utils {
+    class DetailsWidget;
+}
 
 namespace Qt4ProjectManager {
 namespace Internal {
@@ -79,9 +86,11 @@ public:
 private slots:
     void nameEdited(const QString &text);
     void updateTargetInformation();
+    void updateSummary();
 
 private:
     S60EmulatorRunConfiguration *m_runConfiguration;
+    Utils::DetailsWidget *m_detailsWidget;
     QLineEdit *m_nameLineEdit;
     QLabel *m_executableLabel;
 };
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1481dcacbc9d755e803a511a0a208a3e4f7c5cec
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.cpp
@@ -0,0 +1,53 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "s60runconfigbluetoothstarter.h"
+#include "bluetoothlistener.h"
+
+#include <coreplugin/icore.h>
+#include <coreplugin/messagemanager.h>
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+S60RunConfigBluetoothStarter::S60RunConfigBluetoothStarter(const  TrkDevicePtr& trkDevice, QObject *parent) :
+    trk::AbstractBluetoothStarter(trkDevice, parent)
+{
+}
+
+trk::BluetoothListener *S60RunConfigBluetoothStarter::createListener()
+{
+    Core::ICore *core = Core::ICore::instance();
+    trk::BluetoothListener *rc = new trk::BluetoothListener(core);
+    rc->setMode(trk::BluetoothListener::Listen);
+    connect(rc, SIGNAL(message(QString)), core->messageManager(), SLOT(printToOutputPane(QString)));
+    return rc;
+}
+} // namespace Internal
+} // namespace Qt4ProjectManager
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h
new file mode 100644
index 0000000000000000000000000000000000000000..0da8817b323dc445c18eebdbc1c93adb1a7cd415
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/s60runconfigbluetoothstarter.h
@@ -0,0 +1,53 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef S60RUNCONFIGBLUETOOTHSTARTER_H
+#define S60RUNCONFIGBLUETOOTHSTARTER_H
+
+#include "communicationstarter.h"
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+/* S60RunConfigBluetoothStarter: Creates a listener in 'Listen' mode
+ * parented on the Qt Creator core which outputs to the message manager. */
+
+class S60RunConfigBluetoothStarter : public trk::AbstractBluetoothStarter
+{
+public:
+    explicit S60RunConfigBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0);
+
+protected:
+    virtual trk::BluetoothListener *createListener();
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // S60RUNCONFIGBLUETOOTHSTARTER_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp
index a1a0b7b8592af0a75d8a583c10fa4c1be413232c..35e2b64254ecc1f84ba7893db96dd90e33d64dff 100644
--- a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp
@@ -31,6 +31,7 @@
 
 #include <QtCore/QSettings>
 #include <QtCore/QStringList>
+#include <QtCore/QFileInfo>
 #include <QtGui/QApplication>
 #include <QtGui/QWidget>
 #include <QtDebug>
@@ -42,6 +43,17 @@ namespace {
     const char * const USBSER = "Services/usbser/Enum";
 }
 
+const char *SerialDeviceLister::linuxBlueToothDeviceRootC = "/dev/rfcomm";
+
+CommunicationDevice::CommunicationDevice(DeviceCommunicationType t,
+                                         const QString &p,
+                                         const QString &f) :
+    portName(p),
+    friendlyName(f),
+    type(t)
+{
+}
+
 SerialDeviceLister::SerialDeviceLister(QObject *parent)
         : QObject(parent),
         m_initialized(false)
@@ -53,18 +65,18 @@ SerialDeviceLister::~SerialDeviceLister()
 {
 }
 
-QList<SerialDeviceLister::SerialDevice> SerialDeviceLister::serialDevices() const
+QList<CommunicationDevice> SerialDeviceLister::communicationDevices() const
 {
     if (!m_initialized) {
         updateSilently();
         m_initialized = true;
     }
-    return m_devices;
+    return m_devices2;
 }
 
 QString SerialDeviceLister::friendlyNameForPort(const QString &port) const
 {
-    foreach (const SerialDevice &device, m_devices) {
+    foreach (const CommunicationDevice &device, m_devices2) {
         if (device.portName == port)
             return device.friendlyName;
     }
@@ -79,19 +91,44 @@ void SerialDeviceLister::update()
 
 void SerialDeviceLister::updateSilently() const
 {
-    m_devices.clear();
+    m_devices2 = serialPorts() + blueToothDevices();
+}
+
+QList<CommunicationDevice> SerialDeviceLister::serialPorts() const
+{
+    QList<CommunicationDevice> rc;
 #ifdef Q_OS_WIN32
     QSettings registry(REGKEY_CURRENT_CONTROL_SET, QSettings::NativeFormat);
-    int count = registry.value(QString::fromLatin1("%1/Count").arg(USBSER)).toInt();
+    const int count = registry.value(QString::fromLatin1("%1/Count").arg(USBSER)).toInt();
     for (int i = 0; i < count; ++i) {
         QString driver = registry.value(QString::fromLatin1("%1/%2").arg(USBSER).arg(i)).toString();
         if (driver.contains("JAVACOMM")) {
             driver.replace('\\', '/');
-            SerialDeviceLister::SerialDevice device;
+            CommunicationDevice device(SerialPortCommunication);
             device.friendlyName = registry.value(QString::fromLatin1("Enum/%1/FriendlyName").arg(driver)).toString();
             device.portName = registry.value(QString::fromLatin1("Enum/%1/Device Parameters/PortName").arg(driver)).toString();
-            m_devices.append(device);
+            rc.append(device);
+        }
+    }
+#endif
+    return rc;
+}
+
+QList<CommunicationDevice> SerialDeviceLister::blueToothDevices() const
+{
+    QList<CommunicationDevice> rc;
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
+    // Bluetooth devices are created on connection. List the existing ones
+    // or at least the first one.
+    const QString prefix = QLatin1String(linuxBlueToothDeviceRootC);
+    const QString friendlyFormat = QLatin1String("Bluetooth device (%1)");
+    for (int d = 0; d < 4; d++) {
+        CommunicationDevice device(BlueToothCommunication, prefix + QString::number(d));
+        if (d == 0 || QFileInfo(device.portName).exists()) {            
+            device.friendlyName = friendlyFormat.arg(device.portName);
+            rc.push_back(device);
         }
     }
 #endif
+    return rc;
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h
index f2f71842c69babfc83260d0d93d0cebe8f8c6099..b1fb65507ce79d55661badefcc2b0e9ebd8430a8 100644
--- a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h
+++ b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h
@@ -30,32 +30,36 @@
 #ifndef SERIALDEVICELISTER_H
 #define SERIALDEVICELISTER_H
 
-#include <QtCore/QAbstractEventDispatcher>
-#include <QtCore/QList>
 #include <QtCore/QObject>
-#include <QtCore/QString>
-
-//#ifdef Q_OS_WIN32
-//#include <windows.h>
-//#include <dbt.h>
-//#endif
 
 namespace Qt4ProjectManager {
 namespace Internal {
 
+enum DeviceCommunicationType {
+    SerialPortCommunication = 0,
+    BlueToothCommunication = 1
+};
+
+struct CommunicationDevice {
+    explicit CommunicationDevice(DeviceCommunicationType type = SerialPortCommunication,
+                                 const QString &portName = QString(),
+                                 const QString &friendlyName = QString());
+    QString portName;
+    QString friendlyName;
+    DeviceCommunicationType type;
+};
+
 class SerialDeviceLister : public QObject
 {
     Q_OBJECT
 public:
+    static const char *linuxBlueToothDeviceRootC;
 
-    struct SerialDevice {
-        QString portName;
-        QString friendlyName;
-    };
-
-    SerialDeviceLister(QObject *parent = 0);
+    explicit SerialDeviceLister(QObject *parent = 0);
     ~SerialDeviceLister();
-    QList<SerialDevice> serialDevices() const;
+
+    QList<CommunicationDevice> communicationDevices() const;
+
     QString friendlyNameForPort(const QString &port) const;
 
 public slots:
@@ -66,9 +70,11 @@ signals:
 
 private:
     void updateSilently() const;
+    QList<CommunicationDevice> serialPorts() const;
+    QList<CommunicationDevice> blueToothDevices() const;
 
     mutable bool m_initialized;
-    mutable QList<SerialDevice> m_devices;
+    mutable QList<CommunicationDevice> m_devices2;
 };
 
 } // Internal
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 38639719eb07ef0555f2c181ed30215f679ad071..ac2f0cfe949b66a608424f02be8ec030019ec928 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -293,7 +293,7 @@ void QtVersionManager::addNewVersionsFromInstaller()
     foreach (QString newVersion, newVersionsList) {
         QStringList newVersionData = newVersion.split('=');
         if (newVersionData.count()>=2) {
-            if (QDir(newVersionData[1]).exists()) {
+            if (QFile::exists(newVersionData[1])) {
                 QtVersion *version = new QtVersion(newVersionData[0], newVersionData[1], m_idcount++ );
                 if (newVersionData.count() >= 3)
                     version->setMingwDirectory(newVersionData[2]);
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h
index 3b8b81fb04dc46390a7c2c65059664121543f28d..cb26e49c13cba89bcec63d8ef20198bb13dc01c1 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.h
+++ b/src/plugins/qt4projectmanager/qtversionmanager.h
@@ -52,12 +52,12 @@ class QtVersion
 {
     friend class QtVersionManager;
 public:
-    QtVersion(const QString &name, const QString &path,
+    QtVersion(const QString &name, const QString &qmakeCommand,
               bool isAutodetected = false, const QString &autodetectionSource = QString());
 
     QtVersion(const QString &path, bool isAutodetected = false, const QString &autodetectionSource = QString());
 
-    QtVersion(const QString &name, const QString &path, int id,
+    QtVersion(const QString &name, const QString &qmakeCommand, int id,
               bool isAutodetected = false, const QString &autodetectionSource = QString());
     QtVersion();
     ~QtVersion();
diff --git a/src/plugins/qtscripteditor/parser/javascript.g b/src/plugins/qtscripteditor/parser/javascript.g
index e75ee1cf7ed99624899e74dcaf7456e72a323d9a..927175edc42968bded85498f24fde9a698618b73 100644
--- a/src/plugins/qtscripteditor/parser/javascript.g
+++ b/src/plugins/qtscripteditor/parser/javascript.g
@@ -1,18 +1,20 @@
-----------------------------------------------------------------------------
+---------------------------------------------------------------------------
+--
+-- This file is part of Qt Creator
+--
+-- Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 --
--- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 -- Contact: Nokia Corporation (qt-info@nokia.com)
 --
--- This file is part of the QtScript module of the Qt Toolkit.
+-- Commercial Usage
 --
--- $QT_BEGIN_LICENSE:LGPL$
--- No Commercial Usage
--- This file contains pre-release code and may not be distributed.
--- You may use this file in accordance with the terms and conditions
--- contained in the either Technology Preview License Agreement or the
--- Beta Release License Agreement.
+-- Licensees holding valid Qt Commercial licenses may use this file in
+-- accordance with the Qt Commercial License Agreement provided with the
+-- Software or, alternatively, in accordance with the terms contained in
+-- a written agreement between you and Nokia.
 --
 -- GNU Lesser General Public License Usage
+--
 -- Alternatively, this file may be used under the terms of the GNU Lesser
 -- General Public License version 2.1 as published by the Free Software
 -- Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,27 +22,10 @@
 -- ensure the GNU Lesser General Public License version 2.1 requirements
 -- will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 --
--- In addition, as a special exception, Nokia gives you certain
--- additional rights. These rights are described in the Nokia Qt LGPL
--- Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
--- package.
---
--- GNU General Public License Usage
--- Alternatively, this file may be used under the terms of the GNU
--- General Public License version 3.0 as published by the Free Software
--- Foundation and appearing in the file LICENSE.GPL included in the
--- packaging of this file.  Please review the following information to
--- ensure the GNU General Public License version 3.0 requirements will be
--- met: http://www.gnu.org/copyleft/gpl.html.
---
 -- If you are unsure which license is appropriate for your use, please
 -- contact the sales department at http://qt.nokia.com/contact.
--- $QT_END_LICENSE$
 --
--- This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
--- WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
---
-----------------------------------------------------------------------------
+---------------------------------------------------------------------------
 
 %parser         JavaScriptGrammar
 %decl           javascriptparser_p.h
@@ -82,21 +67,23 @@
 %start Program
 
 /.
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -104,37 +91,25 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#include <QtCore/QtDebug>
-
+**************************************************************************/
 
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
 
+#include <QtCore/QtDebug>
 #include <string.h>
-
-
 #include "javascriptengine_p.h"
-
-
-
-
 #include "javascriptlexer_p.h"
 #include "javascriptast_p.h"
 #include "javascriptnodepool_p.h"
@@ -149,21 +124,23 @@
 ./
 
 /:
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -171,24 +148,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 //
 //  W A R N I N G
@@ -210,9 +173,6 @@
 #define JAVASCRIPTPARSER_P_H
 
 #include "javascriptgrammar_p.h"
-
-
-
 #include "javascriptastfwd_p.h"
 #include <QtCore/QList>
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptast.cpp b/src/plugins/qtscripteditor/parser/javascriptast.cpp
index 19c9e0af43e33d0176287092cef19f7998fa3db8..d109d09e4a6abf5b8511fc1773def20a6a96a42f 100644
--- a/src/plugins/qtscripteditor/parser/javascriptast.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptast.cpp
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,29 +22,12 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 #include "javascriptast_p.h"
-
-
-
 #include "javascriptastvisitor_p.h"
 
 QT_BEGIN_NAMESPACE
diff --git a/src/plugins/qtscripteditor/parser/javascriptast_p.h b/src/plugins/qtscripteditor/parser/javascriptast_p.h
index 0aaaeb332cbcb86d1a335702e117c68cdb69018b..eb12f899cff8e4e9baecd2023a42438c2351870f 100644
--- a/src/plugins/qtscripteditor/parser/javascriptast_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptast_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,27 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#ifndef JAVASCRIPTAST_P_H
-#define JAVASCRIPTAST_P_H
+**************************************************************************/
 
 //
 //  W A R N I N G
@@ -53,10 +38,10 @@
 // We mean it.
 //
 
-#include <QtCore/QString>
-
-
+#ifndef JAVASCRIPTAST_P_H
+#define JAVASCRIPTAST_P_H
 
+#include <QtCore/QString>
 #include "javascriptastvisitor_p.h"
 
 QT_BEGIN_NAMESPACE
diff --git a/src/plugins/qtscripteditor/parser/javascriptastfwd_p.h b/src/plugins/qtscripteditor/parser/javascriptastfwd_p.h
index 27a24bf74361664f3b14db294aaee19a50795a1c..2c3a5955b9dfd626bf0e4b5ddf59e0b79acf9495 100644
--- a/src/plugins/qtscripteditor/parser/javascriptastfwd_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptastfwd_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,29 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#ifndef JAVASCRIPTAST_FWD_P_H
-#define JAVASCRIPTAST_FWD_P_H
-
-#include <QtCore/qglobal.h>
+**************************************************************************/
 
 //
 //  W A R N I N G
@@ -55,6 +38,11 @@
 // We mean it.
 //
 
+#ifndef JAVASCRIPTAST_FWD_P_H
+#define JAVASCRIPTAST_FWD_P_H
+
+#include <QtCore/qglobal.h>
+
 QT_BEGIN_NAMESPACE
 
 namespace JavaScript { namespace AST {
diff --git a/src/plugins/qtscripteditor/parser/javascriptastvisitor.cpp b/src/plugins/qtscripteditor/parser/javascriptastvisitor.cpp
index 5fbfc53d47b62a08bb98a5edddc9b3cc5384449c..47e1ba4225a1cc77cb4e2a50f919f99a5d5b572a 100644
--- a/src/plugins/qtscripteditor/parser/javascriptastvisitor.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptastvisitor.cpp
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,24 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 #include "javascriptastvisitor_p.h"
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptastvisitor_p.h b/src/plugins/qtscripteditor/parser/javascriptastvisitor_p.h
index aa924bc24c4dba07c9c6a480e1976d947ad2771a..df6f8bd6a7d1f85801ef9dd2581acfbcd03fb57b 100644
--- a/src/plugins/qtscripteditor/parser/javascriptastvisitor_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptastvisitor_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,24 +22,21 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
 
 #ifndef JAVASCRIPTASTVISITOR_P_H
 #define JAVASCRIPTASTVISITOR_P_H
diff --git a/src/plugins/qtscripteditor/parser/javascriptengine_p.h b/src/plugins/qtscripteditor/parser/javascriptengine_p.h
index 42418741a75b07c071eec052703853236b2bea1e..15232f288d36d9ed6cb637916075d687f858cee6 100644
--- a/src/plugins/qtscripteditor/parser/javascriptengine_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptengine_p.h
@@ -27,6 +27,22 @@
 **
 **************************************************************************/
 
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+//
+// This file is automatically generated from javascript.g.
+// Changes will be lost.
+//
+
 #ifndef JAVASCRIPTENGINE_P_H
 #define JAVASCRIPTENGINE_P_H
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptgrammar.cpp b/src/plugins/qtscripteditor/parser/javascriptgrammar.cpp
index aaa8cd092b584fa1473d2ee18dcb802d3a1f3696..aca84c8b2e70ce13c5f3f535679c94c973b27697 100644
--- a/src/plugins/qtscripteditor/parser/javascriptgrammar.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptgrammar.cpp
@@ -1,20 +1,21 @@
 // This file was generated by qlalr - DO NOT EDIT!
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtCore module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,23 +23,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
 **
-****************************************************************************/
+**************************************************************************/
 
 #include "javascriptgrammar_p.h"
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptgrammar_p.h b/src/plugins/qtscripteditor/parser/javascriptgrammar_p.h
index 3126ed08cf10cbc015684457fe4a3a3796b42bba..ed797cfa601b7f652913ac35757b97c55273bf1b 100644
--- a/src/plugins/qtscripteditor/parser/javascriptgrammar_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptgrammar_p.h
@@ -1,20 +1,20 @@
-// This file was generated by qlalr - DO NOT EDIT!
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtCore module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,30 +22,17 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
 **
-****************************************************************************/
+**************************************************************************/
 
 //
 //  W A R N I N G
 //  -------------
 //
-// This file is not part of the Qt API.  It exists for the convenience
-// of other Qt classes.  This header file may change from version to
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
 // version without notice, or even be removed.
 //
 // We mean it.
diff --git a/src/plugins/qtscripteditor/parser/javascriptlexer.cpp b/src/plugins/qtscripteditor/parser/javascriptlexer.cpp
index 51fa3ebfb11435eb7f8e96e79c66dafa9e76f3b0..6f0220d4fcd77c65e7d8a5c18f27953540708c4a 100644
--- a/src/plugins/qtscripteditor/parser/javascriptlexer.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptlexer.cpp
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,37 +22,12 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+**************************************************************************/
 
 #include "javascriptengine_p.h"
-
-
-
-
-
-
-
 #include "javascriptlexer_p.h"
 #include "javascriptgrammar_p.h"
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptlexer_p.h b/src/plugins/qtscripteditor/parser/javascriptlexer_p.h
index d6d5f7f819e65e9081061cfbbe7f3dfe491f29c0..406620bb3eab559742ca7d6dd4b70187b4953611 100644
--- a/src/plugins/qtscripteditor/parser/javascriptlexer_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptlexer_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,27 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#ifndef JAVASCRIPTLEXER_P_H
-#define JAVASCRIPTLEXER_P_H
+**************************************************************************/
 
 //
 //  W A R N I N G
@@ -53,6 +38,14 @@
 // We mean it.
 //
 
+//
+// This file is automatically generated from javascript.g.
+// Changes will be lost.
+//
+
+#ifndef JAVASCRIPTLEXER_P_H
+#define JAVASCRIPTLEXER_P_H
+
 #include <QtCore/QString>
 
 
diff --git a/src/plugins/qtscripteditor/parser/javascriptmemorypool_p.h b/src/plugins/qtscripteditor/parser/javascriptmemorypool_p.h
index 429b74def71bd84d82f564d7b11334500f2bf281..c58e2dc90e4d05d2f07d836ecdb13dfc5c0db8c9 100644
--- a/src/plugins/qtscripteditor/parser/javascriptmemorypool_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptmemorypool_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,24 +22,26 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+//
+// This file is automatically generated from javascript.g.
+// Changes will be lost.
+//
 
 #ifndef JAVASCRIPTMEMORYPOOL_P_H
 #define JAVASCRIPTMEMORYPOOL_P_H
diff --git a/src/plugins/qtscripteditor/parser/javascriptnodepool_p.h b/src/plugins/qtscripteditor/parser/javascriptnodepool_p.h
index d974ff017836cee15817e3edd8d0bc99d570bda4..1b7242e29c9b326af2a4218ac933441ef80b6e6b 100644
--- a/src/plugins/qtscripteditor/parser/javascriptnodepool_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptnodepool_p.h
@@ -1,18 +1,20 @@
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -20,27 +22,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
-
-#ifndef JAVASCRIPTNODEPOOL_P_H
-#define JAVASCRIPTNODEPOOL_P_H
+**************************************************************************/
 
 //
 //  W A R N I N G
@@ -53,6 +38,14 @@
 // We mean it.
 //
 
+//
+// This file is automatically generated from javascript.g.
+// Changes will be lost.
+//
+
+#ifndef JAVASCRIPTNODEPOOL_P_H
+#define JAVASCRIPTNODEPOOL_P_H
+
 #include <QtCore/QHash>
 #include <QtCore/QString>
 
@@ -116,17 +109,11 @@ public:
 
     inline QString fileName() const { return m_fileName; }
     inline JavaScriptEnginePrivate *engine() const { return m_engine; }
-#ifndef J_SCRIPT_NO_EVENT_NOTIFY
-    inline qint64 id() const { return m_id; }
-#endif
 
 private:
     QHash<AST::Node*, Code*> m_codeCache;
     QString m_fileName;
     JavaScriptEnginePrivate *m_engine;
-#ifndef J_SCRIPT_NO_EVENT_NOTIFY
-    qint64 m_id;
-#endif
 
 private:
     Q_DISABLE_COPY(NodePool)
diff --git a/src/plugins/qtscripteditor/parser/javascriptparser.cpp b/src/plugins/qtscripteditor/parser/javascriptparser.cpp
index b63a9fbe93a1d4063d7594c9763f28db0cbd1754..295969a11d819c08f9c84c51d59e5a4b2cde6a6e 100644
--- a/src/plugins/qtscripteditor/parser/javascriptparser.cpp
+++ b/src/plugins/qtscripteditor/parser/javascriptparser.cpp
@@ -1,20 +1,20 @@
-// This file was generated by qlalr - DO NOT EDIT!
-
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,37 +22,14 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 #include <QtCore/QtDebug>
-
-
-
 #include <string.h>
-
-
 #include "javascriptengine_p.h"
-
-
-
-
 #include "javascriptlexer_p.h"
 #include "javascriptast_p.h"
 #include "javascriptnodepool_p.h"
diff --git a/src/plugins/qtscripteditor/parser/javascriptparser_p.h b/src/plugins/qtscripteditor/parser/javascriptparser_p.h
index d6929710e107296fab183d039a9eda3c887503af..29c54927d65cf388e62d2abe967ff130632f2c84 100644
--- a/src/plugins/qtscripteditor/parser/javascriptparser_p.h
+++ b/src/plugins/qtscripteditor/parser/javascriptparser_p.h
@@ -1,20 +1,22 @@
 // This file was generated by qlalr - DO NOT EDIT!
 
-/****************************************************************************
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
-** This file is part of the QtScript module of the Qt Toolkit.
+** Commercial Usage
 **
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
 **
 ** GNU Lesser General Public License Usage
+**
 ** Alternatively, this file may be used under the terms of the GNU Lesser
 ** General Public License version 2.1 as published by the Free Software
 ** Foundation and appearing in the file LICENSE.LGPL included in the
@@ -22,24 +24,10 @@
 ** ensure the GNU Lesser General Public License version 2.1 requirements
 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 **
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
 ** If you are unsure which license is appropriate for your use, please
 ** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
 **
-****************************************************************************/
+**************************************************************************/
 
 //
 //  W A R N I N G
diff --git a/src/plugins/qtscripteditor/parser/javascriptvalue.h b/src/plugins/qtscripteditor/parser/javascriptvalue.h
index c68b817b9fc2d9eb305ba4741af744df0f2fd4a9..715cedf3c4a06acd2a519245506c145b6f76831d 100644
--- a/src/plugins/qtscripteditor/parser/javascriptvalue.h
+++ b/src/plugins/qtscripteditor/parser/javascriptvalue.h
@@ -1,3 +1,32 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
 #ifndef JAVASCRIPTVALUE_H
 #define JAVASCRIPTVALUE_H
 
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 05a78b08322ea48c6d3b0191ee7acd6d2c49fd7b..6dced425a735871183e06aa5a701605f9c8eaffd 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -64,6 +64,7 @@ class List: public Managed
 
 public:
     List()
+        : value(_Tp()), next(0)
     { }
 
     _Tp value;
diff --git a/src/shared/cplusplus/LiteralTable.h b/src/shared/cplusplus/LiteralTable.h
index 29de643002daba3bbc4d4fff3bf9f219711e8fb1..52816a5682eb166d5d258143b61393121d00b803 100644
--- a/src/shared/cplusplus/LiteralTable.h
+++ b/src/shared/cplusplus/LiteralTable.h
@@ -175,8 +175,6 @@ protected:
     }
 
 protected:
-    MemoryPool *_pool;
-
     _Literal **_literals;
     int _allocatedLiterals;
     int _literalCount;
diff --git a/src/shared/cplusplus/MemoryPool.cpp b/src/shared/cplusplus/MemoryPool.cpp
index 2002a6543504d58dc8828e149bc128e3e2b74774..1453c62cd694e079ab2d71275bb7928f7b7ee9b3 100644
--- a/src/shared/cplusplus/MemoryPool.cpp
+++ b/src/shared/cplusplus/MemoryPool.cpp
@@ -110,6 +110,19 @@ void *MemoryPool::allocate_helper(size_t size)
     return addr;
 }
 
+MemoryPool::State MemoryPool::state() const
+{ return State(ptr, _blockCount); }
+
+void MemoryPool::rewind(const State &state)
+{
+    if (_blockCount == state.blockCount && state.ptr < ptr) {
+        if (_initializeAllocatedMemory)
+            memset(state.ptr, '\0', ptr - state.ptr);
+
+        ptr = state.ptr;
+    }
+}
+
 Managed::Managed()
 { }
 
diff --git a/src/shared/cplusplus/MemoryPool.h b/src/shared/cplusplus/MemoryPool.h
index e0f1ff870170c179e8246679e55e2eac1c50c76c..5b6fae925ff42a1da1d68162f9906dbfd5bcf022 100644
--- a/src/shared/cplusplus/MemoryPool.h
+++ b/src/shared/cplusplus/MemoryPool.h
@@ -79,6 +79,22 @@ public:
         return allocate_helper(size);
     }
 
+    struct State
+    {
+        char *ptr;
+        char *end;
+        int blockCount;
+
+        inline bool isValid() const
+        { return ptr != 0; }
+
+        inline State(char *ptr = 0, int blockCount = 0)
+            : ptr(ptr), blockCount(blockCount) {}
+    };
+
+    State state() const;
+    void rewind(const State &state);
+
 private:
     void *allocate_helper(size_t size);
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 8f3bd549ce490ed864df5074c5ff3c939bede71e..835b2c11c8940423d5006ed9aa25e3cdc2542df4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -88,6 +88,30 @@ int DebugRule::depth = 0;
 #  define DEBUG_THIS_RULE() do {} while (0)
 #endif
 
+class Parser::Rewind
+{
+    Parser *_parser;
+    MemoryPool::State _state;
+
+public:
+    inline Rewind(Parser *parser)
+        : _parser(parser) {}
+
+    inline void operator()(unsigned tokenIndex)
+    { rewind(tokenIndex); }
+
+    inline void mark()
+    { _state = _parser->_pool->state(); }
+
+    inline void rewind(unsigned tokenIndex)
+    {
+        _parser->rewind(tokenIndex);
+
+        if (_state.isValid())
+            _parser->_pool->rewind(_state);
+    }
+};
+
 Parser::Parser(TranslationUnit *unit)
     : _translationUnit(unit),
       _control(_translationUnit->control()),
@@ -302,6 +326,9 @@ bool Parser::parseClassOrNamespaceName(NameAST *&node)
 bool Parser::parseTemplateId(NameAST *&node)
 {
     DEBUG_THIS_RULE();
+
+    const unsigned start = cursor();
+
     if (LA() == T_IDENTIFIER && LA(2) == T_LESS) {
         TemplateIdAST *ast = new (_pool) TemplateIdAST;
         ast->identifier_token = consumeToken();
@@ -315,6 +342,9 @@ bool Parser::parseTemplateId(NameAST *&node)
             }
         }
     }
+
+    rewind(start);
+
     return false;
 }
 
@@ -660,8 +690,27 @@ bool Parser::parseOperatorFunctionId(NameAST *&node)
     return true;
 }
 
+Parser::TemplateArgumentListEntry *Parser::templateArgumentListEntry(unsigned tokenIndex)
+{
+    for (unsigned i = 0; i < _templateArgumentList.size(); ++i) {
+        TemplateArgumentListEntry *entry = &_templateArgumentList[i];
+        if (entry->index == tokenIndex)
+            return entry;
+    }
+
+    return 0;
+}
+
 bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node)
 {
+    if (TemplateArgumentListEntry *entry = templateArgumentListEntry(cursor())) {
+        rewind(entry->cursor);
+        node = entry->ast;
+        return entry->ast != 0;
+    }
+
+    unsigned start = cursor();
+
     DEBUG_THIS_RULE();
     TemplateArgumentListAST **template_argument_ptr = &node;
     ExpressionAST *template_argument = 0;
@@ -679,8 +728,13 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node)
                 template_argument_ptr = &(*template_argument_ptr)->next;
             }
         }
+
+        _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), node));
         return true;
     }
+
+    _templateArgumentList.push_back(TemplateArgumentListEntry(start, cursor(), 0));
+
     return false;
 }
 
@@ -4541,6 +4595,7 @@ bool Parser::parseObjCMethodDefinitionList(DeclarationListAST *&node)
                 last->next = new (_pool) ObjCSynthesizedPropertyListAST;
                 last = last->next;
 
+                last->synthesized_property = new (_pool) ObjCSynthesizedPropertyAST;
                 match(T_IDENTIFIER, &(last->synthesized_property->property_identifier));
 
                 if (LA() == T_EQUAL) {
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 3ca3371d815956cbbe47ced8f091a0010b89194e..d9ccf6ab4903c1e944727dc3a10b51748bc2f802 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -54,7 +54,6 @@
 #include "Token.h"
 #include "TranslationUnit.h"
 
-
 namespace CPlusPlus {
 
 class CPLUSPLUS_EXPORT Parser
@@ -287,6 +286,17 @@ private:
     inline void rewind(unsigned cursor)
     { _tokenIndex = cursor; }
 
+    struct TemplateArgumentListEntry {
+        unsigned index;
+        unsigned cursor;
+        TemplateArgumentListAST *ast;
+
+        TemplateArgumentListEntry(unsigned index = 0, unsigned cursor = 0, TemplateArgumentListAST *ast = 0)
+            : index(index), cursor(cursor), ast(ast) {}
+    };
+
+    TemplateArgumentListEntry *templateArgumentListEntry(unsigned tokenIndex);
+
 private:
     TranslationUnit *_translationUnit;
     Control *_control;
@@ -298,6 +308,11 @@ private:
     bool _inFunctionBody: 1;
     bool _inObjCImplementationContext: 1;
 
+    Array<TemplateArgumentListEntry> _templateArgumentList;
+
+    class Rewind;
+    friend class Rewind;
+
 private:
     Parser(const Parser& source);
     void operator =(const Parser& source);
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index aa15735410f7b2fb68bfd76bb39c97eb4360f7a5..8ddaf3ef5dd76772be46f497a16c370c52becf37 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -589,6 +589,7 @@ void ObjCBaseProtocol::visitSymbol0(SymbolVisitor *visitor)
 
 ObjCClass::ObjCClass(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name):
         ScopedSymbol(translationUnit, sourceLocation, name),
+        _isInterface(false),
         _categoryName(0),
         _baseClass(0)
 {
diff --git a/src/shared/trk/bluetoothlistener.cpp b/src/shared/trk/bluetoothlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f5ccbe51b43474c605a62bde85a86b5d870c58e
--- /dev/null
+++ b/src/shared/trk/bluetoothlistener.cpp
@@ -0,0 +1,212 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "bluetoothlistener.h"
+#include "trkdevice.h"
+
+#include <QtCore/QDebug>
+
+#ifdef Q_OS_UNIX
+#   include <unistd.h>
+#   include <signal.h>
+#else
+#   include <windows.h>
+#endif
+
+// Process id helpers.
+#ifdef Q_OS_WIN
+inline DWORD processId(const QProcess &p)
+{
+    if (const Q_PID processInfoStruct = p.pid())
+        return processInfoStruct->dwProcessId;
+    return 0;
+}
+#else
+inline Q_PID processId(const QProcess &p)
+{
+    return p.pid();
+}
+#endif
+
+
+enum { debug = 0 };
+
+namespace trk {
+
+struct BluetoothListenerPrivate {
+    BluetoothListenerPrivate();
+    QString device;
+    QProcess process;
+#ifdef Q_OS_WIN
+    DWORD pid;
+#else
+    Q_PID pid;
+#endif
+    bool printConsoleMessages;
+    BluetoothListener::Mode mode;
+};
+
+BluetoothListenerPrivate::BluetoothListenerPrivate() :
+    pid(0),
+    printConsoleMessages(false),
+    mode(BluetoothListener::Listen)
+{
+}
+
+BluetoothListener::BluetoothListener(QObject *parent) :
+    QObject(parent),
+    d(new BluetoothListenerPrivate)
+{
+    d->process.setProcessChannelMode(QProcess::MergedChannels);
+
+    connect(&d->process, SIGNAL(readyReadStandardError()),
+            this, SLOT(slotStdError()));
+    connect(&d->process, SIGNAL(readyReadStandardOutput()),
+            this, SLOT(slotStdOutput()));
+    connect(&d->process, SIGNAL(finished(int, QProcess::ExitStatus)),
+            this, SLOT(slotProcessFinished(int,QProcess::ExitStatus)));
+    connect(&d->process, SIGNAL(error(QProcess::ProcessError)),
+            this, SLOT(slotProcessError(QProcess::ProcessError)));
+}
+
+BluetoothListener::~BluetoothListener()
+{
+    const int trc = terminateProcess();
+    if (debug)
+        qDebug() << "~BluetoothListener: terminated" << trc;
+    delete d;
+}
+
+BluetoothListener::Mode BluetoothListener::mode() const
+{
+    return d->mode;
+}
+
+void BluetoothListener::setMode(Mode m)
+{
+    d->mode = m;
+}
+
+bool BluetoothListener::printConsoleMessages() const
+{
+    return d->printConsoleMessages;
+}
+
+void BluetoothListener::setPrintConsoleMessages(bool p)
+{
+    d->printConsoleMessages = p;
+}
+
+int BluetoothListener::terminateProcess()
+{
+    enum { TimeOutMS = 200 };
+    if (debug)
+        qDebug() << "terminateProcess" << d->process.pid() << d->process.state();
+    if (d->process.state() == QProcess::NotRunning)
+        return -1;
+    emitMessage(tr("%1: Stopping listener %2...").arg(d->device).arg(processId(d->process)));
+    // When listening, the process should terminate by itself after closing the connection
+    if (mode() == Listen && d->process.waitForFinished(TimeOutMS))
+        return 0;
+#ifdef Q_OS_UNIX
+    kill(d->process.pid(), SIGHUP); // Listens for SIGHUP
+    if (d->process.waitForFinished(TimeOutMS))
+        return 1;
+#endif
+    d->process.terminate();
+    if (d->process.waitForFinished(TimeOutMS))
+        return 2;
+    d->process.kill();
+    return 3;
+}
+
+bool BluetoothListener::start(const QString &device, QString *errorMessage)
+{
+    if (d->process.state() != QProcess::NotRunning) {
+        *errorMessage = QLatin1String("Internal error: Still running.");
+        return false;
+    }
+    d->device = device;
+    const QString binary = QLatin1String("rfcomm");
+    QStringList arguments;
+    arguments << QLatin1String("-r")
+              << (d->mode == Listen ? QLatin1String("listen") : QLatin1String("watch"))
+              << device << QString(QLatin1Char('1'));
+    if (debug)
+        qDebug() << binary << arguments;
+    emitMessage(tr("%1: Starting Bluetooth listener %2...").arg(device, binary));
+    d->pid = 0;
+    d->process.start(binary, arguments);
+    if (!d->process.waitForStarted()) {
+        *errorMessage = tr("Unable to run '%1': %2").arg(binary, d->process.errorString());
+        return false;
+    }
+    d->pid = processId(d->process); // Forgets it after crash/termination
+    emitMessage(tr("%1: Bluetooth listener running (%2).").arg(device).arg(processId(d->process)));
+    return true;
+}
+
+void BluetoothListener::slotStdOutput()        
+{
+    emitMessage(QString::fromLocal8Bit(d->process.readAllStandardOutput()));
+}
+
+void BluetoothListener::emitMessage(const QString &m)
+{
+    if (d->printConsoleMessages || debug)
+        qDebug("%s\n", qPrintable(m));
+    emit message(m);
+}
+
+void BluetoothListener::slotStdError()
+{
+    emitMessage(QString::fromLocal8Bit(d->process.readAllStandardError()));
+}
+
+void BluetoothListener::slotProcessFinished(int ex, QProcess::ExitStatus state)
+{
+    switch (state) {
+    case QProcess::NormalExit:
+        emitMessage(tr("%1: Process %2 terminated with exit code %3.")
+                    .arg(d->device).arg(d->pid).arg(ex));
+        break;
+    case QProcess::CrashExit:
+        emitMessage(tr("%1: Process %2 crashed.").arg(d->device).arg(d->pid));
+        break;
+    }
+    emit terminated();
+}
+
+void BluetoothListener::slotProcessError(QProcess::ProcessError error)
+{
+    emitMessage(tr("%1: Process error %2: %3")
+        .arg(d->device).arg(error).arg(d->process.errorString()));
+}
+
+} // namespace trk
diff --git a/src/shared/trk/bluetoothlistener.h b/src/shared/trk/bluetoothlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..a20ba3075349d4f5afb0a78cfb497f35b29a26f7
--- /dev/null
+++ b/src/shared/trk/bluetoothlistener.h
@@ -0,0 +1,89 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef BLUETOOTHLISTENER_H
+#define BLUETOOTHLISTENER_H
+
+#include <QtCore/QObject>
+#include <QtCore/QProcess>
+
+namespace trk {
+struct BluetoothListenerPrivate;
+
+/* BluetoothListener: Starts a helper process watching connections on a
+ * Bluetooth device, Linux only:
+ * The rfcomm command is used. It process can be started in the background
+ * while connection attempts (TrkDevice::open()) are made in the foreground. */
+
+class BluetoothListener : public QObject
+{
+    Q_OBJECT
+    Q_DISABLE_COPY(BluetoothListener)
+public:
+    // The Mode property must be set before calling start().
+    enum Mode {
+        Listen, /* Terminate after client closed (read: Trk app
+                 * on the phone terminated or disconnected).*/
+        Watch   // Keep running, watch for next connection from client
+    };
+
+    explicit BluetoothListener(QObject *parent = 0);
+    virtual ~BluetoothListener();
+
+    Mode mode() const;
+    void setMode(Mode m);
+
+    bool start(const QString &device, QString *errorMessage);
+
+    // Print messages on the console.
+    bool printConsoleMessages() const;
+    void setPrintConsoleMessages(bool p);
+
+signals:
+    void terminated();
+    void message(const QString &);
+
+public slots:
+    void emitMessage(const QString &m); // accessed by starter
+
+private slots:
+    void slotStdOutput();
+    void slotStdError();
+    void slotProcessFinished(int, QProcess::ExitStatus);
+    void slotProcessError(QProcess::ProcessError error);
+
+private:
+    int terminateProcess();
+
+    BluetoothListenerPrivate *d;
+};
+
+} // namespace trk
+
+#endif // BLUETOOTHLISTENER_H
diff --git a/src/shared/trk/bluetoothlistener_gui.cpp b/src/shared/trk/bluetoothlistener_gui.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ee21c82a7c5c6b2850bef35954b33fac682e969e
--- /dev/null
+++ b/src/shared/trk/bluetoothlistener_gui.cpp
@@ -0,0 +1,75 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "bluetoothlistener_gui.h"
+#include "bluetoothlistener.h"
+#include "communicationstarter.h"
+
+#include <QtGui/QMessageBox>
+#include <QtGui/QPushButton>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+
+namespace trk {
+
+StartBluetoothGuiResult
+    startBluetoothGui(AbstractBluetoothStarter &starter,
+                      QWidget *msgBoxParent,
+                      QString *errorMessage)
+{
+    errorMessage->clear();
+    switch (starter.start()) {
+    case AbstractBluetoothStarter::Started:
+        break;
+    case AbstractBluetoothStarter::ConnectionSucceeded:
+        return BluetoothGuiConnected;
+    case AbstractBluetoothStarter::StartError:
+        *errorMessage = starter.errorString();
+        return BluetoothGuiError;
+    }
+    // Run the starter with the event loop of a message box, close it
+    // with the finished signals.
+    const QString title = QCoreApplication::translate("trk::startBluetoothGui", "Waiting for Bluetooth Connection");
+    const QString message = QCoreApplication::translate("trk::startBluetoothGui", "Connecting to %1...").arg(starter.device());
+    QMessageBox messageBox(QMessageBox::Information, title, message, QMessageBox::Cancel, msgBoxParent);
+    QObject::connect(&starter, SIGNAL(connected()), &messageBox, SLOT(close()));
+    QObject::connect(&starter, SIGNAL(timeout()), &messageBox, SLOT(close()));
+    messageBox.exec();
+    // Only starter.state() is reliable here.
+    if (starter.state() == AbstractBluetoothStarter::Running) {
+        *errorMessage = QCoreApplication::translate("trk::startBluetoothGui", "Connection on %1 canceled.").arg(starter.device());
+        return BluetoothGuiCanceled;
+    }
+    if (starter.state() != AbstractBluetoothStarter::Connected) {
+        *errorMessage = starter.errorString();
+        return BluetoothGuiError;
+    }
+    return BluetoothGuiConnected;
+}
+} // namespace trk
diff --git a/src/shared/trk/bluetoothlistener_gui.h b/src/shared/trk/bluetoothlistener_gui.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a7c57e291ae53ec7d3bdf53fcac0e4b4cb60d26
--- /dev/null
+++ b/src/shared/trk/bluetoothlistener_gui.h
@@ -0,0 +1,58 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef BLUETOOTHLISTENER_GUI_H
+#define BLUETOOTHLISTENER_GUI_H
+
+#include <QtCore/QtGlobal>
+
+QT_BEGIN_NAMESPACE
+class QWidget;
+QT_END_NAMESPACE
+
+namespace trk {
+    class AbstractBluetoothStarter;
+
+    /* startBluetoothGui(): Prompt the user to start a Bluetooth
+     * connection with a message box he can cancel. Pass in
+     * the starter with device and parameters set up.  */
+
+    enum StartBluetoothGuiResult {
+        BluetoothGuiConnected,
+        BluetoothGuiCanceled,
+        BluetoothGuiError
+    };
+
+    StartBluetoothGuiResult
+        startBluetoothGui(AbstractBluetoothStarter &starter,
+                          QWidget *msgBoxParent,
+                          QString *errorMessage);
+} // namespace trk
+
+#endif // BLUETOOTHLISTENER_GUI_H
diff --git a/src/shared/trk/communicationstarter.cpp b/src/shared/trk/communicationstarter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..58a954cd26be473bbb535d1654f7e59fcf57efab
--- /dev/null
+++ b/src/shared/trk/communicationstarter.cpp
@@ -0,0 +1,228 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "communicationstarter.h"
+#include "bluetoothlistener.h"
+#include "trkdevice.h"
+
+#include <QtCore/QTimer>
+#include <QtCore/QEventLoop>
+
+namespace trk {
+// --------------- AbstractBluetoothStarter
+struct AbstractBluetoothStarterPrivate {
+    explicit AbstractBluetoothStarterPrivate(const AbstractBluetoothStarter::TrkDevicePtr &d);
+
+    const AbstractBluetoothStarter::TrkDevicePtr trkDevice;
+    BluetoothListener *listener;
+    QTimer *timer;
+    int intervalMS;
+    int attempts;
+    int n;
+    QString device;
+    QString errorString;
+    AbstractBluetoothStarter::State state;
+};
+
+AbstractBluetoothStarterPrivate::AbstractBluetoothStarterPrivate(const AbstractBluetoothStarter::TrkDevicePtr &d) :
+
+        trkDevice(d),
+        listener(0),
+        timer(0),
+        intervalMS(1000),
+        attempts(-1),
+        n(0),
+        device(QLatin1String("/dev/rfcomm0")),
+        state(AbstractBluetoothStarter::TimedOut)
+{
+}
+
+AbstractBluetoothStarter::AbstractBluetoothStarter(const TrkDevicePtr &trkDevice, QObject *parent) :
+        QObject(parent),
+        d(new AbstractBluetoothStarterPrivate(trkDevice))
+{
+}
+
+AbstractBluetoothStarter::~AbstractBluetoothStarter()
+{
+    stopTimer();
+    delete d;
+}
+
+void AbstractBluetoothStarter::stopTimer()
+{
+    if (d->timer && d->timer->isActive())
+        d->timer->stop();
+}
+
+AbstractBluetoothStarter::StartResult AbstractBluetoothStarter::start()
+{
+    if (state() == Running) {
+        d->errorString = QLatin1String("Internal error, attempt to re-start AbstractBluetoothStarter.\n");
+        return StartError;
+    }
+    // Before we instantiate timers, and such, try to open the device,
+    // which should succeed if another listener is already running in
+    // 'Watch' mode
+    if (d->trkDevice->open(d->device , &(d->errorString)))
+        return ConnectionSucceeded;
+    // Fire up the listener
+    d->n = 0;
+    d->listener = createListener();
+    if (!d->listener->start(d->device, &(d->errorString)))
+        return StartError;
+    // Start timer
+    if (!d->timer) {
+        d->timer = new QTimer;
+        connect(d->timer, SIGNAL(timeout()), this, SLOT(slotTimer()));
+    }
+    d->timer->setInterval(d->intervalMS);
+    d->timer->setSingleShot(false);
+    d->timer->start();
+    d->state = Running;
+    return Started;
+}
+
+AbstractBluetoothStarter::State AbstractBluetoothStarter::state() const
+{
+    return d->state;
+}
+
+int AbstractBluetoothStarter::intervalMS() const
+{
+    return d->intervalMS;
+}
+
+void AbstractBluetoothStarter::setIntervalMS(int i)
+{
+    d->intervalMS = i;
+    if (d->timer)
+        d->timer->setInterval(i);
+}
+
+int AbstractBluetoothStarter::attempts() const
+{
+    return d->attempts;
+}
+
+void AbstractBluetoothStarter::setAttempts(int a)
+{
+    d->attempts = a;
+}
+
+QString AbstractBluetoothStarter::device() const
+{
+    return d->device;
+}
+
+void AbstractBluetoothStarter::setDevice(const QString &dv)
+{
+    d->device = dv;
+}
+
+QString AbstractBluetoothStarter::errorString() const
+{
+    return d->errorString;
+}
+
+void AbstractBluetoothStarter::slotTimer()
+{
+    ++d->n;
+    // Check for timeout
+    if (d->attempts >= 0 && d->n >= d->attempts) {
+        stopTimer();
+        d->errorString = tr("%1: timed out after %n attempts using an interval of %2ms.", 0, d->n)
+                         .arg(d->device).arg(d->intervalMS);
+        d->state = TimedOut;
+        emit timeout();
+    } else {
+        // Attempt n to connect?
+        if (d->trkDevice->open(d->device , &(d->errorString))) {
+            stopTimer();
+            const QString msg = tr("%1: Connection attempt %2 succeeded.").arg(d->device).arg(d->n);
+            d->listener->emitMessage(msg);
+            d->state = Connected;
+            emit connected();
+        } else {
+            const QString msg = tr("%1: Connection attempt %2 failed: %3 (retrying)...")
+                                .arg(d->device).arg(d->n).arg(d->errorString);
+            d->listener->emitMessage(msg);
+        }
+    }
+}
+
+// -------- ConsoleBluetoothStarter
+ConsoleBluetoothStarter::ConsoleBluetoothStarter(const TrkDevicePtr &trkDevice,
+                                                 QObject *listenerParent,
+                                                 QObject *parent) :
+AbstractBluetoothStarter(trkDevice, parent),
+m_listenerParent(listenerParent)
+{
+}
+
+BluetoothListener *ConsoleBluetoothStarter::createListener()
+{
+    BluetoothListener *rc = new BluetoothListener(m_listenerParent);
+    rc->setMode(BluetoothListener::Listen);
+    rc->setPrintConsoleMessages(true);
+    return rc;
+}
+
+bool ConsoleBluetoothStarter::startBluetooth(const TrkDevicePtr &trkDevice,
+                                             QObject *listenerParent,
+                                             const QString &device,
+                                             int attempts,
+                                             QString *errorMessage)
+{
+    // Set up a console starter to print to stdout.
+    ConsoleBluetoothStarter starter(trkDevice, listenerParent);
+    starter.setDevice(device);
+    starter.setAttempts(attempts);
+    switch (starter.start()) {
+    case Started:
+        break;
+    case ConnectionSucceeded:
+        return true;
+    case StartError:
+        *errorMessage = starter.errorString();
+        return false;
+    }
+    // Run the starter with an event loop. @ToDo: Implement
+    // some asynchronous keypress read to cancel.
+    QEventLoop eventLoop;
+    connect(&starter, SIGNAL(connected()), &eventLoop, SLOT(quit()));
+    connect(&starter, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
+    eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+    if (starter.state() != AbstractBluetoothStarter::Connected) {
+        *errorMessage = starter.errorString();
+        return false;
+    }
+    return true;
+}
+} // namespace trk
diff --git a/src/shared/trk/communicationstarter.h b/src/shared/trk/communicationstarter.h
new file mode 100644
index 0000000000000000000000000000000000000000..e90578dc1717989610e86fcd6e94fef8b3fffa07
--- /dev/null
+++ b/src/shared/trk/communicationstarter.h
@@ -0,0 +1,125 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef COMMUNICATIONSTARTER_H
+#define COMMUNICATIONSTARTER_H
+
+#include <QtCore/QSharedPointer>
+#include <QtCore/QObject>
+
+namespace trk {
+class TrkDevice;
+class BluetoothListener;
+struct AbstractBluetoothStarterPrivate;
+
+/* AbstractBluetoothStarter: Repeatedly tries to open a trk device
+ * until a connection succeeds, allowing to do something else in the
+ * foreground (local event loop or asynchronous operation).
+ * Note that in case a Listener is already running in watch mode, it might
+ * also happen that connection succeeds immediately.
+ * Implementations must provide a factory function that creates and sets up the
+ * listener (mode, message connection, etc). */
+
+class AbstractBluetoothStarter : public QObject {
+    Q_OBJECT
+    Q_DISABLE_COPY(AbstractBluetoothStarter)
+public:
+            typedef QSharedPointer<TrkDevice> TrkDevicePtr;
+
+    enum State { Running, Connected, TimedOut };
+
+    virtual ~AbstractBluetoothStarter();
+
+    int intervalMS() const;
+    void setIntervalMS(int i);
+
+    int attempts() const;
+    void setAttempts(int a);
+
+    QString device() const;
+    void setDevice(const QString &);
+
+    State state() const;
+    QString errorString() const;
+
+    enum StartResult {
+        Started,               // Starter is now running.
+        ConnectionSucceeded,   /* Initial connection attempt succeeded,
+                                * no need to keep running. */
+        StartError             // Error occurred during start.
+    };
+
+    StartResult start();
+
+signals:
+    void connected();
+    void timeout();
+
+private slots:
+    void slotTimer();
+
+protected:
+    explicit AbstractBluetoothStarter(const TrkDevicePtr& trkDevice, QObject *parent = 0);
+    // Overwrite to create and parametrize the listener.
+    virtual BluetoothListener *createListener() = 0;
+
+private:
+    inline void stopTimer();
+
+    AbstractBluetoothStarterPrivate *d;
+};
+
+/* ConsoleBluetoothStarter: Convenience class for console processes. Creates a
+ * listener in "Listen" mode with the messages redirected to standard output. */
+
+class ConsoleBluetoothStarter : public AbstractBluetoothStarter {
+    Q_OBJECT
+    Q_DISABLE_COPY(ConsoleBluetoothStarter)
+public:
+
+            static bool startBluetooth(const TrkDevicePtr& trkDevice,
+                                       QObject *listenerParent,
+                                       const QString &device,
+                                       int attempts,
+                                       QString *errorMessage);
+
+protected:
+    virtual BluetoothListener *createListener();
+
+private:
+    explicit ConsoleBluetoothStarter(const TrkDevicePtr& trkDevice,
+                                     QObject *listenerParent,
+                                     QObject *parent = 0);
+
+    QObject *m_listenerParent;
+};
+
+} // namespace trk
+
+#endif // COMMUNICATIONSTARTER_H
diff --git a/src/shared/trk/launcher.cpp b/src/shared/trk/launcher.cpp
index 08af4a215359f409423ac4bcde93d3b9bc744b16..f066ab4864fac3ff5799e4ba9aeb9ec2f0d72f0f 100644
--- a/src/shared/trk/launcher.cpp
+++ b/src/shared/trk/launcher.cpp
@@ -30,6 +30,7 @@
 #include "launcher.h"
 #include "trkutils.h"
 #include "trkdevice.h"
+#include "bluetoothlistener.h"
 
 #include <QtCore/QTimer>
 #include <QtCore/QDateTime>
@@ -50,8 +51,9 @@ struct LauncherPrivate {
         int position;
     };
 
-    LauncherPrivate();
-    TrkDevice m_device;
+    explicit LauncherPrivate(const TrkDevicePtr &d);
+
+    TrkDevicePtr m_device;
     QString m_trkServerName;
     QByteArray m_trkReadBuffer;
 
@@ -65,20 +67,28 @@ struct LauncherPrivate {
     int m_verbose;
     Launcher::Actions m_startupActions;
     bool m_connected;
+    bool m_closeDevice;
 };
 
-LauncherPrivate::LauncherPrivate() :
+LauncherPrivate::LauncherPrivate(const TrkDevicePtr &d) :
+    m_device(d),
     m_verbose(0),
-    m_connected(false)
+    m_connected(false),
+    m_closeDevice(true)
 {
+    if (m_device.isNull())
+        m_device = TrkDevicePtr(new TrkDevice);
 }
 
-Launcher::Launcher(Actions startupActions) :
-    d(new LauncherPrivate)
+Launcher::Launcher(Actions startupActions,
+                   const TrkDevicePtr &dev,
+                   QObject *parent) :
+    QObject(parent),
+    d(new LauncherPrivate(dev))
 {
     d->m_startupActions = startupActions;
-    connect(&d->m_device, SIGNAL(messageReceived(trk::TrkResult)), this, SLOT(handleResult(trk::TrkResult)));
-    connect(this, SIGNAL(finished()), &d->m_device, SLOT(close()));
+    connect(d->m_device.data(), SIGNAL(messageReceived(trk::TrkResult)), this, SLOT(handleResult(trk::TrkResult)));    
+    connect(this, SIGNAL(finished()), d->m_device.data(), SLOT(close()));
 }
 
 Launcher::~Launcher()
@@ -97,6 +107,16 @@ void Launcher::setTrkServerName(const QString &name)
     d->m_trkServerName = name;
 }
 
+QString Launcher::trkServerName() const
+{
+    return d->m_trkServerName;
+}
+
+TrkDevicePtr Launcher::trkDevice() const
+{
+    return d->m_device;
+}
+
 void Launcher::setFileName(const QString &name)
 {
     d->m_fileName = name;
@@ -115,16 +135,28 @@ void Launcher::setInstallFileName(const QString &name)
 
 void Launcher::setSerialFrame(bool b)
 {
-    d->m_device.setSerialFrame(b);
+    d->m_device->setSerialFrame(b);
 }
 
 bool Launcher::serialFrame() const
 {
-    return d->m_device.serialFrame();
+    return d->m_device->serialFrame();
+}
+
+
+bool Launcher::closeDevice() const
+{
+    return d->m_closeDevice;
+}
+
+void Launcher::setCloseDevice(bool c)
+{
+    d->m_closeDevice = c;
 }
 
 bool Launcher::startServer(QString *errorMessage)
 {
+    errorMessage->clear();
     if (d->m_verbose) {
         const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Package=%3 Remote Package=%4 Install file=%5")
                             .arg(d->m_trkServerName, d->m_fileName, d->m_copyState.sourceFileName, d->m_copyState.destinationFileName, d->m_installFileName);
@@ -147,15 +179,21 @@ bool Launcher::startServer(QString *errorMessage)
         qWarning("No remote executable given for running.");
         return false;
     }
-    if (!d->m_device.open(d->m_trkServerName, errorMessage))
+    if (!d->m_device->isOpen() && !d->m_device->open(d->m_trkServerName, errorMessage))
         return false;
-    d->m_device.sendTrkInitialPing();
-    d->m_device.sendTrkMessage(TrkDisconnect); // Disconnect, as trk might be still connected
-    d->m_device.sendTrkMessage(TrkSupported, TrkCallback(this, &Launcher::handleSupportMask));
-    d->m_device.sendTrkMessage(TrkCpuType, TrkCallback(this, &Launcher::handleCpuType));
-    d->m_device.sendTrkMessage(TrkVersions, TrkCallback(this, &Launcher::handleTrkVersion));
+    if (d->m_closeDevice) {
+        connect(this, SIGNAL(finished()), d->m_device.data(), SLOT(close()));
+    } else {
+        disconnect(this, SIGNAL(finished()), d->m_device.data(), 0);
+    }
+
+    d->m_device->sendTrkInitialPing();
+    d->m_device->sendTrkMessage(TrkDisconnect); // Disconnect, as trk might be still connected
+    d->m_device->sendTrkMessage(TrkSupported, TrkCallback(this, &Launcher::handleSupportMask));
+    d->m_device->sendTrkMessage(TrkCpuType, TrkCallback(this, &Launcher::handleCpuType));
+    d->m_device->sendTrkMessage(TrkVersions, TrkCallback(this, &Launcher::handleTrkVersion));
     if (d->m_startupActions != ActionPingOnly)
-        d->m_device.sendTrkMessage(TrkConnect, TrkCallback(this, &Launcher::handleConnect));
+        d->m_device->sendTrkMessage(TrkConnect, TrkCallback(this, &Launcher::handleConnect));
     return true;
 }
 
@@ -177,7 +215,7 @@ void Launcher::handleConnect(const TrkResult &result)
 void Launcher::setVerbose(int v)
 {
     d->m_verbose = v;
-    d->m_device.setVerbose(v);
+    d->m_device->setVerbose(v);
 }
 
 void Launcher::logMessage(const QString &msg)
@@ -192,7 +230,7 @@ void Launcher::terminate()
         QByteArray ba;
         appendShort(&ba, 0x0000, TargetByteOrder);
         appendInt(&ba, d->m_session.pid, TargetByteOrder);
-        d->m_device.sendTrkMessage(TrkDeleteItem, TrkCallback(this, &Launcher::handleRemoteProcessKilled), ba);
+        d->m_device->sendTrkMessage(TrkDeleteItem, TrkCallback(this, &Launcher::handleRemoteProcessKilled), ba);
     } else if (d->m_connected) {
         if (d->m_copyState.copyFileHandle)
             closeRemoteFile(true);
@@ -234,17 +272,17 @@ void Launcher::handleResult(const TrkResult &result)
 //            uint pid = extractInt(data + 4); // ProcessID: 4 bytes;
 //            uint tid = extractInt(data + 8); // ThreadID: 4 bytes
             //logMessage(prefix << "      ADDR: " << addr << " PID: " << pid << " TID: " << tid);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
         case TrkNotifyException: { // Notify Exception (obsolete)
             logMessage(prefix + "NOTE: EXCEPTION  " + str);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
         case TrkNotifyInternalError: { //
             logMessage(prefix + "NOTE: INTERNAL ERROR: " + str);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
 
@@ -277,8 +315,8 @@ void Launcher::handleResult(const TrkResult &result)
                 break;
             QByteArray ba;
             ba.append(result.data.mid(2, 8));
-            d->m_device.sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");
-            //d->m_device.sendTrkAck(result.token)
+            d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");
+            //d->m_device->sendTrkAck(result.token)
             break;
         }
         case TrkNotifyDeleted: { // NotifyDeleted
@@ -288,7 +326,7 @@ void Launcher::handleResult(const TrkResult &result)
             logMessage(QString::fromLatin1("%1 %2 UNLOAD: %3").
                        arg(QString::fromAscii(prefix)).arg(itemType ? QLatin1String("LIB") : QLatin1String("PROCESS")).
                        arg(name));
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             if (itemType == 0 // process
                 && result.data.size() >= 10
                 && d->m_session.pid == extractInt(result.data.data() + 6)) {
@@ -298,17 +336,17 @@ void Launcher::handleResult(const TrkResult &result)
         }
         case TrkNotifyProcessorStarted: { // NotifyProcessorStarted
             logMessage(prefix + "NOTE: PROCESSOR STARTED: " + str);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
         case TrkNotifyProcessorStandBy: { // NotifyProcessorStandby
             logMessage(prefix + "NOTE: PROCESSOR STANDBY: " + str);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
         case TrkNotifyProcessorReset: { // NotifyProcessorReset
             logMessage(prefix + "NOTE: PROCESSOR RESET: " + str);
-            d->m_device.sendTrkAck(result.token);
+            d->m_device->sendTrkAck(result.token);
             break;
         }
         default: {
@@ -318,6 +356,11 @@ void Launcher::handleResult(const TrkResult &result)
     }
 }
 
+QString Launcher::deviceDescription(unsigned verbose) const
+{
+    return d->m_session.deviceDescription(verbose);
+}
+
 void Launcher::handleTrkVersion(const TrkResult &result)
 {
     if (result.errorCode() || result.data.size() < 5) {
@@ -325,19 +368,13 @@ void Launcher::handleTrkVersion(const TrkResult &result)
             emit finished();
         return;
     }
-    const int trkMajor = result.data.at(1);
-    const int trkMinor = result.data.at(2);
-    const int protocolMajor = result.data.at(3);
-    const int protocolMinor = result.data.at(4);
+    d->m_session.trkAppVersion.trkMajor = result.data.at(1);
+    d->m_session.trkAppVersion.trkMinor = result.data.at(2);
+    d->m_session.trkAppVersion.protocolMajor = result.data.at(3);
+    d->m_session.trkAppVersion.protocolMinor = result.data.at(4);
     // Ping mode: Log & Terminate
     if (d->m_startupActions == ActionPingOnly) {
-        QString msg;
-        QTextStream(&msg) << "CPU: " << d->m_session.cpuMajor << '.' << d->m_session.cpuMinor << ' '
-                << (d->m_session.bigEndian ? "big endian" : "little endian")
-                << " type size: " << d->m_session.defaultTypeSize
-                << " float size: " << d->m_session.fpTypeSize
-                << " Trk: v" << trkMajor << '.' << trkMinor << " Protocol: " << protocolMajor << '.' << protocolMinor;
-        qWarning("%s", qPrintable(msg));
+        qWarning("%s", qPrintable(deviceDescription()));
         emit finished();
     }
 }
@@ -384,7 +421,7 @@ void Launcher::continueCopying(uint lastCopiedBlockSize)
         QByteArray ba;
         appendInt(&ba, d->m_copyState.copyFileHandle, TargetByteOrder);
         appendString(&ba, d->m_copyState.data->mid(d->m_copyState.position, 2048), TargetByteOrder, false);
-        d->m_device.sendTrkMessage(TrkWriteFile, TrkCallback(this, &Launcher::handleCopy), ba);
+        d->m_device->sendTrkMessage(TrkWriteFile, TrkCallback(this, &Launcher::handleCopy), ba);
     } else {
         closeRemoteFile();
     }
@@ -395,7 +432,7 @@ void Launcher::closeRemoteFile(bool failed)
     QByteArray ba;
     appendInt(&ba, d->m_copyState.copyFileHandle, TargetByteOrder);
     appendInt(&ba, QDateTime::currentDateTime().toTime_t(), TargetByteOrder);
-    d->m_device.sendTrkMessage(TrkCloseFile,
+    d->m_device->sendTrkMessage(TrkCloseFile,
                                failed ? TrkCallback() : TrkCallback(this, &Launcher::handleFileCopied),
                                ba);
     d->m_copyState.data.reset();
@@ -458,7 +495,7 @@ void Launcher::handleCreateProcess(const TrkResult &result)
     QByteArray ba;
     appendInt(&ba, d->m_session.pid);
     appendInt(&ba, d->m_session.tid);
-    d->m_device.sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");
+    d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");
 }
 
 void Launcher::handleWaitForFinished(const TrkResult &result)
@@ -496,7 +533,7 @@ void Launcher::cleanUp()
     appendByte(&ba, 0x00);
     appendByte(&ba, 0x00);
     appendInt(&ba, d->m_session.pid);
-    d->m_device.sendTrkMessage(TrkDeleteItem, TrkCallback(), ba, "Delete process");
+    d->m_device->sendTrkMessage(TrkDeleteItem, TrkCallback(), ba, "Delete process");
 
     //---TRK------------------------------------------------------
     //  Command: 0x80 Acknowledge
@@ -540,7 +577,7 @@ void Launcher::cleanUp()
 
 void Launcher::disconnectTrk()
 {
-    d->m_device.sendTrkMessage(TrkDisconnect, TrkCallback(this, &Launcher::handleWaitForFinished));
+    d->m_device->sendTrkMessage(TrkDisconnect, TrkCallback(this, &Launcher::handleWaitForFinished));
 }
 
 void Launcher::copyFileToRemote()
@@ -549,7 +586,7 @@ void Launcher::copyFileToRemote()
     QByteArray ba;
     appendByte(&ba, 0x10);
     appendString(&ba, d->m_copyState.destinationFileName.toLocal8Bit(), TargetByteOrder, false);
-    d->m_device.sendTrkMessage(TrkOpenFile, TrkCallback(this, &Launcher::handleFileCreation), ba);
+    d->m_device->sendTrkMessage(TrkOpenFile, TrkCallback(this, &Launcher::handleFileCreation), ba);
 }
 
 void Launcher::installRemotePackageSilently()
@@ -558,7 +595,7 @@ void Launcher::installRemotePackageSilently()
     QByteArray ba;
     appendByte(&ba, 'C');
     appendString(&ba, d->m_installFileName.toLocal8Bit(), TargetByteOrder, false);
-    d->m_device.sendTrkMessage(TrkInstallFile, TrkCallback(this, &Launcher::handleInstallPackageFinished), ba);
+    d->m_device->sendTrkMessage(TrkInstallFile, TrkCallback(this, &Launcher::handleInstallPackageFinished), ba);
 }
 
 void Launcher::handleInstallPackageFinished(const TrkResult &result)
@@ -586,7 +623,6 @@ void Launcher::startInferiorIfNeeded()
     appendByte(&ba, 0); // create new process
     appendByte(&ba, 0); // ?
     appendString(&ba, d->m_fileName.toLocal8Bit(), TargetByteOrder);
-    d->m_device.sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess), ba); // Create Item
-}
-
+    d->m_device->sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess), ba); // Create Item
 }
+} // namespace trk
diff --git a/src/shared/trk/launcher.h b/src/shared/trk/launcher.h
index a216b79fcb33cbc89179ba8890e13726fbb50fcf..2c4881de6d19caec8896647a1210d3758697eb25 100644
--- a/src/shared/trk/launcher.h
+++ b/src/shared/trk/launcher.h
@@ -29,8 +29,11 @@
 #ifndef LAUNCHER_H
 #define LAUNCHER_H
 
+#include "trkdevice.h"
+
 #include <QtCore/QObject>
 #include <QtCore/QVariant>
+#include <QtCore/QSharedPointer>
 
 namespace trk {
 
@@ -38,9 +41,12 @@ struct TrkResult;
 struct TrkMessage;
 struct LauncherPrivate;
 
+typedef QSharedPointer<TrkDevice> TrkDevicePtr;
+
 class Launcher : public QObject
 {
     Q_OBJECT
+    Q_DISABLE_COPY(Launcher)
 public:
     typedef void (Launcher::*TrkCallBack)(const TrkResult &);
 
@@ -55,10 +61,13 @@ public:
         ActionCopyInstallRun = ActionCopy | ActionInstall | ActionRun
     };
 
-    Launcher(trk::Launcher::Actions startupActions = trk::Launcher::ActionPingOnly);
+    explicit Launcher(trk::Launcher::Actions startupActions = trk::Launcher::ActionPingOnly,
+                      const TrkDevicePtr &trkDevice = TrkDevicePtr(),
+                      QObject *parent = 0);
     ~Launcher();
     void addStartupActions(trk::Launcher::Actions startupActions);
     void setTrkServerName(const QString &name);
+    QString trkServerName() const;
     void setFileName(const QString &name);
     void setCopyFileName(const QString &srcName, const QString &dstName);
     void setInstallFileName(const QString &name);
@@ -66,6 +75,14 @@ public:
     void setVerbose(int v);    
     void setSerialFrame(bool b);
     bool serialFrame() const;
+    // Close device or leave it open
+    bool closeDevice() const;
+    void setCloseDevice(bool c);
+
+    TrkDevicePtr trkDevice() const;
+
+    // becomes valid after successful execution of ActionPingOnly
+    QString deviceDescription(unsigned verbose = 0u) const;
 
 signals:
     void copyingStarted();
diff --git a/src/shared/trk/trk.pri b/src/shared/trk/trk.pri
index 1564e4684dd08eecb3f319fc875838c45fbc7951..5b0e067b15840566822e3e38ac546ae3086e2498 100644
--- a/src/shared/trk/trk.pri
+++ b/src/shared/trk/trk.pri
@@ -1,13 +1,22 @@
 INCLUDEPATH *= $$PWD
 
 # Input
-HEADERS += \
-    $$PWD/callback.h \
+HEADERS += $$PWD/callback.h \
     $$PWD/trkutils.h \
     $$PWD/trkdevice.h \
-    $$PWD/launcher.h
+    $$PWD/launcher.h \
+    $$PWD/bluetoothlistener.h \
+    $$PWD/communicationstarter.h
 
-SOURCES += \
-    $$PWD/trkutils.cpp \
+SOURCES += $$PWD/trkutils.cpp \
     $$PWD/trkdevice.cpp \
-    $$PWD/launcher.cpp
+    $$PWD/launcher.cpp \
+    $$PWD/bluetoothlistener.cpp \
+    $$PWD/communicationstarter.cpp
+
+contains(QT, gui) {
+   HEADERS += $$PWD/bluetoothlistener_gui.h
+    SOURCES += $$PWD/bluetoothlistener_gui.cpp
+} else {
+    message(Trk: Console ...)
+}
diff --git a/src/shared/trk/trkdevice.cpp b/src/shared/trk/trkdevice.cpp
index a303ba1c2d35c998c7ffc00476421b86b5bc5090..a76cff79c2d5b1e1772443a103e07cb71266434d 100644
--- a/src/shared/trk/trkdevice.cpp
+++ b/src/shared/trk/trkdevice.cpp
@@ -436,15 +436,52 @@ void WriterThread::terminate()
 }
 
 #ifdef Q_OS_WIN
-static inline bool overlappedSyncWrite(HANDLE file, const char *data,
+
+static inline QString msgTerminated(int size)
+{
+    return QString::fromLatin1("Terminated with %1 bytes pending.").arg(size);
+}
+
+// Interruptible synchronous write function.
+static inline bool overlappedSyncWrite(HANDLE file,
+                                       const bool &terminateFlag,
+                                       const char *data,
                                        DWORD size, DWORD *charsWritten,
-                                       OVERLAPPED *overlapped)
+                                       OVERLAPPED *overlapped,
+                                       QString *errorMessage)
 {
     if (WriteFile(file, data, size, charsWritten, overlapped))
         return true;
-    if (GetLastError() != ERROR_IO_PENDING)
+    const DWORD writeError = GetLastError();
+    if (writeError != ERROR_IO_PENDING) {
+        *errorMessage = QString::fromLatin1("WriteFile failed: %1").arg(winErrorMessage(writeError));
+        return false;
+    }
+    // Wait for written or thread terminated
+    const DWORD timeoutMS = 200;
+    const unsigned maxAttempts = 20;
+    DWORD wr = WaitForSingleObject(overlapped->hEvent, timeoutMS);
+    for (unsigned n = 0; wr == WAIT_TIMEOUT && n < maxAttempts && !terminateFlag;
+         wr = WaitForSingleObject(overlapped->hEvent, timeoutMS), n++);
+    if (terminateFlag) {
+        *errorMessage = msgTerminated(size);
+        return false;
+    }
+    switch (wr) {
+    case WAIT_OBJECT_0:
+        break;
+    case WAIT_TIMEOUT:
+        *errorMessage = QString::fromLatin1("Write timed out.");
+        return false;
+    default:
+        *errorMessage = QString::fromLatin1("Error while waiting for WriteFile results: %1").arg(winErrorMessage(GetLastError()));
+        return false;
+    }
+    if (!GetOverlappedResult(file, overlapped, charsWritten, TRUE)) {
+        *errorMessage = QString::fromLatin1("Error writing %1 bytes: %2").arg(size).arg(winErrorMessage(GetLastError()));
         return false;
-    return GetOverlappedResult(file, overlapped, charsWritten, TRUE);
+    }
+    return true;
 }
 #endif
 
@@ -453,8 +490,7 @@ bool WriterThread::write(const QByteArray &data, QString *errorMessage)
     QMutexLocker locker(&m_context->mutex);
 #ifdef Q_OS_WIN
     DWORD charsWritten;
-    if (!overlappedSyncWrite(m_context->device, data.data(), data.size(), &charsWritten, &m_context->writeOverlapped)) {
-        *errorMessage = QString::fromLatin1("Error writing data: %1").arg(winErrorMessage(GetLastError()));
+    if (!overlappedSyncWrite(m_context->device, m_terminate, data.data(), data.size(), &charsWritten, &m_context->writeOverlapped, errorMessage)) {
         return false;
     }
     FlushFileBuffers(m_context->device);
@@ -473,8 +509,10 @@ bool WriterThread::trkWriteRawMessage(const TrkMessage &msg)
     const QByteArray ba = frameMessage(msg.code, msg.token, msg.data, m_context->serialFrame);
     QString errorMessage;
     const bool rc = write(ba, &errorMessage);
-    if (!rc)
+    if (!rc) {
+        qWarning("%s\n", qPrintable(errorMessage));
         emit error(errorMessage);
+    }
     return rc;
 }
 
@@ -844,7 +882,7 @@ TrkDevice::~TrkDevice()
 bool TrkDevice::open(const QString &port, QString *errorMessage)
 {
     if (d->verbose)
-        qDebug() << "Opening" << port << "is open: " << isOpen();
+        qDebug() << "Opening" << port << "is open: " << isOpen() << " serialFrame=" << serialFrame();
     close();
 #ifdef Q_OS_WIN
     d->deviceContext->device = CreateFile(port.toStdWString().c_str(),
@@ -917,8 +955,10 @@ void TrkDevice::close()
 {
     if (!isOpen())
         return;
-    d->readerThread->terminate();
-    d->writerThread->terminate();
+    if (d->readerThread)
+        d->readerThread->terminate();
+    if (d->writerThread)
+        d->writerThread->terminate();
 #ifdef Q_OS_WIN
     CloseHandle(d->deviceContext->device);
     d->deviceContext->device = INVALID_HANDLE_VALUE;
diff --git a/src/shared/trk/trkutils.cpp b/src/shared/trk/trkutils.cpp
index 463415e7c21c3da5443fdd4c25b51147d1cd7c20..93df3937994f5fcc32513c57775dfebddeaed8dd 100644
--- a/src/shared/trk/trkutils.cpp
+++ b/src/shared/trk/trkutils.cpp
@@ -36,6 +36,75 @@
 
 namespace trk {
 
+TrkAppVersion::TrkAppVersion()
+{
+    reset();
+}
+
+void TrkAppVersion::reset()
+{
+    trkMajor = trkMinor= protocolMajor = protocolMinor = 0;
+}
+
+Session::Session()
+{
+    reset();
+}
+
+void Session::reset()
+{
+    cpuMajor = 0;
+    cpuMinor = 0;
+    bigEndian = 0;
+    defaultTypeSize = 0;
+    fpTypeSize = 0;
+    extended1TypeSize = 0;
+    extended2TypeSize = 0;
+    pid = 0;
+    tid = 0;
+    codeseg = 0;
+    dataseg = 0;
+
+    currentThread = 0;
+    libraries.clear();
+    trkAppVersion.reset();
+}
+
+inline void formatCpu(QTextStream &str,int major, int minor)
+{
+    str << "CPU: v" << major << '.' << minor;
+    switch (major) {
+    case 0x04:
+        str << " ARM";
+        break;
+    }
+    switch (minor) {
+    case 0x00:
+        str << " 920T";
+        break;
+    }
+ }
+
+QString Session::deviceDescription(unsigned verbose) const
+{
+    QString msg;
+    if (cpuMajor) {
+        QTextStream str(&msg);
+        formatCpu(str, cpuMajor, cpuMinor);
+        str << ", "  << (bigEndian ? "big endian" : "little endian");
+        if (verbose) {
+            if (defaultTypeSize)
+                str << ", type size: " << defaultTypeSize;
+            if (fpTypeSize)
+                str << ", float size: " << fpTypeSize;
+        }
+        str << ", Trk: v" << trkAppVersion.trkMajor << '.' << trkAppVersion.trkMinor
+            << " Protocol: v" << trkAppVersion.protocolMajor << '.' << trkAppVersion.protocolMinor;
+    }
+    return msg;
+}
+
+
 // FIXME: Use the QByteArray based version below?
 QString stringFromByte(byte c)
 {
diff --git a/src/shared/trk/trkutils.h b/src/shared/trk/trkutils.h
index e8388356c533f47cf7766b28ee72374478643137..aec86a17309639303ad53e8b86fef0698fbb451a 100644
--- a/src/shared/trk/trkutils.h
+++ b/src/shared/trk/trkutils.h
@@ -97,31 +97,26 @@ struct Library
 {
     Library() {}
 
-    QString name;
+    QByteArray name;
     uint codeseg;
     uint dataseg;
 };
 
+struct TrkAppVersion {
+    TrkAppVersion();
+    void reset();    
+
+    int trkMajor;
+    int trkMinor;
+    int protocolMajor;
+    int protocolMinor;
+};
+
 struct Session
 {
-    Session() { reset(); }
-
-    void reset() {
-        cpuMajor = 0;
-        cpuMinor = 0;
-        bigEndian = 0;
-        defaultTypeSize = 0;
-        fpTypeSize = 0;
-        extended1TypeSize = 0;
-        extended2TypeSize = 0;
-        pid = 0;
-        tid = 0;
-        codeseg = 0;
-        dataseg = 0;
-
-        currentThread = 0;
-        libraries.clear();
-    }
+    Session();
+    void reset();
+    QString deviceDescription(unsigned verbose) const;
 
     // Trk feedback
     byte cpuMajor;
@@ -131,6 +126,7 @@ struct Session
     byte fpTypeSize;
     byte extended1TypeSize;
     byte extended2TypeSize;
+    TrkAppVersion trkAppVersion;
     uint pid;
     uint tid;
     uint codeseg;
diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp
index 3df6573ccdac25302223d4816ecead66407f4300..bf113873fe4cf9c48f5d189833196ac6dd9203d6 100644
--- a/tests/auto/cplusplus/semantic/tst_semantic.cpp
+++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp
@@ -100,6 +100,7 @@ private slots:
     void typedef_3();
     void const_1();
     void const_2();
+    void pointer_to_function_1();
 };
 
 void tst_Semantic::function_declaration_1()
@@ -367,5 +368,24 @@ void tst_Semantic::const_2()
     QVERIFY(arg->type()->asPointerType()->elementType()->isIntegerType());
 }
 
+void tst_Semantic::pointer_to_function_1()
+{
+    QSharedPointer<Document> doc = document("void (*QtSomething)();");
+    QCOMPARE(doc->errorCount, 0U);
+    QCOMPARE(doc->globals->symbolCount(), 1U);
+
+    Declaration *decl = doc->globals->symbolAt(0)->asDeclaration();
+    QVERIFY(decl);
+
+    PointerType *ptrTy = decl->type()->asPointerType();
+    QVERIFY(ptrTy);
+
+    Function *funTy = ptrTy->elementType()->asFunctionType();
+    QVERIFY(funTy);
+
+    QVERIFY(funTy->scope());
+    QCOMPARE(funTy->scope(), decl->scope());
+}
+
 QTEST_APPLESS_MAIN(tst_Semantic)
 #include "tst_semantic.moc"
diff --git a/tests/auto/debugger/tst_gdb.cpp b/tests/auto/debugger/tst_gdb.cpp
index 433b11f819227450f6b2322add7a69f24f8307fb..f40b0756c7d5a2b5e7d722e6972516029e7f56fd 100644
--- a/tests/auto/debugger/tst_gdb.cpp
+++ b/tests/auto/debugger/tst_gdb.cpp
@@ -1,4 +1,6 @@
 
+//bool checkUninitialized = true;
+bool checkUninitialized = false;
 //#define DO_DEBUG 1
 
 #include <QtCore/QThread>
@@ -45,6 +47,46 @@ using namespace Debugger;
 using namespace Debugger::Internal;
 
 
+class Foo
+{
+public:
+    Foo(int i = 0)
+        : a(i), b(2)
+    {}
+
+    ~Foo()
+    {
+    } 
+    void doit()
+    {
+        static QObject ob;
+        m["1"] = "2";
+        h[&ob] = m.begin();
+
+        a += 1;
+        --b;
+        //s += 'x';
+    }
+
+
+    struct Bar {
+        Bar() : ob(0) {}
+        QObject *ob;
+    };
+
+public:
+    int a, b;
+    char x[6];
+
+private:
+    //QString s;
+    typedef QMap<QString, QString> Map;
+    Map m;
+    QHash<QObject *, Map::iterator> h;
+};
+
+
+
 /////////////////////////////////////////////////////////////////////////
 //
 // Helper stuff
@@ -135,18 +177,28 @@ signals:
     void writeToGdb(const QByteArray &ba);
 
 private slots:
+    void dumpArray();
     void dumpMisc();
+    void dumpFoo();
+    void dumpQByteArray();
+    void dumpQChar();
+    void dumpQList_char_star();
+    void dumpQList_char();
     void dumpQList_int();
+    void dumpQList_QString();
+    void dumpQList_QString3();
+    void dumpQList_Int3();
+    void dumpQStack();
     void dumpQString();
     void dumpQStringList();
+    void dumpQWeakPointer();
+    void dumpQVector();
 
 public slots:
     void dumperCompatibility();
 #if 0
     void dumpQAbstractItemAndModelIndex();
     void dumpQAbstractItemModel();
-    void dumpQByteArray();
-    void dumpQChar();
     void dumpQDateTime();
     void dumpQDir();
     void dumpQFile();
@@ -156,10 +208,6 @@ public slots:
     void dumpQImage();
     void dumpQImageData();
     void dumpQLinkedList();
-    void dumpQList_char();
-    void dumpQList_QString();
-    void dumpQList_QString3();
-    void dumpQList_Int3();
     void dumpQLocale();
     void dumpQMap();
     void dumpQMapNode();
@@ -178,7 +226,6 @@ public slots:
     void dumpQVariant_QString();
     void dumpQVariant_QStringList();
     void dumpStdVector();
-    void dumpQWeakPointer();
 #endif
 
 private:
@@ -398,138 +445,489 @@ void getMapNodeParams(size_t &nodeSize, size_t &valOffset)
 }
 
 #endif
-#if 0
-void tst_Gdb::dumpQAbstractItemHelper(QModelIndex &index)
+
+
+/////////////////////////////////////////////////////////////////////////
+//
+// Gdb Thread
+//
+/////////////////////////////////////////////////////////////////////////
+
+Thread::Thread(tst_Gdb *test)
 {
-    const QAbstractItemModel *model = index.model();
-    const QString &rowStr = N(index.row());
-    const QString &colStr = N(index.column());
-    const QByteArray &internalPtrStrSymbolic = ptrToBa(index.internalPointer());
-    const QByteArray &internalPtrStrValue = ptrToBa(index.internalPointer(), false);
-    const QByteArray &modelPtrStr = ptrToBa(model);
-    QByteArray indexSpecSymbolic = QByteArray().append(rowStr + "," + colStr + ",").
-        append(internalPtrStrSymbolic + "," + modelPtrStr);
-    QByteArray indexSpecValue = QByteArray().append(rowStr + "," + colStr + ",").
-        append(internalPtrStrValue + "," + modelPtrStr);
-    QByteArray expected = QByteArray("tiname='iname',addr='").append(ptrToBa(&index)).
-        append("',type='"NS"QAbstractItem',addr='$").append(indexSpecSymbolic).
-        append("',value='").append(valToString(model->data(index).toString())).
-        append("',numchild='1',children=[");
-    int rowCount = model->rowCount(index);
-    int columnCount = model->columnCount(index);
-    for (int row = 0; row < rowCount; ++row) {
-        for (int col = 0; col < columnCount; ++col) {
-            const QModelIndex &childIndex = model->index(row, col, index);
-            expected.append("{name='[").append(valToString(row)).append(",").
-                append(N(col)).append("]',numchild='1',addr='$").
-                append(N(childIndex.row())).append(",").
-                append(N(childIndex.column())).append(",").
-                append(ptrToBa(childIndex.internalPointer())).append(",").
-                append(modelPtrStr).append("',type='"NS"QAbstractItem',value='").
-                append(valToString(model->data(childIndex).toString())).append("'}");
-            if (col < columnCount - 1 || row < rowCount - 1)
-                expected.append(",");
-        }
-    }
-    expected.append("]");
-    testDumper(expected, &index, NS"QAbstractItem", true, indexSpecValue);
+    moveToThread(this);
+    m_test = test;
+    m_proc = 0;
+    m_proc = new QProcess;
+    m_proc->moveToThread(this);
+    qDebug() << "\nTHREAD CREATED" << getpid() << gettid();
+    connect(m_test, SIGNAL(writeToGdb(QByteArray)),
+        this, SLOT(writeToGdbRequested(QByteArray)));
+    connect(m_proc, SIGNAL(error(QProcess::ProcessError)),
+        this, SLOT(handleGdbError(QProcess::ProcessError)));
+    connect(m_proc, SIGNAL(finished(int, QProcess::ExitStatus)),
+        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
+    connect(m_proc, SIGNAL(started()),
+        this, SLOT(handleGdbStarted()));
+    connect(m_proc, SIGNAL(readyReadStandardOutput()),
+        this, SLOT(readStandardOutput()));
+    connect(m_proc, SIGNAL(readyReadStandardError()),
+        this, SLOT(readStandardError()));
+    start();
 }
 
-void tst_Gdb::dumpQAbstractItemAndModelIndex()
+void Thread::handleGdbError(QProcess::ProcessError error)
 {
-    class PseudoTreeItemModel : public QAbstractItemModel
-    {
-    public:
-        PseudoTreeItemModel() : QAbstractItemModel(), parent1(0),
-            parent1Child(1), parent2(10), parent2Child1(11), parent2Child2(12)
-        {}
-
-        int columnCount(const QModelIndex &parent = QModelIndex()) const
-        {
-            Q_UNUSED(parent);
-            return 1;
-        }
+    qDebug() << "GDB ERROR: " << error;
+    //this->exit();
+}
 
-        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
-        {
-            return !index.isValid() || role != Qt::DisplayRole ?
-                    QVariant() : *static_cast<int *>(index.internalPointer());
-        }
+void Thread::handleGdbFinished(int code, QProcess::ExitStatus st)
+{
+    qDebug() << "GDB FINISHED: " << code << st;
+    //m_waitCondition.wakeAll();
+    //this->exit();
+    throw 42;
+}
 
-        QModelIndex index(int row, int column,
-                          const QModelIndex & parent = QModelIndex()) const
-        {
-            QModelIndex index;
-            if (column == 0) {
-                if (!parent.isValid()) {
-                    if (row == 0)
-                        index = createIndex(row, column, &parent1);
-                    else if (row == 1)
-                        index = createIndex(row, column, &parent2);
-                } else if (parent.internalPointer() == &parent1 && row == 0) {
-                    index = createIndex(row, column, &parent1Child);
-                } else if (parent.internalPointer() == &parent2) {
-                    index = createIndex(row, column,
-                                row == 0 ? &parent2Child1 : &parent2Child2);
-                }
-            }
-            return index;
+void Thread::readStandardOutput()
+{
+    QByteArray ba = m_proc->readAllStandardOutput();
+    DEBUG("THREAD GDB OUT: " << ba);
+    // =library-loaded...
+    if (ba.startsWith("=")) 
+        return;
+    if (ba.startsWith("*stopped")) {
+        m_lastStopped = ba;
+        //qDebug() << "THREAD GDB OUT: " << ba;
+        if (!ba.contains("func=\"main\"")) {
+            int pos1 = ba.indexOf(",line=\"") + 7;
+            int pos2 = ba.indexOf("\"", pos1);
+            m_line = ba.mid(pos1, pos2 - pos1).toInt();
+            DEBUG(" LINE 1: " << m_line);
         }
+    }
 
-        QModelIndex parent(const QModelIndex & index) const
-        {
-            QModelIndex parent;
-            if (index.isValid()) {
-                if (index.internalPointer() == &parent1Child)
-                    parent = createIndex(0, 0, &parent1);
-                else if (index.internalPointer() == &parent2Child1 ||
-                         index.internalPointer() == &parent2Child2)
-                    parent = createIndex(1, 0, &parent2);
-            }
-            return parent;
+    // The "call" is always aborted with a message like:
+    //  "~"2321\t    /* A */ QString s;\n" " 
+    //  "&"The program being debugged stopped while in a function called ..."
+    //  "^error,msg="The program being debugged stopped ..."
+    // Extract the "2321" from this
+    static QByteArray lastText;
+    if (ba.startsWith("~")) {
+        lastText = ba;
+        if (ba.size() > 8
+                && (ba.at(2) < 'a' || ba.at(2) > 'z')
+                && (ba.at(2) < '0' || ba.at(2) > '9')
+                && !ba.startsWith("~\"Breakpoint ")
+                && !ba.startsWith("~\"    at ")
+                && !ba.startsWith("~\"    locals=")
+                && !ba.startsWith("~\"XXX:")) {
+            QByteArray ba1 = ba.mid(2, ba.size() - 6);
+            if (ba1.startsWith("  File "))
+                ba1 = ba1.replace(2, ba1.indexOf(','), "");
+            qWarning() << "OUT: " << ba1;
         }
+    }
+    if (ba.startsWith("&\"The program being debugged")) {
+        int pos1 = 2;
+        int pos2 = lastText.indexOf("\\", pos1);
+        m_line = lastText.mid(pos1, pos2 - pos1).toInt();
+        DEBUG(" LINE 2: " << m_line);
+    }
+    if (ba.startsWith("^error,msg=")) {
+        if (!ba.startsWith("^error,msg=\"The program being debugged stopped"))
+            qWarning() << "ERROR: " << ba.mid(1, ba.size() - 3);
+    }
 
-        int rowCount(const QModelIndex &parent = QModelIndex()) const
-        {
-            int rowCount;
-            if (!parent.isValid() || parent.internalPointer() == &parent2)
-                rowCount = 2;
-            else if (parent.internalPointer() == &parent1)
-                rowCount = 1;
-            else
-                rowCount = 0;
-            return rowCount;
-        }
+    if (ba.startsWith("~\"XXX: ")) {
+        QByteArray ba1 = ba.mid(7, ba.size() - 11);
+        qWarning() << "MESSAGE: " << ba.mid(7, ba.size() - 12);
+    }
+    if (!ba.contains("locals={iname="))
+        return;
+    //m_output += ba;
+    ba = ba.mid(2, ba.size() - 4);
+    ba = ba.replace("\\\"", "\"");
+    m_output = ba;
+    m_waitCondition.wakeAll();
+}
 
-    private:
-        mutable int parent1;
-        mutable int parent1Child;
-        mutable int parent2;
-        mutable int parent2Child1;
-        mutable int parent2Child2;
-    };
+void Thread::readStandardError()
+{
+    QByteArray ba = m_proc->readAllStandardOutput();
+    qDebug() << "THREAD GDB ERR: " << ba;
+}
 
-    PseudoTreeItemModel m2;
+void Thread::handleGdbStarted()
+{
+    //qDebug() << "\n\nGDB STARTED" << getpid() << gettid() << "\n\n";
+}
 
-    // Case 1: ModelIndex with no children.
-    QStringListModel m(QStringList() << "item1" << "item2" << "item3");
-    QModelIndex index = m.index(2, 0);
+void Thread::run()
+{
+    //qDebug() << "\nTHREAD RUN" << getpid() << gettid();
+    m_proc->start("./gdb -i mi --args ./tst_gdb run");
+    m_proc->waitForStarted();
+    m_proc->write("break main\n");
+    m_proc->write("run\n");
+    m_proc->write("handle SIGSTOP stop pass\n");
+    //qDebug() << "\nTHREAD RUNNING";
+    exec();
+}
 
-    testDumper(QByteArray("type='$T',value='(2, 0)',numchild='5',children=["
-        "{name='row',value='2',type='int',numchild='0'},"
-        "{name='column',value='0',type='int',numchild='0'},"
-        "{name='parent',value='<invalid>',exp='(('$T'*)$A)->parent()',"
-            "type='$T',numchild='1'},"
-        "{name='internalId',%},"
-        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
-            "numchild='1'}]")
-         << generateQStringSpec(N(index.internalId()))
-         << ptrToBa(&m),
-        &index, NS"QModelIndex", true);
 
-    // Case 2: ModelIndex with one child.
-    QModelIndex index2 = m2.index(0, 0);
-    dumpQAbstractItemHelper(index2);
+/////////////////////////////////////////////////////////////////////////
+//
+// Test Class Framework Implementation
+//
+/////////////////////////////////////////////////////////////////////////
+
+tst_Gdb::tst_Gdb()
+    : m_thread(this)
+{
+    // FIXME: Wait until gdb proc is running.
+    QTest::qWait(600);
+
+    QFile file("tst_gdb.cpp");
+    Q_ASSERT(file.open(QIODevice::ReadOnly));
+    QByteArray funcName;
+    const QByteArrayList bal = file.readAll().split('\n');
+    Q_ASSERT(bal.size() > 100);
+    for (int i = 0; i != bal.size(); ++i) {
+        const QByteArray &ba = bal.at(i);
+        if (ba.startsWith("void dump")) {
+            int pos = ba.indexOf('(');
+            funcName = ba.mid(5, pos - 5) + '@';
+        } else if (ba.startsWith("    /*")) {
+            int pos = ba.indexOf('*', 7);
+            m_lineForLabel[funcName + ba.mid(7, pos - 8)] = i + 1;
+        }
+    }
+}
+
+void tst_Gdb::prepare(const QByteArray &function)
+{
+    m_function = function;
+    writeToGdb("b " + function);
+    writeToGdb("call " + function + "()");
+}
+
+static bool isJoker(const QByteArray &ba)
+{
+    return ba.endsWith("'-'") || ba.contains("'-'}");
+}
+
+void tst_Gdb::run(const QByteArray &label, const QByteArray &expected0,
+    const QByteArray &expanded, bool fancy)
+{
+    //qDebug() << "\nABOUT TO RUN TEST: " << expanded;
+    qWarning() << label << "...";
+    writeToGdb("bb " + QByteArray::number(int(fancy)) + " " + expanded);
+    m_mutex.lock();
+    m_waitCondition.wait(&m_mutex);
+    QByteArray ba = m_thread.m_output;
+    m_mutex.unlock();
+    //GdbMi locals;
+    //locals.fromString("{" + ba + "}");
+    QByteArray received = ba.replace("\"", "'");
+    //qDebug() << "OUTPUT: " << ba << "\n\n";
+    //qDebug() << "OUTPUT: " << locals.toString() << "\n\n";
+
+    QByteArray actual = received.trimmed();
+    if (actual.endsWith("\\n"))
+        actual.chop(2);
+    QByteArray expected = "locals={iname='local',name='Locals',value=' ',type=' ',"
+        "children=[" + expected0 + "]}";
+    int line = m_thread.m_line;
+
+    QByteArrayList l1 = actual.split(',');
+    QByteArrayList l2 = expected.split(',');
+
+    bool ok = l1.size() == l2.size();
+    if (ok) {
+        for (int i = 0 ; i < l1.size(); ++i) {
+            // Use "-" as joker.
+            if (l1.at(i) != l2.at(i) && !isJoker(l2.at(i)))
+                ok = false;
+        }
+    } else {
+        qWarning() << "!= size: " << l1.size() << l2.size();
+    }
+    
+    if (!ok) {
+        int i = 0;
+        for ( ; i < l1.size() && i < l2.size(); ++i) {
+            if (l1.at(i) == l2.at(i) || isJoker(l2.at(i))) {
+                qWarning() << "== " << l1.at(i);
+            } else {
+                //qWarning() << "!= " << l1.at(i).right(30) << l2.at(i).right(30);
+                qWarning() << "!= " << l1.at(i) << l2.at(i);
+                ok = false;
+            }
+        }
+        for ( ; i < l2.size(); ++i) 
+            qWarning() << "!= " << "-----" << l2.at(i);
+        for ( ; i < l1.size(); ++i) 
+            qWarning() << "!= " << l1.at(i) << "-----";
+        if (l1.size() != l2.size()) {
+            ok = false;
+            qWarning() << "!= size: " << l1.size() << l2.size();
+        }
+        qWarning() << "RECEIVED: " << received;
+    }
+    QCOMPARE(ok, true);
+    //qWarning() << "LINE: " << line << "ACT/EXP" << m_function + '@' + label;
+    //QCOMPARE(actual, expected);
+
+
+    int expline = m_lineForLabel.value(m_function + '@' + label);
+    int actline = line;
+    if (actline != expline) {
+        qWarning() << "LAST STOPPED: " << m_thread.m_lastStopped;
+    }
+    QCOMPARE(actline, expline);
+}
+
+void tst_Gdb::next(int n)
+{
+    for (int i = 0; i != n; ++i)
+        writeToGdb("next");
+}
+
+void tst_Gdb::cleanupTestCase()
+{
+    writeToGdb("kill");
+    writeToGdb("quit");
+    //m_thread.m_proc->waitForFinished();
+}
+
+
+/////////////////////////////////////////////////////////////////////////
+//
+// Dumper Tests
+//
+/////////////////////////////////////////////////////////////////////////
+
+///////////////////////////// Foo structure /////////////////////////////////
+
+void dumpFoo()
+{
+    /* A */ Foo f;
+    /* B */ f.doit();
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dumpFoo()
+{
+    prepare("dumpFoo");
+    next();
+    run("B","{iname='local.f',addr='-',name='f',type='Foo',"
+            "value='-',numchild='5'}", "", 0);
+    run("B","{iname='local.f',addr='-',name='f',type='Foo',"
+            "value='-',numchild='5',children=["
+            "{iname='local.f.a',name='a',type='int',value='0',numchild='0'},"
+            "{iname='local.f.b',name='b',type='int',value='2',numchild='0'},"
+            "{iname='local.f.x',name='x',type='char [6]',"
+                "value='{...}',numchild='1'},"
+            "{iname='local.f.m',name='m',type='"NS"QMap<"NS"QString, "NS"QString>',"
+                "value='{...}',numchild='1'},"
+            "{iname='local.f.h',name='h',type='"NS"QHash<"NS"QObject*, "
+                ""NS"QMap<"NS"QString, "NS"QString>::iterator>',"
+                "value='{...}',numchild='1'}]}",
+            "local.f", 0);
+}
+
+
+///////////////////////////// Array ///////////////////////////////////////
+
+void dumpArray_char()
+{
+    /* A */ const char s[] = "XYZ";
+    /* B */ (void) &s; }
+
+void dumpArray_int()
+{
+    /* A */ int s[] = {1, 2, 3};
+    /* B */ (void) s; }
+
+void tst_Gdb::dumpArray()
+{
+    prepare("dumpArray_char");
+    next();
+    // FIXME: numchild should be '4', not '1'
+    run("B","{iname='local.s',addr='-',name='s',type='char [4]',"
+            "value='-',numchild='1'}", "");
+    run("B","{iname='local.s',addr='-',name='s',type='char [4]',"
+            "value='-',numchild='1',childtype='char',childnumchild='0',"
+            "children=[{value='88 'X''},{value='89 'Y''},{value='90 'Z''},"
+            "{value='0 '\\\\000''}]}",
+            "local.s");
+
+    prepare("dumpArray_int");
+    next();
+    // FIXME: numchild should be '3', not '1'
+    run("B","{iname='local.s',addr='-',name='s',type='int [3]',"
+            "value='-',numchild='1'}", "");
+    run("B","{iname='local.s',addr='-',name='s',type='int [3]',"
+            "value='-',numchild='1',childtype='int',childnumchild='0',"
+            "children=[{value='1'},{value='2'},{value='3'}]}",
+            "local.s");
+}
+
+
+///////////////////////////// Misc stuff /////////////////////////////////
+
+void dumpMisc()
+{
+    /* A */ int *s = new int(1);
+    /* B */ *s += 1;
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dumpMisc()
+{
+    prepare("dumpMisc");
+    next();
+    run("B","{iname='local.s',addr='-',name='s',type='int *',"
+            "value='-',numchild='1'}", "", 0);
+    run("B","{iname='local.s',addr='-',name='s',type='int *',"
+            "value='-',numchild='1',children=[{iname='local.s.*',"
+            "name='*s',type='int',value='1',numchild='0'}]}", "local.s", 0);
+}
+
+#if 0
+void tst_Gdb::dumpQAbstractItemHelper(QModelIndex &index)
+{
+    const QAbstractItemModel *model = index.model();
+    const QString &rowStr = N(index.row());
+    const QString &colStr = N(index.column());
+    const QByteArray &internalPtrStrSymbolic = ptrToBa(index.internalPointer());
+    const QByteArray &internalPtrStrValue = ptrToBa(index.internalPointer(), false);
+    const QByteArray &modelPtrStr = ptrToBa(model);
+    QByteArray indexSpecSymbolic = QByteArray().append(rowStr + "," + colStr + ",").
+        append(internalPtrStrSymbolic + "," + modelPtrStr);
+    QByteArray indexSpecValue = QByteArray().append(rowStr + "," + colStr + ",").
+        append(internalPtrStrValue + "," + modelPtrStr);
+    QByteArray expected = QByteArray("tiname='iname',addr='").append(ptrToBa(&index)).
+        append("',type='"NS"QAbstractItem',addr='$").append(indexSpecSymbolic).
+        append("',value='").append(valToString(model->data(index).toString())).
+        append("',numchild='1',children=[");
+    int rowCount = model->rowCount(index);
+    int columnCount = model->columnCount(index);
+    for (int row = 0; row < rowCount; ++row) {
+        for (int col = 0; col < columnCount; ++col) {
+            const QModelIndex &childIndex = model->index(row, col, index);
+            expected.append("{name='[").append(valToString(row)).append(",").
+                append(N(col)).append("]',numchild='1',addr='$").
+                append(N(childIndex.row())).append(",").
+                append(N(childIndex.column())).append(",").
+                append(ptrToBa(childIndex.internalPointer())).append(",").
+                append(modelPtrStr).append("',type='"NS"QAbstractItem',value='").
+                append(valToString(model->data(childIndex).toString())).append("'}");
+            if (col < columnCount - 1 || row < rowCount - 1)
+                expected.append(",");
+        }
+    }
+    expected.append("]");
+    testDumper(expected, &index, NS"QAbstractItem", true, indexSpecValue);
+}
+
+void tst_Gdb::dumpQAbstractItemAndModelIndex()
+{
+    class PseudoTreeItemModel : public QAbstractItemModel
+    {
+    public:
+        PseudoTreeItemModel() : QAbstractItemModel(), parent1(0),
+            parent1Child(1), parent2(10), parent2Child1(11), parent2Child2(12)
+        {}
+
+        int columnCount(const QModelIndex &parent = QModelIndex()) const
+        {
+            Q_UNUSED(parent);
+            return 1;
+        }
+
+        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
+        {
+            return !index.isValid() || role != Qt::DisplayRole ?
+                    QVariant() : *static_cast<int *>(index.internalPointer());
+        }
+
+        QModelIndex index(int row, int column,
+                          const QModelIndex & parent = QModelIndex()) const
+        {
+            QModelIndex index;
+            if (column == 0) {
+                if (!parent.isValid()) {
+                    if (row == 0)
+                        index = createIndex(row, column, &parent1);
+                    else if (row == 1)
+                        index = createIndex(row, column, &parent2);
+                } else if (parent.internalPointer() == &parent1 && row == 0) {
+                    index = createIndex(row, column, &parent1Child);
+                } else if (parent.internalPointer() == &parent2) {
+                    index = createIndex(row, column,
+                                row == 0 ? &parent2Child1 : &parent2Child2);
+                }
+            }
+            return index;
+        }
+
+        QModelIndex parent(const QModelIndex & index) const
+        {
+            QModelIndex parent;
+            if (index.isValid()) {
+                if (index.internalPointer() == &parent1Child)
+                    parent = createIndex(0, 0, &parent1);
+                else if (index.internalPointer() == &parent2Child1 ||
+                         index.internalPointer() == &parent2Child2)
+                    parent = createIndex(1, 0, &parent2);
+            }
+            return parent;
+        }
+
+        int rowCount(const QModelIndex &parent = QModelIndex()) const
+        {
+            int rowCount;
+            if (!parent.isValid() || parent.internalPointer() == &parent2)
+                rowCount = 2;
+            else if (parent.internalPointer() == &parent1)
+                rowCount = 1;
+            else
+                rowCount = 0;
+            return rowCount;
+        }
+
+    private:
+        mutable int parent1;
+        mutable int parent1Child;
+        mutable int parent2;
+        mutable int parent2Child1;
+        mutable int parent2Child2;
+    };
+
+    PseudoTreeItemModel m2;
+
+    // Case 1: ModelIndex with no children.
+    QStringListModel m(QStringList() << "item1" << "item2" << "item3");
+    QModelIndex index = m.index(2, 0);
+
+    testDumper(QByteArray("type='$T',value='(2, 0)',numchild='5',children=["
+        "{name='row',value='2',type='int',numchild='0'},"
+        "{name='column',value='0',type='int',numchild='0'},"
+        "{name='parent',value='<invalid>',exp='(('$T'*)$A)->parent()',"
+            "type='$T',numchild='1'},"
+        "{name='internalId',%},"
+        "{name='model',value='%',type='"NS"QAbstractItemModel*',"
+            "numchild='1'}]")
+         << generateQStringSpec(N(index.internalId()))
+         << ptrToBa(&m),
+        &index, NS"QModelIndex", true);
+
+    // Case 2: ModelIndex with one child.
+    QModelIndex index2 = m2.index(0, 0);
+    dumpQAbstractItemHelper(index2);
 
     qDebug() << "FIXME: invalid indices should not have children";
     testDumper(QByteArray("type='$T',value='(0, 0)',numchild='5',children=["
@@ -649,81 +1047,93 @@ void tst_Gdb::dumpQAbstractItemModel()
     model2.appendRow(QList<QStandardItem *>() << &item3 << &item4);
     dumpQAbstractItemModelHelper(model);
 }
+#endif
 
-void tst_Gdb::dumpQByteArray()
+void dumpQByteArrayTest()
 {
-    // Case 1: Empty object.
-    QByteArray ba;
-    testDumper("value='',valueencoded='1',type='"NS"QByteArray',numchild='0',"
-            "childtype='char',childnumchild='0',children=[]",
-        &ba, NS"QByteArray", true);
-
-    // Case 2: One element.
-    ba.append('a');
-    testDumper("value='YQ==',valueencoded='1',type='"NS"QByteArray',numchild='1',"
-            "childtype='char',childnumchild='0',children=[{value='61  (97 'a')'}]",
-        &ba, NS"QByteArray", true);
-
-    // Case 3: Two elements.
-    ba.append('b');
-    testDumper("value='YWI=',valueencoded='1',type='"NS"QByteArray',numchild='2',"
-            "childtype='char',childnumchild='0',children=["
-            "{value='61  (97 'a')'},{value='62  (98 'b')'}]",
-        &ba, NS"QByteArray", true);
-
-    // Case 4: > 100 elements.
-    ba = QByteArray(101, 'a');
-    QByteArray children;
-    for (int i = 0; i < 101; i++)
-        children.append("{value='61  (97 'a')'},");
-    children.chop(1);
-    testDumper(QByteArray("value='YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
-            "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh"
-            "YWFhYWFhYWFhYWFhYWFhYWFhYWFhYQ== <size: 101, cut...>',"
-            "valueencoded='1',type='"NS"QByteArray',numchild='101',"
-            "childtype='char',childnumchild='0',children=[%]") << children,
-        &ba, NS"QByteArray", true);
-
-    // Case 5: Regular and special characters and the replacement character.
-    ba = QByteArray("abc\a\n\r\e\'\"?");
-    testDumper("value='YWJjBwoNGyciPw==',valueencoded='1',type='"NS"QByteArray',"
-            "numchild='10',childtype='char',childnumchild='0',children=["
-            "{value='61  (97 'a')'},{value='62  (98 'b')'},"
-            "{value='63  (99 'c')'},{value='07  (7 '?')'},"
-            "{value='0a  (10 '?')'},{value='0d  (13 '?')'},"
-            "{value='1b  (27 '?')'},{value='27  (39 '?')'},"
-            "{value='22  (34 '?')'},{value='3f  (63 '?')'}]",
-        &ba, NS"QByteArray", true);
+    /* A */ QByteArray ba;                       // Empty object.
+    /* B */ ba.append('a');                      // One element.
+    /* C */ ba.append('b');                      // Two elements.
+    /* D */ ba = QByteArray(101, 'a');           // > 100 elements.
+    /* E */ ba = QByteArray("abc\a\n\r\e\'\"?"); // Mixed.
+    /* F */ (void) 0;
 }
 
+void tst_Gdb::dumpQByteArray()
+{
+    prepare("dumpQByteArrayTest");
+    if (1 || checkUninitialized)
+        run("A","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='',numchild='0'}");
+    next();
+    run("C","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='61',numchild='1'}");
+    next();
+    run("D","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='6162',numchild='2'}");
+    next();
+    run("E","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='616161616161616161616161616161616161"
+            "616161616161616161616161616161616161616161616161616161616161"
+            "616161616161616161616161616161616161616161616161616161616161"
+            "6161616161616161616161616161616161616161616161',numchild='101'}");
+    next();
+    run("F","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='616263070a0d1b27223f',numchild='10'}");
+    run("F","{iname='local.ba',addr='-',name='ba',type='"NS"QByteArray',"
+            "valueencoded='6',value='616263070a0d1b27223f',numchild='10',"
+            "childtype='char',childnumchild='0',"
+            "children=[{value='97 'a''},{value='98 'b''},"
+            "{value='99 'c''},{value='7 '\\\\a''},"
+            "{value='10 '\\\\n''},{value='13 '\\\\r''},"
+            "{value='27 '\\\\033''},{value='39 '\\\\'''},"
+            "{value='34 ''''},{value='63 '?''}]}",
+            "local.ba");
+}
+
+void dumpQCharTest()
+{
+    /* A */ QChar c('X');               // Printable ASCII character.
+    /* B */ c = QChar(0x600);           // Printable non-ASCII character.
+    /* C */ c = QChar::fromAscii('\a'); // Non-printable ASCII character.
+    /* D */ c = QChar(0x9f);            // Non-printable non-ASCII character.
+    /* E */ c = QChar::fromAscii('?');  // The replacement character.
+    /* F */ (void) 0; }
+
 void tst_Gdb::dumpQChar()
 {
+    prepare("dumpQCharTest");
+    next();
+
     // Case 1: Printable ASCII character.
-    QChar c('X');
-    testDumper("value=''X', ucs=88',numchild='0'",
-        &c, NS"QChar", false);
+    run("B","{iname='local.c',addr='-',name='c',type='"NS"QChar',"
+        "value=''X', ucs=88',numchild='0'}");
+    next();
 
     // Case 2: Printable non-ASCII character.
-    c = QChar(0x600);
-    testDumper("value=''?', ucs=1536',numchild='0'",
-        &c, NS"QChar", false);
+    run("C","{iname='local.c',addr='-',name='c',type='"NS"QChar',"
+        "value=''?', ucs=1536',numchild='0'}");
+    next();
 
     // Case 3: Non-printable ASCII character.
-    c = QChar::fromAscii('\a');
-    testDumper("value=''?', ucs=7',numchild='0'",
-        &c, NS"QChar", false);
+    run("D","{iname='local.c',addr='-',name='c',type='"NS"QChar',"
+        "value=''?', ucs=7',numchild='0'}");
+    next();
 
     // Case 4: Non-printable non-ASCII character.
-    c = QChar(0x9f);
-    testDumper("value=''?', ucs=159',numchild='0'",
-        &c, NS"QChar", false);
+    run("E","{iname='local.c',addr='-',name='c',type='"NS"QChar',"
+        "value=''?', ucs=159',numchild='0'}");
+    next();
 
     // Case 5: Printable ASCII Character that looks like the replacement character.
-    c = QChar::fromAscii('?');
-    testDumper("value=''?', ucs=63',numchild='0'",
-        &c, NS"QChar", false);
+    run("F","{iname='local.c',addr='-',name='c',type='"NS"QChar',"
+        "value=''?', ucs=63',numchild='0'}");
 }
 
+#if 0
 void tst_Gdb::dumpQDateTimeHelper(const QDateTime &d)
 {
     QByteArray value;
@@ -1160,36 +1570,6 @@ void tst_Gdb::dumpQLinkedList()
     }
     #endif
 
-void tst_Gdb::dumpQList_Int3()
-{
-    QList<Int3> i3list;
-    testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='0',children=[]",
-        &i3list, NS"QList", true, "Int3");
-    i3list.append(Int3());
-    i3list.append(Int3());
-    testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='0',childtype='Int3',children=["
-        "{addr='" + str(&i3list.at(0)) + "'},"
-        "{addr='" + str(&i3list.at(1)) + "'}]",
-        &i3list, NS"QList", true, "Int3");
-}
-
-void tst_Gdb::dumpQList_QString3()
-{
-    QList<QString3> s3list;
-    testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='0',children=[]",
-        &s3list, NS"QList", true, "QString3");
-    s3list.append(QString3());
-    s3list.append(QString3());
-    testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='0',childtype='QString3',children=["
-        "{addr='" + str(&s3list.at(0)) + "'},"
-        "{addr='" + str(&s3list.at(1)) + "'}]",
-        &s3list, NS"QList", true, "QString3");
-}
-
 void tst_Gdb::dumpQLocaleHelper(QLocale &loc)
 {
     QByteArray expected = QByteArray("value='%',type='$T',numchild='8',"
@@ -2061,362 +2441,365 @@ void tst_Gdb::dumpQWeakPointerHelper(QWeakPointer<T> &ptr)
     testDumper(expected, &ptr, NS"QWeakPointer", true, typeToString<T>());
 }
 #endif
-
-void tst_Gdb::dumpQWeakPointer()
-{
-#if QT_VERSION >= 0x040500
-    // Case 1: Simple type.
-
-    // Case 1.1: Null pointer.
-    QSharedPointer<int> spNull;
-    QWeakPointer<int> wp = spNull.toWeakRef();
-    testDumper("value='<null>',valuedisabled='true',numchild='0'",
-        &wp, NS"QWeakPointer", true, "int");
-
-    // Case 1.2: Weak pointer is unique.
-    QSharedPointer<int> sp(new int(99));
-    wp = sp.toWeakRef();
-    dumpQWeakPointerHelper(wp);
-
-    // Case 1.3: There are other weak pointers.
-    QWeakPointer<int> wp2 = sp.toWeakRef();
-    dumpQWeakPointerHelper(wp);
-
-    // Case 1.4: There are other strong shared pointers as well.
-    QSharedPointer<int> sp2(sp);
-    dumpQWeakPointerHelper(wp);
-
-    // Case 2: Composite type.
-    QSharedPointer<QString> spS(new QString("Test"));
-    QWeakPointer<QString> wpS = spS.toWeakRef();
-    dumpQWeakPointerHelper(wpS);
-#endif
-}
 #endif // #if 0
 
+///////////////////////////// QWeakPointer /////////////////////////////////
 
-/////////////////////////////////////////////////////////////////////////
-//
-// Gdb Thread
-//
-/////////////////////////////////////////////////////////////////////////
-
-Thread::Thread(tst_Gdb *test)
-{
-    moveToThread(this);
-    m_test = test;
-    m_proc = 0;
-    m_proc = new QProcess;
-    m_proc->moveToThread(this);
-    qDebug() << "\nTHREAD CREATED" << getpid() << gettid();
-    connect(m_test, SIGNAL(writeToGdb(QByteArray)),
-        this, SLOT(writeToGdbRequested(QByteArray)));
-    connect(m_proc, SIGNAL(error(QProcess::ProcessError)),
-        this, SLOT(handleGdbError(QProcess::ProcessError)));
-    connect(m_proc, SIGNAL(finished(int, QProcess::ExitStatus)),
-        this, SLOT(handleGdbFinished(int, QProcess::ExitStatus)));
-    connect(m_proc, SIGNAL(started()),
-        this, SLOT(handleGdbStarted()));
-    connect(m_proc, SIGNAL(readyReadStandardOutput()),
-        this, SLOT(readStandardOutput()));
-    connect(m_proc, SIGNAL(readyReadStandardError()),
-        this, SLOT(readStandardError()));
-    start();
-}
-
-void Thread::handleGdbError(QProcess::ProcessError error)
-{
-    qDebug() << "GDB ERROR: " << error;
-    //this->exit();
-}
-
-void Thread::handleGdbFinished(int code, QProcess::ExitStatus st)
-{
-    qDebug() << "GDB FINISHED: " << code << st;
-    //m_waitCondition.wakeAll();
-    //this->exit();
-    throw 42;
-}
-
-void Thread::readStandardOutput()
-{
-    QByteArray ba = m_proc->readAllStandardOutput();
-    DEBUG("THREAD GDB OUT: " << ba);
-    // =library-loaded...
-    if (ba.startsWith("=")) 
-        return;
-    if (ba.startsWith("*stopped")) {
-        m_lastStopped = ba;
-        //qDebug() << "THREAD GDB OUT: " << ba;
-        if (!ba.contains("func=\"main\"")) {
-            int pos1 = ba.indexOf(",line=\"") + 7;
-            int pos2 = ba.indexOf("\"", pos1);
-            m_line = ba.mid(pos1, pos2 - pos1).toInt();
-            DEBUG(" LINE 1: " << m_line);
-        }
-    }
-
-    // The "call" is always aborted with a message like:
-    //  "~"2321\t    /* A */ QString s;\n" " 
-    //  "&"The program being debugged stopped while in a function called ..."
-    //  "^error,msg="The program being debugged stopped ..."
-    // Extract the "2321" from this
-    static QByteArray lastText;
-    if (ba.startsWith("~"))
-        lastText = ba;
-    if (ba.startsWith("&\"The program being debugged")) {
-        int pos1 = 2;
-        int pos2 = lastText.indexOf("\\", pos1);
-        m_line = lastText.mid(pos1, pos2 - pos1).toInt();
-        DEBUG(" LINE 2: " << m_line);
-    }
-
-    if (ba.startsWith("~\"XXX: ")) {
-        QByteArray ba1 = ba.mid(7, ba.size() - 11);
-        qWarning() << "MESSAGE: " << ba.mid(7, ba.size() - 12);
-    }
-    if (!ba.contains("locals={iname="))
-        return;
-    //m_output += ba;
-    ba = ba.mid(2, ba.size() - 4);
-    ba = ba.replace("\\\"", "\"");
-    m_output = ba;
-    m_waitCondition.wakeAll();
-}
-
-void Thread::readStandardError()
-{
-    QByteArray ba = m_proc->readAllStandardOutput();
-    qDebug() << "THREAD GDB ERR: " << ba;
-}
-
-void Thread::handleGdbStarted()
-{
-    //qDebug() << "\n\nGDB STARTED" << getpid() << gettid() << "\n\n";
-}
-
-void Thread::run()
-{
-    //qDebug() << "\nTHREAD RUN" << getpid() << gettid();
-    m_proc->start("./gdb -i mi --args ./tst_gdb run");
-    m_proc->waitForStarted();
-    m_proc->write("break main\n");
-    m_proc->write("run\n");
-    m_proc->write("handle SIGSTOP stop pass\n");
-    //qDebug() << "\nTHREAD RUNNING";
-    exec();
-}
-
-
-/////////////////////////////////////////////////////////////////////////
-//
-// Test Class Framework Implementation
-//
-/////////////////////////////////////////////////////////////////////////
-
-tst_Gdb::tst_Gdb()
-    : m_thread(this)
+#if QT_VERSION >= 0x040500
+void dumpQWeakPointer_11()
 {
-    // FIXME: Wait until gdb proc is running.
-    QTest::qWait(600);
-
-    QFile file("tst_gdb.cpp");
-    Q_ASSERT(file.open(QIODevice::ReadOnly));
-    QByteArray funcName;
-    const QByteArrayList bal = file.readAll().split('\n');
-    Q_ASSERT(bal.size() > 100);
-    for (int i = 0; i != bal.size(); ++i) {
-        const QByteArray &ba = bal.at(i);
-        if (ba.startsWith("void dump")) {
-            int pos = ba.indexOf('(');
-            funcName = ba.mid(5, pos - 5) + '@';
-        } else if (ba.startsWith("    /*")) {
-            int pos = ba.indexOf('*', 7);
-            m_lineForLabel[funcName + ba.mid(7, pos - 8)] = i + 1;
-        }
-    }
+    // Case 1: Simple type.
+    // Case 1.1: Null pointer.
+    /* A */ QSharedPointer<int> sp;
+    /*   */ QWeakPointer<int> wp = sp.toWeakRef();
+    /* B */ (void) 0;
 }
 
+void dumpQWeakPointer_12()
+{
+    // Case 1.2: Weak pointer is unique.
+    /* A */ QSharedPointer<int> sp(new int(99));
+    /*   */ QWeakPointer<int> wp = sp.toWeakRef();
+    /* B */ (void) 0;
+}
 
-void tst_Gdb::prepare(const QByteArray &function)
+void dumpQWeakPointer_13()
 {
-    m_function = function;
-    writeToGdb("b " + function);
-    writeToGdb("call " + function + "()");
+    // Case 1.3: There are other weak pointers.
+    /* A */ QSharedPointer<int> sp(new int(99));
+    /*   */ QWeakPointer<int> wp = sp.toWeakRef();
+    /* B */ (void) 0;
 }
 
-void tst_Gdb::run(const QByteArray &label, const QByteArray &expected0,
-    const QByteArray &expanded, bool fancy)
+void dumpQWeakPointer_14()
 {
-    //qDebug() << "\nABOUT TO RUN TEST: " << expanded;
-    writeToGdb("bb " + QByteArray::number(int(fancy)) + " " + expanded);
-    m_mutex.lock();
-    m_waitCondition.wait(&m_mutex);
-    QByteArray ba = m_thread.m_output;
-    m_mutex.unlock();
-    //GdbMi locals;
-    //locals.fromString("{" + ba + "}");
-    QByteArray received = ba.replace("\"", "'");
-    //qDebug() << "OUTPUT: " << ba << "\n\n";
-    //qDebug() << "OUTPUT: " << locals.toString() << "\n\n";
+    // Case 1.4: There are other strong shared pointers as well.
+    /* A */ QSharedPointer<int> sp(new int(99));
+    /*   */ QSharedPointer<int> sp2(sp);
+    /* B */ (void) 0;
+}
 
-    QByteArray actual____ = received.trimmed();
-    QByteArray expected = "locals={iname='local',name='Locals',value=' ',type=' ',"
-        "children=[" + expected0 + "]}";
-    int line = m_thread.m_line;
+void dumpQWeakPointer_2()
+{
+    // Case 2: Composite type.
+    /* A */ QSharedPointer<QString> sp(new QString("Test"));
+    /*   */ QWeakPointer<QString> wp = sp.toWeakRef();
+    /* B */ (void) 0;
+}
+#endif
 
-    QByteArrayList l1 = actual____.split(',');
-    QByteArrayList l2 = expected.split(',');
+void tst_Gdb::dumpQWeakPointer()
+{
+#if QT_VERSION >= 0x040500
 
-    bool ok = l1.size() == l2.size();
-    if (ok) {
-        for (int i = 0 ; i < l1.size(); ++i) {
-            // Use "-" as joker.
-            if (l1.at(i) != l2.at(i) && !l2.at(i).endsWith("'-'"))
-                ok = false;
-        }
-    }
-    
-    if (!ok) {
-        int i = 0;
-        for ( ; i < l1.size() && i < l2.size(); ++i) {
-            if (l1.at(i) == l2.at(i) || l2.at(i).endsWith("'-'")) {
-                qWarning() << "== " << l1.at(i);
-            } else {
-                //qWarning() << "!= " << l1.at(i).right(30) << l2.at(i).right(30);
-                qWarning() << "!= " << l1.at(i) << l2.at(i);
-                ok = false;
-            }
-        }
-        for ( ; i < l2.size(); ++i) 
-            qWarning() << "!= " << "-----" << l2.at(i);
-        for ( ; i < l1.size(); ++i) 
-            qWarning() << "!= " << l1.at(i) << "-----";
-        if (l1.size() != l2.size()) {
-            ok = false;
-            qWarning() << "!= size: " << l1.size() << l2.size();
-        }
-        qWarning() << "RECEIVED: " << received;
-    }
-    QCOMPARE(ok, true);
-    qWarning() << "LINE: " << line << "ACT/EXP" << m_function + '@' + label;
-    //QCOMPARE(actual____, expected);
+return;
 
+    // Case 1.1: Null pointer.
+    prepare("dumpQWeakPointer_11");
+    if (checkUninitialized)
+        run("A","{iname='local.sp',addr='-',name='sp',"
+            "type='"NS"QSharedPointer<int>',value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.sp',addr='-',name='sp',"
+            "type='"NS"QSharedPointer<int>',value='<0 items>',numchild='1'}");
 
-    int expline = m_lineForLabel.value(m_function + '@' + label);
-    int actline = line;
-    if (actline != expline) {
-        qWarning() << "LAST STOPPED: " << m_thread.m_lastStopped;
-    }
-    QCOMPARE(actline, expline);
-}
+/*
+    //,numchild='1',children=[{name='data',addr='").
+        append(ptrToBa(data)).append("',type='").append(typeToString<T>()).
+        append("',value='").append(dataStr).append("'},{name='weakref',value='").
+        append(valToString(*weakRefPtr)).append("',type='int',addr='").
+        append(ptrToBa(weakRefPtr)).append("',numchild='0'},{name='strongref',value='").
+        append(valToString(*strongRefPtr)).append("',type='int',addr='").
+        append(ptrToBa(strongRefPtr)).append("',numchild='0'}]");
 
-void tst_Gdb::next(int n)
+    // Case 1.2: Weak pointer is unique.
+void tst_Gdb::dumpQWeakPointerHelper(QWeakPointer<T> &ptr)
 {
-    for (int i = 0; i != n; ++i)
-        writeToGdb("next");
+    typedef QtSharedPointer::ExternalRefCountData Data;
+    const size_t dataOffset = 0;
+    const Data *d = *reinterpret_cast<const Data **>(
+            reinterpret_cast<const char **>(&ptr) + dataOffset);
+    const int *weakRefPtr = reinterpret_cast<const int *>(&d->weakref);
+    const int *strongRefPtr = reinterpret_cast<const int *>(&d->strongref);
+    T *data = ptr.toStrongRef().data();
+    const QString dataStr = valToString(*data);
+    QByteArray expected("value='");
+    if (isSimpleType<T>())
+        expected.append(dataStr);
+    expected.append("',valuedisabled='true',numchild='1',children=[{name='data',addr='").
+        append(ptrToBa(data)).append("',type='").append(typeToString<T>()).
+        append("',value='").append(dataStr).append("'},{name='weakref',value='").
+        append(valToString(*weakRefPtr)).append("',type='int',addr='").
+        append(ptrToBa(weakRefPtr)).append("',numchild='0'},{name='strongref',value='").
+        append(valToString(*strongRefPtr)).append("',type='int',addr='").
+        append(ptrToBa(strongRefPtr)).append("',numchild='0'}]");
+    testDumper(expected, &ptr, NS"QWeakPointer", true, typeToString<T>());
 }
 
-void tst_Gdb::cleanupTestCase()
-{
-    writeToGdb("kill");
-    writeToGdb("quit");
-    //m_thread.m_proc->waitForFinished();
-}
 
+    QSharedPointer<int> sp(new int(99));
+    wp = sp.toWeakRef();
+    dumpQWeakPointerHelper(wp);
 
-/////////////////////////////////////////////////////////////////////////
-//
-// Dumper Tests
-//
-/////////////////////////////////////////////////////////////////////////
+    // Case 1.3: There are other weak pointers.
+    QWeakPointer<int> wp2 = sp.toWeakRef();
+    dumpQWeakPointerHelper(wp);
+
+    // Case 1.4: There are other strong shared pointers as well.
+    QSharedPointer<int> sp2(sp);
+    dumpQWeakPointerHelper(wp);
+
+    // Case 2: Composite type.
+    QSharedPointer<QString> spS(new QString("Test"));
+    QWeakPointer<QString> wpS = spS.toWeakRef();
+    dumpQWeakPointerHelper(wpS);
+*/
+#endif
+}
+
+///////////////////////////// QList<int> /////////////////////////////////
 
 void dumpQList_int()
 {
-    /* A */ QList<int> ilist;
-    /* B */ ilist.append(1);
-    /* C */ ilist.append(2);
+    /* A */ QList<int> list;
+    /* B */ list.append(1);
+    /* C */ list.append(2);
     /* D */ (void) 0;
 }
 
 void tst_Gdb::dumpQList_int()
 {
     prepare("dumpQList_int");
-    run("A","{iname='local.ilist',addr='-',name='ilist',"
-            "type='"NS"QList<int>',value='<not in scope>',numchild='0'}");
+    if (checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+                "type='"NS"QList<int>',value='<not in scope>',numchild='0'}");
     next();
-    run("B","{iname='local.ilist',addr='-',name='ilist',"
+    run("B","{iname='local.list',addr='-',name='list',"
             "type='"NS"QList<int>',value='<0 items>',numchild='0'}");
     next();
-    run("C","{iname='local.ilist',addr='-',name='ilist',"
+    run("C","{iname='local.list',addr='-',name='list',"
             "type='"NS"QList<int>',value='<1 items>',numchild='1'}");
-    //run("C","{iname='local.ilist',addr='-',name='ilist',"
-    //        "type='"NS"QList<int>',value='<1 items>',numchild='1',"
-    //    "childtype='int',childnumchild='0',children=["
-    //    "{value='1'}]}", "local.ilist");
-/*
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<int>',value='<1 items>',numchild='1',"
+            "childtype='int',childnumchild='0',children=["
+            "{value='1'}]}", "local.list");
     next();
-    run("D","{iname='local.ilist',addr='-',name='ilist',"
-            "type='"NS"QList<int>',value='<2 items>',numchild='2',"
-        "childtype='int',childnumchild='0'}");
-    run("D","{iname='local.ilist',addr='-',name='ilist',"
+    run("D","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<int>',value='<2 items>',numchild='2'}");
+    run("D","{iname='local.list',addr='-',name='list',"
             "type='"NS"QList<int>',value='<2 items>',numchild='2',"
-        "childtype='int',childnumchild='0',children=["
-        "{addr='-',value='1'},{addr='-',value='2'}]}", "local.ilist");
-*/
+            "childtype='int',childnumchild='0',children=["
+            "{value='1'},{value='2'}]}", "local.list");
+}
+
+
+///////////////////////////// QList<char> /////////////////////////////////
+
+void dumpQList_char()
+{
+    /* A */ QList<char> list;
+    /* B */ list.append('a');
+    /* C */ (void) 0;
 }
 
-/*
 void tst_Gdb::dumpQList_char()
 {
-    QList<char> clist;
-    testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='1',children=[]",
-        &clist, NS"QList", true, "char");
-    clist.append('a');
-    clist.append('b');
-    testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='1',childtype='char',childnumchild='0',children=["
-        "{addr='" + str(&clist.at(0)) + "',value=''a', ascii=97'},"
-        "{addr='" + str(&clist.at(1)) + "',value=''b', ascii=98'}]",
-        &clist, NS"QList", true, "char");
+    prepare("dumpQList_char");
+    if (checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char>',value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char>',value='<0 items>',numchild='0'}");
+    next();
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char>',value='<1 items>',numchild='1'}");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char>',value='<1 items>',numchild='1',"
+            "childtype='char',childnumchild='0',children=["
+            "{value='97 'a''}]}", "local.list");
+}
+
+
+///////////////////////////// QList<const char *> /////////////////////////////////
+
+void dumpQList_char_star()
+{
+    /* A */ QList<const char *> list;
+    /* B */ list.append("a");
+    /* C */ list.append(0);
+    /* D */ list.append("bc");
+    /* E */ (void) 0;
+}
+
+void tst_Gdb::dumpQList_char_star()
+{
+    prepare("dumpQList_char_star");
+    if (checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char const*>',value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char const*>',value='<0 items>',numchild='0'}");
+    next();
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char const*>',value='<1 items>',numchild='1'}");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char const*>',value='<1 items>',numchild='1',"
+            "childtype='const char *',childnumchild='1',children=["
+            "{valueencoded='6',value='61',numchild='0'}]}", "local.list");
+    next();
+    next();
+    run("E","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<char const*>',value='<3 items>',numchild='3',"
+            "childtype='const char *',childnumchild='1',children=["
+            "{valueencoded='6',value='61',numchild='0'},"
+            "{value='0x0',numchild='0'},"
+            "{valueencoded='6',value='6263',numchild='0'}]}", "local.list");
+}
+
+
+///////////////////////////// QList<QString> /////////////////////////////////////
+
+void dumpQList_QString()
+{
+    /* A */ QList<QString> list;
+    /* B */ list.append("Hallo");
+    /* C */ (void) 0;
 }
 
 void tst_Gdb::dumpQList_QString()
 {
-    QList<QString> slist;
-    testDumper("value='<0 items>',valuedisabled='true',numchild='0',"
-        "internal='1',children=[]",
-        &slist, NS"QList", true, NS"QString");
-    slist.append("a");
-    slist.append("b");
-    testDumper("value='<2 items>',valuedisabled='true',numchild='2',"
-        "internal='1',childtype='"NS"QString',childnumchild='0',children=["
-        "{addr='" + str(&slist.at(0)) + "',value='YQA=',valueencoded='2'},"
-        "{addr='" + str(&slist.at(1)) + "',value='YgA=',valueencoded='2'}]",
-        &slist, NS"QList", true, NS"QString");
+    prepare("dumpQList_QString");
+    if (0 && checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<"NS"QString>',value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<"NS"QString>',value='<0 items>',numchild='0'}");
+    next();
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<"NS"QString>',value='<1 items>',numchild='1'}");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<"NS"QString>',value='<1 items>',numchild='1',"
+            "childtype='"NS"QString',childnumchild='0',children=["
+            "{valueencoded='7',value='480061006c006c006f00'}]}", "local.list");
 }
-*/
 
-void dumpMisc()
+
+///////////////////////////// QList<QString3> ///////////////////////////////////
+
+void dumpQList_QString3()
 {
-    /* A */ int *s = new int(1);
-    /* B */ *s += 1;
-    /* D */ (void) s;
+    /* A */ QList<QString3> list;
+    /* B */ list.append(QString3());
+    /* C */ (void) 0;
 }
 
-void tst_Gdb::dumpMisc()
+void tst_Gdb::dumpQList_QString3()
 {
-    prepare("dumpMisc");
+    prepare("dumpQList_QString3");
+    if (checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<QString3>',value='<not in scope>',numchild='0'}");
     next();
-    run("B","{iname='local.s',addr='-',name='s',type='int *',"
-            "value='-',numchild='1'}", "", 0);
-    run("B","{iname='local.s',addr='-',name='s',type='int *',"
-            "value='-',numchild='1',children=[{iname='local.s.*',"
-            "name='*s',type='int',value='1',numchild='0'}]}", "local.s", 0);
+    run("B","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<QString3>',value='<0 items>',numchild='0'}");
+    next();
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<QString3>',value='<1 items>',numchild='1'}");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<QString3>',value='<1 items>',numchild='1',"
+            "childtype='QString3',children=["
+            "{value='{...}',numchild='3'}]}", "local.list");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<QString3>',value='<1 items>',numchild='1',"
+            "childtype='QString3',children=[{value='{...}',numchild='3',children=["
+         "{iname='local.list.0.s1',name='s1',type='"NS"QString',"
+            "valueencoded='7',value='6100',numchild='0'},"
+         "{iname='local.list.0.s2',name='s2',type='"NS"QString',"
+            "valueencoded='7',value='6200',numchild='0'},"
+         "{iname='local.list.0.s3',name='s3',type='"NS"QString',"
+            "valueencoded='7',value='6300',numchild='0'}]}]}",
+            "local.list,local.list.0");
+}
+
+
+///////////////////////////// QList<Int3> /////////////////////////////////////
+
+void dumpQList_Int3()
+{
+    /* A */ QList<Int3> list;
+    /* B */ list.append(Int3());
+    /* C */ (void) 0;
+}
+
+void tst_Gdb::dumpQList_Int3()
+{
+    prepare("dumpQList_Int3");
+    if (checkUninitialized)
+        run("A","{iname='local.list',addr='-',name='list',"
+                "type='"NS"QList<Int3>',value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<Int3>',value='<0 items>',numchild='0'}");
+    next();
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<Int3>',value='<1 items>',numchild='1'}");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<Int3>',value='<1 items>',numchild='1',"
+            "childtype='Int3',children=[{value='{...}',numchild='3'}]}",
+            "local.list");
+    run("C","{iname='local.list',addr='-',name='list',"
+            "type='"NS"QList<Int3>',value='<1 items>',numchild='1',"
+            "childtype='Int3',children=[{value='{...}',numchild='3',children=["
+         "{iname='local.list.0.i1',name='i1',type='int',value='42',numchild='0'},"
+         "{iname='local.list.0.i2',name='i2',type='int',value='43',numchild='0'},"
+         "{iname='local.list.0.i3',name='i3',type='int',value='44',numchild='0'}]}]}",
+            "local.list,local.list.0");
+}
+
+///////////////////////////// QVector /////////////////////////////////
+
+void dumpQStack()
+{
+    /* A */ QStack<int> v;
+    /* B */ v.append(3);
+    /* C */ v.append(2);
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dumpQStack()
+{
+    prepare("dumpQStack");
+    if (checkUninitialized)
+        run("A","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<0 items>',numchild='0'}");
+    run("B","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<0 items>',numchild='0',children=[]}", "local.v");
+    next();
+    run("C","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<1 items>',numchild='1'}");
+    run("C","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<1 items>',numchild='1',childtype='int',"
+            "childnumchild='0',children=[{value='3'}]}",  // rounding...
+            "local.v");
+    next();
+    run("D","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<2 items>',numchild='2'}");
+    run("D","{iname='local.v',addr='-',name='v',type='"NS"QStack<int>',"
+            "value='<2 items>',numchild='2',childtype='int',"
+            "childnumchild='0',children=[{value='3'},{value='2'}]}",
+            "local.v");
 }
 
-void dumpQStringTest()
+
+///////////////////////////// QString /////////////////////////////////////
+
+void dumpQString()
 {
     /* A */ QString s;
     /* B */ s = "hallo"; 
@@ -2426,18 +2809,27 @@ void dumpQStringTest()
 
 void tst_Gdb::dumpQString()
 {
-    prepare("dumpQStringTest");
-    run("A","{iname='local.s',addr='-',name='s',type='"NS"QString',"
-            "value='<not in scope>',numchild='0'}");
+    prepare("dumpQString");
+    if (checkUninitialized)
+        run("A","{iname='local.s',addr='-',name='s',type='"NS"QString',"
+                "value='<not in scope>',numchild='0'}");
     next();
     run("B","{iname='local.s',addr='-',name='s',type='"NS"QString',"
             "valueencoded='7',value='',numchild='0'}", "local.s");
-    // Plain C:
+    // Plain C style dumping:
     run("B","{iname='local.s',addr='-',name='s',type='"NS"QString',"
             "value='{...}',numchild='5'}", "", 0);
     run("B","{iname='local.s',addr='-',name='s',type='"NS"QString',"
-            "value='{...}',numchild='5',children=[]}", "local.s", 0);
-return;
+            "value='{...}',numchild='5',children=["
+            "{iname='local.s.d',name='d',type='"NS"QString::Data *',"
+            "value='-',numchild='1'}]}", "local.s", 0);
+    run("B","{iname='local.s',addr='-',name='s',type='"NS"QString',"
+            "value='{...}',numchild='5',"
+            "children=[{iname='local.s.d',name='d',"
+              "type='"NS"QString::Data *',value='-',numchild='1',"
+                "children=[{iname='local.s.d.*',name='*d',"
+                "type='"NS"QString::Data',value='{...}',numchild='11'}]}]}",
+            "local.s,local.s.d", 0);
     next();
     run("C","{iname='local.s',addr='-',name='s',type='"NS"QString',"
             "valueencoded='7',value='680061006c006c006f00',numchild='0'}");
@@ -2446,7 +2838,10 @@ return;
             "valueencoded='7',value='680061006c006c006f007800',numchild='0'}");
 }
 
-void dumpQStringListTest()
+
+///////////////////////////// QStringList /////////////////////////////////
+
+void dumpQStringList()
 {
     /* A */ QStringList s;
     /* B */ s.append("hello");
@@ -2456,9 +2851,10 @@ void dumpQStringListTest()
 
 void tst_Gdb::dumpQStringList()
 {
-    prepare("dumpQStringListTest");
-    //run("A","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
-    //        "value='<not in scope>',numchild='0'}");
+    prepare("dumpQStringList");
+    if (checkUninitialized)
+        run("A","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
+            "value='<not in scope>',numchild='0'}");
     next();
     run("B","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
             "value='<0 items>',numchild='0'}");
@@ -2472,7 +2868,6 @@ void tst_Gdb::dumpQStringList()
             "childnumchild='0',children=[{valueencoded='7',"
             "value='680065006c006c006f00'}]}",
             "local.s");
-return;
     next();
     run("D","{iname='local.s',addr='-',name='s',type='"NS"QStringList',"
             "value='<2 items>',numchild='2'}");
@@ -2485,6 +2880,43 @@ return;
 }
 
 
+///////////////////////////// QVector /////////////////////////////////
+
+void dumpQVector()
+{
+    /* A */ QVector<double> v;
+    /* B */ v.append(3.14);
+    /* C */ v.append(2.81);
+    /* D */ (void) 0;
+}
+
+void tst_Gdb::dumpQVector()
+{
+    prepare("dumpQVector");
+    if (checkUninitialized)
+        run("A","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<not in scope>',numchild='0'}");
+    next();
+    run("B","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<0 items>',numchild='0'}");
+    run("B","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<0 items>',numchild='0',children=[]}", "local.v");
+    next();
+    run("C","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<1 items>',numchild='1'}");
+    run("C","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<1 items>',numchild='1',childtype='double',"
+            "childnumchild='0',children=[{value='-'}]}",  // rounding...
+            "local.v");
+    next();
+    run("D","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<2 items>',numchild='2'}");
+    run("D","{iname='local.v',addr='-',name='v',type='"NS"QVector<double>',"
+            "value='<2 items>',numchild='2',childtype='double',"
+            "childnumchild='0',children=[{value='-'},{value='-'}]}",
+            "local.v");
+}
+
 /////////////////////////////////////////////////////////////////////////
 //
 // Main
diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp
index cc69cb1681b1fbedf8356d77f24310911a1888d6..63efc8b985bdcc51a14172339ed788dd890af84a 100644
--- a/tests/manual/cplusplus/main.cpp
+++ b/tests/manual/cplusplus/main.cpp
@@ -33,7 +33,6 @@
 #include <Scope.h>
 #include <Semantic.h>
 #include <TranslationUnit.h>
-#include <PrettyPrinter.h>
 #include <Literals.h>
 #include <Symbols.h>
 #include <Names.h>
@@ -52,171 +51,7 @@
 #include <iostream>
 #include <sstream>
 
-CPLUSPLUS_USE_NAMESPACE
-
-class Rewrite
-{
-    QMultiMap<unsigned, QByteArray> _insertBefore;
-    QMultiMap<unsigned, QByteArray> _insertAfter;
-    QSet<unsigned> _removed;
-
-public:
-    void remove(unsigned index)
-    { remove(index, index + 1); }
-
-    void remove(unsigned first, unsigned last)
-    {
-        Q_ASSERT(first < last);
-
-        for (; first != last; ++first)
-            _removed.insert(first);
-    }
-
-    void insertTextBefore(unsigned index, const QByteArray &text)
-    { _insertBefore.insert(index, text); }
-
-    void insertTextAfter(unsigned index, const QByteArray &text)
-    { _insertAfter.insert(index, text); }
-
-    void rewrite(const TranslationUnit *unit,
-                 const QByteArray &contents,
-                 QByteArray *out)
-    {
-        _source = contents;
-        const char *source = contents.constData();
-        unsigned previousTokenEndPosition = 0;
-        for (unsigned i = 0; i < unit->tokenCount(); ++i) {
-            const Token &tk = unit->tokenAt(i);
-
-            if (previousTokenEndPosition != tk.begin()) {
-                Q_ASSERT(previousTokenEndPosition < tk.begin());
-                out->append(source + previousTokenEndPosition,
-                            tk.begin() - previousTokenEndPosition);
-            }
-
-            QMultiMap<unsigned, QByteArray>::const_iterator it;
-
-            it = _insertBefore.constFind(i);
-            for (; it != _insertBefore.constEnd() && it.key() == i; ++it) {
-                out->append(it.value());
-            }
-
-            if (! _removed.contains(i))
-                out->append(source + tk.begin(), tk.f.length);
-
-            it = _insertAfter.constFind(i);
-            for (; it != _insertAfter.constEnd() && it.key() == i; ++it) {
-                out->append(it.value());
-            }
-
-            previousTokenEndPosition = tk.end();
-        }
-    }
-
-protected:
-    QByteArray _source;
-};
-
-class SimpleRefactor: protected ASTVisitor, Rewrite {
-public:
-    SimpleRefactor(Control *control)
-        : ASTVisitor(control)
-    { }
-
-    void operator()(const TranslationUnit *unit,
-                    const QByteArray &source,
-                    QByteArray *out)
-    {
-        accept(unit->ast());
-        rewrite(unit, source, out);
-    }
-
-protected:
-    bool isEnumOrTypedefEnum(SpecifierAST *spec) {
-        if (! spec)
-            return false;
-        if (SimpleSpecifierAST *simpleSpec = spec->asSimpleSpecifier()) {
-            if (tokenKind(simpleSpec->specifier_token) == T_TYPEDEF)
-                return isEnumOrTypedefEnum(spec->next);
-        }
-        return spec->asEnumSpecifier() != 0;
-    }
-    virtual bool visit(SimpleDeclarationAST *ast) {
-        if (isEnumOrTypedefEnum(ast->decl_specifier_seq)) {
-            //remove(ast->firstToken(), ast->lastToken());
-            insertTextBefore(ast->firstToken(), "/* #REF# removed ");
-            insertTextAfter(ast->lastToken() - 1, "*/");
-            return true;
-        }
-        return true;
-    }
-
-    virtual bool visit(AccessDeclarationAST *ast)
-    {
-        if (tokenKind(ast->access_specifier_token) == T_PRIVATE) {
-            // change visibility from `private' to `public'.
-            remove(ast->access_specifier_token);
-            insertTextAfter(ast->access_specifier_token, "public /* #REF# private->public */");
-        }
-        return true;
-    }
-
-    virtual bool visit(FunctionDefinitionAST *ast)
-    {
-        bool isInline = false;
-        for (SpecifierAST *spec = ast->decl_specifier_seq; spec; spec = spec->next) {
-            if (SimpleSpecifierAST *simpleSpec = spec->asSimpleSpecifier()) {
-                if (tokenKind(simpleSpec->specifier_token) == T_INLINE) {
-                    isInline = true;
-                    break;
-                }
-            }
-        }
-
-        // force the `inline' specifier.
-        if (! isInline)
-            insertTextBefore(ast->firstToken(), "inline /* #REF# made inline */ ");
-
-        return true;
-    }
-
-    virtual bool visit(ClassSpecifierAST *ast)
-    {
-        // export/import the class using the macro MY_EXPORT.
-        if (ast->name)
-            insertTextBefore(ast->name->firstToken(), "MY_EXPORT ");
-
-        // add QObject to the base clause.
-        if (ast->colon_token)
-            insertTextAfter(ast->colon_token, " public QObject,");
-        else if (ast->lbrace_token)
-            insertTextBefore(ast->lbrace_token, ": public QObject ");
-
-        // mark the class as Q_OBJECT.
-        if (ast->lbrace_token)
-            insertTextAfter(ast->lbrace_token, " Q_OBJECT\n");
-
-        for (DeclarationListAST *it = ast->member_specifiers; it; it = it->next) {
-            accept(it->declaration);
-        }
-
-        return false;
-    }
-
-    virtual bool visit(CppCastExpressionAST *ast)
-    {
-        // Replace the C++ cast expression (e.g. static_cast<foo>(a)) with
-        // the one generated by the pretty printer.
-        std::ostringstream o;
-        PrettyPrinter pp(control(), o);
-        pp(ast, _source);
-        remove(ast->firstToken(), ast->lastToken());
-        const std::string str = o.str();
-        insertTextBefore(ast->firstToken(), str.c_str());
-        insertTextBefore(ast->firstToken(), "/* #REF# beautiful cast */ ");
-        return false;
-    }
-};
+using namespace CPlusPlus;
 
 class CloneCG: protected ASTVisitor
 {
@@ -260,11 +95,9 @@ public:
             "#include \"AST.h\"\n"
             "#include \"ASTVisitor.h\"\n"
             "\n"
-            "CPLUSPLUS_BEGIN_NAMESPACE\n" << std::endl;
+            "using namespace CPlusPlus;\n" << std::endl;
 
         accept(ast);
-
-        std::cout << "CPLUSPLUS_END_NAMESPACE" << std::endl;
     }
 
 protected:
@@ -415,14 +248,12 @@ public:
             "\n"
             "#include \"AST.h\"\n"
             "\n"
-            "CPLUSPLUS_BEGIN_NAMESPACE\n" << std::endl;
+            "using namespace CPlusPlus;\n" << std::endl;
 
         SearchListNodes listNodes(control());
         _listNodes = listNodes(ast);
 
         accept(ast);
-
-        std::cout << "CPLUSPLUS_END_NAMESPACE" << std::endl;
     }
 
 protected:
@@ -513,23 +344,15 @@ int main(int argc, char *argv[])
     const QString appName = args.first();
     args.removeFirst();
 
-    bool test_rewriter = false;
-    bool test_pretty_printer = false;
-
-    foreach (QString arg, args) {
-        if (arg == QLatin1String("--test-rewriter"))
-            test_rewriter = true;
-        else if (arg == QLatin1String("--test-pretty-printer"))
-            test_pretty_printer = true;
-        else if (arg == QLatin1String("--help")) {
+    foreach (const QString &arg, args) {
+        if (arg == QLatin1String("--help")) {
             const QFileInfo appInfo(appName);
             const QByteArray appFileName = QFile::encodeName(appInfo.fileName());
 
             printf("Usage: %s [options]\n"
-                   "  --help                    Display this information\n"
-                   "  --test-rewriter           Test the tree rewriter\n"
-                   "  --test-pretty-printer     Test the pretty printer\n",
+                   "  --help                    Display this information\n",
                    appFileName.constData());
+
             return EXIT_SUCCESS;
         }
     }
@@ -558,18 +381,5 @@ int main(int argc, char *argv[])
         sem.check(decl->declaration, globalNamespace->members());
     }
 
-    // test the rewriter
-    if (test_rewriter) {
-        QByteArray out;
-        SimpleRefactor refactor(&control);
-        refactor(&unit, source, &out);
-        printf("%s\n", out.constData());
-    } else if (test_pretty_printer) {
-        MemoryPool pool2;
-        TranslationUnitAST *other = unit.ast()->clone(&pool2)->asTranslationUnit();
-        PrettyPrinter pp(&control, std::cout);
-        pp(other, source);
-    }
-
     return EXIT_SUCCESS;
 }
diff --git a/tests/manual/cplusplus/test-pretty-printer b/tests/manual/cplusplus/test-pretty-printer
deleted file mode 100755
index 7403721300eddd0440cf5dc632eb0aefd7b34fbc..0000000000000000000000000000000000000000
--- a/tests/manual/cplusplus/test-pretty-printer
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-me=$(dirname $0)
-${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0 --test-pretty-printer
diff --git a/tests/manual/cplusplus/test-rewriter b/tests/manual/cplusplus/test-rewriter
deleted file mode 100755
index c0494257c8f5a81cb382ac603bb4c84edc3b8055..0000000000000000000000000000000000000000
--- a/tests/manual/cplusplus/test-rewriter
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-me=$(dirname $0)
-${CPP-gcc} -xc++ -E -include $me/conf.c++ $* | $me/cplusplus0 --test-rewriter
diff --git a/tests/manual/plain-cplusplus/main.cpp b/tests/manual/plain-cplusplus/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e975897d21d3bd05c1919c90cff2da68ad2bac59
--- /dev/null
+++ b/tests/manual/plain-cplusplus/main.cpp
@@ -0,0 +1,79 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include <AST.h>
+#include <ASTVisitor.h>
+#include <Control.h>
+#include <Scope.h>
+#include <Semantic.h>
+#include <TranslationUnit.h>
+#include <Literals.h>
+#include <Symbols.h>
+#include <Names.h>
+#include <CoreTypes.h>
+
+#include <string>
+#include <cstdlib>
+#include <cstdlib>
+
+using namespace CPlusPlus;
+
+int main(int argc, char *argv[])
+{
+    std::string cmdline;
+    cmdline += "gcc -E -xc++ -U__BLOCKS__";
+
+    for (int i = 1; i < argc; ++i) {
+        cmdline += ' ';
+        cmdline += argv[i];
+    }
+
+    enum { BLOCK_SIZE = 4 * 1024};
+    char block[BLOCK_SIZE];
+
+    std::string source;
+
+    if (FILE *fp = popen(cmdline.c_str(), "r")) {
+        while (size_t sz = fread(block, 1, BLOCK_SIZE, fp))
+            source.append(block, sz);
+
+        pclose(fp);
+
+    } else {
+        fprintf(stderr, "c++: No such file or directory\n");
+        return EXIT_FAILURE;
+    }
+
+    Control control;
+    TranslationUnit unit(&control, control.findOrInsertStringLiteral("<stdin>"));
+    unit.setSource(source.c_str(), source.size());
+    unit.parse();
+
+    return EXIT_SUCCESS;
+}
diff --git a/tests/manual/plain-cplusplus/plain-cplusplus.pro b/tests/manual/plain-cplusplus/plain-cplusplus.pro
new file mode 100644
index 0000000000000000000000000000000000000000..d77e233f863d8e2b44c11dd6542e9755dc205b34
--- /dev/null
+++ b/tests/manual/plain-cplusplus/plain-cplusplus.pro
@@ -0,0 +1,23 @@
+QT -= core gui
+TARGET = plain-c++
+
+macx {
+    CONFIG -= app_bundle
+    release:LIBS += -Wl,-exported_symbol -Wl,_main
+}
+
+include(../../../src/shared/cplusplus/cplusplus.pri)
+
+# Input
+SOURCES += main.cpp
+
+unix {
+    debug:OBJECTS_DIR = $${OUT_PWD}/.obj/debug-shared
+    release:OBJECTS_DIR = $${OUT_PWD}/.obj/release-shared
+
+    debug:MOC_DIR = $${OUT_PWD}/.moc/debug-shared
+    release:MOC_DIR = $${OUT_PWD}/.moc/release-shared
+
+    RCC_DIR = $${OUT_PWD}/.rcc/
+    UI_DIR = $${OUT_PWD}/.uic/
+}
diff --git a/tests/manual/trklauncher/main.cpp b/tests/manual/trklauncher/main.cpp
index 65031e7cc5aab100945db92aa3708553f0f11a6f..35336632173fe16ef8f9f9da9f9dbd4c4a5220ea 100644
--- a/tests/manual/trklauncher/main.cpp
+++ b/tests/manual/trklauncher/main.cpp
@@ -1,13 +1,19 @@
 #include "launcher.h"
+#include "communicationstarter.h"
 
 #include <QtCore/QCoreApplication>
+#include <QtCore/QSharedPointer>
 #include <QtCore/QDebug>
 #include <QtCore/QStringList>
 
 static const char *usageC =
-"\nUsage: %1 <trk_port_name> [-v] [-i remote_sis_file | -I local_sis_file remote_sis_file] [<remote_executable_name>]\n"
+"\n"
+"Usage: %1 [options] <trk_port_name>\n"
+"       %1 [options] -i <trk_port_name> remote_sis_file\n"
+"       %1 [options] -I local_sis_file remote_sis_file] [<remote_executable_name>]\n"
 "\nOptions:\n    -v verbose\n"
-            "    -f turn serial message frame off\n\n"
+            "    -b Prompt for Bluetooth connect (Linux only)\n"
+            "    -f turn serial message frame off (Bluetooth)\n"
 "\nPing:\n"
 "%1 COM5\n"
 "\nRemote launch:\n"
@@ -27,74 +33,94 @@ static void usage()
     qWarning("%s", qPrintable(msg));
 }
 
-static bool parseArguments(const QStringList &arguments, trk::Launcher &launcher)
+typedef QSharedPointer<trk::Launcher> TrkLauncherPtr;
+
+// Parse arguments, return pointer or a null none.
+
+static inline TrkLauncherPtr createLauncher(trk::Launcher::Actions actions,
+                                            const QString &serverName,
+                                            bool serialFrame,
+                                            int verbosity)
+{
+    TrkLauncherPtr launcher(new trk::Launcher(actions));
+    launcher->setTrkServerName(serverName);
+    launcher->setSerialFrame(serialFrame);
+    launcher->setVerbose(verbosity);
+    return launcher;
+}
+
+static TrkLauncherPtr parseArguments(const QStringList &arguments, bool *bluetooth)
 {
     // Parse away options
     bool install = false;
     bool customInstall = false;
+    bool serialFrame = true;
     const int argCount = arguments.size();
     int verbosity = 0;
+    *bluetooth = false;
+    trk::Launcher::Actions actions = trk::Launcher::ActionPingOnly;
     int a = 1;
     for ( ; a < argCount; a++) {
         const QString option = arguments.at(a);
         if (!option.startsWith(QLatin1Char('-')))
             break;
         if (option.size() != 2)
-            return  false;
+            return TrkLauncherPtr();        
         switch (option.at(1).toAscii()) {
         case 'v':
             verbosity++;
             break;
         case 'f':
-            launcher.setSerialFrame(false);
-            break;verbosity++;
+            serialFrame = false;
+            break;
+        case 'b':
+            *bluetooth = true;
+            break;
         case 'i':
             install = true;
-            launcher.addStartupActions(trk::Launcher::ActionInstall);
+            actions = trk::Launcher::ActionInstall;
             break;
         case 'I':
             customInstall = true;
-            launcher.addStartupActions(trk::Launcher::ActionCopyInstall);
+            actions = trk::Launcher::ActionCopyInstall;
             break;
         default:
-            return false;
+            return TrkLauncherPtr();
         }
     }
-
-    launcher.setVerbose(verbosity);
     // Evaluate arguments
     const int remainingArgsCount = argCount - a;
-    if (remainingArgsCount == 1 && !install && !customInstall) {
-        launcher.setTrkServerName(arguments.at(a)); // ping
-        return true;
+    if (remainingArgsCount == 1 && !install && !customInstall) { // Ping
+        return createLauncher(actions, arguments.at(a), serialFrame, verbosity);
     }
     if (remainingArgsCount == 2 && !install && !customInstall) {
         // remote exec
-        launcher.addStartupActions(trk::Launcher::ActionRun);
-        launcher.setTrkServerName(arguments.at(a));
-        launcher.setFileName(arguments.at(a + 1));
-        return true;
+        TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
+        launcher->addStartupActions(trk::Launcher::ActionRun);
+        launcher->setFileName(arguments.at(a + 1));
+        return launcher;
     }
     if ((remainingArgsCount == 3 || remainingArgsCount == 2) && install && !customInstall) {
-        launcher.setTrkServerName(arguments.at(a)); // ping
-        launcher.setInstallFileName(arguments.at(a + 1));
+        TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
+        launcher->setInstallFileName(arguments.at(a + 1));
         if (remainingArgsCount == 3) {
-            launcher.addStartupActions(trk::Launcher::ActionRun);
-            launcher.setFileName(arguments.at(a + 2));
+            launcher->addStartupActions(trk::Launcher::ActionRun);
+            launcher->setFileName(arguments.at(a + 2));
         }
-        return true;
+        return launcher;
     }
     if ((remainingArgsCount == 4 || remainingArgsCount == 3) && !install && customInstall) {
-        launcher.setTrkServerName(arguments.at(a)); // ping
-        launcher.setCopyFileName(arguments.at(a + 1), arguments.at(a + 2));
-        launcher.setInstallFileName(arguments.at(a + 2));
+        TrkLauncherPtr launcher = createLauncher(actions, arguments.at(a), serialFrame, verbosity);
+        launcher->setTrkServerName(arguments.at(a)); // ping
+        launcher->setCopyFileName(arguments.at(a + 1), arguments.at(a + 2));
+        launcher->setInstallFileName(arguments.at(a + 2));
         if (remainingArgsCount == 4) {
-            launcher.addStartupActions(trk::Launcher::ActionRun);
-            launcher.setFileName(arguments.at(a + 3));
+            launcher->addStartupActions(trk::Launcher::ActionRun);
+            launcher->setFileName(arguments.at(a + 3));
         }
-        return true;
+        return launcher;
     }
-    return false;
+    return TrkLauncherPtr();
 }
 
 int main(int argc, char *argv[])
@@ -103,14 +129,23 @@ int main(int argc, char *argv[])
     QCoreApplication::setApplicationName(QLatin1String("trklauncher"));
     QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
 
-    trk::Launcher launcher;
-    if (!parseArguments(app.arguments(), launcher)) {
+    bool bluetooth;
+    const TrkLauncherPtr launcher = parseArguments(app.arguments(), &bluetooth);
+    if (launcher.isNull()) {
         usage();
         return 1;
     }
-    QObject::connect(&launcher, SIGNAL(finished()), &app, SLOT(quit()));
+    QObject::connect(launcher.data(), SIGNAL(finished()), &app, SLOT(quit()));
+    // BLuetooth: Open with prompt
     QString errorMessage;
-    if (launcher.startServer(&errorMessage))
+    if (bluetooth && !trk::ConsoleBluetoothStarter::startBluetooth(launcher->trkDevice(),
+                                                     launcher.data(),
+                                                     launcher->trkServerName(),
+                                                     30, &errorMessage)) {
+        qWarning("%s\n", qPrintable(errorMessage));
+        return -1;
+    }
+    if (launcher->startServer(&errorMessage))
         return app.exec();
     qWarning("%s\n", qPrintable(errorMessage));
     return 4;
diff --git a/tests/manual/trklauncher/trklauncher.pro b/tests/manual/trklauncher/trklauncher.pro
index 73e7f7d781886070b57e033459941b25c4d234a3..943afde4ada2fde33c17e08c97ff4dedb55d095e 100644
--- a/tests/manual/trklauncher/trklauncher.pro
+++ b/tests/manual/trklauncher/trklauncher.pro
@@ -1,5 +1,5 @@
 TEMPLATE = app
 QT = core
+CONFIG += console
 include(../../../src/shared/trk/trk.pri)
-win32:CONFIG += console
 SOURCES += main.cpp