diff --git a/src/plugins/cppeditor/cppsnippetprovider.cpp b/src/plugins/cppeditor/cppsnippetprovider.cpp
index 2d560363ab2f9a1407ed064c3b4b5083f0035173..7036959e9067f0fe02dc756423dedee5c033f0ac 100644
--- a/src/plugins/cppeditor/cppsnippetprovider.cpp
+++ b/src/plugins/cppeditor/cppsnippetprovider.cpp
@@ -62,7 +62,7 @@ QString CppSnippetProvider::displayName() const
 
 void CppSnippetProvider::decorateEditor(TextEditor::SnippetEditorWidget *editor) const
 {
-    editor->setSyntaxHighlighter(new CppHighlighter);
+    editor->textDocument()->setSyntaxHighlighter(new CppHighlighter);
     editor->textDocument()->setIndenter(new CppTools::CppQtStyleIndenter);
     editor->setAutoCompleter(new CppAutoCompleter);
 }
diff --git a/src/plugins/projectexplorer/environmentitemswidget.cpp b/src/plugins/projectexplorer/environmentitemswidget.cpp
index f0f90d9462aacde19bb7f0cccada42df58609ad0..19f6bd0e5481c605d25691bfbe44e7489409335a 100644
--- a/src/plugins/projectexplorer/environmentitemswidget.cpp
+++ b/src/plugins/projectexplorer/environmentitemswidget.cpp
@@ -71,7 +71,6 @@ EnvironmentItemsWidget::EnvironmentItemsWidget(QWidget *parent) :
     QWidget(parent), d(new EnvironmentItemsWidgetPrivate)
 {
     d->m_editor = new TextEditor::SnippetEditorWidget(this);
-    d->m_editor->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings());
     QVBoxLayout *layout = new QVBoxLayout(this);
     layout->addWidget(d->m_editor);
 }
diff --git a/src/plugins/qmljseditor/qmljssnippetprovider.cpp b/src/plugins/qmljseditor/qmljssnippetprovider.cpp
index 0766ff13e95c1aa5bc82359f54c6a517559621e6..c7e8b0cca629a757d74756b0ed083813bd90b9cb 100644
--- a/src/plugins/qmljseditor/qmljssnippetprovider.cpp
+++ b/src/plugins/qmljseditor/qmljssnippetprovider.cpp
@@ -64,7 +64,7 @@ QString QmlJSSnippetProvider::displayName() const
 
 void QmlJSSnippetProvider::decorateEditor(TextEditor::SnippetEditorWidget *editor) const
 {
-    editor->setSyntaxHighlighter(new Highlighter);
+    editor->textDocument()->setSyntaxHighlighter(new Highlighter);
     editor->textDocument()->setIndenter(new Indenter);
     editor->setAutoCompleter(new AutoCompleter);
 }
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 3f7bf287d622ddaef252d8665dfac816c448f8e9..8fd7015a363b879718a8fa2223b1513a5b525ae8 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -185,6 +185,47 @@ private:
     QSizeF m_size;
 };
 
+class TextEditExtraArea : public QWidget
+{
+public:
+    TextEditExtraArea(BaseTextEditorWidget *edit)
+        : QWidget(edit)
+    {
+        textEdit = edit;
+        setAutoFillBackground(true);
+    }
+
+protected:
+    QSize sizeHint() const {
+        return QSize(textEdit->extraAreaWidth(), 0);
+    }
+    void paintEvent(QPaintEvent *event) {
+        textEdit->extraAreaPaintEvent(event);
+    }
+    void mousePressEvent(QMouseEvent *event) {
+        textEdit->extraAreaMouseEvent(event);
+    }
+    void mouseMoveEvent(QMouseEvent *event) {
+        textEdit->extraAreaMouseEvent(event);
+    }
+    void mouseReleaseEvent(QMouseEvent *event) {
+        textEdit->extraAreaMouseEvent(event);
+    }
+    void leaveEvent(QEvent *event) {
+        textEdit->extraAreaLeaveEvent(event);
+    }
+    void contextMenuEvent(QContextMenuEvent *event) {
+        textEdit->extraAreaContextMenuEvent(event);
+    }
+
+    void wheelEvent(QWheelEvent *event) {
+        QCoreApplication::sendEvent(textEdit->viewport(), event);
+    }
+
+private:
+    BaseTextEditorWidget *textEdit;
+};
+
 class BaseTextEditorPrivate
 {
 public:
@@ -460,6 +501,9 @@ BaseTextEditorWidgetPrivate::BaseTextEditorWidgetPrivate(BaseTextEditorWidget *p
     aggregate->add(baseTextFind);
     aggregate->add(q);
 
+    m_extraArea = new TextEditExtraArea(q);
+    m_extraArea->setMouseTracking(true);
+
     m_stretchWidget = new QWidget;
     m_stretchWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
     m_toolBar = new QToolBar;
@@ -485,47 +529,6 @@ BaseTextEditorWidgetPrivate::BaseTextEditorWidgetPrivate(BaseTextEditorWidget *p
     });
 }
 
