diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..a7affd6d522c56778d3b939321063b263fc2e8fd
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+.gitlab-ci.yml export-ignore
+.gitattributes export-ignore
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ca7f069edcb40d765dafc8a2cb770449b77bf764..83f5c4d3b761d37728f8fb70a74fb71b86031280 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,6 +2,7 @@ stages:
     - quality
     - tests
     - install
+    - upload
 
 
 
@@ -44,3 +45,32 @@ make-install:
 
 
 
+upload-tagged:
+    stage: install
+    only:
+        - /^v[0-9a-z\.]+@[0-9a-z]+/[0-9a-z]+$/
+    script:
+        - export DEBIAN_FRONTEND=noninteractive
+        - apt-get update
+        - apt-get dist-upgrade -y
+        - apt-get install -y git xz curl lftp gnupg
+        - cd "$CI_PROJECT_DIR"
+        - make install
+        # Import signing key
+        - echo "$GPG_SIGNKEY" | gpg --import
+        # Work out naming
+        - ARCHIVE_NAME=${CI_PROJECT_NAME}-${CI_BUILD_TAG##v}
+        # Create tar archive
+        - git archive --format=tar --prefix=${ARCHIVE_NAME}/ ${CI_BUILD_TAG} > ../${ARCHIVE_NAME}.tar
+        # Create compressed versions
+        - xz --keep --extreme -9 ../*.tar
+        # Sign compressed tar files
+        - gpg --sign --detach-sign --armor ../*.tar.xz
+        # Upload files, translating .asc into .sign
+        - lftp -e "set ssl:ca-file '/etc/ssl/certs/ca-certificates.crt'; set net:max-retries '5'; set net:timeout '60'; mkdir '${CI_BUILD_TAG}'; cd '${CI_BUILD_TAG}'; put ../'${ARCHIVE_NAME}.tar.xz' -o '${ARCHIVE_NAME}.tar.xz'; put ../'${ARCHIVE_NAME}.tar.xz.asc' -o '${ARCHIVE_NAME}.tar.xz.sign'; quit" -u "$UPLOAD_CRED" "$UPLOAD_HOST" 2>&1
+        # Test uploaded files
+        - curl --fail -o /dev/null "$DOWNLOAD_URL/${CI_BUILD_TAG}/${ARCHIVE_NAME}.tar.xz"
+        - curl --fail -o /dev/null "$DOWNLOAD_URL/${CI_BUILD_TAG}/${ARCHIVE_NAME}.tar.xz.sign"
+
+
+
diff --git a/TODO b/TODO
deleted file mode 100644
index 70f96d554f37cf41eb4092ae8657fb5886208e0e..0000000000000000000000000000000000000000
--- a/TODO
+++ /dev/null
@@ -1 +0,0 @@
-* This now needs proper perl POD documentation