 config/schema/cdn.conditions.schema.yml | 12 ++++++++++
 config/schema/cdn.data_types.schema.yml |  6 +++++
 config/schema/cdn.mapping.schema.yml    | 40 +++++++++++++++++++++++++++++++++
 config/schema/cdn.schema.yml            |  8 +++++--
 4 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/config/schema/cdn.conditions.schema.yml b/config/schema/cdn.conditions.schema.yml
new file mode 100644
index 0000000..2e1780f
--- /dev/null
+++ b/config/schema/cdn.conditions.schema.yml
@@ -0,0 +1,12 @@
+cdn.conditions:
+  type: sequence
+  label: 'Conditions'
+  sequence:
+    type: cdn.condition.[%key]
+
+cdn.condition.extensions:
+  type: sequence
+  label: 'Allowed file extensions'
+  sequence:
+    type: string
+    label: 'Allowed file extension'
diff --git a/config/schema/cdn.data_types.schema.yml b/config/schema/cdn.data_types.schema.yml
new file mode 100644
index 0000000..a9c8cb9
--- /dev/null
+++ b/config/schema/cdn.data_types.schema.yml
@@ -0,0 +1,6 @@
+# A host as defined in RFC2396.
+# @see https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax
+cdn.domain:
+  type: string
+  label: 'Domain'
+
diff --git a/config/schema/cdn.mapping.schema.yml b/config/schema/cdn.mapping.schema.yml
new file mode 100644
index 0000000..5d2f7b5
--- /dev/null
+++ b/config/schema/cdn.mapping.schema.yml
@@ -0,0 +1,40 @@
+cdn.mapping_base:
+  type: mapping
+  mapping:
+    type:
+      type: string
+      label: 'CDN mapping type'
+
+cdn.mapping.simple:
+  type: cdn.mapping_base
+  mapping:
+    domain:
+      type: cdn.domain
+      label: 'A single CDN domain.'
+    conditions:
+      type: cdn.conditions
+
+cdn.mapping.auto_balanced:
+  type: cdn.mapping_base
+  mapping:
+    domains:
+      type: sequence
+      label: 'Multiple CDN domains across which to auto-balance files (in a consistent manner).'
+      sequence:
+        type: cdn.domain
+        label: 'A CDN domain.'
+    conditions:
+      type: cdn.conditions
+
+cdn.mapping.complex:
+  type: cdn.mapping_base
+  label: 'Complex'
+  mapping:
+    fallback_domain:
+      type: cdn.domain
+      nullable: true
+      label: 'The optional fallback CDN domain to use when none of the other domains are selected.'
+    domains:
+      type: sequence
+      sequence:
+        type: cdn.mapping.[type]
diff --git a/config/schema/cdn.schema.yml b/config/schema/cdn.schema.yml
index 479dfce..6399199 100644
--- a/config/schema/cdn.schema.yml
+++ b/config/schema/cdn.schema.yml
@@ -1,10 +1,14 @@
-# Schema for the configuration files of the CDN module.
-
 cdn.settings:
   type: config_object
   label: 'CDN settings'
   mapping:
+    # It is valuable to be able to disable the CDN module without having to
+    # uninstall it. This allows CDN integration to be disabled without requiring
+    # the dependency injection container to be rebuilt, which is costly & slow.
     status:
       type: integer
       # disabled (0), testing (1) or enabled (2)
       label: 'CDN status'
+    mapping:
+      label: 'File URL to CDN mapping'
+      type: cdn.mapping.[type]