-class TextEditExtraArea : public QWidget
-{
-public:
-    TextEditExtraArea(BaseTextEditorWidget *edit)
-        : QWidget(edit)
-    {
-        textEdit = edit;
-        setAutoFillBackground(true);
-    }
-
-protected:
-    QSize sizeHint() const {
-        return QSize(textEdit->extraAreaWidth(), 0);
-    }
-    void paintEvent(QPaintEvent *event) {
-        textEdit->extraAreaPaintEvent(event);
-    }
-    void mousePressEvent(QMouseEvent *event) {
-        textEdit->extraAreaMouseEvent(event);
-    }
-    void mouseMoveEvent(QMouseEvent *event) {
-        textEdit->extraAreaMouseEvent(event);
-    }
-    void mouseReleaseEvent(QMouseEvent *event) {
-        textEdit->extraAreaMouseEvent(event);
-    }
-    void leaveEvent(QEvent *event) {
-        textEdit->extraAreaLeaveEvent(event);
-    }
-    void contextMenuEvent(QContextMenuEvent *event) {
-        textEdit->extraAreaContextMenuEvent(event);
-    }
-
-    void wheelEvent(QWheelEvent *event) {
-        QCoreApplication::sendEvent(textEdit->viewport(), event);
-    }
-
-private:
-    BaseTextEditorWidget *textEdit;
-};
-
 } // namespace Internal
 
 using namespace Internal;
@@ -566,6 +569,9 @@ static const char kTextBlockMimeType[] = "application/vnd.qtcreator.blocktext";
 BaseTextEditorWidget::BaseTextEditorWidget(QWidget *parent)
     : QPlainTextEdit(parent)
 {
+    // "Needed", as the creation below triggers ChildEvents that are
+    // passed to this object's event() which uses 'd'.
+    d = 0;
     d = new BaseTextEditorWidgetPrivate(this);
 }
 
