diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
index f4c7455e017365d2dd3989b94e794443555876ed..80b15b4c94b471979be597db48bc6b7fb01e7982 100644
--- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp
@@ -40,123 +40,45 @@
 #include <QtGui/QCheckBox>
 #include <QtGui/QPushButton>
 
+Q_DECLARE_METATYPE(Core::IFile*);
+
 using namespace Core;
 using namespace Core::Internal;
 
-FileItem::FileItem(QTreeWidget *tree, bool supportOpen, bool open, const QString &text)
-    : QTreeWidgetItem(tree)
-{
-    m_saveCheckBox = createCheckBox(tree, 0);
-    m_saveCheckBox->setChecked(true);
-
-    QFileInfo fi(text);
-    QString name = fi.fileName();
-    if (open)
-        name.append(tr(" [ReadOnly]"));
-
-    if (supportOpen) {
-        m_sccCheckBox = createCheckBox(tree, 1);
-        m_sccCheckBox->setEnabled(open);
-        m_sccCheckBox->setChecked(open);
-        connect(m_saveCheckBox, SIGNAL(stateChanged(int)),
-            this, SLOT(updateSCCCheckBox()));
-        setText(2, name);
-        setToolTip(2, text);
-    } else {
-        m_sccCheckBox = 0;
-        setText(2, name);
-        setToolTip(2, text);
-    }
-}
-
-QCheckBox *FileItem::createCheckBox(QTreeWidget *tree, int column)
-{
-    QWidget *w = new QWidget();
-    QHBoxLayout *l = new QHBoxLayout(w);
-    l->setMargin(0);
-    l->setSpacing(0);
-    QCheckBox *box = new QCheckBox(w);
-    l->addWidget(box);
-    l->setAlignment(box, Qt::AlignCenter);
-    w->setLayout(l);
-    tree->setItemWidget(this, column, w);
-    return box;
-}
-
-void FileItem::updateSCCCheckBox()
-{
-    if (!m_saveCheckBox->isChecked()) {
-        m_sccCheckBox->setEnabled(false);
-        m_sccCheckBox->setChecked(false);
-    } else {
-        m_sccCheckBox->setEnabled(true);
-    }
-}
-
-bool FileItem::shouldBeSaved() const
-{
-    return m_saveCheckBox->isChecked();
-}
-
-void FileItem::setShouldBeSaved(bool s)
-{
-    m_saveCheckBox->setChecked(s);
-}
-
-bool FileItem::shouldBeOpened() const
-{
-    if (m_sccCheckBox)
-        return m_sccCheckBox->isChecked();
-    return false;
-}
-
-
-
-SaveItemsDialog::SaveItemsDialog(MainWindow *mainWindow,
-                                 QMap<IFile*, QString> items)
-    : QDialog(mainWindow)
+SaveItemsDialog::SaveItemsDialog(QWidget *parent,
+                                 QList<IFile *> items)
+    : QDialog(parent)
 {
     m_ui.setupUi(this);
-    QPushButton *uncheckButton = m_ui.buttonBox->addButton(tr("Uncheck All"),
-                                                           QDialogButtonBox::ActionRole);
-    QPushButton *discardButton = m_ui.buttonBox->addButton(tr("Discard All"),
-                                                           QDialogButtonBox::DestructiveRole);
-    m_ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
-    m_ui.buttonBox->button(QDialogButtonBox::Ok)->setFocus(Qt::TabFocusReason);
-
-    m_ui.treeWidget->header()->setMovable(false);
-    m_ui.treeWidget->setRootIsDecorated(false);
-    m_ui.treeWidget->setColumnCount(2);
-
-    QStringList headers;
-    headers << tr("Save") << tr("File Name");
-
-    const bool hasVersionControl = true;
-    if (hasVersionControl) {
-        m_ui.treeWidget->setColumnCount(3);
-        headers.insert(1, tr("Open with SCC"));
-    }
-    m_ui.treeWidget->setHeaderLabels(headers);
-
-    FileItem *itm;
-    QMap<IFile*, QString>::const_iterator it = items.constBegin();
-    while (it != items.constEnd()) {
-        QString directory = QFileInfo(it.key()->fileName()).absolutePath();
-        bool fileHasVersionControl = mainWindow->vcsManager()->findVersionControlForDirectory(directory) != 0;
-        itm = new FileItem(m_ui.treeWidget, fileHasVersionControl,
-            it.key()->isReadOnly(), it.value());
-        m_itemMap.insert(itm, it.key());
-        ++it;
+    QPushButton *discardButton = m_ui.buttonBox->addButton(tr("Don't Save"), QDialogButtonBox::DestructiveRole);
+    m_ui.buttonBox->button(QDialogButtonBox::Save)->setDefault(true);
+    m_ui.buttonBox->button(QDialogButtonBox::Save)->setFocus(Qt::TabFocusReason);
+    m_ui.buttonBox->button(QDialogButtonBox::Save)->setMinimumWidth(130); // bad magic number to avoid resizing of button
+
+    foreach (IFile *file, items) {
+        QString visibleName;
+        QString directory;
+        QString fileName = file->fileName();
+        if (fileName.isEmpty()) {
+            visibleName = file->suggestedFileName();
+        } else {
+            QFileInfo info = QFileInfo(fileName);
+            directory = info.absolutePath();
+            visibleName = info.fileName();
+        }
+        QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList()
+                                                    << visibleName << directory);
+        item->setData(0, Qt::UserRole, qVariantFromValue(file));
     }
 
     m_ui.treeWidget->resizeColumnToContents(0);
-    if (hasVersionControl)
-        m_ui.treeWidget->resizeColumnToContents(1);
+    m_ui.treeWidget->selectAll();
+    updateSaveButton();
 
-    connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()),
+    connect(m_ui.buttonBox->button(QDialogButtonBox::Save), SIGNAL(clicked()),
             this, SLOT(collectItemsToSave()));
