diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
index 14be95994dace441c9a0f3d3b65c957b040a58ee..0f970bfef69cf25036960cf206d2c8ccb16ae80f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeeditor.cpp
@@ -180,11 +180,6 @@ void CMakeEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
     highlighter->rehighlight();
 }
 
-void CMakeEditorWidget::jumpToFile()
-{
-    openLink(findLinkAt(textCursor()));
-}
-
 static bool isValidFileNameChar(const QChar &c)
 {
     if (c.isLetterOrNumber()
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditor.h b/src/plugins/cmakeprojectmanager/cmakeeditor.h
index 990ececf66d8cc4620a8b15928dbd8790c1ade9c..97fe2529f932eb02f84020da4a4dedf9e2ae715d 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditor.h
+++ b/src/plugins/cmakeprojectmanager/cmakeeditor.h
@@ -83,8 +83,6 @@ public:
     CMakeEditorFactory *factory() { return m_factory; }
     TextEditor::TextEditorActionHandler *actionHandler() const { return m_ah; }
 
-    void jumpToFile();
-
     Link findLinkAt(const QTextCursor &cursor,
                                      bool resolveTarget = true);
 
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditorfactory.cpp b/src/plugins/cmakeprojectmanager/cmakeeditorfactory.cpp
index 17a9ccec1c4c6ddb28ae2deb4d103697d2f25c1d..f054f6f066941115dc07657d6dad8531b23475f7 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditorfactory.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeeditorfactory.cpp
@@ -54,7 +54,8 @@ CMakeEditorFactory::CMakeEditorFactory(CMakeManager *manager)
 
     m_actionHandler =
             new TextEditorActionHandler(Constants::C_CMAKEEDITOR,
-            TextEditorActionHandler::UnCommentSelection);
+            TextEditorActionHandler::UnCommentSelection
+            | TextEditorActionHandler::JumpToFileUnderCursor);
 
     ICore *core = ICore::instance();
     ActionManager *am = core->actionManager();
@@ -62,11 +63,7 @@ CMakeEditorFactory::CMakeEditorFactory(CMakeManager *manager)
     Command *cmd;
     Context cmakeEditorContext = Context(Constants::C_CMAKEEDITOR);
 
-    QAction *jumpToFile = new QAction(tr("Jump to File Under Cursor"), this);
-    cmd = am->registerAction(jumpToFile,
-        Constants::JUMP_TO_FILE, cmakeEditorContext);
-    cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
-    connect(jumpToFile, SIGNAL(triggered()), this, SLOT(jumpToFile()));
+    cmd = am->command(TextEditor::Constants::JUMP_TO_FILE_UNDER_CURSOR);
     contextMenu->addAction(cmd);
 
     QAction *separator = new QAction(this);
@@ -101,14 +98,6 @@ Core::IEditor *CMakeEditorFactory::createEditor(QWidget *parent)
     return rc->editor();
 }
 
-void CMakeEditorFactory::jumpToFile()
-{
-    Core::EditorManager *em = Core::EditorManager::instance();
-    CMakeEditorWidget *editor = qobject_cast<CMakeEditorWidget*>(em->currentEditor()->widget());
-    if (editor)
-        editor->jumpToFile();
-}
-
 QStringList CMakeEditorFactory::mimeTypes() const
 {
     return m_mimeTypes;
diff --git a/src/plugins/cmakeprojectmanager/cmakeeditorfactory.h b/src/plugins/cmakeprojectmanager/cmakeeditorfactory.h
index e2d8e4ba58c66f3307acb0a93ce6dd2b88da21da..a58a4115d169db956c1f3969d5ddad1035cc2840 100644
--- a/src/plugins/cmakeprojectmanager/cmakeeditorfactory.h
+++ b/src/plugins/cmakeprojectmanager/cmakeeditorfactory.h
@@ -60,9 +60,6 @@ public:
     Core::IDocument *open(const QString &fileName);
     Core::IEditor *createEditor(QWidget *parent);
 
-public slots:
-    void jumpToFile();
-
 private:
     const QStringList m_mimeTypes;
     CMakeManager *m_manager;
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
index 2ae0ba66b2416a351c20c77108986cd11abd0bb0..1b9296276752a2e1ce61151e6d881a3e169a29a4 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
@@ -52,7 +52,6 @@ const char M_CONTEXT[] = "CMakeEditor.ContextMenu";
 
 // Actions
 const char SEPARATOR[]        = "CMakeEditor.Separator";
-const char JUMP_TO_FILE[]     = "CMakeEditor.JumpToFile";
 
 } // namespace Constants
 } // namespace CMakeProjectManager
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 9bea3f0d4c5c97557b8e7765df8defdce5d99a06..b18cc1dacb90c025aaf13b914e2d9198d28c4d0f 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1485,11 +1485,6 @@ CPPEditorWidget::Link CPPEditorWidget::findLinkAt(const QTextCursor &cursor,
     return Link();
 }
 
