diff --git a/core/scripts/create-subtheme.sh b/core/scripts/create-subtheme.sh
new file mode 100755
index 0000000000..353fe157f5
--- /dev/null
+++ b/core/scripts/create-subtheme.sh
@@ -0,0 +1,95 @@
+#!/bin/bash
+#
+# This script creates a sub-theme, with Olivero as base-theme.
+
+# Check if a valid argument is present, adhering to the machine name rules.
+# https://drupal.org/docs/theming-drupal/defining-a-theme-with-an-infoyml-file
+
+# Check if an argument is present.
+if [ -z "$1" ]
+then
+  echo "Please declare a machine name for your sub-theme, for example my_theme"
+  exit
+fi
+
+# Check if more than one argument is given.
+# Also controls for the "It must not contain any spaces." machine name rule.
+if [ $# -gt 1 ]
+then
+  echo "Please use only a single argument for the machine name, for example my_theme"
+  exit
+fi
+
+# It must not exist already.
+if [ -d themes/$1 ]
+then
+  echo "themes/$1 already exists on your filesystem ..."
+  exit
+fi
+
+# It must not be longer than 50 characters.
+themename=$1
+if [ ${#themename} -gt 50 ]
+then
+  echo "A theme name must not be longer than 50 characters."
+  exit
+fi
+
+# Check if characters comply
+case $1 in
+  # It must start with a letter.
+  ([!abcdefghijklmnopqrstuvwxyz]*)
+    echo >&2 "A theme name must start with a letter."
+    exit 1
+    ;;
+  # It must contain only lower-case letters, numbers and underscores.
+  (*[!abcdefghijklmnopqrstuvwxyz1234567890_]*)
+    echo >&2 "A theme name must contain only lower-case letters, numbers and underscores."
+    exit 1
+    ;;
+  # It should not be any of the reserved terms: src, lib, vendor, assets,
+  # css, files, images, js, misc, templates, includes, fixtures, drupal.
+  ("src" | "lib" | "vendor" | "assets" | "css" | "files" | "images" | "js" | "misc" | "templates" | "includes" | "fixtures" | "drupal")
+    echo -e >&2 "A theme name  should not be any of the reserved terms (folders in the Drupal distribution): \nsrc, lib, vendor, assets, css, files, images, js, misc, templates, includes, fixtures, drupal."
+    exit 1
+    ;;
+    (*)
+    echo "That theme name looks good, continuing ...";;
+esac
+
+# Create the target directory.
+mkdir themes/$1
+
+# Copy the contents of Olivero recursively.
+cp -R core/themes/olivero/subtheme/* themes/$1
+
+# Upper case the first letter of theme name, turning "my_theme" into "My_theme".
+themename="${themename^}"
+
+# Replace all underscores with a space, turning "My_theme" into "My theme".
+themename=${themename//_/ }
+
+# Update theme name and machine name in MACHINENAME.info.yml.
+sed -i "s/THEMENAME/$themename/g" themes/$1/MACHINENAME.info.yml
+sed -i "s/MACHINENAME/$1/g" themes/$1/MACHINENAME.info.yml
+
+# Remove "hidden: true" from *.info.yml file, 7th line
+sed -i "7d" themes/$1/MACHINENAME.info.yml
+
+# Strip .template suffix CSS and js files (added to prevent pcss test fails).
+mv themes/$1/css/style.css.template themes/$1/css/style.css
+mv themes/$1/js/scripts.js.template themes/$1/js/scripts.js
+
+# Update three *.yml file names from MACHINENAME.info.yml to my_theme.info.yml.
+for f in themes/$1/MACHINENAME*; do mv "$f" "${f/MACHINENAME/$1}"; done
+
+# Simple check, does number of files match between subtheme and theme folder?
+subthemecount=$(find core/themes/olivero/subtheme -type f | wc -l)
+themecount=$(find themes/$1 -type f | wc -l)
+
+if [ $subthemecount == $themecount ]
+then
+  echo "Theme '$themename' created successfully in themes/$1 ..."
+else
+  echo "It looks like something went wrong ... please check your themes folder."
+fi
diff --git a/core/themes/olivero/subtheme/MACHINENAME.info.yml b/core/themes/olivero/subtheme/MACHINENAME.info.yml
new file mode 100644
index 0000000000..85ffcde2a2
--- /dev/null
+++ b/core/themes/olivero/subtheme/MACHINENAME.info.yml
@@ -0,0 +1,25 @@
+name: 'THEMENAME'
+type: theme
+base theme: olivero
+description: 'An Olivero based sub-theme.'
+package: 'Olivero'
+version: 1.x
+hidden: true
+core_version_requirement: ^8 || ^9 || ^10
+regions:
+  header: Header
+  primary_menu: 'Primary menu'
+  secondary_menu: 'Secondary menu'
+  hero: 'Hero (full width)'
+  highlighted: Highlighted
+  breadcrumb: Breadcrumb
+  social: Social Bar
+  content_above: Content Above
+  content: Content
+  sidebar: 'Sidebar'
+  content_below: 'Content Below'
+  footer_top: 'Footer Top'
+  footer_bottom: 'Footer Bottom'
+libraries:
+  - MACHINENAME/global-styling
+  - MACHINENAME/global-scripts
diff --git a/core/themes/olivero/subtheme/MACHINENAME.libraries.yml b/core/themes/olivero/subtheme/MACHINENAME.libraries.yml
new file mode 100644
index 0000000000..6fdde25365
--- /dev/null
+++ b/core/themes/olivero/subtheme/MACHINENAME.libraries.yml
@@ -0,0 +1,10 @@
+global-styling:
+  css:
+    component:
+      css/style.css: {}
+global-scripts:
+  js:
+    js/scripts.js: {}
+  dependencies:
+    - core/drupal
+    - core/jquery
diff --git a/core/themes/olivero/subtheme/MACHINENAME.theme b/core/themes/olivero/subtheme/MACHINENAME.theme
new file mode 100644
index 0000000000..6670b68ed1
--- /dev/null
+++ b/core/themes/olivero/subtheme/MACHINENAME.theme
@@ -0,0 +1,8 @@
+<?php
+
+/**
+ * @file
+ * Olivero sub-theme.
+ *
+ * Place your custom PHP code in this file.
+ */
diff --git a/core/themes/olivero/subtheme/README.md b/core/themes/olivero/subtheme/README.md
new file mode 100644
index 0000000000..59fc231ea0
--- /dev/null
+++ b/core/themes/olivero/subtheme/README.md
@@ -0,0 +1,33 @@
+
+CONTENTS OF THIS FILE
+---------------------
+
+ * Introduction
+ * Installation
+ * Configuration
+
+
+INTRODUCTION
+------------
+
+Use these files to create a sub-theme of the Olivero theme included in Drupal 9
+core. This is only recommended if you want to make minor tweaks and understand
+that Olivero could break your modifications as it changes.
+
+
+INSTALLATION
+------------
+
+Run this command to create an Olivero sub-theme:
+core/scripts/create-subtheme.sh my_theme
+
+This will generate a sub-theme with the machine name my_theme and the title
+"My theme".
+
+
+CONFIGURATION
+-------------
+
+In order to inherit block placement of Olivero, you need to make sure the
+Olivero theme (the base theme) is installed and set as the site's default
+theme, before you install your sub theme, and set it as default.
diff --git a/core/themes/olivero/subtheme/css/style.css.template b/core/themes/olivero/subtheme/css/style.css.template
new file mode 100644
index 0000000000..4527397e79
--- /dev/null
+++ b/core/themes/olivero/subtheme/css/style.css.template
@@ -0,0 +1,3 @@
+/**
+ * Place your custom CSS modifications here.
+ */
diff --git a/core/themes/olivero/subtheme/js/scripts.js.template b/core/themes/olivero/subtheme/js/scripts.js.template
new file mode 100644
index 0000000000..6295113e68
--- /dev/null
+++ b/core/themes/olivero/subtheme/js/scripts.js.template
@@ -0,0 +1,10 @@
+/**
+ * Place your custom script modifications here.
+ */
+
+(function ($, Drupal, window, document) {
+  $(document).ready(function () {
+    // Add code here, like
+    // alert("Welcome to the web site!");
+  });
+})(jQuery, Drupal, this, this.document);
diff --git a/core/themes/olivero/subtheme/logo.svg b/core/themes/olivero/subtheme/logo.svg
new file mode 100644
index 0000000000..cb8d4ec372
--- /dev/null
+++ b/core/themes/olivero/subtheme/logo.svg
@@ -0,0 +1 @@
+<svg width="44" height="70" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M0 0h44v70H0z"/><path d="M30.75 11.73C26.87 7.86 23.18 4.16 22.08 0 21 4.16 17.28 7.86 13.4 11.73 7.59 17.54 1 24.12 1 34a21.08 21.08 0 1 0 42.15 0c0-9.88-6.59-16.46-12.4-22.27zM11.84 35.92a14.13 14.13 0 0 0-1.65 2.62.54.54 0 0 1-.36.3h-.18c-.47 0-1-.92-1-.92-.14-.22-.27-.45-.4-.69l-.09-.19C6.94 34.25 8 30.28 8 30.28a17.42 17.42 0 0 1 2.52-5.41 31.53 31.53 0 0 1 2.28-3l1 1 4.72 4.82a.54.54 0 0 1 0 .72l-4.93 5.47-1.75 2.04zm10.48 13.81a7.29 7.29 0 0 1-5.4-12.14c1.54-1.83 3.42-3.63 5.46-6 2.42 2.58 4 4.35 5.55 6.29.121.15.229.31.32.48a7.15 7.15 0 0 1 1.3 4.12 7.23 7.23 0 0 1-7.23 7.25zM36 38.14a.84.84 0 0 1-.67.58h-.14a1.22 1.22 0 0 1-.68-.55 37.77 37.77 0 0 0-4.28-5.31l-1.93-2-6.41-6.65a54 54 0 0 1-3.84-3.94 1.3 1.3 0 0 0-.1-.15 3.84 3.84 0 0 1-.51-1v-.19a3.4 3.4 0 0 1 1-3c1.24-1.24 2.49-2.49 3.67-3.79 1.3 1.44 2.69 2.82 4.06 4.19a57.6 57.6 0 0 1 7.55 8.58A16 16 0 0 1 36.65 34a14.55 14.55 0 0 1-.65 4.14z" fill="#FFF" fill-rule="nonzero"/></g></svg>
diff --git a/core/themes/olivero/subtheme/templates/README.md b/core/themes/olivero/subtheme/templates/README.md
new file mode 100644
index 0000000000..f086cc425b
--- /dev/null
+++ b/core/themes/olivero/subtheme/templates/README.md
@@ -0,0 +1 @@
+This directory is used to implement various templates.
