diff --git a/src/plugins/android/androidmanifestdocument.cpp b/src/plugins/android/androidmanifestdocument.cpp
index 26746433f6d4b524148873c9063c040ec97babbd..6ba9dc17db3f6f24a6e37b92ccbc0b58ee8959d8 100644
--- a/src/plugins/android/androidmanifestdocument.cpp
+++ b/src/plugins/android/androidmanifestdocument.cpp
@@ -41,7 +41,7 @@ using namespace Android::Internal;
 
 
 AndroidManifestDocument::AndroidManifestDocument(AndroidManifestEditorWidget *editorWidget)
-    : TextEditor::BaseTextDocument(),
+    : TextEditor::PlainTextDocument(),
       m_editorWidget(editorWidget)
 {
     setMimeType(QLatin1String(Constants::ANDROID_MANIFEST_MIME_TYPE));
diff --git a/src/plugins/android/androidmanifestdocument.h b/src/plugins/android/androidmanifestdocument.h
index 1a674751c1e37d7e29e5991ba918701180546273..3fa3369941c21d923b4659f69674f4b025f6af28 100644
--- a/src/plugins/android/androidmanifestdocument.h
+++ b/src/plugins/android/androidmanifestdocument.h
@@ -31,13 +31,13 @@
 #define ANDROIDMANIFESTDOCUMENT_H
 
 #include <coreplugin/textdocument.h>
-#include <texteditor/basetextdocument.h>
+#include <texteditor/plaintexteditor.h>
 
 namespace Android {
 namespace Internal {
 class AndroidManifestEditorWidget;
 
-class AndroidManifestDocument : public TextEditor::BaseTextDocument
+class AndroidManifestDocument : public TextEditor::PlainTextDocument
 {
 public:
     explicit AndroidManifestDocument(AndroidManifestEditorWidget *editorWidget);
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 933f18a22dcca462dc1f875941aa358e146535f5..1d91d128f5bbcc76c925d0588bdd6d95aee249d0 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -512,7 +512,7 @@ CPPEditor::CPPEditor(CPPEditorWidget *editor)
 Q_GLOBAL_STATIC(CppTools::SymbolFinder, symbolFinder)
 
 CPPEditorWidget::CPPEditorWidget(QWidget *parent)
-    : TextEditor::BaseTextEditorWidget(parent)
+    : TextEditor::BaseTextEditorWidget(new CPPEditorDocument(), parent)
 {
     baseTextDocument()->setIndenter(new CppTools::CppQtStyleIndenter);
     ctor();
@@ -1583,14 +1583,6 @@ void CPPEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
     highlighter->rehighlight();
 }
 
-void CPPEditorWidget::setTabSettings(const TextEditor::TabSettings &ts)
-{
-    CppTools::QtStyleCodeFormatter formatter;
-    formatter.invalidateCache(document());
-
-    TextEditor::BaseTextEditorWidget::setTabSettings(ts);
-}
-
 void CPPEditorWidget::unCommentSelection()
 {
     Utils::unCommentSelection(this);
@@ -2027,4 +2019,16 @@ void CPPEditorWidget::showPreProcessorWidget()
     }
 }
 
+CPPEditorDocument::CPPEditorDocument()
+{
+    connect(this, SIGNAL(tabSettingsChanged()),
+            this, SLOT(invalidateFormatterCache()));
+}
+
+void CPPEditorDocument::invalidateFormatterCache()
+{
+    CppTools::QtStyleCodeFormatter formatter;
+    formatter.invalidateCache(document());
+}
+
 #include <cppeditor.moc>
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 5e8fc642d62385fb425053bf3b3119547f5ce431..62ade9bfb99a219a709219d66a05e801fdc943d8 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -71,6 +71,16 @@ namespace Internal {
 
 class CPPEditorWidget;
 
+class CPPEditorDocument : public TextEditor::BaseTextDocument
+{
+    Q_OBJECT
+public:
+    CPPEditorDocument();
+
+private slots:
+    void invalidateFormatterCache();
+};
+
 class CPPEditor : public TextEditor::BaseTextEditor
 {
     Q_OBJECT
@@ -136,7 +146,6 @@ Q_SIGNALS:
 
 public Q_SLOTS:
     virtual void setFontSettings(const TextEditor::FontSettings &);
-    virtual void setTabSettings(const TextEditor::TabSettings &);
     void setSortedOutline(bool sort);
     void switchDeclarationDefinition(bool inNextSplit);
     void renameSymbolUnderCursor();
diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp
index 33504d37498e9f82d64dc92b8690d114fcffd7f8..3e71c6d396b91fbdca1e03f43b6efbe59f092d27 100644
--- a/src/plugins/cpptools/cppcodestylesettingspage.cpp
+++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp
@@ -465,7 +465,7 @@ void CppCodeStylePreferencesWidget::updatePreview()
     const TextEditor::TabSettings ts = cppCodeStylePreferences->currentTabSettings();
     QtStyleCodeFormatter formatter(ts, ccss);
     foreach (TextEditor::SnippetEditorWidget *preview, m_previews) {
-        preview->setTabSettings(ts);
+        preview->baseTextDocument()->setTabSettings(ts);
         preview->setCodeStyle(cppCodeStylePreferences);
 
         QTextDocument *doc = preview->document();
diff --git a/src/plugins/designer/formwindowfile.h b/src/plugins/designer/formwindowfile.h
index a894edee9d6076333981c180601307f74856fa5e..c1ba0236074eb6dd35d5530d9d077679d16c9313 100644
--- a/src/plugins/designer/formwindowfile.h
+++ b/src/plugins/designer/formwindowfile.h
@@ -30,7 +30,7 @@
 #ifndef FORMWINDOWFILE_H
 #define FORMWINDOWFILE_H
 
-#include <texteditor/basetextdocument.h>
+#include <texteditor/plaintexteditor.h>
 
 #include <QPointer>
 
@@ -42,7 +42,7 @@ QT_END_NAMESPACE
 namespace Designer {
 namespace Internal {
 
-class FormWindowFile : public TextEditor::BaseTextDocument
+class FormWindowFile : public TextEditor::PlainTextDocument
 {
     Q_OBJECT
 
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index c8be9e23cf6f39e72cce33b57bb319458fedc518..69771e0fd774ed10c275a8cd2dbf6f9db90465da 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -761,6 +761,18 @@ void QmlJSTextEditorWidget::updateOutlineIndexNow()
     }
 }
 
+QmlJSEditorDocument::QmlJSEditorDocument()
+{
+    connect(this, SIGNAL(tabSettingsChanged()),
+            this, SLOT(invalidateFormatterCache()));
+}
+
+void QmlJSEditorDocument::invalidateFormatterCache()
+{
+    QmlJSTools::CreatorCodeFormatter formatter(tabSettings());
+    formatter.invalidateCache(document());
+}
+
 } // namespace QmlJSEditor
 
 class QtQuickToolbarMarker {};
@@ -1286,14 +1298,6 @@ void QmlJSTextEditorWidget::unCommentSelection()
     Utils::unCommentSelection(this);
 }
 
-void QmlJSTextEditorWidget::setTabSettings(const TextEditor::TabSettings &ts)
-{
-    QmlJSTools::CreatorCodeFormatter formatter(ts);
-    formatter.invalidateCache(document());
-
-    TextEditor::BaseTextEditorWidget::setTabSettings(ts);
-}
-
 void QmlJSTextEditorWidget::updateSemanticInfo()
 {
     // If the editor is newer than the future semantic info, new semantic infos
diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h
index 4880ab0988bb81a81522df66d4d6b4b56a8683ac..aa9a24a36032e792415bd26e0db92f7cc6053025 100644
--- a/src/plugins/qmljseditor/qmljseditor.h
+++ b/src/plugins/qmljseditor/qmljseditor.h
@@ -73,6 +73,16 @@ class QmlOutlineModel;
 class SemanticInfoUpdater;
 struct SemanticInfoUpdaterSource;
 class SemanticHighlighter;
+
+class QmlJSEditorDocument : public TextEditor::BaseTextDocument
+{
+    Q_OBJECT
+public:
+    QmlJSEditorDocument();
+private slots:
+    void invalidateFormatterCache();
+};
+
 } // namespace Internal
 
 struct QMLJSEDITOR_EXPORT Declaration
@@ -118,7 +128,6 @@ public:
     TextEditor::IAssistInterface *createAssistInterface(TextEditor::AssistKind assistKind,
                                                         TextEditor::AssistReason reason) const;
 public slots:
-    virtual void setTabSettings(const TextEditor::TabSettings &ts);
     void reparseDocument();
     void reparseDocumentNow();
     void updateSemanticInfo();
diff --git a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp
index e4094a3ac7fa4480c1795fe8a851de36503841c5..61480214fb52c94281fb4172b731dc1a0d022b67 100644
--- a/src/plugins/qmljstools/qmljscodestylesettingspage.cpp
+++ b/src/plugins/qmljstools/qmljscodestylesettingspage.cpp
@@ -131,7 +131,7 @@ void QmlJSCodeStylePreferencesWidget::updatePreview()
     const TextEditor::TabSettings &ts = m_preferences
             ? m_preferences->currentTabSettings()
             : TextEditorSettings::codeStyle()->tabSettings();
-    m_ui->previewTextEdit->setTabSettings(ts);
+    m_ui->previewTextEdit->baseTextDocument()->setTabSettings(ts);
     CreatorCodeFormatter formatter(ts);
     formatter.invalidateCache(doc);
 
diff --git a/src/plugins/texteditor/basetextdocument.cpp b/src/plugins/texteditor/basetextdocument.cpp
index 510230d6ec0d89c856da0115c86fafe33777b988..5fb119e81eb8b627d6f26c090a1d0a6044743628 100644
--- a/src/plugins/texteditor/basetextdocument.cpp
+++ b/src/plugins/texteditor/basetextdocument.cpp
@@ -209,9 +209,12 @@ const StorageSettings &BaseTextDocument::storageSettings() const
     return d->m_storageSettings;
 }
 
-void BaseTextDocument::setTabSettings(const TabSettings &tabSettings)
+void BaseTextDocument::setTabSettings(const TextEditor::TabSettings &tabSettings)
 {
+    if (tabSettings == d->m_tabSettings)
+        return;
     d->m_tabSettings = tabSettings;
+    emit tabSettingsChanged();
 }
 
 const TabSettings &BaseTextDocument::tabSettings() const
diff --git a/src/plugins/texteditor/basetextdocument.h b/src/plugins/texteditor/basetextdocument.h
index b629d67ba92f44d01252646a1dbc807a42d962ed..83d7e8ae3d7f975af89ceaaad5e3281d7303dee8 100644
--- a/src/plugins/texteditor/basetextdocument.h
+++ b/src/plugins/texteditor/basetextdocument.h
@@ -65,7 +65,6 @@ public:
 
     void setTypingSettings(const TypingSettings &typingSettings);
     void setStorageSettings(const StorageSettings &storageSettings);
-    void setTabSettings(const TabSettings &tabSettings);
     void setExtraEncodingSettings(const ExtraEncodingSettings &extraEncodingSettings);
 
     const TypingSettings &typingSettings() const;
@@ -111,8 +110,12 @@ public:
     bool reload(QString *errorString, QTextCodec *codec);
     void cleanWhitespace(const QTextCursor &cursor);
 
+public slots:
+    void setTabSettings(const TextEditor::TabSettings &tabSettings);
+
 signals:
     void mimeTypeChanged();
+    void tabSettingsChanged();
 
 private:
     void cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, bool inEntireDocument);
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 32f1bc29a492a5cd597b65603a9b9c41516fe7e0..33222707366dad322754279fcff55fa8b309912b 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -2395,6 +2395,7 @@ void BaseTextEditorWidgetPrivate::setupDocumentSignals()
         SLOT(editorContentsChange(int,int,int)), Qt::DirectConnection);
     QObject::connect(m_document.data(), SIGNAL(aboutToReload()), q, SLOT(documentAboutToBeReloaded()));
     QObject::connect(m_document.data(), SIGNAL(reloadFinished(bool)), q, SLOT(documentReloadFinished(bool)));
+    QObject::connect(m_document.data(), SIGNAL(tabSettingsChanged()), q, SLOT(updateTabStops()));
     q->slotUpdateExtraAreaWidth();
 }
 
@@ -4430,17 +4431,17 @@ void BaseTextEditorWidget::setCodeStyle(ICodeStylePreferences *preferences)
     baseTextDocument()->indenter()->setCodeStylePreferences(preferences);
     if (d->m_codeStylePreferences) {
         disconnect(d->m_codeStylePreferences, SIGNAL(currentTabSettingsChanged(TextEditor::TabSettings)),
-                this, SLOT(setTabSettings(TextEditor::TabSettings)));
+                d->m_document.data(), SLOT(setTabSettings(TextEditor::TabSettings)));
         disconnect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)),
                 this, SLOT(slotCodeStyleSettingsChanged(QVariant)));
     }
     d->m_codeStylePreferences = preferences;
     if (d->m_codeStylePreferences) {
         connect(d->m_codeStylePreferences, SIGNAL(currentTabSettingsChanged(TextEditor::TabSettings)),
-                this, SLOT(setTabSettings(TextEditor::TabSettings)));
+                d->m_document.data(), SLOT(setTabSettings(TextEditor::TabSettings)));
         connect(d->m_codeStylePreferences, SIGNAL(currentValueChanged(QVariant)),
                 this, SLOT(slotCodeStyleSettingsChanged(QVariant)));