-void CPPEditorWidget::jumpToDefinition()
-{
-    openLink(findLinkAt(textCursor()));
-}
-
 Symbol *CPPEditorWidget::findDefinition(Symbol *symbol, const Snapshot &snapshot) const
 {
     if (symbol->isFunction())
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index bcdcf3e15c05589bbae5aad0310b768e083ae1db..b9a75de2ce7916f7efc517baad81fcbb17ad8d2c 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -208,7 +208,6 @@ public Q_SLOTS:
     virtual void setTabSettings(const TextEditor::TabSettings &);
     void setSortedOutline(bool sort);
     void switchDeclarationDefinition();
-    void jumpToDefinition();
     void renameSymbolUnderCursor();
     void renameUsages();
     void findUsages();
diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h
index e2aeff9d688c2f0cfbba73e1df837815429a5eb3..6ad17f0fda5354df1cab8bbd2b020753baf317ad 100644
--- a/src/plugins/cppeditor/cppeditorconstants.h
+++ b/src/plugins/cppeditor/cppeditorconstants.h
@@ -48,7 +48,6 @@ const char SEPARATOR[] = "CppEditor.Separator";
 const char SEPARATOR2[] = "CppEditor.Separator2";
 const char SEPARATOR3[] = "CppEditor.Separator3";
 const char SEPARATOR4[] = "CppEditor.Separator4";
-const char JUMP_TO_DEFINITION[] = "CppEditor.JumpToDefinition";
 const char UPDATE_CODEMODEL[] = "CppEditor.UpdateCodeModel";
 
 const int TYPE_HIERARCHY_PRIORITY = 700;
diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp
index b96205e43c4a8f851cd05a2545698a319342054e..bfc49aafdfef43f9ab240e097f20910fbb02b57f 100644
--- a/src/plugins/cppeditor/cppplugin.cpp
+++ b/src/plugins/cppeditor/cppplugin.cpp
@@ -242,12 +242,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess
     cmd = am->command(Core::Id(CppTools::Constants::SWITCH_HEADER_SOURCE));
     contextMenu->addAction(cmd);
 
-    QAction *jumpToDefinition = new QAction(tr("Follow Symbol Under Cursor"), this);
-    cmd = am->registerAction(jumpToDefinition,
-        Constants::JUMP_TO_DEFINITION, context, true);
-    cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
-    connect(jumpToDefinition, SIGNAL(triggered()),
-            this, SLOT(jumpToDefinition()));
+    cmd = am->command(TextEditor::Constants::FOLLOW_SYMBOL_UNDER_CURSOR);
     contextMenu->addAction(cmd);
     cppToolsMenu->addAction(cmd);
 
@@ -304,7 +299,8 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess
     m_actionHandler = new TextEditor::TextEditorActionHandler(CppEditor::Constants::C_CPPEDITOR,
         TextEditor::TextEditorActionHandler::Format
         | TextEditor::TextEditorActionHandler::UnCommentSelection
-        | TextEditor::TextEditorActionHandler::UnCollapseAll);
+        | TextEditor::TextEditorActionHandler::UnCollapseAll
+        | TextEditor::TextEditorActionHandler::FollowSymbolUnderCursor);
 
     m_actionHandler->initializeActions();
 
@@ -355,14 +351,6 @@ void CppPlugin::switchDeclarationDefinition()
         editor->switchDeclarationDefinition();
 }
 
