diff --git a/src/plugins/texteditor/ioutlinewidget.h b/src/plugins/texteditor/ioutlinewidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..1242b8535619d89a40fc11cdda2bb68d7fa42fdd
--- /dev/null
+++ b/src/plugins/texteditor/ioutlinewidget.h
@@ -0,0 +1,31 @@
+#ifndef IOUTLINEWIDGET_H
+#define IOUTLINEWIDGET_H
+
+#include <texteditor/texteditor_global.h>
+#include <QtGui/QWidget>
+
+namespace Core {
+class IEditor;
+}
+
+namespace TextEditor {
+
+class TEXTEDITOR_EXPORT IOutlineWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    IOutlineWidget(QWidget *parent = 0) : QWidget(parent) {}
+
+    virtual void setCursorSynchronization(bool syncWithCursor) = 0;
+};
+
+class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject {
+    Q_OBJECT
+public:
+    virtual bool supportsEditor(Core::IEditor *editor) const = 0;
+    virtual IOutlineWidget *createWidget(Core::IEditor *editor) = 0;
+};
+
+} // namespace TextEditor
+
+#endif // IOUTLINEWIDGET_H
diff --git a/src/plugins/texteditor/outlinefactory.cpp b/src/plugins/texteditor/outlinefactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..421c31f44072b61f66d2e9bcb9931769a3bb185f
--- /dev/null
+++ b/src/plugins/texteditor/outlinefactory.cpp
@@ -0,0 +1,123 @@
+#include "outlinefactory.h"
+#include <coreplugin/editormanager/editormanager.h>
+#include <coreplugin/editormanager/ieditor.h>
+#include <QVBoxLayout>
+#include <QDebug>
+#include <QToolButton>
+#include <QLabel>
+#include <QStackedWidget>
+
+namespace TextEditor {
+namespace Internal {
+
+OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) :
+    QStackedWidget(),
+    m_factory(factory),
+    m_syncWithEditor(true)
+{
+    QLabel *label = new QLabel(tr("No outline available"), this);
+    label->setAlignment(Qt::AlignCenter);
+    addWidget(label);
+
+    m_toggleSync = new QToolButton;
+    m_toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
+    m_toggleSync->setCheckable(true);
+    m_toggleSync->setChecked(true);
+    m_toggleSync->setToolTip(tr("Synchronize with Editor"));
+    connect(m_toggleSync, SIGNAL(clicked(bool)), this, SLOT(toggleCursorSynchronization()));
+
+    Core::EditorManager *editorManager = Core::EditorManager::instance();
+    connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)),
+            this, SLOT(updateCurrentEditor(Core::IEditor*)));
+    updateCurrentEditor(editorManager->currentEditor());
+}
+
+OutlineWidgetStack::~OutlineWidgetStack()
+{
+}
+
+QToolButton *OutlineWidgetStack::toggleSyncButton()
+{
+    return m_toggleSync;
+}
+
+bool OutlineWidgetStack::isCursorSynchronized() const
+{
+    return m_syncWithEditor;
+}
+
+void OutlineWidgetStack::toggleCursorSynchronization()
+{
+    m_syncWithEditor = !m_syncWithEditor;
+    if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget()))
+        outlineWidget->setCursorSynchronization(m_syncWithEditor);
+}
+
+void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor)
+{
+    IOutlineWidget *newWidget = 0;
+
+    if (editor) {
+        foreach (IOutlineWidgetFactory *widgetFactory, m_factory->widgetFactories()) {
+            if (widgetFactory->supportsEditor(editor)) {
+                newWidget = widgetFactory->createWidget(editor);
+                break;
+            }
+        }
+    }
+
+    if (newWidget != currentWidget()) {
+        // delete old widget
+        if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) {
+            removeWidget(outlineWidget);
+            delete outlineWidget;
+        }
+        if (newWidget) {
+            newWidget->setCursorSynchronization(m_syncWithEditor);
+            addWidget(newWidget);
+            setCurrentWidget(newWidget);
+        }
+    }
+}
+
+OutlineFactory::OutlineFactory() :
+    Core::INavigationWidgetFactory()
+{
+}
+
+QList<IOutlineWidgetFactory*> OutlineFactory::widgetFactories() const
+{
+    return m_factories;
+}
+
+void OutlineFactory::setWidgetFactories(QList<IOutlineWidgetFactory*> factories)
+{
+    m_factories = factories;
+}
+
+QString OutlineFactory::displayName() const
+{
+    return tr("Outline");
+}
+
+QString OutlineFactory::id() const
+{
+    return QLatin1String("Outline");
+}
+
+QKeySequence OutlineFactory::activationSequence() const
+{
+    return QKeySequence();
+}
+
+Core::NavigationView OutlineFactory::createWidget()
+{
+    Core::NavigationView n;
+    OutlineWidgetStack *placeHolder = new OutlineWidgetStack(this);
+    n.widget = placeHolder;
+    n.dockToolBarWidgets.append(placeHolder->toggleSyncButton());
+    return n;
+}
+
+} // namespace Internal
+} // namespace TextEditor
diff --git a/src/plugins/texteditor/outlinefactory.h b/src/plugins/texteditor/outlinefactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..c3b7b440c193896519f727818c5e246e672dbedc
--- /dev/null
+++ b/src/plugins/texteditor/outlinefactory.h
@@ -0,0 +1,63 @@
+#ifndef OUTLINE_H
+#define OUTLINE_H
+
+#include <texteditor/ioutlinewidget.h>
+#include <coreplugin/inavigationwidgetfactory.h>
+#include <QtGui/QStackedWidget>
+
+namespace Core {
+class IEditor;
+}
+
+namespace TextEditor {
+namespace Internal {
+
+class OutlineFactory;
+
+class OutlineWidgetStack : public QStackedWidget
+{
+    Q_OBJECT
+public:
+    OutlineWidgetStack(OutlineFactory *factory);
+    ~OutlineWidgetStack();
+
+    QToolButton *toggleSyncButton();
+
+private:
+    bool isCursorSynchronized() const;
+    QWidget *dummyWidget() const;
+
+private slots:
+    void toggleCursorSynchronization();
+    void updateCurrentEditor(Core::IEditor *editor);
+
+private:
+    QStackedWidget *m_widgetStack;
+    OutlineFactory *m_factory;
+    QToolButton *m_toggleSync;
+    bool m_syncWithEditor;
+};
+
+class OutlineFactory : public Core::INavigationWidgetFactory
+{
+    Q_OBJECT
+public:
+    OutlineFactory();
+
+    QList<IOutlineWidgetFactory*> widgetFactories() const;
+    void setWidgetFactories(QList<IOutlineWidgetFactory*> factories);
+
+    // from INavigationWidgetFactory
+    virtual QString displayName() const;
+    virtual QString id() const;
+    virtual QKeySequence activationSequence() const;
+    virtual Core::NavigationView createWidget();
+
+private:
+    QList<IOutlineWidgetFactory*> m_factories;
+};
+
+} // namespace Internal
+} // namespace TextEditor
+
+#endif // OUTLINE_H
diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro
index 65bc255c935db20050d6c0ab1c39ec499c345b34..931f5614903fb7b26adadd725989b337e23da659 100644
--- a/src/plugins/texteditor/texteditor.pro
+++ b/src/plugins/texteditor/texteditor.pro
@@ -60,7 +60,8 @@ SOURCES += texteditorplugin.cpp \
     generichighlighter/highlightdefinitionmetadata.cpp \
     generichighlighter/definitiondownloader.cpp \
     refactoringchanges.cpp \
