diff --git a/cdist/conf/type/__directory/gencode-local b/cdist/conf/type/__directory/gencode-local
new file mode 100644
index 00000000..e8120fa0
--- /dev/null
+++ b/cdist/conf/type/__directory/gencode-local
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# 2022 Simon Walter (simon at explicit dot technology)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+destination="/$__object_id"
+
+if [ -f "$__object/parameter/source" ]; then
+ source="$(cat $__object/parameter/source)"
+ # -rp is compatible with both scp and rsync default __remote_copy
+ # However, the default rsync has a --backup switch which will fill up disk
+ # especially with large number of files.
+ cat << DONE
+$__remote_exec $__target_host "mkdir -p $destination"
+$__remote_copy -rp "$source" "${__target_host}:$destination"
+DONE
+fi
diff --git a/cdist/conf/type/__directory/man.rst b/cdist/conf/type/__directory/man.rst
index 7755334c..b0e0048f 100644
--- a/cdist/conf/type/__directory/man.rst
+++ b/cdist/conf/type/__directory/man.rst
@@ -41,6 +41,9 @@ mode
owner
User to chown to.
+source
+ If provided, the contents of this path will be copied to the directory.
+
BOOLEAN PARAMETERS
------------------
diff --git a/cdist/conf/type/__directory/manifest b/cdist/conf/type/__directory/manifest
new file mode 100644
index 00000000..760d1e5c
--- /dev/null
+++ b/cdist/conf/type/__directory/manifest
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+# 2022 Simon Walter (simon at explicit dot technology)
+#
+# This file is part of cdist.
+#
+# cdist is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cdist is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cdist. If not, see .
+#
+
+# FIXME: What does cdist use for unit testing?
+# FIXME: Output to stderr is no longer visible by default. Is there a correct
+# way to do this?
+
+if [ -f "$__object/parameter/source" ]; then
+ export source="$(cat "$__object/parameter/source")"
+ if [ -d "$source" ]; then
+ if [ "$(ls "$source" | wc -w)" -gt 0 ]; then
+ echo "Copying files from (--source): $source" >&2
+ # See gencode-local and gencode-remote
+ else
+ echo "No files in (--source): $source" >&2
+ fi
+ else
+ echo "Directory (--source) not found: $source" >&2
+ fi
+fi
+
diff --git a/cdist/conf/type/__directory/parameter/optional b/cdist/conf/type/__directory/parameter/optional
index 08798bc5..4022a624 100644
--- a/cdist/conf/type/__directory/parameter/optional
+++ b/cdist/conf/type/__directory/parameter/optional
@@ -2,3 +2,5 @@ state
group
mode
owner
+source
+source-remote