-        setTabSettings(d->m_codeStylePreferences->currentTabSettings());
+        d->m_document->setTabSettings(d->m_codeStylePreferences->currentTabSettings());
         slotCodeStyleSettingsChanged(d->m_codeStylePreferences->currentValue());
     }
 }
@@ -5401,7 +5402,7 @@ void BaseTextEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
     p.setBrush(QPalette::Inactive, QPalette::HighlightedText, p.highlightedText());
     setPalette(p);
     setFont(font);
-    setTabSettings(d->m_document->tabSettings()); // update tabs, they depend on the font
+    updateTabStops(); // update tab stops, they depend on the font
 
     // Line numbers
     QPalette ep = d->m_extraArea->palette();
@@ -5432,18 +5433,6 @@ void BaseTextEditorWidget::setFontSettings(const TextEditor::FontSettings &fs)
     }
 }
 
-void BaseTextEditorWidget::setTabSettings(const TabSettings &ts)
-{
-    d->m_document->setTabSettings(ts);
-
-    // Although the tab stop is stored as qreal the API from QPlainTextEdit only allows it
-    // to be set as an int. A work around is to access directly the QTextOption.
-    qreal charWidth = QFontMetricsF(font()).width(QLatin1Char(' '));
-    QTextOption option = document()->defaultTextOption();
-    option.setTabStop(charWidth * ts.m_tabSize);
-    document()->setDefaultTextOption(option);
-}
-
 void BaseTextEditorWidget::setDisplaySettings(const DisplaySettings &ds)
 {
     setLineWrapMode(ds.m_textWrapping ? QPlainTextEdit::WidgetWidth : QPlainTextEdit::NoWrap);
@@ -6306,6 +6295,16 @@ void BaseTextEditorWidget::handleBlockSelection(int diff_row, int diff_col)
 
 }
 
