diff --git a/.bashrc b/.bashrc
index 1341b3add73ae5c533aa1d19eb304d2bdf6ca29f..1067cea433467bcc7827b2ab074082a3751088df 100644
--- a/.bashrc
+++ b/.bashrc
@@ -2,12 +2,12 @@
 # If not running interactively, don't do anything
 [ -z "$PS1" ] && return
 
+export PS1='\u@\h:\w\$ '
 export LANG=en_US.UTF8
 export HISTFILE="$HOME/.history"
 export HISTCONTROL=ignoreboth:erasedups
 export HISTSIZE=100000
 export HISTFILESIZE=100000
-export REPREPRO_BASE_DIR="$HOME/Documents/Shore/debian-repository"
 export EDITOR=vim
 export GOPATH="$HOME/Documents/Golang"
 export PATH="$GOPATH/bin:/usr/lib/go/bin/:$PATH"
@@ -33,6 +33,7 @@ export ANSIBLE_CACHE_PLUGIN_CONNECTION="$HOME/.ansible/facts"
 export ANSIBLE_CALLBACK_WHITELIST="profile_tasks, timer"
 export ANSIBLE_SSH_CONTROL_PATH="/tmp/ssh-%%h"
 export ANSIBLE_INVENTORY_ANY_UNPARSED_IS_FAILED=True
+export ANSIBLE_PYTHON_INTERPRETER=auto
 export LYNX_SAVE_SPACE="$HOME/Downloads"
 export LYNX_TEMP_SPACE="$HOME/.cache/lynx"
 export VAGRANT_DEFAULT_PROVIDER="virtualbox"
@@ -49,10 +50,11 @@ export LESS_TERMCAP_se=$'\E[0m'
 export LESS_TERMCAP_us=$'\E[01;32m'
 export LESS_TERMCAP_ue=$'\E[0m'
 export HELM_HOME="$HOME/.helm"
+export DOCKER_BUILDKIT=1
 
 alias ll='ls -lha'
-alias la='ls -A'
-alias l='ls -CF'
+alias la='ls -AF'
+alias l='ls -F'
 alias gcc='gcc --std=c99 -Wall -Wextra -Werror -pedantic'
 alias dpkglog="grep -v 'status\\|trigproc\\|configure' /var/log/dpkg.log"
 alias deborphan='deborphan -a --no-show-section --ignore-suggests'
@@ -78,7 +80,7 @@ alias tolower='awk "{print tolower(\$0)}"'
 # shellcheck disable=SC2142
 alias toupper='awk "{print toupper(\$0)}"'
 alias wifi-portal='curl --silent --fail --write-out "%{redirect_url}" --output /dev/null http://detectportal.firefox.com/success.txt'
-alias transmission-remote='ssh -fNo ExitOnForwardFailure=yes xbmc.shore.co.il && transmission-remote'
+alias transmission-remote='forward xbmc.shore.co.il 9091:localhost:9091 && transmission-remote'
 alias kpcli='kpcli --kdb ~/Documents/Database.kdbx'
 alias gen-mac="hexdump -n5 -e '\"02\" 5/1 \":%02X\" \"\\n\"' /dev/urandom"
 alias clean-swp="find \$HOME/ -name '*.swp' -delete"
@@ -113,6 +115,51 @@ alias prune_docker_remote='find ~/.ssh -maxdepth 1 -type s -name "docker_*" -del
 alias close='ssh -fnNTS ~/.ssh/%C.sock -O exit'
 alias jjb='jenkins-jobs'
 alias diff='diff --unified'
