diff --git a/src/plugins/texteditor/colorscheme.cpp b/src/plugins/texteditor/colorscheme.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..364342904ed2c67fd32c15e6a53719da7f4bab93
--- /dev/null
+++ b/src/plugins/texteditor/colorscheme.cpp
@@ -0,0 +1,189 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+**
+**************************************************************************/
+
+#include "colorscheme.h"
+
+#include <QtCore/QFile>
+#include <QtXml/QXmlStreamWriter>
+
+using namespace TextEditor;
+
+static const char *trueString = "true";
+static const char *falseString = "false";
+
+// Format
+
+Format::Format() :
+    m_foreground(Qt::black),
+    m_background(Qt::white),
+    m_bold(false),
+    m_italic(false)
+{
+}
+
+void Format::setForeground(const QColor &foreground)
+{
+    m_foreground = foreground;
+}
+
+void Format::setBackground(const QColor &background)
+{
+    m_background = background;
+}
+
+void Format::setBold(bool bold)
+{
+    m_bold = bold;
+}
+
+void Format::setItalic(bool italic)
+{
+    m_italic = italic;
+}
+
+static QString colorToString(const QColor &color)
+{
+    if (color.isValid())
+        return color.name();
+    return QLatin1String("invalid");
+}
+
+static QColor stringToColor(const QString &string)
+{
+    if (string == QLatin1String("invalid"))
+        return QColor();
+    return QColor(string);
+}
+
+bool Format::equals(const Format &f) const
+{
+    return m_foreground ==  f.m_foreground && m_background == f.m_background &&
+           m_bold == f.m_bold && m_italic == f.m_italic;
+}
+
+QString Format::toString() const
+{
+    const QChar delimiter = QLatin1Char(';');
+    QString s =  colorToString(m_foreground);
+    s += delimiter;
+    s += colorToString(m_background);
+    s += delimiter;
+    s += m_bold   ? QLatin1String(trueString) : QLatin1String(falseString);
+    s += delimiter;
+    s += m_italic ? QLatin1String(trueString) : QLatin1String(falseString);
+    return s;
+}
+
+bool Format::fromString(const QString &str)
+{
+    *this = Format();
+
+    const QStringList lst = str.split(QLatin1Char(';'));
+    if (lst.count() != 4)
+        return false;
+
+    m_foreground = stringToColor(lst.at(0));
+    m_background = stringToColor(lst.at(1));
+    m_bold = lst.at(2) == QLatin1String(trueString);
+    m_italic = lst.at(3) == QLatin1String(trueString);
+    return true;
+}
+
+
+// ColorScheme
+
+ColorScheme::ColorScheme()
+{
+}
+
+bool ColorScheme::contains(const QString &category) const
+{
+    return m_formats.contains(category);
+}
+
+Format &ColorScheme::formatFor(const QString &category)
+{
+    return m_formats[category];
+}
+
+Format ColorScheme::formatFor(const QString &category) const
+{
+    return m_formats.value(category);
+}
+
+void ColorScheme::setFormatFor(const QString &category, const Format &format)
+{
+    m_formats[category] = format;
+}
+
+void ColorScheme::clear()
+{
+    m_formats.clear();
+}
+
+bool ColorScheme::save(const QString &fileName)
+{
+    QFile file(fileName);
+    if (!file.open(QIODevice::WriteOnly))
+        return false;
+
+    QXmlStreamWriter w(&file);
+    w.setAutoFormatting(true);
+    w.setAutoFormattingIndent(2);
+
+    w.writeStartDocument();
+    w.writeStartElement(QLatin1String("style-scheme"));
+    w.writeAttribute(QLatin1String("version"), QLatin1String("1.0"));
+
+    QMapIterator<QString, Format> i(m_formats);
+    while (i.hasNext()) {
+        const Format &format = i.next().value();
+        w.writeStartElement(QLatin1String("style"));
+        w.writeAttribute(QLatin1String("name"), i.key());
+        w.writeAttribute(QLatin1String("foreground"), format.foreground().name().toLower());
+        if (format.background().isValid())
+            w.writeAttribute(QLatin1String("background"), format.background().name().toLower());
+        if (format.bold())
+            w.writeAttribute(QLatin1String("bold"), QLatin1String(trueString));
+        if (format.italic())
+            w.writeAttribute(QLatin1String("italic"), QLatin1String(trueString));
+        w.writeEndElement();
+    }
+
+    w.writeEndElement();
+    w.writeEndDocument();
+
+    return true;
+}
+
+bool ColorScheme::load(const QString &fileName)
+{
+    Q_UNUSED(fileName)
+    return false;
+}
diff --git a/src/plugins/texteditor/colorscheme.h b/src/plugins/texteditor/colorscheme.h
new file mode 100644
index 0000000000000000000000000000000000000000..e333d6b128a969988f7cc55cfb7a14a4b2c59070
--- /dev/null
+++ b/src/plugins/texteditor/colorscheme.h
@@ -0,0 +1,108 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+**
+**************************************************************************/
+
+#ifndef COLORSCHEME_H
+#define COLORSCHEME_H
+
+#include "texteditor_global.h"
+
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtGui/QColor>
+#include <QtGui/QTextCharFormat>
+
+namespace TextEditor {
+
+/*! Format for a particular piece of text (text/comment, etc). */
+class TEXTEDITOR_EXPORT Format
+{
+public:
+    Format();
+
+    QColor foreground() const { return m_foreground; }
+    void setForeground(const QColor &foreground);
+
+    QColor background() const { return m_background; }
+    void setBackground(const QColor &background);
+
+    bool bold() const { return m_bold; }
+    void setBold(bool bold);
+
+    bool italic() const { return m_italic; }
+    void setItalic(bool italic);
+
+    bool equals(const Format &f) const;
+
+    QString toString() const;
+    bool fromString(const QString &str);
+
+private:
+    QColor m_foreground;
+    QColor m_background;
+    bool m_bold;
+    bool m_italic;
+};
+
+inline bool operator==(const Format &f1, const Format &f2) { return f1.equals(f2); }
+inline bool operator!=(const Format &f1, const Format &f2) { return !f1.equals(f2); }
+
+
+/*! A color scheme combines a set of formats for different highlighting
+    categories. It also provides saving and loading of the scheme to a file.
+ */
+class ColorScheme
+{
+public:
+    ColorScheme();
+
+    bool contains(const QString &category) const;
+
+    Format &formatFor(const QString &category);
+    Format formatFor(const QString &category) const;
+
+    void setFormatFor(const QString &category, const Format &format);
+
+    void clear();
+
+    bool save(const QString &fileName);
+    bool load(const QString &fileName);
+
+    inline bool equals(const ColorScheme &cs) const
+    { return m_formats == cs.m_formats; }
+
+private:
+    QMap<QString, Format> m_formats;
+};
+
+inline bool operator==(const ColorScheme &cs1, const ColorScheme &cs2) { return cs1.equals(cs2); }
+inline bool operator!=(const ColorScheme &cs1, const ColorScheme &cs2) { return !cs1.equals(cs2); }
+
+} // namespace TextEditor
+
+#endif // COLORSCHEME_H
diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp
index e8c2bcd1047e06f82e50f770ff185f6d841541f3..cd0fd2586c90874380d23eacb1655a155d543b5d 100644
--- a/src/plugins/texteditor/fontsettings.cpp
+++ b/src/plugins/texteditor/fontsettings.cpp
@@ -38,8 +38,6 @@
 static const char *fontFamilyKey = "FontFamily";
 static const char *fontSizeKey = "FontSize";
 static const char *antialiasKey = "FontAntialias";
