diff --git a/conf/type/__key_value/explorer/value b/conf/type/__key_value/explorer/value
new file mode 100755
index 00000000..b1d7983f
--- /dev/null
+++ b/conf/type/__key_value/explorer/value
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+#
+# Get the current value of key or __NOTSET__ if the key doesn't exist.
+#
+
+key="$(cat "$__object/parameter/key")"
+file="$(cat "$__object/parameter/file")"
+delimiter="$(cat "$__object/parameter/delimiter")"
+
+awk -F "$delimiter" '
+BEGIN { found=0 }
+/^'$key'/ { print $2; found=1 }
+END { if (found) exit 0; else exit 1 }' "$file" \
+|| echo "__NOTSET__"
+
diff --git a/conf/type/__key_value/gencode-remote b/conf/type/__key_value/gencode-remote
new file mode 100755
index 00000000..e41cd9b5
--- /dev/null
+++ b/conf/type/__key_value/gencode-remote
@@ -0,0 +1,52 @@
+#!/bin/sh
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+value_is="$(cat "$__object/explorer/value")"
+value_should="$(cat "$__object/parameter/value")"
+
+key="$(cat "$__object/parameter/key")"
+file="$(cat "$__object/parameter/file")"
+delimiter="$(cat "$__object/parameter/delimiter")"
+
+if [ "$value_is" != "$value_should" ]; then
+   case "$value_is" in
+      __NOTSET__)
+         # add key and value
+         echo "echo \"${key}${delimiter}${value_should}\" >> \"$file\""
+      ;;
+      *)
+         if [ "$value_should" = '__NOTSET__' ]; then
+            # remove key and value
+            cat << DONE
+sed -i '/^${key}/d' "$file"
+DONE
+         else 
+            # change value
+            cat << DONE
+awk -F "$delimiter" '
+/${key}${delimiter}*/{gsub(/$value_is/, $value_should)};{print}' "$file" > "${file}+" \
+&& mv "${file}+" "$file"
+
+DONE
+         fi
+      ;;
+   esac
+fi
+
diff --git a/conf/type/__key_value/man.text b/conf/type/__key_value/man.text
new file mode 100644
index 00000000..78ba09a5
--- /dev/null
+++ b/conf/type/__key_value/man.text
@@ -0,0 +1,59 @@
+cdist-type__key_value(7)
+==========================
+Steven Armstrong <steven-cdist--@--armstrong.cc>
+
+
+NAME
+----
+cdist-type__key_value - Change property values in files
+
+
+DESCRIPTION
+-----------
+This cdist type allows you to change values in a key value based config
+file.
+
+
+REQUIRED PARAMETERS
+-------------------
+value::
+   The value for the key. Setting the value to __NOTSET__ will remove the key
+   from the file.
+file::
+   The file to operate on.
+delimiter::
+   The delimiter which seperates the key from the value.
+
+
+OPTIONAL PARAMETERS
+-------------------
+key::
+   The key to change. Defaults to object_id.
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# Set the maximum system user id 
+__key_value SYS_UID_MAX --file /etc/login.defs --value 666 --delimiter ' '
+
+# Same with fancy id
+__key_value my-fancy-id --file /etc/login.defs --key SYS_UID_MAX --value 666 \
+   --delimiter ' '
+
+# Enable packet forwarding
+__key_value net.ipv4.ip_forward --file /etc/sysctl.conf --value 1 \
+   --delimiter '='
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2011 Steven Armstrong. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/conf/type/__key_value/manifest b/conf/type/__key_value/manifest
new file mode 100755
index 00000000..706b0b0d
--- /dev/null
+++ b/conf/type/__key_value/manifest
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+if [ -f "$__object/parameter/key" ]; then
+   key="$(cat "$__object/parameter/key")"
+else
+   echo "$__object_id" > "$__object/parameter/key"
+fi
+
diff --git a/conf/type/__key_value/parameter/optional b/conf/type/__key_value/parameter/optional
new file mode 100644
index 00000000..06bfde49
--- /dev/null
+++ b/conf/type/__key_value/parameter/optional
@@ -0,0 +1 @@
+key
diff --git a/conf/type/__key_value/parameter/required b/conf/type/__key_value/parameter/required
new file mode 100644
index 00000000..8f4aa53c
--- /dev/null
+++ b/conf/type/__key_value/parameter/required
@@ -0,0 +1,3 @@
+value
+file
+delimiter