diff --git a/bin/cdist-object-codegen-all b/bin/cdist-object-codegen-all
new file mode 100755
index 00000000..99d86aec
--- /dev/null
+++ b/bin/cdist-object-codegen-all
@@ -0,0 +1,127 @@
+#!/bin/sh
+#
+# 2010 Nico Schottelius (nico-cdist at schottelius.org)
+#
+# 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 .
+#
+#
+# For each created object
+# run the manifest of the type (with object id),
+# try to merge back newly created objects (otherwise fail),
+# mark the object as being run
+# and iterate until all objects are marked being run.
+#
+#
+#
+
+. cdist-config
+
+if [ $# -ne 2 ]; then
+ __cdist_usage " "
+fi
+
+set -eu
+
+__cdist_target_host="$1"; shift
+__cdist_object_dir="$1"; shift
+
+# change to directory containing objects
+cd "$__cdist_object_dir"
+
+# Loop until we do not create new objects anymore
+# which is equal to all objects have been run
+__cdist_object_created_new=1
+
+
+while [ "$__cdist_object_created_new" = 1 ]; do
+ # assume we're done after this run
+ __cdist_object_created_new=0
+
+ # find all objects (every object has the source recorded)
+ find . -name "$__cdist_object_source" | \
+ sed -e "s;$__cdist_object_source\$;;" \
+ -e 's;^./;;' \
+ > "$__cdist_tmp_file"
+
+ # FIXME: DEBUG
+ cat "$__cdist_tmp_file"
+
+ while read object; do
+ if [ ! -f "${object}/$__cdist_object_finished" ]; then
+ echo "Working on object ${object} ..."
+
+ type=${object%%/*}
+ manifest="$__cdist_type_dir/${type}/${__cdist_name_init}"
+
+ if [ -x "${manifest}" ]; then
+ echo "Running manifest of type ${type} ..."
+
+ # FIXME: use subdir in tmpdir?
+ cdist-manifest-run "$__cdist_target_host" "${manifest}" "${__cdist_tmp_dir}"
+
+ echo "Trying to merge... "
+
+ # list of new objects
+ cd "${__cdist_tmp_dir}"
+ find . -name "$__cdist_object_source" | \
+ sed -e "s;$__cdist_object_source\$;;" \
+ -e 's;^./;;' \
+ > "$__cdist_tmp_file"
+
+ while read newobject; do
+ if [ -e "$__cdist_object_dir/${newobject}" ]; then
+ __cdist_exit_err "${newobject} already exists, merge failed."
+ else
+ # Fine, merge back! FIXME: touch correct here?
+ touch "${newobject}/$__cdist_object_finished"
+ pax -r -w "$newobject" "$__cdist_object_dir"
+ fi
+ done < "$__cdist_tmp_file"
+
+ # Always rerun the whole loop if we ran
+ # a manifest of an object
+ break
+
+
+ # FIXME: continue here
+ # tar, cp, pax, mv?
+ # mv/cp -n look good - posix?
+
+ # pax:
+ # pax -r -w -k could work, but -k does not raise an error if files
+ # are already existing
+
+ # - copy if not existing
+ # fail (abort whole recursive run) if existing
+ #
+ # iterate over all new objects and copy each back?
+
+ else
+ # Be nice, warn user if manifests exists, but is not executable
+ if [ -f "${manifest}" ]; then
+ echo "Warning ${manifest} is not executable"
+ fi
+ fi
+
+
+ # At least one more run needed
+ __cdist_object_created_new=1
+ fi
+ done < "$__cdist_tmp_file"
+
+done
+
+exit 0