diff --git a/data/backups/archives.md b/data/backups/archives.md
index 2de1687..96c3c57 100644
--- a/data/backups/archives.md
+++ b/data/backups/archives.md
@@ -8,22 +8,21 @@ tags: [ "tar", "backups", ".tgz", "tar.gz" ]
 
 Combine many files and directories into a single t-archive file.
 
-```bash
+```sh
 tar cf "$ARCHIVE".tar $DIR
 ```
 You can remember this with the mnemonic '*C*reate *F*ile'.
 
-Unfortunately, this stores the full file path, so making a tar archive of `/etc/nginx/` will store `etc/nginx` (without the leading `/`.
-
+Unfortunately, this stores the full file path, so making a tar archive of `/etc/nginx/` will store `etc/nginx` (without the leading `/`).
 It's often better to tell tar which path to start from using the `-C` flag.
 
-```bash
+```sh
 tar cf "$ARCHIVE".tar -C /etc/ nginx
 ```
 
 Check the contents of your archive with:
 
-```bash
+```sh
 tar tf "$ARCHIVE".tar
 ```
 
@@ -31,7 +30,7 @@ If you want to store 'everything in a directory', then using `*` will not work,
 
 Instead, you can store the target in a variable:
 
-```bash
+```sh
 files=$(ls /etc/nginx)
 tar cf "$ARCHIVE".tar -C /etc/nginx/ $file
 ```
@@ -40,7 +39,9 @@ tar cf "$ARCHIVE".tar -C /etc/nginx/ $file
 
 Extract the tar archive with
 
-> tar xf "$ARCHIVE".tar
+```sh
+tar xf "$ARCHIVE".tar
+```
 
 You can remember this with the mnemonic 'e*X*tract *F*ile'.
 
@@ -48,7 +49,7 @@ You can remember this with the mnemonic 'e*X*tract *F*ile'.
 
 Create a zip-compressed archive with the `z` flag.
 
-```bash
+```sh
 tar czf "$ARCHIVE".tgz -C /etc/nginx/ $file
 ```
 
@@ -60,18 +61,16 @@ You can use any file ending you want, but sane people like to use '.tgz' or '.ta
 
 Make archive:
 
-```bash
-PASSWORD=my_password
-```
-```bash
-7za a -tzip -p$PASSWORD -mem=AES256 $ARCHIVE.zip $FILE_1 $FILE_2
+```sh
+7za a -tzip -p "$PASSWORD" -mem=AES256 $ARCHIVE.zip $FILE_1 $FILE_2
 ```
+
 Note that people can still see every filename in your archive, and can change those files.
 They just can't read the contents.
 
 Unzip:
 
-```bash
+```sh
 7za x archive.zip
 ```
 
diff --git a/data/backups/unison.md b/data/backups/unison.md
index 480dd46..55a1168 100644
--- a/data/backups/unison.md
+++ b/data/backups/unison.md
@@ -5,7 +5,7 @@ tags: [ "backups", "synch" ]
 
 Install unison on both machines, and make sure both have the same version of unison, with the same version of the ocaml compiler (the smallest difference will cause problems).
 
-```bash
+```sh
 unison -version
 ```
 
@@ -13,14 +13,14 @@ Create the `~/.unison` directory on both machines.
 
 Make a job called `backup`:
 
-```bash
+```sh
 JOB=backup
 ```
 
 Here is an example job, which synchronizes the `~/music` directory with a remote machine which has the same username.
 
 
-```bash
+```sh
 echo "
 auto = true
 root=$HOME
@@ -42,7 +42,7 @@ The last command means it will ignore any file with a name ending in `.flac`.
 The first command means this will run but also confirm which files will be deleted, and which will be transferred, us `batch = true` instead.
 Or you can deleted that line in the `.prf` file and run it with a flag:
 
-```bash
+```sh
 unison -batch *backup*.prf
 ```
 
diff --git a/data/base_16.md b/data/base_16.md
index 5580b2f..1acf959 100644
--- a/data/base_16.md
+++ b/data/base_16.md
@@ -3,6 +3,24 @@ title: "Base 16"
 tags: [ "data" ]
 ---
 
