diff --git a/bin/cdist b/bin/cdist
index 06e82cc9..5456b134 100755
--- a/bin/cdist
+++ b/bin/cdist
@@ -200,11 +200,13 @@ def emulator():
         sys.exit(1)
 
 if __name__ == "__main__":
+    # Sys is needed for sys.exit()
+    import sys
+
     try:
         import logging
         import os
         import re
-        import sys
 
         cdistpythonversion = '3.2'
         if sys.version < cdistpythonversion:
@@ -228,7 +230,7 @@ if __name__ == "__main__":
         else:
             commandline()
 
-    except KeyboardInterrupt:
         sys.exit(0)
 
-    sys.exit(0)
+    except KeyboardInterrupt:
+        sys.exit(0)
diff --git a/build b/build
index 2d98e862..b209e1c2 100755
--- a/build
+++ b/build
@@ -130,6 +130,7 @@ case "$1" in
       git push --mirror
       git push --mirror github
       git push --mirror sf
+      git push --mirror ethz
    ;;
 
    clean)
diff --git a/conf/type/__package/man.text b/conf/type/__package/man.text
index d0460a31..071a8bfb 100644
--- a/conf/type/__package/man.text
+++ b/conf/type/__package/man.text
@@ -1,5 +1,5 @@
-cdist-type__user(7)
-===================
+cdist-type__package(7)
+======================
 Steven Armstrong <steven-cdist--@--armstrong.cc>
 
 
@@ -17,22 +17,23 @@ It dispatches the actual work to the package system dependant types.
 REQUIRED PARAMETERS
 -------------------
 state::
-   The state the package should be in, either "installed" or "removed"
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   The name of the package to install. Default is to use the object_id as the
-   package name.
+    The name of the package to install. Default is to use the object_id as the
+    package name.
 version::
-   The version of the package to install. Default is to install the version
-   choosen by the local package manager.
+    The version of the package to install. Default is to install the version
+    choosen by the local package manager.
 type::
-   The package type to use. Default is determined based on the $os explorer
-   variable.
-   e.g. __package_apt for Debian
-        __package_emerge for Gentoo
+    The package type to use. Default is determined based on the $os explorer
+    variable.
+    e.g. __package_apt for Debian
+         __package_emerge for Gentoo
 
 
 EXAMPLES
@@ -40,13 +41,13 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Install the package vim on the target
-__package vim --state installed
+__package vim --state present
 
 # Same but install specific version
-__package vim --state installed --version 7.3.50
+__package vim --state present --version 7.3.50
 
 # Force use of a specific package type
-__package vim --state installed --type __package_apt
+__package vim --state present --type __package_apt
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__package_apt/explorer/pkg_status b/conf/type/__package_apt/explorer/state
similarity index 84%
rename from conf/type/__package_apt/explorer/pkg_status
rename to conf/type/__package_apt/explorer/state
index dbb3af3e..04926b60 100755
--- a/conf/type/__package_apt/explorer/pkg_status
+++ b/conf/type/__package_apt/explorer/state
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -28,11 +28,11 @@ else
 fi
 
 # Except dpkg failing, if package is not known / installed
-packages="$(apt-cache showpkg "$name" | sed -e  "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name"
+packages="$(apt-cache showpkg "$name" | sed -e "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name"
 for p in $packages; do
     if [ -n "$(dpkg -s "$p" 2>/dev/null | grep "^Status: install ok installed$")" ]; then
-       echo "installed $p"
+       echo "present $p"
        exit 0
     fi
 done
-echo "removed"
+echo absent
diff --git a/conf/type/__package_apt/gencode-remote b/conf/type/__package_apt/gencode-remote
index 594ab8cb..0bcdb946 100755
--- a/conf/type/__package_apt/gencode-remote
+++ b/conf/type/__package_apt/gencode-remote
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -28,28 +28,41 @@ else
 fi
 
 state_should="$(cat "$__object/parameter/state")"
-state_is="$(cat "$__object/explorer/pkg_status")"
+
+# Correct pre 2.1 naming - FIXME in 2.1
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="present"
+    ;;
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="absent"
+    ;;
+esac
+
+# FIXME: use grep directly, state is a list, not a line!
+state_is="$(cat "$__object/explorer/state")"
 case "$state_is" in
-    installed*)
+    present*)
        name="$(echo "$state_is" | cut -d ' ' -f 2)"
-       state_is="installed"
+       state_is="present"
     ;;
 esac
 
 aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes"
 
-if [ "$state_is" != "$state_should" ]; then
-   case "$state_should" in
-      installed)
-         echo $aptget install \"$name\"
-      ;;
-      removed)
-         echo $aptget remove \"$name\"
-      ;;
-      *)
-         echo "Unknown state: $state" >&2
-         exit 1
-      ;;
-   esac
-fi
+[ "$state_is" = "$state_should" ] && exit 0
 
+case "$state_should" in
+    present)
+        echo $aptget install \"$name\"
+    ;;
+    absent)
+        echo $aptget remove \"$name\"
+    ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
+esac
diff --git a/conf/type/__package_apt/man.text b/conf/type/__package_apt/man.text
index 905bfb5f..fd9c1a9c 100644
--- a/conf/type/__package_apt/man.text
+++ b/conf/type/__package_apt/man.text
@@ -17,7 +17,8 @@ manage packages.
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
@@ -31,13 +32,13 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure zsh in installed
-__package_apt zsh --state installed
+__package_apt zsh --state present
 
 # In case you only want *a* webserver, but don't care which one
-__package_apt webserver --state installed --name nginx
+__package_apt webserver --state present --name nginx
 
 # Remove obsolete package
-__package_apt puppet --state removed
+__package_apt puppet --state absent
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__package_luarocks/gencode-remote b/conf/type/__package_luarocks/gencode-remote
index 179022b1..327f812c 100755
--- a/conf/type/__package_luarocks/gencode-remote
+++ b/conf/type/__package_luarocks/gencode-remote
@@ -24,29 +24,43 @@
 
 
 if [ -f "$__object/parameter/name" ]; then
