diff --git a/doc/api/qtcreator-api.qdoc b/doc/api/qtcreator-api.qdoc
index 5ac78d98069a404d33006f40cdc8572f50de2687..1485e9646317276c05fad759c8391d847335283b 100644
--- a/doc/api/qtcreator-api.qdoc
+++ b/doc/api/qtcreator-api.qdoc
@@ -4,6 +4,10 @@
 
     Qt Creator is Qt Software's crossplatform IDE. The core of Qt Creator is
     basically only a \l{ExtensionSystem}{plugin loader}.
+    All functionality is implemented in plugins, the basis of Qt Creator is
+    implemented in the \l{Core} {Core} Plugin. The plugin manager provides
+    simple means for plugin cooperation that allow plugins to provide
+    hooks for other plugin's extensions.
 
     \section1 Core Libraries
 
diff --git a/doc/api/qtcreator-api.qdocconf b/doc/api/qtcreator-api.qdocconf
index 92c40b8a388aa476ded07a7268420aacafb71862..476c8e6a4df098fec1d48b950815d9b819615621 100644
--- a/doc/api/qtcreator-api.qdocconf
+++ b/doc/api/qtcreator-api.qdocconf
@@ -6,14 +6,14 @@ language                = Cpp
 headerdirs              = . \
                           ../../src/libs/aggregation \
                           ../../src/libs/extensionsystem \
-                          ../../src/plugins/core \
-                          ../../src/plugins/core/actionmanager
+                          ../../src/plugins/coreplugin \
+                          ../../src/plugins/coreplugin/actionmanager
 
 sourcedirs              = . \
                           ../../src/libs/aggregation \
                           ../../src/libs/extensionsystem \
-                          ../../src/plugins/core \
-                          ../../src/plugins/core/actionmanager
+                          ../../src/plugins/coreplugin \
+                          ../../src/plugins/coreplugin/actionmanager
 
 headers.fileextesnions  = "*.h"
 sources.fileextensions  = "*.cpp *.qdoc"
diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc
index cab30627c6e48f7030bcf3993a9dda79f07f4c06..3c50c9d428050c7e4668c2f21e5b1dc7ad5c6b10 100644
--- a/doc/qtcreator.qdoc
+++ b/doc/qtcreator.qdoc
@@ -54,6 +54,7 @@
        \o \l{Navigating Quickly Around Your Code with Locator}
        \o \l{Debugging with Qt Creator}
        \o \l{Tips and Tricks}
+       \o \l{Keyboard Shortcuts}
        \o \l{Glossary}
        \o \l{Known Issues of Version 0.9.1 (Beta)}
     \endlist
@@ -150,6 +151,26 @@
 
     \image qtcreator-compile-pane.png
 
+
+    \section1 Session Management in Qt Creator
+
+    ### screenshot
+
+    In Qt Creator, a session is a collection of loaded projects, opened files,
+    editor settings, and so on. When you run Qt Creator, you have a default
+    session. You can create a new session using the \gui{Session Manager...},
+    available in the \gui{File -> Session} menu.
+
+    To switch between sessions, select \gui{File -> Session}. If you do not
+    create and select any session, Qt Creator will always use the default
+    session.
+
+\omit
+    session management can also store project dependencies, thorbjorn is
+    currently working on it
+\endomit
+
+
     \section1 Qt Help Integration
 
     Qt Creator comes fully integrated with all of Qt's documentation and
@@ -380,9 +401,11 @@
 
     We begin with a Qt4 Gui Application project generated by Qt Creator. The
     \l{Creating a Project in Qt Creator} document describes this process in
-    detail. Remember to select QWidget as the Text Finder's base class.
+    detail. Remember to select QWidget as the Text Finder's base class. If
+    your project is not yet loaded, you can load it by selecting \gui{Open}
+    from the \gui{File} menu.
 
-    Once your project is generated, you will have the following files:
+    In your project you will have the following files:
 
     \list
         \o \c{textfinder.h}
diff --git a/shared/cplusplus/AST.cpp b/shared/cplusplus/AST.cpp
index d112f9ab537ebd4d7c0264ab8dfc79147a207d8d..11be99ea48a1257371a3a584e5894b9669c55ca1 100644
--- a/shared/cplusplus/AST.cpp
+++ b/shared/cplusplus/AST.cpp
@@ -3898,6 +3898,8 @@ void IdentifierListAST::accept0(ASTVisitor *visitor)
 
 unsigned ObjCClassDeclarationAST::firstToken() const
 {
+    if (attributes)
+        return attributes->firstToken();
     return class_token;
 }
 
@@ -3911,12 +3913,19 @@ unsigned ObjCClassDeclarationAST::lastToken() const
             return it->identifier_token + 1;
     }
 
+    for (SpecifierAST *it = attributes; it; it = it->next) {
+        if (! it->next)
+            return it->lastToken();
+    }
+
     return class_token + 1;
 }
 
 ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
 {
     ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
+    if (attributes)
+        ast->attributes = attributes->clone(pool);
     ast->class_token = class_token;
     if (identifier_list)
         ast->identifier_list = identifier_list->clone(pool);
@@ -3927,6 +3936,9 @@ ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
 void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
+        for (SpecifierAST *it = attributes; it; it = it->next) {
+            accept(it, visitor);
+        }
     }
 }
 
diff --git a/shared/cplusplus/AST.h b/shared/cplusplus/AST.h
index d03cd3ff82c6fc44aac09abbc9979ced259ff7bd..6607e76805b8072094d40bc4f43551d34ff57920 100644
--- a/shared/cplusplus/AST.h
+++ b/shared/cplusplus/AST.h
@@ -1949,6 +1949,7 @@ protected:
 class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST
 {
 public:
+    SpecifierAST *attributes;
     unsigned class_token;
     IdentifierListAST *identifier_list;
     unsigned semicolon_token;
diff --git a/shared/cplusplus/Parser.cpp b/shared/cplusplus/Parser.cpp
index 8e15a220be538f5406fe351b8a7ae3977eb24904..407cbc36fd8530b797cee2f181ae1708dcc988d3 100644
--- a/shared/cplusplus/Parser.cpp
+++ b/shared/cplusplus/Parser.cpp
@@ -403,39 +403,48 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
     case T_EXPORT:
         return parseTemplateDeclaration(node);
 
-    // objc++
-    case T_AT_IMPLEMENTATION:
-        return parseObjCClassImplementation(node);
-
+    // ObjcC++
     case T_AT_CLASS:
         return parseObjCClassDeclaration(node);
 
     case T_AT_INTERFACE:
-        return parseObjCInterfaceDeclaration(node);
+        return parseObjCInterface(node);
 
     case T_AT_PROTOCOL:
-        return parseObjCProtocolDeclaration(node);
-
-    case T_AT_END:
-        return parseObjCEndDeclaration(node);
+        return parseObjCProtocol(node);
 
-    case T_AT_COMPATIBILITY_ALIAS:
-        return parseObjCAliasDeclaration(node);
+    case T_AT_IMPLEMENTATION:
+        return parseObjCImplementation(node);
 
-    case T_AT_SYNTHESIZE:
-        return parseObjCPropertySynthesize(node);
+    case T_AT_END:
+        return parseObjCEnd(node);
 
-    case T_AT_DYNAMIC:
-        return parseObjCPropertyDynamic(node);
+    default: {
+        if (_objCEnabled && LA() == T___ATTRIBUTE__) {
+            const unsigned start = cursor();
+            SpecifierAST *attributes = 0, **attr = &attributes;
+            while (parseAttributeSpecifier(*attr))
+                attr = &(*attr)->next;
+            if (LA() == T_AT_INTERFACE)
+                return parseObjCInterface(node, attributes);
+            else if (LA() == T_AT_PROTOCOL)
+                return parseObjCProtocol(node, attributes);
+            else if (LA() == T_AT_PROPERTY)
+                return parseObjCPropertyDeclaration(node, attributes);
+            rewind(start);
+        }
 
-    default:
         if (LA() == T_EXTERN && LA(2) == T_TEMPLATE)
             return parseTemplateDeclaration(node);
         else if (LA() == T_EXTERN && LA(2) == T_STRING_LITERAL)
             return parseLinkageSpecification(node);
         else
             return parseSimpleDeclaration(node);
+    }   break; // default
+
     } // end switch
+
+    return false;
 }
 
 bool Parser::parseLinkageSpecification(DeclarationAST *&node)
@@ -2543,16 +2552,7 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
     case T_SLOT:
         return parseQtMethod(node);
 