-    connect(uncheckButton, SIGNAL(clicked()), this, SLOT(uncheckAll()));
     connect(discardButton, SIGNAL(clicked()), this, SLOT(discardAll()));
+    connect(m_ui.treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(updateSaveButton()));
 }
 
 void SaveItemsDialog::setMessage(const QString &msg)
@@ -164,24 +86,34 @@ void SaveItemsDialog::setMessage(const QString &msg)
     m_ui.msgLabel->setText(msg);
 }
 
+void SaveItemsDialog::updateSaveButton()
+{
+    int count = m_ui.treeWidget->selectedItems().count();
+    QPushButton *button = m_ui.buttonBox->button(QDialogButtonBox::Save);
+    if (count == m_ui.treeWidget->topLevelItemCount()) {
+        button->setEnabled(true);
+        button->setText(tr("Save All"));
+    } else if (count == 0) {
+        button->setEnabled(false);
+        button->setText(tr("Save"));
+    } else {
+        button->setEnabled(true);
+        button->setText(tr("Save Selected"));
+    }
+}
+
 void SaveItemsDialog::collectItemsToSave()
 {
     m_itemsToSave.clear();
-    m_itemsToOpen.clear();
-    QMap<FileItem*, IFile*>::const_iterator it = m_itemMap.constBegin();
-    while (it != m_itemMap.constEnd()) {
-        if (it.key()->shouldBeSaved())
-            m_itemsToSave << it.value();
-        if (it.key()->shouldBeOpened())
-            m_itemsToOpen.insert(it.value());
-        ++it;
+    foreach (QTreeWidgetItem *item, m_ui.treeWidget->selectedItems()) {
+        m_itemsToSave.append(item->data(0, Qt::UserRole).value<IFile*>());
     }
     accept();
 }
 
 void SaveItemsDialog::discardAll()
 {
-    uncheckAll();
+    m_ui.treeWidget->clearSelection();
     collectItemsToSave();
 }
 
@@ -189,16 +121,3 @@ QList<IFile*> SaveItemsDialog::itemsToSave() const
 {
     return m_itemsToSave;
 }
-
-QSet<IFile*> SaveItemsDialog::itemsToOpen() const
-{
-    return m_itemsToOpen;
-}
-
-void SaveItemsDialog::uncheckAll()
-{
-    for (int i=0; i<m_ui.treeWidget->topLevelItemCount(); ++i) {
-        FileItem *item = static_cast<FileItem*>(m_ui.treeWidget->topLevelItem(i));
-        item->setShouldBeSaved(false);
-    }
-}
diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.h b/src/plugins/coreplugin/dialogs/saveitemsdialog.h
index d6ceb414a8b068504daac06a60245ae54982b7c0..ff22baa1f66fa04eb1c4d1432ed3aab199a61b66 100644
--- a/src/plugins/coreplugin/dialogs/saveitemsdialog.h
+++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.h
@@ -48,49 +48,26 @@ namespace Internal {
 
 class MainWindow;
 
-class FileItem : public QObject, public QTreeWidgetItem
-{
-    Q_OBJECT
-
-public:
-    FileItem(QTreeWidget *tree, bool supportOpen,
-             bool open, const QString &text);
-    bool shouldBeSaved() const;
-    void setShouldBeSaved(bool s);
-    bool shouldBeOpened() const;
-
-private slots:
-    void updateSCCCheckBox();
-
-private:
-    QCheckBox *createCheckBox(QTreeWidget *tree, int column);
-    QCheckBox *m_saveCheckBox;
-    QCheckBox *m_sccCheckBox;
-};
-
 class SaveItemsDialog : public QDialog
 {
     Q_OBJECT
 
 public:
-    SaveItemsDialog(MainWindow *mainWindow,
-        QMap<Core::IFile*, QString> items);
+    SaveItemsDialog(QWidget *parent,
+        QList<Core::IFile *> items);
 
     void setMessage(const QString &msg);
 
-    QList<Core::IFile*> itemsToSave() const;
-    QSet<Core::IFile*> itemsToOpen() const;
+    QList<Core::IFile *> itemsToSave() const;
 
 private slots:
     void collectItemsToSave();
-    void uncheckAll();
     void discardAll();
+    void updateSaveButton();
 
 private:
     Ui::SaveItemsDialog m_ui;
-    QMap<FileItem*, Core::IFile*> m_itemMap;
     QList<Core::IFile*> m_itemsToSave;
-    QSet<Core::IFile*> m_itemsToOpen;
 };
 
 } // namespace Internal
diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.ui b/src/plugins/coreplugin/dialogs/saveitemsdialog.ui
index 85931a1daba3bd4154675b9eab98fba472c21f44..966be8f4f303261e840bec53bf4dbf44c8e49c7c 100644
--- a/src/plugins/coreplugin/dialogs/saveitemsdialog.ui
+++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.ui
@@ -1,41 +1,68 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>SaveItemsDialog</class>
- <widget class="QDialog" name="SaveItemsDialog" >
-  <property name="geometry" >
+ <widget class="QDialog" name="SaveItemsDialog">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
+    <width>457</width>
     <height>200</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Save Changes</string>
   </property>
-  <layout class="QVBoxLayout" >
-   <property name="margin" >
-    <number>9</number>
-   </property>
-   <property name="spacing" >
-    <number>6</number>
-   </property>
+  <layout class="QVBoxLayout">
    <item>
-    <widget class="QLabel" name="msgLabel" >
-     <property name="text" >
-      <string>Save the changes of the following items:</string>
+    <widget class="QLabel" name="msgLabel">
+     <property name="text">
+      <string>The following files have unsaved changes:</string>
      </property>
     </widget>
    </item>
    <item>
-    <widget class="QTreeWidget" name="treeWidget" />
+    <widget class="QTreeWidget" name="treeWidget">
+     <property name="selectionMode">
+      <enum>QAbstractItemView::ExtendedSelection</enum>
+     </property>
+     <property name="textElideMode">
+      <enum>Qt::ElideLeft</enum>
+     </property>
+     <property name="indentation">
+      <number>0</number>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="uniformRowHeights">
+      <bool>true</bool>
+     </property>
+     <property name="headerHidden">
+      <bool>true</bool>
+     </property>
+     <property name="columnCount">
+      <number>2</number>
+     </property>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string notr="true">2</string>
+      </property>
+     </column>
+    </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" >
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
      </property>
     </widget>
    </item>
@@ -52,11 +79,11 @@
    <receiver>SaveItemsDialog</receiver>
    <slot>reject()</slot>
    <hints>
-    <hint type="sourcelabel" >
+    <hint type="sourcelabel">
      <x>199</x>
      <y>174</y>
     </hint>
-    <hint type="destinationlabel" >
+    <hint type="destinationlabel">
      <x>199</x>
      <y>99</y>
     </hint>
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 8badefeb9a8237e99b978fb504b2a9322a5a03d3..722f925b263f9607c062ed42d15a30f17e88267a 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -36,7 +36,6 @@
 #include "icore.h"
 #include "iversioncontrol.h"
 #include "mimedatabase.h"
-#include "saveitemsdialog.h"
 #include "tabpositionindicator.h"
 #include "vcsmanager.h"
 
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index a201e5c9baecdef21a7ae90b31ca6a5bc193c066..1399269c6a67fc0b4aba1e8cfea903f3ce152286 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -132,8 +132,7 @@ void EditorModel::addEntry(const Entry &entry)
     if (previousIndex >= 0) {
         if (entry.editor && m_editors.at(previousIndex).editor == 0) {
             m_editors[previousIndex] = entry;
-            QModelIndex mindex = index(previousIndex, 0);
-            emit dataChanged(mindex, mindex);
+            connect(entry.editor, SIGNAL(changed()), this, SLOT(itemChanged()));
         }
         return;
     }
diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp
index 5fd9fe3fdd52de79c0dc30d488236813fab904f1..b996ed50407337bd9bc830a4dbbf64f410875203 100644
--- a/src/plugins/coreplugin/filemanager.cpp
+++ b/src/plugins/coreplugin/filemanager.cpp
@@ -314,7 +314,8 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
         (*cancelled) = false;
 
     QList<IFile *> notSaved;
-    QMap<IFile*, QString> modifiedFiles;
+    QMap<IFile *, QString> modifiedFilesMap;
+    QList<IFile *> modifiedFiles;
 
     foreach (IFile *file, files) {
         if (file->isModified()) {
@@ -324,17 +325,16 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
 
             // There can be several FileInterfaces pointing to the same file
             // Select one that is not readonly.
-            if (!(modifiedFiles.values().contains(name)
+            if (!(modifiedFilesMap.values().contains(name)
                 && file->isReadOnly()))
-                modifiedFiles.insert(file, name);
+                modifiedFilesMap.insert(file, name);
         }
     }
-
+    modifiedFiles = modifiedFilesMap.keys();
     if (!modifiedFiles.isEmpty()) {
         QList<IFile *> filesToSave;
-        QSet<IFile *> filesToOpen;
         if (silently) {
-            filesToSave = modifiedFiles.keys();
+            filesToSave = modifiedFiles;
         } else {
             SaveItemsDialog dia(m_mainWindow, modifiedFiles);
             if (!message.isEmpty())
@@ -342,16 +342,15 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files,
             if (dia.exec() != QDialog::Accepted) {
                 if (cancelled)
                     (*cancelled) = true;
-                notSaved = modifiedFiles.keys();
+                notSaved = modifiedFiles;
                 return notSaved;
             }
             filesToSave = dia.itemsToSave();
-            filesToOpen = dia.itemsToOpen();
         }
 
         bool yestoall = false;
         foreach (IFile *file, filesToSave) {
-            if (file->isReadOnly() && filesToOpen.contains(file)) {
+            if (file->isReadOnly()) {
                 QString directory = QFileInfo(file->fileName()).absolutePath();
                 IVersionControl *versionControl = m_mainWindow->vcsManager()->findVersionControlForDirectory(directory);
                 if (versionControl)
diff --git a/src/plugins/coreplugin/welcomemode.cpp b/src/plugins/coreplugin/welcomemode.cpp
index 588bfcb827badaffa4c8092dc97466857ace18bf..a31e1965b1089322cf65de3cfc9d37f216fac220 100644
--- a/src/plugins/coreplugin/welcomemode.cpp
+++ b/src/plugins/coreplugin/welcomemode.cpp
@@ -92,7 +92,9 @@ WelcomeModePrivate::WelcomeModePrivate() :
     m_projectHtmlTemplate(readFile(QLatin1String(":/core/html/recent_projects.html"))),
     m_baseUrl(QUrl(QLatin1String("qrc:/core/html/welcome.html")))
 {
+#if !defined(QT_NO_WEBKIT)
     m_webview->setContextMenuPolicy(Qt::NoContextMenu);
+#endif   
 }
 
 #if defined(QT_NO_WEBKIT)
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 5b363e291dbe598b7c47b07a81c2225449672dc7..9990547838a4a1b283096830b03f36e685e79d92 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -370,7 +370,7 @@ void CPPEditor::jumpToMethod(int)
     if (! symbol)
         return;
 
-    openEditorAt(symbol);
+    openCppEditorAt(linkToSymbol(symbol));
 }
 
 void CPPEditor::updateMethodBoxIndex()
@@ -579,50 +579,65 @@ void CPPEditor::switchDeclarationDefinition()
             declaration = symbols.first();
 
         if (declaration)
-            openEditorAt(declaration);
+            openCppEditorAt(linkToSymbol(declaration));
     } else if (lastSymbol->type()->isFunctionType()) {
         if (Symbol *def = findDefinition(lastSymbol))
-            openEditorAt(def);
+            openCppEditorAt(linkToSymbol(def));
     }
 }
 
-void CPPEditor::jumpToDefinition()
+CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor)
 {
+    Link link;
+
     if (!m_modelManager)
-        return;
+        return link;
 
     const Snapshot snapshot = m_modelManager->snapshot();
-
-    // Find the last symbol up to the cursor position
     int line = 0, column = 0;
-    convertPosition(position(), &line, &column);
+    convertPosition(cursor.position(), &line, &column);
     Document::Ptr doc = snapshot.value(file()->fileName());
     if (!doc)
-        return;
+        return link;
 
-    QTextCursor tc = textCursor();
-    unsigned lineno = tc.blockNumber() + 1;
+    // Handle include directives
+    const unsigned lineno = cursor.blockNumber() + 1;
     foreach (const Document::Include &incl, doc->includes()) {
         if (incl.line() == lineno) {
-            if (openCppEditorAt(incl.fileName(), 0, 0))
-                return; // done
-            break;
+            link.fileName = incl.fileName();
+            link.pos = cursor.block().position();
+            link.length = cursor.block().length();
+            return link;
         }
     }
 
+    // Find the last symbol up to the cursor position
     Symbol *lastSymbol = doc->findSymbolAt(line, column);
     if (!lastSymbol)
-        return;
+        return link;
+
+    // Check whether we're at a name
+    const int endOfName = endOfNameAtPosition(cursor.position());
+    if (!characterAt(endOfName - 1).isLetterOrNumber())
+        return link;
+
+    // Remember the position and length of the name
+    QTextCursor tc = cursor;
+    tc.setPosition(endOfName);
+    tc.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor);
+    const int nameStart = tc.position();
+    const int nameLength = tc.anchor() - tc.position();
+
+    // Drop out if we're at a number
+    if (characterAt(nameStart).isNumber())
+        return link;
 
-    // Get the expression under the cursor
-    const int endOfName = endOfNameUnderCursor();
+    // Evaluate the type of the expression under the cursor
     tc.setPosition(endOfName);
     ExpressionUnderCursor expressionUnderCursor;
     const QString expression = expressionUnderCursor(tc);
-
-    // Evaluate the type of the expression
     TypeOfExpression typeOfExpression;
-    typeOfExpression.setSnapshot(m_modelManager->snapshot());
+    typeOfExpression.setSnapshot(snapshot);
     QList<TypeOfExpression::Result> resolvedSymbols =
             typeOfExpression(expression, doc, lastSymbol);
 
@@ -633,10 +648,10 @@ void CPPEditor::jumpToDefinition()
             if (!lastSymbol->isFunction())
                 def = findDefinition(symbol);
 
-            if (def)
-                openEditorAt(def);
-            else
-                openEditorAt(symbol);
+            link = linkToSymbol(def ? def : symbol);
+            link.pos = nameStart;
+            link.length = nameLength;
+            return link;
 
         // This would jump to the type of a name
 #if 0
@@ -649,15 +664,25 @@ void CPPEditor::jumpToDefinition()
 #endif
         }
     } else {
+        // Handle macro uses
         foreach (const Document::MacroUse use, doc->macroUses()) {
             if (use.contains(endOfName - 1)) {
                 const Macro &macro = use.macro();
-                const QString fileName = QString::fromUtf8(macro.fileName());
-                if (openCppEditorAt(fileName, macro.line(), 0))
-                    return; // done
+                link.fileName = QString::fromUtf8(macro.fileName());
+                link.line = macro.line();
+                link.pos = use.begin();
+                link.length = use.end() - use.begin();
+                return link;
             }
         }
     }
+
+    return link;
+}
+
+void CPPEditor::jumpToDefinition()
+{
+    openCppEditorAt(findLinkAt(textCursor()));
 }
 
 Symbol *CPPEditor::findDefinition(Symbol *symbol)
