diff --git a/cdist/conf/type/__block/explorer/block b/cdist/conf/type/__block/explorer/block
new file mode 100755
index 00000000..6c35bc46
--- /dev/null
+++ b/cdist/conf/type/__block/explorer/block
@@ -0,0 +1,21 @@
+#!/bin/sh
+# 2013 Steven Armstrong (steven-cdist at armstrong.cc)
+
+file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
+
+# file does not exist, nothing we could do
+[ -f "$file" ] || exit 0
+
+prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
+suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
+awk -v prefix="$prefix" -v suffix="$suffix" '{
+ if (index($0,prefix)) {
+ triggered=1
+ }
+ if (triggered) {
+ if (index($0,suffix)) {
+ triggered=0
+ }
+ print
+ }
+}' "$file"
diff --git a/cdist/conf/type/__block/gencode-remote b/cdist/conf/type/__block/gencode-remote
new file mode 100755
index 00000000..0a5eea18
--- /dev/null
+++ b/cdist/conf/type/__block/gencode-remote
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# 2013 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 .
+#
+
+file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
+state_should=$(cat "$__object/parameter/state")
+prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
+suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
+
+block="$__object/files/block"
+if [ ! -s "$__object/explorer/block" ]; then
+ state_is='absent'
+else
+ state_is=$(diff -q "$block" "$__object/explorer/block" >/dev/null \
+ && echo present \
+ || echo changed
+ )
+fi
+
+state_should="$(cat "$__object/parameter/state")"
+if [ "$state_should" = "$state_is" ]; then
+ # Nothing to do, move along
+ exit 0
+fi
+
+remove_block() {
+ cat << DONE
+tmpfile=\$(mktemp ${file}.cdist.XXXXXXXXXX)
+# preserve ownership and permissions of existing file
+if [ -f "$file" ]; then
+ cp -p "$file" "\$tmpfile"
+fi
+awk -v prefix="$prefix" -v suffix="$suffix" '
+{
+ if (index(\$0,prefix)) {
+ triggered=1
+ }
+ if (triggered) {
+ if (index(\$0,suffix)) {
+ triggered=0
+ }
+ } else {
+ print
+ }
+}' "$file" > "\$tmpfile"
+mv -f "\$tmpfile" "$file"
+DONE
+}
+
+case "$state_should" in
+ present)
+ if [ "$state_is" = "changed" ]; then
+ echo update >> "$__messages_out"
+ remove_block
+ else
+ echo add >> "$__messages_out"
+ fi
+ cat << DONE
+cat >> "$file" << ${__type##*/}_DONE
+$(cat "$block")
+${__type##*/}_DONE
+DONE
+ ;;
+ absent)
+ echo remove >> "$__messages_out"
+ remove_block
+ ;;
+esac
diff --git a/cdist/conf/type/__block/man.text b/cdist/conf/type/__block/man.text
new file mode 100644
index 00000000..2312d293
--- /dev/null
+++ b/cdist/conf/type/__block/man.text
@@ -0,0 +1,82 @@
+cdist-type__block(7)
+====================
+Steven Armstrong
+
+
+NAME
+----
+cdist-type__block - Manage blocks of text in files
+
+
+DESCRIPTION
+-----------
+Manage a block of text in an existing file.
+The block is identified using the prefix and suffix parameters.
+Everything between prefix and suffix is considered to be a managed block
+of text.
+
+
+REQUIRED PARAMETERS
+-------------------
+text::
+ the text to manage.
+ If text is '-' (dash), take what was written to stdin as the text.
+
+
+OPTIONAL PARAMETERS
+-------------------
+file::
+ the file in which to manage the text block.
+ Defaults to object_id.
+
+prefix::
+ the prefix to add before the text.
+ Defaults to #cdist:__block/$__object_id
+
+suffix::
+ the prefix to add after the text.
+ Defaults to #/cdist:__block/$__object_id
+
+state::
+ 'present' or 'absent', defaults to 'present'
+
+
+MESSAGES
+--------
+add::
+ block was added
+update::
+ block was updated/changed
+remove::
+ block was removed
+
+
+EXAMPLES
+--------
+
+--------------------------------------------------------------------------------
+# text from argument
+__block /path/to/file \
+ --prefix '#start' \
+ --suffix '#end' \
+ --text 'some\nblock of\ntext'
+
+# text from stdin
+__block some-id \
+ --file /path/to/file \
+ --text - << DONE
+here some block
+of text
+DONE
+--------------------------------------------------------------------------------
+
+
+SEE ALSO
+--------
+- cdist-type(7)
+
+
+COPYING
+-------
+Copyright \(C) 2013 Steven Armstrong. Free use of this software is
+granted under the terms of the GNU General Public License version 3 (GPLv3).
diff --git a/cdist/conf/type/__block/manifest b/cdist/conf/type/__block/manifest
new file mode 100755
index 00000000..1fc9ec79
--- /dev/null
+++ b/cdist/conf/type/__block/manifest
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# 2013-2014 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 .
+#
+
+
+file="$(cat "$__object/parameter/file" 2>/dev/null || echo "/$__object_id")"
+prefix=$(cat "$__object/parameter/prefix" 2>/dev/null || echo "#cdist:__block/$__object_id")
+suffix=$(cat "$__object/parameter/suffix" 2>/dev/null || echo "#/cdist:__block/$__object_id")
+text=$(cat "$__object/parameter/text")
+
+mkdir "$__object/files"
+# Generate text block for inclusion in file
+block="$__object/files/block"
+echo "$prefix" > "$block"
+if [ "$text" = "-" ]; then
+ cat "$__object/stdin" >> "$block"
+else
+ cat "$text" >> "$block"
+fi
+echo "$suffix" >> "$block"
diff --git a/cdist/conf/type/__block/parameter/default/state b/cdist/conf/type/__block/parameter/default/state
new file mode 100644
index 00000000..e7f6134f
--- /dev/null
+++ b/cdist/conf/type/__block/parameter/default/state
@@ -0,0 +1 @@
+present
diff --git a/cdist/conf/type/__block/parameter/optional b/cdist/conf/type/__block/parameter/optional
new file mode 100644
index 00000000..fa3abebf
--- /dev/null
+++ b/cdist/conf/type/__block/parameter/optional
@@ -0,0 +1,4 @@
+file
+prefix
+state
+suffix
diff --git a/cdist/conf/type/__block/parameter/required b/cdist/conf/type/__block/parameter/required
new file mode 100644
index 00000000..8e27be7d
--- /dev/null
+++ b/cdist/conf/type/__block/parameter/required
@@ -0,0 +1 @@
+text