-void CppPlugin::jumpToDefinition()
-{
-    Core::EditorManager *em = Core::EditorManager::instance();
-    CPPEditorWidget *editor = qobject_cast<CPPEditorWidget*>(em->currentEditor()->widget());
-    if (editor)
-        editor->jumpToDefinition();
-}
-
 void CppPlugin::renameSymbolUnderCursor()
 {
     Core::EditorManager *em = Core::EditorManager::instance();
diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h
index 3b42b0b28b216d8deb0cd3d1e3fca9e767d6a0b8..652c942d767188275bfcba4856196d96c61f13ed 100644
--- a/src/plugins/cppeditor/cppplugin.h
+++ b/src/plugins/cppeditor/cppplugin.h
@@ -83,7 +83,6 @@ public slots:
 
 private slots:
     void switchDeclarationDefinition();
-    void jumpToDefinition();
     void renameSymbolUnderCursor();
     void onTaskStarted(const QString &type);
     void onAllTasksFinished(const QString &type);
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index 350d9b58a54c1d09d700a135ff10083727f0cfdc..3253d9685beff939263671abf7c8f03913afad79 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -78,8 +78,6 @@
 #include <utils/treewidgetcolumnstretcher.h>
 #include <utils/stylehelper.h>
 
-#include <cppeditor/cppeditorconstants.h>
-
 #include <cpptools/cpptoolsconstants.h>
 
 #include <QAbstractTableModel>
@@ -895,7 +893,7 @@ FakeVimPluginPrivate::FakeVimPluginPrivate(FakeVimPlugin *plugin)
         QRegExp("^(cN(ext)?|cp(revious)?)!?( (.*))?$");
     defaultExCommandMap()["Coreplugin.OutputPane.nextitem"] =
         QRegExp("^cn(ext)?!?( (.*))?$");
-    defaultExCommandMap()[CppEditor::Constants::JUMP_TO_DEFINITION] =
+    defaultExCommandMap()[TextEditor::Constants::FOLLOW_SYMBOL_UNDER_CURSOR] =
         QRegExp("^tag?$");
     defaultExCommandMap()[Core::Constants::GO_BACK] =
         QRegExp("^pop?$");
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 78ea9cff7ba69f120423a2fd7a2ed8db27f4ed37..b2f303a0e410b3c0a6984d372343a863c46a809b 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -1387,11 +1387,6 @@ TextEditor::BaseTextEditorWidget::Link QmlJSTextEditorWidget::findLinkAt(const Q
     return Link();
 }
 
-void QmlJSTextEditorWidget::followSymbolUnderCursor()
-{
-    openLink(findLinkAt(textCursor()));
-}
-
 void QmlJSTextEditorWidget::findUsages()
 {
     m_findReferences->findUsages(editorDocument()->fileName(), textCursor().position());
diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h
index b97f327083e24e505f4ca47d980d2c754daa9114..566dc0aa60d03e34e46b35f5a1fd36cf6edd5be8 100644
--- a/src/plugins/qmljseditor/qmljseditor.h
+++ b/src/plugins/qmljseditor/qmljseditor.h
@@ -176,7 +176,6 @@ public slots:
     void reparseDocumentNow();
     void updateSemanticInfo();
     void updateSemanticInfoNow();
-    void followSymbolUnderCursor();
     void findUsages();
     void renameUsages();
     void showContextPane();
diff --git a/src/plugins/qmljseditor/qmljseditorconstants.h b/src/plugins/qmljseditor/qmljseditorconstants.h
index dda05bb967100ebd8c09d31388ac0125a7f47d46..34dccae4f45203281e7af1f10773240a9b7b954f 100644
--- a/src/plugins/qmljseditor/qmljseditorconstants.h
+++ b/src/plugins/qmljseditor/qmljseditorconstants.h
@@ -51,7 +51,6 @@ const char TASK_SEARCH[] = "QmlJSEditor.TaskSearch";
 const char SETTINGS_CATEGORY_QML[] = "J.QtQuick";
 const char SETTINGS_TR_CATEGORY_QML[] = QT_TRANSLATE_NOOP("QmlJSEditor", "Qt Quick");
 
-const char FOLLOW_SYMBOL_UNDER_CURSOR[] = "QmlJSEditor.FollowSymbolUnderCursor";
 const char FIND_USAGES[] = "QmlJSEditor.FindUsages";
 const char RENAME_USAGES[] = "QmlJSEditor.RenameUsages";
 const char RUN_SEMANTIC_SCAN[] = "QmlJSEditor.RunSemanticScan";
diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp
index 357f0dd4afdef7523206c7c3fe3be2b296e92423..5faae4381f5092515158651521f32aa67a904e9e 100644
--- a/src/plugins/qmljseditor/qmljseditorplugin.cpp
+++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp
@@ -174,7 +174,8 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e
     m_actionHandler = new TextEditor::TextEditorActionHandler(QmlJSEditor::Constants::C_QMLJSEDITOR_ID,
           TextEditor::TextEditorActionHandler::Format
         | TextEditor::TextEditorActionHandler::UnCommentSelection
-        | TextEditor::TextEditorActionHandler::UnCollapseAll);
+        | TextEditor::TextEditorActionHandler::UnCollapseAll
+        | TextEditor::TextEditorActionHandler::FollowSymbolUnderCursor);
     m_actionHandler->initializeActions();
 
     Core::ActionManager *am = Core::ICore::actionManager();
@@ -185,10 +186,7 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e
     qmlToolsMenu->addAction(createSeparator(am, this, globalContext, QmlJSEditor::Constants::SEPARATOR3));
 
     Core::Command *cmd;
-    QAction *followSymbolUnderCursorAction = new QAction(tr("Follow Symbol Under Cursor"), this);
-    cmd = am->registerAction(followSymbolUnderCursorAction, Constants::FOLLOW_SYMBOL_UNDER_CURSOR, context);
-    cmd->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
-    connect(followSymbolUnderCursorAction, SIGNAL(triggered()), this, SLOT(followSymbolUnderCursor()));
+    cmd = am->command(TextEditor::Constants::FOLLOW_SYMBOL_UNDER_CURSOR);
     contextMenu->addAction(cmd);
     qmlToolsMenu->addAction(cmd);
 
@@ -294,14 +292,6 @@ Utils::JsonSchemaManager *QmlJSEditorPlugin::jsonManager() const
     return m_jsonManager.data();
 }
 