-```bash
+Base 16 numbers often use `0x` at the start, so '10' just means '10', but `0x10` means '10 in base 16' which means '16'.
+
+For small numbers, use `printf`.
+
+```sh
 printf "%x" $NUMBER
 ```
+
+For any number, use `bc`.
+
+
+```sh
+fortune | md5sum  | cut -d' ' -f1 | tr [:lower:] [:upper:] | bc
+```
+
+- Inputting base 16 uses `ibase=16`.
+- Outputting base 10 uses `ibase=10`
+
+```sh
+echo 'ibase=16;' $(echo cbb478ac825f0dce7671254be035d0bc | tr [:lower:] [:upper:]) | bc
+```
diff --git a/data/radicale.md b/data/radicale.md
index 711bc9b..6dac20d 100644
--- a/data/radicale.md
+++ b/data/radicale.md
@@ -1,7 +1,7 @@
 ---
 title: "radicale and nginx"
 tags: [ "data", "calendar" ]
-required: [ "nginx", "certbot" ]
+requires: [ "nginx", "certbot" ]
 ---
 
 Check before you start:
diff --git a/data/sc-im.md b/data/sc-im.md
index 0638754..d3d2c6c 100644
--- a/data/sc-im.md
+++ b/data/sc-im.md
@@ -1,7 +1,7 @@
 ---
 title: "sc-im"
 tags: [ "TUI", "data", "spreadsheet", ".csv" ]
-required: [ "vim basics" ]
+requires: [ "vim basics" ]
 ---
 
 - [Sample file](sc-im/sample.sc)
diff --git a/data/soft-serve/maintenance.md b/data/soft-serve/maintenance.md
index 36cd1f1..2e41b4b 100644
--- a/data/soft-serve/maintenance.md
+++ b/data/soft-serve/maintenance.md
@@ -1,7 +1,7 @@
 ---
 title: "Soft Serve Maintenance"
 tags: [ "data", "git server", "maintenance" ]
-required: [ "git", "nginx" ]
+requires: [ "git", "nginx" ]
 ---
 
 Over time git repositories become bloated with old data, but never get cleaned.
diff --git a/data/soft-serve/soft_https.md b/data/soft-serve/soft_https.md
index 8dafb68..a9a9875 100644
--- a/data/soft-serve/soft_https.md
+++ b/data/soft-serve/soft_https.md
@@ -1,7 +1,7 @@
 ---
 title: "Soft Serve through https"
 tags: [ "data", "git server", "lfs" ]
-required: [ "git", "nginx" ]
+requires: [ "git", "nginx" ]
 ---
 
 ## `http` Setup
diff --git a/data/soft.md b/data/soft.md
index 8f2c9ca..989a40c 100644
--- a/data/soft.md
+++ b/data/soft.md
@@ -1,7 +1,7 @@
 ---
 title: "Soft-Serve"
 tags: [ "data", "git server", "lfs", "TUI" ]
-required: [ "git", "nginx" ]
+requires: [ "git", "nginx" ]
 ---
 
 - [Soft-Serve with https](soft-serve/soft_https.md)
diff --git a/hardware/keyboard.md b/hardware/keyboard.md
index f81c3d8..03f9388 100644
--- a/hardware/keyboard.md
+++ b/hardware/keyboard.md
@@ -11,6 +11,7 @@ Select a keymap, and create a new custom map.
 
 ```sh
 su root
+ls /usr/share/kbd/keymaps/i386/qwerty/
 
 basemap=/usr/share/kbd/keymaps/i386/qwerty/pl1.map.gz
 newmap=/usr/share/kbd/keymaps/custom.map.gz
diff --git a/system/Makefiles.md b/system/Makefiles.md
index 13557bb..3b638a8 100644
--- a/system/Makefiles.md
+++ b/system/Makefiles.md
@@ -23,7 +23,8 @@ Using four spaces will not work!
 
 ## Dependency Files
 