-   name="$(cat "$__object/parameter/name")"
+    name="$(cat "$__object/parameter/name")"
 else
-   name="$__object_id"
+    name="$__object_id"
 fi
 
-state="$(cat "$__object/parameter/state")"
-is_installed="$(grep "(installed)" "$__object/explorer/pkg_status" || true)"
-
-case "$state" in
-   installed)
-      # Install only if non-existent
-      if [ -z "$is_installed" ]; then
-         echo luarocks install \"$name\"
-      fi
-   ;;
-   removed)
-      # Remove only if existent
-      if [ -n "$is_installed" ]; then
-         echo luarocks remove \"$name\"
-      fi
-   ;;
-   *)
-      echo "Unknown state: $state" >&2
-      exit 1
-   ;;
+state_should="$(cat "$__object/parameter/state")"
+# Correct pre 2.1 naming - FIXME in 2.1
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="present"
+    ;;
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="absent"
+    ;;
+esac
+
+
+if grep -q "(installed)" "$__object/explorer/pkg_status"; then
+    state_is="present"
+else
+    state_is="absent"
+fi
+
+# Leave if nothing is to be done
+[ "$state_is" = "$state_should" ] && exit 0
+
+case "$state_should" in
+    present)
+        echo luarocks install \"$name\"
+    ;;
+    absent)
+        echo luarocks remove \"$name\"
+    ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
 esac
diff --git a/conf/type/__package_luarocks/man.text b/conf/type/__package_luarocks/man.text
index 6c1e6734..8b041b7c 100644
--- a/conf/type/__package_luarocks/man.text
+++ b/conf/type/__package_luarocks/man.text
@@ -1,5 +1,5 @@
 cdist-type__package_luarocks(7)
-==============================
+===============================
 Christian G. Warden <cwarden@xerus.org>
 
 
@@ -16,13 +16,14 @@ LuaRocks is a deployment and management system for Lua modules.
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 
 EXAMPLES
@@ -30,10 +31,10 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure luasocket is installed
-__package_luarocks luasocket --state installed
+__package_luarocks luasocket --state present
 
 # Remove package
-__package_luarocks luasocket --state removed
+__package_luarocks luasocket --state absent
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__package_pacman/explorer/pkg_version b/conf/type/__package_pacman/explorer/pkg_version
index 4f612423..c33820f8 100755
--- a/conf/type/__package_pacman/explorer/pkg_version
+++ b/conf/type/__package_pacman/explorer/pkg_version
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -18,7 +18,7 @@
 # along with cdist. If not, see <http://www.gnu.org/licenses/>.
 #
 #
-# Retrieve the status of a package - parsed dpkg output
+# Retrieve the status of a package - parsed pacman output
 #
 
 if [ -f "$__object/parameter/name" ]; then
diff --git a/conf/type/__package_pacman/gencode-remote b/conf/type/__package_pacman/gencode-remote
index 3c4fdda7..9defabe8 100755
--- a/conf/type/__package_pacman/gencode-remote
+++ b/conf/type/__package_pacman/gencode-remote
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -33,24 +33,37 @@ else
    name="$__object_id"
 fi
 
-state="$(cat "$__object/parameter/state")"
+state_should="$(cat "$__object/parameter/state")"
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="present"
+    ;;  
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="absent"
+    ;;  
+esac
+
 pkg_version="$(cat "$__object/explorer/pkg_version")"
+if [ -z "$pkg_version" ]; then
+    state_is="absent"
+else
+    state_is="present"
+fi
 
-case "$state" in
-   installed)
+# Exit if nothing is needed to be done
+[ "$state_is" = "$state_should" ] && exit 0
 
-      # Empty? Not installed.
-      if [ -z "$pkg_version" ]; then
+case "$state_should" in
+   present)
          echo pacman "$pacopts" -S \"$name\"
-      fi
    ;;
-   removed)
-      if [ "$pkg_version" ]; then
+   absent)
          echo pacman "$pacopts" -R \"$name\"
-      fi
    ;;
    *)
-      echo "Unknown state: $state" >&2
+      echo "Unknown state: $state_should" >&2
       exit 1
    ;;
 esac
diff --git a/conf/type/__package_pacman/man.text b/conf/type/__package_pacman/man.text
index 28766581..fe2abac8 100644
--- a/conf/type/__package_pacman/man.text
+++ b/conf/type/__package_pacman/man.text
@@ -17,13 +17,14 @@ packages.
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 
 EXAMPLES
@@ -31,13 +32,13 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure zsh in installed
-__package_pacman zsh --state installed
+__package_pacman zsh --state present
 
 # If you don't want to follow pythonX packages, but always use python
-__package_pacman python --state installed --name python2
+__package_pacman python --state present --name python2
 
 # Remove obsolete package
-__package_pacman puppet --state removed
+__package_pacman puppet --state absent
 --------------------------------------------------------------------------------
 
 
@@ -49,5 +50,5 @@ SEE ALSO
 
 COPYING
 -------
-Copyright \(C) 2011 Nico Schottelius. Free use of this software is
+Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is
 granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__package_pip/gencode-remote b/conf/type/__package_pip/gencode-remote
index e60d74c5..0f15abdc 100644
--- a/conf/type/__package_pip/gencode-remote
+++ b/conf/type/__package_pip/gencode-remote
@@ -47,4 +47,8 @@ case "$state_should" in
     absent)
         echo $pip uninstall -q -y pyro
     ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
 esac
diff --git a/conf/type/__package_pip/man.text b/conf/type/__package_pip/man.text
index 5ce45c50..2a620658 100644
--- a/conf/type/__package_pip/man.text
+++ b/conf/type/__package_pip/man.text
@@ -23,10 +23,10 @@ state::
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 pip::
-   Instead of using pip from PATH, use the specific pip path.
+    Instead of using pip from PATH, use the specific pip path.
 
 
 EXAMPLES
