diff --git a/.travis.yml b/.travis.yml
index 3663e7b93be7eeea3f22e3b6c5afbe83bc63fd95..85675aaf75266f4652c0830df86e27a4ffe97f73 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,20 +2,25 @@ language: cpp
 sudo: required
 dist: trusty
 
-os: linux
-
 before_install:
-  - sudo add-apt-repository --yes ppa:beineri/opt-qt57-trusty
+  - sudo add-apt-repository -y ppa:beineri/opt-qt57-trusty
   - sudo apt-get update -qq
-  - curl https://transfer.sh/DHN4B/linuxdeployqt-799f704-x86-64.appimage -o linuxdeployqt.appimage
 
 install:
-  - sudo apt-get -y install binutils qt57base qt57quickcontrols qt57quickcontrols2 qt57svg desktop-file-utils
-  - sudo install -m 755 -p linuxdeployqt.appimage /usr/local/bin/linuxdeployqt.appimage
-  - rm linuxdeployqt.appimage
+  - sudo apt-get -y install build-essential fuse zsync desktop-file-utils
+  - sudo apt-get -y install qt57base qt57svg qt57quickcontrols qt57quickcontrols2
+  # Replace linuxdeployqt download URL to official download URL when the stable version released
+  - curl -L -o linuxdeployqt https://dl.dropboxusercontent.com/u/150776/temp/linuxdeployqt-799f704-x86-64.appimage
+  - sudo install -m 755 -p linuxdeployqt /usr/local/bin/linuxdeployqt
+  - rm linuxdeployqt
 
-script:
+before_script:
+  - sudo modprobe fuse
   - source /opt/qt57/bin/qt57-env.sh
-  - sh pkg/build.sh appimage
-  - AI=$(ls pkg/build/xdgurl-release-*.AppImage)
-  - curl --upload-file "$AI" "https://transfer.sh/$AI"
+
+script:
+  - sh ./pkg/build.sh appimage
+
+after_script:
+  - appimage_file="$(ls ./pkg/build/*.AppImage)"
+  - [ -f "${appimage_file}" ] && curl -T "${appimage_file}" "https://transfer.sh/${appimage_file}"
diff --git a/pkg/arch/PKGBUILD b/pkg/arch/PKGBUILD
index f84a7ef01d22ce33a114d52fdc807e07b51c42a6..8c6b5ce7f7d6ef393f8bf62e278db7a453649c68 100644
--- a/pkg/arch/PKGBUILD
+++ b/pkg/arch/PKGBUILD
@@ -1,26 +1,26 @@
 # Maintainer: Akira Ohgaki <akiraohgaki@gmail.com>
 
-pkgname=xdgurl
-pkgver=2.0.0
-pkgrel=1
-pkgdesc="An install helper program for desktop stuff."
+pkgname='xdgurl'
+pkgver='2.0.0'
+pkgrel='1'
+pkgdesc='An install helper program for desktop stuff.'
 arch=('i686' 'x86_64')
-url="https://github.com/xdgurl/xdgurl"
+url='https://github.com/xdgurl/xdgurl'
 license=('GPL3')
 depends=('qt5-base>=5.3.0' 'qt5-svg>=5.3.0' 'qt5-declarative>=5.3.0' 'qt5-quickcontrols>=5.3.0')
-#source=("https://github.com/xdgurl/xdgurl/archive/release-$pkgver.tar.gz")
-source=("$pkgname.tar.gz")
+#source=("https://github.com/xdgurl/xdgurl/archive/release-${pkgver}.tar.gz")
+source=("${pkgname}.tar.gz")
 md5sums=() #autofill using updpkgsums
 
 build() {
-    #cd "$pkgname-release-$pkgver"
-    cd $pkgname
-    qmake PREFIX="/usr"
+    #cd "${pkgname}-release-${pkgver}"
+    cd "${pkgname}"
+    qmake PREFIX='/usr'
     make
 }
 
 package() {
-    #cd "$pkgname-release-$pkgver"
-    cd $pkgname
-    make INSTALL_ROOT="$pkgdir" install
+    #cd "${pkgname}-release-${pkgver}"
+    cd "${pkgname}"
+    make INSTALL_ROOT="${pkgdir}" install
 }
diff --git a/pkg/build.sh b/pkg/build.sh
index 26bf5d0ade649fdea2f309f1934394c3b7acd7d3..f9b866ec3990a64fb4dee6ce7fbd807912face67 100644
--- a/pkg/build.sh
+++ b/pkg/build.sh
@@ -1,56 +1,67 @@
-#!/bin/sh
+#!/bin/bash
 
