diff --git a/apps/opencs/model/settings/usersettings.cpp b/apps/opencs/model/settings/usersettings.cpp
index ea002c5ed..5b6e7ab8b 100644
--- a/apps/opencs/model/settings/usersettings.cpp
+++ b/apps/opencs/model/settings/usersettings.cpp
@@ -262,6 +262,42 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
         Setting *monoFont = createSetting (Type_CheckBox, "mono-font", "Use monospace font");
         monoFont->setDefaultValue ("true");
         monoFont->setToolTip ("Whether to use monospaced fonts on script edit subview.");
+
+        QString tooltip =
+            "\n#RGB (each of R, G, and B is a single hex digit)"
+            "\n#RRGGBB"
+            "\n#RRRGGGBBB"
+            "\n#RRRRGGGGBBBB"
+            "\nA name from the list of colors defined in the list of SVG color keyword names."
+            "\nX11 color names may also work.";
+
+        Setting *formatInt = createSetting (Type_LineEdit, "colour-int", "Highlight Colour: Int");
+        formatInt->setDefaultValues (QStringList() << "Dark magenta");
+        formatInt->setToolTip ("(Default: Green) Use one of the following formats:" + tooltip);
+
+        Setting *formatFloat = createSetting (Type_LineEdit, "colour-float", "Highlight Colour: Float");
+        formatFloat->setDefaultValues (QStringList() << "Magenta");
+        formatFloat->setToolTip ("(Default: Magenta) Use one of the following formats:" + tooltip);
+
+        Setting *formatName = createSetting (Type_LineEdit, "colour-name", "Highlight Colour: Name");
+        formatName->setDefaultValues (QStringList() << "Gray");
+        formatName->setToolTip ("(Default: Gray) Use one of the following formats:" + tooltip);
+
+        Setting *formatKeyword = createSetting (Type_LineEdit, "colour-keyword", "Highlight Colour: Keyword");
+        formatKeyword->setDefaultValues (QStringList() << "Red");
+        formatKeyword->setToolTip ("(Default: Red) Use one of the following formats:" + tooltip);
+
+        Setting *formatSpecial = createSetting (Type_LineEdit, "colour-special", "Highlight Colour: Special");
+        formatSpecial->setDefaultValues (QStringList() << "Dark yellow");
+        formatSpecial->setToolTip ("(Default: Dark yellow) Use one of the following formats:" + tooltip);
+
+        Setting *formatComment = createSetting (Type_LineEdit, "colour-comment", "Highlight Colour: Comment");
+        formatComment->setDefaultValues (QStringList() << "Green");
+        formatComment->setToolTip ("(Default: Green) Use one of the following formats:" + tooltip);
+
+        Setting *formatId = createSetting (Type_LineEdit, "colour-id", "Highlight Colour: Id");
+        formatId->setDefaultValues (QStringList() << "Blue");
+        formatId->setToolTip ("(Default: Blue) Use one of the following formats:" + tooltip);
     }
 
     {
diff --git a/apps/opencs/view/world/scriptedit.cpp b/apps/opencs/view/world/scriptedit.cpp
index 2f0d82ae1..ad2cddbf8 100644
--- a/apps/opencs/view/world/scriptedit.cpp
+++ b/apps/opencs/view/world/scriptedit.cpp
@@ -31,11 +31,11 @@ bool CSVWorld::ScriptEdit::event (QEvent *event)
     if (event->type()==QEvent::ShortcutOverride)
     {
         QKeyEvent *keyEvent = static_cast<QKeyEvent *> (event);
-        
+
         if (keyEvent->matches (QKeySequence::Undo) || keyEvent->matches (QKeySequence::Redo))
             return true;
     }
-    
+
     return QPlainTextEdit::event (event);
 }
 
@@ -92,13 +92,16 @@ CSVWorld::ScriptEdit::ScriptEdit (const CSMDoc::Document& document, ScriptHighli
 
     connect (&mUpdateTimer, SIGNAL (timeout()), this, SLOT (updateHighlighting()));
 
+    CSMSettings::UserSettings &userSettings = CSMSettings::UserSettings::instance();
+    connect (&userSettings, SIGNAL (userSettingUpdated(const QString &, const QStringList &)),
+             this, SLOT (updateUserSetting (const QString &, const QStringList &)));
+
     mUpdateTimer.setSingleShot (true);
 
     // TODO: provide a font selector dialogue
     mMonoFont.setStyleHint(QFont::TypeWriter);
-    std::string useMonoFont =
-        CSMSettings::UserSettings::instance().setting("script-editor/mono-font", "true").toStdString();
-    if (useMonoFont == "true")
+
+    if (userSettings.setting("script-editor/mono-font", "true") == "true")
         setFont(mMonoFont);
 
     mLineNumberArea = new LineNumberArea(this);
@@ -107,10 +110,13 @@ CSVWorld::ScriptEdit::ScriptEdit (const CSMDoc::Document& document, ScriptHighli
     connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
     connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int)));
 
-    std::string showStatusBar =
-        CSMSettings::UserSettings::instance().settingValue("script-editor/show-linenum").toStdString();
+    showLineNum(userSettings.settingValue("script-editor/show-linenum") == "true");
+}
 
-    showLineNum(showStatusBar == "true");
+void CSVWorld::ScriptEdit::updateUserSetting (const QString &name, const QStringList &list)
+{
+    if (mHighlighter->updateUserSetting (name, list))
+        updateHighlighting();
 }
 
 void CSVWorld::ScriptEdit::showLineNum(bool show)