diff --git a/conf/type/__package_pkg_openbsd/gencode-remote b/conf/type/__package_pkg_openbsd/gencode-remote
index eee2a3d9..26dd4689 100755
--- a/conf/type/__package_pkg_openbsd/gencode-remote
+++ b/conf/type/__package_pkg_openbsd/gencode-remote
@@ -1,6 +1,7 @@
 #!/bin/sh
 #
 # 2011 Andi Brönnimann (andi-cdist at v-net.ch)
+# 2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -28,7 +29,6 @@
 os_version="$(cat "$__global/explorer/os_version")"
 machine="$(cat "$__global/explorer/machine")"
 
-
 if [ -f "$__object/parameter/flavor" ]; then
 	flavor="$(cat "$__object/parameter/flavor")"
 fi
@@ -42,44 +42,60 @@ else
    name="$__object_id"
 fi
 
-state="$(cat "$__object/parameter/state")"
+state_should="$(cat "$__object/parameter/state")"
+# Correct pre 2.1 naming - FIXME in 2.1
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="present"
+    ;;
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="absent"
+    ;;
+esac
+
 pkg_version="$(cat "$__object/explorer/pkg_version")"
 
 # TODO: Shouldn't be hardcoded
 echo export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/$os_version/packages/$machine/
 
-case "$state" in
-   installed)
-      # Empty? Not installed.
-      if [ -z "$pkg_version" ]; then
-		  # use this because pkg_add doesn't properly handle errors
-		  cat << eof
-		  status=\$(pkg_add "$pkgopts" "$name--$flavor")
+if [ "$pkg_version" ]; then
+    state_is="present"
+else
+    state_is="absent"
+fi
 
-		  # no error
-      	  if [ -n "\$status" ]; then
-			  echo "Error: \$status"
-			  exit 1
-		  fi
-eof
-      fi
-   ;;
-   removed)
-      if [ "$pkg_version" ]; then
-		  # use this because pkg_add doesn't properly handle errors
-		  cat << eof
-		  status=\$(pkg_delete "$pkgopts" "$name--$flavor")
+[ "$state_is" = "$state_should" ] && exit 0
 
-		  # no error
-      	  if [ -n "\$status" ]; then
-			  echo "Error: \$status"
-			  exit 1
-		  fi
+case "$state_should" in
+    present)
+        # use this because pkg_add doesn't properly handle errors
+        cat << eof
+status=\$(pkg_add "$pkgopts" "$name--$flavor")
+
+# no error
+if [ -n "\$status" ]; then
+    echo "Error: \$status"
+	exit 1
+fi
+eof
+    ;;
+
+    absent)
+        # use this because pkg_add doesn't properly handle errors
+        cat << eof
+status=\$(pkg_delete "$pkgopts" "$name--$flavor")
+
+# no error
+if [ -n "\$status" ]; then
+    echo "Error: \$status"
+    exit 1
+fi
 eof
-      fi
    ;;
    *)
-		echo "Unknown state: $state" >&2
+		echo "Unknown state: $state_should" >&2
 		exit 1
    ;;
 esac
diff --git a/conf/type/__package_pkg_openbsd/man.text b/conf/type/__package_pkg_openbsd/man.text
index 555bb0ac..71cf9d4e 100644
--- a/conf/type/__package_pkg_openbsd/man.text
+++ b/conf/type/__package_pkg_openbsd/man.text
@@ -16,16 +16,17 @@ This type is usually used on OpenBSD to manage packages.
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 flavor::
-   If supplied, use to avoid ambiguity.
+    If supplied, use to avoid ambiguity.
 
 
 EXAMPLES
@@ -33,16 +34,16 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure zsh is installed
-__package_pkg_openbsd zsh --state installed
+__package_pkg_openbsd zsh --state present
 
 # Ensure vim is installed, use flavor no_x11
-__package_pkg_openbsd vim --state installed --flavor no_x11
+__package_pkg_openbsd vim --state present --flavor no_x11
 
 # If you don't want to follow pythonX packages, but always use python
-__package_pkg_openbsd python --state installed --name python2
+__package_pkg_openbsd python --state present --name python2
 
 # Remove obsolete package
-__package_pkg_openbsd puppet --state removed
+__package_pkg_openbsd puppet --state absent
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__package_rubygem/gencode-remote b/conf/type/__package_rubygem/gencode-remote
index daaba524..638c4252 100755
--- a/conf/type/__package_rubygem/gencode-remote
+++ b/conf/type/__package_rubygem/gencode-remote
@@ -21,31 +21,42 @@
 # Manage Rubygem packages
 #
 
-
 if [ -f "$__object/parameter/name" ]; then
-   name="$(cat "$__object/parameter/name")"
+    name="$(cat "$__object/parameter/name")"
 else
-   name="$__object_id"
+    name="$__object_id"
 fi
 
-state="$(cat "$__object/parameter/state")"
-is_installed="$(grep "true" "$__object/explorer/pkg_status" || true)"
-
-case "$state" in
-   installed)
-      # Install only if non-existent
-      if [ -z "$is_installed" ]; then
-         echo gem install \"$name\" --no-ri --no-rdoc
-      fi
-   ;;
-   removed)
-      # Remove only if existent
-      if [ -n "$is_installed" ]; then
-         echo gem uninstall \"$name\"
-      fi
-   ;;
-   *)
-      echo "Unknown state: $state" >&2
-      exit 1
-   ;;
+state_should="$(cat "$__object/parameter/state")"
+# Correct pre 2.1 naming - FIXME in 2.1
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="present"
+    ;;
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2
+        state_should="absent"
+    ;;
+esac
+
+if grep -q true "$__object/explorer/pkg_status"; then
+    state_is="present"
+else
+    state_is="absent"
+fi
+
+[ "$state_is" = "$state_should" ] && exit 0
+
+case "$state_should" in
+    present)
+        echo gem install \"$name\" --no-ri --no-rdoc
+    ;;
+    absent)
+        echo gem uninstall \"$name\"
+    ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
 esac