-void QmlJSEditorPlugin::followSymbolUnderCursor()
-{
-    Core::EditorManager *em = Core::EditorManager::instance();
-
-    if (QmlJSTextEditorWidget *editor = qobject_cast<QmlJSTextEditorWidget*>(em->currentEditor()->widget()))
-        editor->followSymbolUnderCursor();
-}
-
 void QmlJSEditorPlugin::findUsages()
 {
     Core::EditorManager *em = Core::EditorManager::instance();
diff --git a/src/plugins/qmljseditor/qmljseditorplugin.h b/src/plugins/qmljseditor/qmljseditorplugin.h
index daafed94232caad9c23ffb7d7225ba60ab8c13fc..29e22f6b32ea7c7e15538e1a3cbf98d711aed666 100644
--- a/src/plugins/qmljseditor/qmljseditorplugin.h
+++ b/src/plugins/qmljseditor/qmljseditorplugin.h
@@ -100,7 +100,6 @@ public:
     Utils::JsonSchemaManager *jsonManager() const;
 
 public Q_SLOTS:
-    void followSymbolUnderCursor();
     void findUsages();
     void renameUsages();
     void reformatFile();
diff --git a/src/plugins/qt4projectmanager/profileeditor.cpp b/src/plugins/qt4projectmanager/profileeditor.cpp
index 25dfee554b12000239cf3c4068c959fc3aeecd79..0041fb9ebc0bd69465cc570e2c4e2500b8827f58 100644
--- a/src/plugins/qt4projectmanager/profileeditor.cpp
+++ b/src/plugins/qt4projectmanager/profileeditor.cpp
@@ -233,11 +233,6 @@ void ProFileEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
     highlighter->rehighlight();
 }
 
-void ProFileEditorWidget::jumpToFile()
-{
-    openLink(findLinkAt(textCursor()));
-}
-
 //
 // ProFileDocument
 //
diff --git a/src/plugins/qt4projectmanager/profileeditor.h b/src/plugins/qt4projectmanager/profileeditor.h
index e2d153041dae7d355f89dba0d52b7f1014bc9113..1d143eb7d296f1c800889f21d6d45d67d88dad5f 100644
--- a/src/plugins/qt4projectmanager/profileeditor.h
+++ b/src/plugins/qt4projectmanager/profileeditor.h
@@ -88,7 +88,6 @@ protected:
 
 public slots:
     virtual void setFontSettings(const TextEditor::FontSettings &);
-    void jumpToFile();
 
 private:
     ProFileEditorFactory *m_factory;
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
index 3568058a6990d8db1e1008b8fd9b61727dc87cb4..410e0b48eefd3d9cfa0b27c82020dbacb24affa6 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h
@@ -63,7 +63,6 @@ const char BUILDSUBDIR[] = "Qt4Builder.BuildSubDir";
 const char REBUILDSUBDIR[] = "Qt4Builder.RebuildSubDir";
 const char CLEANSUBDIR[] = "Qt4Builder.CleanSubDir";
 const char ADDLIBRARY[] = "Qt4.AddLibrary";