@@ -777,6 +802,78 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e)
     delete menu;
 }
 
+void CPPEditor::mouseMoveEvent(QMouseEvent *e)
+{
+    bool hasDestination = false;
+    Qt::CursorShape cursorShape;
+
+    if (e->modifiers() & Qt::ControlModifier) {
+        // Link emulation behaviour for 'go to definition'
+        const QTextCursor cursor = cursorForPosition(e->pos());
+
+        // Check that the mouse was actually on the text somewhere
+        bool onText = cursorRect(cursor).right() >= e->x();
+        if (!onText) {
+            QTextCursor nextPos = cursor;
+            nextPos.movePosition(QTextCursor::Right);
+            onText = cursorRect(nextPos).right() >= e->x();
+        }
+
+        const Link link = findLinkAt(cursor);
+
+        if (onText && !link.fileName.isEmpty()) {
+            QTextEdit::ExtraSelection sel;
+            sel.cursor = cursor;
+            if (link.pos >= 0) {
+                sel.cursor.setPosition(link.pos);
+                sel.cursor.setPosition(link.pos + link.length, QTextCursor::KeepAnchor);
+            } else {
+                sel.cursor.select(QTextCursor::WordUnderCursor);
+            }
+            sel.format.setFontUnderline(true);
+            sel.format.setForeground(Qt::blue);
+            setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel);
+            hasDestination = true;
+            cursorShape = Qt::PointingHandCursor;
+        }
+    }
+
+    if (!hasDestination) {
+        setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>());
+        cursorShape = Qt::IBeamCursor;
+    }
+
+    TextEditor::BaseTextEditor::mouseMoveEvent(e);
+
+    viewport()->setCursor(cursorShape);
+}
+
+void CPPEditor::mouseReleaseEvent(QMouseEvent *e)
+{
+    if (e->modifiers() & Qt::ControlModifier && !(e->modifiers() & Qt::ShiftModifier)
+        && e->button() == Qt::LeftButton) {
+
+        const QTextCursor cursor = cursorForPosition(e->pos());
+        if (openCppEditorAt(findLinkAt(cursor))) {
+            setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>());
+            viewport()->setCursor(Qt::IBeamCursor);
+            e->accept();
+            return;
+        }
+    }
+
+    TextEditor::BaseTextEditor::mouseReleaseEvent(e);
+}
+
+void CPPEditor::keyReleaseEvent(QKeyEvent *e)
+{
+    // Clear link emulation when Ctrl is released
+    if (e->key() == Qt::Key_Control) {
+        setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>());
+        viewport()->setCursor(Qt::IBeamCursor);
+    }
+}
+
 QList<int> CPPEditorEditable::context() const
 {
     return m_context;
@@ -946,9 +1043,11 @@ void CPPEditor::unCommentSelection()
     cursor.endEditBlock();
 }
 