-TMPDIR=/tmp
-PKGDIR=`cd $(dirname $0) && pwd`
-BUILDDIR=$PKGDIR/build
-PROJDIR=`dirname $PKGDIR`
-PROJNAME=`basename $PROJDIR`
-PARENTDIR=`dirname $PROJDIR`
+PKGNAME='xdgurl'
+
+PROJDIR="$(cd "$(dirname "${0}")/../" && pwd)"
+
+BUILDDIR="${PROJDIR}/pkg/build"
+
+BUILDTYPE=''
+if [ "${1}" ]; then
+    BUILDTYPE="${1}"
+fi
+
+TREEISH='HEAD'
+if [ "${2}" ]; then
+    TREEISH="${2}"
+fi
+
+export_source() {
+    destdir="${BUILDDIR}"
+    if [ "${1}" ]; then
+        destdir="${1}"
+    fi
+    $(cd "${PROJDIR}" && git archive --prefix="${PKGNAME}/" --output="${destdir}/${PKGNAME}.tar.gz" "${TREEISH}")
+}
 
 build_ubuntu() {
     #sudo apt install build-essential qt5-default libqt5svg5-dev qtdeclarative5-dev devscripts debhelper fakeroot
 
-    cd $PARENTDIR
-    tar -czvf $TMPDIR/$PROJNAME.tar.gz --exclude ".git" $PROJNAME
+    cd "${PROJDIR}"
 
-    mkdir $BUILDDIR
+    mkdir -p "${BUILDDIR}"
+    export_source "${BUILDDIR}"
+    tar -xzvf "${BUILDDIR}/${PKGNAME}.tar.gz" -C "${BUILDDIR}"
+    cp -r "${PROJDIR}/pkg/ubuntu/debian" "${BUILDDIR}/${PKGNAME}"
 
-    mv $TMPDIR/$PROJNAME.tar.gz $BUILDDIR
-    tar -xzvf $BUILDDIR/$PROJNAME.tar.gz -C $BUILDDIR
-    cp -r $PKGDIR/ubuntu/debian $BUILDDIR/$PROJNAME
-
-    cd $BUILDDIR/$PROJNAME
+    cd "${BUILDDIR}/${PKGNAME}"
     debuild -uc -us -b
 }
 
 build_fedora() {
     #sudo dnf install make automake gcc gcc-c++ libtool qt5-qtbase-devel qt5-qtsvg-devel qt5-qtdeclarative-devel rpm-build
 
-    cd $PARENTDIR
-    tar -czvf $TMPDIR/$PROJNAME.tar.gz --exclude ".git" $PROJNAME
-
-    mkdir $BUILDDIR
-    mkdir $BUILDDIR/SOURCES
-    mkdir $BUILDDIR/SPECS
+    cd "${PROJDIR}"
 
-    mv $TMPDIR/$PROJNAME.tar.gz $BUILDDIR/SOURCES
-    cp $PKGDIR/fedora/xdgurl.spec $BUILDDIR/SPECS
+    mkdir -p "${BUILDDIR}"
+    mkdir "${BUILDDIR}/SOURCES"
+    mkdir "${BUILDDIR}/SPECS"
+    export_source "${BUILDDIR}/SOURCES"
+    cp "${PROJDIR}/pkg/fedora/xdgurl.spec" "${BUILDDIR}/SPECS"
 
-    rpmbuild --define "_topdir $BUILDDIR" -bb $BUILDDIR/SPECS/xdgurl.spec
+    rpmbuild --define "_topdir ${BUILDDIR}" -bb "${BUILDDIR}/SPECS/xdgurl.spec"
 }
 
 build_arch() {
     #sudo pacman -S base-devel qt5-base qt5-svg qt5-declarative qt5-quickcontrols
 
-    cd $PARENTDIR
-    tar -czvf $TMPDIR/$PROJNAME.tar.gz --exclude ".git" $PROJNAME
+    cd "${PROJDIR}"
 
-    mkdir $BUILDDIR
+    mkdir -p "${BUILDDIR}"
+    export_source "${BUILDDIR}"
+    cp "${PROJDIR}/pkg/arch/PKGBUILD" "${BUILDDIR}"
 
-    mv $TMPDIR/$PROJNAME.tar.gz $BUILDDIR
-    cp $PKGDIR/arch/PKGBUILD $BUILDDIR
-
-    cd $BUILDDIR
+    cd "${BUILDDIR}"
     updpkgsums
     makepkg -s
 }