diff --git a/conf/type/__package_rubygem/man.text b/conf/type/__package_rubygem/man.text
index c6248ee3..79bb8b52 100644
--- a/conf/type/__package_rubygem/man.text
+++ b/conf/type/__package_rubygem/man.text
@@ -16,13 +16,14 @@ Rubygems is the default package management system for the Ruby programming langu
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 
 EXAMPLES
@@ -30,10 +31,10 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure sinatra is installed
-__package_rubygem sinatra --state installed
+__package_rubygem sinatra --state present
 
 # Remove package
-__package_rubygem rails --state removed
+__package_rubygem rails --state absent
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__package_yum/gencode-remote b/conf/type/__package_yum/gencode-remote
index b24ed220..a10e60dd 100755
--- a/conf/type/__package_yum/gencode-remote
+++ b/conf/type/__package_yum/gencode-remote
@@ -27,7 +27,17 @@ else
    name="$__object_id"
 fi
 
-state="$(cat "$__object/parameter/state")"
+state_should="$(cat "$__object/parameter/state")"
+case "$state_should" in
+    installed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="present"
+    ;;
+    removed)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="absent"
+    ;;
+esac
 
 if grep -q -E "(centos|redhat|amazon)" "$__global/explorer/os"; then
     opts="-y --quiet"
@@ -37,19 +47,23 @@ fi
 
 not_installed="^no package provides"
 
-case "$state" in
-   installed)
-      if grep -q "$not_installed" "$__object/explorer/pkg_version"; then
-         echo yum $opts install \"$name\"
-      fi
-   ;;
-   removed)
-      if ! grep -q "$not_installed" "$__object/explorer/pkg_version"; then
-         echo yum $opts remove \"$name\"
-      fi
-   ;;
-   *)
-      echo "Unknown state: $state" >&2
-      exit 1
-   ;;
+if grep -q "$not_installed" "$__object/explorer/pkg_version"; then
+    state_is="absent"
+else
+    state_is="present"
+fi
+
+[ "$state_is" = "$state_should" ] && exit 0
+
+case "$state_should" in
+    present)
+        echo yum $opts install \"$name\"
+    ;;
+    absent)
+        echo yum $opts remove \"$name\"
+    ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
 esac
diff --git a/conf/type/__package_yum/man.text b/conf/type/__package_yum/man.text
index c9cad340..9dfb394e 100644
--- a/conf/type/__package_yum/man.text
+++ b/conf/type/__package_yum/man.text
@@ -18,13 +18,14 @@ slightly confusing error message "Error: Nothing to do".
 REQUIRED PARAMETERS
 -------------------
 state::
-   Either "installed" or "removed".
+    The state the package should be in, either "present" or "absent"
+    (the old values "installed" or "removed" will be removed in cdist 2.1).
 
 
 OPTIONAL PARAMETERS
 -------------------
 name::
-   If supplied, use the name and not the object id as the package name.
+    If supplied, use the name and not the object id as the package name.
 
 
 EXAMPLES
@@ -32,13 +33,13 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Ensure zsh in installed
-__package_yum zsh --state installed
+__package_yum zsh --state present
 
 # If you don't want to follow pythonX packages, but always use python
-__package_yum python --state installed --name python2
+__package_yum python --state present --name python2
 
 # Remove obsolete package
-__package_yum puppet --state removed
+__package_yum puppet --state absent
 --------------------------------------------------------------------------------
 
 
diff --git a/conf/type/__process/gencode-remote b/conf/type/__process/gencode-remote
index be0e0cae..3411734e 100755
--- a/conf/type/__process/gencode-remote
+++ b/conf/type/__process/gencode-remote
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# 2011 Nico Schottelius (nico-cdist at schottelius.org)
+# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
 #
 # This file is part of cdist.
 #
@@ -25,33 +25,44 @@ else
    name="$__object_id"
 fi
 
-runs="$(cat "$__object/explorer/runs")"
 state_should="$(cat "$__object/parameter/state")"
+case "$state_should" in
+    running)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="present"
+    ;;  
+    stopped)
+        echo "WARNING:  ${__object_name}: $state_should is deprecated and will be removed in cdist 2.1. Please change to present/absent." >&2       
+        state_should="absent"
+    ;;  
+esac
+
+runs="$(cat "$__object/explorer/runs")"
+if [ "$runs" ]; then
+    state_is="present"
+else
+    state_is="absent"
+fi
+
+[ "$state_is" = "$state_should" ] && exit 0
 
 case "$state_should" in
-   running|present)
-      # Does not run, start it!
-      if [ -z "$runs" ]; then
-         if [ -f "$__object/parameter/start" ]; then
+    present)
+        if [ -f "$__object/parameter/start" ]; then
             cat "$__object/parameter/start"
-         else
+        else
             echo "$name"
-         fi
-      fi
-   ;;
-   stopped|absent)
-      # Runs, kill it!
-      if [ "$runs" ]; then
+        fi
+    ;;
+    absent)
          if [ -f "$__object/parameter/stop" ]; then
             cat "$__object/parameter/stop"
          else
             echo kill "${runs}"
          fi
-      fi
-   ;;
-   *)
-      echo "Unknown state: $state_should" >&2
-      exit 1
-   ;;
-
+    ;;
+    *)
+        echo "Unknown state: $state_should" >&2
+        exit 1
+    ;;
 esac
diff --git a/conf/type/__process/man.text b/conf/type/__process/man.text
index fbd54847..961a7f9a 100644
--- a/conf/type/__process/man.text
+++ b/conf/type/__process/man.text
@@ -16,7 +16,9 @@ This cdist type allows you to define the state of a process.
 REQUIRED PARAMETERS
 -------------------
 state::
-   State of the process: Either stopped or running.
+   State of the process: Either present or absent
+   (old values "stopped" and "running" are deprecated and will be removed in
+   cdist 2.1).
 
 
 OPTIONAL PARAMETERS
@@ -40,23 +42,23 @@ EXAMPLES
 
 --------------------------------------------------------------------------------
 # Start if not running
-__process /usr/sbin/syslog-ng --state running
+__process /usr/sbin/syslog-ng --state present
 
 # Start if not running with a different binary