-const char JUMP_TO_FILE[] = "Qt4.JumpToFile";
 const char SEPARATOR[] = "Qt4.Separator";
 
 // Tasks
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
index 789c069921c3bde28627124fedb037de536ace74..5386769104b5bdd7c88cfa1c174c4490c1494c64 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp
@@ -129,7 +129,8 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString *
 
     TextEditor::TextEditorActionHandler *editorHandler
             = new TextEditor::TextEditorActionHandler(Constants::C_PROFILEEDITOR,
-                  TextEditor::TextEditorActionHandler::UnCommentSelection);
+                  TextEditor::TextEditorActionHandler::UnCommentSelection
+                  | TextEditor::TextEditorActionHandler::JumpToFileUnderCursor);
 
     m_proFileEditorFactory = new ProFileEditorFactory(m_qt4ProjectManager, editorHandler);
     addObject(m_proFileEditorFactory);
@@ -238,12 +239,7 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString *
 
     Core::Context proFileEditorContext = Core::Context(Qt4ProjectManager::Constants::C_PROFILEEDITOR);
 
-    QAction *jumpToFile = new QAction(tr("Jump to File Under Cursor"), this);
-    command = am->registerAction(jumpToFile,
-        Constants::JUMP_TO_FILE, proFileEditorContext);
-    command->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
-    connect(jumpToFile, SIGNAL(triggered()),
-            this, SLOT(jumpToFile()));
+    command = am->command(TextEditor::Constants::JUMP_TO_FILE_UNDER_CURSOR);
     contextMenu->addAction(command);
 
     m_addLibraryAction = new QAction(tr("Add Library..."), this);
@@ -369,12 +365,4 @@ void Qt4ProjectManagerPlugin::buildStateChanged(ProjectExplorer::Project *pro)
         updateRunQMakeAction();
 }
 
-void Qt4ProjectManagerPlugin::jumpToFile()
-{
-    Core::EditorManager *em = Core::EditorManager::instance();
-    ProFileEditorWidget *editor = qobject_cast<ProFileEditorWidget*>(em->currentEditor()->widget());
-    if (editor)
-        editor->jumpToFile();
-}
-
 Q_EXPORT_PLUGIN(Qt4ProjectManagerPlugin)
diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
index aa80311bf0cb2720c8742fe82a6e47eda1320280..f7c2d5995d0ca62b18f1379e58b880e168e73787 100644
--- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
+++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h
@@ -75,7 +75,6 @@ private slots:
     void updateRunQMakeAction();
     void currentNodeChanged(ProjectExplorer::Node *node);
     void buildStateChanged(ProjectExplorer::Project *pro);
-    void jumpToFile();
 
 #ifdef WITH_TESTS
     void testAbldOutputParsers_data();
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index f1dbbfbdd0271e22c65ecd29465beac0b52259ea..1e8632df049e17ba01a2e7f3b5627a60f8446415 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -1074,6 +1074,11 @@ void BaseTextEditorWidget::unindent()
     indentOrUnindent(false);
 }
 
+void BaseTextEditorWidget::openLinkUnderCursor()
+{
+    openLink(findLinkAt(textCursor()));
+}
+
 void BaseTextEditorWidget::moveLineUpDown(bool up)
 {
     QTextCursor cursor = textCursor();
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index d61ae1237b71ed9fde7f4d7c0ee05480016323ec..45f2565f2c5e556806fd36b1aae836ed9ed09ccd 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -326,6 +326,8 @@ public slots:
     void indent();
     void unindent();
 
+    void openLinkUnderCursor();
+
 signals:
     void changed();
 
diff --git a/src/plugins/texteditor/texteditoractionhandler.cpp b/src/plugins/texteditor/texteditoractionhandler.cpp
index 319e559a63e5fb33370900dd54970285a5fa2453..84747b767502f5f169c43482541fc9ec67093bfe 100644
--- a/src/plugins/texteditor/texteditoractionhandler.cpp
+++ b/src/plugins/texteditor/texteditoractionhandler.cpp
@@ -105,6 +105,8 @@ TextEditorActionHandler::TextEditorActionHandler(const char *context,
     m_lowerCaseSelectionAction(0),
     m_indentAction(0),
     m_unindentAction(0),
+    m_followSymbolAction(0),
+    m_jumpToFileAction(0),
     m_optionalActions(optionalActions),
     m_currentEditor(0),
     m_contextId(context),
@@ -395,6 +397,16 @@ void TextEditorActionHandler::createActions()
     command = am->registerAction(m_unindentAction, Constants::UNINDENT, m_contextId, true);
     connect(m_unindentAction, SIGNAL(triggered()), this, SLOT(unindent()));
 
+    m_followSymbolAction = new QAction(tr("Follow Symbol Under Cursor"), this);
+    command = am->registerAction(m_followSymbolAction, Constants::FOLLOW_SYMBOL_UNDER_CURSOR, m_contextId, true);
+    command->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
+    connect(m_followSymbolAction, SIGNAL(triggered()), this, SLOT(openLinkUnderCursor()));
+
+    m_jumpToFileAction = new QAction(tr("Jump To File Under Cursor"), this);
+    command = am->registerAction(m_jumpToFileAction, Constants::JUMP_TO_FILE_UNDER_CURSOR, m_contextId, true);
+    command->setDefaultKeySequence(QKeySequence(Qt::Key_F2));
+    connect(m_jumpToFileAction, SIGNAL(triggered()), this, SLOT(openLinkUnderCursor()));
+
     QAction *a = 0;
     a = new QAction(tr("Go to Line Start"), this);
     command = am->registerAction(a, Constants::GOTO_LINE_START, m_contextId, true);
@@ -508,6 +520,8 @@ void TextEditorActionHandler::updateActions(UpdateMode um)
         a->setEnabled(um != ReadOnlyMode);
     m_formatAction->setEnabled((m_optionalActions & Format) && um != ReadOnlyMode);
     m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection) && um != ReadOnlyMode);