-int CPPEditor::endOfNameUnderCursor()
+int CPPEditor::endOfNameAtPosition(int pos)
 {
-    int pos = position();
+    if (pos == -1)
+        pos = position();
+
     QChar chr = characterAt(pos);
 
     // Skip to the start of a name
@@ -958,32 +1057,37 @@ int CPPEditor::endOfNameUnderCursor()
     return pos;
 }
 
-TextEditor::ITextEditor *CPPEditor::openCppEditorAt(const QString &fileName,
-                                                    int line, int column)
-{
-    return TextEditor::BaseTextEditor::openEditorAt(fileName, line, column,
-                                                    Constants::C_CPPEDITOR);
-}
-
-bool CPPEditor::openEditorAt(Symbol *s)
+CPPEditor::Link CPPEditor::linkToSymbol(CPlusPlus::Symbol *symbol)
 {
-    const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength());
-    unsigned line = s->line();
-    unsigned column = s->column();
+    const QString fileName = QString::fromUtf8(symbol->fileName(),
+                                               symbol->fileNameLength());
+    unsigned line = symbol->line();
+    unsigned column = symbol->column();
 
     if (column)
         --column;
 
-    if (s->isGenerated())
+    if (symbol->isGenerated())
         column = 0;
 
-    if (baseTextDocument()->fileName() == fileName) {
+    return Link(fileName, line, column);
+}
+
+bool CPPEditor::openCppEditorAt(const Link &link)
+{
+    if (link.fileName.isEmpty())
+        return false;
+
+    if (baseTextDocument()->fileName() == link.fileName) {
         Core::EditorManager *editorManager = Core::EditorManager::instance();
         editorManager->addCurrentPositionToNavigationHistory();
-        gotoLine(line, column);
+        gotoLine(link.line, link.column);
         setFocus();
         return true;
     }
 
-    return openCppEditorAt(fileName, line, column);
+    return TextEditor::BaseTextEditor::openEditorAt(link.fileName,
+                                                    link.line,
+                                                    link.column,
+                                                    Constants::C_CPPEDITOR);
 }
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 7a91faebf3c02a1de19eadd16ae27cf8807b527b..35a46cb0c7249fbc8918e724fcb34f5979304d7c 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -96,7 +96,11 @@ public slots:
     void deleteEndOfToken();
 
 protected:
-    void contextMenuEvent(QContextMenuEvent *e);
+    void contextMenuEvent(QContextMenuEvent *);
+    void mouseMoveEvent(QMouseEvent *);
+    void mouseReleaseEvent(QMouseEvent *);
+    void keyReleaseEvent(QKeyEvent *);
+
     TextEditor::BaseTextEditorEditable *createEditableInterface();
 
     // Rertuns true if key triggers anindent.
@@ -122,9 +126,31 @@ private:
 
     void createToolBar(CPPEditorEditable *editable);
 
-    int endOfNameUnderCursor();
-
-    bool openEditorAt(CPlusPlus::Symbol *symbol);
+    int endOfNameAtPosition(int pos);
+
+    struct Link
+    {
+        Link(const QString &fileName = QString(),
+             int line = 0,
+             int column = 0)
+            : pos(-1)
+            , length(-1)
+            , fileName(fileName)
+            , line(line)
+            , column(column)
+        {}
+
+        int pos;           // Link position
+        int length;        // Link length
+
+        QString fileName;  // Target file
+        int line;          // Target line
+        int column;        // Target column
+    };
+
+    Link findLinkAt(const QTextCursor &);
+    static Link linkToSymbol(CPlusPlus::Symbol *symbol);
+    bool openCppEditorAt(const Link &);
 
     CppTools::CppModelManagerInterface *m_modelManager;
 
diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp
index d1aa6ff33cb8603b88582a17db0df18e48a10f36..f7edac224f73d604c659ee75c8a5d3a7942cadf4 100644
--- a/src/plugins/debugger/debuggeractions.cpp
+++ b/src/plugins/debugger/debuggeractions.cpp
@@ -54,6 +54,7 @@ namespace Internal {
 DebuggerAction::DebuggerAction(QObject *parent)
   : QAction(parent)
 {
+    m_widget = 0;
     connect(this, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool)));
 }
 
@@ -126,8 +127,7 @@ QString DebuggerAction::toString() const
 {
     return "value: " + m_value.toString()
         + "  defaultvalue: " + m_defaultValue.toString()
-        + "  settingskey: " + m_settingsGroup + '/' + m_settingsKey
-        + "  deferedValue: " + m_deferedValue.toString();
+        + "  settingskey: " + m_settingsGroup + '/' + m_settingsKey;
 }
 
 QAction *DebuggerAction::updatedAction(const QString &text0)
@@ -173,9 +173,9 @@ void DebuggerAction::writeSettings(QSettings *settings)
 void DebuggerAction::connectWidget(QWidget *widget, ApplyMode applyMode)
 {
     using namespace Core::Utils;
-    //qDebug() << "CONNECT WIDGET " << widget << " TO " << m_settingsKey;
-    m_applyModes[widget] = applyMode;
-    m_deferedValue = m_value;
+    m_widget = widget;
+    m_applyMode = applyMode;
+    
     if (QAbstractButton *button = qobject_cast<QAbstractButton *>(widget)) {
         if (button->isCheckable()) {
             button->setChecked(m_value.toBool());
@@ -203,9 +203,16 @@ void DebuggerAction::connectWidget(QWidget *widget, ApplyMode applyMode)
 
 void DebuggerAction::apply(QSettings *s)
 {
-    setValue(m_deferedValue);
+    using namespace Core::Utils;
+    if (QAbstractButton *button = qobject_cast<QAbstractButton *>(m_widget))
+        setValue(button->isChecked());
+    else if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(m_widget))
+        setValue(lineEdit->text());
+    else if (PathChooser *pathChooser = qobject_cast<PathChooser *>(m_widget))
+        setValue(pathChooser->path());
+    m_widget = 0;
     if (s)
-        writeSettings(s);
+       writeSettings(s);
 }
 
 void DebuggerAction::uncheckableButtonClicked()
@@ -221,9 +228,7 @@ void DebuggerAction::checkableButtonClicked(bool)
     QAbstractButton *button = qobject_cast<QAbstractButton *>(sender());
     QTC_ASSERT(button, return);
     //qDebug() << "CHECKABLE BUTTON: " << sender();
-    if (m_applyModes[sender()] == DeferedApply)
-        m_deferedValue = button->isChecked();
-    else
+    if (m_applyMode == ImmediateApply)
         setValue(button->isChecked());
 }
 
@@ -232,9 +237,7 @@ void DebuggerAction::lineEditEditingFinished()
     QLineEdit *lineEdit = qobject_cast<QLineEdit *>(sender());
     QTC_ASSERT(lineEdit, return);
     //qDebug() << "LINEEDIT: " << sender() << lineEdit->text();
-    if (m_applyModes[sender()] == DeferedApply)
-        m_deferedValue = lineEdit->text();
-    else
+    if (m_applyMode == ImmediateApply)
         setValue(lineEdit->text());
 }
 