@@ -58,57 +69,52 @@ build_arch() {
 build_appimage() {
     #sudo add-apt-repository ppa:beineri/opt-qt57-xenial
     #sudo apt update
-    #sudo apt install build-essential fuse desktop-file-utils
+
+    #sudo apt install build-essential fuse zsync desktop-file-utils
     #sudo apt install qt57base qt57svg qt57quickcontrols qt57quickcontrols2
-    #curl https://transfer.sh/DHN4B/linuxdeployqt-799f704-x86-64.appimage -o linuxdeployqt.appimage
-    #sudo install -m 755 -p linuxdeployqt.appimage /usr/local/bin/linuxdeployqt.appimage
+    # Replace linuxdeployqt download URL to official download URL when the stable version released
+    #curl -L -o linuxdeployqt https://dl.dropboxusercontent.com/u/150776/temp/linuxdeployqt-799f704-x86-64.appimage
+    #sudo install -m 755 -p linuxdeployqt /usr/local/bin/linuxdeployqt
+
     #sudo modprobe fuse
     #source /opt/qt57/bin/qt57-env.sh
 
-    cd $PROJDIR
-    export VERSION=$(git describe --always)
-
-    cd $PARENTDIR
-    tar -czvf $TMPDIR/$PROJNAME.tar.gz --exclude ".git" $PROJNAME
-
-    mkdir $BUILDDIR
+    cd "${PROJDIR}"
 
-    mv $TMPDIR/$PROJNAME.tar.gz $BUILDDIR
-    tar -xzvf $BUILDDIR/$PROJNAME.tar.gz -C $BUILDDIR
+    export VERSION="$(git describe --always)"
+    mkdir -p "${BUILDDIR}"
+    export_source "${BUILDDIR}"
+    tar -xzvf "${BUILDDIR}/${PKGNAME}.tar.gz" -C "${BUILDDIR}"
 
-    cd $BUILDDIR/$PROJNAME
+    cd "${BUILDDIR}/${PKGNAME}"
     /opt/qt57/bin/qmake
     make
-    strip xdgurl
-
-    cd $BUILDDIR
-
-    mkdir -p $BUILDDIR/xdgurl.AppDir/usr/bin
-    install -m 755 -p $BUILDDIR/$PROJNAME/xdgurl $BUILDDIR/xdgurl.AppDir/xdgurl
-    install -m 644 -p $BUILDDIR/$PROJNAME/src/desktop/xdgurl.desktop $BUILDDIR/xdgurl.AppDir/xdgurl.desktop
-    install -m 644 -p $BUILDDIR/$PROJNAME/src/desktop/xdgurl.svg $BUILDDIR/xdgurl.AppDir/xdgurl.svg
-    install -m 755 -p /usr/bin/update-desktop-database $BUILDDIR/xdgurl.AppDir/usr/bin/update-desktop-database
-    install -m 755 -p /usr/bin/desktop-file-validate $BUILDDIR/xdgurl.AppDir/usr/bin/desktop-file-validate
-    install -m 755 -p /usr/bin/desktop-file-install $BUILDDIR/xdgurl.AppDir/usr/bin/desktop-file-install
-
-    linuxdeployqt.appimage $BUILDDIR/xdgurl.AppDir/xdgurl -qmldir=$BUILDDIR/$PROJNAME/src/app/qml -verbose=2 -bundle-non-qt-libs # https://github.com/probonopd/linuxdeployqt/issues/25
-    linuxdeployqt.appimage $BUILDDIR/xdgurl.AppDir/xdgurl -qmldir=$BUILDDIR/$PROJNAME/src/app/qml -verbose=2 -bundle-non-qt-libs # twice because of #25
-
-    rm $BUILDDIR/xdgurl.AppDir/AppRun
-    install -m 755 -p $BUILDDIR/$PROJNAME/src/desktop/appimage-desktopintegration $BUILDDIR/xdgurl.AppDir/AppRun
-
-    linuxdeployqt.appimage --appimage-extract
-    ./squashfs-root/usr/bin/appimagetool $BUILDDIR/xdgurl.AppDir
+    strip ./xdgurl
+
+    cd "${BUILDDIR}"
+    mkdir -p "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin"
+    install -m 755 -p "${BUILDDIR}/${PKGNAME}/xdgurl" "${BUILDDIR}/${PKGNAME}.AppDir/xdgurl"
+    install -m 644 -p "${BUILDDIR}/${PKGNAME}/src/desktop/xdgurl.desktop" "${BUILDDIR}/${PKGNAME}.AppDir/xdgurl.desktop"
+    install -m 644 -p "${BUILDDIR}/${PKGNAME}/src/desktop/xdgurl.svg" "${BUILDDIR}/${PKGNAME}.AppDir/xdgurl.svg"
+    install -m 755 -p /usr/bin/update-desktop-database "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/update-desktop-database"
+    install -m 755 -p /usr/bin/desktop-file-validate "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/desktop-file-validate"
+    install -m 755 -p /usr/bin/desktop-file-install "${BUILDDIR}/${PKGNAME}.AppDir/usr/bin/desktop-file-install"
+    linuxdeployqt "${BUILDDIR}/${PKGNAME}.AppDir/xdgurl" -qmldir="${BUILDDIR}/${PKGNAME}/src/app/qml" -verbose=2 -bundle-non-qt-libs # https://github.com/probonopd/linuxdeployqt/issues/25
+    linuxdeployqt "${BUILDDIR}/${PKGNAME}.AppDir/xdgurl" -qmldir="${BUILDDIR}/${PKGNAME}/src/app/qml" -verbose=2 -bundle-non-qt-libs # twice because of #25
+    rm "${BUILDDIR}/${PKGNAME}.AppDir/AppRun"
+    install -m 755 -p "${BUILDDIR}/${PKGNAME}/src/desktop/appimage-desktopintegration" "${BUILDDIR}/${PKGNAME}.AppDir/AppRun"
+    linuxdeployqt --appimage-extract
+    ./squashfs-root/usr/bin/appimagetool "${BUILDDIR}/${PKGNAME}.AppDir"
 }
 
-if [ $1 ] && [ $1 = 'ubuntu' ]; then
+if [ "${BUILDTYPE}" = 'ubuntu' ]; then
     build_ubuntu
-elif [ $1 ] && [ $1 = 'fedora' ]; then
+elif [ "${BUILDTYPE}" = 'fedora' ]; then
     build_fedora
-elif [ $1 ] && [ $1 = 'arch' ]; then
+elif [ "${BUILDTYPE}" = 'arch' ]; then
     build_arch
-elif [ $1 ] && [ $1 = 'appimage' ]; then
+elif [ "${BUILDTYPE}" = 'appimage' ]; then
     build_appimage
 else
-    echo 'sh build.sh [ubuntu|fedora|arch|appimage]'
+    echo "sh $(basename "${0}") [ubuntu|fedora|arch|appimage] [tree_ish]"
 fi
diff --git a/pkg/fedora/xdgurl.spec b/pkg/fedora/xdgurl.spec
index d161a343a5c0a7734285ef708afb7787ac3f3717..3d5de8cefa19da063aea82ee3fc21caf6df49c4c 100644
--- a/pkg/fedora/xdgurl.spec
+++ b/pkg/fedora/xdgurl.spec
@@ -21,7 +21,7 @@ An install helper program for desktop stuff.
 
 %build
 %define debug_package %{nil}
-qmake-qt5 PREFIX="/usr"
+qmake-qt5 PREFIX='/usr'
 make
 
 %install
diff --git a/pkg/ubuntu/debian/rules b/pkg/ubuntu/debian/rules
index 3fc604ca255505614239a3ba2f7f82d0071c3592..05dde7094a4e5c38332cccc8ca8c2f7b65eb1cd1 100755
--- a/pkg/ubuntu/debian/rules
+++ b/pkg/ubuntu/debian/rules
@@ -4,7 +4,7 @@
 	dh $@
 
 override_dh_auto_configure:
-	qmake PREFIX="/usr"
+	qmake PREFIX='/usr'
 
 override_dh_auto_install:
 	make INSTALL_ROOT="$(CURDIR)/debian/tmp" install
diff --git a/xdgurl.pro b/xdgurl.pro
index ed63a8fa24b3b45116d02a0aed7297f0eda78165..6b12f47338694aab2c10540747296cd0bf2860a1 100644
--- a/xdgurl.pro
+++ b/xdgurl.pro
@@ -5,7 +5,6 @@ TEMPLATE = app
 QT += \
     core \
     gui \
-    widgets \
     qml \
     quick \
     svg \
@@ -37,6 +36,8 @@ RESOURCES += \
 
 DISTFILES += \
     README.md \
+    src/desktop/xdgurl.desktop \
+    src/desktop/appimage-desktopintegration \
     pkg/build.sh \
     pkg/ubuntu/debian/changelog \
     pkg/ubuntu/debian/compat \