diff --git a/apps/opencs/view/world/scriptedit.hpp b/apps/opencs/view/world/scriptedit.hpp
index fb577e60e..d17abf24e 100644
--- a/apps/opencs/view/world/scriptedit.hpp
+++ b/apps/opencs/view/world/scriptedit.hpp
@@ -56,7 +56,7 @@ namespace CSVWorld
         protected:
 
             bool event (QEvent *event);
-            
+
         public:
 
             ScriptEdit (const CSMDoc::Document& document, ScriptHighlighter::Mode mode,
@@ -96,7 +96,12 @@ namespace CSVWorld
             void updateHighlighting();
 
             void updateLineNumberAreaWidth(int newBlockCount);
+
             void updateLineNumberArea(const QRect &, int);
+
+        public slots:
+
+            void updateUserSetting (const QString &name, const QStringList &list);
     };
 
     class LineNumberArea : public QWidget
diff --git a/apps/opencs/view/world/scripthighlighter.cpp b/apps/opencs/view/world/scripthighlighter.cpp
index 6dda8d4fa..4923a44d8 100644
--- a/apps/opencs/view/world/scripthighlighter.cpp
+++ b/apps/opencs/view/world/scripthighlighter.cpp
@@ -6,6 +6,8 @@
 #include <components/compiler/scanner.hpp>
 #include <components/compiler/extensions0.hpp>
 
+#include "../../model/settings/usersettings.hpp"
+
 bool CSVWorld::ScriptHighlighter::parseInt (int value, const Compiler::TokenLoc& loc,
     Compiler::Scanner& scanner)
 {
@@ -78,46 +80,77 @@ CSVWorld::ScriptHighlighter::ScriptHighlighter (const CSMWorld::Data& data, Mode
 : QSyntaxHighlighter (parent), Compiler::Parser (mErrorHandler, mContext), mContext (data),
   mMode (mode)
 {
-    /// \todo replace this with user settings
+    CSMSettings::UserSettings &userSettings = CSMSettings::UserSettings::instance();
+
+    QColor color = QColor();
+
     {
+        color.setNamedColor(userSettings.setting("script-editor/colour-int", "Dark magenta"));
+        if (!color.isValid())
+            color = QColor(Qt::darkMagenta);
+
         QTextCharFormat format;
-        format.setForeground (Qt::darkMagenta);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Int, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-float", "Magenta"));
+        if (!color.isValid())
+            color = QColor(Qt::magenta);
+
         QTextCharFormat format;
-        format.setForeground (Qt::magenta);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Float, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-name", "Gray"));
+        if (!color.isValid())
+            color = QColor(Qt::gray);
+
         QTextCharFormat format;
-        format.setForeground (Qt::gray);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Name, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-keyword", "Red"));
+        if (!color.isValid())
+            color = QColor(Qt::red);
+
         QTextCharFormat format;
-        format.setForeground (Qt::red);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Keyword, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-special", "Dark yellow"));
+        if (!color.isValid())
+            color = QColor(Qt::darkYellow);
+
         QTextCharFormat format;
-        format.setForeground (Qt::darkYellow);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Special, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-comment", "Green"));
+        if (!color.isValid())
+            color = QColor(Qt::green);
+
         QTextCharFormat format;
-        format.setForeground (Qt::green);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Comment, format));
     }
 
     {
+        color.setNamedColor(userSettings.setting ("script-editor/colour-id", "Blue"));
+        if (!color.isValid())
+            color = QColor(Qt::blue);
+
         QTextCharFormat format;
-        format.setForeground (Qt::blue);
+        format.setForeground (color);
         mScheme.insert (std::make_pair (Type_Id, format));
     }
 
@@ -143,3 +176,86 @@ void CSVWorld::ScriptHighlighter::invalidateIds()
 {
     mContext.invalidateIds();
 }
+
+bool CSVWorld::ScriptHighlighter::updateUserSetting (const QString &name, const QStringList &list)
+{
+    if (list.empty())
+        return false;
+
+    QColor color = QColor();
+
+    if (name == "script-editor/colour-int")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Int] = format;
+    }
+    else if (name == "script-editor/colour-float")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Float] = format;
+    }
+    else if (name == "script-editor/colour-name")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Name] = format;
+    }
+    else if (name == "script-editor/colour-keyword")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Keyword] = format;
+    }
+    else if (name == "script-editor/colour-special")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Special] = format;
+    }
+    else if (name == "script-editor/colour-comment")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Comment] = format;
+    }
+    else if (name == "script-editor/colour-id")
+    {
+        color.setNamedColor(list.at(0));
+        if (!color.isValid())
+            return false;
+
+        QTextCharFormat format;
+        format.setForeground (color);
+        mScheme[Type_Id] = format;
+    }
+    else
+        return false;
+
+    return true;
+}
diff --git a/apps/opencs/view/world/scripthighlighter.hpp b/apps/opencs/view/world/scripthighlighter.hpp
index 953f2f953..6f1f58e82 100644
--- a/apps/opencs/view/world/scripthighlighter.hpp
+++ b/apps/opencs/view/world/scripthighlighter.hpp
@@ -87,6 +87,8 @@ namespace CSVWorld
             virtual void highlightBlock (const QString& text);
 
             void invalidateIds();
+
+            bool updateUserSetting (const QString &name, const QStringList &list);
     };
 }