+void BaseTextEditorWidget::updateTabStops()
+{
+    // Although the tab stop is stored as qreal the API from QPlainTextEdit only allows it
+    // to be set as an int. A work around is to access directly the QTextOption.
+    qreal charWidth = QFontMetricsF(font()).width(QLatin1Char(' '));
+    QTextOption option = document()->defaultTextOption();
+    option.setTabStop(charWidth * d->m_document->tabSettings().m_tabSize);
+    document()->setDefaultTextOption(option);
+}
+
 int BaseTextEditorWidget::columnCount() const
 {
     QFontMetricsF fm(font());
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index 9cffec5b04a14932b6cb84c377bcc1a8b852cbf5..3af8db4847d7db8b09fb752ad43f01ece961956c 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -414,7 +414,6 @@ public slots:
     virtual void unCommentSelection();
     virtual void setFontSettings(const TextEditor::FontSettings &);
     void setFontSettingsIfVisible(const TextEditor::FontSettings &);
-    virtual void setTabSettings(const TextEditor::TabSettings &);
     virtual void setDisplaySettings(const TextEditor::DisplaySettings &);
     virtual void setMarginSettings(const TextEditor::MarginSettings &);
     virtual void setBehaviorSettings(const TextEditor::BehaviorSettings &);
@@ -547,6 +546,7 @@ private:
 
 private slots:
     void handleBlockSelection(int diff_row, int diff_col);
+    void updateTabStops();
 
     // parentheses matcher
     void _q_matchParentheses();
diff --git a/src/plugins/texteditor/plaintexteditor.cpp b/src/plugins/texteditor/plaintexteditor.cpp
index 2beb3c538dedad9ab19ce80842ee479ad7c9faa9..335028a30905ac9bb1e32f2868388ae7d4c2c67c 100644
--- a/src/plugins/texteditor/plaintexteditor.cpp
+++ b/src/plugins/texteditor/plaintexteditor.cpp
@@ -58,14 +58,14 @@ PlainTextEditor::PlainTextEditor(PlainTextEditorWidget *editor)
 }
 
 PlainTextEditorWidget::PlainTextEditorWidget(QWidget *parent)
