diff --git a/biscuit/core/models.py b/biscuit/core/models.py
index 9260fcbd3cd600240bb3967d2a6d4888a22928aa..6e1f6fb032dabea0c775cea3a0e45c315f5e4cb8 100644
--- a/biscuit/core/models.py
+++ b/biscuit/core/models.py
@@ -4,12 +4,26 @@ from django.contrib.auth import get_user_model
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 
+import dbsettings
 from image_cropping import ImageCropField, ImageRatioField
 from phonenumber_field.modelfields import PhoneNumberField
 
 from .mixins import ExtensibleModel, SchoolRelated
 
 
+class ThemeSettings(dbsettings.Group):
+    colour_primary = dbsettings.StringValue(default='#007bff')
+    colour_secondary = dbsettings.StringValue(default='#6c757d')
+    colour_success = dbsettings.StringValue(default='#28a745')
+    colour_info = dbsettings.StringValue(default='#17a2b8')
+    colour_warning = dbsettings.StringValue(default='#ffc107')
+    colour_danger = dbsettings.StringValue(default='#dc3545')
+    colour_light = dbsettings.StringValue(default='#f8f9fa')
+    colour_dark = dbsettings.StringValue(default='#343a40')
+
+theme_settings = ThemeSettings()
+
+
 class School(models.Model):
     """A school that will have many other objects linked to it.
     BiscuIT has multi-tenant support by linking all objects to a school,
diff --git a/biscuit/core/settings.py b/biscuit/core/settings.py
index 4afe98744a6818634225cae80facdd9824746aa7..61c92d3ea50a109873dbdb3e13f8e1bbd4100f9c 100644
--- a/biscuit/core/settings.py
+++ b/biscuit/core/settings.py
@@ -281,20 +281,12 @@ ANY_JS = {
 SASS_PROCESSOR_AUTO_INCLUDE = False
 SASS_PROCESSOR_CUSTOM_FUNCTIONS = {
     'get-colour': 'biscuit.core.util.sass_helpers.get_colour',
+    'get-theme-setting': 'biscuit.core.util.sass_helpers.get_theme_setting',
 }
 SASS_PROCESSOR_INCLUDE_DIRS = [
     _settings.get('bootstrap.sass_path', JS_ROOT+'/bootstrap/scss/')
 ]
 
-COLOUR_PRIMARY = _settings.get('theme.colours.primary', '#007bff')
-COLOUR_SECONDARY = _settings.get('theme.colours.secondary', '#6c757d')
-COLOUR_SUCCESS = _settings.get('theme.colours.success', '#28a745')
-COLOUR_INFO = _settings.get('theme.colours.info', '#17a2b8')
-COLOUR_WARNING = _settings.get('theme.colours.warning', '#ffc107')
-COLOUR_DANGER = _settings.get('theme.colours.danger', '#dc3545')
-COLOUR_LIGHT = _settings.get('theme.colours.light', '#f8f9fa')
-COLOUR_DARK = _settings.get('theme.colours.dark', '#343a40')
-
 ADMINS = _settings.get('contact.admins', [])
 SERVER_EMAIL = _settings.get('contact.from', 'root@localhost')
 DEFAULT_FROM_EMAIL = _settings.get('contact.from', 'root@localhost')
diff --git a/biscuit/core/static/bootstrap_modified.scss b/biscuit/core/static/bootstrap_modified.scss
index d77585eb8d6c3137db9f0f35513e5185dbd7195a..496e45bd585e4df3b77d1bf0d821434a08b3cb70 100644
--- a/biscuit/core/static/bootstrap_modified.scss
+++ b/biscuit/core/static/bootstrap_modified.scss
@@ -1,12 +1,12 @@
 $theme-colors: (
-    "primary":    adjust-color(get-colour(get-setting(COLOUR_PRIMARY)), $alpha: 1),
-    "secondary":  adjust-color(get-colour(get-setting(COLOUR_SECONDARY)), $alpha: 1),
-    "success":    adjust-color(get-colour(get-setting(COLOUR_SUCCESS)), $alpha: 1),
-    "info":       adjust-color(get-colour(get-setting(COLOUR_INFO)), $alpha: 1),
-    "warning":    adjust-color(get-colour(get-setting(COLOUR_WARNING)), $alpha: 1),
-    "danger":     adjust-color(get-colour(get-setting(COLOUR_DANGER)), $alpha: 1),
-    "light":      adjust-color(get-colour(get-setting(COLOUR_LIGHT)), $alpha: 1),
-    "dark":       adjust-color(get-colour(get-setting(COLOUR_DARK)), $alpha: 1),
+    "primary":    adjust-color(get-colour(get-setting(colour_primary)), $alpha: 1),
+    "secondary":  adjust-color(get-colour(get-setting(colour_secondary)), $alpha: 1),
+    "success":    adjust-color(get-colour(get-setting(colour_success)), $alpha: 1),
+    "info":       adjust-color(get-colour(get-setting(colour_info)), $alpha: 1),
+    "warning":    adjust-color(get-colour(get-setting(colour_warning)), $alpha: 1),
+    "danger":     adjust-color(get-colour(get-setting(colour_danger)), $alpha: 1),
+    "light":      adjust-color(get-colour(get-setting(colour_light)), $alpha: 1),
+    "dark":       adjust-color(get-colour(get-setting(colour_dark)), $alpha: 1),
 );
 
 @import "bootstrap";
diff --git a/biscuit/core/util/sass_helpers.py b/biscuit/core/util/sass_helpers.py
index aa28accf32e4cbd42711c7b69ccc2bf8e8dfbc22..1c77dac6a0d6308f6840ae488d2b47f457af9cb8 100644
--- a/biscuit/core/util/sass_helpers.py
+++ b/biscuit/core/util/sass_helpers.py
@@ -1,9 +1,14 @@
 from colour import web2hex
 from sass import SassColor
 
+from .models import theme_settings
 
 def get_colour(html_colour: str) -> SassColor:
     rgb = web2hex(html_colour, force_long=True)[1:]
     r, g, b = int(rgb[0:2], 16), int(rgb[2:4], 16), int(rgb[4:6], 16)
 
     return SassColor(r, g, b, 255)
+
+
+def get_theme_setting(setting: str) -> str:
+    return getattr(theme_settings, setting, '')