@@ -244,9 +247,7 @@ void DebuggerAction::pathChooserEditingFinished()
     PathChooser *pathChooser = qobject_cast<PathChooser *>(sender());
     QTC_ASSERT(pathChooser, return);
     //qDebug() << "PATHCHOOSER: " << sender() << pathChooser->path();
-    if (m_applyModes[sender()] == DeferedApply)
-        m_deferedValue = pathChooser->path();
-    else
+    if (m_applyMode == ImmediateApply)
         setValue(pathChooser->path());
 }
 
@@ -262,13 +263,13 @@ void DebuggerAction::trigger(const QVariant &data)
     QAction::trigger();
 }
 
+
 //////////////////////////////////////////////////////////////////////////
 //
 // DebuggerSettings
 //
 //////////////////////////////////////////////////////////////////////////
 
-
 DebuggerSettings::DebuggerSettings(QObject *parent)
     : QObject(parent)
 {}
diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h
index b635840df06921815ceb02aa708f4ba5e397f447..47ccfa9638620e4f8557a1825ea8ab10e27b587b 100644
--- a/src/plugins/debugger/debuggeractions.h
+++ b/src/plugins/debugger/debuggeractions.h
@@ -96,12 +96,12 @@ private:
 
     QVariant m_value;
     QVariant m_defaultValue;
-    QVariant m_deferedValue; // basically a temporary copy of m_value 
     QString m_settingsKey;
     QString m_settingsGroup;
     QString m_textPattern;
     QString m_textData;