-  : BaseTextEditorWidget(parent)
+  : BaseTextEditorWidget(new PlainTextDocument(), parent)
 {
     // Currently only "normal" indentation is supported.
     baseTextDocument()->setIndenter(new NormalIndenter);
     ctor();
 }
 
-PlainTextEditorWidget::PlainTextEditorWidget(BaseTextDocument *doc, QWidget *parent)
+PlainTextEditorWidget::PlainTextEditorWidget(PlainTextDocument *doc, QWidget *parent)
     : BaseTextEditorWidget(doc, parent)
 {
     ctor();
@@ -111,17 +111,6 @@ void PlainTextEditorWidget::unCommentSelection()
     Utils::unCommentSelection(this, m_commentDefinition);
 }
 
-void PlainTextEditorWidget::setTabSettings(const TextEditor::TabSettings &ts)
-{
-    BaseTextEditorWidget::setTabSettings(ts);
-
-    if (baseTextDocument()->syntaxHighlighter()) {
-        Highlighter *highlighter =
-            static_cast<Highlighter *>(baseTextDocument()->syntaxHighlighter());
-        highlighter->setTabSettings(ts);
-    }
-}
-
 void PlainTextEditorWidget::configure()
 {
     MimeType mimeType;
@@ -188,4 +177,15 @@ void PlainTextEditorWidget::acceptMissingSyntaxDefinitionInfo()
                              Constants::TEXT_EDITOR_HIGHLIGHTER_SETTINGS);
 }
 
