diff --git a/docker/xenial/repogen/.gitignore b/docker/xenial/repogen/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..89ca4e51d3543deb9897c15944aab4d79b2ace0c
--- /dev/null
+++ b/docker/xenial/repogen/.gitignore
@@ -0,0 +1,4 @@
+repodir/Packages
+repodir/Release
+repodir/Release.gpg
+
diff --git a/docker/xenial/repogen/Dockerfile b/docker/xenial/repogen/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..89162368e426776fab2ba056d45ba4a645679aff
--- /dev/null
+++ b/docker/xenial/repogen/Dockerfile
@@ -0,0 +1,13 @@
+FROM ubuntu:16.04
+MAINTAINER Mate Farkas <mate.farkas@sch.hu>
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get -y update && apt-get install -y \
+  apt-utils
+
+ADD usr/local/bin/generate-apt-metadata /usr/local/bin/generate-apt-metadata
+RUN chmod a+x /usr/local/bin/generate-apt-metadata
+
+CMD /usr/local/bin/generate-apt-metadata
+
diff --git a/docker/xenial/repogen/Makefile b/docker/xenial/repogen/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e21ef97459ad652992fd8990bd14438bc646cad6
--- /dev/null
+++ b/docker/xenial/repogen/Makefile
@@ -0,0 +1,8 @@
+TAG='matefarkas/xenial:repogen'
+
+all:
+	docker build --tag ${TAG} ${PWD}
+
+test:
+	docker run -it --rm --volume ${PWD}/repodir/:/build/ --volume ~/.gnupg/:/root/.gnupg/:ro ${TAG}
+
diff --git a/docker/xenial/repogen/README.md b/docker/xenial/repogen/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ce3d7832661cf30fe2b8217290baf7ac0a80f724
--- /dev/null
+++ b/docker/xenial/repogen/README.md
@@ -0,0 +1,8 @@
+# matefarkas/xenial:repogen
+
+DEB repo metadata generator.
+
+## alias
+
+    alias repogen-apt='docker run -it --rm --volume $PWD:/build/ --volume ~/.gnupg/:/root/.gnupg/:ro matefarkas/xenial:repogen'
+
diff --git a/docker/xenial/repogen/repodir/indeed.key b/docker/xenial/repogen/repodir/indeed.key
new file mode 100644
index 0000000000000000000000000000000000000000..446d38d7d7f689001f695a1021a637df5db7ec4d
--- /dev/null
+++ b/docker/xenial/repogen/repodir/indeed.key
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+mQINBFjmwNEBEACpG3M2mxamjG2w8o4Ll+qI0YkhldMfKCjjr/3T3P+mT+7QNmCS
+2eK6esmyrlpOwBk2uAAcD28iuewxfbMK1MXQVWZ1KP/XE9zzVgjenuu4bvaPfQ1G
+YMl5q6pxy4AWeBnMiOzDGiZ7uoa2Hx79aUg9HWR63lygZcqGaioPm2td57wTiwXf
+zqJiFSFL0zLqUwUVV/SkwWuVFd1tApWcz5Fj0JJKcP/OTj3i6ZBbCunwsWvab4Dq
+9IO9SLzXFkges35wZCbe3SWimj43l//kEsEE3gT9gCumaAifOPUUWy9OmwHrNs3Z
+s+qku8wKMP7IOFW2OjttDiTcAW8b2ioLSuIl5HFRiond9QO2CzrHKErajtbV+f/F
+L/wMrUSdvqJt7ECeMfOdK4g5szDaO7wjdg8gqFUp4Frivt81onzB7u0m3ihfqoZ1
+qNRTswRknGI49o21SHDzt1Game/SAiencqSuqlNYSDdEn+84/aLjZe9jLF4FS9hg
+jCRJT/ZAtKpAgj7/VTxdx/PaCR6t/WtHbv/fxxUGZ9nVzdN4Dw4BphganyNobHrJ
+4mLqEsrndaVTROQyuOM83TeEeR1IDopiK057CI/cxJFajj7L7OQ2SNV++JtZkA/2
+1XEhJjAff5Jw1d/ZCG+ARNR6inPHqDTZSUFh7vfhmWfbXMRqDWC6ut2t8wARAQAB
+tCBNYXRlIEZhcmthcyA8bWF0ZS5mYXJrYXNAc2NoLmh1PokCOAQTAQIAIgUCWObA
+0QIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQw6OkRgNq+pNW3w/+LZ7u
+iLmnjWcfMNUDQwmJzMt3f/SkEqEp9F/osYlVqQSFyx5mbhYLAZ0HAe1c5wed4LQ5
+H3m+dbcgXs3dp3YxMxA15fkPfbP65gy+KLR03kGstrINZb2zQtc7K6QGGzf6l7Ys
+OwHm0pku5iFR97QYf8k8/givImNqc00P4dpG2RqMV2EfIszDcevCrAOnQ+D/uww0
+3M7VQU5fB817cHTvjO7SRuAX5lJ/pAtE9kDYS2q0yNUvp60UoV3WoxDbrPNHdSYa
+MmumdjQvWsOmGChKKUjHsrWSf1wn+JKpzWf0pD4wchBeQGgWPr8eqb8yRj0fk/H/
+MAv2V7sqK3DMNnEMxdavKBD0ZWuRzlL0Bok7QWs/oDm2XVYFvrAj4Vg7GOKYyvqI
+4YtWMj36Vjb5bR7ZR6bg+sb6joOGLXoF3VZfdppbxvO+cXAsoGcZIedDEAtaASeq
+ZD53aoF8blmucpcIJZiobInsMp/oevp7nf3u6Ep0YItlsJ0JOkNi3DCS5XXqsOxY
+uo90gwOVwWsAX/O1x3vIi17M6+THB8TqqvOkB4QUCah4S01w84j97atJA5TM06XZ
+bO2/syBsfDly8piZ/vkJ8gidfBx6o6vp5A9lhukfEOwNe0t2RMUN1k5X1wduXOew
+ulkpoRHCkvxxZccI3JwAOQhaaUDQLJF6dl0Pw9c=
+=D1iS
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/docker/xenial/repogen/repodir/indeed.list b/docker/xenial/repogen/repodir/indeed.list
new file mode 100644
index 0000000000000000000000000000000000000000..ad3fc00c6a4096c9f978c0866e7a2f5fafce01b7
--- /dev/null
+++ b/docker/xenial/repogen/repodir/indeed.list
@@ -0,0 +1,2 @@
+deb http://indeed.sch.bme.hu/apt/ /
+
diff --git a/docker/xenial/repogen/repodir/pool/hello_1.0.0_all.deb b/docker/xenial/repogen/repodir/pool/hello_1.0.0_all.deb
new file mode 100644
index 0000000000000000000000000000000000000000..37c0363ed248d754025cd7da59f7ca5136ec98ec
Binary files /dev/null and b/docker/xenial/repogen/repodir/pool/hello_1.0.0_all.deb differ
diff --git a/docker/xenial/repogen/usr/local/bin/generate-apt-metadata b/docker/xenial/repogen/usr/local/bin/generate-apt-metadata
new file mode 100644
index 0000000000000000000000000000000000000000..b84d5445e62765575a659f9ca5e2ad4abdcf88b8
--- /dev/null
+++ b/docker/xenial/repogen/usr/local/bin/generate-apt-metadata
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+REPO_DIR=/build/
+PERMISSIONS=0444
+
+if [ ! -d $REPO_DIR ]
+then
+  echo "ERROR: ${REPO_DIR} doesn't exist."
+  exit 1
+fi
+
+uid=`stat -c '%u' $REPO_DIR`
+gid=`stat -c '%g' $REPO_DIR`
+
+cd $REPO_DIR
+apt-ftparchive packages $REPO_DIR > Packages
+sed -i "s|^Filename: ${REPO_DIR}|Filename: |" Packages
+apt-ftparchive release  $REPO_DIR > Release
+
+chown $uid:$gid Packages Release
+chmod $PERMISSIONS Packages Release
+
+if [ ! -d ~/.gnupg/ ]
+then
+  echo "ERROR: GPG config is missing."
+  exit 1
+fi
+
+gpg --armor --detach-sign --digest-algo SHA256 --sign --no-random-seed-file --output Release.gpg Release
+chown $uid:$gid Release.gpg
+chmod $PERMISSIONS Release.gpg
+