diff --git a/.gitignore b/.gitignore
index 94fbb8adc..9a5f01bb9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,3 +59,13 @@ coverage.all
 /integrations/mysql.ini
 /integrations/pgsql.ini
 /node_modules
+
+
+# Snapcraft
+snap/.snapcraft/
+parts/
+stage/
+prime/
+*.snap
+*.snap-build
+*_source.tar.bz2
diff --git a/snap/helpers/app.ini b/snap/helpers/app.ini
new file mode 100644
index 000000000..dd7fa3c88
--- /dev/null
+++ b/snap/helpers/app.ini
@@ -0,0 +1,66 @@
+APP_NAME    = Gitea: Go Git Service
+RUN_USER    = root
+RUN_MODE    = prod
+CUSTOM_PATH = SNAP_DIR_DATA/custom
+
+[server]
+DOMAIN            = localhost
+PROTOCOL          = http
+HTTP_PORT         = 3001
+ROOT_URL          = http://localhost:3001/
+DISABLE_SSH       = false
+SSH_PORT          = 22
+STATIC_ROOT_PATH  = SNAP_DIR_DATA/static
+APP_DATA_PATH     = SNAP_DIR_COMMON/data
+SSH_ROOT          = SNAP_DIR_COMMON/ssh
+SSH_KEY_TEST_PATH = SNAP_DIR_DATA/sshkeytest
+
+[database]
+DB_TYPE  = sqlite3
+PATH     = SNAP_DIR_COMMON/gitea.db
+
+[repository]
+ROOT = SNAP_DIR_COMMON/repositories/data
+
+[repository.upload]
+ENABLED = true
+ALLOWED_TYPES = "image/jpeg|image/png"
+FILE_MAX_SIZE = 10
+MAX_FILES = 5
+TEMP_PATH = SNAP_DIR_COMMON/repositories/tmp
+
+[release.attachment]
+PATH = SNAP_DIR_COMMON/releases/attachments
+
+[smartypants]
+ENABLED = true
+
+[indexer]
+ISSUE_INDEXER_PATH = SNAP_DIR_COMMON/indexers/issues.bleve
+
+
+[mailer]
+ENABLED = false
+
+[service]
+REGISTER_EMAIL_CONFIRM = false
+ENABLE_NOTIFY_MAIL     = false
+DISABLE_REGISTRATION   = false
+ENABLE_CAPTCHA         = false
+REQUIRE_SIGNIN_VIEW    = false
+
+[picture]
+AVATAR_UPLOAD_PATH      = SNAP_DIR_COMMON/pictures/avatars
+DISABLE_GRAVATAR        = true
+ENABLE_FEDERATED_AVATAR = false
+
+[attachment]
+PATH = SNAP_DIR_COMMON/attachments
+
+[session]
+PROVIDER = memory
+
+[log]
+MODE      = file
+LEVEL     = Trace
+ROOT_PATH = SNAP_DIR_COMMON/log
diff --git a/snap/helpers/configuration.sh b/snap/helpers/configuration.sh
new file mode 100755
index 000000000..34b7fc7af
--- /dev/null
+++ b/snap/helpers/configuration.sh
@@ -0,0 +1,126 @@
+#!/bin/bash
+if snapctl get gitea.snap.custom; then
+  cdir=$(snapctl get gitea.snap.custom)
+else
+  cdir=$SNAP_COMMON
+fi
+
+cfg="$cdir/conf/app.ini"
+bak="$cdir/conf/app.ini.bak-$(date -Ins)"
+basecfg="$SNAP/snap/helpers/app.ini"
+smp="$SNAP/gitea/custom/conf/app.ini.sample"
+
+function toSnap() {
+OIFS=$IFS
+IFS='
+'
+  category="none"
+  src="$cfg"
+  [[ "$1" = "init" ]] && src="$smp"
+  [[ "$1" = "snap" ]] && src="$basecfg"
+
+  for l in $(sed 's_;\([A-Z]*\)_\1_g' $src | grep -v -e '^;' -e '^$'); do
+    if echo $l | grep -q '^[[]'; then
+      category=$(CatToSnap "$l")
+    elif echo $l | grep -q '^[A-Z]'; then
+      option=$(OptToSnap "$l")
+      value=$(ValToSnap "$l")
+      if [[ $category = "none" ]]; then
+        snapctl set "$option=$value"
+      else
+        snapctl set "$category.$option=$value"
+      fi
+    fi
+  done
+IFS=$OIFS
+}
+
+function toIni() {
+OIFS=$IFS
+IFS='
+'
+  category="none"; option="none"; catUnset=true
+  src=$smp
+  [[ -f $cfg ]] && src="$cfg"
+  tmpIni="$cfg.tmp"
+  [[ -f $src ]] && cp "$src" "$tmpIni"
+  cp $tmpIni $bak
+  echo '' > $cfg
+  for l in $(grep -v -e '^;' -e '^$' $tmpIni); do
+    if echo $l | grep -q '^[[]'; then
+      category=$(CatToSnap "$l")
+      catUnset=true
+    elif echo $l | grep -q '^[A-Z]'; then
+      option=$(OptToSnap "$l")
+      if [[ $category = "none" ]]; then
+        value=$(snapctl get $option)
+        echo $(OptToIni "$option") = $value >> $cfg
+      else
+        value=$(snapctl get $category.$option)
+        if $catUnset; then
+          echo "" >> $cfg
+          echo "[$(CatToIni "$category")]" >> $cfg
+          catUnset=false
+        fi
+        echo $(OptToIni "$option") = $value >> $cfg
+      fi
+    fi
+  done;
+  IFS=$OIFS
+}
+
+function CatToSnap {
+  ret=$(echo "$1"                             \
+         | grep -oP '[A-Za-z0-9._]+'          \
+         | sed 's|\.|-|g'                     \
+         | sed 's|_|99|g')
+  echo $ret
+}
+function OptToSnap {
+  ret=$(echo "$1"                             \
+         | grep -oP '^[A-Z_]+'                \
+         | tr '[:upper:]' '[:lower:]'         \
+         | sed 's|_|-|g')
+  echo $ret
+}
+function ValToSnap {
+  ret=$(echo "$1"                             \
+         | grep -oP '=.*$'                    \
+         | sed 's_^= __g'                     \
+         | sed 's_^=__g'                      \
+         | sed "s|SNAP_DIR_DATA|$SDATA|g"     \
+         | sed "s|SNAP_DIR_COMMON|$SCOMMON|g" \
+         | sed 's|{}||g')
+  echo $ret
+}
+
+function CatToIni {
+  ret=$(echo "$1"                             \
+         | sed 's|-|.|g'                      \
+         | sed 's|\ |_|g'                     \
+         | sed 's|99|_|g')
+  echo $ret
+}
+function OptToIni {
+  ret=$(echo "$1"                             \
+         | tr '[:lower:]' '[:upper:]'         \
+         | sed 's|-|_|g')
+  echo $ret
+}
+
+[[ "$1" = "configure" ]]             \
+  && toIni                           \
+  && exit 0
+
+[[ "$1" = "install" ]]               \
+  && echo "Initial Configuration..." \
+  && mkdir -p $SNAP_COMMON/conf      \
+  && toSnap init                     \
+  && toSnap snap                     \
+  && toIni sample                    \
+  && exit 0
+
+[[ "$1" = "save" ]]                  \
+  && echo "Saving current config..." \
+  && toSnap                          \
+  && exit 0
diff --git a/snap/helpers/simple_launcher.sh b/snap/helpers/simple_launcher.sh
new file mode 100755
index 000000000..8a12e3b8d
--- /dev/null
+++ b/snap/helpers/simple_launcher.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+if ! env | grep -q root; then
+  echo "
+   +----------------------------------------+
+   | You are not running gitea as root.     |
+   | This is required for the snap package. |
+   | Please re-run as root.                 |
+   +----------------------------------------+
+"
+  $SNAP/gitea/gitea --help
+  exit 1
+fi
+
+# Set usernames for gitea
+export USERNAME=root
+export USER=root
+
+export GITEA_WORK_DIR=$(snapctl get gitea.snap.workdir)
+export GITEA_CUSTOM=$(snapctl get gitea.snap.custom)
+
+$SNAP/bin/gconfig save
+cd $SNAP/gitea; ./gitea $@
diff --git a/snap/hooks/configure b/snap/hooks/configure
new file mode 100755
index 000000000..fd7bc3da1
--- /dev/null
+++ b/snap/hooks/configure
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+$SNAP/bin/gconfig configure
diff --git a/snap/hooks/install b/snap/hooks/install
new file mode 100755
index 000000000..dea6c268f
--- /dev/null
+++ b/snap/hooks/install
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+export SDATA=$(echo $SNAP_DATA | sed "s|$SNAP_REVISION|current|")
+export SCOMMON="$SNAP_COMMON"
+export isRoot=`true`
+snapctl set gitea.snap.workdir="$SDATA/custom"
+snapctl set gitea.snap.custom="$SCOMMON"
+
+function mkDirCommon(){
+  for dir in $@; do
+    mkdir -p "$SCOMMON/$dir"
+  done
+}
+
+function mkdirData(){
+  for dir in $@; do
+    mkdir -p "$SDATA/$dir"
+    if [ -d $SNAP/$dir ]; then
+      cp -r --preserve=mode           \
+            $SNAP/$dir/*              \
+            $SNAP/$dir/.[a-zA-Z0-9-]* \
+            $SDATA/$dir/ 2> $SCOMMON/log/snap-mkdirData.log
+    fi
+  done
+}
+
+mkDirCommon pictures           \
+            repositories       \
+            attachments        \
+            data               \
+            log
+
+mkdirData   certs              \
+            sshkeytest         \
+            custom/conf        \
+            static/templates   \
+            static/scripts     \
+            static/public
+
+[[ -f $SNAP_COMMON/conf/app.ini ]] || $SNAP/bin/gconfig install
+
+# Configure Git to use the right templates
+mkdir -p $SDATA/git/
+cp -r --preserve=mode $SNAP/usr/share/git-core/templates $SDATA/git/
+$SNAP/usr/bin/git config --global init.templateDir $SDATA/git/templates/
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
new file mode 100644
index 000000000..7439f50f2
--- /dev/null
+++ b/snap/snapcraft.yaml
@@ -0,0 +1,121 @@
+name: gitea
+summary:  Gitea - A painless self-hosted Git service
+description: |
+  The goal of this project is to make the easiest, fastest, and most painless
+  way of setting up a self-hosted Git service. With Go, this can be done with
+  an independent binary distribution across ALL platforms that Go supports,
+  including Linux, Mac OS X, Windows and ARM.
+
+type: app
+icon: public/img/gitea-lg.png
+confinement: strict
+grade: stable
+
+version: 'git'
+
+apps:
+  gitea:
+    command: bin/gitea
+    plugs: [network, network-bind]
+  web:
+    command: bin/gitea web
+    daemon: simple
+    plugs: [network, network-bind]
+  serv:
+    command: bin/gitea serv
+    plugs: [network, network-bind]
+  admin:
+    command: bin/gitea admin
+    plugs: [network, network-bind]
+  cert:
+    command: bin/gitea cert
+  hook:
+    command: bin/gitea hook
+    plugs: [network, network-bind]
+  dump:
+    command: bin/gitea dump
+    plugs: [home]
+  help:
+    command: bin/gitea --help
+  version:
+    command: bin/gitea --version
+  sqlite:
+    command: usr/bin/sqlite3
+
+parts:
+  go:
+    source-tag: go1.8.3
+    prime:
+      - -*
+
+  gitea:
+    plugin: nil
+    source: .
+    source-type: git
+    after: [ go ]
+    stage-packages: [ git, sqlite3, openssh-client ]
+    build-packages: [ libpam0g-dev, libsqlite3-dev]
+    prepare: |
+      export PATH=$SNAPCRAFT_PART_INSTALL/../../go/install/bin:$PATH
+      export GOPATH=$SNAPCRAFT_PART_INSTALL/../go
+      export bld=$SNAPCRAFT_PART_INSTALL/../build
+      export src=$SNAPCRAFT_PART_INSTALL/../src
+      mkdir -p $GOPATH/src/code.gitea.io/gitea
+      cp -r $src/* $GOPATH/src/code.gitea.io/gitea
+    build: |
+      export PATH=$SNAPCRAFT_PART_INSTALL/../go/bin/:$SNAPCRAFT_PART_INSTALL/../../go/install/bin:$PATH
+      export GOPATH=$SNAPCRAFT_PART_INSTALL/../go
+      go get -u github.com/jteeuwen/go-bindata/...
+      cd $GOPATH/src/code.gitea.io/gitea
+      TAGS="bindata sqlite pam cert" make generate build
+    install: |
+      # Set Convenience Variables
+      src=$SNAPCRAFT_PART_INSTALL/../go/src/code.gitea.io/gitea
+      giteaBase=$SNAPCRAFT_PART_INSTALL/gitea
+      scurrent=/var/snap/$SNAPCRAFT_PROJECT_NAME/current
+      scommon=/var/snap/$SNAPCRAFT_PROJECT_NAME/common
+      # Copy build artifact and necessary files
+      mkdir -p $giteaBase/conf
+      # Workaround for gitea ignoring APP_DATA_PATH in app.ini after snap update.
+      ln -s $scurrent/custom $giteaBase/custom
+      ln -s $scommon/data $giteaBase/data
+      # Workaround for cmd/certs not knowing how to put files somewhere else
+      ln -s $scurrent/cert.pem $giteaBase/cert.pem
+      ln -s $scurrent/key.pem $giteaBase/key.pem
+      # Copy static content
+      mkdir -p $SNAPCRAFT_PART_INSTALL/static
+      cp    $src/gitea             $giteaBase/
+      cp -r $src/LICENSE \
+            $src/templates \
+            $src/public \
+            $src/scripts \
+            $SNAPCRAFT_PART_INSTALL/static/
+      cp -r $src/README.md \
+            $src/LICENSE  \
+            $src/custom \
+            $SNAPCRAFT_PART_INSTALL/
+    prime:
+      - -etc
+      - -usr/lib/systemd
+      - -usr/lib/gcc
+      - -usr/lib/sasl2
+      - -usr/lib/x86_64-linux-gnu/krb5
+      - -usr/share/apport
+      - -usr/share/bash-completion
+      - -usr/share/doc
+      - -usr/share/git-core/contrib
+      - -usr/share/man
+      - -usr/share/upstart
+      - -var
+
+  helpers:
+    plugin: dump
+    source: snap/helpers
+    organize:
+      simple_launcher.sh: bin/gitea
+      app.ini: gitea/snapApp.ini
+      configuration.sh: bin/gconfig
+    prime:
+      - bin/gitea
+      - bin/gconfig
+      - gitea/snapApp.ini