-    refactoroverlay.cpp
+    refactoroverlay.cpp \
+    outlinefactory.cpp
 
 HEADERS += texteditorplugin.h \
     textfilewizard.h \
@@ -123,7 +124,9 @@ HEADERS += texteditorplugin.h \
     generichighlighter/highlightdefinitionmetadata.h \
     generichighlighter/definitiondownloader.h \
     refactoringchanges.h \
-    refactoroverlay.h
+    refactoroverlay.h \
+    outlinefactory.h \
+    ioutlinewidget.h
 
 FORMS += behaviorsettingspage.ui \
     displaysettingspage.ui \
diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp
index 633bde6f0d7c0afcee6a77c7cbd9ecdd5a0e9015..e314ae3de35f4984483cbe48044e1c477384f994 100644
--- a/src/plugins/texteditor/texteditorplugin.cpp
+++ b/src/plugins/texteditor/texteditorplugin.cpp
@@ -40,6 +40,7 @@
 #include "plaintexteditor.h"
 #include "storagesettings.h"
 #include "manager.h"
+#include "outlinefactory.h"
 
 #include <coreplugin/icore.h>
 #include <coreplugin/coreconstants.h>
@@ -144,6 +145,9 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
     connect(Core::ICore::instance(), SIGNAL(coreOpened()),
             Manager::instance(), SLOT(registerMimeTypes()));
 
+    m_outlineFactory = new OutlineFactory;
+    addAutoReleasedObject(m_outlineFactory);
+
     return true;
 }
 
@@ -151,7 +155,11 @@ void TextEditorPlugin::extensionsInitialized()
 {
     m_editorFactory->actionHandler()->initializeActions();
 
-    m_searchResultWindow = ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>();
+    ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+
+    m_searchResultWindow = pluginManager->getObject<Find::SearchResultWindow>();
+
+    m_outlineFactory->setWidgetFactories(pluginManager->getObjects<TextEditor::IOutlineWidgetFactory>());
 
     connect(m_settings, SIGNAL(fontSettingsChanged(TextEditor::FontSettings)),
             this, SLOT(updateSearchResultsFont(TextEditor::FontSettings)));
@@ -162,6 +170,7 @@ void TextEditorPlugin::extensionsInitialized()
         ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
     addAutoReleasedObject(new FindInCurrentFile(
         ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
+
 }
 
 void TextEditorPlugin::initializeEditor(PlainTextEditor *editor)
diff --git a/src/plugins/texteditor/texteditorplugin.h b/src/plugins/texteditor/texteditorplugin.h
index 93f8870e1fd480551b2b43514745b923d7f4e525..cb57ab2df594873a72d18b2d075699c5058d7b32 100644
--- a/src/plugins/texteditor/texteditorplugin.h
+++ b/src/plugins/texteditor/texteditorplugin.h
@@ -47,6 +47,7 @@ namespace Internal {
 
 class LineNumberFilter;
 class PlainTextEditorFactory;
+class OutlineFactory;
 
 class TextEditorPlugin : public ExtensionSystem::IPlugin
 {
@@ -79,6 +80,7 @@ private:
     PlainTextEditorFactory *m_editorFactory;
     LineNumberFilter *m_lineNumberFilter;
     Find::SearchResultWindow *m_searchResultWindow;
+    OutlineFactory *m_outlineFactory;
 };
 
 } // namespace Internal