diff --git a/src/linguist/linguist/mainwindow.cpp b/src/linguist/linguist/mainwindow.cpp
index f2897fbbe005aecf3c4730e5d0de68e1bd0f917b..8717bfd64756a62cb263f51a6d106009d89bb7d8 100644
--- a/src/linguist/linguist/mainwindow.cpp
+++ b/src/linguist/linguist/mainwindow.cpp
@@ -2577,6 +2577,9 @@ void MainWindow::readConfig()
     m_ui.actionVisualizeWhitespace->setChecked(
         config.value(settingPath("Options/VisualizeWhitespace"), true).toBool());
 
+    m_messageEditor->setFontSize(
+                config.value(settingPath("Options/EditorFontsize"), font().pointSize()).toReal());
+
     recentFiles().readConfig();
 
     int size = config.beginReadArray(settingPath("OpenedPhraseBooks"));
@@ -2608,6 +2611,8 @@ void MainWindow::writeConfig()
         saveState());
     recentFiles().writeConfig();
 
+    config.setValue(settingPath("Options/EditorFontsize"), m_messageEditor->fontSize());
+
     config.beginWriteArray(settingPath("OpenedPhraseBooks"),
         m_phraseBooks.size());
     for (int i = 0; i < m_phraseBooks.size(); ++i) {
@@ -2711,11 +2716,26 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
         e->acceptProposedAction();
         return true;
     } else if (event->type() == QEvent::KeyPress) {
-        if (static_cast<QKeyEvent *>(event)->key() == Qt::Key_Escape) {
+        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
+        if (ke->key() == Qt::Key_Escape) {
             if (object == m_messageEditor)
                 m_messageView->setFocus();
             else if (object == m_messagesDock)
                 m_contextView->setFocus();
+        } else if ((ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal)
+                   && (ke->modifiers() & Qt::ControlModifier)) {
+            m_messageEditor->increaseFontSize();
+        } else if (ke->key() == Qt::Key_Minus
+                   && (ke->modifiers() & Qt::ControlModifier)) {
+            m_messageEditor->decreaseFontSize();
+        }
+    } else if (event->type() == QEvent::Wheel) {
+        QWheelEvent *we = static_cast<QWheelEvent *>(event);
+        if (we->modifiers() & Qt::ControlModifier) {
+            if (we->delta() > 0)
+                m_messageEditor->increaseFontSize();
+            else
+                m_messageEditor->decreaseFontSize();
         }
     }
     return false;
diff --git a/src/linguist/linguist/messageeditor.cpp b/src/linguist/linguist/messageeditor.cpp
index 4ca5f3c2d40e96165633a72fc9c13d7308ca6ff3..8df290a67ff470eb84444fd481eda8f466adf0ae 100644
--- a/src/linguist/linguist/messageeditor.cpp
+++ b/src/linguist/linguist/messageeditor.cpp
@@ -91,6 +91,7 @@ MessageEditor::MessageEditor(MultiDataModel *dataModel, QMainWindow *parent)
       m_currentModel(-1),
       m_currentNumerus(-1),
       m_lengthVariants(false),
+      m_fontSize(font().pointSize()),
       m_undoAvail(false),
       m_redoAvail(false),
       m_cutAvail(false),
@@ -200,7 +201,7 @@ void MessageEditor::messageModelAppended()
     m_editors.append(MessageEditorData());
     MessageEditorData &ed = m_editors.last();
     ed.pluralEditMode = false;
-    ed.fontSize = font().pointSize();
+    ed.fontSize = m_fontSize;
     ed.container = new QWidget;
     if (model > 0) {
         ed.container->setPalette(paletteForModel(model));
@@ -292,12 +293,14 @@ void MessageEditor::addPluralForm(int model, const QString &label, bool writable
 
 void MessageEditor::editorCreated(QTextEdit *te)
 {
+    QFont font;
+    font.setPointSize(static_cast<int>(m_fontSize));
+
     FormMultiWidget *snd = static_cast<FormMultiWidget *>(sender());
     for (int model = 0; ; ++model) {
         MessageEditorData med = m_editors.at(model);
+        med.transCommentText->getEditor()->setFont(font);
         if (med.transTexts.contains(snd)) {
-            QFont font;
-            font.setPointSize(static_cast<int>(med.fontSize));
             te->setFont(font);
 
             te->installEventFilter(this);
@@ -504,33 +507,6 @@ MessageEditorData *MessageEditor::modelForWidget(const QObject *o)
     return 0;
 }
 
-static bool applyFont(MessageEditorData *med)
-{
-    QFont font;
-    font.setPointSize(static_cast<int>(med->fontSize));
-    for (int i = 0; i < med->transTexts.count(); ++i)
-        foreach (QTextEdit *te, med->transTexts[i]->getEditors())
-            te->setFont(font);
-    med->transCommentText->getEditor()->setFont(font);
-    return true;
-}
-
-static bool incFont(MessageEditorData *med)
-{
-    if (!med || med->fontSize >= 32)
-        return true;
-    med->fontSize *= 1.2;
-    return applyFont(med);
-}
-
-static bool decFont(MessageEditorData *med)
-{
-    if (!med || med->fontSize <= 8)
-        return true;
-    med->fontSize /= 1.2;
-    return applyFont(med);
-}
-
 bool MessageEditor::eventFilter(QObject *o, QEvent *e)
 {
     // handle copying from the source
@@ -555,25 +531,12 @@ bool MessageEditor::eventFilter(QObject *o, QEvent *e)
             }
         }
     } else if (e->type() == QEvent::KeyPress) {
+        // Ctrl-Tab is still passed through to the textedit and causes a tab to be inserted.
         QKeyEvent *ke = static_cast<QKeyEvent *>(e);
-        if (ke->modifiers() & Qt::ControlModifier) {
-            if (ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal)
-                return incFont(modelForWidget(o));
-            if (ke->key() == Qt::Key_Minus)
-                return decFont(modelForWidget(o));
-        } else {
-            // Ctrl-Tab is still passed through to the textedit and causes a tab to be inserted.
-            if (ke->key() == Qt::Key_Tab) {
-                focusNextChild();
-                return true;
-            }
-        }
-    } else if (e->type() == QEvent::Wheel) {
-        QWheelEvent *we = static_cast<QWheelEvent *>(e);
-        if (we->modifiers() & Qt::ControlModifier) {
-            if (we->delta() > 0)
-                return incFont(modelForWidget(o));
-            return decFont(modelForWidget(o));
+        if (ke->key() == Qt::Key_Tab &&
+            !(ke->modifiers() & Qt::ControlModifier)) {
+            focusNextChild();
+            return true;
         }
     } else if (e->type() == QEvent::FocusIn) {
         QWidget *widget = static_cast<QWidget *>(o);
@@ -940,4 +903,51 @@ void MessageEditor::setVisualizeWhitespace(bool value)
     }
 }
 
+void MessageEditor::setFontSize(const float fontSize)
+{
+    if (m_fontSize != fontSize) {
+        m_fontSize = fontSize;
+        applyFontSize();
+    }
+}
+
+float MessageEditor::fontSize()
+{
+    return m_fontSize;
+}
+
+void MessageEditor::applyFontSize()
+{
+    QFont font;
+    font.setPointSize(static_cast<int>(m_fontSize));
+
+    m_source->getEditor()->setFont(font);
+    m_pluralSource->getEditor()->setFont(font);
+    m_commentText->getEditor()->setFont(font);
+
+    foreach (MessageEditorData med, m_editors) {
+        for (int i = 0; i < med.transTexts.count(); ++i)
+            foreach (QTextEdit *te, med.transTexts[i]->getEditors())
+                te->setFont(font);
+        med.transCommentText->getEditor()->setFont(font);
+    }
+}
+
+void MessageEditor::increaseFontSize()
+{
+    if (m_fontSize >= 32)
+        return;
+
+    m_fontSize *= 1.2;
+    applyFontSize();
+}
+
+void MessageEditor::decreaseFontSize()
+{
+    if (m_fontSize > 8) {
+        m_fontSize /= 1.2;
+        applyFontSize();
+    }
+}
+
 QT_END_NAMESPACE
diff --git a/src/linguist/linguist/messageeditor.h b/src/linguist/linguist/messageeditor.h
index 8af58c491f293183dc70c9617ce2f897774b2b06..e966d49d8c04d67cf797d54ecb8d159118e67b43 100644
--- a/src/linguist/linguist/messageeditor.h
+++ b/src/linguist/linguist/messageeditor.h
@@ -88,6 +88,10 @@ public:
     void setUnfinishedEditorFocus();
     bool focusNextUnfinished();
     void setVisualizeWhitespace(bool value);
+    void setFontSize(const float fontSize);
+    float fontSize();
+    void increaseFontSize();
+    void decreaseFontSize();
 
 signals:
     void translationChanged(const QStringList &translations);
@@ -158,6 +162,7 @@ private:
     void addPluralForm(int model, const QString &label, bool writable);
     void fixTabOrder();
     QPalette paletteForModel(int model) const;
+    void applyFontSize();
 
     MultiDataModel *m_dataModel;
 
@@ -166,6 +171,7 @@ private:
     int m_currentNumerus;
 
     bool m_lengthVariants;
+    float m_fontSize;
 
     bool m_undoAvail;
     bool m_redoAvail;