-    case T_AT_ENCODE:
-    case T_AT_PROTOCOL:
-    case T_AT_SELECTOR:
-    case T_AT_STRING_LITERAL:
-        return parseObjCExpression(node);
-
     default: {
-        if (_objCEnabled && LA() == T_LBRACKET)
-            return parseObjCExpression(node);
-
         unsigned startOfName = cursor();
         NameAST *name = 0;
         if (parseName(name)) {
@@ -3303,513 +3303,451 @@ bool Parser::parseThrowExpression(ExpressionAST *&node)
     return false;
 }
 
-bool Parser::parseObjCClassImplementation(DeclarationAST *&)
+bool Parser::lookAtObjCSelector() const
 {
-    if (LA() != T_AT_IMPLEMENTATION)
-        return false;
-
-    /*unsigned implementation_token = */ consumeToken();
-    unsigned identifier_token = 0;
-    match(T_IDENTIFIER, &identifier_token);
+    switch (LA()) {
+    case T_IDENTIFIER:
+    case T_OR:
+    case T_AND:
+    case T_NOT:
+    case T_XOR:
+    case T_BITOR:
+    case T_COMPL:
+    case T_OR_EQ:
+    case T_AND_EQ:
+    case T_BITAND:
+    case T_NOT_EQ:
+    case T_XOR_EQ:
+        return true;
 
-    if (LA() == T_COLON) {
-        /*unsigned colon_token = */ consumeToken();
-        unsigned superclass_name_token = 0;
-        match(T_IDENTIFIER, &superclass_name_token);
-    } else if (LA() == T_LPAREN) {
-        /*unsigned lparen_token = */ consumeToken();
-        unsigned category_name_token = 0;
-        if (LA() == T_IDENTIFIER)
-            category_name_token = consumeToken();
-        unsigned rparen_token = 0;
-        match(T_RPAREN, &rparen_token);
-    }
+    default:
+        if (tok().isKeyword())
+            return true;
+    } // switch
 
-    _inObjCImplementationContext = true;
-    parseObjCMethodDefinitionList();
-    return true;
+    return false;
 }
 
-bool Parser::parseObjCClassDeclaration(DeclarationAST *&node)
+// objc-class-declaraton ::= T_AT_CLASS (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
+//
+bool Parser::parseObjCClassDeclaration(DeclarationAST *&)
 {
     if (LA() != T_AT_CLASS)
         return false;
 
-    ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
-    ast->class_token = consumeToken();
-    parseObjCIdentifierList(ast->identifier_list);
-    match(T_SEMICOLON, &ast->semicolon_token);
-    node = ast;
+    /*unsigned objc_class_token = */ consumeToken();
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+    while (LA() == T_COMMA) {
+        consumeToken(); // skip T_COMMA
+        match(T_IDENTIFIER, &identifier_token);
+    }
+
+    unsigned semicolon_token = 0;
+    match(T_SEMICOLON, &semicolon_token);
     return true;
 }
 
-bool Parser::parseObjCInterfaceDeclaration(DeclarationAST *&)
+// objc-interface ::= attribute-specifier-list-opt objc-class-interface
+// objc-interface ::= objc-category-interface
+//
+// objc-class-interface ::= T_AT_INTERFACE T_IDENTIFIER (T_COLON T_IDENTIFIER)?
+//                          objc-protocol-refs-opt
+//                          objc-class-instance-variables-opt
+//                          objc-interface-declaration-list
+//                          T_AT_END
+//
+// objc-category-interface ::= T_AT_INTERFACE T_IDENTIFIER
+//                             T_LPAREN T_IDENTIFIER? T_RPAREN
+//                             objc-protocol-refs-opt
+//                             objc-interface-declaration-list
+//                             T_AT_END
+//
+bool Parser::parseObjCInterface(DeclarationAST *&,
+                                SpecifierAST *attributes)
 {
+    if (! attributes && LA() == T___ATTRIBUTE__) {
+        SpecifierAST **attr = &attributes;
+        while (parseAttributeSpecifier(*attr))
+            attr = &(*attr)->next;
+    }
+
     if (LA() != T_AT_INTERFACE)
         return false;
 
-    /*unsigned interface_token = */ consumeToken();
-    unsigned interface_name_token = 0;
-    match(T_IDENTIFIER, &interface_name_token);
+    /*unsigned objc_interface_token = */ consumeToken();
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+
     if (LA() == T_LPAREN) {
-        // category interface
-        /*unsigned lparen_token = */ consumeToken();
-        unsigned catagory_name_token = 0;
+        // a category interface
+
+        if (attributes)
+            _translationUnit->error(attributes->firstToken(),
+                                    "invalid attributes for category interface declaration");
+
+        unsigned lparen_token = 0, rparen_token = 0;
+        match(T_LPAREN, &lparen_token);
         if (LA() == T_IDENTIFIER)
-            catagory_name_token = consumeToken();
-        unsigned rparen_token = 0;
+            consumeToken();
+
         match(T_RPAREN, &rparen_token);
+
         parseObjCProtocolRefs();
-        parseObjCClassInstanceVariables();
-        parseObjCInterfaceDeclList();
-        unsigned end_token = 0;
-        match(T_AT_END, &end_token);
-        return true;
-    } else {
-        // class interface
-        unsigned colon_token = 0;
-        unsigned super_class_token = 0;
-        if (LA() == T_COLON) {
-            colon_token = consumeToken();
-            match(T_IDENTIFIER, &super_class_token);
+        while (parseObjCInterfaceMemberDeclaration()) {
         }
-        parseObjCProtocolRefs();
-        parseObjCInterfaceDeclList();
-        unsigned end_token = 0;
-        match(T_AT_END, &end_token);
+        unsigned objc_end_token = 0;
+        match(T_AT_END, &objc_end_token);
         return true;
     }
-    return false;
-}
-
-bool Parser::parseObjCProtocolDeclaration(DeclarationAST *&)
-{
-    return false;
-}
 
-bool Parser::parseObjCEndDeclaration(DeclarationAST *&)
-{
-    if (LA() != T_AT_END)
-        return false;
-
-    unsigned end_token = consumeToken();
-
-    if (! _inObjCImplementationContext) {
-        _translationUnit->warning(end_token,
-            "@end must appear in an @implementation context");
+    // a class interface declaration
+    if (LA() == T_COLON) {
+        consumeToken();
+        unsigned identifier_token = 0;
+        match(T_IDENTIFIER, &identifier_token);
     }
 
-    _inObjCImplementationContext = false;
+    parseObjCProtocolRefs();
+    parseObjClassInstanceVariables();
+    while (parseObjCInterfaceMemberDeclaration()) {
+    }
+    unsigned objc_end_token = 0;
+    match(T_AT_END, &objc_end_token);
     return true;
 }
 
-bool Parser::parseObjCAliasDeclaration(DeclarationAST *&)
+// objc-protocol ::= T_AT_PROTOCOL (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
+//
+bool Parser::parseObjCProtocol(DeclarationAST *&,
+                               SpecifierAST *attributes)
 {
-    return false;
-}
+    if (! attributes && LA() == T___ATTRIBUTE__) {
+        SpecifierAST **attr = &attributes;
+        while (parseAttributeSpecifier(*attr))
+            attr = &(*attr)->next;
+    }
 
-bool Parser::parseObjCPropertySynthesize(DeclarationAST *&)
-{
-    return false;
-}
+    if (LA() != T_AT_PROTOCOL)
+        return false;
 
-bool Parser::parseObjCPropertyDynamic(DeclarationAST *&)
-{
-    return false;
-}
+    /*unsigned objc_protocol_token = */ consumeToken();
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+
+    if (LA() == T_COMMA || LA() == T_SEMICOLON) {
+        // a protocol forward declaration
 
-bool Parser::parseObjCIdentifierList(IdentifierListAST *&node)
-{
-    if (LA() == T_IDENTIFIER) {
-        IdentifierListAST **it = &node;
-        IdentifierListAST *id = new (_pool) IdentifierListAST;
-        id->identifier_token = consumeToken();
-        *it = id;
         while (LA() == T_COMMA) {
             consumeToken();
-            if (LA() == T_IDENTIFIER) {
-                it = &(*it)->next;
-                IdentifierListAST *id = new (_pool) IdentifierListAST;
-                id->identifier_token = consumeToken();
-                *it = id;
-            }
+            match(T_IDENTIFIER, &identifier_token);
         }
+        unsigned semicolon_token = 0;
+        match(T_SEMICOLON, &semicolon_token);
         return true;
     }
-    return false;
-}
 
-bool Parser::parseObjCProtocolRefs()
-{
-    return false;
-}
+    // a protocol definition
+    parseObjCProtocolRefs();
 
-bool Parser::parseObjCClassInstanceVariables()
-{
-    return false;
-}
-
-bool Parser::parseObjCInterfaceDeclList()
-{
-    unsigned saved = cursor();
-    while (LA() != T_AT_END && parseObjCInterfaceMemberDeclaration()) {
-        if (saved == cursor())
-            consumeToken(); // skip a token
+    while (parseObjCInterfaceMemberDeclaration()) {
     }
+
+    unsigned objc_end_token = 0;
+    match(T_AT_END, &objc_end_token);
+
     return true;
 }
 
-bool Parser::parseObjCInterfaceMemberDeclaration()
+// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER (T_COLON T_IDENTIFIER)?
+//                         objc-class-instance-variables-opt
+// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER T_LPAREN T_IDENTIFIER T_RPAREN
+//
+bool Parser::parseObjCImplementation(DeclarationAST *&)
 {
-    switch (LA()) {
-    case T_SEMICOLON:
-        consumeToken();
-        return true;
+    if (LA() != T_AT_IMPLEMENTATION)
+        return false;
 
-    case T_AT_REQUIRED:
-    case T_AT_OPTIONAL:
-        consumeToken();
-        return true;
+    consumeToken();
 
-    case T_PLUS:
-    case T_MINUS:
-        return parseObjCMethodPrototype();
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
 
-    default: {
-        DeclarationAST *declaration = 0;
-        if (parseDeclaration(declaration))
-            return true;
-    } // default
+    if (LA() == T_LPAREN) {
+        // a category implementation
+        unsigned lparen_token = 0, rparen_token = 0;
+        unsigned category_name_token = 0;
+        match(T_LPAREN, &lparen_token);
+        match(T_IDENTIFIER, &category_name_token);
+        match(T_RPAREN, &rparen_token);
+        return true;
+    }
 
-    } // switch
+    // a class implementation
+    if (LA() == T_COLON) {
+        consumeToken();
+        unsigned super_class_name_token = 0;
+        match(T_IDENTIFIER, &super_class_name_token);
+    }
 
-    return false;
+    parseObjClassInstanceVariables();
+    return true;
 }
 
-bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&)
+// objc-protocol-refs ::= T_LESS (T_IDENTIFIER @ T_COMMA) T_GREATER
+//
+bool Parser::parseObjCProtocolRefs()
 {
-    return false;
+    if (LA() != T_LESS)
+        return false;
+    unsigned less_token = 0, greater_token = 0;
+    unsigned identifier_token = 0;
+    match(T_LESS, &less_token);
+    match(T_IDENTIFIER, &identifier_token);
+    while (LA() == T_COMMA) {
+        consumeToken();
+        match(T_IDENTIFIER, &identifier_token);
+    }
+    match(T_GREATER, &greater_token);
+    return true;
 }
 
-bool Parser::parseObjCMethodPrototype()
+// objc-class-instance-variables ::= T_LBRACE
+//                                   objc-instance-variable-decl-list-opt
+//                                   T_RBRACE
+//
+bool Parser::parseObjClassInstanceVariables()
 {
-    if (LA() != T_PLUS && LA() != T_MINUS)
+    if (LA() != T_LBRACE)
         return false;
 
-    // instance or class method?
-    /*unsigned method_type_token = */ consumeToken();
-
-    SpecifierAST *attributes = 0, **attr = &attributes;
-    while (parseAttributeSpecifier(*attr))
-        attr = &(*attr)->next;
+    unsigned lbrace_token =  0, rbrace_token = 0;
 
-    return false;
-}
-
-bool Parser::parseObjCExpression(ExpressionAST *&node)
-{
-    switch (LA()) {
-    case T_LBRACKET:
-        return parseObjCMessageExpression(node);
-
-    case T_AT_STRING_LITERAL:
-        return parseObjCStringLiteral(node);
+    match(T_LBRACE, &lbrace_token);
+    while (LA()) {
+        if (LA() == T_RBRACE)
+            break;
 
-    case T_AT_ENCODE:
-        return parseObjCEncodeExpression(node);
+        const unsigned start = cursor();
 
-    case T_AT_PROTOCOL:
-        return parseObjCProtocolExpression(node);
+        DeclarationAST *declaration = 0;
+        parseObjCInstanceVariableDeclaration(declaration);
 
-    case T_AT_SELECTOR:
-        return parseObjCSelectorExpression(node);
+        if (start == cursor()) {
+            // skip stray token.
+            _translationUnit->error(cursor(), "skip stray token `%s'", tok().spell());
+            consumeToken();
+        }
     }
-    return false;
-}
-
-bool Parser::parseObjCMessageExpression(ExpressionAST *&)
-{
-    if (LA() != T_LBRACKET)
-        return false;
 
-    /*unsigned lbracket_token = */ consumeToken();
-    ExpressionAST *receiver = 0;
-    parseObjCMessageReceiver(receiver);
-    parseObjCMessageArguments();
-    unsigned rbracket_token = 0;
-    match(T_RBRACKET, &rbracket_token);
+    match(T_RBRACE, &rbrace_token);
     return true;
 }
 
-bool Parser::parseObjCStringLiteral(ExpressionAST *&)
+// objc-interface-declaration ::= T_AT_REQUIRED
+// objc-interface-declaration ::= T_AT_OPTIONAL
+// objc-interface-declaration ::= T_SEMICOLON
+// objc-interface-declaration ::= objc-property-declaration
+// objc-interface-declaration ::= objc-method-prototype
+bool Parser::parseObjCInterfaceMemberDeclaration()
 {
-    if (LA() != T_AT_STRING_LITERAL)
-        return false;
-
-    do {
+    switch (LA()) {
+    case T_AT_REQUIRED:
+    case T_AT_OPTIONAL:
         consumeToken();
-    } while (LA() == T_AT_STRING_LITERAL);
+        return true;
 
-    return true;
-}
+    case T_SEMICOLON:
+        consumeToken();
+        return true;
 
-bool Parser::parseObjCEncodeExpression(ExpressionAST *&)
-{
-    if (LA() != T_AT_ENCODE)
-        return false;
+    case T_AT_PROPERTY: {
+        DeclarationAST *declaration = 0;
+        return parseObjCPropertyDeclaration(declaration);
+    }
 
-    /*unsigned encode_token = */ consumeToken();
-    unsigned lparen_token = 0, rparen_token = 0;
-    match(T_LPAREN, &lparen_token);
-    SpecifierAST *type_specifier = 0;
-    parseSimpleTypeSpecifier(type_specifier);
-    match(T_RPAREN, &rparen_token);
-    return true;
-}
+    case T_PLUS:
+    case T_MINUS:
+        return parseObjCMethodPrototype();
 
-bool Parser::parseObjCProtocolExpression(ExpressionAST *&)
-{
-    if (LA() != T_AT_PROTOCOL)
+    default:
         return false;
-
-    /*unsigned protocol_token = */ consumeToken();
-    unsigned protocol_name_token = 0, lparen_token = 0, rparen_token = 0;
-    match(T_LPAREN, &lparen_token);
-    match(T_IDENTIFIER, &protocol_name_token);
-    match(T_RPAREN, &rparen_token);
-    return true;
+    }
 }
 
-bool Parser::parseObjCSelectorExpression(ExpressionAST *&)
+// objc-instance-variable-declaration ::= objc-visibility-specifier
+// objc-instance-variable-declaration ::= block-declaration
+//
+bool Parser::parseObjCInstanceVariableDeclaration(DeclarationAST *&node)
 {
-    if (LA() != T_AT_SELECTOR)
-        return false;
+    switch (LA()) {
+    case T_AT_PRIVATE:
+    case T_AT_PROTECTED:
+    case T_AT_PUBLIC:
+    case T_AT_PACKAGE:
+        consumeToken();
+        return true;
 
-    /*unsigned selector_token = */ consumeToken();
-    unsigned lparen_token = 0, rparen_token = 0;
-    match(T_LPAREN, &lparen_token);
-    while (LA(1) == T_IDENTIFIER && LA(2) == T_COLON) {
-        /*unsigned identifier_token = */ consumeToken();
-        /*unsigned colon_token = */ consumeToken();
+    default:
+        return parseBlockDeclaration(node);
     }
-    match(T_RPAREN, &rparen_token);
-    return true;
-}
-
-bool Parser::parseObjCMessageReceiver(ExpressionAST *&node)
-{
-    // ### expression or simple-type-specifier.
-    return parseExpression(node);
 }
 
-bool Parser::parseObjCMessageArguments()
+// objc-property-declaration ::=
+//    T_AT_PROPERTY T_LPAREN (property-attribute @ T_COMMA) T_RPAREN simple-declaration
+//
+bool Parser::parseObjCPropertyDeclaration(DeclarationAST *&, SpecifierAST *)
 {
-    if (LA() != T_IDENTIFIER && LA() != T_COLON)
+    if (LA() != T_AT_PROPERTY)
         return false;
 
-    unsigned selector_name_token = 0;
-
-    if (LA() == T_IDENTIFIER)
-        selector_name_token = consumeToken();
-
-    if (LA() == T_COLON) {
-        /*unsigned colon_token = */ consumeToken();
-
-        ExpressionAST *expr = 0;
-        parseAssignmentExpression(expr);
-
-        while ((LA() == T_IDENTIFIER && LA(2) == T_COLON) || LA() == T_COLON) {
-            if (LA() == T_IDENTIFIER)
-                consumeToken();
-
-            if (LA() == T_COLON)
-                consumeToken();
+    /*unsigned objc_property_token = */ consumeToken();
 
-            parseAssignmentExpression(expr);
-        }
-
-        while (LA() == T_COMMA) {
-            consumeToken();
-            parseAssignmentExpression(expr);
+    if (LA() == T_LPAREN) {
+        unsigned lparen_token = 0, rparen_token = 0;
+        match(T_LPAREN, &lparen_token);
+        while (parseObjCPropertyAttribute()) {
         }
+        match(T_RPAREN, &rparen_token);
     }
 
+    DeclarationAST *simple_declaration = 0;
+    parseSimpleDeclaration(simple_declaration, /*accept-struct-declarators = */ false);
     return true;
 }
 
-bool Parser::parseObjCMethodDefinitionList()
+// objc-method-prototype ::= (T_PLUS | T_MINUS) objc-method-decl objc-method-attrs-opt
+//
+// objc-method-decl ::= objc-type-name? objc-selector
+// objc-method-decl ::= objc-type-name? objc-keyword-decl-list objc-parmlist-opt
+//
+bool Parser::parseObjCMethodPrototype()
 {
-    bool done = false;
-    while (! done) {
-        switch (LA()) {
-        case T_EOF_SYMBOL:
-        case T_AT_END:
-            done = true;
-            break;
-
-        case T_PLUS:
-        case T_MINUS:
-            parseObjCMethodSignature();
-            if (LA() == T_SEMICOLON)
-                consumeToken();
-            break;
+    if (LA() != T_PLUS && LA() != T_MINUS)
+        return false;
 
-        case T_AT_PROPERTY:
-            parseObjCAtProperty();
-            break;
+    /*unsigned method_type_token = */ consumeToken();
 
-        case T_SEMICOLON:
-            consumeToken();
-            break;
+    parseObjCTypeName();
 
-        case T_AT_OPTIONAL:
-            consumeToken();
-            break;
+    if ((lookAtObjCSelector() && LA(2) == T_COLON) || LA() == T_COLON) {
+        while (parseObjCKeywordDeclaration()) {
+        }
 
-        case T_AT_REQUIRED:
+        while (LA() == T_COMMA) {
             consumeToken();
-            break;
 
-        case T_TEMPLATE:
-        case T_NAMESPACE: {
-            DeclarationAST *declaration = 0;
-            parseDeclaration(declaration);
-        }   break;
-
-        default: {
-            unsigned start = cursor();
-            DeclarationAST *declaration = 0;
-            if (LA(1) == T_EXTERN && LA(2) == T_STRING_LITERAL) {
-                parseLinkageSpecification(declaration);
-            } else if (parseBlockDeclaration(declaration)) {
-                // ### accept the declaration.
-            } else {
-                if (cursor() == start) {
-                    _translationUnit->error(cursor(),
-                            "stray `%s' between Objective-C++ methods",
-                            tok().spell());
-                    consumeToken();
-                }
+            if (LA() == T_DOT_DOT_DOT) {
+                consumeToken();
+                break;
             }
-        }   break; // default
 
-        } // switch
+            DeclarationAST *parameter_declaration = 0;
+            parseParameterDeclaration(parameter_declaration);
+        }
+    } else if (lookAtObjCSelector()) {
+        parseObjCSelector();
+    } else {
+        _translationUnit->error(cursor(), "expected a selector");
     }
 
+    SpecifierAST *attributes = 0, **attr = &attributes;
+    while (parseAttributeSpecifier(*attr))
+        attr = &(*attr)->next;
+
     return true;
 }
 
-bool Parser::parseObjCMethodSignature()
+// objc-property-attribute ::= getter '=' identifier
+// objc-property-attribute ::= setter '=' identifier ':'
+// objc-property-attribute ::= readonly
+// objc-property-attribute ::= readwrite
+// objc-property-attribute ::= assign
+// objc-property-attribute ::= retain
+// objc-property-attribute ::= copy
+// objc-property-attribute ::= nonatomic
+bool Parser::parseObjCPropertyAttribute()
 {
-    if (LA() != T_PLUS && LA() != T_MINUS)
+    if (LA() != T_IDENTIFIER)
         return false;
 
-    /*unsigned method_type_token = */ consumeToken();
-    parseObjCTypeName();
-
-    bool first = true;
-
-    while (lookAtObjCSelector() || LA() == T_COLON) {
-        if (LA() != T_COLON)
-            /*selector_name_token = */ consumeToken();
-
-        SpecifierAST *attributes = 0, **attr = &attributes;
-        while (parseAttributeSpecifier(*attr))
-            attr = &(*attr)->next;
-
-        if (first) {
-            first = false;
-
-            if (LA() != T_COLON)
-                break;
-        }
-
-        unsigned colon_token = 0;
-        match(T_COLON, &colon_token);
-
-        parseObjCTypeName();
-
-        unsigned identifier_token = 0;
-        match(T_IDENTIFIER, &identifier_token);
-
-        while (parseAttributeSpecifier(*attr))
-            attr = &(*attr)->next;
-    }
-
-    // parse the method tail parameters.
-    while (LA() == T_COMMA) {
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+    if (LA() == T_EQUAL) {
         consumeToken();
-
-        if (LA() == T_DOT_DOT_DOT) {
+        match(T_IDENTIFIER, &identifier_token);
+        if (LA() == T_COLON)
             consumeToken();
-            break;
-        }
-
-        DeclarationAST *parameter_declaration = 0;
-        parseParameterDeclaration(parameter_declaration);
     }
 
     return true;
 }
 
+// objc-type-name ::= T_LPAREN objc-type-qualifiers-opt type-id T_RPAREN
+//
 bool Parser::parseObjCTypeName()
 {
     if (LA() != T_LPAREN)
         return false;
 
-    /*unsigned lparen_token = */ consumeToken();
-
-    parseObjCProtocolQualifiers();
-
+    unsigned lparen_token = 0, rparen_token = 0;
+    match(T_LPAREN, &lparen_token);
+    parseObjCTypeQualifiers();
     ExpressionAST *type_id = 0;
-    if (LA() != T_RPAREN)
-        parseTypeId(type_id);
+    parseTypeId(type_id);
+    match(T_RPAREN, &rparen_token);
+    return true;
+}
 
-    SpecifierAST *attributes = 0, **attr = &attributes;
-    while (parseAttributeSpecifier(*attr))
-        attr = &(*attr)->next;
+// objc-selector ::= T_IDENTIFIER | keyword
+//
+bool Parser::parseObjCSelector()
+{
+    if (! lookAtObjCSelector())
+        return false;
 
-    unsigned rparen_token = 0;
-    match(T_RPAREN, &rparen_token);
+    consumeToken();
     return true;
 }
 
-bool Parser::parseObjCAtProperty()
+// objc-keyword-decl ::= objc-selector? T_COLON objc-type-name? objc-keyword-attributes-opt T_IDENTIFIER
+//
+bool Parser::parseObjCKeywordDeclaration()
 {
-    if (LA() != T_AT_PROPERTY)
+    if (! (LA() == T_COLON || (lookAtObjCSelector() && LA(2) == T_COLON)))
         return false;
 
-    /*unsigned property_token = */ consumeToken();
+    parseObjCSelector();
+
+    unsigned colon_token = 0;
+    match(T_COLON, &colon_token);
+
+    parseObjCTypeName();
+
+    SpecifierAST *attributes = 0, **attr = &attributes;
+    while (parseAttributeSpecifier(*attr))
+        attr = &(*attr)->next;
+
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+
     return true;
 }
 
-bool Parser::parseObjCProtocolQualifiers()
+bool Parser::parseObjCTypeQualifiers()
 {
     return false;
 }
 
-bool Parser::lookAtObjCSelector() const
+// objc-end: T_AT_END
+bool Parser::parseObjCEnd(DeclarationAST *&)
 {
-    switch (LA()) {
-    case T_IDENTIFIER:
-    case T_OR:
-    case T_AND:
-    case T_NOT:
-    case T_XOR:
-    case T_BITOR:
-    case T_COMPL:
-    case T_OR_EQ:
-    case T_AND_EQ:
-    case T_BITAND:
-    case T_NOT_EQ:
-    case T_XOR_EQ:
-        return true;
-
-    default:
-        if (tok().isKeyword())
-            return true;
-    } // switch
+    if (LA() != T_AT_END)
+        return false;
 
-    return false;
+    consumeToken();
+    return true;
 }
+
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/shared/cplusplus/Parser.h b/shared/cplusplus/Parser.h
index c943664afe1b6428e511bce4e13f52ee146bb7c0..84bf03e74e670683d5d68316737e201c85fcb726 100644
--- a/shared/cplusplus/Parser.h
+++ b/shared/cplusplus/Parser.h
@@ -206,46 +206,33 @@ public:
     bool parseUsingDirective(DeclarationAST *&node);
     bool parseWhileStatement(StatementAST *&node);
 
+    // Qt MOC run
+    bool parseQtMethod(ExpressionAST *&node);
+
     // ObjC++
-    bool parseObjCClassImplementation(DeclarationAST *&node);
     bool parseObjCClassDeclaration(DeclarationAST *&node);
-    bool parseObjCInterfaceDeclaration(DeclarationAST *&node);
-    bool parseObjCProtocolDeclaration(DeclarationAST *&node);
-    bool parseObjCEndDeclaration(DeclarationAST *&node);
-    bool parseObjCAliasDeclaration(DeclarationAST *&node);
-    bool parseObjCPropertySynthesize(DeclarationAST *&node);
-    bool parseObjCPropertyDynamic(DeclarationAST *&node);
+    bool parseObjCInterface(DeclarationAST *&node,
+                            SpecifierAST *attributes = 0);
+    bool parseObjCProtocol(DeclarationAST *&node,
+                           SpecifierAST *attributes = 0);
 
-    bool parseObjCIdentifierList(IdentifierListAST *&node);
-
-    bool parseObjCPropertyDeclaration(DeclarationAST *&node);
     bool parseObjCProtocolRefs();
-    bool parseObjCClassInstanceVariables();
+    bool parseObjClassInstanceVariables();
     bool parseObjCInterfaceMemberDeclaration();
-    bool parseObjCInterfaceDeclList();
+    bool parseObjCInstanceVariableDeclaration(DeclarationAST *&node);
+    bool parseObjCPropertyDeclaration(DeclarationAST *&node,
+                                      SpecifierAST *attributes = 0);
+    bool parseObjCImplementation(DeclarationAST *&node);
     bool parseObjCMethodPrototype();
-
-    bool parseObjCExpression(ExpressionAST *&node);
-    bool parseObjCMessageExpression(ExpressionAST *&node);
-    bool parseObjCStringLiteral(ExpressionAST *&node);
-    bool parseObjCEncodeExpression(ExpressionAST *&node);
-    bool parseObjCProtocolExpression(ExpressionAST *&node);
-    bool parseObjCSelectorExpression(ExpressionAST *&node);
-
-    bool parseObjCMessageReceiver(ExpressionAST *&node);
-    bool parseObjCMessageArguments();
-
-    bool parseObjCMethodSignature();
-    bool parseObjCMethodDefinitionList();
-    bool parseObjCAtProperty();
+    bool parseObjCPropertyAttribute();
     bool parseObjCTypeName();
-    bool parseObjCProtocolQualifiers();
+    bool parseObjCSelector();
+    bool parseObjCKeywordDeclaration();
+    bool parseObjCTypeQualifiers();
+    bool parseObjCEnd(DeclarationAST *&node);
 
     bool lookAtObjCSelector() const;
 
-    // Qt MOC run
-    bool parseQtMethod(ExpressionAST *&node);
-
     bool skipUntil(int token);
     bool skipUntilDeclaration();
     bool skipUntilStatement();
diff --git a/shared/cplusplus/Token.h b/shared/cplusplus/Token.h
index d5b6f1a1c0eab08279942cd3bae67c78708ae394..fdc3298202f697f35604cebcb74ecc75ea36dbf5 100644
--- a/shared/cplusplus/Token.h
+++ b/shared/cplusplus/Token.h
@@ -201,9 +201,9 @@ enum Kind {
     T___TYPEOF__,
 
     // obj c++ @ keywords
-    T_FIRST_OBJC_KEYWORD,
+    T_FIRST_OBJC_AT_KEYWORD,
 
-    T_AT_CATCH = T_FIRST_OBJC_KEYWORD,
+    T_AT_CATCH = T_FIRST_OBJC_AT_KEYWORD,
     T_AT_CLASS,
     T_AT_COMPATIBILITY_ALIAS,
     T_AT_DEFS,
@@ -228,7 +228,9 @@ enum Kind {
     T_AT_THROW,
     T_AT_TRY,
 
-    T_FIRST_QT_KEYWORD,
+    T_LAST_OBJC_AT_KEYWORD,
+
+    T_FIRST_QT_KEYWORD = T_LAST_OBJC_AT_KEYWORD,
 
     // Qt keywords
     T_SIGNAL = T_FIRST_QT_KEYWORD,
@@ -295,6 +297,9 @@ public:
     inline bool isKeyword() const
     { return kind >= T_FIRST_KEYWORD && kind < T_FIRST_QT_KEYWORD; }
 
+    inline bool isObjCAtKeyword() const
+    { return kind >= T_FIRST_OBJC_AT_KEYWORD && kind < T_LAST_OBJC_AT_KEYWORD; }
+
     static const char *name(int kind);
 
 public:
diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp
index 7dc9c4e10af716cad64356b88212697bf3a2f9fb..fc4600630f37633a2ce75b28c71a94f7251c90b8 100644
--- a/src/libs/extensionsystem/pluginmanager.cpp
+++ b/src/libs/extensionsystem/pluginmanager.cpp
@@ -54,8 +54,7 @@ enum { debugLeaks = 0 };
 
 /*!
     \namespace ExtensionSystem
-    \brief The ExtensionSystem namespace provides
-    classes that belong to the core plugin system.
+    \brief The ExtensionSystem namespace provides classes that belong to the core plugin system.
 
     The basic extension system contains of the plugin manager and its supporting classes,
     and the IPlugin interface that must be implemented by plugin providers.
diff --git a/src/libs/utils/filewizarddialog.cpp b/src/libs/utils/filewizarddialog.cpp
index a564c63bb4fb1eb0d166972c2c4077a1250b5940..0e8655bf7cafb1207fdef126b1f798fbf3d42360 100644
--- a/src/libs/utils/filewizarddialog.cpp
+++ b/src/libs/utils/filewizarddialog.cpp
@@ -46,7 +46,7 @@ FileWizardDialog::FileWizardDialog(QWidget *parent) :
     setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
     setOption(QWizard::NoCancelButton, false);
     setOption(QWizard::NoDefaultButton, false);
-    setPixmap(QWizard::WatermarkPixmap, QPixmap(QLatin1String(":/qworkbench/images/qtwatermark.png")));
+    setPixmap(QWizard::WatermarkPixmap, QPixmap(QLatin1String(":/core/images/qtwatermark.png")));
     addPage(m_filePage);
     connect(m_filePage, SIGNAL(activated()), button(QWizard::FinishButton), SLOT(animateClick()));
 }
diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp
index ae8eb41593d5cb5778003fe89c27991a21db181c..3513c27715d4eea1caef363dfc32d09bc70486eb 100644
--- a/src/libs/utils/submiteditorwidget.cpp
+++ b/src/libs/utils/submiteditorwidget.cpp
@@ -36,6 +36,7 @@
 
 #include <QtCore/QDebug>
 #include <QtCore/QPointer>
+#include <QtCore/QTimer>
 
 #include <QtGui/QPushButton>
 
@@ -70,6 +71,42 @@ void QActionPushButton::actionChanged()
         setEnabled(a->isEnabled());
 }
 
+// Helpers to retrieve model data
+static inline bool listModelChecked(const QAbstractItemModel *model, int row, int column = 0)
+{
+    const QModelIndex checkableIndex = model->index(row, column, QModelIndex());
+    return model->data(checkableIndex, Qt::CheckStateRole).toInt() == Qt::Checked;
+}
+
+static inline QString listModelText(const QAbstractItemModel *model, int row, int column)
+{
+    const QModelIndex index = model->index(row, column, QModelIndex());
+    return model->data(index, Qt::DisplayRole).toString();
+}
+
+// Find a check item in a model
+static bool listModelContainsCheckedItem(const QAbstractItemModel *model)
+{
+    const int count = model->rowCount();
+    for (int i = 0; i < count; i++)
+        if (listModelChecked(model, i, 0))
+            return true;
+    return false;
+}
+
+// Convenience to extract a list of selected indexes
+QList<int> selectedRows(const QAbstractItemView *view)
+{
+    const QModelIndexList indexList = view->selectionModel()->selectedRows(0);
+    if (indexList.empty())
+        return QList<int>();
+    QList<int> rc;
+    const QModelIndexList::const_iterator cend = indexList.constEnd();
+    for (QModelIndexList::const_iterator it = indexList.constBegin(); it != cend; ++it)
+        rc.push_back(it->row());
+    return rc;
+}
+
 // -----------  SubmitEditorWidgetPrivate
 struct SubmitEditorWidgetPrivate
 {
@@ -78,11 +115,15 @@ struct SubmitEditorWidgetPrivate
     Ui::SubmitEditorWidget m_ui;
     bool m_filesSelected;
     bool m_filesChecked;
+    int m_fileNameColumn;
+    int m_activatedRow;
 };
 
 SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() :
     m_filesSelected(false),
-    m_filesChecked(false)
+    m_filesChecked(false),
+    m_fileNameColumn(1),
+    m_activatedRow(-1)
 {
 }
 
@@ -92,10 +133,10 @@ SubmitEditorWidget::SubmitEditorWidget(QWidget *parent) :
 {
     m_d->m_ui.setupUi(this);
     // File List
-    m_d->m_ui.fileList->setSelectionMode(QAbstractItemView::ExtendedSelection);
-    connect(m_d->m_ui.fileList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(triggerDiffSelected()));
-    connect(m_d->m_ui.fileList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(fileItemChanged(QListWidgetItem*)));
-    connect(m_d->m_ui.fileList, SIGNAL(itemSelectionChanged()), this, SLOT(fileSelectionChanged()));
+    m_d->m_ui.fileView->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    m_d->m_ui.fileView->setRootIsDecorated(false);
+    connect(m_d->m_ui.fileView, SIGNAL(doubleClicked(QModelIndex)),
+            this, SLOT(diffActivated(QModelIndex)));
 
     // Text
     m_d->m_ui.description->setFont(QFont(QLatin1String("Courier")));
@@ -124,8 +165,12 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction,  QAction *ed
     }
 
     if (submitAction) {
-        if (debug)
-            qDebug() << submitAction << m_d->m_ui.fileList->count() << "items" << m_d->m_filesChecked;
+        if (debug) {
+            int count = 0;
+            if (const QAbstractItemModel *model = m_d->m_ui.fileView->model())
+                count = model->rowCount();
+            qDebug() << submitAction << count << "items" << m_d->m_filesChecked;
+        }
         submitAction->setEnabled(m_d->m_filesChecked);
         connect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool)));
         m_d->m_ui.buttonLayout->addWidget(new QActionPushButton(submitAction));
@@ -161,7 +206,6 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction,  QAction *
     }
 }
 
-
 QString SubmitEditorWidget::trimmedDescriptionText() const
 {
     // Make sure we have one terminating NL
@@ -180,91 +224,70 @@ void SubmitEditorWidget::setDescriptionText(const QString &text)
     m_d->m_ui.description->setPlainText(text);
 }
 
-QStringList SubmitEditorWidget::fileList() const
+int SubmitEditorWidget::fileNameColumn() const
 {
-    QStringList rc;
-    const int count = m_d->m_ui.fileList->count();
-    for (int i = 0; i < count; i++)
-        rc.push_back(m_d->m_ui.fileList->item(i)->text());
-    return rc;
+    return m_d->m_fileNameColumn;
 }
 
-void SubmitEditorWidget::addFilesUnblocked(const QStringList &list, bool checked, bool userCheckable)
+void SubmitEditorWidget::setFileNameColumn(int c)
 {
-    if (debug)
-        qDebug() << Q_FUNC_INFO << list << checked << userCheckable;
-    foreach (const QString &f, list) {
-        QListWidgetItem *item = new QListWidgetItem(f);
-        item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
-        if (!userCheckable)
-            item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable);
-        m_d->m_ui.fileList->addItem(item);
-    }
+    m_d->m_fileNameColumn = c;
 }
 
-void SubmitEditorWidget::addFiles(const QStringList &list, bool checked, bool userCheckable)
+void SubmitEditorWidget::setFileModel(QAbstractItemModel *model)
 {
-    if (list.empty())
-        return;
-
-    const bool blocked = m_d->m_ui.fileList->blockSignals(true);
-    addFilesUnblocked(list, checked, userCheckable);
-    m_d->m_ui.fileList->blockSignals(blocked);
-    // Did we gain any checked files..update action accordingly
-    if (!m_d->m_filesChecked && checked) {
-        m_d->m_filesChecked = true;
-        emit fileCheckStateChanged(m_d->m_filesChecked);
-    }
-}
+    m_d->m_ui.fileView->clearSelection(); // trigger the change signals
 
-void SubmitEditorWidget::setFileList(const QStringList &list)
-{
-    // Trigger enabling of menu action
-    m_d->m_ui.fileList->clearSelection();
+    m_d->m_ui.fileView->setModel(model);
 
-    const bool blocked = m_d->m_ui.fileList->blockSignals(true);
-    m_d->m_ui.fileList->clear();
-    if (!list.empty()) {
-        addFilesUnblocked(list, true, true);
-        // Checked files added?
-        if (!m_d->m_filesChecked) {
-            m_d->m_filesChecked = true;
-            emit fileCheckStateChanged(m_d->m_filesChecked);
-        }
+    if (model->rowCount()) {
+        const int columnCount = model->columnCount();
+        for (int c = 0;  c < columnCount; c++)
+            m_d->m_ui.fileView->resizeColumnToContents(c);
     }
-    m_d->m_ui.fileList->blockSignals(blocked);
+
+    connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+            this, SLOT(updateSubmitAction()));
+    connect(model, SIGNAL(modelReset()),
+            this, SLOT(updateSubmitAction()));
+    connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+            this, SLOT(updateSubmitAction()));
+    connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+            this, SLOT(updateSubmitAction()));
+    connect(m_d->m_ui.fileView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
+            this, SLOT(updateDiffAction()));
+    updateActions();
 }
 
-static bool containsCheckState(const QListWidget *lw,  Qt::CheckState cs)
+QAbstractItemModel *SubmitEditorWidget::fileModel() const
 {
-    const int count = lw->count();
-    for (int i = 0; i < count; i++)
-        if (lw->item(i)->checkState() == cs)
-            return true;
-    return false;
+    return m_d->m_ui.fileView->model();
 }
 
 QStringList SubmitEditorWidget::selectedFiles() const
 {
+    const QList<int> selection = selectedRows(m_d->m_ui.fileView);
+    if (selection.empty())
+        return QStringList();
+
     QStringList rc;
-    const int count = m_d->m_ui.fileList->count();
-    for (int i = 0; i < count; i++) {
-        const QListWidgetItem *item = m_d->m_ui.fileList->item(i);
-        if (item->isSelected())
-            rc.push_back(item->text());
-    }
+    const QAbstractItemModel *model = m_d->m_ui.fileView->model();
+    const int count = selection.size();
+    for (int i = 0; i < count; i++)
+        rc.push_back(listModelText(model, selection.at(i), fileNameColumn()));
     return rc;
 }
 
 QStringList SubmitEditorWidget::checkedFiles() const
 {
     QStringList rc;
-    const int count = m_d->m_ui.fileList->count();
-    for (int i = 0; i < count; i++) {
-        const QListWidgetItem *item = m_d->m_ui.fileList->item(i);
-        if (item->checkState() == Qt::Checked)
-            rc.push_back(item->text());
-    }
+    const QAbstractItemModel *model = m_d->m_ui.fileView->model();
+    if (!model)
+        return rc;
+    const int count = model->rowCount();
+    for (int i = 0; i < count; i++)
+        if (listModelChecked(model, i, 0))
+            rc.push_back(listModelText(model, i, fileNameColumn()));
     return rc;
 }
 
@@ -280,44 +303,61 @@ void SubmitEditorWidget::triggerDiffSelected()
         emit diffSelected(sel);
 }
 
-void SubmitEditorWidget::fileItemChanged(QListWidgetItem *item)
-{
-    const Qt::CheckState st = item->checkState();
-    if (debug)
-        qDebug() << Q_FUNC_INFO << st << item->text() << m_d->m_filesChecked;
-    // Enable the actions according to check state
-    switch (st) {
-    case Qt::Unchecked: // Item was unchecked: Any checked items left?
-        if (m_d->m_filesChecked && !containsCheckState(m_d->m_ui.fileList, Qt::Checked)) {
-            m_d->m_filesChecked = false;
-            emit fileCheckStateChanged(m_d->m_filesChecked);
-        }
-        break;
-    case Qt::Checked:
-        // Item was Checked. First one?
-        if (!m_d->m_filesChecked) {
-            m_d->m_filesChecked = true;
-            emit fileCheckStateChanged(m_d->m_filesChecked);
-        }
-        break;
-    case Qt::PartiallyChecked: // Errm?
-        break;
+void SubmitEditorWidget::diffActivatedDelayed()
+{
+    const QStringList files = QStringList(listModelText(m_d->m_ui.fileView->model(), m_d->m_activatedRow, fileNameColumn()));
+    emit diffSelected(files);
+}
+
+void SubmitEditorWidget::diffActivated(const QModelIndex &index)
+{
+    // We need to delay the signal, otherwise, the diff editor will not
+    // be in the foreground.
+    m_d->m_activatedRow = index.row();
+    QTimer::singleShot(0, this, SLOT(diffActivatedDelayed()));
+}
+
+void SubmitEditorWidget::updateActions()
+{
+    updateSubmitAction();
+    updateDiffAction();
+}
+
+// Enable submit depending on having checked files
+void SubmitEditorWidget::updateSubmitAction()
+{
+    const bool newFilesCheckedState = hasCheckedFiles();
+    if (m_d->m_filesChecked != newFilesCheckedState) {
+        m_d->m_filesChecked = newFilesCheckedState;
+        emit fileCheckStateChanged(m_d->m_filesChecked);
     }
 }
 
-void SubmitEditorWidget::fileSelectionChanged()
+// Enable diff depending on selected files
+void SubmitEditorWidget::updateDiffAction()
 {
-    const bool newFilesSelected = !m_d->m_ui.fileList->selectedItems().empty();
-    if (debug)
-        qDebug() << Q_FUNC_INFO << newFilesSelected;
-    if (m_d->m_filesSelected != newFilesSelected) {
-        m_d->m_filesSelected = newFilesSelected;
+    const bool filesSelected = hasSelection();
+    if (m_d->m_filesSelected != filesSelected) {
+        m_d->m_filesSelected = filesSelected;
         emit fileSelectionChanged(m_d->m_filesSelected);
-        if (debug)
-            qDebug() << Q_FUNC_INFO << m_d->m_filesSelected;
     }
 }
 
+bool SubmitEditorWidget::hasSelection() const
+{
+    // Not present until model is set
+    if (const QItemSelectionModel *sm = m_d->m_ui.fileView->selectionModel())
+        return sm->hasSelection();
+    return false;
+}
+
+bool SubmitEditorWidget::hasCheckedFiles() const
+{
+    if (const QAbstractItemModel *model = m_d->m_ui.fileView->model())
+        return listModelContainsCheckedItem(model);
+    return false;
+}
+
 void SubmitEditorWidget::changeEvent(QEvent *e)
 {
     switch (e->type()) {
diff --git a/src/libs/utils/submiteditorwidget.h b/src/libs/utils/submiteditorwidget.h
index 921bb6d16ddbd83cbf35497f6cecfa85d0e4351d..788709f773b723c3866373dc246385a66268b30a 100644
--- a/src/libs/utils/submiteditorwidget.h
+++ b/src/libs/utils/submiteditorwidget.h
@@ -42,6 +42,8 @@ QT_BEGIN_NAMESPACE
 class QPlainTextEdit;
 class QListWidgetItem;
 class QAction;
+class QAbstractItemModel;
+class QModelIndex;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -51,8 +53,9 @@ struct SubmitEditorWidgetPrivate;
 
 /* The submit editor presents the commit message in a text editor and an
  * checkable list of modified files in a list window. The user can delete
- * files from the list by pressing unchecking them or diff the selection
- * by doubleclicking.
+ * files from the list by unchecking them or diff the selection
+ * by doubleclicking. A list model which contains the file in a column
+ * specified by fileNameColumn should be set using setFileModel().
  *
  * Additionally, standard creator actions  can be registered:
  * Undo/redo will be set up to work with the description editor.
@@ -71,7 +74,7 @@ class QWORKBENCH_UTILS_EXPORT SubmitEditorWidget : public QWidget
     Q_OBJECT
     Q_DISABLE_COPY(SubmitEditorWidget)
     Q_PROPERTY(QString descriptionText READ descriptionText WRITE setDescriptionText DESIGNABLE true)
-    Q_PROPERTY(QStringList fileList READ fileList WRITE setFileList DESIGNABLE true)
+    Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false)
 public:
     explicit SubmitEditorWidget(QWidget *parent = 0);
     virtual ~SubmitEditorWidget();
@@ -86,10 +89,11 @@ public:
     // Should be used to normalize newlines.
     QString trimmedDescriptionText() const;
 
-    // The raw file list
-    QStringList fileList() const;
-    void addFiles(const QStringList&, bool checked = true, bool userCheckable = true);
-    void setFileList(const QStringList&);
+    int fileNameColumn() const;
+    void setFileNameColumn(int c);
+
+    void setFileModel(QAbstractItemModel *model);
+    QAbstractItemModel *fileModel() const;
 
     // Files to be included in submit
     QStringList checkedFiles() const;
@@ -110,11 +114,15 @@ protected:
 
 private slots:
     void triggerDiffSelected();
-    void fileItemChanged(QListWidgetItem *);
-    void fileSelectionChanged();
+    void diffActivated(const QModelIndex &index);
+    void diffActivatedDelayed();
+    void updateActions();
+    void updateSubmitAction();
+    void updateDiffAction();
 
 private:
-    void addFilesUnblocked(const QStringList &list, bool checked, bool userCheckable);
+    bool hasSelection() const;
+    bool hasCheckedFiles() const;
 
     SubmitEditorWidgetPrivate *m_d;
 };
diff --git a/src/libs/utils/submiteditorwidget.ui b/src/libs/utils/submiteditorwidget.ui
index 69eed91eb326d286b7ab84ee5170ba12b2f73841..2067cad4487dbafbf69f1de5651adb4242c6fec0 100644
--- a/src/libs/utils/submiteditorwidget.ui
+++ b/src/libs/utils/submiteditorwidget.ui
@@ -39,14 +39,7 @@
      </property>
      <layout class="QVBoxLayout" name="verticalLayout_2">
       <item>
-       <widget class="QListWidget" name="fileList">
-        <property name="font">
-         <font/>
-        </property>
-        <property name="textElideMode">
-         <enum>Qt::ElideNone</enum>
-        </property>
-       </widget>
+       <widget class="QTreeView" name="fileView"/>
       </item>
      </layout>
     </widget>
diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp
index 51ad57bc27d6ceb7cfd74af153d7e2b9d112d4e0..468c76a0dc64fed1af46fa5f1424bb553302c305 100644
--- a/src/plugins/coreplugin/basefilewizard.cpp
+++ b/src/plugins/coreplugin/basefilewizard.cpp
@@ -503,7 +503,7 @@ QStringList BaseFileWizard::runWizard(const QString &path, QWidget *parent)
 
 QPixmap BaseFileWizard::watermark()
 {
-    return QPixmap(QLatin1String(":/qworkbench/images/qtwatermark.png"));
+    return QPixmap(QLatin1String(":/core/images/qtwatermark.png"));
 }
 
 void BaseFileWizard::setupWizard(QWizard *w)
diff --git a/src/plugins/coreplugin/core.qrc b/src/plugins/coreplugin/core.qrc
index 00cd47c92b0ef82e3548503aee4e69955a2f5bb6..c2a38452dcfe7a6ca41184fd04f87f06d8e48112 100644
--- a/src/plugins/coreplugin/core.qrc
+++ b/src/plugins/coreplugin/core.qrc
@@ -1,5 +1,5 @@
 <RCC>
-    <qresource prefix="/qworkbench" >
+    <qresource prefix="/core" >
         <file>html/images/bg_site_header_dark_grey.png</file>
         <file>html/images/body_bg_circles_bottom_right.png</file>
         <file>html/images/body_bg_gradient.png</file>
diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h
index 301cfb6d39af0c7761faea1afe8bf2f455eaaf64..dd8155db8209803999264344c91628e035752eba 100644
--- a/src/plugins/coreplugin/coreconstants.h
+++ b/src/plugins/coreplugin/coreconstants.h
@@ -194,27 +194,27 @@ const char * const G_WINDOW_LIST         = "QtCreator.Group.Window.List";
 const char * const G_HELP_HELP           = "QtCreator.Group.Help.Help";
 const char * const G_HELP_ABOUT          = "QtCreator.Group.Help.About";
 
-const char * const ICON_MINUS            = ":/qworkbench/images/minus.png";
-const char * const ICON_PLUS             = ":/qworkbench/images/plus.png";
-const char * const ICON_NEWFILE          = ":/qworkbench/images/filenew.png";
-const char * const ICON_OPENFILE         = ":/qworkbench/images/fileopen.png";
-const char * const ICON_SAVEFILE         = ":/qworkbench/images/filesave.png";
-const char * const ICON_UNDO             = ":/qworkbench/images/undo.png";
-const char * const ICON_REDO             = ":/qworkbench/images/redo.png";
-const char * const ICON_COPY             = ":/qworkbench/images/editcopy.png";
-const char * const ICON_PASTE            = ":/qworkbench/images/editpaste.png";
-const char * const ICON_CUT              = ":/qworkbench/images/editcut.png";
-const char * const ICON_NEXT             = ":/qworkbench/images/next.png";
-const char * const ICON_PREV             = ":/qworkbench/images/prev.png";
-const char * const ICON_DIR              = ":/qworkbench/images/dir.png";
-const char * const ICON_CLEAN_PANE       = ":/qworkbench/images/clean_pane_small.png";
-const char * const ICON_CLEAR            = ":/qworkbench/images/clear.png";
-const char * const ICON_FIND             = ":/qworkbench/images/find.png";
-const char * const ICON_FINDNEXT         = ":/qworkbench/images/findnext.png";
-const char * const ICON_REPLACE          = ":/qworkbench/images/replace.png";
-const char * const ICON_RESET            = ":/qworkbench/images/reset.png";
-const char * const ICON_MAGNIFIER        = ":/qworkbench/images/magnifier.png";
-const char * const ICON_TOGGLE_SIDEBAR   = ":/qworkbench/images/sidebaricon.png";
+const char * const ICON_MINUS            = ":/core/images/minus.png";
+const char * const ICON_PLUS             = ":/core/images/plus.png";
+const char * const ICON_NEWFILE          = ":/core/images/filenew.png";
+const char * const ICON_OPENFILE         = ":/core/images/fileopen.png";
+const char * const ICON_SAVEFILE         = ":/core/images/filesave.png";
+const char * const ICON_UNDO             = ":/core/images/undo.png";
+const char * const ICON_REDO             = ":/core/images/redo.png";
+const char * const ICON_COPY             = ":/core/images/editcopy.png";
+const char * const ICON_PASTE            = ":/core/images/editpaste.png";
+const char * const ICON_CUT              = ":/core/images/editcut.png";
+const char * const ICON_NEXT             = ":/core/images/next.png";
+const char * const ICON_PREV             = ":/core/images/prev.png";
+const char * const ICON_DIR              = ":/core/images/dir.png";
+const char * const ICON_CLEAN_PANE       = ":/core/images/clean_pane_small.png";
+const char * const ICON_CLEAR            = ":/core/images/clear.png";
+const char * const ICON_FIND             = ":/core/images/find.png";
+const char * const ICON_FINDNEXT         = ":/core/images/findnext.png";
+const char * const ICON_REPLACE          = ":/core/images/replace.png";
+const char * const ICON_RESET            = ":/core/images/reset.png";
+const char * const ICON_MAGNIFIER        = ":/core/images/magnifier.png";
+const char * const ICON_TOGGLE_SIDEBAR   = ":/core/images/sidebaricon.png";
 
 // wizard kind
 const char * const WIZARD_TYPE_FILE      = "QtCreator::WizardType::File";
diff --git a/src/plugins/coreplugin/coreimpl.cpp b/src/plugins/coreplugin/coreimpl.cpp
index 7a7eca4044f04c452a53874afe95f7e309b58570..cd96a9c24fc882a49eefc5715db0b10a257beb75 100644
--- a/src/plugins/coreplugin/coreimpl.cpp
+++ b/src/plugins/coreplugin/coreimpl.cpp
@@ -84,11 +84,6 @@ MessageManager *CoreImpl::messageManager() const
     return m_mainwindow->messageManager();
 }
 
-ViewManagerInterface *CoreImpl::viewManager() const
-{
-    return m_mainwindow->viewManager();
-}
-
 ExtensionSystem::PluginManager *CoreImpl::pluginManager() const
 {
     return m_mainwindow->pluginManager();
@@ -148,15 +143,6 @@ QString CoreImpl::resourcePath() const
 #endif
 }
 
-QString CoreImpl::libraryPath() const
-{
-#if defined(Q_OS_MAC)
-    return QDir::cleanPath(QCoreApplication::applicationDirPath()+QLatin1String("/../PlugIns"));
-#else
-    return QDir::cleanPath(QCoreApplication::applicationDirPath()+QLatin1String("/../lib"));
-#endif
-}
-
 IContext *CoreImpl::currentContextObject() const
 {
     return m_mainwindow->currentContextObject();
@@ -168,12 +154,6 @@ QMainWindow *CoreImpl::mainWindow() const
     return m_mainwindow;
 }
 
-QStatusBar *CoreImpl::statusBar() const
-{
-    return m_mainwindow->statusBar();
-}
-
-
 // adds and removes additional active contexts, this context is appended to the
 // currently active contexts. call updateContext after changing
 void CoreImpl::addAdditionalContext(int context)
diff --git a/src/plugins/coreplugin/coreimpl.h b/src/plugins/coreplugin/coreimpl.h
index 5380b9bdaf3ecf8d1a9c941a2a771bffd2def352..fc5375d37017496ff6827c782f3f4ea68aaff77a 100644
--- a/src/plugins/coreplugin/coreimpl.h
+++ b/src/plugins/coreplugin/coreimpl.h
@@ -60,7 +60,6 @@ public:
     FileManager *fileManager() const ;
     UniqueIDManager *uniqueIDManager() const;
     MessageManager *messageManager() const;
-    ViewManagerInterface *viewManager() const;
     ExtensionSystem::PluginManager *pluginManager() const;
     EditorManager *editorManager() const;
     ProgressManagerInterface *progressManager() const;
@@ -74,12 +73,10 @@ public:
     QPrinter *printer() const;
 
     QString resourcePath() const;
-    QString libraryPath() const;
 
     IContext *currentContextObject() const;
 
     QMainWindow *mainWindow() const;
-    QStatusBar *statusBar() const;
 
     // adds and removes additional active contexts, this context is appended to the
     // currently active contexts. call updateContext after changing
diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp
index 9a426dbeadce2869aa65979d26b9aa8300a4f3e0..252e7cc20734083df960dec1289dca931a21ae43 100644
--- a/src/plugins/coreplugin/coreplugin.cpp
+++ b/src/plugins/coreplugin/coreplugin.cpp
@@ -37,7 +37,6 @@
 #include "editormanager.h"
 #include "mainwindow.h"
 #include "modemanager.h"
-#include "viewmanager.h"
 #include "fileiconprovider.h"
 
 #include <QtCore/qplugin.h>
diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h
index f14d3b1a74cd50e2b61054b7be7a6e556c40a236..a8341c97e907aebd78f5f965e70e89eb0c2744db 100644
--- a/src/plugins/coreplugin/coreplugin.h
+++ b/src/plugins/coreplugin/coreplugin.h
@@ -31,8 +31,8 @@
 **
 ***************************************************************************/
 
-#ifndef QWORKBENCHPLUGIN_H
-#define QWORKBENCHPLUGIN_H
+#ifndef COREPLUGIN_H
+#define COREPLUGIN_H
 
 #include <extensionsystem/iplugin.h>
 
@@ -68,4 +68,4 @@ private:
 } // namespace Internal
 } // namespace Core
 
-#endif // QWORKBENCHPLUGIN_H
+#endif // COREPLUGIN_H
diff --git a/src/plugins/coreplugin/coreplugin.pri b/src/plugins/coreplugin/coreplugin.pri
index c2b2a3fa2cf52186501481f0382c0e485c996399..fc5fc7aae611e7be950f9f2fc306c48149659381 100644
--- a/src/plugins/coreplugin/coreplugin.pri
+++ b/src/plugins/coreplugin/coreplugin.pri
@@ -1,3 +1,2 @@
 include(coreplugin_dependencies.pri)
-
 LIBS *= -l$$qtLibraryTarget(Core)
diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro
index 80056b3b2e537658e24bab7f28443421eb4b3bf5..2dc558a542284910306a36453b7602119f609f75 100644
--- a/src/plugins/coreplugin/coreplugin.pro
+++ b/src/plugins/coreplugin/coreplugin.pro
@@ -73,7 +73,8 @@ SOURCES += mainwindow.cpp \
     rightpane.cpp \
     sidebar.cpp \
     fileiconprovider.cpp \
-    mimedatabase.cpp
+    mimedatabase.cpp \
+    icore.cpp
 HEADERS += mainwindow.h \
     welcomemode.h \
     editmode.h \
diff --git a/src/plugins/coreplugin/dialogs/shortcutsettings.ui b/src/plugins/coreplugin/dialogs/shortcutsettings.ui
index 4faaec4b32ef3298644604549700d255517de2dd..f1cc3f795a5e17d3e6a2fa89f8c75bf46a957166 100644
--- a/src/plugins/coreplugin/dialogs/shortcutsettings.ui
+++ b/src/plugins/coreplugin/dialogs/shortcutsettings.ui
@@ -131,7 +131,7 @@
           </property>
           <property name="icon">
            <iconset resource="../core.qrc">
-            <normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
+            <normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
           </property>
          </widget>
         </item>
@@ -145,7 +145,7 @@
           </property>
           <property name="icon">
            <iconset resource="../core.qrc">
-            <normaloff>:/qworkbench/images/clear.png</normaloff>:/qworkbench/images/clear.png</iconset>
+            <normaloff>:/core/images/clear.png</normaloff>:/core/images/clear.png</iconset>
           </property>
          </widget>
         </item>
diff --git a/src/plugins/coreplugin/editormanager/editorgroup.cpp b/src/plugins/coreplugin/editormanager/editorgroup.cpp
index 82c30db30fbb07140093ca18d6511ce727b22355..91adef17805cc1e60ebdf157aa5d3aea4fb26e67 100644
--- a/src/plugins/coreplugin/editormanager/editorgroup.cpp
+++ b/src/plugins/coreplugin/editormanager/editorgroup.cpp
@@ -118,7 +118,7 @@ QVariant EditorModel::data(const QModelIndex &index, int role) const
                 : editor->displayName();
     case Qt::DecorationRole:
         return editor->file()->isReadOnly()
-                ? QIcon(QLatin1String(":/qworkbench/images/locked.png"))
+                ? QIcon(QLatin1String(":/core/images/locked.png"))
                 : QIcon();
     case Qt::ToolTipRole:
         return editor->file()->fileName().isEmpty()
diff --git a/src/plugins/coreplugin/editormanager/openeditorsview.cpp b/src/plugins/coreplugin/editormanager/openeditorsview.cpp
index a25e92ef0ce551b1365864f888a08c56595f849a..755826c94a4c2dbcd057def2ebe681b760549c06 100644
--- a/src/plugins/coreplugin/editormanager/openeditorsview.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorsview.cpp
@@ -172,8 +172,8 @@ void OpenEditorsWidget::updateCurrentItem(QTreeWidgetItem *currentItem)
 //todo: this is almost duplicated in openeditorswindow
 void OpenEditorsWidget::updateItem(QTreeWidgetItem *item, IEditor *editor)
 {
-    static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
-    static const QIcon emptyIcon(QLatin1String(":/qworkbench/images/empty14.png"));
+    static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
+    static const QIcon emptyIcon(QLatin1String(":/core/images/empty14.png"));
     QString title = editor->displayName();
     if (editor->file()->isModified())
         title += tr("*");
diff --git a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
index b17b79c91190d66a6f110cd56ec5f61447a243ab..c7fe93b71556d184e07f44fa8f27f94a72dcf066 100644
--- a/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
+++ b/src/plugins/coreplugin/editormanager/openeditorswindow.cpp
@@ -300,8 +300,8 @@ void OpenEditorsWindow::centerOnItem(int selectedIndex)
 
 void OpenEditorsWindow::updateItem(QTreeWidgetItem *item, IEditor *editor)
 {
-    static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
-    static const QIcon emptyIcon(QLatin1String(":/qworkbench/images/empty14.png"));
+    static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
+    static const QIcon emptyIcon(QLatin1String(":/core/images/empty14.png"));
 
     QString title = editor->displayName();
     if (editor->file()->isModified())
diff --git a/src/plugins/coreplugin/editormanager/stackededitorgroup.cpp b/src/plugins/coreplugin/editormanager/stackededitorgroup.cpp
index 6b46fa3b164e2dbedc06046f8b0017da9b01ae2d..0111be02b76f5670b7c7db6e950f423d1a6e938b 100644
--- a/src/plugins/coreplugin/editormanager/stackededitorgroup.cpp
+++ b/src/plugins/coreplugin/editormanager/stackededitorgroup.cpp
@@ -103,7 +103,7 @@ StackedEditorGroup::StackedEditorGroup(QWidget *parent) :
         m_lockButton->setProperty("type", QLatin1String("dockbutton"));
 
         m_closeButton->setAutoRaise(true);
-        m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+        m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
         m_closeButton->setProperty("type", QLatin1String("dockbutton"));
 
         QToolBar *rightToolBar = new QToolBar;
@@ -150,7 +150,7 @@ StackedEditorGroup::StackedEditorGroup(QWidget *parent) :
 
         QToolButton *closeButton = new QToolButton;
         closeButton->setAutoRaise(true);
-        closeButton->setIcon(QIcon(":/qworkbench/images/clear.png"));
+        closeButton->setIcon(QIcon(":/core/images/clear.png"));
         closeButton->setToolTip(tr("Close"));
         connect(closeButton, SIGNAL(clicked()), m_infoWidget, SLOT(hide()));
 
@@ -303,8 +303,8 @@ void StackedEditorGroup::checkEditorStatus()
 
 void StackedEditorGroup::updateEditorStatus(IEditor *editor)
 {
-    static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
-    static const QIcon unlockedIcon(QLatin1String(":/qworkbench/images/unlocked.png"));
+    static const QIcon lockedIcon(QLatin1String(":/core/images/locked.png"));
+    static const QIcon unlockedIcon(QLatin1String(":/core/images/unlocked.png"));
 
     if (editor->file()->isReadOnly()) {
         m_lockButton->setIcon(lockedIcon);
diff --git a/src/plugins/coreplugin/fileiconprovider.cpp b/src/plugins/coreplugin/fileiconprovider.cpp
index 772c826d3fe597d43930252f8dc0ca14cbeef3f4..0c4b4a39de13bf09286524d7b7db73e14fcb3705 100644
--- a/src/plugins/coreplugin/fileiconprovider.cpp
+++ b/src/plugins/coreplugin/fileiconprovider.cpp
@@ -48,7 +48,7 @@ using namespace Core;
 FileIconProvider *FileIconProvider::m_instance = 0;
 
 FileIconProvider::FileIconProvider()
-    : m_unknownFileIcon(QLatin1String(":/qworkbench/images/unknownfile.png"))
+    : m_unknownFileIcon(QLatin1String(":/core/images/unknownfile.png"))
 {
 }
 
diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp
index 654f3eac6b1df7ff36f034a9048b82c6b30b6853..294bb36dec8ae49e742ea0f628c3a894d1fb14b9 100644
--- a/src/plugins/coreplugin/generalsettings.cpp
+++ b/src/plugins/coreplugin/generalsettings.cpp
@@ -42,7 +42,8 @@
 
 using namespace Core::Internal;
 
-GeneralSettings::GeneralSettings()
+GeneralSettings::GeneralSettings():
+    m_dialog(0)
 {
 }
 
@@ -61,7 +62,7 @@ QString GeneralSettings::trCategory() const
     return tr("Environment");
 }
 
-QWidget* GeneralSettings::createPage(QWidget *parent)
+QWidget *GeneralSettings::createPage(QWidget *parent)
 {
     m_page = new Ui_GeneralSettings;
     QWidget *w = new QWidget(parent);
diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui
index f3b50c5e4b3603de5d247201430d8192916e20d5..c014fae607b8a6585a8b966abeadb117573bff85 100644
--- a/src/plugins/coreplugin/generalsettings.ui
+++ b/src/plugins/coreplugin/generalsettings.ui
@@ -77,7 +77,7 @@
           </property>
           <property name="icon">
            <iconset resource="core.qrc">
-            <normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
+            <normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
           </property>
          </widget>
         </item>
@@ -118,7 +118,7 @@
           </property>
           <property name="icon">
            <iconset resource="core.qrc">
-            <normaloff>:/qworkbench/images/reset.png</normaloff>:/qworkbench/images/reset.png</iconset>
+            <normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
           </property>
          </widget>
         </item>
diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..317ebbbc45ad48ad085600e2639075b1b9cc4955
--- /dev/null
+++ b/src/plugins/coreplugin/icore.cpp
@@ -0,0 +1,308 @@
+#include "icore.h"
+
+/*!
+    \namespace Core
+    \brief The Core namespace contains all classes that make up the Core plugin
+    which constitute the basic functionality of Qt Creator.
+*/
+
+/*!
+    \namespace Core::Internal
+    \internal
+*/
+
+/*!
+    \class Core::ICore
+    \brief The ICore class allows access to the different part that make up
+    the basic functionality of Qt Creator.
+
+    You should never create a subclass of this interface. The one and only
+    instance is created by the Core plugin. You can access this instance
+    from your plugin via the plugin manager, e.g.
+    \code
+        ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>();
+    \endcode
+
+    \mainclass
+*/
+
+/*!
+    \fn QStringList ICore::showNewItemDialog(const QString &title,
+                                      const QList<IWizard *> &wizards,
+                                      const QString &defaultLocation = QString())
+    \brief Opens a dialog where the user can choose from a set of \a wizards that
+    create new files/classes/projects.
+
+    The \a title argument is shown as the dialogs title. The path where the
+    files will be created (if the user doesn't change it) is set
+    in \a defaultLocation. It defaults to the path of the file manager's
+    current file.
+
+    \sa Core::FileManager
+*/
+
+/*!
+    \fn void ICore::showOptionsDialog(const QString &group = QString(),
+                               const QString &page = QString())
+    \brief Opens the application options/preferences dialog with preselected
+    \a page in a specified \a group.
+
+    The arguments refer to the string IDs of the corresponding IOptionsPage.
+*/
+
+/*!
+    \fn ActionManagerInterface *ICore::actionManager() const
+    \brief Returns the application's action manager.
+
+    The action manager is responsible for registration of menus and
+    menu items and keyboard shortcuts.
+*/
+
+/*!
+    \fn FileManager *ICore::fileManager() const
+    \brief Returns the application's file manager.
+
+    The file manager keeps track of files for changes outside the application.
+*/
+
+/*!
+    \fn UniqueIDManager *ICore::uniqueIDManager() const
+    \brief Returns the application's id manager.
+
+    The unique ID manager transforms strings in unique integers and the other way round.
+*/
+
+/*!
+    \fn MessageManager *ICore::messageManager() const
+    \brief Returns the application's message manager.
+
+    The message manager is the interface to the "General" output pane for
+    general application debug messages.
+*/
+
+/*!
+    \fn ExtensionSystem::PluginManager *ICore::pluginManager() const
+    \brief Returns the application's plugin manager.
+
+    The plugin manager handles the plugin life cycles and manages
+    the common object pool.
+*/
+
+/*!
+    \fn EditorManager *ICore::editorManager() const
+    \brief Returns the application's editor manager.
+
+    The editor manager handles all editor related tasks like opening
+    documents, the stack of currently open documents and the currently
+    active document.
+*/
+
+/*!
+    \fn ProgressManagerInterface *ICore::progressManager() const
+    \brief Returns the application's progress manager.
+
+    Use the progress manager to register a concurrent task to
+    show a progress bar the way Qt Creator does it.
+*/
+
+/*!
+    \fn ScriptManagerInterface *ICore::scriptManager() const
+    \internal
+*/
+
+/*!
+    \fn VariableManager *ICore::variableManager() const
+    \brief Returns the application's variable manager.
+
+    The variable manager is used to register application wide string variables
+    like \c MY_PROJECT_DIR such that strings like \c{somecommand ${MY_PROJECT_DIR}/sub}
+    can be resolved/expanded from anywhere in the application.
+*/
+
+/*!
+    \fn VCSManager *ICore::vcsManager() const
+    \brief Returns the application's vcs manager.
+
+    The vcs manager can be used to e.g. retrieve information about
+    the version control system used for a directory on hard disk.
+    The actual functionality for a specific version control system
+    must be implemented in a IVersionControl object and registered in
+    the plugin manager's object pool.
+*/
+
+/*!
+    \fn ModeManager *ICore::modeManager() const
+    \brief Returns the application's mode manager.
+
+    The mode manager handles everything related to the instances of IMode
+    that were added to the plugin manager's object pool as well as their
+    buttons and the tool bar with the round buttons in the lower left
+    corner of Qt Creator.
+*/
+
+/*!
+    \fn MimeDatabase *ICore::mimeDatabase() const
+    \brief Returns the application's mime database.
+
+    Use the mime database to manage mime types.
+*/
+
+/*!
+    \fn QSettings *ICore::settings() const
+    \brief Returns the application's main settings object.
+
+    You can use it to retrieve or set application wide settings
+    (in contrast to session or project specific settings).
+*/
+
+/*!
+    \fn QPrinter *ICore::printer() const
+    \brief Returns the application's printer object.
+
+    Always use this printer object for printing, so the different parts of the
+    application re-use it's settings.
+*/
+
+/*!
+    \fn QString ICore::resourcePath() const
+    \brief Returns the absolute path that is used for resources like
+    project templates and the debugger macros.
+
+    This abstraction is needed to avoid platform-specific code all over
+    the place, since e.g. on Mac the resources are part of the application bundle.
+*/
+
+/*!
+    \fn QMainWindow *ICore::mainWindow() const
+    \brief Returns the main application window.
+
+    For use as dialog parent etc.
+*/
+
+/*!
+    \fn IContext *ICore::currentContextObject() const
+    \brief Returns the context object of the current main context.
+
+    \sa ICore::addAdditionalContext()
+    \sa ICore::addContextObject()
+*/
+
+/*!
+    \fn void ICore::addAdditionalContext(int context)
+    \brief Register additional context to be currently active.
+
+    Appends the additional \a context to the list of currently active
+    contexts. You need to call ICore::updateContext to make that change
+    take effect.
+
+    \sa ICore::removeAdditionalContext()
+    \sa ICore::hasContext()
+    \sa ICore::updateContext()
+*/
+
+/*!
+    \fn void ICore::removeAdditionalContext(int context)
+    \brief Removes the given \a context from the list of currently active contexts.
+
+    You need to call ICore::updateContext to make that change
+    take effect.
+
+    \sa ICore::addAdditionalContext()
+    \sa ICore::hasContext()
+    \sa ICore::updateContext()
+*/
+
+/*!
+    \fn bool ICore::hasContext(int context) const
+    \brief Returns if the given \a context is currently one of the active contexts.
+
+    \sa ICore::addAdditionalContext()
+    \sa ICore::addContextObject()
+*/
+
+/*!
+    \fn void ICore::addContextObject(IContext *context)
+    \brief Registers an additional \a context object.
+
+    After registration this context object gets automatically the
+    current context object whenever it's widget gets focus.
+
+    \sa ICore::removeContextObject()
+    \sa ICore::addAdditionalContext()
+    \sa ICore::currentContextObject()
+*/
+
+/*!
+    \fn void ICore::removeContextObject(IContext *context)
+    \brief Unregisters a \a context object from the list of know contexts.
+
+    \sa ICore::addContextObject()
+    \sa ICore::addAdditionalContext()
+    \sa ICore::currentContextObject()
+}
+*/
+
+/*!
+    \fn void ICore::updateContext()
+    \brief Update the list of active contexts after adding or removing additional ones.
+
+    \sa ICore::addAdditionalContext()
+    \sa ICore::removeAdditionalContext()
+*/
+
+/*!
+    \fn void ICore::openFiles(const QStringList &fileNames)
+    \brief Open all files from a list of \a fileNames like it would be
+    done if they were given to Qt Creator on the command line, or
+    they were opened via \gui{File|Open}.
+*/
+
+/*!
+    \fn ICore::ICore()
+    \internal
+*/
+
+/*!
+    \fn ICore::~ICore()
+    \internal
+*/
+
+/*!
+    \fn void ICore::coreOpened()
+    \brief Emitted after all plugins have been loaded and the main window shown.
+*/
+
+/*!
+    \fn void ICore::saveSettingsRequested()
+    \brief Emitted to signal that the user has requested that the global settings
+    should be saved to disk.
+
+    At the moment that happens when the application is closed, and on \gui{Save All}.
+*/
+
+/*!
+    \fn void ICore::optionsDialogRequested()
+    \brief Signal that allows plugins to perform actions just before the \gui{Tools|Options}
+    dialog is shown.
+*/
+
+/*!
+    \fn void ICore::coreAboutToClose()
+    \brief Plugins can do some pre-end-of-life actions when they get this signal.
+
+    The application is guaranteed to shut down after this signal is emitted.
+    It's there as an addition to the usual plugin lifecycle methods, namely
+    IPlugin::shutdown(), just for convenience.
+*/
+
+/*!
+    \fn void ICore::contextAboutToChange(Core::IContext *context)
+    \brief Sent just before a new \a context becomes the current context
+    (meaning that it's widget got focus).
+*/
+
+/*!
+    \fn void ICore::contextChanged(Core::IContext *context)
+    \brief Sent just after a new \a context became the current context
+    (meaning that it's widget got focus).
+*/
diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h
index fe9b3b3ba9b1137ef1898f1a4f995235fc3d387a..53ff1e96f909fef98631bfc88006f55adc085621 100644
--- a/src/plugins/coreplugin/icore.h
+++ b/src/plugins/coreplugin/icore.h
@@ -56,7 +56,6 @@ class FileManager;
 class MessageManager;
 class IEditor;
 class UniqueIDManager;
-class ViewManagerInterface;
 class EditorManager;
 class ProgressManagerInterface;
 class ScriptManagerInterface;
@@ -86,7 +85,6 @@ public:
     virtual FileManager *fileManager() const = 0;
     virtual UniqueIDManager *uniqueIDManager() const = 0;
     virtual MessageManager *messageManager() const = 0;
-    virtual ViewManagerInterface *viewManager() const = 0;
     virtual ExtensionSystem::PluginManager *pluginManager() const = 0;
     virtual EditorManager *editorManager() const = 0;
     virtual ProgressManagerInterface *progressManager() const = 0;
@@ -100,20 +98,17 @@ public:
     virtual QPrinter *printer() const = 0;
 
     virtual QString resourcePath() const = 0;
-    virtual QString libraryPath() const = 0;
-
-    virtual IContext *currentContextObject() const = 0;
 
     virtual QMainWindow *mainWindow() const = 0;
-    virtual QStatusBar *statusBar() const = 0;
 
     // adds and removes additional active contexts, this context is appended to the
     // currently active contexts. call updateContext after changing
+    virtual IContext *currentContextObject() const = 0;
     virtual void addAdditionalContext(int context) = 0;
     virtual void removeAdditionalContext(int context) = 0;
     virtual bool hasContext(int context) const = 0;
-    virtual void addContextObject(IContext *contex) = 0;
-    virtual void removeContextObject(IContext *contex) = 0;
+    virtual void addContextObject(IContext *context) = 0;
+    virtual void removeContextObject(IContext *context) = 0;
 
     virtual void updateContext() = 0;
 
@@ -122,7 +117,7 @@ public:
 signals:
     void coreOpened();
     void saveSettingsRequested();
-    void settingsDialogRequested();
+    void optionsDialogRequested();
     void coreAboutToClose();
     void contextAboutToChange(Core::IContext *context);
     void contextChanged(Core::IContext *context);
diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp
index f68c5da7d06772f8684ddcb53f8244774e098153..b368ad8cf4dcce84e36d4461209f9fa5ef7f2435 100644
--- a/src/plugins/coreplugin/mainwindow.cpp
+++ b/src/plugins/coreplugin/mainwindow.cpp
@@ -149,7 +149,7 @@ MainWindow::MainWindow() :
     m_toggleSideBarButton(new QToolButton)
 {
     setWindowTitle(tr("Qt Creator"));
-    qApp->setWindowIcon(QIcon(":/qworkbench/images/qtcreator_logo_128.png"));
+    qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
     setDockNestingEnabled(true);
 
     setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
@@ -783,7 +783,7 @@ QStringList MainWindow::showNewItemDialog(const QString &title,
 
 void MainWindow::showOptionsDialog(const QString &category, const QString &page)
 {
-    emit m_coreImpl->settingsDialogRequested();
+    emit m_coreImpl->optionsDialogRequested();
     SettingsDialog dlg(this, category, page);
     dlg.exec();
 }
@@ -840,11 +840,6 @@ VCSManager *MainWindow::vcsManager() const
     return m_vcsManager;
 }
 
-ViewManagerInterface *MainWindow::viewManager() const
-{
-    return m_viewManager;
-}
-
 EditorManager *MainWindow::editorManager() const
 {
     return m_editorManager;
diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h
index 57338b31276e947081da1fb03c5585edc4ac1fe8..913e6728e71e7b8491d82de18a959f153b1150d0 100644
--- a/src/plugins/coreplugin/mainwindow.h
+++ b/src/plugins/coreplugin/mainwindow.h
@@ -109,7 +109,6 @@ public:
     Core::FileManager *fileManager() const;
     Core::UniqueIDManager *uniqueIDManager() const;
     Core::MessageManager *messageManager() const;
-    Core::ViewManagerInterface *viewManager() const;
     ExtensionSystem::PluginManager *pluginManager() const;
     Core::EditorManager *editorManager() const;
     Core::ProgressManagerInterface *progressManager() const;
diff --git a/src/plugins/coreplugin/manhattanstyle.cpp b/src/plugins/coreplugin/manhattanstyle.cpp
index 5b72c891cd6bd27a619346aa40fe3b3f2bc5372d..9237883221bba260a50188943182ed9ee098ce7f 100644
--- a/src/plugins/coreplugin/manhattanstyle.cpp
+++ b/src/plugins/coreplugin/manhattanstyle.cpp
@@ -102,11 +102,11 @@ public:
     {
         style = QStyleFactory::create(baseStyleName);
         QTC_ASSERT(style, /**/);
-        buttonImage_pressed = QImage(":/qworkbench/images/pushbutton_pressed.png");
-        buttonImage = QImage(":/qworkbench/images/pushbutton.png");
+        buttonImage_pressed = QImage(":/core/images/pushbutton_pressed.png");
+        buttonImage = QImage(":/core/images/pushbutton.png");
 
-        lineeditImage = QImage(":/qworkbench/images/inputfield.png");
-        lineeditImage_disabled = QImage(":/qworkbench/images/inputfield_disabled.png");
+        lineeditImage = QImage(":/core/images/inputfield.png");
+        lineeditImage_disabled = QImage(":/core/images/inputfield_disabled.png");
     }
 
     ~ManhattanStylePrivate()
@@ -345,7 +345,7 @@ void ManhattanStyle::polish(QPalette &pal)
 QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, const QStyleOption *option,
                                                  const QWidget *widget) const
 {
-    static const QIcon closeButton(":/qworkbench/images/closebutton.png");
+    static const QIcon closeButton(":/core/images/closebutton.png");
     QIcon icon;
     switch (standardIcon) {
     case QStyle::SP_TitleBarCloseButton:
@@ -360,7 +360,7 @@ QIcon ManhattanStyle::standardIconImplementation(StandardPixmap standardIcon, co
 QPixmap ManhattanStyle::standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt,
                                        const QWidget *widget) const
 {
-    static const QPixmap closeButton(":/qworkbench/images/closebutton.png");
+    static const QPixmap closeButton(":/core/images/closebutton.png");
     QPixmap pixmap;
     switch (standardPixmap) {
     case QStyle::SP_TitleBarCloseButton:
diff --git a/src/plugins/coreplugin/navigationwidget.cpp b/src/plugins/coreplugin/navigationwidget.cpp
index 412559a9b0aecd1c2c22d19554776d8de37fe439..491c394343820bea218a06fa4098b08a5f1136d3 100644
--- a/src/plugins/coreplugin/navigationwidget.cpp
+++ b/src/plugins/coreplugin/navigationwidget.cpp
@@ -358,13 +358,13 @@ NavigationSubWidget::NavigationSubWidget(NavigationWidget *parentWidget)
 
     QToolButton *split = new QToolButton;
     split->setProperty("type", QLatin1String("dockbutton"));
-    split->setIcon(QIcon(":/qworkbench/images/splitbutton_horizontal.png"));
+    split->setIcon(QIcon(":/core/images/splitbutton_horizontal.png"));
     split->setToolTip(tr("Split"));
     connect(split, SIGNAL(clicked(bool)), this, SIGNAL(split()));
 
     QToolButton *close = new QToolButton;
     close->setProperty("type", QLatin1String("dockbutton"));
-    close->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+    close->setIcon(QIcon(":/core/images/closebutton.png"));
     close->setToolTip(tr("Close"));
 
     connect(close, SIGNAL(clicked(bool)), this, SIGNAL(close()));
diff --git a/src/plugins/coreplugin/outputpane.cpp b/src/plugins/coreplugin/outputpane.cpp
index 6d97c5d3611fd3f64574fb8aab68cae0866e5c86..6b5c3b146d11580fa68bc299ab7690c1702ee440 100644
--- a/src/plugins/coreplugin/outputpane.cpp
+++ b/src/plugins/coreplugin/outputpane.cpp
@@ -167,7 +167,7 @@ OutputPane::OutputPane(const QList<int> &context, QWidget *parent) :
     m_clearButton->setToolTip(tr("Clear"));
     connect(m_clearButton, SIGNAL(clicked()), this, SLOT(clearPage()));
 
-    m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+    m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
     m_closeButton->setProperty("type", QLatin1String("dockbutton"));
     connect(m_closeButton, SIGNAL(clicked()), this, SLOT(slotHide()));
 
@@ -488,13 +488,13 @@ OutputPaneToggleButton::OutputPaneToggleButton(int number, const QString &text,
     setFocusPolicy(Qt::NoFocus);
     setCheckable(true);
     setStyleSheet(
-            "QPushButton { border-image: url(:/qworkbench/images/panel_button.png) 2 2 2 19;"
+            "QPushButton { border-image: url(:/core/images/panel_button.png) 2 2 2 19;"
                          " border-width: 2px 2px 2px 19px; padding-left: -17; padding-right: 4 } "
-            "QPushButton:checked { border-image: url(:/qworkbench/images/panel_button_checked.png) 2 2 2 19 } "
+            "QPushButton:checked { border-image: url(:/core/images/panel_button_checked.png) 2 2 2 19 } "
 #ifndef Q_WS_MAC // Mac UI's dont usually do hover
-            "QPushButton:checked:hover { border-image: url(:/qworkbench/images/panel_button_checked_hover.png) 2 2 2 19 } "
-            "QPushButton:pressed:hover { border-image: url(:/qworkbench/images/panel_button_pressed.png) 2 2 2 19 } "
-            "QPushButton:hover { border-image: url(:/qworkbench/images/panel_button_hover.png) 2 2 2 19 } "
+            "QPushButton:checked:hover { border-image: url(:/core/images/panel_button_checked_hover.png) 2 2 2 19 } "
+            "QPushButton:pressed:hover { border-image: url(:/core/images/panel_button_pressed.png) 2 2 2 19 } "
+            "QPushButton:hover { border-image: url(:/core/images/panel_button_hover.png) 2 2 2 19 } "
 #endif
             );
 }
diff --git a/src/plugins/coreplugin/progressmanager/progressmanager.cpp b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
index aaa5f4406c987fa3907e2a6f854008f610dc6fb9..ab1b0370323ab5a508e0a6510bc2bfbb4b28ddd2 100644
--- a/src/plugins/coreplugin/progressmanager/progressmanager.cpp
+++ b/src/plugins/coreplugin/progressmanager/progressmanager.cpp
@@ -38,7 +38,6 @@
 
 #include "coreconstants.h"
 #include "uniqueidmanager.h"
-#include "viewmanagerinterface.h"
 
 #include <utils/qtcassert.h>
 
diff --git a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
index 03809fdf30e426eea3990c5c1a200d750a3066ec..5d1b58ea0f0c9f25a182a967053cd9d7b6765434 100644
--- a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
+++ b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.cpp
@@ -44,7 +44,6 @@
 #include <QtCore/QSettings>
 
 #include <QtGui/QMainWindow>
-#include <QtGui/QStatusBar>
 #include <QtGui/QToolBar>
 
 #include <QtScript/QScriptEngine>
@@ -82,11 +81,6 @@ QMainWindow *CorePrototype::mainWindow() const
     return callee()->mainWindow();
 }
 
-QStatusBar *CorePrototype::statusBar() const
-{
-     return callee()->statusBar();
-}
-
 QSettings *CorePrototype::settings() const
 {
      return callee()->settings();
diff --git a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
index c7eae4a6ed4761629d67a6552ef1ae0db9fd4368..b1db715f8c468f9a5598510c1696cd6589503441 100644
--- a/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
+++ b/src/plugins/coreplugin/scriptmanager/qworkbench_wrapper.h
@@ -55,7 +55,6 @@ class CorePrototype : public QObject, public QScriptable
     Q_PROPERTY(Core::EditorManager* editorManager READ editorManager DESIGNABLE false SCRIPTABLE true STORED false)
 
     Q_PROPERTY(QMainWindow* mainWindow READ mainWindow DESIGNABLE false SCRIPTABLE true STORED false)
-    Q_PROPERTY(QStatusBar* statusBar READ statusBar DESIGNABLE false SCRIPTABLE true STORED false)
     Q_PROPERTY(QSettings* settings READ settings DESIGNABLE false SCRIPTABLE true STORED false)
 
 public:
@@ -68,7 +67,6 @@ public:
     Core::EditorManager *editorManager() const;
 
     QMainWindow *mainWindow() const;
-    QStatusBar *statusBar() const;
     QSettings *settings() const;
 
 public slots:
diff --git a/src/plugins/coreplugin/scriptmanager/scriptmanagerinterface.h b/src/plugins/coreplugin/scriptmanager/scriptmanagerinterface.h
index df145822e2aa117ddd5c557acf93754402957112..d8273ac958482efeafd57928f0f2f53bb5a2cfa9 100644
--- a/src/plugins/coreplugin/scriptmanager/scriptmanagerinterface.h
+++ b/src/plugins/coreplugin/scriptmanager/scriptmanagerinterface.h
@@ -44,7 +44,7 @@ namespace Core {
 
 /* Script Manager.
  * Provides a script engine that is initialized with
- * QWorkBenchs interfaces and allows for running scripts.
+ * Qt Creator's interfaces and allows for running scripts.
  * @{todo} Should it actually manage script files, too? */
 
 class CORE_EXPORT ScriptManagerInterface : public QObject
diff --git a/src/plugins/coreplugin/sidebar.cpp b/src/plugins/coreplugin/sidebar.cpp
index 36f744769fb1c076e11a825aef7904e636c6c474..17887450d9bc5fe1fba312ffecb9252d9d0b5475 100644
--- a/src/plugins/coreplugin/sidebar.cpp
+++ b/src/plugins/coreplugin/sidebar.cpp
@@ -231,13 +231,13 @@ SideBarWidget::SideBarWidget(SideBar *sideBar, const QString &title)
 
     m_splitButton = new QToolButton;
     m_splitButton->setProperty("type", QLatin1String("dockbutton"));
-    m_splitButton->setIcon(QIcon(":/qworkbench/images/splitbutton_horizontal.png"));
+    m_splitButton->setIcon(QIcon(":/core/images/splitbutton_horizontal.png"));
     m_splitButton->setToolTip(tr("Split"));
     connect(m_splitButton, SIGNAL(clicked(bool)), this, SIGNAL(split()));
 
     m_closeButton = new QToolButton;
     m_closeButton->setProperty("type", QLatin1String("dockbutton"));
-    m_closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+    m_closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
     m_closeButton->setToolTip(tr("Close"));
 
     connect(m_closeButton, SIGNAL(clicked(bool)), this, SIGNAL(close()));
diff --git a/src/plugins/coreplugin/versiondialog.cpp b/src/plugins/coreplugin/versiondialog.cpp
index 4fdb3166cf31e33e408156eb3e13bde5ca209015..52810c00efcef1730a58ad27b1ef7de6f49f65c1 100644
--- a/src/plugins/coreplugin/versiondialog.cpp
+++ b/src/plugins/coreplugin/versiondialog.cpp
@@ -56,7 +56,7 @@ VersionDialog::VersionDialog(QWidget *parent)
 {
     // We need to set the window icon explicitly here since for some reason the
     // application icon isn't used when the size of the dialog is fixed (at least not on X11/GNOME)
-    setWindowIcon(QIcon(":/qworkbench/images/qtcreator_logo_128.png"));
+    setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
 
     setWindowTitle(tr("About Qt Creator"));
     setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
@@ -102,7 +102,7 @@ VersionDialog::VersionDialog(QWidget *parent)
     connect(buttonBox , SIGNAL(helpRequested()), this, SLOT(popupLicense()));
 
     QLabel *logoLabel = new QLabel;
-    logoLabel->setPixmap(QPixmap(QLatin1String(":/qworkbench/images/qtcreator_logo_128.png")));
+    logoLabel->setPixmap(QPixmap(QLatin1String(":/core/images/qtcreator_logo_128.png")));
     layout->addWidget(logoLabel , 0, 0, 1, 1);
     layout->addWidget(copyRightLabel, 0, 1, 4, 4);
     layout->addWidget(buttonBox, 4, 0, 1, 5);
diff --git a/src/plugins/coreplugin/welcomemode.cpp b/src/plugins/coreplugin/welcomemode.cpp
index be5dd624295befd7eacf7be4a60b0da3f8ce375b..a0f5f98b998b00affdc00e2caec1f5ab118e17a7 100644
--- a/src/plugins/coreplugin/welcomemode.cpp
+++ b/src/plugins/coreplugin/welcomemode.cpp
@@ -92,16 +92,16 @@ WelcomeModePrivate::WelcomeModePrivate() :
 #else
     m_label(new QLabel),
 #endif
-    m_htmlTemplate(readFile(QLatin1String(":/qworkbench/html/welcome.html"))),
-    m_sessionHtmlTemplate(readFile(QLatin1String(":/qworkbench/html/recent_sessions.html"))),
-    m_projectHtmlTemplate(readFile(QLatin1String(":/qworkbench/html/recent_projects.html"))),
-    m_baseUrl(QUrl(QLatin1String("qrc:/qworkbench/html/welcome.html")))
+    m_htmlTemplate(readFile(QLatin1String(":/core/html/welcome.html"))),
+    m_sessionHtmlTemplate(readFile(QLatin1String(":/core/html/recent_sessions.html"))),
+    m_projectHtmlTemplate(readFile(QLatin1String(":/core/html/recent_projects.html"))),
+    m_baseUrl(QUrl(QLatin1String("qrc:/core/html/welcome.html")))
 {
 }
 
 #if defined(QT_NO_WEBKIT)
 
-const char *LABEL = "<center><table><tr><td><img src=\":/qworkbench/html/images/product_logo.png\"/></td><td width=300>"
+const char *LABEL = "<center><table><tr><td><img src=\":/core/html/images/product_logo.png\"/></td><td width=300>"
                     "<h2><br/><br/>Welcome</h2><p> Qt Creator is an intuitive, modern cross platform IDE that enables "
                     "developers to create graphically appealing applications for desktop, "
                     "embedded, and mobile devices. "
@@ -172,7 +172,7 @@ QString WelcomeMode::name() const
 
 QIcon WelcomeMode::icon() const
 {
-    return QIcon(QLatin1String(":/qworkbench/images/qtcreator_logo_32.png"));
+    return QIcon(QLatin1String(":/core/images/qtcreator_logo_32.png"));
 }
 
 int WelcomeMode::priority() const
diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp
index b0274ad27e172d0b2ed651dd2c61815858d4d312..59e64c4cf9a82d993b7c35dd7c4070dfa68be93b 100644
--- a/src/plugins/designer/formeditorw.cpp
+++ b/src/plugins/designer/formeditorw.cpp
@@ -715,7 +715,7 @@ void FormEditorW::print()
         painter.drawPixmap(0, 0, pixmap);
         m_core->mainWindow()->setCursor(oldCursor);
 
-        m_core->statusBar()->showMessage(tr("Printed %1...").arg(QFileInfo(fw->fileName()).fileName()));
+//        m_core->statusBar()->showMessage(tr("Printed %1...").arg(QFileInfo(fw->fileName()).fileName()));
     } while (false);
     m_core->printer()->setFullPage(oldFullPage);
     m_core->printer()->setOrientation(oldOrientation);
diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h
index 8263fbb622dcb84b8b2e8da59267092725a86f75..0e36ff3b9ffb55a51051e60162888230d7dc5fc6 100644
--- a/src/plugins/designer/formeditorw.h
+++ b/src/plugins/designer/formeditorw.h
@@ -89,7 +89,7 @@ class SettingsPage;
   * Requesting an editor via instance() will fully initialize the class.
   * This is based on the assumption that the Designer settings work with
   * no plugins loaded. If that does not work, full initialization can be
-  * triggered by connection to the ICore::settingsDialogRequested() signal.
+  * triggered by connection to the ICore::optionsDialogRequested() signal.
   */
 class FormEditorW : public QObject
 {
diff --git a/src/plugins/find/findtoolbar.cpp b/src/plugins/find/findtoolbar.cpp
index d11768499a93d4040d6169c0ed998c8a7d20b27f..edfb5015baaa1ac5a85e23471c71354264e66e0a 100644
--- a/src/plugins/find/findtoolbar.cpp
+++ b/src/plugins/find/findtoolbar.cpp
@@ -81,7 +81,7 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen
     addWidget(spacerItem);
     QToolButton *close = new QToolButton;
     close->setProperty("type", QLatin1String("dockbutton"));
-    close->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+    close->setIcon(QIcon(":/core/images/closebutton.png"));
     connect(close, SIGNAL(clicked()), this, SLOT(hideAndResetFocus()));
     addWidget(close);
 
diff --git a/src/plugins/git/commitdata.cpp b/src/plugins/git/commitdata.cpp
index 8b96fe23c973c5e8fb1dd2238adce22bce9b6f21..ada478e3743c283f1e681839a9adadd40e74c60f 100644
--- a/src/plugins/git/commitdata.cpp
+++ b/src/plugins/git/commitdata.cpp
@@ -32,8 +32,12 @@
 ***************************************************************************/
 
 #include "commitdata.h"
+#include <utils/qtcassert.h>
 
 #include <QtCore/QDebug>
+#include <QtCore/QRegExp>
+
+const char *const kBranchIndicatorC = "# On branch";
 
 namespace Git {
 namespace Internal {
@@ -85,6 +89,130 @@ void CommitData::clear()
     untrackedFiles.clear();
 }
 
+// Split a state/file spec from git status output
+// '#<tab>modified:<blanks>git .pro'
+// into state and file ('modified', 'git .pro').
+CommitData::StateFilePair splitStateFileSpecification(const QString &line)
+{
+    QPair<QString, QString> rc;
+    const int statePos = 2;
+    const int colonIndex = line.indexOf(QLatin1Char(':'), statePos);
+    if (colonIndex == -1)
+        return rc;
+    rc.first = line.mid(statePos, colonIndex - statePos);
+    int filePos = colonIndex + 1;
+    const QChar blank = QLatin1Char(' ');
+    while (line.at(filePos) == blank)
+        filePos++;
+    if (filePos < line.size())
+        rc.second = line.mid(filePos, line.size() - filePos);
+    return rc;
+}
+
+// Convenience to add a state/file spec to a list
+static inline bool addStateFileSpecification(const QString &line, QList<CommitData::StateFilePair> *list)
+{
+    const CommitData::StateFilePair sf = splitStateFileSpecification(line);
+    if (sf.first.isEmpty() || sf.second.isEmpty())
+        return false;
+    list->push_back(sf);
+    return true;
+}
+
+/* Parse a git status file list:
+ * \code
+    # Changes to be committed:
+    #<tab>modified:<blanks>git.pro
+    # Changed but not updated:
+    #<tab>modified:<blanks>git.pro
+    # Untracked files:
+    #<tab>git.pro
+    \endcode
+*/
+
+bool CommitData::parseFilesFromStatus(const QString &output)
+{
+    enum State { None, CommitFiles, NotUpdatedFiles, UntrackedFiles };
+
+    const QStringList lines = output.split(QLatin1Char('\n'));
+    const QString branchIndicator = QLatin1String(kBranchIndicatorC);
+    const QString commitIndicator = QLatin1String("# Changes to be committed:");
+    const QString notUpdatedIndicator = QLatin1String("# Changed but not updated:");
+    const QString untrackedIndicator = QLatin1String("# Untracked files:");
+
+    State s = None;
+    // Match added/changed-not-updated files: "#<tab>modified: foo.cpp"
+    QRegExp filesPattern(QLatin1String("#\\t[^:]+:\\s+.+"));
+    QTC_ASSERT(filesPattern.isValid(), return false);
+
+    const QStringList::const_iterator cend = lines.constEnd();
+    for (QStringList::const_iterator it =  lines.constBegin(); it != cend; ++it) {
+        const QString line = *it;
+        if (line.startsWith(branchIndicator)) {
+            panelInfo.branch = line.mid(branchIndicator.size() + 1);
+        } else {
+            if (line.startsWith(commitIndicator)) {
+                s = CommitFiles;
+            } else {
+                if (line.startsWith(notUpdatedIndicator)) {
+                    s = NotUpdatedFiles;
+                } else {
+                    if (line.startsWith(untrackedIndicator)) {
+                        // Now match untracked: "#<tab>foo.cpp"
+                        s = UntrackedFiles;
+                        filesPattern = QRegExp(QLatin1String("#\\t.+"));
+                        QTC_ASSERT(filesPattern.isValid(), return false);
+                    } else {
+                        if (filesPattern.exactMatch(line)) {
+                            switch (s) {
+                            case CommitFiles:
+                                addStateFileSpecification(line, &stagedFiles);
+                            break;
+                            case NotUpdatedFiles:
+                                addStateFileSpecification(line, &unstagedFiles);
+                                break;
+                            case UntrackedFiles:
+                                untrackedFiles.push_back(line.mid(2).trimmed());
+                                break;
+                            case None:
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return !stagedFiles.empty() || !unstagedFiles.empty() || !untrackedFiles.empty();
+}
+
+// Convert a spec pair list to a list of file names, optionally
+// filter for a state
+static QStringList specToFileNames(const QList<CommitData::StateFilePair> &files,
+                                   const QString &stateFilter)
+{
+    typedef QList<CommitData::StateFilePair>::const_iterator ConstIterator;
+    if (files.empty())
+        return QStringList();
+    const bool emptyFilter = stateFilter.isEmpty();
+    QStringList rc;
+    const ConstIterator cend = files.constEnd();
+    for (ConstIterator it = files.constBegin(); it != cend; ++it)
+        if (emptyFilter || stateFilter == it->first)
+            rc.push_back(it->second);
+    return rc;
+}
+
+QStringList CommitData::stagedFileNames(const QString &stateFilter) const
+{
+    return specToFileNames(stagedFiles, stateFilter);
+}
+
+QStringList CommitData::unstagedFileNames(const QString &stateFilter) const
+{
+    return specToFileNames(unstagedFiles, stateFilter);
+}
+
 QDebug operator<<(QDebug d, const CommitData &data)
 {
     d <<  data.panelInfo << data.panelData;
diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h
index a1dc05ef42540be2b3ce927978efc69c41a1a720..6cb5ddb42b9ca4f46996f7f1b3788bc4360867c1 100644
--- a/src/plugins/git/commitdata.h
+++ b/src/plugins/git/commitdata.h
@@ -35,6 +35,7 @@
 #define COMMITDATA_H
 
 #include <QtCore/QStringList>
+#include <QtCore/QPair>
 
 QT_BEGIN_NAMESPACE
 class QDebug;
@@ -68,11 +69,24 @@ QDebug operator<<(QDebug d, const GitSubmitEditorPanelData &);
 
 struct CommitData
 {
+    // A pair of state string/file name ('modified', 'file.cpp').
+    typedef QPair<QString, QString> StateFilePair;
+
     void clear();
+    // Parse the files and the branch of panelInfo
+    // from a git status output
+    bool parseFilesFromStatus(const QString &output);
+
+    // Convenience to retrieve the file names from
+    // the specification list. Optionally filter for a certain state
+    QStringList stagedFileNames(const QString &stateFilter = QString()) const;
+    QStringList unstagedFileNames(const QString &stateFilter = QString()) const;
+
     GitSubmitEditorPanelInfo panelInfo;
     GitSubmitEditorPanelData panelData;
-    QStringList stagedFiles;
-    QStringList unstagedFiles;
+
+    QList<StateFilePair> stagedFiles;
+    QList<StateFilePair> unstagedFiles;
     QStringList untrackedFiles;
 };
 
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 281a9572a215079dae27ad6176349236f7039f73..d1ebda300b4bcfbe4329fc55bc4103d19f1fead3 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -622,73 +622,6 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
     return StatusChanged;
 }
 
-/* Parse a git status file list:
- * \code
-    # Changes to be committed:
-    #<tab>modified:<blanks>git.pro
-    # Changed but not updated:
-    #<tab>modified:<blanks>git.pro
-    # Untracked files:
-    #<tab>git.pro
-    \endcode
-*/
-static bool parseFiles(const QString &output, CommitData *d)
-{
-    enum State { None, CommitFiles, NotUpdatedFiles, UntrackedFiles };
-
-    const QStringList lines = output.split(QLatin1Char('\n'));
-    const QString branchIndicator = QLatin1String(kBranchIndicatorC);
-    const QString commitIndicator = QLatin1String("# Changes to be committed:");
-    const QString notUpdatedIndicator = QLatin1String("# Changed but not updated:");
-    const QString untrackedIndicator = QLatin1String("# Untracked files:");
-
-    State s = None;
-    // Match added/changed-not-updated files: "#<tab>modified: foo.cpp"
-    QRegExp filesPattern(QLatin1String("#\\t[^:]+:\\s+.+"));
-    QTC_ASSERT(filesPattern.isValid(), return false);
-
-    const QStringList::const_iterator cend = lines.constEnd();
-    for (QStringList::const_iterator it =  lines.constBegin(); it != cend; ++it) {
-        const QString line = *it;
-        if (line.startsWith(branchIndicator)) {
-            d->panelInfo.branch = line.mid(branchIndicator.size() + 1);
-        } else {
-            if (line.startsWith(commitIndicator)) {
-                s = CommitFiles;
-            } else {
-                if (line.startsWith(notUpdatedIndicator)) {
-                    s = NotUpdatedFiles;
-                } else {
-                    if (line.startsWith(untrackedIndicator)) {
-                        // Now match untracked: "#<tab>foo.cpp"
-                        s = UntrackedFiles;
-                        filesPattern = QRegExp(QLatin1String("#\\t.+"));
-                        QTC_ASSERT(filesPattern.isValid(), return false);
-                    } else {
-                        if (filesPattern.exactMatch(line)) {
-                            const QString fileSpec = line.mid(2).trimmed();
-                            switch (s) {
-                            case CommitFiles:
-                                d->stagedFiles.push_back(trimFileSpecification(fileSpec));
-                            break;
-                            case NotUpdatedFiles:
-                                d->unstagedFiles.push_back(trimFileSpecification(fileSpec));
-                                break;
-                            case UntrackedFiles:
-                                d->untrackedFiles.push_back(fileSpec);
-                                break;
-                            case None:
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-    return !d->stagedFiles.empty() || !d->unstagedFiles.empty() || !d->untrackedFiles.empty();
-}
-
 // Filter out untracked files that are not part of the project
 static void filterUntrackedFilesOfProject(const QString &repoDir, QStringList *l)
 {
@@ -771,20 +704,12 @@ bool GitClient::getCommitData(const QString &workingDirectory,
     //    #
     //    #       list of files...
 
-    if (!parseFiles(output, d)) {
+    if (!d->parseFilesFromStatus(output)) {
         *errorMessage = msgParseFilesFailed();
         return false;
     }
-    // Filter out untracked files that are not part of the project and,
-    // for symmetry, insert the prefix "untracked:" (as "added:" or ":modified"
-    // for staged files).
+    // Filter out untracked files that are not part of the project
     filterUntrackedFilesOfProject(repoDirectory, &d->untrackedFiles);
-    if (!d->untrackedFiles.empty()) {
-        const QString untrackedPrefix = QLatin1String("untracked: ");
-        const QStringList::iterator pend = d->untrackedFiles.end();
-        for (QStringList::iterator it = d->untrackedFiles.begin(); it != pend; ++it)
-            it->insert(0, untrackedPrefix);
-    }
 
     d->panelData.author = readConfigValue(workingDirectory, QLatin1String("user.name"));
     d->panelData.email = readConfigValue(workingDirectory, QLatin1String("user.email"));
@@ -881,7 +806,7 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
         return RevertFailed;
     }
     CommitData data;
-    if (!parseFiles(output, &data)) {
+    if (!data.parseFilesFromStatus(output)) {
         *errorMessage = msgParseFilesFailed();
         return RevertFailed;
     }
@@ -896,9 +821,9 @@ GitClient::RevertResult GitClient::revertI(QStringList files, bool *ptrToIsDirec
     }
 
     // From the status output, determine all modified [un]staged files.
-    const QString modifiedPattern = QLatin1String("modified: ");
-    const QStringList allStagedFiles = GitSubmitEditor::statusListToFileList(data.stagedFiles.filter(modifiedPattern));
-    const QStringList allUnstagedFiles = GitSubmitEditor::statusListToFileList(data.unstagedFiles.filter(modifiedPattern));
+    const QString modifiedState = QLatin1String("modified");
+    const QStringList allStagedFiles = data.stagedFileNames(modifiedState);
+    const QStringList allUnstagedFiles = data.unstagedFileNames(modifiedState);
     // Unless a directory was passed, filter all modified files for the
     // argument file list.
     QStringList stagedFiles = allStagedFiles;
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index fe2d93adbff2415f7a56cbf435c44e065d114ebf..2ef08083393531aca4164993246fa6b0356dedcd 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -602,7 +602,7 @@ void GitPlugin::startCommit()
     // Store repository for diff and the original list of
     // files to be able to unstage files the user unchecks
     m_submitRepository = data.panelInfo.repository;
-    m_submitOrigCommitFiles = GitSubmitEditor::statusListToFileList(data.stagedFiles);
+    m_submitOrigCommitFiles = data.stagedFileNames();
 
     if (Git::Constants::debug)
         qDebug() << Q_FUNC_INFO << data << commitTemplate;
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp
index fe93a0c6ad14510f7e4a66565bc4eb7ece89d8d6..d34a78240d21301e168a6f1249fbf48ded86db1a 100644
--- a/src/plugins/git/gitsubmiteditor.cpp
+++ b/src/plugins/git/gitsubmiteditor.cpp
@@ -36,6 +36,8 @@
 #include "gitconstants.h"
 #include "commitdata.h"
 
+#include <vcsbase/submitfilemodel.h>
+
 #include <QtCore/QDebug>
 
 namespace Git {
@@ -52,14 +54,14 @@ GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget()
     return static_cast<GitSubmitEditorWidget *>(widget());
 }
 
-QStringList GitSubmitEditor::statusListToFileList(const QStringList &rawList)
+static void addStateFileListToModel(const QList<CommitData::StateFilePair> &l,
+                                    VCSBase::SubmitFileModel *model,
+                                    bool checked)
 {
-    if (rawList.empty())
-        return rawList;
-    QStringList rc;
-    foreach (const QString &rf, rawList)
-        rc.push_back(fileFromStatusLine(rf));
-    return rc;
+    typedef QList<CommitData::StateFilePair>::const_iterator ConstIterator;
+    const ConstIterator cend = l.constEnd();
+    for (ConstIterator it = l.constBegin(); it != cend; ++it)
+        model->addFile(it->second, it->first, checked);
 }
 
 void GitSubmitEditor::setCommitData(const CommitData &d)
@@ -67,10 +69,16 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
     submitEditorWidget()->setPanelData(d.panelData);
     submitEditorWidget()->setPanelInfo(d.panelInfo);
 
-    addFiles(d.stagedFiles, true, true);
-    // Not Updated: Initially unchecked
-    addFiles(d.unstagedFiles, false, true);
-    addFiles(d.untrackedFiles, false, true);
+    VCSBase::SubmitFileModel *model = new VCSBase::SubmitFileModel(this);
+    addStateFileListToModel(d.stagedFiles, model, true);
+    addStateFileListToModel(d.unstagedFiles, model, false);
+    if (!d.untrackedFiles.empty()) {
+        const QString untrackedSpec = QLatin1String("untracked");
+        const QStringList::const_iterator cend = d.untrackedFiles.constEnd();
+        for (QStringList::const_iterator it = d.untrackedFiles.constBegin(); it != cend; ++it)
+            model->addFile(*it, untrackedSpec, false);
+    }
+    setFileModel(model);
 }
 
 GitSubmitEditorPanelData GitSubmitEditor::panelData() const
@@ -78,18 +86,5 @@ GitSubmitEditorPanelData GitSubmitEditor::panelData() const
     return const_cast<GitSubmitEditor*>(this)->submitEditorWidget()->panelData();
 }
 
-QString GitSubmitEditor::fileFromStatusLine(const QString &line)
-{
-    QString rc = line;
-    // "modified:   mainwindow.cpp"
-    const int index = rc.indexOf(QLatin1Char(':'));
-    if (index != -1)
-        rc.remove(0, index + 1);
-    const QChar blank(' ');
-    while (rc.startsWith(blank))
-        rc.remove(0, 1);
-    return rc;
-}
-
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/gitsubmiteditor.h b/src/plugins/git/gitsubmiteditor.h
index 8199384d07f7a75ac1e483a53ae0b975512296a3..a1a80ac22cf11be556f6dfe39fb27a602c79e91f 100644
--- a/src/plugins/git/gitsubmiteditor.h
+++ b/src/plugins/git/gitsubmiteditor.h
@@ -54,13 +54,6 @@ public:
     void setCommitData(const CommitData &);
     GitSubmitEditorPanelData panelData() const;
 
-    static QString fileFromStatusLine(const QString &line);
-    static QStringList statusListToFileList(const QStringList &);
-
-protected:
-    virtual QStringList vcsFileListToFileList(const QStringList &l) const
-    { return statusListToFileList(l); }
-
 private:
     inline GitSubmitEditorWidget *submitEditorWidget();
 };
diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp
index 5ecb375240dcc4057b06f75f55ddbb7c327ea288..3ed3263478d36ec732d984170715cf3d84c688f7 100644
--- a/src/plugins/help/helpplugin.cpp
+++ b/src/plugins/help/helpplugin.cpp
@@ -355,7 +355,7 @@ void HelpPlugin::createRightPaneSideBar()
 
     QToolButton *closeButton = new QToolButton();
     closeButton->setProperty("type", QLatin1String("dockbutton"));
-    closeButton->setIcon(QIcon(":/qworkbench/images/closebutton.png"));
+    closeButton->setIcon(QIcon(":/core/images/closebutton.png"));
 
     // Dummy layout to align the close button to the right
     QHBoxLayout *hboxLayout = new QHBoxLayout();
diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp
index 0ad0224d1ca191b911ab9d2ed5fedd3a55ad8874..aa4b0a4fa4841f82e734a245067294ef6dde6d69 100644
--- a/src/plugins/perforce/perforceplugin.cpp
+++ b/src/plugins/perforce/perforceplugin.cpp
@@ -494,19 +494,19 @@ void PerforcePlugin::submit()
     QTC_ASSERT(m_coreInstance, return);
 
     if (!checkP4Command()) {
-        showOutput(tr("No p4 executable specified!"));
+        showOutput(tr("No p4 executable specified!"), true);
         return;
     }
 
     if (m_changeTmpFile) {
-        showOutput(tr("Another submit is currently executed."));
+        showOutput(tr("Another submit is currently executed."), true);
         m_perforceOutputWindow->popup(false);
         return;
     }
 
     m_changeTmpFile = new QTemporaryFile(this);
     if (!m_changeTmpFile->open()) {
-        showOutput(tr("Cannot create temporary file."));
+        showOutput(tr("Cannot create temporary file."), true);
         delete m_changeTmpFile;
         m_changeTmpFile = 0;
         return;
@@ -970,7 +970,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
             QByteArray change = m_changeTmpFile->readAll();
             m_changeTmpFile->close();
             if (!checkP4Command()) {
-                showOutput(tr("No p4 executable specified!"));
+                showOutput(tr("No p4 executable specified!"), true);
                 delete m_changeTmpFile;
                 m_changeTmpFile = 0;
                 return false;
@@ -981,8 +981,8 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
             QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
             proc.start(m_settings.p4Command,
                 basicP4Args() << QLatin1String("submit") << QLatin1String("-i"));
-            if (!proc.waitForStarted(3000)) {
-                showOutput(tr("Cannot execute p4 submit."));
+            if (!proc.waitForStarted(p4Timeout)) {
+                showOutput(tr("Cannot execute p4 submit."), true);
                 QApplication::restoreOverrideCursor();
                 delete m_changeTmpFile;
                 m_changeTmpFile = 0;
@@ -992,7 +992,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
             proc.closeWriteChannel();
 
             if (!proc.waitForFinished()) {
-                showOutput(tr("Cannot execute p4 submit."));
+                showOutput(tr("Cannot execute p4 submit."), true);
                 QApplication::restoreOverrideCursor();
                 delete m_changeTmpFile;
                 m_changeTmpFile = 0;
@@ -1000,7 +1000,7 @@ bool PerforcePlugin::editorAboutToClose(Core::IEditor *editor)
             }
             QString output = QString::fromUtf8(proc.readAll());
             showOutput(output);
-            if (output.contains("Out of date files must be resolved or reverted")) {
+            if (output.contains("Out of date files must be resolved or reverted"), true) {
                 QMessageBox::warning(editor->widget(), "Pending change", "Could not submit the change, because your workspace was out of date. Created a pending submit instead.");
             }
             QApplication::restoreOverrideCursor();
diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp
index 6aa74f95fb236468ee1123f94f1d9d6f4733e14c..826f22757187f0bbb7b79423c50e5b267af4d9bd 100644
--- a/src/plugins/perforce/perforcesubmiteditor.cpp
+++ b/src/plugins/perforce/perforcesubmiteditor.cpp
@@ -36,6 +36,7 @@
 #include "perforceplugin.h"
 #include "perforceconstants.h"
 
+#include <vcsbase/submitfilemodel.h>
 #include <utils/qtcassert.h>
 
 #include <QtCore/QDebug>
@@ -43,10 +44,14 @@
 namespace Perforce {
 namespace Internal {
 
+enum { FileSpecRole = Qt::UserRole + 1 };
+
 PerforceSubmitEditor::PerforceSubmitEditor(const VCSBase::VCSBaseSubmitEditorParameters *parameters, QWidget *parent) :
-    VCSBaseSubmitEditor(parameters, new PerforceSubmitEditorWidget(parent))
+    VCSBaseSubmitEditor(parameters, new PerforceSubmitEditorWidget(parent)),
+    m_fileModel(new VCSBase::SubmitFileModel(this))
 {
     setDisplayName(tr("Perforce Submit"));
+    setFileModel(m_fileModel);
 }
 
 PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget()
@@ -54,14 +59,6 @@ PerforceSubmitEditorWidget *PerforceSubmitEditor::submitEditorWidget()
     return static_cast<PerforceSubmitEditorWidget *>(widget());
 }
 
-QStringList PerforceSubmitEditor::vcsFileListToFileList(const QStringList &rawList) const
-{
-    QStringList rc;
-    foreach (const QString &rf, rawList)
-        rc.push_back(fileFromChangeLine(rf));
-    return rc;
-}
-
 QString PerforceSubmitEditor::fileContents() const
 {
     const_cast<PerforceSubmitEditor*>(this)->updateEntries();
@@ -121,25 +118,7 @@ bool PerforceSubmitEditor::parseText(QString text)
 
 void PerforceSubmitEditor::restrictToProjectFiles(const QStringList &knownProjectFiles)
 {
-    QStringList allFiles = submitEditorWidget()->fileList();
-    const int oldSize = allFiles.size();
-    for (int i = oldSize - 1; i >= 0; i--)
-        if (!knownProjectFiles.contains(fileFromChangeLine(allFiles.at(i))))
-            allFiles.removeAt(i);
-    if (allFiles.size() != oldSize)
-        submitEditorWidget()->setFileList(allFiles);
-    if (Perforce::Constants::debug)
-        qDebug() << Q_FUNC_INFO << oldSize << "->" << allFiles.size();
-}
-
-QString PerforceSubmitEditor::fileFromChangeLine(const QString &line)
-{
-    QString rc = line;
-    // " foo.cpp#add"
-    const int index = rc.lastIndexOf(QLatin1Char('#'));
-    if (index != -1)
-        rc.truncate(index);
-    return rc.trimmed();
+    m_fileModel->filter(knownProjectFiles, fileNameColumn());
 }
 
 void PerforceSubmitEditor::updateFields()
@@ -161,12 +140,15 @@ void PerforceSubmitEditor::updateFields()
     widget->setDescriptionText(lines.join(newLine));
 
     lines = m_entries.value(QLatin1String("Files")).split(newLine);
-    lines.replaceInStrings(leadingTabPattern, QString());
-    QStringList fileList;
-    foreach (const QString &line, lines)
-        if (!line.isEmpty())
-            fileList.push_back(line);
-    widget->setFileList(fileList);
+    // split up "file#add" and store complete spec line as user data
+    foreach (const QString &specLine, lines) {
+        const QStringList list = specLine.split(QLatin1Char('#'));
+        if (list.size() == 2) {
+            const QString file = list.at(0).trimmed();
+            const QString state = list.at(1).trimmed();
+            m_fileModel->addFile(file, state).at(0)->setData(specLine, FileSpecRole);
+        }
+    }
 }
 
 void PerforceSubmitEditor::updateEntries()
@@ -181,13 +163,14 @@ void PerforceSubmitEditor::updateEntries()
     lines.replaceInStrings(QRegExp(QLatin1String("^")), tab);
     m_entries.insert(QLatin1String("Description"), newLine + lines.join(newLine) + QLatin1String("\n\n"));
     QString files = newLine;
-    // Files
-    const QStringList fileList = submitEditorWidget()->fileList();
-    const int count = fileList.size();
-    for (int i = 0; i < count; i++) {
-        files += tab;
-        files += fileList.at(i);
-        files += newLine;
+    // Re-build the file spec '<tab>file#add' from the user data
+    const int count = m_fileModel->rowCount();
+    for (int r = 0; r < count; r++) {
+        const QStandardItem *item = m_fileModel->item(r, 0);
+        if (item->checkState() == Qt::Checked) {
+            files += item->data(FileSpecRole).toString();
+            files += newLine;
+        }
     }
     files += newLine;
     m_entries.insert(QLatin1String("Files"), files);
diff --git a/src/plugins/perforce/perforcesubmiteditor.h b/src/plugins/perforce/perforcesubmiteditor.h
index 0f44332a694f466fe22485af057f9d0ca6066201..5dba068315855806a051f05044cbadeb21ea4965 100644
--- a/src/plugins/perforce/perforcesubmiteditor.h
+++ b/src/plugins/perforce/perforcesubmiteditor.h
@@ -39,6 +39,10 @@
 #include <QtCore/QStringList>
 #include <QtCore/QMap>
 
+namespace VCSBase {
+    class SubmitFileModel;
+}
+
 namespace Perforce {
 namespace Internal {
 
@@ -66,7 +70,6 @@ public:
     static QString fileFromChangeLine(const QString &line);
 
 protected:
-    virtual QStringList vcsFileListToFileList(const QStringList &) const;
     virtual QString fileContents() const;
     virtual bool setFileContents(const QString &contents);
 
@@ -77,6 +80,7 @@ private:
     void updateEntries();
 
     QMap<QString, QString> m_entries;
+    VCSBase::SubmitFileModel *m_fileModel;
 };
 
 } // namespace Internal
diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
index 8a42ec127369992f3cfb73d8a12056a5139b5e38..b642a4e3867a399bb08771beabf2c112d0136673 100644
--- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp
@@ -36,6 +36,7 @@
 #include "buildstepspage.h"
 #include "project.h"
 
+#include <coreplugin/coreconstants.h>
 #include <extensionsystem/pluginmanager.h>
 
 #include <QtCore/QDebug>
@@ -102,9 +103,9 @@ BuildSettingsWidget::BuildSettingsWidget(Project *project)
     m_ui.splitter->setStretchFactor(1,10);
     m_ui.buildSettingsList->setContextMenuPolicy(Qt::CustomContextMenu);
 
-    m_ui.addButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
+    m_ui.addButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
     m_ui.addButton->setText("");
-    m_ui.removeButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
+    m_ui.removeButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
     m_ui.removeButton->setText("");
 
     QMenu *addButtonMenu = new QMenu(this);
diff --git a/src/plugins/projectexplorer/buildstepspage.cpp b/src/plugins/projectexplorer/buildstepspage.cpp
index 88536a09e09637757b5944e1773bcda604ca1317..735770877b0724465997ed14636f1e0848ec06b3 100644
--- a/src/plugins/projectexplorer/buildstepspage.cpp
+++ b/src/plugins/projectexplorer/buildstepspage.cpp
@@ -36,6 +36,7 @@
 #include "ui_buildstepspage.h"
 #include "project.h"
 
+#include <coreplugin/coreconstants.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 
@@ -50,8 +51,8 @@ BuildStepsPage::BuildStepsPage(Project *project) :
     m_ui->setupUi(this);
 
     m_ui->buildStepAddButton->setMenu(new QMenu(this));
-    m_ui->buildStepAddButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
-    m_ui->buildStepRemoveToolButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
+    m_ui->buildStepAddButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
+    m_ui->buildStepRemoveToolButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
     m_ui->buildStepUpToolButton->setArrowType(Qt::UpArrow);
     m_ui->buildStepDownToolButton->setArrowType(Qt::DownArrow);
 
diff --git a/src/plugins/projectexplorer/dependenciesdialog.ui b/src/plugins/projectexplorer/dependenciesdialog.ui
index 25ffdff8948945887be20f830adc15f99735f604..31a70dae9832c5d27b5eac73cbfe44665201aac8 100644
--- a/src/plugins/projectexplorer/dependenciesdialog.ui
+++ b/src/plugins/projectexplorer/dependenciesdialog.ui
@@ -1,59 +1,45 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>ProjectExplorer::Internal::DependenciesDialog</class>
- <widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog" >
-  <property name="geometry" >
+ <widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>618</width>
-    <height>660</height>
+    <width>492</width>
+    <height>435</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Project Dependencies</string>
   </property>
-  <layout class="QVBoxLayout" >
-   <property name="spacing" >
+  <layout class="QVBoxLayout">
+   <property name="spacing">
     <number>6</number>
    </property>
-   <property name="leftMargin" >
-    <number>9</number>
-   </property>
-   <property name="topMargin" >
-    <number>9</number>
-   </property>
-   <property name="rightMargin" >
-    <number>9</number>
-   </property>
-   <property name="bottomMargin" >
+   <property name="margin">
     <number>9</number>
    </property>
    <item>
-    <widget class="QTableView" name="dependencyTable" >
-     <property name="minimumSize" >
-      <size>
-       <width>600</width>
-       <height>600</height>
-      </size>
-     </property>
-     <property name="selectionMode" >
+    <widget class="QTableView" name="dependencyTable">
+     <property name="selectionMode">
       <enum>QAbstractItemView::SingleSelection</enum>
      </property>
     </widget>
    </item>
    <item>
-    <widget class="Line" name="line" >
-     <property name="orientation" >
+    <widget class="Line" name="line">
+     <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
     </widget>
    </item>
    <item>
-    <widget class="QDialogButtonBox" name="buttonBox" >
-     <property name="orientation" >
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
-     <property name="standardButtons" >
+     <property name="standardButtons">
       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
      </property>
     </widget>
@@ -68,11 +54,11 @@
    <receiver>ProjectExplorer::Internal::DependenciesDialog</receiver>
    <slot>accept()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>142</x>
      <y>285</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>142</x>
      <y>155</y>
     </hint>
@@ -84,11 +70,11 @@
    <receiver>ProjectExplorer::Internal::DependenciesDialog</receiver>
    <slot>reject()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>142</x>
      <y>285</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>142</x>
      <y>155</y>
     </hint>
diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp
index 75a92945dd6b799cda560c281ba272e05b3d032c..4fcca61516356f509ea9053559e671686207f2ff 100644
--- a/src/plugins/projectexplorer/foldernavigationwidget.cpp
+++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp
@@ -209,7 +209,7 @@ Core::NavigationView FolderNavigationWidgetFactory::createWidget()
     n.widget = ptw;
     QToolButton *toggleSync = new QToolButton;
     toggleSync->setProperty("type", "dockbutton");
-    toggleSync->setIcon(QIcon(":/qworkbench/images/linkicon.png"));
+    toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
     toggleSync->setCheckable(true);
     toggleSync->setChecked(ptw->autoSynchronization());
     toggleSync->setToolTip(tr("Synchronize with Editor"));
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index e4721457af47fb2845ee3b75fa049c2e372f0539..3548023d641f3448fc44af02d09830892714a224 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -484,6 +484,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
     mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
     msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);
 
+    // dependencies action
+    m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this);
+    cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, globalcontext);
+    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
 
     // build action
     m_buildAction = new QAction(tr("Build Project"), this);
@@ -555,11 +559,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
     mdebug->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
     modeManager->addAction(cmd, Constants::P_ACTION_DEBUG, m_runConfigurationMenu);
 
-    // dependencies action
-    m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this);
-    cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, pecontext);
-    msessionContextMenu->addAction(cmd, Constants::G_SESSION_CONFIG);
-
     // add new file action
     m_addNewFileAction = new QAction(tr("Add New..."), this);
     cmd = am->registerAction(m_addNewFileAction, ProjectExplorer::Constants::ADDNEWFILE,
diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp
index 49d8ff3070e6d6b7c3e80f67b92e4d95ff5a2507..39b7214d2142cb8a0f1b789c5ada5476ec36b184 100644
--- a/src/plugins/projectexplorer/projecttreewidget.cpp
+++ b/src/plugins/projectexplorer/projecttreewidget.cpp
@@ -159,7 +159,7 @@ ProjectTreeWidget::ProjectTreeWidget(Core::ICore *core, QWidget *parent)
 
     m_toggleSync = new QToolButton;
     m_toggleSync->setProperty("type", "dockbutton");
-    m_toggleSync->setIcon(QIcon(":/qworkbench/images/linkicon.png"));
+    m_toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
     m_toggleSync->setCheckable(true);
     m_toggleSync->setChecked(autoSynchronization());
     m_toggleSync->setToolTip(tr("Synchronize with Editor"));
diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp
index afaa8b04cceb00bb5dfcd92ed4b1393a5a254c15..2f309814dd79bab29327154db1f68681e5bd7a8c 100644
--- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp
+++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp
@@ -36,6 +36,7 @@
 
 #include "ui_runsettingspropertiespage.h"
 
+#include <coreplugin/coreconstants.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 
@@ -180,9 +181,9 @@ RunSettingsWidget::RunSettingsWidget(Project *project)
     m_ui = new Ui::RunSettingsPropertiesPage;
     m_ui->setupUi(this);
     m_addMenu = new QMenu(m_ui->addToolButton);
-    m_ui->addToolButton->setIcon(QIcon(":/qworkbench/images/plus.png"));
+    m_ui->addToolButton->setIcon(QIcon(Core::Constants::ICON_PLUS));
     m_ui->addToolButton->setMenu(m_addMenu);
-    m_ui->removeToolButton->setIcon(QIcon(":/qworkbench/images/minus.png"));
+    m_ui->removeToolButton->setIcon(QIcon(Core::Constants::ICON_MINUS));
     m_ui->runConfigurationCombo->setModel(m_runConfigurationsModel);
 
     connect(m_addMenu, SIGNAL(aboutToShow()),
diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp
index 5f5200aab34528a3ae0a20cb0a62ce5447dadc0f..36182eb94a0474badab795228e9e90c717a3c6be 100644
--- a/src/plugins/subversion/subversionplugin.cpp
+++ b/src/plugins/subversion/subversionplugin.cpp
@@ -139,6 +139,29 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
     return 0;
 }
 
+// Parse "svn status" output for added/modified/deleted files
+// "M<7blanks>file"
+typedef QList<SubversionSubmitEditor::StatusFilePair> StatusList;
+
+StatusList parseStatusOutput(const QString &output)
+{
+    StatusList changeSet;
+    const QString newLine = QString(QLatin1Char('\n'));
+    const QStringList list = output.split(newLine, QString::SkipEmptyParts);
+    foreach (const QString &l, list) {
+        const QString line =l.trimmed();
+        if (line.size() > 8) {
+            const QChar state = line.at(0);
+            if (state == QLatin1Char('A') || state == QLatin1Char('D') || state == QLatin1Char('M')) {
+                const QString fileName = line.mid(7);
+                changeSet.push_back(SubversionSubmitEditor::StatusFilePair(QString(state), fileName));
+            }
+
+        }
+    }
+    return changeSet;
+}
+
 // ------------- SubversionPlugin
 Core::ICore *SubversionPlugin::m_coreInstance = 0;
 SubversionPlugin *SubversionPlugin::m_subversionPluginInstance = 0;
@@ -694,7 +717,7 @@ void SubversionPlugin::startCommit(const QStringList &files)
     if (response.error)
         return;
     // Get list of added/modified/deleted files
-    const QStringList statusOutput = parseStatusOutput(response.stdOut);
+    const StatusList statusOutput = parseStatusOutput(response.stdOut);
     if (statusOutput.empty()) {
         showOutput(tr("There are no modified files."), true);
         return;
@@ -717,22 +740,7 @@ void SubversionPlugin::startCommit(const QStringList &files)
     m_changeTmpFile->seek(0);
     // Create a submit editor and set file list
     SubversionSubmitEditor *editor = openSubversionSubmitEditor(m_changeTmpFile->fileName());
-    editor->setFileList(statusOutput);
-}
-
-// Parse "status" output for added/modified/deleted files
-QStringList SubversionPlugin::parseStatusOutput(const QString &output) const
-{
-    QStringList changeSet;
-    const QString newLine = QString(QLatin1Char('\n'));
-    const QStringList list = output.split(newLine, QString::SkipEmptyParts);
-    foreach (const QString &l, list) {
-        QString line(l.trimmed());
-        if (line.startsWith(QLatin1Char('A')) || line.startsWith(QLatin1Char('D'))
-            || line.startsWith(QLatin1Char('M')))
-            changeSet.append(line);
-    }
-    return changeSet;
+    editor->setStatusList(statusOutput);
 }
 
 bool SubversionPlugin::commit(const QString &messageFile,
diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h
index 6c2c448241ea3de3323901cb9e5d624cf30cf18b..7909b3f2328ead25b6b84a8438efd3617eb57acc 100644
--- a/src/plugins/subversion/subversionplugin.h
+++ b/src/plugins/subversion/subversionplugin.h
@@ -133,7 +133,6 @@ private:
     SubversionResponse runSvn(const QStringList &arguments, int timeOut,
                               bool showStdOutInOutputWindow, QTextCodec *outputCodec = 0);
     void showOutput(const QString &output, bool bringToForeground = true);
-    QStringList parseStatusOutput(const QString &output) const;
     void annotate(const QString &file);
     void filelog(const QString &file);
     bool managesDirectory(const QDir &directory) const;
diff --git a/src/plugins/subversion/subversionsubmiteditor.cpp b/src/plugins/subversion/subversionsubmiteditor.cpp
index b1e97e676e46dcecd1948231557d9e4d8ff94df6..c65a2530dd72039a3bbbcecc2f2603e8476e7c0a 100644
--- a/src/plugins/subversion/subversionsubmiteditor.cpp
+++ b/src/plugins/subversion/subversionsubmiteditor.cpp
@@ -35,6 +35,7 @@
 #include "subversionsubmiteditor.h"
 
 #include <utils/submiteditorwidget.h>
+#include <vcsbase/submitfilemodel.h>
 
 using namespace Subversion::Internal;
 
@@ -45,6 +46,19 @@ SubversionSubmitEditor::SubversionSubmitEditor(const VCSBase::VCSBaseSubmitEdito
     setDisplayName(tr("Subversion Submit"));
 }
 
+void SubversionSubmitEditor::setStatusList(const QList<StatusFilePair> &statusOutput)
+{
+    typedef QList<StatusFilePair>::const_iterator ConstIterator;
+    VCSBase::SubmitFileModel *model = new VCSBase::SubmitFileModel(this);
+
+    const ConstIterator cend = statusOutput.constEnd();
+    for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it)
+        model->addFile(it->second, it->first, true);
+    setFileModel(model);
+
+}
+
+/*
 QStringList SubversionSubmitEditor::vcsFileListToFileList(const QStringList &rl) const
 {
     QStringList files;
@@ -59,3 +73,5 @@ QString SubversionSubmitEditor::fileFromStatusLine(const QString &statusLine)
     enum { filePos = 7 };
     return statusLine.mid(filePos, statusLine.size() - filePos);
 }
+
+*/
diff --git a/src/plugins/subversion/subversionsubmiteditor.h b/src/plugins/subversion/subversionsubmiteditor.h
index c6bf0845ebce135ce2f67658b2e6423ef49888b1..6aae19c824e08d50ded6cd2f81f31055dd1abf76 100644
--- a/src/plugins/subversion/subversionsubmiteditor.h
+++ b/src/plugins/subversion/subversionsubmiteditor.h
@@ -34,6 +34,9 @@
 #ifndef SUBVERSIONSUBMITEDITOR_H
 #define SUBVERSIONSUBMITEDITOR_H
 
+#include <QtCore/QPair>
+#include <QtCore/QStringList>
+
 #include <vcsbase/vcsbasesubmiteditor.h>
 
 namespace Subversion {
@@ -48,8 +51,10 @@ public:
 
     static QString fileFromStatusLine(const QString &statusLine);
 
-private:
-    virtual QStringList vcsFileListToFileList(const QStringList &) const;
+    // A list of ( 'A','M','D') status indicators and file names.
+    typedef QPair<QString, QString> StatusFilePair;
+
+    void setStatusList(const QList<StatusFilePair> &statusOutput);
 };
 
 } // namespace Internal
diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp
index 20d686a90be14561522583afbfcbd15f29c3d6d9..8ecabf2ce1f0f3bd5c7109e0fa838e6b15bf1733 100644
--- a/src/plugins/texteditor/texteditorsettings.cpp
+++ b/src/plugins/texteditor/texteditorsettings.cpp
@@ -86,10 +86,10 @@ TextEditorSettings::TextEditorSettings(Internal::TextEditorPlugin *plugin,
     formatDescriptions.push_back(FormatDescription(QLatin1String(C_DISABLED_CODE), tr("Disabled Code"), Qt::gray));
 
     // Diff categories
-    formatDescriptions.push_back(FormatDescription(QLatin1String(C_ADDED_LINE), tr("Added Line"),  Qt::blue));
+    formatDescriptions.push_back(FormatDescription(QLatin1String(C_ADDED_LINE), tr("Added Line"), QColor(0, 170, 0)));
     formatDescriptions.push_back(FormatDescription(QLatin1String(C_REMOVED_LINE), tr("Removed Line"), Qt::red));
-    formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_FILE), tr("Diff File"), Qt::black));
-    formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_LOCATION), tr("Diff Location"), Qt::green));
+    formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_FILE), tr("Diff File"), Qt::darkBlue));
+    formatDescriptions.push_back(FormatDescription(QLatin1String(C_DIFF_LOCATION), tr("Diff Location"), Qt::blue));
 
     m_fontSettingsPage = new FontSettingsPage(formatDescriptions,
                                               QLatin1String("TextEditor"),
diff --git a/src/plugins/vcsbase/submitfilemodel.cpp b/src/plugins/vcsbase/submitfilemodel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f12eab38d14bd0291346c346dfe88a08435eed79
--- /dev/null
+++ b/src/plugins/vcsbase/submitfilemodel.cpp
@@ -0,0 +1,78 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#include "submitfilemodel.h"
+#include "vcsbaseconstants.h"
+
+#include <QtGui/QStandardItem>
+#include <QtCore/QDebug>
+
+namespace VCSBase {
+
+SubmitFileModel::SubmitFileModel(QObject *parent) :
+    QStandardItemModel(0, 2, parent)
+{
+    // setColumnCount(2);
+    QStringList headerLabels;
+    headerLabels << tr("State") << tr("File");
+    setHorizontalHeaderLabels(headerLabels);
+}
+
+QList<QStandardItem *> SubmitFileModel::addFile(const QString &fileName, const QString &status, bool checked)
+{
+    if (VCSBase::Constants::Internal::debug)
+        qDebug() << Q_FUNC_INFO << fileName << status << checked;
+    QStandardItem *statusItem = new QStandardItem(status);
+    statusItem->setCheckable(true);
+    statusItem->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
+    QStandardItem *fileItem = new QStandardItem(fileName);
+    QList<QStandardItem *> row;
+    row << statusItem << fileItem;
+    appendRow(row);
+    return row;
+}
+
+unsigned SubmitFileModel::filter(const QStringList &filter, int column)
+{
+    unsigned rc = 0;
+    for (int r = rowCount() - 1; r >= 0; r--)
+        if (const QStandardItem *i = item(r, column))
+            if (!filter.contains(i->text())) {
+                qDeleteAll(takeRow(r));
+                rc++;
+            }
+    if (VCSBase::Constants::Internal::debug)
+        qDebug() << Q_FUNC_INFO << " deleted " << rc << " items using " << filter << " , remaining " << rowCount();
+    return rc;
+}
+}
diff --git a/src/plugins/vcsbase/submitfilemodel.h b/src/plugins/vcsbase/submitfilemodel.h
new file mode 100644
index 0000000000000000000000000000000000000000..fef89df83bef6b4e4d1d92d14566c822cfb69550
--- /dev/null
+++ b/src/plugins/vcsbase/submitfilemodel.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact:  Qt Software Information (qt-info@nokia.com)
+**
+**
+** Non-Open Source Usage
+**
+** Licensees may use this file in accordance with the Qt Beta Version
+** License Agreement, Agreement version 2.2 provided with the Software or,
+** alternatively, in accordance with the terms contained in a written
+** agreement between you and Nokia.
+**
+** GNU General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the packaging
+** of this file.  Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+**
+** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt GPL Exception
+** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
+**
+***************************************************************************/
+
+#ifndef SUBMITMODEL_H
+#define SUBMITMODEL_H
+
+#include "vcsbase_global.h"
+
+#include <QtGui/QStandardItemModel>
+
+namespace VCSBase {
+
+/* A 2-column (checkable, state, file name) model to be used to list the files-
+ * in the submit editor. Provides header items and a convience to add files. */
+
+class VCSBASE_EXPORT SubmitFileModel : public QStandardItemModel
+{
+    Q_OBJECT
+public:
+    explicit SubmitFileModel(QObject *parent = 0);
+
+    // Convenience to add a file plus status text.
+    QList<QStandardItem *> addFile(const QString &fileName, const QString &status = QString(), bool checked = true);
+
+    // Filter for entries contained in the filter list. Returns the
+    // number of deleted entries.
+    unsigned filter(const QStringList &filter, int column);
+};
+
+}
+
+#endif // SUBMITMODEL_H
diff --git a/src/plugins/vcsbase/vcsbase.pro b/src/plugins/vcsbase/vcsbase.pro
index 329e27b0686c4def2c150583c84468d00033a563..d34fe84e7c05476658180ae46779d68540842f5b 100644
--- a/src/plugins/vcsbase/vcsbase.pro
+++ b/src/plugins/vcsbase/vcsbase.pro
@@ -1,31 +1,28 @@
 TEMPLATE = lib
 TARGET = VCSBase
-
 DEFINES += VCSBASE_LIBRARY
-
 include(../../qworkbenchplugin.pri)
 include(vcsbase_dependencies.pri)
-
 HEADERS += vcsbase_global.h \
-vcsbaseconstants.h \
-vcsbaseplugin.h \
-baseannotationhighlighter.h \
-diffhighlighter.h \
-vcsbasetextdocument.h \
-vcsbaseeditor.h \
-vcsbasesubmiteditor.h \
-basevcseditorfactory.h \
-submiteditorfile.h \
-basevcssubmiteditorfactory.h
-
+    vcsbaseconstants.h \
+    vcsbaseplugin.h \
+    baseannotationhighlighter.h \
+    diffhighlighter.h \
+    vcsbasetextdocument.h \
+    vcsbaseeditor.h \
+    vcsbasesubmiteditor.h \
+    basevcseditorfactory.h \
+    submiteditorfile.h \
+    basevcssubmiteditorfactory.h \
+    submitfilemodel.h
 SOURCES += vcsbaseplugin.cpp \
-baseannotationhighlighter.cpp \
-diffhighlighter.cpp \
-vcsbasetextdocument.cpp \
-vcsbaseeditor.cpp \
-vcsbasesubmiteditor.cpp \
-basevcseditorfactory.cpp \
-submiteditorfile.cpp \
-basevcssubmiteditorfactory.cpp
-
-RESOURCES=vcsbase.qrc
+    baseannotationhighlighter.cpp \
+    diffhighlighter.cpp \
+    vcsbasetextdocument.cpp \
+    vcsbaseeditor.cpp \
+    vcsbasesubmiteditor.cpp \
+    basevcseditorfactory.cpp \
+    submiteditorfile.cpp \
+    basevcssubmiteditorfactory.cpp \
+    submitfilemodel.cpp
+RESOURCES = vcsbase.qrc
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
index 9d668f16a767735ca789f369e0315ff050cd432f..d130c2664596505fe65e1ccb4ed37956fa4ecca7 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp
@@ -129,6 +129,16 @@ VCSBaseSubmitEditor::~VCSBaseSubmitEditor()
     delete m_d;
 }
 
+int VCSBaseSubmitEditor::fileNameColumn() const
+{
+    return m_d->m_widget->fileNameColumn();
+}
+
+void VCSBaseSubmitEditor::setFileNameColumn(int c)
+{
+    m_d->m_widget->setFileNameColumn(c);
+}
+
 void VCSBaseSubmitEditor::slotDescriptionChanged()
 {
 }
@@ -246,22 +256,22 @@ bool VCSBaseSubmitEditor::restoreState(const QByteArray &/*state*/)
 
 QStringList VCSBaseSubmitEditor::checkedFiles() const
 {
-    return vcsFileListToFileList(m_d->m_widget->checkedFiles());
+    return m_d->m_widget->checkedFiles();
 }
 
-void VCSBaseSubmitEditor::setFileList(const QStringList &l)
+void VCSBaseSubmitEditor::setFileModel(QAbstractItemModel *m)
 {
-    m_d->m_widget->setFileList(l);
+    m_d->m_widget->setFileModel(m);
 }
 
-void VCSBaseSubmitEditor::addFiles(const QStringList& list, bool checked, bool userCheckable)
+QAbstractItemModel *VCSBaseSubmitEditor::fileModel() const
 {
-     m_d->m_widget->addFiles(list, checked, userCheckable);
+    return m_d->m_widget->fileModel();
 }
 
 void VCSBaseSubmitEditor::slotDiffSelectedVCSFiles(const QStringList &rawList)
 {
-     emit diffSelectedFiles(vcsFileListToFileList(rawList));
+     emit diffSelectedFiles(rawList);
 }
 
 bool VCSBaseSubmitEditor::save(const QString &fileName)
diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h
index 72553672411b003cdd3c0012e7b5df2157edd443..91b10d488f99b0e8754a2699267cda3178c1abcc 100644
--- a/src/plugins/vcsbase/vcsbasesubmiteditor.h
+++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h
@@ -42,6 +42,7 @@
 
 QT_BEGIN_NAMESPACE
 class QIcon;
+class QAbstractItemModel;
 QT_END_NAMESPACE
 
 namespace Core {
@@ -90,6 +91,7 @@ struct VCSBASE_EXPORT VCSBaseSubmitEditorParameters {
 class VCSBASE_EXPORT VCSBaseSubmitEditor : public Core::IEditor
 {
     Q_OBJECT
+    Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false)
 public:
     typedef QList<int> Context;
 
@@ -100,6 +102,9 @@ protected:
 public:
     virtual ~VCSBaseSubmitEditor();
 
+    int fileNameColumn() const;
+    void setFileNameColumn(int c);
+
     // Core::IEditor
     virtual bool createNew(const QString &contents);
     virtual bool open(const QString &fileName);
@@ -119,8 +124,8 @@ public:
 
     QStringList checkedFiles() const;
 
-    void setFileList(const QStringList&);
-    void addFiles(const QStringList&, bool checked = true, bool userCheckable = true);
+    void setFileModel(QAbstractItemModel *m);
+    QAbstractItemModel *fileModel() const;
 
     // Utilities returning some predefined icons for actions
     static QIcon diffIcon();
@@ -139,11 +144,6 @@ private slots:
     void slotDescriptionChanged();
 
 protected:
-    /* Implemented this to extract the real file list from the status
-     * output of the versioning system as displayed in the file list
-     * for example "M foo.cpp" -> "foo.cpp". */
-    virtual QStringList vcsFileListToFileList(const QStringList &) const = 0;
-
     /* These hooks allow for modifying the contents that goes to
      * the file. The default implementation uses the text
      * of the description editor. */
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index 969f1ac5ae16453edd8be26484adf4e4aaaf0768..5756d2dd2245053c564ee73eea2f9dca11b70da0 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -20,11 +20,15 @@ public:
     {
         StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
         TranslationUnit *unit = new TranslationUnit(&control, fileId);
+        unit->setObjCEnabled(true);
         unit->setSource(source.constData(), source.length());
         unit->parse(mode);
         return unit;
     }
 
+    TranslationUnit *parseDeclaration(const QByteArray &source)
+    { return parse(source, TranslationUnit::ParseDeclaration); }
+
     TranslationUnit *parseExpression(const QByteArray &source)
     { return parse(source, TranslationUnit::ParseExpression); }
 
@@ -43,6 +47,11 @@ private slots:
     void while_condition_statement();
     void for_statement();
     void cpp_initializer_or_function_declaration();
+
+    // objc++
+    void objc_attributes_followed_by_at_keyword();
+    void objc_protocol_forward_declaration_1();
+    void objc_protocol_definition_1();
 };
 
 void tst_AST::simple_name()
@@ -293,6 +302,31 @@ void tst_AST::cpp_initializer_or_function_declaration()
     QCOMPARE(param->type_specifier->asNamedTypeSpecifier()->name->asSimpleName()->identifier_token, 4U);
 }
 
+void tst_AST::objc_attributes_followed_by_at_keyword()
+{
+    QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
+"__attribute__((deprecated)) @interface foo <bar>\n"
+"{\n"
+" int a, b;\n"
+"}\n"
+"+ (id) init;\n"
+"- (id) init:(int)a foo:(int)b, c;\n"
+"@end\n"
+    ));
+    AST *ast = unit->ast();
+}
+
+void tst_AST::objc_protocol_forward_declaration_1()
+{
+    QSharedPointer<TranslationUnit> unit(parseDeclaration("\n@protocol foo;"));
+    AST *ast = unit->ast();
+}
+
+void tst_AST::objc_protocol_definition_1()
+{
+    QSharedPointer<TranslationUnit> unit(parseDeclaration("\n@protocol foo <ciao, bar> @end"));
+    AST *ast = unit->ast();
+}
 
 QTEST_APPLESS_MAIN(tst_AST)
 #include "tst_ast.moc"
diff --git a/tests/manual/cplusplus/main.cpp b/tests/manual/cplusplus/main.cpp
index c33bcbbeff7fc8accdb3e923f63e4ed7fb6867cc..4292fe929f62d933063ff6e13ef8bd7cf257c54f 100644
--- a/tests/manual/cplusplus/main.cpp
+++ b/tests/manual/cplusplus/main.cpp
@@ -248,6 +248,7 @@ int main(int argc, char *argv[])
     Control control;
     StringLiteral *fileId = control.findOrInsertFileName("<stdin>");
     TranslationUnit unit(&control, fileId);
+    unit.setObjCEnabled(true);
     unit.setSource(source.constData(), source.size());
     unit.parse();
     if (! unit.ast())