diff --git a/core/__cdist_cache b/core/__cdist_cache
new file mode 100755
index 00000000..95764d3d
--- /dev/null
+++ b/core/__cdist_cache
@@ -0,0 +1,34 @@
+#!/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 .
+#
+#
+# Save the configuration tree into the local cache
+#
+
+__cdist_cache()
+{
+ # Create base to move into
+ mkdir -p "${__cdist_local_base_cache_dir}"
+
+ __cdist_echo info \
+ "Caching to $(__cdist_host_cache_dir "$__cdist_target_host")"
+ rm -rf "$(__cdist_host_cache_dir "$__cdist_target_host")"
+ mv "$__cdist_local_base_dir" \
+ "$(__cdist_host_cache_dir "$__cdist_target_host")"
+}
diff --git a/core/__cdist_dir b/core/__cdist_dir
new file mode 100755
index 00000000..32ee0075
--- /dev/null
+++ b/core/__cdist_dir
@@ -0,0 +1,46 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Push a directory to a target, both sides have the same name (i.e. explorers)
+# or
+# Pull a directory from a target, both sides have the same name (i.e. explorers)
+#
+
+__cdist_dir()
+{
+ [ $# -eq 3 ] || __cdist_usage ""
+
+ # ${3%/*} will be the destination directory, so no subdirectories
+ # of the same name are created, if the directory is already existing
+
+ if [ "$1" = "push" ]; then
+ # FIXME: add error handling with __cdist_run_remote_... or so
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "mkdir -p \"$3\""
+ scp -qr "$2" \
+ "${__cdist_remote_user}@${__cdist_target_host}:${3%/*}"
+ elif [ "$1" = "pull" ]; then
+ mkdir -p "$3"
+ scp -qr "${__cdist_remote_user}@${__cdist_target_host}:$2" \
+ "${3%/*}"
+ else
+ __cdist_exit_err "Unknown action $1"
+ fi
+}
diff --git a/core/__cdist_dir_listing b/core/__cdist_dir_listing
new file mode 100755
index 00000000..f4aa2320
--- /dev/null
+++ b/core/__cdist_dir_listing
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# List files in a directory, if it exists
+#
+# We only create output, if there's at least one entry
+# and can thus be used as a boolean ;-)
+#
+
+__cdist_dir_listing()
+{
+ [ -d "$1" ] && ls -1 "$1"
+}
diff --git a/core/__cdist_echo b/core/__cdist_echo
new file mode 100755
index 00000000..a89d1821
--- /dev/null
+++ b/core/__cdist_echo
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# echo / syslog alike function
+#
+
+__cdist_echo()
+{
+ __cdist_echo_type="$1"; shift
+
+ set +u
+ if [ "$__cdist_object_self" ]; then
+ __cdist_echo_prefix="${__cdist_object_self}:"
+ else
+ __cdist_echo_prefix="core: "
+ fi
+ set -u
+
+ case "$__cdist_echo_type" in
+ debug)
+ if [ "$__cdist_debug" = 1 ]; then
+ echo $__cdist_echo_prefix "DEBUG: $@"
+ fi
+ ;;
+ info)
+ echo $__cdist_echo_prefix "$@"
+ ;;
+ warn)
+ echo $__cdist_echo_prefix "Warning: $@"
+ ;;
+ error)
+ echo $__cdist_echo_prefix "Error: $@" >&2
+ ;;
+ *)
+ echo "CORE BUG, who created the broken commit in $0?" >&2
+ exit 23
+ ;;
+ esac
+}
diff --git a/core/__cdist_exit_err b/core/__cdist_exit_err
new file mode 100755
index 00000000..303dbf20
--- /dev/null
+++ b/core/__cdist_exit_err
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Print error and exit (perror() alike)
+#
+
+__cdist_exit_err()
+{
+ __cdist_echo error "$@"
+ exit 1
+}
diff --git a/core/__cdist_explorer_run b/core/__cdist_explorer_run
new file mode 100755
index 00000000..9e58fa09
--- /dev/null
+++ b/core/__cdist_explorer_run
@@ -0,0 +1,79 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Run explorers - FIXME: this function is ugly
+#
+
+__cdist_explorer_run()
+{
+ [ $# -eq 5 ] || __cdist_usage ""
+
+ # Ensure there is at least one explorer
+ num="$(ls -1 "$__cdist_explorer_dir" | wc -l)"
+ if [ "$num" -lt 1 ]; then
+ __cdist_exit_err "${__cdist_explorer_dir}: Contains no explorers"
+ fi
+
+ # Check whether to setup variable for type explorer
+ case "$1" in
+ global)
+ ;;
+ type)
+ # FIXME: think about how and where this gets setup!
+ "$__cdist_name_var_object=\"$(__cdist_remote_object_dir "$__cdist_object_self")\""
+ ;;
+ esac
+
+ # Transfer explorers
+ __cdist_dir push "$2" "$3"
+
+ # Create output directory
+ __cdist_run_remote mkdir -p "$4"
+
+ # Execute all explorers - FIXME: isolate cd call?
+ cd "$2";
+ # FIXME: cleanup double variable, no need when in directory
+ for __cdist_explorer_run_explorer in *; do
+ __cdist_explorer_explorer_name="${__cdist_explorer_run_explorer##*/}"
+
+ if [ -f "$__cdist_explorer_run_explorer" ]; then
+ if [ ! -x "$__cdist_explorer_run_explorer" ]; then
+ __cdist_exit_err "Explorer \"$__cdist_explorer_run_explorer\" exists, but is not executable."
+ fi
+
+ else
+ if [ -e "$__cdist_explorer_run_explorer" ]; then
+ __cdist_exit_err "Explorer \"$__cdist_explorer_run_explorer\" exists, but is not a file."
+ fi
+ fi
+
+ # FIXME: no need for remote out dir probably?
+ # or should we leave it and continue using __cdist_dir pull?
+ __cdist_run_remote \
+ "export $__cdist_name_var_explorer=\"$__cdist_remote_explorer_dir\";" \
+ "export $__cdist_name_var_global=\"$__cdist_remote_out_dir\";" \
+ "$3/$__cdist_explorer_run_explorer" ">" \
+ "$4/$__cdist_explorer_run_explorer" || \
+ __cdist_exit_err "Explorer $__cdist_explorer_run_explorer failed."
+ done
+
+ # Transfer results back
+ __cdist_dir pull "$4" "$5"
+}
diff --git a/core/__cdist_explorer_run_global b/core/__cdist_explorer_run_global
new file mode 100755
index 00000000..27359713
--- /dev/null
+++ b/core/__cdist_explorer_run_global
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# 2010-2011 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 .
+#
+#
+# Copy & run the global explorers, i.e. not bound to types
+#
+
+__cdist_explorer_run_global()
+{
+ __cdist_echo info "Running global explorers "
+
+ # run the global explorers remotely
+ __cdist_explorer_run global \
+ "$__cdist_explorer_dir" "$__cdist_remote_explorer_dir" \
+ "$__cdist_remote_out_explorer_dir" "$__cdist_out_explorer_dir"
+}
diff --git a/core/__cdist_init_deploy b/core/__cdist_init_deploy
new file mode 100755
index 00000000..4ac3168c
--- /dev/null
+++ b/core/__cdist_init_deploy
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Prepare deployment
+#
+
+__cdist_init_deploy()
+{
+ __cdist_echo info "Creating clean directory structure "
+
+ # Ensure there is no old stuff, neither local nor remote
+ rm -rf "$__cdist_local_base_dir"
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "rm -rf ${__cdist_remote_base_dir}"
+
+ # Init base
+ mkdir -p "$__cdist_local_base_dir"
+ ssh "${__cdist_remote_user}@${__cdist_target_host}" \
+ "mkdir -p ${__cdist_remote_base_dir}"
+
+ # Link configuration source directory - consistent with remote
+ ln -sf "$__cdist_conf_dir" "$__cdist_local_base_dir/$__cdist_name_conf_dir"
+}
diff --git a/core/__cdist_is_executable b/core/__cdist_is_executable
new file mode 100755
index 00000000..a7a6d174
--- /dev/null
+++ b/core/__cdist_is_executable
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Test whether something is executable (that should be executable) or
+# is missing
+#
+
+__cdist_is_executable()
+{
+ [ $# -eq 1 ] || __cdist_exit_err ""
+
+ if [ -e "$1" ]; then
+ if [ -f "$1" ]; then
+ if [ -x "$1" ]; then
+ # Exists and is a correct executable
+ true
+ else
+ __cdist_exit_err "$1 exists, but is not executable."
+ fi
+ else
+ __cdist_exit_err "$1 exists, but is not a file."
+ fi
+ else
+ # Does not exist
+ false
+ fi
+}
diff --git a/core/__cdist_kill_on_interrupt b/core/__cdist_kill_on_interrupt
new file mode 100644
index 00000000..7cb711fa
--- /dev/null
+++ b/core/__cdist_kill_on_interrupt
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# 2011 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 .
+#
+#
+# Run the given command for each created object.
+#
+
+# Does not work in children, will be called again in every script!
+# Use only in interactive "front end" scripts
+__cdist_kill_on_interrupt()
+{
+ __cdist_tmp_removal
+ kill 0
+ exit 1
+}
diff --git a/core/__cdist_manifest_run b/core/__cdist_manifest_run
new file mode 100755
index 00000000..cf85d646
--- /dev/null
+++ b/core/__cdist_manifest_run
@@ -0,0 +1,53 @@
+#!/bin/sh
+#
+# 2010-2011 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 .
+#
+#
+# Let's build a cconfig tree from a configuration
+# And save it into the cache tree
+#
+
+__cdist_manifest_run()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_manifest="$1"; shift
+
+ ################################################################################
+ # Export information for cdist-type-emulator or manifest
+ #
+
+ # Config dir should not get reset - FIXME: why did I do this?
+ export __cdist_conf_dir
+
+ # Used to record the source in the object
+ export __cdist_manifest
+
+ # Export information for manifests - __cdist_out_dir comes from cdist-config
+ export $__cdist_name_var_global="$__cdist_out_dir"
+
+ ################################################################################
+ # The actual run
+ #
+
+ # Ensure binaries are existing - FIXME: move error handling into __cdist_type_build_emulation
+ __cdist_type_build_emulation \
+ || __cdist_exit_err "Failed to build type emulation binaries"
+
+ __cdist_run_shell "${__cdist_manifest}"
+}
diff --git a/core/__cdist_manifest_run_init b/core/__cdist_manifest_run_init
new file mode 100755
index 00000000..e8fa63de
--- /dev/null
+++ b/core/__cdist_manifest_run_init
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# 2010-2011 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 .
+#
+#
+# Let's build a cconfig tree from a configuration
+# And save it into the cache tree
+#
+
+__cdist_manifest_run_init()
+{
+ # FIXME: probably do not export but always set explicitly?
+ export $__cdist_name_var_manifest="$__cdist_manifest_dir"
+
+ __cdist_echo info "Running initial manifest for $__cdist_target_host "
+ __cdist_manifest_run "$__cdist_manifest_init"
+}
diff --git a/core/__cdist_object_all b/core/__cdist_object_all
new file mode 100755
index 00000000..965d08f6
--- /dev/null
+++ b/core/__cdist_object_all
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Run the given command for each created object.
+#
+
+__cdist_object_all()
+{
+ [ $# -eq 1 ] || __cdist_usage ""
+
+ __cdist_object_all_object_all_command="$1"; shift
+
+ __cdist_object_all_object_all_objects="$__cdist_tmp_dir/objects"
+
+ # Ensure object dir exists, so marker can be created
+ mkdir -p "${__cdist_out_object_dir}"
+
+ # FIXME: : - why do we use a file?
+ # core/__cdist_object_manifest_run: touch "$__cdist_objects_created"
+
+ # Loop until we do not create new objects anymore
+ # which is equal to all objects have been run
+ touch "$__cdist_objects_created"
+ while [ -f "$__cdist_objects_created" ]; do
+ # Assume we're done after this run
+ rm "$__cdist_objects_created"
+
+ # Get listing of objects
+ __cdist_object_list "$__cdist_out_object_dir" > \
+ "$__cdist_object_all_object_all_objects"
+
+ # NEED TO CREATE ARRAY, SSH DESTROYS WHILE READ LOOP
+ while read __cdist_object_all_object; do
+ set -- "$@" "$__cdist_object_all_object"
+ done < "$__cdist_object_all_object_all_objects"
+
+ while [ $# -gt 0 ]; do
+ __cdist_object_all_object="$1"; shift
+ $__cdist_object_all_object_all_command "$__cdist_object_all_object"
+ done
+ done
+}
diff --git a/core/__cdist_object_code_run b/core/__cdist_object_code_run
new file mode 100755
index 00000000..8af67ab8
--- /dev/null
+++ b/core/__cdist_object_code_run
@@ -0,0 +1,54 @@
+#!/bin/sh
+#
+# 2010-2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
+#
+# 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 .
+#
+#
+# Exec the code for the given object locally and remote
+#
+
+__cdist_object_code_run()
+{
+ [ $# -eq 1 ] || __cdist_exit_err "