diff --git a/.gitignore b/.gitignore
index e714e214fdff6d0877dca47e31a35a37f1b6eabc..71fc585c5a6b12f916a255359f6f0d1bd6a2748a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,10 +12,12 @@ _obj
 _test
 bin
 /.release/*+*
+/.release/*.tgz
+/.release/*.patch
+/.release/*.migrate
 /_live*/
 /VERSION
 
-
 # Architecture specific extensions/prefixes
 *.[568vq]
 [568vq].out
diff --git a/cleanup b/cleanup
index 110659ed8784384ed2cefe41e83d3557b45917f8..bb084a9d0389bd3e4ed2de82c57f056669408919 100755
--- a/cleanup
+++ b/cleanup
@@ -1,67 +1,64 @@
 #!/bin/bash
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
+warn() { echo "$@" >&2;        }
+die() { warn "$@"; exit 1;     }
 
 main () {
-    if test -z $UNSAFE; then
-    	die 'Operation is unsafe, set UNSAFE=1 before run this script'
-    fi
+        if test -z $UNSAFE; then
+                die 'Operation is unsafe, set UNSAFE=1 before run this script'
+        fi
 
-    if test -z $1; then
-        die 'Pass version as argument'
-    fi
+        if test -z $1; then
+                die 'Pass version as argument'
+        fi
 
-    real_last_version=$(last_version)
+        real_last_version=$(last_version)
 
-    arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":")
+        arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":")
 
-    if test -z $arg_version_line; then
-        die 'Invalid version passed'
-    fi
+        if test -z $arg_version_line; then
+                die 'Invalid version passed'
+        fi
 
-    last_version_line=$(list_versions | grep -n "$real_last_version" | awk '{print $1}' FS=":")
+        last_version_line=$(list_versions | grep -n "$real_last_version" | awk '{print $1}' FS=":")
 
-    versions_to_delete=$(list_versions | awk "NR > $arg_version_line && NR <= $last_version_line")
+        versions_to_delete=$(list_versions | awk "NR > $arg_version_line && NR <= $last_version_line")
 
-    check_versions $versions_to_delete
+        check_versions $versions_to_delete
 
-    remove_versions $versions_to_delete || die "Failed to cleanup versions"
-    git reflog expire --expire=now --all
-    git gc --prune=now
-    git gc --aggressive --prune=now
-    if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then
-        git push -v -f --mirror --prune   || die "Failed"
-    fi
+        remove_versions $versions_to_delete || die "Failed to cleanup versions"
 
-    ./release $real_last_version || die "Failed to re-release $real_last_version"
+        git tag --delete $real_last_version
+        git push origin :refs/tags/$real_last_version
+
+        ./release $real_last_version || die "Failed to re-release $real_last_version"
 }
 
 check_versions () {
-    if test $# -lt 2; then
-        echo "Nothing to delete"
-        exit 0
-    fi
+        if test $# -lt 2; then
+                warn "Nothing to delete"
+                exit 0
+        fi
 }
 
 remove_versions () {
-    for var in "$@"
-    do
-        ./remove_version $var || die "Failed to delete $var"
-    done
+        for var in "$@"
+        do
+                ./remove_version $var || die "Failed to delete $var"
+        done
 }
 
 next_version() {
-    arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":")
-    next_version_line=$(($arg_version_line+1))
-    list_versions | awk "NR==$next_version_line"
+        arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":")
+        next_version_line=$(($arg_version_line+1))
+        list_versions | awk "NR==$next_version_line"
 }
 
 last_version() {
-    list_versions | tail -n 1
+        list_versions | tail -n 1
 }
 
 list_versions() {
-    grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
+        grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
 }
 
 main "$@"
diff --git a/cleanup_tags b/cleanup_tags
deleted file mode 100755
index 73db672c87baab92f046c80500b924d69e8145f9..0000000000000000000000000000000000000000
--- a/cleanup_tags
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
-
-if test -z $UNSAFE; then
-	die 'Operation is unsafe, set UNSAFE=1 before run this script'
-fi
-
-leave=`cat migrate | grep '^VERSION' |awk '{print $2}' | xargs | sed 's/ /|/g'`
-git tag | grep -vE  "^$leave$" |xargs git tag -d
-git filter-branch --tree-filter 'find . -name \*.tgz -exec rm -f {} \;' HEAD
-git gc  --prune=now && git gc  --prune=now --aggressive
-git push -v -f --mirror --prune
diff --git a/deploy b/deploy
index cf027ee03faa0b3dc1e688ad1508ff73b0770562..6aaa294b1a5e408cec6c0725acdac980a3cad007 100755
--- a/deploy
+++ b/deploy
@@ -1,21 +1,36 @@
 #!/usr/bin/env bash