-__process /usr/sbin/nginx --state running --start "/etc/rc.d/nginx start"
+__process /usr/sbin/nginx --state present --start "/etc/rc.d/nginx start"
 
 # Stop the process using kill (the type default) - DO NOT USE THIS
-__process /usr/sbin/sshd --state stopped
+__process /usr/sbin/sshd --state absent
 
 # Stop the process using /etc/rc.d/sshd stop - THIS ONE NOT AS WELL
-__process /usr/sbin/sshd --state stopped --stop "/etc/rc.d/sshd stop"
+__process /usr/sbin/sshd --state absent --stop "/etc/rc.d/sshd stop"
 
 # Ensure cups is running, which runs with -C ...:
-__process cups --start "/etc/rc.d/cups start" --state running \
+__process cups --start "/etc/rc.d/cups start" --state present \
    --name "/usr/sbin/cupsd -C /etc/cups/cupsd.conf"
 
 # Ensure rpc.statd is running (which usually runs with -L) using a regexp
-__process rpcstatd --state running --start "/etc/init.d/statd start" \
+__process rpcstatd --state present --start "/etc/init.d/statd start" \
     --name "rpc.statd.*"
 --------------------------------------------------------------------------------
 
@@ -68,5 +70,5 @@ SEE ALSO
 
 COPYING
 -------
-Copyright \(C) 2011 Nico Schottelius. Free use of this software is
+Copyright \(C) 2011-2012 Nico Schottelius. Free use of this software is
 granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/doc/changelog b/doc/changelog
index 507726bc..96681617 100644
--- a/doc/changelog
+++ b/doc/changelog
@@ -4,11 +4,17 @@ Changelog
 	* Changes are always commented with their author in (braces)
 	* Exception: No braces means author == Nico Schottelius
 
-2.0.8:
+2.0.8: 2012-02-20
+	* Bugfix core: Remove another nasty traceback when sending SIGINT (aka Ctrl-C)
 	* Cleanup: Better hint to source of error
 	* Cleanup: Do not output failing script, but path to script only
 	* Cleanup: Remove support for __debug variable in manifests (Type != Core
 		debugging)
+	* Cleanup: Change __package_* to support absent/present (default state
+		name now). The values removed/installed will be removed in cdist 2.1.
+	* Cleanup: Change __process to support absent/present (default state
+		name now). The values running/stopped will be removed in cdist 2.1.
+	* Feature Core: Support boolean parameters (Steven Armstrong)
 
 2.0.7: 2012-02-13
 	* Bugfix __file: Use chmod after chown/chgrp (Matt Coddington)