+    m_followSymbolAction->setEnabled(m_optionalActions & FollowSymbolUnderCursor);
+    m_jumpToFileAction->setEnabled(m_optionalActions & JumpToFileUnderCursor);
 
     m_unfoldAllAction->setEnabled((m_optionalActions & UnCollapseAll));
     m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace);
@@ -632,6 +646,7 @@ FUNCTION(insertLineAbove)
 FUNCTION(insertLineBelow)
 FUNCTION(indent)
 FUNCTION(unindent)
+FUNCTION(openLinkUnderCursor)
 
 FUNCTION(gotoLineStart)
 FUNCTION(gotoLineStartWithSelection)
diff --git a/src/plugins/texteditor/texteditoractionhandler.h b/src/plugins/texteditor/texteditoractionhandler.h
index d0a41e0e74a089c48d077f2c9b3ffe628226fd94..27f0d485ca6ddce9b39a97db96801f4f5ce33b2e 100644
--- a/src/plugins/texteditor/texteditoractionhandler.h
+++ b/src/plugins/texteditor/texteditoractionhandler.h
@@ -63,7 +63,9 @@ public:
         None = 0,
         Format = 1,
         UnCommentSelection = 2,
-        UnCollapseAll = 4
+        UnCollapseAll = 4,
+        FollowSymbolUnderCursor = 8,
+        JumpToFileUnderCursor = 16
     };
 
     explicit TextEditorActionHandler(const char *context, uint optionalActions = None);
@@ -141,6 +143,7 @@ private slots:
     void updateCurrentEditor(Core::IEditor *editor);
     void indent();
     void unindent();
+    void openLinkUnderCursor();
 
     void gotoLineStart();
     void gotoLineStartWithSelection();
@@ -212,6 +215,8 @@ private:
     QAction *m_lowerCaseSelectionAction;
     QAction *m_indentAction;
     QAction *m_unindentAction;
+    QAction *m_followSymbolAction;
+    QAction *m_jumpToFileAction;
     QList<QAction *> m_modifyingActions;
 
     uint m_optionalActions;
diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h
index bd90e06631bebdff92145c58ac00c70aacefc3fb..0fc099368be7e69035ee36f9c5276992f03b30f0 100644
--- a/src/plugins/texteditor/texteditorconstants.h
+++ b/src/plugins/texteditor/texteditorconstants.h
@@ -105,6 +105,8 @@ const char CIRCULAR_PASTE[]        = "TextEditor.CircularPaste";
 const char SWITCH_UTF8BOM[]        = "TextEditor.SwitchUtf8bom";
 const char INDENT[]        = "TextEditor.Indent";
 const char UNINDENT[]        = "TextEditor.Unindent";
+const char FOLLOW_SYMBOL_UNDER_CURSOR[] = "TextEditor.FollowSymbolUnderCursor";
+const char JUMP_TO_FILE_UNDER_CURSOR[] = "TextEditor.JumpToFileUnderCursor";
 
 // Text color and style categories
 const char C_TEXT[]                = "Text";