diff --git a/testing/lab/APKBUILD b/testing/lab/APKBUILD
index 0b717ae6cbbafeffca9720fdde30882150b6dd4b..105487092805c8b401be5c211cd91ac9b37522c7 100644
--- a/testing/lab/APKBUILD
+++ b/testing/lab/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer: Leo <thinkabit.ukim@gmail.com>
 pkgname=lab
 pkgver=0.16.0
-pkgrel=0
+pkgrel=1
 pkgdesc="A Git Wrapper for GitLab"
 url="https://zaquestion.github.io/lab/"
 arch="all"
@@ -10,7 +10,14 @@ license="CC0-1.0"
 depends="git"
 makedepends="go"
 checkdepends="bash"
-source="lab-$pkgver.tar.gz::https://github.com/zaquestion/lab/archive/v$pkgver.tar.gz"
+subpackages="
+	$pkgname-bash-completion:bashcomp:noarch
+	$pkgname-zsh-completion:zshcomp:noarch
+	"
+source="lab-$pkgver.tar.gz::https://github.com/zaquestion/lab/archive/v$pkgver.tar.gz
+	allow-completion.patch
+	xdg.patch
+	"
 builddir="$srcdir/src/github.com/zaquestion/$pkgname"
 options="net !check" # Tests require configured GitLab account with SSH keys
 
@@ -25,6 +32,8 @@ prepare() {
 
 build() {
 	GO111MODULE=on go build -ldflags "-X main.version=$pkgver" -o bin/$pkgname
+	./bin/lab completion bash > lab.bash
+	./bin/lab completion zsh > _lab.zsh
 }
 
 package() {
@@ -37,4 +46,24 @@ cleanup_srcdir() {
 	default_cleanup_srcdir
 }
 
-sha512sums="8036dd3921f2e02433274a4e3dc215e8afc604c385753105c8640f2795f4566641a30a27ce8ddb99496bab5101e573a7607ca3990c4e6587834a6ecf061e92f2  lab-0.16.0.tar.gz"
+bashcomp() {
+	depends=""
+	pkgdesc="Bash completions for $pkgname"
+	install_if="$pkgname=$pkgver-r$pkgrel bash-completion"
+
+	install -Dm644 "$builddir"/lab.bash \
+		"$subpkgdir"/usr/share/bash-completion/completions/$pkgname
+}
+
+zshcomp() {
+	depends=""
+	pkgdesc="Zsh completions for $pkgname"
+	install_if="$pkgname=$pkgver-r$pkgrel zsh"
+
+	install -Dm644 "$builddir"/_lab.zsh \
+		"$subpkgdir"/usr/share/zsh/site-functions/_$pkgname
+}
+
+sha512sums="8036dd3921f2e02433274a4e3dc215e8afc604c385753105c8640f2795f4566641a30a27ce8ddb99496bab5101e573a7607ca3990c4e6587834a6ecf061e92f2  lab-0.16.0.tar.gz
+9241ae986e7669f46c6bafbf0532bff730eb11b74c73b37785d926c8dc88e9de528a6ad9d685e79e1e8a5e44b903dbe213af92648038fb59514ea2c696ea7dd4  allow-completion.patch
+f45e5f0ccfcfea03090b78fd2af200165883f329684e2301644b88828c072fedf8ff2832254ca3d44c0e1e95e60bff5145f5decbb85907ac9241cbaf5514a146  xdg.patch"
diff --git a/testing/lab/allow-completion.patch b/testing/lab/allow-completion.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cbfd6668ae59bb87c51ad45a7044514d02664ecc
--- /dev/null
+++ b/testing/lab/allow-completion.patch
@@ -0,0 +1,38 @@
+From c5d445472c183f6437966b2b1e9e68dab5926c24 Mon Sep 17 00:00:00 2001
+From: Zaq? Wiedmann <zaquestion@gmail.com>
+Date: Thu, 25 Jul 2019 12:37:49 -0700
+Subject: [PATCH] #321: allow completions to be generated without
+ authenticating with GitLab
+
+This makes it easy for distributors to provide completion out of the box in packaged versions of lab
+---
+ main.go | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/main.go b/main.go
+index 9a836b9..ba3f21c 100644
+--- a/main.go
++++ b/main.go
+@@ -127,6 +127,20 @@ func getUser(host, token string) string {
+ func main() {
+ 	log.SetFlags(log.LstdFlags | log.Lshortfile)
+ 	cmd.Version = version
+-	lab.Init(loadConfig())
++	if !skipInit() {
++		lab.Init(loadConfig())
++	}
+ 	cmd.Execute()
+ }
++
++func skipInit() bool {
++	if len(os.Args) <= 1 {
++		return false
++	}
++	switch os.Args[1] {
++	case "completion":
++		return true
++	default:
++		return false
++	}
++}
+
diff --git a/testing/lab/xdg.patch b/testing/lab/xdg.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f4b74d82ad96cde88c580bb24dde4b5866d7fa3f
--- /dev/null
+++ b/testing/lab/xdg.patch
@@ -0,0 +1,27 @@
+From 63bb26a320d43f8ce79626b0adeeaae73f90fd8a Mon Sep 17 00:00:00 2001
+From: Leo <thinkabit.ukim@gmail.com>
+Date: Thu, 25 Jul 2019 04:05:41 -0300
+Subject: [PATCH] try XDG_CONFIG_HOME
+
+---
+ main.go | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/main.go b/main.go
+index dddf7a3..9a836b9 100644
+--- a/main.go
++++ b/main.go
+@@ -35,7 +35,11 @@ func loadConfig() (string, string, string) {
+ 			home = u.HomeDir
+ 		}
+ 	}
+-	confpath := path.Join(home, ".config")
++	// Try XDG_CONFIG_HOME which is declared in XDG base directory specification
++	confpath := os.Getenv("XDG_CONFIG_HOME")
++	if confpath == "" {
++		confpath = path.Join(home, ".config")
++	}
+ 	if _, err := os.Stat(confpath); os.IsNotExist(err) {
+ 		os.Mkdir(confpath, 0700)
+ 	}
+