diff --git a/doc/dev/logs/2012-02-17.keyboardirq b/doc/dev/logs/2012-02-17.keyboardirq
new file mode 100644
index 00000000..8ce59681
--- /dev/null
+++ b/doc/dev/logs/2012-02-17.keyboardirq
@@ -0,0 +1,48 @@
+Somewhere there is still a race condition:
+
+INFO: monitoring03: Running manifest and explorers for __file/etc/yum.repos.d/epel.repo
+^C^CTraceback (most recent call last):
+  File "./bin/cdist", line 204, in <module>
+    import logging
+  File "/usr/lib/python3.2/logging/__init__.py", line 27, in <module>
+    from string import Template
+  File "/usr/lib/python3.2/string.py", line 178, in <module>
+    class Formatter:
+  File "/usr/lib/python3.2/string.py", line 179, in Formatter
+    def format(self, format_string, *args, **kwargs):
+KeyboardInterrupt
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+  File "./bin/cdist", line 232, in <module>
+    sys.exit(0)
+NameError: name 'sys' is not defined
+^C^CFatal Python error: Py_Initialize: can't initialize sys standard streams
+Traceback (most recent call last):
+  File "/usr/lib/python3.2/encodings/latin_1.py", line 8, in <module>
+    """
+KeyboardInterrupt
+^C%                                                                                                                   [12:19] brief:cdist%
+
+
+--------------------------------------------------------------------------------
+[13:50] brief:cdist% ./bin/cdist config -vp monitoring02        
+INFO: monitoring02: Running global explorers
+INFO: monitoring02: Running initial manifest /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest
+INFO: monitoring02: Running object manifests and type explorers
+INFO: monitoring02: Running manifest and explorers for __localch_shinken/singleton
+^CTraceback (most recent call last):
+  File "/usr/lib/python3.2/site.py", line 58, in <module>
+    import traceback
+  File "/usr/lib/python3.2/traceback.py", line 3, in <module>
+    import linecache
+  File "/usr/lib/python3.2/linecache.py", line 10, in <module>
+    import tokenize
+  File "/usr/lib/python3.2/tokenize.py", line 49, in <module>
+    class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')):
+  File "/usr/lib/python3.2/collections.py", line 363, in namedtuple
+    exec(class_definition, namespace)
+  File "<string>", line 1, in <module>
+KeyboardInterrupt
+
diff --git a/doc/dev/logs/2012-02-20.error-does-not-contain-host b/doc/dev/logs/2012-02-20.error-does-not-contain-host
new file mode 100644
index 00000000..5838c011
--- /dev/null
+++ b/doc/dev/logs/2012-02-20.error-does-not-contain-host
@@ -0,0 +1,26 @@
+- errors do not contain host
+- it's not logged which hosts failed!
+
+INFO: monitoring02: Running manifest and explorers for __directory/opt/local.ch/sys/shinken/host.d
+INFO: monitoring03: Running manifest and explorers for __file/usr/sbin/iptables-rebuild
+INFO: monitoring03: Running manifest and explorers for __git/opt/local.ch/sys/shinken/shinken
+INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/005_start
+INFO: monitoring03: Running manifest and explorers for __localch_rsyncd/singleton
+ERROR: Object __localch_iptables/xensnmp already exists with conflicting parameters:
+/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest/init: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 161 -j ACCEPT'}
+/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 873 -j ACCEPT'}
+ERROR: Command failed: /bin/sh -e /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest
+INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/500_xensnmp
+INFO: monitoring02: Running manifest and explorers for __file/etc/iptables.d/995_end
+INFO: monitoring02: Running manifest and explorers for __file/etc/rsyncd.conf
+INFO: monitoring02: Running manifest and explorers for __file/etc/yum.repos.d/epel.repo
+INFO: monitoring02: Running manifest and explorers for __file/etc/yum.repos.d/rpmforge.repo
+INFO: monitoring02: Running manifest and explorers for __file/usr/sbin/iptables-rebuild
+INFO: monitoring02: Running manifest and explorers for __git/opt/local.ch/sys/shinken/shinken
+INFO: monitoring02: Running manifest and explorers for __localch_rsyncd/singleton
+ERROR: Object __localch_iptables/xensnmp already exists with conflicting parameters:
+/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/manifest/init: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 161 -j ACCEPT'}
+/home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest: {'rule': '-A RH-Firewall-1-INPUT -p tcp --dport 873 -j ACCEPT'}
+ERROR: Command failed: /bin/sh -e /home/users/nico/privat/firmen/local.ch/vcs/cdist/conf/type/__localch_rsyncd/manifest
+INFO: Total processing time for 2 host(s): 14.245397090911865
+[16:53] brief:cdist% 
diff --git a/doc/dev/todo/TAKEME b/doc/dev/todo/TAKEME
index b40936f6..3007cedb 100644
--- a/doc/dev/todo/TAKEME
+++ b/doc/dev/todo/TAKEME
@@ -37,3 +37,4 @@ TYPES
 - Add testing framework (proposed by Evax Software)
 - __user
    add option to include --create-home
+- Merge __addifnosuchline and __removeline into __line + --state present|absent
diff --git a/doc/dev/todo/niconext b/doc/dev/todo/niconext
index bead6d72..aa5f6001 100644
--- a/doc/dev/todo/niconext
+++ b/doc/dev/todo/niconext
@@ -1,13 +1,13 @@
 - introduce default parameters
+    - valid for optional parameters only
+    - stored in parameter/default/$name
+
+    - when/where to save? in emulator?
+        - read vi fsproperty?
 
 - cleanup object_id handling
     - have a look at singletons
 
-- ensure that all types, which support --state support
-    present and absent (consistent look and feel)
-
---------------------------------------------------------------------------------
-
 - update/create docs
     - cdist-cache::
         How to get use information about the hosts we have been working on [advanced]
diff --git a/doc/man/cdist-reference.text.sh b/doc/man/cdist-reference.text.sh
index 81e58ab2..a76e7941 100755
--- a/doc/man/cdist-reference.text.sh
+++ b/doc/man/cdist-reference.text.sh
@@ -101,12 +101,15 @@ conf/type/<name>/gencode-local::
 conf/type/<name>/gencode-remote::
     Used to generate code to be executed on the client.
 
-conf/type/<name>/parameters/required::
+conf/type/<name>/parameter/required::
     Parameters required by type, \n seperated list.
 
-conf/type/<name>/parameters/optional::
+conf/type/<name>/parameter/optional::
     Parameters optionally accepted by type, \n seperated list.
 
+conf/type/<name>/parameter/boolean::
+   Boolean parameters accepted by type, \n seperated list.
+
 conf/type/<name>/explorer::
     Location of the type specific explorers.
     This directory is referenced by the variable __type_explorer (see below).
diff --git a/doc/man/man7/cdist-type.text b/doc/man/man7/cdist-type.text
index 48d412f1..1147511e 100644
--- a/doc/man/man7/cdist-type.text
+++ b/doc/man/man7/cdist-type.text
@@ -40,7 +40,7 @@ A list of supported types can be found in the cdist-reference(7) manpage.
 
 SINGLETON TYPES
 ---------------
-If a type is flagged as a singleton, it may be used only 
+If a type is flagged as a singleton, it may be used only
 once per host. This is useful for types which can be used only once on a
 system. Singleton types do not take an object name as argument.
 
@@ -72,15 +72,42 @@ To begin a new type, just create the directory **conf/type/__NAME**.
 
 DEFINING PARAMETERS
 -------------------
-Every type consists of optional and required parameters, which must
-be created in a newline seperated file in ***parameters/required*** and
-***parameters/optional***. If either or both missing, the type will have
-no required, no optional or no parameters at all.
+Every type consists of required, optional and boolean parameters, which must
+be created in a newline seperated file in ***parameter/required***,
+***parameter/optional*** and ***parameter/boolean***. If either is missing,
+the type will have no required, no optional, no boolean or no parameters at
+all.
 
 Example:
 --------------------------------------------------------------------------------
 echo servername >> conf/type/__nginx_vhost/parameter/required
 echo logdirectory >> conf/type/__nginx_vhost/parameter/optional
+echo use_ssl >> conf/type/__nginx_vhost/parameter/boolean
+--------------------------------------------------------------------------------
+
+
+USING PARAMETERS
+----------------
+The parameters given to a type can be accessed and used in all type scripts
+(e.g manifest, gencode-*, explorer/*). Note that boolean parameters are
+represented by file existence. File exists -> True,
+file does not exist -> False
+
+Example: (e.g. in conf/type/__nginx_vhost/manifest)
+--------------------------------------------------------------------------------
+# required parameter
+servername="$(cat "$__object/parameter/servername")"
+
+# optional parameter
+if [ -f "$__object/parameter/logdirectory" ]; then
+   logdirectory="$(cat "$__object/parameter/logdirectory")"
+fi
+
+# boolean parameter
+if [ -f "$__object/parameter/use_ssl" ]; then
+   # file exists -> True
+   # do some fancy ssl stuff
+fi
 --------------------------------------------------------------------------------
 
 
@@ -116,7 +143,7 @@ SINGLETON - ONLY INSTANCE ONLY
 ------------------------------
 If you want to ensure that a type can only be used once per target, you can
 mark it as a singleton: Just create the (empty) file "singleton" in your type
-directory: 
+directory:
 
 --------------------------------------------------------------------------------
 touch conf/type/__NAME/singleton
@@ -128,7 +155,7 @@ This will also change the way your type must be called:
 __YOURTYPE --parameter value
 --------------------------------------------------------------------------------
 
-As you can see, the object ID is omitted, because it does not make any sense, 
+As you can see, the object ID is omitted, because it does not make any sense,
 if your type can be used only once.
 
 
diff --git a/lib/cdist/__init__.py b/lib/cdist/__init__.py
index 4742a937..c1e16ffb 100644
--- a/lib/cdist/__init__.py
+++ b/lib/cdist/__init__.py
@@ -19,7 +19,7 @@
 #
 #
 
-VERSION     = "2.0.7"
+VERSION     = "2.0.8"
 
 BANNER = """
              ..          .       .x+=:.        s
