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 .
+#
+#
+# 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 .
+#
+
+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
+
+
+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 .
+#
+
+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