+warn()  { echo "$@" >&2;        }
+die()   { warn "$@"; exit 1;    }
+
 test "$1" = '-n' && shift || RUN_TESTS=1
+test "$1" = '-l' && shift || LOCAL_ARTS=1
+
+main() {
+        test -z "$LOCAL_ARTS" || sync_arts || die 'Failed'
+
+        VERSION=${1:-$(< VERSION)}
+
+        #... PUT DEPLOY INSTRUCTION FOR YOUR PROJECT HERE ...
+        find .release -type f -name '*+*' \
+                -not -name "$(cat VERSION).*" \
+                -not -name "$(cat _live/VERSION 2>/dev/null).*" \
+                -delete
+        mkdir -p _live &&
+        ln -sf ../.release _live/ &&
+        cd _live &&
+        narada-install --allow-downgrade --allow-restore "$VERSION" &&
+        if test -n "$RUN_TESTS" -a -d t/devel; then
+                prove -r t/devel/
+        fi &&
+        if test -n "$RUN_TESTS" -a -d bin; then
+                prove -r bin/
+        fi &&
+        rm -f .backup/*+*
+}
 
-VERSION=${1:-$(< VERSION)}
+sync_arts() {
+        local src="artifacts@artifacts.tgms.qarea.org:artifacts/$(basename $(pwd))/"
+        rsync -avz --ignore-existing "$src" .release/
+}
 
-#... PUT DEPLOY INSTRUCTION FOR YOUR PROJECT HERE ...
-find .release -type f -name '*+*' \
-	-not -name "$(cat VERSION).*" \
-	-not -name "$(cat _live/VERSION 2>/dev/null).*" \
-	-delete
-mkdir -p _live &&
-ln -sf ../.release _live/ &&
-cd _live &&
-narada-install --allow-downgrade --allow-restore "$VERSION" &&
-if test -n "$RUN_TESTS" -a -d t/devel; then
-	prove -r t/devel/
-fi &&
-if test -n "$RUN_TESTS" -a -d bin; then
-	prove -r bin/
-fi &&
-rm -f .backup/*+*
+main $@
diff --git a/deploy_prod b/deploy_prod
deleted file mode 100755
index f2e91cc95d2d36f50b99f22c6b7e204f43a46489..0000000000000000000000000000000000000000
--- a/deploy_prod
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
-
-main() {
-        local addr=$DEPLOY_ADDR #should be prod
-        local path=$DEPLOY_PATH
-	
-	git checkout dev    || die "Failed to checkout dev branch"
-	git pull origin dev || die "Failed to pull dev branch"
-
-	go get -u -t ./... || die "Failed to update dependendcies" 
-	./build || die "Failed to build project" 
-
-
-        last_ver=$(list_versions | tail -n1)
-
-	if [ -n "$KEYPATH" ]; then
-	    prod_ver=$(ssh -i $KEYPATH $addr cat "$path/VERSION") || die "Failed to fetch version from prod"
-	else
-            prod_ver=$(ssh $addr cat "$path/VERSION") || die "Failed to fetch version from prod"
-	fi
-
-        echo "Production version"
-	echo $prod_ver
-
-        ./cleanup $prod_ver || die "Failed to cleanup"
-
-        git checkout master || die "Failed to checkout master branch"
-
-        git merge --no-edit $last_ver || die "Failed to merge last version into master"
-
-        ./deploy_server $last_ver || die "Failed to deploy $last_ver"
-
-        git gc --aggressive
-
-        if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then
-            git push origin --force --all     || die "Failed"
-            git push origin --force --tags    || die "Failed"
-        fi
-}
-
-list_versions() {
-	grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
-}
-
-main "$@"
diff --git a/deploy_server b/deploy_server
deleted file mode 100755
index 441a14d69a9218d4fb130160c8ce9ddc5591aed9..0000000000000000000000000000000000000000
--- a/deploy_server
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
-
-main() {
-	local addr=$DEPLOY_ADDR
-	local path=$DEPLOY_PATH
-	echo "Deploy addr '$addr'"
-	echo "Deploy path '$path'"
-	local v="${1:-$(< VERSION)}"
-	list_versions | grep -q -x -F "$v"      || die "Version '$v' is not released yet"
-
-	if [ -n "$KEYPATH" ]; then
-		rsync -avzR --size-only -e "ssh -i $KEYPATH" $(git ls-files .release/) "${addr}:${path}" &&
-		ssh -o RequestTTY=yes -i $KEYPATH "$addr" bash -l -c \' "set -x; cd '$path' && narada-install '$v'" \'
-	else
-		rsync -avzR --size-only $(git ls-files .release/) "${addr}:${path}" &&
-		ssh -o RequestTTY=yes "$addr" bash -l -c \' "set -x; cd '$path' && narada-install '$v'" \'
-	fi
-	}
-list_versions() {
-	grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
-}
-
-main "$@"
diff --git a/release b/release
index f7c562c58add67df95646a3f7bfc4edc63852592..296925169e66a1e7c4798343343e53123e2f94d1 100755
--- a/release
+++ b/release
@@ -1,53 +1,92 @@
 #!/usr/bin/env bash
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
+warn()  { echo "$@" >&2;        }
+die()   { warn "$@"; exit 1;    }
 
 main() {
-	if test $# -gt 1 -o "$1" = '-h' -o "$1" = '--help'; then
-		die 'Usage: ./release [-h|--help|-n|--major|--minor|--patch|<version>]'
-	fi
+        if test $# -gt 1 -o "$1" = '-h' -o "$1" = '--help'; then
+                die 'Usage: ./release [-h|--help|-n|--major|--minor|--patch|<version>]'
+        fi
 
-	if test $# -eq 1 -a "$1" = '-n'; then
-		shift
-		local test=''
-	elif test $# -eq 1; then
-		export RELEASE_TESTING=1
-		local test='--test'
-	else
-		local test='--test'
-	fi
-	./build $test   || die 'Please fix the build first, then try again'
+        if test $# -eq 1 -a "$1" = '-n'; then
+                shift
+                local test=''
+        elif test $# -eq 1; then
+                export RELEASE_TESTING=1
+                local test='--test'
+        else
+                local test='--test'
+        fi
+        ./build $test   || die 'Please fix the build first, then try again'
 
-	if test $# -eq 0; then
-		release_project
-		release_migrate
-	else
-		workdir_is_clean  || die 'Please commit all changes first, then try again'
-		local version="$(get_version "$1")"             || die 'Failed'
-		if release_version "$version" migrate; then
-			git add migrate                         || die 'Failed'
-			echo "$version" > VERSION               || die 'Failed'
-			release_project
-			release_migrate
-			git add ".release/${version}".*         || die 'Failed'
-            git commit -m "Release $version [ci-skip]"        || die 'Failed'
-		fi
-		git tag -a -m release "$version"                || die 'Failed'
-		if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then
-			git push --follow-tags                  || die 'Failed'
-		fi
-	fi
+        if test $# -eq 0; then
+                release_project
+                release_migrate
+        else
+                workdir_is_clean  || die 'Please commit all changes first, then try again'
+                # First get_version to check valid version
+                get_version "$1" || die 'Failed'
+                local version="$(get_version "$1")"
+                check_artifacts $version || die "Version $version exists in artifacts"
+                if release_version "$version" migrate; then
+                        ssh artifacts@artifacts.tgms.qarea.org "mkdir -p artifacts/$(basename $(pwd))"
+                        trap cleanup EXIT
+                        git add migrate                            || die 'Failed'
+                        echo "$version" > VERSION                  || die 'Failed'
+                        release_project                            || die 'Failed'
+                        release_migrate                            || die 'Failed'
+                        move_artifacts                             || die 'Failed'
+                        trap - EXIT
+                        git commit -m "Release $version [ci-skip]" || die 'Failed'
+                fi
+                git tag -a -m release "$version"                   || die 'Failed'
+                if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then
+                        git push --follow-tags                     || die 'Failed'
+                fi
+        fi
+}
+
+check_artifacts() {
+        local addr='artifacts@artifacts.tgms.qarea.org'
+        local migrate_file="artifacts/$(basename $(pwd))/$1.migrate"
+        ssh "$addr" "test ! -f $migrate_file"
+}
+
+move_artifacts() {
+        local path
+        path="artifacts@artifacts.tgms.qarea.org:artifacts/$(basename $(pwd))"
+        cd .release
+        rsync -avzR --size-only $(git ls-files .) "$path" &&
+        cd .. &&
+        copy_file_remote .release/$(< VERSION).patch &&
+        copy_file_remote .release/$(< VERSION).tgz &&
+        copy_file_remote .release/$(< VERSION).migrate || die 'Failed'
+}
+
+copy_file_remote() {
+        if test -f $1; then
+                echo 'Copying ' $1
+                local path
+                path=artifacts/$(basename $(pwd))
+                scp $1 artifacts@artifacts.tgms.qarea.org:$path/. || die 'Failed'
+        fi
+}
+
+cleanup() {
+        git checkout HEAD migrate
+        test -f .release/$(< VERSION).patch && rm .release/$(< VERSION).patch
+        test -f .release/$(< VERSION).tgz && rm .release/$(< VERSION).tgz
+        test -f .release/$(< VERSION).migrate && rm .release/$(< VERSION).migrate
 }
 
 release_project() {
-	#... PUT RELEASE INSTRUCTION FOR YOUR PROJECT FILES HERE ...
-	local prev_version
-	if list_versions | grep -q -x -F -f VERSION; then
-		prev_version=$(list_versions | grep -B 1 -x -F -f VERSION | head -n 1)
-	else
-		prev_version=$(list_versions | tail -n 1)
-	fi
-	git diff --name-only --binary "$prev_version" |
+        #... PUT RELEASE INSTRUCTION FOR YOUR PROJECT FILES HERE ...
+        local prev_version
+        if list_versions | grep -q -x -F -f VERSION; then
+                prev_version=$(list_versions | grep -B 1 -x -F -f VERSION | head -n 1)
+        else
+                prev_version=$(list_versions | tail -n 1)
+        fi
+        git diff --name-only --binary "$prev_version" |
                 perl -MPath::Tiny -ne '
                 BEGIN { $skip = join q{|}, map { s/\A\s+//; s/\s+\z//; qr/$_/ms }
                                 grep { !/\A\s*(?:#.*)?\z/ms } split "\n",
@@ -55,52 +94,52 @@ release_project() {
                 chomp;
                 print "$_\0" if !/\A(?:$skip)\z/ms;
                 ' | xargs -0 -r git diff --binary "$prev_version" -- > .release/$(< VERSION).patch
-	test -s .release/$(< VERSION).patch || rm .release/$(< VERSION).patch
-	test ! -d bin/ || GZIP=-1 tar czf .release/$(< VERSION).tgz bin/
+        test -s .release/$(< VERSION).patch || rm .release/$(< VERSION).patch
+        test ! -d bin/ || GZIP=-1 tar czf .release/$(< VERSION).tgz bin/
 }
 
 release_migrate() {
-	local version="$(< VERSION)"
-	local migrate=".release/${version}.migrate"
-	cp migrate "$migrate"
-	list_versions | grep -q -x -F -f VERSION || release_version "$version" "$migrate"
+        local version="$(< VERSION)"
+        local migrate=".release/${version}.migrate"
+        cp migrate "$migrate"
+        list_versions | grep -q -x -F -f VERSION || release_version "$version" "$migrate"
 }
 
 release_version() {
 	list_versions "$2" | grep -q -x -F "$1" && return 0
-    echo -ne "\nrestart mailingms\n" >> "$2"
+        echo -ne "\nrestart mailingms\n" >> "$2"
 	echo -ne "\nINSTALL\nVERSION $1\n\n" >> "$2"
 }
 
 list_versions() {
-	grep '^VERSION' ${1:-migrate} | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
+        grep '^VERSION' ${1:-migrate} | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/'
 }
 
 workdir_is_clean() {
-	git update-index -q --refresh --unmerged >/dev/null
-	git diff-index --quiet HEAD
+        git update-index -q --refresh --unmerged >/dev/null
+        git diff-index --quiet HEAD
 }
 
 get_version() {
-	local new cur re
-	if test "$1" != '--major' -a "$1" != '--minor' -a "$1" != '--patch'; then
-		new="$1"
-	else
-		cur=$(list_versions | tail -n 1)
-		re='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/'
-		if test "$1" = '--major'; then
-			new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",1+$1,0,0   if '$re)
-		elif test "$1" = '--minor'; then
-			new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,1+$2,0  if '$re)
-		else
-			new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,$2,1+$3 if '$re)
-		fi
-		test -n "$new" || die "Unable to increment ${1:2} number in version '$cur'"
-	fi
-	echo "$new" | grep -q '^[0-9A-Za-z.+-]\+$'   || die "Bad version '$new'"
-	git check-ref-format --allow-onelevel "$new" || die "Bad version '$new'"
-	git tag -l | grep -q -x -F "$new" && die "Version '$new' already exists"
-	echo "$new"
+        local new cur re
+        if test "$1" != '--major' -a "$1" != '--minor' -a "$1" != '--patch'; then
+                new="$1"
+        else
+                cur=$(list_versions | tail -n 1)
+                re='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/'
+                if test "$1" = '--major'; then
+                        new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",1+$1,0,0   if '$re)
+                elif test "$1" = '--minor'; then
+                        new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,1+$2,0  if '$re)
+                else
+                        new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,$2,1+$3 if '$re)
+                fi
+                test -n "$new" || die "Unable to increment ${1:2} number in version '$cur'"
+        fi
+        echo "$new" | grep -q '^[0-9A-Za-z.+-]\+$'   || die "Bad version '$new'"
+        git check-ref-format --allow-onelevel "$new" || die "Bad version '$new'"
+        git tag -l | grep -q -x -F "$new" && die "Version '$new' already exists"
+        echo "$new"
 }
 
 
diff --git a/remove_version b/remove_version
index fd0db0a280a8edce0094b0848066d7b8f8b1ac7d..9d624b632e231c62918f3cf8dc1ee86985cd60cd 100755
--- a/remove_version
+++ b/remove_version
@@ -1,45 +1,43 @@
 #!/usr/bin/env bash
 
-warn()	{ echo "$@" >&2;	}
-die()	{ warn "$@"; exit 1;	}
+warn()  { echo "$@" >&2;        }
+die()   { warn "$@"; exit 1;    }
 
 main() {
-    test $# -ne 0 || die "Please pass VERSION to remove_version script"
-    check_version $1 || die 'Please commit all changes first, then try again'
-    workdir_is_clean  || die 'Please commit all changes first, then try again'
-    remove_version_from_git $1
-    remove_version_from_migrate $1
-    git commit migrate -m "Remove VERSION $1 [ci-skip]"
+        test $# -ne 0 || die "Please pass VERSION to remove_version script"
+        check_version $1 || die 'Invalid version'
+        workdir_is_clean  || die 'Please commit all changes first, then try again'
+        remove_version_from_migrate $1
+        remove_version_from_artifacts $1
+        git commit migrate -m "Remove VERSION $1 [ci-skip]"
 }
 
-
-remove_version_from_migrate() {
-    awk -v \
-    	search_version="VERSION $1" \
-    	'/^INSTALL/{f=$0; next} $0 ~search_version {f="";next} f { print f ; f=""} {print}' \
-    	migrate \
-    | cat -s \
-    > migrate.tmp
-    mv migrate.tmp migrate
+remove_version_from_artifacts() {
+        local addr='artifacts@artifacts.tgms.qarea.org'
+        local base="artifacts/$(basename $(pwd))/$1"
+        ssh "$addr" "rm -f $base.migrate" || die "Failed to remove migrate file"
+        ssh "$addr" "rm -f $base.patch" || die "Failed to remove patch file"
+        ssh "$addr" "rm -f $base.tgz" || die "Failed to remove tgz file"
 }
 
-remove_version_from_git() {
-    git filter-branch --force --index-filter \
-    	"git rm --cached --ignore-unmatch .release/$1*" \
-    	--prune-empty --tag-name-filter cat -- --all
-
-    git tag --delete $1
-    git push origin :refs/tags/$1
+remove_version_from_migrate() {
+        awk -v \
+        search_version="VERSION $1" \
+        '/^INSTALL/{f=$0; next} $0 ~search_version {f="";next} f { print f ; f=""} {print}' \
+        migrate \
+        | cat -s \
+        > migrate.tmp
+        mv migrate.tmp migrate
 }
 
 check_version() {
-    grep "^VERSION $1$" migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' > /dev/null
-    test ${PIPESTATUS[0]} -eq 0 || die "Can't find VERSION $1 in migrate file"
+        grep "^VERSION $1$" migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' > /dev/null
+        test ${PIPESTATUS[0]} -eq 0 || die "Can't find VERSION $1 in migrate file"
 }
 
 workdir_is_clean() {
-    git update-index -q --refresh --unmerged >/dev/null
-    git diff-index --quiet HEAD
+        git update-index -q --refresh --unmerged >/dev/null
+        git diff-index --quiet HEAD
 }
 
 main "$@"