diff --git a/lib/cdist/core/cdist_type.py b/lib/cdist/core/cdist_type.py
index 55609e7e..1d2472c4 100644
--- a/lib/cdist/core/cdist_type.py
+++ b/lib/cdist/core/cdist_type.py
@@ -82,6 +82,7 @@ class CdistType(object):
         self.__explorers = None
         self.__required_parameters = None
         self.__optional_parameters = None
+        self.__boolean_parameters = None
 
     def __repr__(self):
         return '<CdistType %s>' % self.name
@@ -144,3 +145,19 @@ class CdistType(object):
             finally:
                 self.__optional_parameters = parameters
         return self.__optional_parameters
+
+    @property
+    def boolean_parameters(self):
+        """Return a list of boolean parameters"""
+        if not self.__boolean_parameters:
+            parameters = []
+            try:
+                with open(os.path.join(self.absolute_path, "parameter", "boolean")) as fd:
+                    for line in fd:
+                        parameters.append(line.strip())
+            except EnvironmentError:
+                # error ignored
+                pass
+            finally:
+                self.__boolean_parameters = parameters
+        return self.__boolean_parameters
diff --git a/lib/cdist/emulator.py b/lib/cdist/emulator.py
index 6d6050e8..c4b84feb 100644
--- a/lib/cdist/emulator.py
+++ b/lib/cdist/emulator.py
@@ -87,7 +87,7 @@ class Emulator(object):
     def commandline(self):
         """Parse command line"""
 
-        parser = argparse.ArgumentParser(add_help=False)
+        parser = argparse.ArgumentParser(add_help=False, argument_default=argparse.SUPPRESS)
 
         for parameter in self.cdist_type.optional_parameters:
             argument = "--" + parameter
@@ -95,6 +95,9 @@ class Emulator(object):
         for parameter in self.cdist_type.required_parameters:
             argument = "--" + parameter
             parser.add_argument(argument, dest=parameter, action='store', required=True)
+        for parameter in self.cdist_type.boolean_parameters:
+            argument = "--" + parameter
+            parser.add_argument(argument, dest=parameter, action='store_const', const='')
 
         # If not singleton support one positional parameter
         if not self.cdist_type.is_singleton:
diff --git a/lib/cdist/test/emulator/__init__.py b/lib/cdist/test/emulator/__init__.py
index f1ea5832..370d3d82 100644
--- a/lib/cdist/test/emulator/__init__.py
+++ b/lib/cdist/test/emulator/__init__.py
@@ -126,7 +126,7 @@ class AutoRequireEmulatorTestCase(test.CdistTestCase):
         self.assertEqual(sorted(cdist_object.requirements), sorted(expected))
 
 
-class ArgumentsWithDashesTestCase(test.CdistTestCase):
+class ArgumentsTestCase(test.CdistTestCase):
 
     def setUp(self):
         self.temp_dir = self.mkdtemp()
@@ -159,3 +159,59 @@ class ArgumentsWithDashesTestCase(test.CdistTestCase):
         cdist_type = core.CdistType(self.local.type_path, '__arguments_with_dashes')
         cdist_object = core.CdistObject(cdist_type, self.local.object_path, 'some-id')
         self.assertTrue('with-dash' in cdist_object.parameters)
+
+    def test_boolean(self):
+        type_name = '__arguments_boolean'
+        object_id = 'some-id'
+        argv = [type_name, object_id, '--boolean1']
+        os.environ.update(self.env)
+        emu = emulator.Emulator(argv)
+        emu.run()
+
+        cdist_type = core.CdistType(self.local.type_path, type_name)
+        cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
+        self.assertTrue('boolean1' in cdist_object.parameters)
+        self.assertFalse('boolean2' in cdist_object.parameters)
+        # empty file -> True
+        self.assertTrue(cdist_object.parameters['boolean1'] == '')
+
+    def test_required(self):
+        type_name = '__arguments_required'
+        object_id = 'some-id'
+        value = 'some value'
+        argv = [type_name, object_id, '--required1', value, '--required2', value]
+        os.environ.update(self.env)
+        emu = emulator.Emulator(argv)
+        emu.run()
+
+        cdist_type = core.CdistType(self.local.type_path, type_name)
+        cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
+        self.assertTrue('required1' in cdist_object.parameters)
+        self.assertTrue('required2' in cdist_object.parameters)
+        self.assertEqual(cdist_object.parameters['required1'], value)
+        self.assertEqual(cdist_object.parameters['required2'], value)
+
+#    def test_required_missing(self):
+#        type_name = '__arguments_required'
+#        object_id = 'some-id'
+#        value = 'some value'
+#        argv = [type_name, object_id, '--required1', value]
+#        os.environ.update(self.env)
+#        emu = emulator.Emulator(argv)
+#        
+#        self.assertRaises(SystemExit, emu.run)
+
+    def test_optional(self):
+        type_name = '__arguments_optional'
+        object_id = 'some-id'
+        value = 'some value'
+        argv = [type_name, object_id, '--optional1', value]
+        os.environ.update(self.env)
+        emu = emulator.Emulator(argv)
+        emu.run()
+
+        cdist_type = core.CdistType(self.local.type_path, type_name)
+        cdist_object = core.CdistObject(cdist_type, self.local.object_path, object_id)
+        self.assertTrue('optional1' in cdist_object.parameters)
+        self.assertFalse('optional2' in cdist_object.parameters)
+        self.assertEqual(cdist_object.parameters['optional1'], value)
diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean
new file mode 100644
index 00000000..3215c409
--- /dev/null
+++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_boolean/parameter/boolean
@@ -0,0 +1,2 @@
+boolean1
+boolean2
diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional
new file mode 100644
index 00000000..31647628
--- /dev/null
+++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_optional/parameter/optional
@@ -0,0 +1 @@
+optional1
diff --git a/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required
new file mode 100644
index 00000000..e0fba2c9
--- /dev/null
+++ b/lib/cdist/test/emulator/fixtures/conf/type/__arguments_required/parameter/required
@@ -0,0 +1,2 @@
+required1
+required2
diff --git a/lib/cdist/test/type/__init__.py b/lib/cdist/test/type/__init__.py
index 2ef14a4c..5e774aa9 100644
--- a/lib/cdist/test/type/__init__.py
+++ b/lib/cdist/test/type/__init__.py
@@ -145,3 +145,14 @@ class TypeTestCase(test.CdistTestCase):
         base_path = fixtures
         cdist_type = core.CdistType(base_path, '__without_optional_parameters')
         self.assertEqual(cdist_type.optional_parameters, [])