-    QHash<QObject *, ApplyMode> m_applyModes;
+    QWidget *m_widget;
+    ApplyMode m_applyMode;
 };
 
 class DebuggerSettings : public QObject
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index c2c18dec377a78eee63a68d55dab30f4889cd0e0..535276b326cfde9604675929fc1b7a9989807092 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -4232,7 +4232,7 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString &
 
 QString GdbEngine::dumperLibraryName() const
 {
-    if (theDebuggerAction(UsePrebuiltDumpers))
+    if (theDebuggerAction(UsePrebuiltDumpers)->value().toBool())
         return theDebuggerAction(PrebuiltDumpersLocation)->value().toString();
 #if defined(Q_OS_WIN)
     return q->m_buildDir + "/qtc-gdbmacros/debug/gdbmacros.dll";
@@ -4252,48 +4252,45 @@ void GdbEngine::tryLoadCustomDumpers()
     m_dataDumperState = DataDumperUnavailable;
     QString lib = dumperLibraryName();
 
-    if (QFileInfo(lib).exists()) {
-#if defined(Q_OS_WIN)
-        m_dataDumperState = DataDumperLoadTried;
-        sendCommand("sharedlibrary .*"); // for LoadLibraryA
-        //sendCommand("handle SIGSEGV pass stop print");
-        //sendCommand("set unwindonsignal off");
-        sendCommand("call LoadLibraryA(\"" + lib + "\")",
-            WatchDumpCustomSetup);
-        sendCommand("sharedlibrary " + dotEscape(lib));
-#elif defined(Q_OS_MAC)
-        m_dataDumperState = DataDumperLoadTried;
-        //sendCommand("sharedlibrary libc"); // for malloc
-        //sendCommand("sharedlibrary libdl"); // for dlopen
-        QString flag = QString::number(RTLD_NOW);
-        sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
-            WatchDumpCustomSetup);
-        //sendCommand("sharedlibrary " + dotEscape(lib));
-        m_dataDumperState = DataDumperLoadTried;
-#else
-        //sendCommand("p dlopen");
-        QString flag = QString::number(RTLD_NOW);
-        sendCommand("sharedlibrary libc"); // for malloc
-        sendCommand("sharedlibrary libdl"); // for dlopen
-        sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
-            WatchDumpCustomSetup);
-        // some older systems like CentOS 4.6 prefer this:
-        sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")",
-            WatchDumpCustomSetup);
-        sendCommand("sharedlibrary " + dotEscape(lib));
-#endif
-    }
-
-    if (m_dataDumperState == DataDumperLoadTried) {
-        // retreive list of dumpable classes
-        sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
-        sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
-    } else {
+    if (!QFileInfo(lib).exists()) {
         debugMessage(QString("DEBUG HELPER LIBRARY IS NOT USABLE: "
             " %1  EXISTS: %2, EXECUTABLE: %3").arg(lib)
             .arg(QFileInfo(lib).exists())
             .arg(QFileInfo(lib).isExecutable()));
+        return;
     }
+
+    m_dataDumperState = DataDumperLoadTried;
+#if defined(Q_OS_WIN)
+    sendCommand("sharedlibrary .*"); // for LoadLibraryA
+    //sendCommand("handle SIGSEGV pass stop print");
+    //sendCommand("set unwindonsignal off");
+    sendCommand("call LoadLibraryA(\"" + lib + "\")",
+        WatchDumpCustomSetup);
+    sendCommand("sharedlibrary " + dotEscape(lib));
+#elif defined(Q_OS_MAC)
+    //sendCommand("sharedlibrary libc"); // for malloc
+    //sendCommand("sharedlibrary libdl"); // for dlopen
+    QString flag = QString::number(RTLD_NOW);
+    sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
+        WatchDumpCustomSetup);
+    //sendCommand("sharedlibrary " + dotEscape(lib));
+    m_dataDumperState = DataDumperLoadTried;
+#else
+    //sendCommand("p dlopen");
+    QString flag = QString::number(RTLD_NOW);
+    sendCommand("sharedlibrary libc"); // for malloc
+    sendCommand("sharedlibrary libdl"); // for dlopen
+    sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")",
+        WatchDumpCustomSetup);
+    // some older systems like CentOS 4.6 prefer this:
+    sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")",
+        WatchDumpCustomSetup);
+    sendCommand("sharedlibrary " + dotEscape(lib));
+#endif
+    // retreive list of dumpable classes
+    sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)");
+    sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper);
 }
 
 void GdbEngine::recheckCustomDumperAvailability()
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index ab96217b1e8f51ee9f5f4bc8b6cae0b4f6dc8576..cfe0eb5338ceb24ee530b0d54f175a4ca8a2f918 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -682,7 +682,7 @@ void WatchHandler::rebuildModel()
 
     emit layoutAboutToBeChanged();
 
-    if (oldTopINames != topINames) {
+    if (0 && oldTopINames != topINames) {
         m_displaySet = initialSet();
         m_expandedINames.clear();
         emit reset();
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index b4481b7773d2ab4ed050c42b2ee5b5660ef859df..a975c2bcecdded14a9f7bd319f867472df1be2b1 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1273,8 +1273,7 @@ bool ProjectExplorerPlugin::saveModifiedFiles(const QList<Project *> & projects)
 
     if (!filesToSave.isEmpty()) {
         bool cancelled;
-        Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave, &cancelled,
-            tr("The following dependencies are modified, do you want to save them?"));
+        Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave, &cancelled);
         if (cancelled) {
             return false;
         }
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index d185efa9b0a5eb495ba4161d92922263b5b63a94..3675999266e9d1b2e03891bdee26153f855d8dd0 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -335,7 +335,6 @@ void VCSBaseEditor::mouseMoveEvent(QMouseEvent *e)
             sel.cursor = cursor;
             sel.cursor.select(QTextCursor::WordUnderCursor);
             sel.format.setFontUnderline(true);
-            change = changeUnderCursor(cursor);
             sel.format.setProperty(QTextFormat::UserProperty, change);
             setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel);
             overrideCursor = true;
diff --git a/src/qworkbench.pri b/src/qworkbench.pri
index 762713bbb156aca3a18cb68ba41f318454ba9fe8..2c824c5591747795d490b9dd11a389db9c85a3e8 100644
--- a/src/qworkbench.pri
+++ b/src/qworkbench.pri
@@ -6,7 +6,7 @@ isEmpty(TEST):CONFIG(debug, debug|release) {
     }
 }
 
-linux-g++-64 {
+linux-*-64 {
     IDE_LIBRARY_BASENAME = lib64
 } else {
     IDE_LIBRARY_BASENAME = lib