@@ -576,8 +582,6 @@ void BaseTextEditorWidget::setTextDocument(const QSharedPointer<BaseTextDocument
 
 void BaseTextEditorWidgetPrivate::ctor(const QSharedPointer<BaseTextDocument> &doc)
 {
-    m_extraArea = new TextEditExtraArea(q);
-    m_extraArea->setMouseTracking(true);
     q->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 
     m_overlay = new TextEditorOverlay(q);
@@ -2482,12 +2486,9 @@ void BaseTextEditorWidget::convertPosition(int pos, int *line, int *column) cons
 
 bool BaseTextEditorWidget::event(QEvent *e)
 {
-#if QT_VERSION >= 0x050000
-    if (e->type() != QEvent::InputMethodQuery)
+    // FIXME: That's far too heavy, and triggers e.g for ChildEvent
+    if (d && e->type() != QEvent::InputMethodQuery)
         d->m_contentsChanged = false;
-#else
-    d->m_contentsChanged = false;
-#endif
     switch (e->type()) {
     case QEvent::ShortcutOverride:
         if (static_cast<QKeyEvent*>(e)->key() == Qt::Key_Escape && d->m_snippetOverlay->isVisible()) {
diff --git a/src/plugins/texteditor/codestyleeditor.cpp b/src/plugins/texteditor/codestyleeditor.cpp
index ebd5f493b57501b568a2898c9fefba502f8574bd..bc5f659b4b37c92845e2daf6457353148a42bc58 100644
--- a/src/plugins/texteditor/codestyleeditor.cpp
+++ b/src/plugins/texteditor/codestyleeditor.cpp
@@ -54,7 +54,6 @@ CodeStyleEditor::CodeStyleEditor(ICodeStylePreferencesFactory *factory,
     CodeStyleSelectorWidget *selector = new CodeStyleSelectorWidget(factory, this);
     selector->setCodeStyle(codeStyle);
     m_preview = new SnippetEditorWidget(this);
-    m_preview->textDocument()->setFontSettings(TextEditorSettings::fontSettings());
     DisplaySettings displaySettings = m_preview->displaySettings();
     displaySettings.m_visualizeWhitespace = true;
     m_preview->setDisplaySettings(displaySettings);
diff --git a/src/plugins/texteditor/snippets/snippeteditor.cpp b/src/plugins/texteditor/snippets/snippeteditor.cpp
index e43e578f83fd9074dbeafeaa6154500d81ce07f4..3d4dbe17d92222de744009ca55361bf35f04d29e 100644
--- a/src/plugins/texteditor/snippets/snippeteditor.cpp
+++ b/src/plugins/texteditor/snippets/snippeteditor.cpp
@@ -31,6 +31,7 @@
 
 #include <texteditor/basetextdocument.h>
 #include <texteditor/texteditorconstants.h>
+#include <texteditor/texteditorsettings.h>
 #include <utils/qtcassert.h>
 
 #include <QFocusEvent>
@@ -44,28 +45,25 @@ namespace TextEditor {
     \ingroup Snippets
 */
 
-SnippetEditor::SnippetEditor()
-{
-    addContext(Constants::SNIPPET_EDITOR_ID);
-    setEditorCreator([]() { return new SnippetEditor; });
-    setWidgetCreator([]() { return new SnippetEditorWidget; });
-    setDocumentCreator([]() { return new BaseTextDocument(Constants::SNIPPET_EDITOR_ID); });
-}
 
 SnippetEditorWidget::SnippetEditorWidget(QWidget *parent)
     : BaseTextEditorWidget(parent)
 {
+    setSimpleTextDocument(TextEditor::Constants::SNIPPET_EDITOR_ID);
+    textDocument()->setFontSettings(TextEditorSettings::fontSettings());
+
+    // Should not be necessary in this case, but the base text editor
+    // implementation assumes a valid associated editor.
+    auto dummy = new BaseTextEditor;
+    dummy->addContext(Constants::SNIPPET_EDITOR_ID);
+    dummy->setEditorWidget(this);
+
     setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
     setHighlightCurrentLine(false);
     setLineNumbersVisible(false);
     setParenthesesMatchingEnabled(true);
 }
 
-void SnippetEditorWidget::setSyntaxHighlighter(TextEditor::SyntaxHighlighter *highlighter)
-{
-    textDocument()->setSyntaxHighlighter(highlighter);
-}
-
 void SnippetEditorWidget::focusOutEvent(QFocusEvent *event)
 {
     if (event->reason() != Qt::ActiveWindowFocusReason && document()->isModified()) {
diff --git a/src/plugins/texteditor/snippets/snippeteditor.h b/src/plugins/texteditor/snippets/snippeteditor.h
index d563fd363f57350f9d9dfcf1c21f91c0f1e666af..1378129a1813d7af3ab6c06a8ad6e92df4228c2e 100644
--- a/src/plugins/texteditor/snippets/snippeteditor.h
+++ b/src/plugins/texteditor/snippets/snippeteditor.h
@@ -35,20 +35,6 @@
 
 namespace TextEditor {
 
-class SnippetEditorWidget;
-class SyntaxHighlighter;
-class Indenter;
-
-// Should not be necessary in this case, but the base text editor assumes a
-// valid editable interface.
-class TEXTEDITOR_EXPORT SnippetEditor : public BaseTextEditor
-{
-    Q_OBJECT
-
-public:
-    SnippetEditor();
-};
-
 class TEXTEDITOR_EXPORT SnippetEditorWidget : public BaseTextEditorWidget
 {
     Q_OBJECT
@@ -56,8 +42,6 @@ class TEXTEDITOR_EXPORT SnippetEditorWidget : public BaseTextEditorWidget
 public:
     SnippetEditorWidget(QWidget *parent = 0);
 
-    void setSyntaxHighlighter(SyntaxHighlighter *highlighter);
-
 signals:
     void snippetContentChanged();
 
@@ -68,6 +52,6 @@ protected:
     virtual BaseTextEditor *createEditor();
 };
 
-} // TextEditor
+} // namespace TextEditor
 
 #endif // SNIPPETEDITOR_H
diff --git a/src/plugins/texteditor/snippets/snippetssettingspage.cpp b/src/plugins/texteditor/snippets/snippetssettingspage.cpp
index b9f3d47ecab70463a80d28445a702e68b0dcaa25..f10b67ab48b7599bd98893c4191046dd719c4b6d 100644
--- a/src/plugins/texteditor/snippets/snippetssettingspage.cpp
+++ b/src/plugins/texteditor/snippets/snippetssettingspage.cpp
@@ -36,6 +36,7 @@
 #include "ui_snippetssettingspage.h"
 
 #include <coreplugin/icore.h>
+#include <texteditor/texteditorconstants.h>
 #include <texteditor/texteditorsettings.h>
 #include <extensionsystem/pluginmanager.h>
 #include <utils/headerviewstretcher.h>
@@ -336,7 +337,6 @@ void SnippetsSettingsPagePrivate::configureUi(QWidget *w)
     foreach (ISnippetProvider *provider, providers) {
         m_ui.groupCombo->addItem(provider->displayName(), provider->groupId());
         SnippetEditorWidget *snippetEditor = new SnippetEditorWidget(w);
-        snippetEditor->textDocument()->setFontSettings(TextEditorSettings::fontSettings());
         provider->decorateEditor(snippetEditor);
         m_ui.snippetsEditorStack->insertWidget(m_ui.groupCombo->count() - 1, snippetEditor);
         connect(snippetEditor, SIGNAL(snippetContentChanged()), this, SLOT(setSnippetContent()));