+alias check_tcp='nc -vzw1'
+alias check_unix='nc -Uvzw1'
+alias listen_tcp='nc -vlk 0.0.0.0'
+alias listen_udp='nc -uvlk 0.0.0.0'
+alias listen_unix='nc -Uvlk'
+alias ta='terraform apply tfplan'
+
+if ! command -v notify-send > /dev/null
+then
+    alias notify-send='bell'
+elif [ -n "$GIO_LAUNCHED_DESKTOP_FILE" ]
+then
+    # shellcheck disable=SC2139
+    alias notify-send="notify-send --hint \"string:desktop-entry:$(basename "$GIO_LAUNCHED_DESKTOP_FILE")\""
+fi
+
+tp () {
+    workspace="$(terraform workspace show)"
+    if [ "$workspace" = "default" ]
+    then
+        terraform plan -out tfplan "$@"
+    else
+        terraform plan -out tfplan -var-file "$workspace.tfvars" "$@"
+    fi
+}
+
+taa () {
+    workspace="$(terraform workspace show)"
+    if [ "$workspace" = "default" ]
+    then
+        terraform apply -auto-approve "$@"
+    else
+        terraform apply -auto-approve -var-file "$workspace.tfvars" "$@"
+    fi
+}
+
+tr () {
+    workspace="$(terraform workspace show)"
+    if [ "$workspace" = "default" ]
+    then
+        terraform refresh "$@"
+    else
+        terraform refresh -var-file "$workspace.tfvars" "$@"
+    fi
+}
 
 genpass () {
     bytes="${1:-32}"
@@ -219,7 +266,7 @@ match_ssl_pair () {
     return "$exitcode"
 }
 
-flatpak-kill () {
+flatpak_kill () {
     if [ "$#" -lt 1 ]
     then
         echo "You must specify application name." >> /dev/stderr
@@ -236,15 +283,16 @@ flatpak-kill () {
 
 __prompt () {
     local exitstatus="$?"
-    local runduration endtime
+    local runduration endtime pre_prompt
     ! [ "$(type history 2> /dev/null)" = 'history is a shell builtin' ] || history -a
-    PS1='\u@\h:\w\$ '
     if [ -n "${starttime:-}" ]
     then
         endtime="$(date +%s)"
         runduration="$(( endtime - starttime))"
-        [ "$runduration" -lt '10' ] || PS1="\\[\\e[1;96m[Run duration: $runduration]\\e[0m\\] $PS1"
-        [ "$exitstatus" -eq '0' ] || [ -z "${run_command:-}" ] || PS1="\\[\\e[1;91m[Exit status: $exitstatus]\\e[0m\\] $PS1"
+        pre_prompt=''
+        [ "$exitstatus" -eq '0' ] || [ -z "${run_command:-}" ] || pre_prompt="$pre_prompt\\e[1;91m[Exit status: $exitstatus]\\e[0m "
+        [ "$runduration" -lt '5' ] || pre_prompt="$pre_prompt\\e[1;96m[Run duration: $runduration]\\e[0m "
+        [ -z "$pre_prompt" ] || echo -e "$pre_prompt"
         unset run_command
     fi
     last_command='__prompt'
diff --git a/.config/user-dirs.dirs b/.config/user-dirs.dirs
deleted file mode 100644
index ea3a3a4c208308867ce7a26dc6f5421ba54e3500..0000000000000000000000000000000000000000
--- a/.config/user-dirs.dirs
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is written by xdg-user-dirs-update
-# If you want to change or add directories, just edit the line you're
-# interested in. All local changes will be retained on the next run
-# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
-# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
-# absolute path. No other format is supported.
-#
-XDG_DESKTOP_DIR="$HOME/Desktop"
-XDG_DOWNLOAD_DIR="$HOME/Downloads"
-XDG_TEMPLATES_DIR="$HOME/Templates"
-XDG_PUBLICSHARE_DIR="$HOME/Public"
-XDG_DOCUMENTS_DIR="$HOME/Documents"
-XDG_MUSIC_DIR="$HOME/Music"
-XDG_PICTURES_DIR="$HOME/Pictures"
-XDG_VIDEOS_DIR="$HOME/Videos"
diff --git a/.githooks/post-merge b/.githooks/post-merge
index dc8b1c4bd0310f227c64afa43243bc416d660da8..827f70563f8e833b6ed6e13fc0d38d6426c5b4bf 100755
--- a/.githooks/post-merge
+++ b/.githooks/post-merge
@@ -11,7 +11,6 @@ go get github.com/kaorimatz/mysqldump-loader || true
 go get github.com/lucagrulla/cw || true
 go get sigs.k8s.io/kind || true
 echo Installing Python apps >> /dev/stderr
-python2 -m pip install --user gsutil
 python3 -m pip install --user --requirement requirements.txt
 echo Downloading binary and vendored files, creating generated files >> /dev/stderr
 git clean -fX .bash_completion.d/
diff --git a/.gitmodules b/.gitmodules
index 8479cf99a040d5c69dce5c0c06400fbca90b09a7..0f70bcc985984f28af592219946ddf715e03a3ba 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,14 +10,7 @@
 	path = Documents/Shore/bundle_certs
 	url = https://www.shore.co.il/git/bundle_certs/
 	branch = master
-[submodule "Documents/Shore/debian-repository"]
-	path = Documents/Shore/debian-repository
-	url = https://www.shore.co.il/git/debian-repository
-	branch = master
 [submodule "Documents/Shore/ansible-desktop-playbooks"]
 	path = Documents/Shore/Ansible/ansible-desktop-playbooks
 	url = https://www.shore.co.il/git/ansible-desktop-playbooks
 	branch = master
-[submodule "Documents/Shore/poquita"]
-    path = Documents/Shore/poquita
-    url = https://www.shore.co.il/git/poquita
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a77088414aabb6fd3dd4688d5269673647d6ffe0..33bf83f24b1613b639bf35b61e76dcef60d7e4ea 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,29 +1,85 @@
+# vim:ff=unix ts=2 sw=2 ai expandtab
 ---
 repos:
--   repo: https://github.com/pre-commit/pre-commit-hooks
+  - repo: https://github.com/pre-commit/pre-commit-hooks
     rev: v2.2.1
     hooks:
-    -   id: check-added-large-files
-    -   id: check-executables-have-shebangs
-    -   id: check-merge-conflict
-    -   id: check-symlinks
-    -   id: detect-private-key
-    -   id: trailing-whitespace
-    -   id: flake8
-        exclude: pythonrc.py|rabbitmqadmin
-    -   id: requirements-txt-fixer
--   repo: https://www.shore.co.il/git/shell-pre-commit/
+      - id: check-added-large-files
+      - id: check-executables-have-shebangs
+      - id: check-merge-conflict
+      - id: check-symlinks
+      - id: detect-private-key
+      - id: trailing-whitespace
+      - id: requirements-txt-fixer
+  - repo: https://www.shore.co.il/git/shell-pre-commit/
     rev: v0.6.0
     hooks:
-    -   id: shell-lint
-        exclude: &excluded_shellscripts \.bash_completion\.d/(docker-machine\.bash|fabric-completion.bash|docker-compose)|\.travis/travis\.sh
-    -   id: shellcheck
+      - id: shell-lint
+        exclude: &excluded_shellscripts |-
+          \.bash_completion\.d/(docker-machine\.bash|fabric-completion.bash|docker-compose)|\.travis/travis\.sh
+      - id: shellcheck
         exclude: *excluded_shellscripts
-    -   id: shell-lint
-        alias: shell-lint .bashrc
+      - id: shell-lint
+        name: shell-lint .bashrc
         files: \.bashrc
         types: [text]
-    -   id: shellcheck
-        alias: Shellcheck .bashrc
+      - id: shellcheck
+        name: Shellcheck .bashrc
         files: \.bashrc
         types: [text]
+  - repo: https://github.com/adrienverge/yamllint
+    rev: v1.17.0
+    hooks:
+      - id: yamllint
+  - repo: https://github.com/amperser/proselint/
+    rev: 0.10.1
+    hooks:
+      - id: proselint
+        types: [plain-text]
+        exclude: LICENSE
+  - repo: https://github.com/ambv/black
+    rev: 18.9b0
+    hooks:
+      - id: black
+        exclude: &excluded_pythonscripts pythonrc.py|rabbitmqadmin
+        args:
+          - |
+              --line-length=79
+  - repo: https://github.com/PyCQA/prospector
+    rev: 1.1.6.4
+    hooks:
+      - id: prospector
+        exclude: *excluded_pythonscripts
+        args:
+          - |-
+              --max-line-length=79
+          - |-
+              --tool=pyroma
+          - |-
+              --tool=dodgy
+        additional_dependencies:
+          - pyroma
+          - dodgy
+  - repo: https://gitlab.com/pycqa/flake8
+    rev: 3.7.7
+    hooks:
+      - id: flake8
+        exclude: *excluded_pythonscripts
+        args:
+          - |-
+            --max-line-length=79
+        additional_dependencies:
+          - flake8-bugbear
+  - repo: https://github.com/pre-commit/mirrors-pylint
+    rev: v2.3.1
+    hooks:
+      - id: pylint
+        exclude: *excluded_pythonscripts
+        args:
+          - |-
+            --disable=R0801
+  - repo: https://github.com/PyCQA/bandit
+    rev: 1.6.1
+    hooks:
+      - id: bandit
+        exclude: *excluded_pythonscripts
diff --git a/.ssh/config.d/20_endless b/.ssh/config.d/20_endless
index e5552f03a692e1bc0f81fbd46ff3509bd0519dcd..9c039775db719237d5f481e0653205449fc105c7 100644
--- a/.ssh/config.d/20_endless
+++ b/.ssh/config.d/20_endless
@@ -33,3 +33,5 @@ Host 172.31.*.* 10.*.*.* *.endlessm.com *.endlessm-sf.com endlessm.com
 User nimrod
 IdentityFile ~/.ssh/endless_ecdsa
 IdentityFile ~/.ssh/endless_rsa
+IdentityFile ~/.ssh/endless_us-west-2
+IdentityFile ~/.ssh/endless_us-west-1
diff --git a/.ssh/config.d/20_shore b/.ssh/config.d/20_shore
index 8cc33ea424bd954f6a6f8b876e5328b968b20167..cd1fadd123ab4a92bf638fe35bf7f1a0404d87b7 100644
--- a/.ssh/config.d/20_shore
+++ b/.ssh/config.d/20_shore
@@ -1,31 +1,17 @@
 
 # shore.co.il infrastructure
 
-Host ns1.shore.co.il www.shore.co.il
-DynamicForward 8080
-
-Host xbmc.shore.co.il
-ForwardX11 yes
-LocalForward 9091 localhost:9091
+Host cgit.shore.co.il host01.shore.co.il wdr4300.shore.co.il xbmc.shore.co.il
 ProxyCommand ssh ns1.shore.co.il -W %h:%p
 
 Host ns2.shore.co.il
 User admin
-DynamicForward 9999
-
-Host cgit.shore.co.il
-ProxyCommand ssh ns1.shore.co.il -W %h:%p
 
 Host ns3.shore.co.il
 User root
-DynamicForward 8081
-
-Host host01.shore.co.il
-ProxyCommand ssh ns1.shore.co.il -W %h:%p
 
 Host wdr4300.shore.co.il
 User root
-ProxyCommand ssh ns1.shore.co.il -W %h:%p
 LocalForward 8082 localhost:80
 
 Host *.shore.co.il 192.168.3.*
diff --git a/Documents/Shore/Ansible/ansible-desktop-playbooks b/Documents/Shore/Ansible/ansible-desktop-playbooks
deleted file mode 160000
index f2e18e5b4d35a951e5490d5929df769c516e93ce..0000000000000000000000000000000000000000
--- a/Documents/Shore/Ansible/ansible-desktop-playbooks
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f2e18e5b4d35a951e5490d5929df769c516e93ce
diff --git a/Documents/Shore/debian-repository b/Documents/Shore/debian-repository
deleted file mode 160000
index 1639468727302074034cbfe684500a174700f313..0000000000000000000000000000000000000000
--- a/Documents/Shore/debian-repository
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 1639468727302074034cbfe684500a174700f313
diff --git a/Documents/Shore/poquita b/Documents/Shore/poquita
deleted file mode 160000
index bebddcfe7603dce3f1739055305ec287d9590f63..0000000000000000000000000000000000000000
--- a/Documents/Shore/poquita
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit bebddcfe7603dce3f1739055305ec287d9590f63
diff --git a/Documents/bin/_vagrant-clean b/Documents/bin/_vagrant-clean
index dad88af9ada28fc1062223ed8897c60c204037a8..6251fdfdbb9b19da6b75ae7bf2c760dd55c4c09e 100755
--- a/Documents/bin/_vagrant-clean
+++ b/Documents/bin/_vagrant-clean
@@ -6,18 +6,25 @@ from parse import parse
 
 boxes = {}
 for line in vagrant.box("list"):
-    box = parse('\x1b[0m{name:^} ({provider}, {version})\x1b[0m', line)
-    if box['name'] in boxes:
-        if box['provider'] in boxes[box['name']]:
-            boxes[box['name']][box['provider']].append(box['version'])
+    box = parse("\x1b[0m{name:^} ({provider}, {version})\x1b[0m", line)
+    if box["name"] in boxes:
+        if box["provider"] in boxes[box["name"]]:
+            boxes[box["name"]][box["provider"]].append(box["version"])
         else:
-            boxes[box['name']][box['provider']] = [box['version']]
+            boxes[box["name"]][box["provider"]] = [box["version"]]
     else:
-        boxes[box['name']] = {box['provider']: [box['version']]}
+        boxes[box["name"]] = {box["provider"]: [box["version"]]}
 for box in boxes:
     for provider in boxes[box]:
         for version in boxes[box][provider][:-1]:
-            print('Removing box {0} version {1}.'.format(box, version))
-            vagrant.box('remove', '--force', '--provider', provider,
-                        '--box-version', version, box)
-vagrant('global-status', '--prune')
+            print("Removing box {0} version {1}.".format(box, version))
+            vagrant.box(
+                "remove",
+                "--force",
+                "--provider",
+                provider,
+                "--box-version",
+                version,
+                box,
+            )
+vagrant("global-status", "--prune")
diff --git a/Documents/bin/_vagrant-update b/Documents/bin/_vagrant-update
index bcaa2c2887b51d0ca25d9ce0963c52f02a965aa5..141f1c9ccb4cb4816ef99dc32ddf903a8f9b7ad1 100755
--- a/Documents/bin/_vagrant-update
+++ b/Documents/bin/_vagrant-update
@@ -5,16 +5,16 @@ from parse import parse
 
 
 boxes = {}
-dummy_providers = ['aws']
-for line in vagrant.box('list'):
-    box = parse('\x1b[0m{name:^} ({provider}, {version})\x1b[0m', line)
-    if not box['provider'] in dummy_providers:
-        if box['name'] in boxes:
-            if not box['provider'] in boxes[box['name']]:
-                boxes[box['name']].append(box['provider'])
+dummy_providers = ["aws"]
+for line in vagrant.box("list"):
+    box = parse("\x1b[0m{name:^} ({provider}, {version})\x1b[0m", line)
+    if not box["provider"] in dummy_providers:
+        if box["name"] in boxes:
+            if not box["provider"] in boxes[box["name"]]:
+                boxes[box["name"]].append(box["provider"])
         else:
-            boxes[box['name']] = [box['provider']]
+            boxes[box["name"]] = [box["provider"]]
 for box in boxes:
     for provider in boxes[box]:
-        print('Updating box {0} provider {1}.'.format(box, provider))
-        vagrant.box('update', '--provider', provider, '--box', box)
+        print("Updating box {0} provider {1}.".format(box, provider))
+        vagrant.box("update", "--provider", provider, "--box", box)
diff --git a/Documents/bin/urldecode b/Documents/bin/urldecode
index 87954fe6f3592a37136320b1b48d0b0a7e2bdb38..181f14e5818b69ae9dd6cdd95b822b484fe62415 100755
--- a/Documents/bin/urldecode
+++ b/Documents/bin/urldecode
@@ -3,6 +3,6 @@ from fileinput import input
 from urllib.parse import unquote_plus as unquote
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     for line in input():
         print(unquote(line.strip()))
diff --git a/Documents/bin/urlencode b/Documents/bin/urlencode
index 3f93145c3b495a339ac534aa32b27b66e54c7e1a..5b1af7237e75335bd33166de387173c6c1d23c7d 100755
--- a/Documents/bin/urlencode
+++ b/Documents/bin/urlencode
@@ -3,6 +3,6 @@ from fileinput import input
 from urllib.parse import quote_plus as quote
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     for line in input():
         print(quote(line.strip()))
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3803314af99fb63caa74d0a55bb8da632a2092f6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,46 @@
+# rcfiles
+
+[![image](https://travis-ci.org/adarnimrod/rcfiles.svg?branch=master)](https://travis-ci.org/adarnimrod/rcfiles)
+
+A repository with my rc files. The purpose is for me to have revision
+control of my home directory, maybe send somebody a link to an example
+file and to be browsable for others (if anyone wants to copy some
+snippet). Because these are my actual files that I use right now, the
+repository is cloned directly to my home directory and is not meant for
+mass consumption as it is.
+
+## Installation
+
+*WARNING: This will overwrite your existing files.*
+
+```
+cd
+git clone --bare https://www.shore.co.il/git/rcfiles .git
+sed -i '/bare/d' .git/config
+git reset --hard
+git bull
+Documents/bin/install-git-hooks
+```
+
+## Dependencies
+
+Dependencies that can be installed locally inside the home directory, are
+installed with the Git hook using the supplied `Makefile`. Dependencies that
+can't be installed locally, can be install with the `workstation.yml` Ansible
+playbook from the
+[ansible-desktop-playbook](https://www.shore.co.il/git/ansible-desktop-playbooks)
+repository, please consult the README from that repository. Care has been given
+to minimizing the dependencies and making the scripts as cross-platform as
+reasonably possible, so most script would run without any installing any tools
+not found on a Unix-like OS by default.
+
+## License
+
+This software is licensed under the MIT license (see `LICENSE.txt`).
+
+## Author Information
+
+Nimrod Adar, [contact me](mailto:nimrod@shore.co.il) or visit my [website](
+https://www.shore.co.il/). Patches are welcome via [`git send-email`](
+http://git-scm.com/book/en/v2/Git-Commands-Email). The repository is located
+at: <https://www.shore.co.il/git/>.
diff --git a/README.rst b/README.rst
deleted file mode 100644
index 08cf7745bc50d04170642217f02406f5bbfc89e4..0000000000000000000000000000000000000000
--- a/README.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-rcfiles
-*******
-
-.. image:: https://travis-ci.org/adarnimrod/rcfiles.svg?branch=master
-    :target: https://travis-ci.org/adarnimrod/rcfiles
-
-A repository with my rc files. The purpose is for me to have revision control of
-my home directory, maybe send somebody a link to an example file and to be
-browsable for others (if anyone wants to copy some snippet). Because these are
-my actual files that I use right now, the repository is cloned directly to my
-home directory and is not meant for mass consumption as it is.
-
-Installation
-------------
-
-*WARNING: This will overwrite your existing files.*
-
-.. code:: shell
-
-    cd
-    git clone --bare https://www.shore.co.il/git/rcfiles .git
-    sed -i '/bare/d' .git/config
-    git reset --hard
-    git bull
-    Documents/bin/install-git-hooks
-
-Dependencies
-------------
-
-All of the dependencies are installed with the workstation playbooks inside the
-ansible-desktop-playbooks submodule, please consult the README in the submodule.
-Care has been given to minimizing the dependencies and making the scripts as
-cross-platform as reasonably possible, so most script would run without any
-installing any tools not found on a Unix-like OS by default.
-
-License
--------
-
-This software is licensed under the MIT license (see the :code:`LICENSE.txt`
-file).
-
-Author Information
-------------------
-
-Nimrod Adar, `contact me <nimrod@shore.co.il>`_ or visit my `website
-<https://www.shore.co.il/>`_. Patches are welcome via `git send-email
-<http://git-scm.com/book/en/v2/Git-Commands-Email>`_. The repository is located
-at: https://www.shore.co.il/git/.