+
+    def test_with_boolean_parameters(self):
+        base_path = fixtures
+        cdist_type = core.CdistType(base_path, '__with_boolean_parameters')
+        self.assertEqual(cdist_type.boolean_parameters, ['boolean1', 'boolean2'])
+
+    def test_without_boolean_parameters(self):
+        base_path = fixtures
+        cdist_type = core.CdistType(base_path, '__without_boolean_parameters')
+        self.assertEqual(cdist_type.boolean_parameters, [])
+
diff --git a/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean b/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean
new file mode 100644
index 00000000..3215c409
--- /dev/null
+++ b/lib/cdist/test/type/fixtures/__with_boolean_parameters/parameter/boolean
@@ -0,0 +1,2 @@
+boolean1
+boolean2
diff --git a/lib/cdist/test/type/fixtures/__without_boolean_parameters/.keep b/lib/cdist/test/type/fixtures/__without_boolean_parameters/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/other/types_submitted_for_inclusion/__run_command/README.inclusion b/other/types_submitted_for_inclusion/__run_command/README.inclusion
new file mode 100644
index 00000000..f7c95da7
--- /dev/null
+++ b/other/types_submitted_for_inclusion/__run_command/README.inclusion
@@ -0,0 +1,6 @@
+This type is not much of use, as any type can issue code to be executed. 
+Thus you can implement the code directly in the calling type.
+ Or if you need to reuse it, create a type on its own.
+
+Because this seems to be a common misunderstanding when people come from "non managed areas",
+ where script iexecution is the main focus, I documented this in cdist-hacker to clearify.
diff --git a/other/types_submitted_for_inclusion/__run_command/gencode-remote b/other/types_submitted_for_inclusion/__run_command/gencode-remote
new file mode 100755
index 00000000..7ffd9a7b
--- /dev/null
+++ b/other/types_submitted_for_inclusion/__run_command/gencode-remote
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# 2012 Benedikt Koeppel (code at benediktkoeppel.ch)
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+
+if [ -f "$__object/parameter/command" ]; then
+   cat "$__object/parameter/command"
+else
+   echo "$name"
+fi
diff --git a/other/types_submitted_for_inclusion/__run_command/man.text b/other/types_submitted_for_inclusion/__run_command/man.text
new file mode 100644
index 00000000..5ea553c3
--- /dev/null
+++ b/other/types_submitted_for_inclusion/__run_command/man.text
@@ -0,0 +1,70 @@
+cdist-type__run_command(7)
+==========================
+Benedikt Koeppel <code--@--benediktkoeppel.ch>
+
+
+NAME
+----
+cdist-type__run_command - Run a command 
+
+
+DESCRIPTION
+-----------
+This cdist type allows you to run a specific command once at installation time.
+
+
+REQUIRED PARAMETERS
+-------------------
+
+
+OPTIONAL PARAMETERS
+-------------------
+command::
+   Command (with arguments) to run.
+
+   If no command is give, then the object_id is executed.
+
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Run a command
+__run_command "/etc/init.d/mysql restart"
+# runs `/etc/init.d/mysql restart` (the "object_id")
+
+# Run the same command:
+__run_command restart-mysql --command "/etc/init.d/mysql restart"
+# runs `/etc/init.d/mysql restart` (the --command argument)
+# additionally, it can easily be referenced (for example in a require="..."
+#as __run_command/restart-mysql
+
+# Run a script:
+__run_command install-pear --command "$(cat <<-EOF
+	/usr/bin/pear install --force Auth
+	/usr/bin/pear install --force HTML_Template_IT-1.2.1
+	/usr/bin/pear install --force MDB2
+	/usr/bin/pear install --force MDB2#mysql
+	/usr/bin/pear config-set preferred_state beta;
+	/usr/bin/pear install --force --alldeps Spreadsheet_Excel_Writer;
+	/usr/bin/pear config-set preferred_state stable
+	/usr/bin/pear install --force HTTP_Request
+	/usr/bin/pear install --force Mail
+	/usr/bin/pear install --force Auth_HTTP
+	/usr/bin/pear install --force XML_RPC 
+EOF
+)"
+
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2012 Benedikt Koeppel. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/other/types_submitted_for_inclusion/__run_command/parameter/optional b/other/types_submitted_for_inclusion/__run_command/parameter/optional
new file mode 100644
index 00000000..aa56d324
--- /dev/null
+++ b/other/types_submitted_for_inclusion/__run_command/parameter/optional
@@ -0,0 +1 @@
+command
diff --git a/other/types_submitted_for_inclusion/__run_command/parameter/required b/other/types_submitted_for_inclusion/__run_command/parameter/required
new file mode 100644
index 00000000..e69de29b