diff --git a/debian/Makefile b/debian/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ced2500faeed938195d41af80a71f88ed75b6cc6
--- /dev/null
+++ b/debian/Makefile
@@ -0,0 +1,44 @@
+PWD = $(shell pwd)
+VERSION = 1.0-1
+GPG_HEADLESS = --openpgp --decrypt --no-auto-check-trustdb --batch --no-tty --status-fd 1
+
+DEB_ROOT	= example
+DEB_ARCH	= all
+IN_FILES	= $(wildcard $(DEB_ROOT)/debian/templates/*.install.in)
+DEB_PACKAGE	= $(join $(addsuffix ../../, $(dir $(IN_FILES))), $(notdir $(IN_FILES:.install.in=_$(VERSION)_$(DEB_ARCH).deb)))
+
+META_ROOT	= meta
+
+default: all
+
+$(DEB_PACKAGE): $(IN_FILES)
+	cd $(DEB_ROOT)/; make -f debian/rules fill_templates VERSION=1.0
+	cd $(DEB_ROOT)/; dpkg-buildpackage -b -us -uc
+	mv *.deb *.buildinfo *.changes $(DEB_ROOT)/
+	cd $(DEB_ROOT)/; rm -rf debian/`basename $< | cut -d. -f1`
+
+all: $(DEB_PACKAGE) Release trash
+	@for deb in $(DEB_PACKAGE); do ar -p "$(DEB_PACKAGE)" _gpgbuilder 2>&1 | GNUPGHOME=/dev/null gpg $GPG_HEADLESS 2>&1 | grep -q "[GNUPG:\] NO_PUBKEY" || echo "UNSIGNED `basename $(DEB_PACKAGE)`"; done
+	@#ls -1 $(META_DATA)
+
+debian: $(DEB_PACKAGE)
+
+Release: $(DEB_PACKAGE)
+	@for pkg in $(DEB_PACKAGE); do deb=`readlink -m $$pkg`; ln -s -f $$deb $(META_ROOT)/`basename $$deb`; done
+	cd $(META_ROOT); ./stubrepo-debian.sh *.deb
+
+meta: Release
+
+trash:
+	cd $(DEB_ROOT)/; rm -f *.changes *.buildinfo
+	cd $(DEB_ROOT)/; rm -f debian/changelog debian/control debian/*.log debian/*.install debian/*.substvars debian/files
+	cd $(DEB_ROOT)/; rm -rf debian/example debian/.debhelper
+
+clean: trash
+	rm -f $(META_ROOT)/Packages $(META_ROOT)/Packages.gz
+	rm -f $(META_ROOT)/Release
+	rm -f $(META_ROOT)/Release.gpg $(META_ROOT)/InRelease
+	rm -f $(META_ROOT)/*.deb
+	rm -f $(DEB_ROOT)/*.deb
+
+.PHONY: all default debian meta trash clean
diff --git a/debian/example/debian/compat b/debian/example/debian/compat
new file mode 100644
index 0000000000000000000000000000000000000000..ec635144f60048986bc560c5576355344005e6e7
--- /dev/null
+++ b/debian/example/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/example/debian/rules b/debian/example/debian/rules
new file mode 100755
index 0000000000000000000000000000000000000000..bc95526a72a09b4e936fb47b4e13d32e93a10be8
--- /dev/null
+++ b/debian/example/debian/rules
@@ -0,0 +1,62 @@
+#!/usr/bin/make -f
+DH_VERBOSE := 1
+
+VERSION         ?= 999
+BRANCH          ?= 999
+REVISION        ?= 1
+TIMESTAMP       := $(shell date -R)
+
+%:
+	dh $@
+
+fill_templates:
+	for template in debian/templates/*.in; do \
+		dest=`echo $$template | \
+		      sed -e "s|\.in\$$||" \
+		          -e "s|templates\/||" \
+		          -e "s|BRANCH|$(BRANCH)|"`; \
+		sed -e "s|#VERSION#|$(VERSION)|g" \
+		    -e "s|#BRANCH#|$(BRANCH)|g" \
+		    -e "s|#SONAME#|$(SONAME)|g" \
+		    -e "s|#REVISION#|$(REVISION)|g" \
+		    -e "s|#TIMESTAMP#|$(TIMESTAMP)|g" \
+		    -e "s|#DEBLIBINSTDIR#|$(DEBLIBINSTDIR)|g" \
+		    $$template > $$dest; \
+	done
+
+override_dh_clean:
+	dh_clean
+
+override_dh_auto_clean:
+	date
+
+override_dh_auto_build:
+	rm -f lib*.so
+
+override_signfile:
+	cal
+
+override_dh_auto_install:
+	dh_install --exclude=none --fail-missing
+
+override_dh_makeshlibs:
+	DEB_BUILD_GNU_TYPE=$(DEB_HOST_GNU_TYPE) dh_makeshlibs
+
+#
+# Turn off a few of the debhelper scripts
+#
+override_dh_usrlocal:
+
+override_dh_strip:
+
+override_dh_strip_nondeterminism:
+
+#
+# Disable dh_shlibdeps to allow packaging to run on systems which aren't
+# the same architecture we're packaging for.
+#
+override_dh_shlibdeps:
+
+ifneq ($(DISABLE_FIXPERMS),)
+override_dh_fixperms:
+endif
diff --git a/debian/example/debian/source/format b/debian/example/debian/source/format
new file mode 100644
index 0000000000000000000000000000000000000000..163aaf8d82b6c54f23c45f32895dbdfdcc27b047
--- /dev/null
+++ b/debian/example/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/example/debian/templates/changelog.in b/debian/example/debian/templates/changelog.in
new file mode 100644
index 0000000000000000000000000000000000000000..14db62f58298a113532710133d8574169725928f
--- /dev/null
+++ b/debian/example/debian/templates/changelog.in
@@ -0,0 +1,5 @@
+example (#VERSION#-#REVISION#) stable; urgency=low
+
+  * Example Debian package build
+
+ -- maintainer <maintainer@example.com>  #TIMESTAMP#
diff --git a/debian/example/debian/templates/control.in b/debian/example/debian/templates/control.in
new file mode 100644
index 0000000000000000000000000000000000000000..f7a10c8f66bb84c5b2108a8a587fc20eb1a0d503
--- /dev/null
+++ b/debian/example/debian/templates/control.in
@@ -0,0 +1,10 @@
+Source: example
+Maintainer: maintainer <maintainer@example.com>
+Section: multiverse/devel
+Priority: optional
+Standards-Version: 3.8.0
+
+Package: example
+Architecture: all
+Depends: ${misc:Depends}
+Description: Example package for test of Debian package signing
diff --git a/debian/example/debian/templates/example.install.in b/debian/example/debian/templates/example.install.in
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/debian/meta/stubrepo-debian.sh b/debian/meta/stubrepo-debian.sh
new file mode 100755
index 0000000000000000000000000000000000000000..61aa8f8310d636d28d36bd5cd228e9fd9d7cccdc
--- /dev/null
+++ b/debian/meta/stubrepo-debian.sh
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+repo_origin="EXAMPLE"
+repo_label="Unstable"
+pkg_arch="all"
+pkg_date=$(date -R -u)
+
+err() { echo "ERROR: $*"; exit 1; }
+
+find_tag() {
+    local index=0
+    for key in ${pkg_tags[@]}; do
+        if [[ "$key" == "null" ]]; then
+            pkg_tags[$index]="null"
+        elif [[ "$key" == "$1" ]] || [[ -z "$1" ]]; then
+            value=$(dpkg-deb --field "$filename" "$key")
+            echo "$key: $value"
+            pkg_tags[$index]="null"
+        fi
+        index=$((index+1))
+    done
+}
+
+deb_pkg_info() {
+    [[ -f "$1" ]] || err "deb_pkg_info() file $1 not found"
+
+    # Calculate some values
+    pkg_size=$(du -b "$1" 2>/dev/null | awk '{print $1}')
+    pkg_md5=$(md5sum "$1" 2>/dev/null | awk '{print $1}')
+    pkg_sha1=$(sha1sum "$1" 2>/dev/null | awk '{print $1}')
+    pkg_sha256=$(sha256sum "$1" 2>/dev/null | awk '{print $1}')
+    pkg_sha512=$(sha512sum "$1" 2>/dev/null | awk '{print $1}')
+
+    # Order matters
+    filename="$1"
+    pkg_tags=($(dpkg --info "$filename" | sed 's/^ //' | grep -E "^[A-Za-z-]+:" | awk -F ":" '{print $1}'))
+    taglist="Package Version Architecture Multi-Arch Priority Section Source Origin Maintainer Original-Maintainer"
+    taglist+="Bugs Installed-Size Provides Depends Recommends Suggests Conflicts Breaks Replaces"
+    for tag in $taglist; do
+        find_tag $tag
+    done
+
+    # Append calculated values
+    echo "Filename: ./$1"
+    echo "Size: $pkg_size"
+    echo "MD5sum: $pkg_md5"
+    echo "SHA1: $pkg_sha1"
+    echo "SHA256: $pkg_sha256"
+    echo "SHA512: $pkg_sha512"
+
+    # Append package description
+    find_tag "Homepage"
+    find_tag "Description"
+
+    # Anything leftover
+    find_tag
+}
+
+deb_metadata()
+{
+    local Packages="$1"
+    [[ -f "$Packages" ]] || err "Packages file not found"
+
+    # Compress manifest
+    gzip -c -9 -f $Packages > ${Packages}.gz
+    echo ":: ${Packages}.gz"
+    [[ -f "Packages.gz" ]] || err "Packages.gz file not found"
+
+    # Calculate hashes
+    txt_bytes=$(wc --bytes Packages | awk '{print $1}')
+    txt_md5=$(md5sum Packages | awk '{print $1}')
+    txt_sha1=$(sha1sum Packages | awk '{print $1}')
+    txt_sha256=$(sha256sum Packages | awk '{print $1}')
+
+    gz_bytes=$(wc --bytes Packages.gz | awk '{print $1}')
+    gz_md5=$(md5sum Packages.gz | awk '{print $1}')
+    gz_sha1=$(sha1sum Packages.gz | awk '{print $1}')
+    gz_sha256=$(sha256sum Packages.gz | awk '{print $1}')
+
+    # Build checksum file
+    pkg_arch=$(basename "$subpath")
+    pkg_date=$(date -R -u)
+
+    {
+      echo "Origin: ${repo_origin}"
+      echo "Label: ${repo_label}"
+      echo "Architecture: ${pkg_arch}"
+      echo "Date: ${pkg_date}"
+      echo "MD5Sum:"
+      printf " %s %48d %s\n" $txt_md5 $txt_bytes Packages
+      printf " %s %48d %s\n" $gz_md5 $gz_bytes Packages.gz
+      echo "SHA1:"
+      printf " %s %40d %s\n" $txt_sha1 $txt_bytes Packages
+      printf " %s %40d %s\n" $gz_sha1 $gz_bytes Packages.gz
+      echo "SHA256:"
+      printf " %s %16d %s\n" $txt_sha256 $txt_bytes Packages
+      printf " %s %16d %s\n" $gz_sha256 $gz_bytes Packages.gz
+
+      # FIXME prevent hash mismatch error
+      echo "Acquire-By-Hash: no"
+    } > "Release"
+}
+
+if [[ -z $1 ]] || [[ ! -f $1 ]]; then
+    err "USAGE: $0 [*.deb]"
+fi
+
+if [[ ! -f "Package" ]]; then
+    for package in $@; do
+        deb_pkg_info "$package" >> Packages
+    done
+fi
+
+if [[ ! -f "Release" ]]; then
+    deb_metadata "Packages"
+fi
+
+### END ###