-static const char *trueString = "true";
-static const char *falseString = "false";
 
 namespace {
 static const bool DEFAULT_ANTIALIAS = true;
@@ -60,81 +58,6 @@ static const bool DEFAULT_ANTIALIAS = true;
 
 namespace TextEditor {
 
-// Format --
-Format::Format() :
-    m_foreground(Qt::black),
-    m_background(Qt::white),
-    m_bold(false),
-    m_italic(false)
-{
-}
-
-void Format::setForeground(const QColor &foreground)
-{
-    m_foreground = foreground;
-}
-
-void Format::setBackground(const QColor &background)
-{
-    m_background = background;
-}
-
-void Format::setBold(bool bold)
-{
-    m_bold = bold;
-}
-
-void Format::setItalic(bool italic)
-{
-    m_italic = italic;
-}
-
-static QString colorToString(const QColor &color) {
-    if (color.isValid())
-        return color.name();
-    return QLatin1String("invalid");
-}
-
-static QColor stringToColor(const QString &string) {
-    if (string == QLatin1String("invalid"))
-        return QColor();
-    return QColor(string);
-}
-
-QString Format::toString() const
-{
-    const QChar delimiter = QLatin1Char(';');
-    QString s =  colorToString(m_foreground);
-    s += delimiter;
-    s += colorToString(m_background);
-    s += delimiter;
-    s += m_bold   ? QLatin1String(trueString) : QLatin1String(falseString);
-    s += delimiter;
-    s += m_italic ? QLatin1String(trueString) : QLatin1String(falseString);
-    return s;
-}
-
-bool Format::fromString(const QString &str)
-{
-    *this = Format();
-
-    const QStringList lst = str.split(QLatin1Char(';'));
-    if (lst.count() != 4)
-        return false;
-
-    m_foreground = stringToColor(lst.at(0));
-    m_background = stringToColor(lst.at(1));
-    m_bold = lst.at(2) == QLatin1String(trueString);
-    m_italic = lst.at(3) == QLatin1String(trueString);
-    return true;
-}
-
-bool Format::equals(const Format &f) const
-{
-    return m_foreground ==  f.m_foreground && m_background == f.m_background &&
-           m_bold == f.m_bold && m_italic == f.m_italic;
-}
-
 // -- FontSettings
 FontSettings::FontSettings() :
     m_family(defaultFixedFontFamily()),
@@ -148,16 +71,13 @@ void FontSettings::clear()
     m_family = defaultFixedFontFamily();
     m_fontSize = DEFAULT_FONT_SIZE;
     m_antialias = DEFAULT_ANTIALIAS;
-    m_formats.clear();
-    //qFill(m_formats.begin(), m_formats.end(), Format());
+    m_scheme.clear();
 }
 
 void FontSettings::toSettings(const QString &category,
                               const FormatDescriptions &descriptions,
                               QSettings *s) const
 {
-    const int numFormats = m_formats.size();
-    QTC_ASSERT(descriptions.size() == numFormats, /**/);
     s->beginGroup(category);
     if (m_family != defaultFixedFontFamily() || s->contains(QLatin1String(fontFamilyKey)))
         s->setValue(QLatin1String(fontFamilyKey), m_family);
@@ -171,9 +91,11 @@ void FontSettings::toSettings(const QString &category,
     const Format defaultFormat;
 
     foreach (const FormatDescription &desc, descriptions) {
-        QMap<QString, Format>::const_iterator i = m_formats.find(desc.name());
-        if (i != m_formats.end() && ((*i) != defaultFormat || s->contains(desc.name()))) {
-            s->setValue(desc.name(), (*i).toString());
+        const QString name = desc.name();
+        if (m_scheme.contains(name)) {
+            const Format &f = m_scheme.formatFor(name);
+            if (f != defaultFormat || s->contains(name))
+                s->setValue(name, f.toString());
         }
     }
     s->endGroup();
@@ -198,14 +120,16 @@ bool FontSettings::fromSettings(const QString &category,
     foreach (const FormatDescription &desc, descriptions) {
         const QString name = desc.name();
         const QString fmt = s->value(group + name, QString()).toString();
+        Format format;
         if (fmt.isEmpty()) {
-            m_formats[name].setForeground(desc.foreground());
-            m_formats[name].setBackground(desc.background());
-            m_formats[name].setBold(desc.format().bold());
-            m_formats[name].setItalic(desc.format().italic());
+            format.setForeground(desc.foreground());
+            format.setBackground(desc.background());
+            format.setBold(desc.format().bold());
+            format.setItalic(desc.format().italic());
         } else {
-            m_formats[name].fromString(fmt);
+            format.fromString(fmt);
         }
+        m_scheme.setFormatFor(name, format);
     }
     return true;
 }
@@ -215,14 +139,17 @@ bool FontSettings::equals(const FontSettings &f) const
     return m_family == f.m_family
             && m_fontSize == f.m_fontSize
             && m_antialias == f.m_antialias
-            && m_formats == f.m_formats;
+            && m_scheme == f.m_scheme;
 }
 
 QTextCharFormat FontSettings::toTextCharFormat(const QString &category) const
 {
-    const Format f = m_formats.value(category);
+    const Format &f = m_scheme.formatFor(category);
+    const QLatin1String textCategory("Text");
+
     QTextCharFormat tf;
-    if (category == QLatin1String("Text")) {
+
+    if (category == textCategory) {
         tf.setFontFamily(m_family);
         tf.setFontPointSize(m_fontSize);
         tf.setFontStyleStrategy(m_antialias ? QFont::PreferAntialias : QFont::NoAntialias);
@@ -230,7 +157,7 @@ QTextCharFormat FontSettings::toTextCharFormat(const QString &category) const
 
     if (f.foreground().isValid())
         tf.setForeground(f.foreground());
-    if (f.background().isValid() && (category == QLatin1String("Text") || f.background() != m_formats.value(QLatin1String("Text")).background()))
+    if (f.background().isValid() && (category == textCategory || f.background() != m_scheme.formatFor(textCategory).background()))
         tf.setBackground(f.background());
     tf.setFontWeight(f.bold() ? QFont::Bold : QFont::Normal);
     tf.setFontItalic(f.italic());
@@ -280,7 +207,7 @@ void FontSettings::setAntialias(bool antialias)
 
 Format &FontSettings::formatFor(const QString &category)
 {
-    return m_formats[category];
+    return m_scheme.formatFor(category);
 }
 
 QString FontSettings::defaultFixedFontFamily()
diff --git a/src/plugins/texteditor/fontsettings.h b/src/plugins/texteditor/fontsettings.h
index fb4d4c01038e9f30071190f9041b460c277dd629..20eb325bebf646fed8cb1718cd0fe61e18620789 100644
--- a/src/plugins/texteditor/fontsettings.h
+++ b/src/plugins/texteditor/fontsettings.h
@@ -32,6 +32,8 @@
 
 #include "texteditor_global.h"
 
+#include "colorscheme.h"
+
 #include <QtCore/QString>
 #include <QtCore/QList>
 #include <QtCore/QMap>
@@ -47,39 +49,6 @@ namespace TextEditor {
 
 class FormatDescription;
 
-// Format for a particular piece of text (text/comment, etc).
-class TEXTEDITOR_EXPORT Format
-{
-public:
-    Format();
-
-    QColor foreground() const { return m_foreground; }
-    void setForeground(const QColor &foreground);
-
-    QColor background() const { return m_background; }
-    void setBackground(const QColor &background);
-
-    bool bold() const { return m_bold; }
-    void setBold(bool bold);
-
-    bool italic() const { return m_italic; }
-    void setItalic(bool italic);
-
-    bool equals(const Format &f) const;
-
-    QString toString() const;
-    bool fromString(const QString &str);
-
-private:
-    QColor m_foreground;
-    QColor m_background;
-    bool m_bold;
-    bool m_italic;
-};
-
-inline bool operator==(const Format &f1, const Format &f2) { return f1.equals(f2); }
-inline bool operator!=(const Format &f1, const Format &f2) { return !f1.equals(f2); }
-
 /**
  * Font settings (default font and enumerated list of formats).
  */
@@ -143,7 +112,7 @@ private:
     QString m_family;
     int m_fontSize;
     bool m_antialias;
-    QMap<QString, Format> m_formats;
+    ColorScheme m_scheme;
 };
 
 inline bool operator==(const FontSettings &f1, const FontSettings &f2) { return f1.equals(f2); }
diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp
index d61e91f74689574b2a5178961a920d3403126510..c19d950f51796564aad513356e21485bb391ec47 100644
--- a/src/plugins/texteditor/fontsettingspage.cpp
+++ b/src/plugins/texteditor/fontsettingspage.cpp
@@ -129,16 +129,6 @@ FormatDescription::FormatDescription(const QString &name, const QString &trName,
     m_format.setForeground(color);
 }
 
-QString FormatDescription::name() const
-{
-    return m_name;
-}
-
-QString FormatDescription::trName() const
-{
-    return m_trName;
-}
-
 QColor FormatDescription::foreground() const
 {
     if (m_name == QLatin1String(Constants::C_LINE_NUMBER)) {
diff --git a/src/plugins/texteditor/fontsettingspage.h b/src/plugins/texteditor/fontsettingspage.h
index 21fbbb7d2514e8d216e369ba4c169c0c79ac491f..c9d1c3dcaa1206c63b2943484c912b3ae56b07df 100644
--- a/src/plugins/texteditor/fontsettingspage.h
+++ b/src/plugins/texteditor/fontsettingspage.h
@@ -59,8 +59,12 @@ public:
     FormatDescription(const QString &name, const QString &trName,
                       const QColor &foreground = Qt::black);
 
-    QString name() const;
-    QString trName() const;
+    QString name() const
+    { return m_name; }
+
+    QString trName() const
+    { return m_trName; }
+
     QColor foreground() const;
     QColor background() const;
 
diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro
index 639ac2acce36daeb1900e11f356d226060fb3ae0..32a0867755bff837a7f4505af1f167bac566e9a5 100644
--- a/src/plugins/texteditor/texteditor.pro
+++ b/src/plugins/texteditor/texteditor.pro
@@ -26,7 +26,8 @@ SOURCES += texteditorplugin.cpp \
     basefilefind.cpp \
     texteditorsettings.cpp \
     codecselector.cpp \
-    findincurrentfile.cpp
+    findincurrentfile.cpp \
+    colorscheme.cpp
 HEADERS += texteditorplugin.h \
     textfilewizard.h \
     plaintexteditor.h \
@@ -56,7 +57,8 @@ HEADERS += texteditorplugin.h \
     basefilefind.h \
     texteditorsettings.h \
     codecselector.h \
-    findincurrentfile.h
+    findincurrentfile.h \
+    colorscheme.h
 FORMS += behaviorsettingspage.ui \
     displaysettingspage.ui \
     fontsettingspage.ui