diff --git a/man/systemd.mount.xml b/man/systemd.mount.xml
index 7900221935..e11b9ffed4 100644
--- a/man/systemd.mount.xml
+++ b/man/systemd.mount.xml
@@ -538,7 +538,11 @@
Type=
Takes a string for the file system type. See
mount8
- for details. This setting is optional.
+ for details. This setting is optional.
+
+ If the type is overlay, and upperdir= or
+ workdir= are specified as options and they don't exist, they will be created.
+
diff --git a/src/core/mount.c b/src/core/mount.c
index f364b2ab0b..654be17c47 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -1200,6 +1200,34 @@ static void mount_enter_mounting(Mount *m) {
if (r < 0 && r != -EEXIST)
log_unit_warning_errno(UNIT(m), r, "Failed to create mount point '%s', ignoring: %m", m->where);
+ /* If we are asked to create an OverlayFS, create the upper/work directories if they are missing */
+ if (streq_ptr(p->fstype, "overlay")) {
+ _cleanup_strv_free_ char **dirs = NULL;
+
+ r = fstab_filter_options(
+ p->options,
+ "upperdir\0workdir\0",
+ /* ret_namefound= */ NULL,
+ /* ret_value= */ NULL,
+ &dirs,
+ /* ret_filtered= */ NULL);
+ if (r < 0)
+ log_unit_warning_errno(
+ UNIT(m),
+ r,
+ "Failed to determine upper directory for OverlayFS, ignoring: %m");
+ else
+ STRV_FOREACH(d, dirs) {
+ r = mkdir_p_label(*d, m->directory_mode);
+ if (r < 0 && r != -EEXIST)
+ log_unit_warning_errno(
+ UNIT(m),
+ r,
+ "Failed to create overlay directory '%s', ignoring: %m",
+ *d);
+ }
+ }
+
if (source_is_dir)
unit_warn_if_dir_nonempty(UNIT(m), m->where);
unit_warn_leftover_processes(UNIT(m), unit_log_leftover_process_start);
diff --git a/test/units/testsuite-74.mount.sh b/test/units/testsuite-74.mount.sh
index 41c5c8652a..594c123e1b 100755
--- a/test/units/testsuite-74.mount.sh
+++ b/test/units/testsuite-74.mount.sh
@@ -149,3 +149,9 @@ touch "$WORK_DIR/mnt/foo/baz"
systemd-umount "$WORK_DIR/mnt/foo"
test -d "$WORK_DIR/mnt/foo/bar"
test ! -e "$WORK_DIR/mnt/foo/baz"
+
+# overlay
+systemd-mount --type=overlay --options="lowerdir=/etc,upperdir=$WORK_DIR/upper,workdir=$WORK_DIR/work" /etc "$WORK_DIR/overlay"
+touch "$WORK_DIR/overlay/foo"
+test -e "$WORK_DIR/upper/foo"
+systemd-umount "$WORK_DIR/overlay"