+PlainTextDocument::PlainTextDocument()
+{
+    connect(this, SIGNAL(tabSettingsChanged()), this, SLOT(updateTabSettings()));
+}
+
+void PlainTextDocument::updateTabSettings()
+{
+    if (Highlighter *highlighter = qobject_cast<Highlighter *>(syntaxHighlighter()))
+        highlighter->setTabSettings(tabSettings());
+}
+
 } // namespace TextEditor
diff --git a/src/plugins/texteditor/plaintexteditor.h b/src/plugins/texteditor/plaintexteditor.h
index e56b552bd637e4b91d442f37cb62117cdcae5fd6..ca620afd91b8936a45d50eac7ddccb22f289f7e5 100644
--- a/src/plugins/texteditor/plaintexteditor.h
+++ b/src/plugins/texteditor/plaintexteditor.h
@@ -54,13 +54,22 @@ public:
     Core::Id id() const;
 };
 
+class TEXTEDITOR_EXPORT PlainTextDocument : public BaseTextDocument
+{
+    Q_OBJECT
+public:
+    PlainTextDocument();
+private slots:
+    void updateTabSettings();
+};
+
 class TEXTEDITOR_EXPORT PlainTextEditorWidget : public BaseTextEditorWidget
 {
     Q_OBJECT
 
 public:
     PlainTextEditorWidget(QWidget *parent = 0);
-    PlainTextEditorWidget(BaseTextDocument *doc, QWidget *parent = 0);
+    PlainTextEditorWidget(PlainTextDocument *doc, QWidget *parent = 0);
     PlainTextEditorWidget(PlainTextEditorWidget *other);
 
     void configure(const QString& mimeType);
@@ -69,7 +78,6 @@ public:
 
 public slots:
     virtual void unCommentSelection();
-    virtual void setTabSettings(const TextEditor::TabSettings &);
 
 private slots:
     void configure();
@@ -83,6 +91,7 @@ protected:
 
 private:
     PlainTextEditorWidget(TextEditor::BaseTextEditorWidget *); // avoid stupidity
+    PlainTextEditorWidget(BaseTextDocument *, QWidget *); //avoid stupidity
     void ctor();
 
     bool m_isMissingSyntaxDefinition;
diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp
index 53ffe28bd5a8b609562136e7f3f046260fe2aac8..c3361ad419ca6774e467cd15be9d8f8ed5333e4d 100644
--- a/src/plugins/texteditor/texteditorsettings.cpp
+++ b/src/plugins/texteditor/texteditorsettings.cpp
@@ -356,9 +356,9 @@ void TextEditorSettings::initializeEditor(BaseTextEditorWidget *editor)
     connect(editor, SIGNAL(requestZoomReset()),
             m_instance, SLOT(zoomResetRequested()));
 
-    // Apply current settings (tab settings depend on font settings)
+    // Apply current settings
     editor->setFontSettings(fontSettings());
-    editor->setTabSettings(codeStyle()->tabSettings());
+    editor->baseTextDocument()->setTabSettings(codeStyle()->tabSettings()); // also set through code style ???
     editor->setTypingSettings(typingSettings());
     editor->setStorageSettings(storageSettings());
     editor->setBehaviorSettings(behaviorSettings());