-Now we've made a `README.md` file, we can show how a makefile looks in the README:
+Now we've made a `README.md` file, we can show how a makefile looks in the README file.
+Add these lines to the `Makefile`:
 
 ```make
 README.md: Makefile
@@ -44,7 +45,7 @@ Note the order:
 
 Notice that the file above can print into the README by using `echo "" >> $@`.
 The `$@` stands for 'the file which we want', and `$<` stands for 'the first dependency file'.
-The `make` program starts by replacing those variables, and the result it:
+The `make` program starts by replacing those variables, so when you run `make`, the program looks like this:
 
 ```make
 README.md: Makefile
@@ -54,7 +55,6 @@ README.md: Makefile
 	cat Makefile >> README.md
 	echo '```' >> README.md
 
-
 ```
 
 |  Sigil  | Meaning                                |
@@ -71,7 +71,6 @@ README.md: Makefile
 
 You can assign a variable normally, but must refer to it in brackets.
 
-
 ```make
 storage_directory = backups
 
@@ -182,4 +181,3 @@ In this case, the makefile can see that `backup` depends on the current backup f
 - [File patterns](Makefiles/patterns.md)
 - [Makefile graphs](Makefiles/graph-easy.md)
 - [In-build help](Makefiles/help.md)
-- [Makefile graphs](Makefiles/graph-easy.md)
diff --git a/system/managing_groups.md b/system/managing_groups.md
new file mode 100644
index 0000000..9ab53f9
--- /dev/null
+++ b/system/managing_groups.md
@@ -0,0 +1,32 @@
+---
+title: "Managing Groups"
+tags: [ "system" ]
+---
+
+Check which groups you are in, and which are available:
+
+```sh
+cat /etc/group
+groups
+cat /etc/group | grep $USER
+```
+
+Remove yourself from all groups, and add yourself back to only `wheel`, `audio`, and your own group:
+
+```sh
+sudo usermod --groups wheel,audio,$USER
+```
+
+Add yourself to the `wheel` group:
+
+```sh
+su root -c "usermod --append --groups wheel $USER"
+```
+Add yourself to the `network` group:
+
+```sh
+sudo usermod -aG network $USER
+```
+
+The changes will not take effect until you log in again, so reboot or log into `localhost` with [ssh](../networking/ssh.md).
+
diff --git a/virtualization/virtualbox.md b/virtualization/virtualbox.md
index e93bada..0461870 100644
--- a/virtualization/virtualbox.md
+++ b/virtualization/virtualbox.md
@@ -1,21 +1,16 @@
 ---
 title: "virtualbox"
 tags: [ "system" ]
+requires: [ "Managing Groups" ]
 ---
 # Setup
 
-## Arch Linux
+Load the modules (or just reboot):
 
 ```sh
-sudo pacman -S virtualbox-host-modules-arch virtualbox-guest-iso
-```
-
-```sh
-sudo modprobe vboxdrv
-```
-
-```sh
-# vboxreload
+su root
+modprobe vboxdrv
+vboxreload
 ```
 
 Make dd image into vdi
@@ -30,7 +25,13 @@ If this doesn't work, try to make a new bite size with just
 sudo dd if=image.dd of=image2.dd bs=512 conv=sync
 ```
 
-## CLI Management
+## Arch Linux
+
+```sh
+pacman -S virtualbox-host-modules-arch virtualbox-guest-iso
+```
+
+# CLI Management
 
 List boxes:
 
@@ -50,22 +51,19 @@ To pause the machine:
 VBoxManage controlvm "rata" pause --type headless
 ```
 
-You can do a number of things to virtualboxes this way:
+You can do a number of things to the 'virtual boxes' this way:
 
-- startvm
-
-- pause
-
-- resume
-
-- poweroff
+- `startvm`
+- `pause`
+- `resume`
+- `poweroff`
 
 ## Creating Disks
 
 Creating a VM requires registering it:
 
 ```sh
-VBoxManage createvm --name Ubuntu19.04 --register  --ostype Ubuntu
+VBoxManage createvm --name Ubuntu19.04 --register --ostype Ubuntu
 ```
 
 ```sh
@@ -78,6 +76,7 @@ VBoxManage storagectl Ubuntu19.04 -name IDE --add ide --controller PIIX4  --boot
 
 Create just a disk with:
 
-VBoxManageg createhd --filename Ubuntu16.04 --size 5120
-
+```sh
+VBoxManage createhd --filename "$diskname" --size 5120
+```