diff --git a/Changelog.md b/Changelog.md
index d461544..f424ca8 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,12 @@
 # Changelog
 
+## v0.5.3 - 7th March 2019
+ - Tweak x axis labels
+ - Build script: Improve first-time setup experience
+
+## v0.5.2 - 1st March 2019
+ - [API] Added `version` action
+
 ## v0.5.1 - 26th February 2019
  - Fixed issue with non-linear sensor reading reports ([#15](https://github.com/ConnectedHumber/Air-Quality-Web/issues/15))
 
diff --git a/README.md b/README.md
index a7b0531..d92434d 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,9 @@ In order to run this program, you'll need the following:
 The client-side code requires building. Currently, no pre-built versions are available (though these can be provided upon request), so this must be done from source. A build script is available, however, which automates the process - as explained below.
 
 ### System Requirements
- - PHP-enabled web server (Nginx is recommended, but Apache works too)
+ - PHP-enabled web server
+     - _Nginx_ + _PHP-FPM_ is recommended
+     - Apache works too
  - MariaDB database with the appropriate table structure pre-loaded
  - PHP 7+
  - Node.JS (preferably 10+) + npm 6+ (for installing & building the client-side app code)
@@ -33,53 +35,101 @@ The client-side code requires building. Currently, no pre-built versions are ava
  - PHP modules:
      - `pdo-mysql` (for the database connection)
 
-### Building From Source
-The build script ensures that everything it does will not go outside the current directory (i.e. all dependencies are installed locally).
+### Installation
+1. Start by cloning this repository:
 
-To build from source, start off by cloning this repository.
+```bash
+git clone https://github.com/ConnectedHumber/Air-Quality-Web.git
+```
 
-Then run the `setup` and `setup-dev` build commands from the root of the repository like this:
+
+2. Change the ownership to allow your web server user to access the created directory. Usually, the web server will be running under the `www-data` user:
+
+```bash
+sudo chown -R www-data:www-data path/to/Air-Quality-Web
+```
+
+
+3. `cd` into the root of the cloned repository. Then install the dependencies (these are installed locally):
 
 ```bash
 ./build setup setup-dev
 ```
 
-This will initialise any git submodules and install both the server-side and client-side dependencies. Once done, all you need to do is build the client-side code:
+
+4. Build the client-side application:
 
 ```bash
+# For development, run this:
 ./build client
+# For production, run this:
+NODE_ENV=production ./build client
+# If you're actively working on the codebase and need to auto-recompile on every change, run this:
+./build client-watch
 ```
 
-For development purposes, the `client-watch` command is available.
 
-In production, you probably want to do this instead:
+5. Edit `data/settings.toml` to enter your database credentials.
+
+You can edit other settings here too. See `settings.default.toml` for the settings you can change, but do **not** edit `settings.default.toml`! Edit `data/settings.toml` instead. You'll probably want to give the entire default settings file a careful read.
+
+
+6. Configure your web server to serve the root of the repository you've cloned if you haven't already. Skip this step if you cloned the repository into a directory that your web server already serves.
+
+
+7. Disallow public access to the private `data`  directory.
+
+In Nginx:
+
+```nginx
+# put this inside the "server {  }" block:
+location ^~ /path/to/data/directory {
+    deny all;
+}
+```
+
+In Apache:
+
+```htaccess
+# Create a file with this content inside the data/ directory
+Require all denied
+```
+
+
+8. Test the application with an API call. If this returns valid JSON, then you've set it up correctly
+
+```
+http://example.com/path/to/Air-Quality-Web/api.php?action=list-devices
+```
+
+
+9. (Optional) Setup HTTPS:
 
 ```bash
-NODE_ENV=production ./build client
+sudo apt install certbot
+# On Nginx:
+sudo certbot --nginx --domain example.com
+# On Apache:
+sudo certbot --apache --domain example.com
 ```
 
-This will take longer, as it causes the build system to additionally minify the client code, saving a significant amount of bandwidth and speeding up loading times.
-
-
-### Configuration
-#### Web server
-Configure your php-enabled web server to:
- - ...serve the root directory of this repository in PHP
- - ...block access to the `data` directory (created on first page load)
- - ...be able to write to the repository root (technically only the `data` directory requires write access)
-     - Example: `sudo chown -R www-data:www-data path/to/repository_root`
-
-#### Application
-Some configuration must be done before the application is ready for use.
-
-The first time `api.php` is called from a browser, it will create a new blank configuration file at `data/settings.toml`, if it doesn't already exist. See the `settings.default.toml` file in this repository for a list of configurable settings, but do **not** edit `settings.default.toml`!
-
-Instead, enter your configuration details into `data/settings.toml`, which overrides `settings.default.toml`. In particular, you'll probably want to change the settings under the `[database]` header - but ensure you give the entire file a careful read.
-
 
 ## API
 The server-side API is accessed through `api.php`, and supports a number of GET parameters. The most important of these is the `action` parameter, Which determines what the API will do. The following values are supported:
 
+### version
+> Returns the version of the application.
+
+_No parameters are currently supported by this action._
+
+Examples:
+
+
+```
+https://example.com/path/to/api.php?action=version
+```
+
+
 ### fetch-data
 > Fetches air quality data from the system for a specific data type at a specific date and time.
 
diff --git a/build b/build
index 0a97d23..c9b38a9 100755
--- a/build
+++ b/build
@@ -86,6 +86,19 @@ function task_setup {
 	composer install --no-dev;
 	task_end $?;
 	
+	if [ ! -d "./data" ]; then
+		task_begin "Setting up initial data folder";
+		mkdir "./data"; chmod 0700 "./data";
+		
+		echo -e "# -------[ Custom Settings File - Last updated $(date) ]-------" >"./data/settings.toml";
+		echo -e '[database]\nusername = "INSERT_DATABASE_USERNAME_HERE"\npassword = "INSERT_DATABASE_PASSWORD_HERE";' >>"./data/settings.toml";
+		
+		echo -e "${HC}Don't forget to edit './data/settings.toml' to specify the database username and password${RS}";
+		echo -e "";
+		
+		task_end $?;
+	fi
+	
 	stage_end $?;
 }
 
diff --git a/client_src/js/DeviceReadingDisplay.mjs b/client_src/js/DeviceReadingDisplay.mjs
index 7ca9502..3fee6e5 100644
--- a/client_src/js/DeviceReadingDisplay.mjs
+++ b/client_src/js/DeviceReadingDisplay.mjs
@@ -12,6 +12,7 @@ import Chart from '../../node_modules/chart.js/dist/Chart.bundle.min.js';
 import GetFromUrl from './Helpers/GetFromUrl.mjs';
 import GetContainingElement from './Helpers/GetContainingElement.mjs';
 import Postify from './Helpers/Postify.mjs';
+import { human_duration_unit } from './Helpers/DateHelper.mjs';
 
 
 class DeviceReadingDisplay {
@@ -238,7 +239,7 @@ class DeviceReadingDisplay {
 						type: "time",
 						time: {
 							format: "YYYY-MM-DD HH:mm",
-							tooltipFormat: 'll HH:mm'
+							tooltipFormat: 'll HH:mm',
 						},
 						scaleLabel: {
 							display: true,
@@ -354,7 +355,8 @@ class DeviceReadingDisplay {
 		
 		// Update the x axis labels
 		// this.chart.data.labels = new_data_obj.data.map((point) => point.t);
-		
+		this.chart.options.scales.xAxes[0].time.unit = human_duration_unit(this.end_time.diff(this.start_time));
+		console.log(`New unit: ${this.chart.options.scales.xAxes[0].time.unit}`);
 		// Update the chart
 		this.chart.update();
 		
diff --git a/client_src/js/Helpers/DateHelper.mjs b/client_src/js/Helpers/DateHelper.mjs
new file mode 100644
index 0000000..470e16c
--- /dev/null
+++ b/client_src/js/Helpers/DateHelper.mjs
@@ -0,0 +1,13 @@
+"use strict";
+
+function human_duration_unit(milliseconds) {
+	let seconds = Math.floor(milliseconds / 1000);
+	if(seconds <= 60) return "second";
+	if(seconds <= 60*60) return "minute";
+	if(seconds <= 60*60*24) return "hour";
+	if(seconds <= 60*60*24*45) return "day";
+	if(seconds <= 60*60*24*365) return "month";
+	return "year";
+}
+
+export { human_duration_unit };
diff --git a/design/Application Structure.drawio.svg b/design/Application Structure.drawio.svg
new file mode 100644
index 0000000..27ec008
--- /dev/null
+++ b/design/Application Structure.drawio.svg	
@@ -0,0 +1,2 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4143" height="1242" viewBox="-0.5 -0.5 4143 1242" content="&lt;mxfile modified=&quot;2019-02-25T11:36:08.740Z&quot; host=&quot;www.draw.io&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/9.3.1 Chrome/66.0.3359.181 Electron/3.0.6 Safari/537.36&quot; etag=&quot;D11kMHNhcSoJjEHFh9Du&quot; version=&quot;10.2.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;396a3652-59d3-6754-36e3-84bf9249b1bf&quot; name=&quot;Page-1&quot;&gt;7V1bc6M2FP41mWkfsoMQ4vKYTbpNO9luut5OZ/omg2zTYuRinEt/fSVABJAwOOaWLNmHtQ8Ci/Od7+jo6HYBr7dPP0d4t/lMPRJc6Jr3dAFvLnRdN4DF/uOS51QCAICpZB35XiZ7ESz8/0gm1DLpwffIvlQwpjSI/V1Z6NIwJG5ckuEooo/lYisalH91h9dEEixcHMjSP30v3qRSW7de5LfEX2/ELwPTSa8ssfvPOqKHMPu9Cx2ukr/08haLZ2Uvut9gjz4WRPCnC3gdURqnn7ZP1yTgyhVqS+/7VHM1r3dEwrjNDdcL/4n8Alfkj6dvv+p//XGjfwsvUVa5BxwciHiPpLbxs9BQ8o6EP0W7gB8fN35MFjvs8quPzCiYbBNvA/YNsI/7OKL/5JqETLKiYZzBDuzs+zUNaJQ8HWrJH5PjwF+HTOay9yERL+gHQaGgh4jtGflPFK7Y+hKaJruyDvB+n9UzVzf/4tKt72afPbzfJG/Dq0vZi/gxt12HX5N1mqn5gUQxeSqIMh3/TOiWxNEzKyKuAiPTacYI8fXxxbpy2aZgWcjJhDiz6HX+7BdU2YcM2BNANpwZ5BRkuyOQbacZYzQsxvaMcYqx1RHGJmzG2OwLYwPNcKZwoo7ghKgZTrs3OGEDeiWkcBRf8ciGCUIaEiH75PPnJ8VJ6IkSdEfCVFK4/jeJ4+cMXHyIKddoFG/omoY4uKN0p7QK/QSrIMEy+XkOgM+iqSqAFSNZIf5PZSRm8ncM4z09RG6mNZi5OaaPNYnLSBKvFOnJlhCRAMf+QznwOwdWeJLTBaeyFHTIUhaX6q6rAsAzlyY6CsApwY9VZllOqQLNgCr6sTtgGTQl7XObWGRfXxjw04v0Y1c8dLmP486sQEUwCBXbEUeXiQNA18RJbmUawc+FAjvqh/G+8OR7LjgSMQOn0pNpugGWuz7sQ1qHF6vJX6adIVmzIdUaEng7hmSgsQ0JzYZUZ0i6wpCElxrZkOwTHVK1PATHyztnlq/U53wzlcPT2UyFbSkiTjgNf1c1uyZ3J5kpPNFMTyxfqc/ZZqobs5nWmakpW6k+DSs10dE2trF8184OtMiGzmZVb1bCIb5xs+raOUHJqj7ywSnWF68a136Dd/zjYRt8ivCWNKcFXp0EEL3uZHAj725DTZHFw8ReKfMDpmuT5aqa35HzibX21D59cGnoFZDk7AESA4edJ+nklOsNjvES78kUIARaI4Yr2yXqHM/SRgaSkqy9YAig3Yhhf+NfhoThgkQP0yCh3Qxgc5KufwCbh7ZAXqZz/FokVOe2ub5ttrpumtviZkq4faWHWMG77yodblRcYc6bEpkUXDI7oBKQuXTlxj4NmewWh17wvaNjVhsqfUB01LNxnC69XYCXJPiYz1Iq65fPU2rvyarAyp6t7CGrTlXleFv5OEv2cc5YPs6a+XQSnwb1dko+mZ2O49TwKTPn7qjUihiOTIzuR2HaKl/OqHwlO7r3Y5o957vlhDM9TnSa638PbYzgTYlLaCwuidoUyHR/e88E9zdfpsolAjxELBWXHNOCuLPJJWOSSdHF6ZJIJ3ZNsxJDz/pqxyck80kfjU/TSim8OdxGyyiAY+lY7Zbu46l6wxZp2C68oWGM6Q3lzhBHh0kWLOirT5i7z4HPMIqa8VmmYN4ti/nXT3jrB/x9b0nwQPjE03Nwq8dHYRw1GPeBpAGHRFLm2e8HktTvyy72t75qCOv7ZhpAQ+Ijx4Nz2uFY2gGYA6IDZXTmru+Fsus7aHpVTCSccWnEZVC+CE9awOVPpuEdd2LadbJMqC50CGlMGoPgpBOafUbNWDYicsaylVM6tsKN5IuokQyJct5DbyMRcnx3zdSMXT4lxwxiHqAxyMx1nKvg1XwqLggrrhQrLg6rn5XSGKrlM1uqNO1h7S8UWQIxKUmzJCBtKOMogrDucZSju8XvdzOER7iooQ+oAqItgSj0OgyIcmMmENzvcCgw/Er+PZD9C0HZbxUvq0CXH5L24moeMNtIymCjbCC6Y32QHbZqjozRl4mITSmK/hoHweysj/QbNEsiugpHJdVhTzhaLdZ9T2O4pjkZWU5yyknQzgZw1JrM6FfMZqoLZnMGh09xKqtjyxOJZwvo1wJsvWsLeNWM9kvWRa56JAcVDarNLYaFKjZ43rx2tcY6Xdc426RCw517pRFtEqEBbNKSUwt3BK8Ccu5A0fsJeS51XYp5TEWqYdAJKcL7Fic8BIe1H86wCdigXYXNMMaGzRliruqJc+uavf8Zntto6bmBNg3XXdmJpcltV4uX1/r25LLl5Tp3+PnsAa13xHxTan1H99fW3EHpKhhUTDw8GtpMpIsq6j232Ce02OMT1wYSPu+7xVbs3PEW6OXI9JqBU2tqYsB1uj/Je8JpIgk2YFa9MnC0Dw3pDKgbTTf1FB3LM5evA58klbva7QLfxek8sLnRrctu6DpSjOgM3FEeZUhnQm7CaZvzdOC03LmcUPxMvUMgz26eGZczzh6fcLacVZi7J03dE6SPDtsQi3XfYxrBVmwEMlA/53VhmK0Ys2yKwqR7oIOGCMJsednfnKI8nqIcf2zCnuo+GpN3JeOlTDpyJQhN15XI/bnZlRx3JeNHJSJ1MXcCjgSTk+sCOJ2eBPEGutiwpd+e6OC0WPDSdnAaDDA47cjjnDPzy8yvwDIB4gPtTSbX/j5sd6KKOHKFJCtxFK7uRpmn4hsuodhdoKdTOWreXub77bdv9/IKiuo6m3HXVuSHrDV7BnFQW/+eobKNs247Ks+gqVY0mr15Bvtsz9BM0zcVNeSEL7oGs2sfcB5qQE7CzzC2gLGm5GibZx6veQHd39Z++DSGI/UsZ6lpbRzpakVMd6DlqKiVJx04xlItNnQ3owTGbwI1YEwBNTmTXZpFoC14KpFFNdotiep3cHq/2zBAs4yaapefQTdhAEBOPvFt1f1wzYTq3CF717jCq5LOsnarqOBMJIEgjna9yi5sfc9LWlMVmuUWthWX++dh9cxfpDiNVHnob29L+QFQ9DL4Lk4zpq88lluJqepc7h4xVZw6EtMIr/lOhVdLBhYWO3bNADcCbDstAEbDAnx0L8qbyE9OmKlA/cP97f2PM9RH46Tq+atIsYel8rCgHrGWdz7KttnjodE2yWQxpfMHMSgjvuXlg08euZTrkfBSP7AgievGd+NDxJTO6x6RH3kXjSadq2QLTHYH03A6n3NF0+/bXcBUx4vsdzRMnva24jBu319yQ7G7cvrVw9tUdqKKzV5xrDj7GlGGXyG7yBS1+Uw9wkv8Dw==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><filter id="dropShadow"><feGaussianBlur in="SourceAlpha" stdDeviation="1.7" result="blur"/><feOffset in="blur" dx="3" dy="3" result="offsetBlur"/><feFlood flood-color="#3D4574" flood-opacity="0.4" result="offsetColor"/><feComposite in="offsetColor" in2="offsetBlur" operator="in" result="offsetBlur"/><feBlend in="SourceGraphic" in2="offsetBlur"/></filter></defs><g filter="url(#dropShadow)"><rect x="3184" y="64" width="480" height="1180" fill-opacity="0.9" fill="#d5e8d4" stroke="#82b366" stroke-opacity="0.9" stroke-width="6" stroke-dasharray="18 18" pointer-events="none"/><rect x="2684" y="64" width="500" height="1180" fill-opacity="0.8" fill="#d5e8d4" stroke="#82b366" stroke-opacity="0.8" stroke-width="6" stroke-dasharray="18 18" pointer-events="none"/><rect x="2164" y="64" width="520" height="1180" fill-opacity="0.7" fill="#d5e8d4" stroke="#82b366" stroke-opacity="0.7" stroke-width="6" stroke-dasharray="18 18" pointer-events="none"/><rect x="1604" y="64" width="560" height="1180" fill-opacity="0.5" fill="#d5e8d4" stroke="#82b366" stroke-opacity="0.5" stroke-width="6" stroke-dasharray="18 18" pointer-events="none"/><path d="M 3360 544 L 3293.57 322.57" fill="none" stroke="#666666" stroke-width="4" stroke-miterlimit="10" stroke-dasharray="12 12" pointer-events="none"/><path d="M 3304.55 331.31 L 3292.29 318.28 L 3289.22 335.91" fill="none" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="3244" y="544" width="280" height="160" rx="24" ry="24" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><path d="M 3104 363 L 3185 363 L 3185 623 L 3247.53 623" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3259.53 623 L 3243.53 631 L 3247.53 623 L 3243.53 615 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3104 883 L 3185 883 L 3185 623 L 3247.53 623" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3259.53 623 L 3243.53 631 L 3247.53 623 L 3243.53 615 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2504 363 L 2585 363 L 2585 603 L 2785 603 L 2785 363 L 2847.53 363" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2859.53 363 L 2843.53 371 L 2847.53 363 L 2843.53 355 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2504 883 L 2585 883 L 2585 643 L 2785 643 L 2785 883 L 2847.53 883" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2859.53 883 L 2843.53 891 L 2847.53 883 L 2843.53 875 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2104 623 L 2205 623 L 2205 363 L 2247.53 363" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2259.53 363 L 2243.53 371 L 2247.53 363 L 2243.53 355 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2104 623 L 2205 623 L 2205 883 L 2247.53 883" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2259.53 883 L 2243.53 891 L 2247.53 883 L 2243.53 875 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 64 64 L 244 64 L 244 94 L 224 124 L 64 124 Z" fill="#dae8fc" stroke="#6c8ebf" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><path d="M 244 64 L 1084 64 L 1084 1244 L 64 1244 L 64 124" fill="none" stroke="#6c8ebf" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><g transform="translate(92.5,79.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="66" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 67px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Browser</div></div></foreignObject><text x="33" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Browser</text></switch></g><path d="M 3664 64 L 3864 64 L 3864 94 L 3844 124 L 3664 124 Z" fill="#f8cecc" stroke="#b85450" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><path d="M 3864 64 L 4144 64 L 4144 1244 L 3664 1244 L 3664 124" fill="none" stroke="#b85450" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><g transform="translate(3691.5,79.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="77" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 78px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Database</div></div></foreignObject><text x="39" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Database</text></switch></g><path d="M 1084 64 L 1244 64 L 1244 94 L 1224 124 L 1084 124 Z" fill="#fff2cc" stroke="#d6b656" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><path d="M 1244 64 L 3664 64 L 3664 1244 L 1084 1244 L 1084 124" fill="none" stroke="#d6b656" stroke-width="6" stroke-miterlimit="10" stroke-dasharray="18 18" pointer-events="none"/><g transform="translate(1115.5,79.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="53" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Server</div></div></foreignObject><text x="27" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Server</text></switch></g><path d="M 2104 624 L 2247.53 624" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2259.53 624 L 2243.53 632 L 2247.53 624 L 2243.53 616 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="1864" y="564" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(1926.5,602.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Router</div></div></foreignObject><text x="27" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Router</text></switch></g><rect x="2264" y="824" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2266.5,841.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Action Handler</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Action Handler</text></switch></g><path d="M 2504 624 L 2847.53 624" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2859.53 624 L 2843.53 632 L 2847.53 624 L 2843.53 616 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="2264" y="564" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2266.5,581.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Action Handler</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Action Handler</text></switch></g><path d="M 3104 624 L 3247.53 624" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3259.53 624 L 3243.53 632 L 3247.53 624 L 3243.53 616 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="2864" y="564" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2895.5,602.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 87px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Repository</div></div></foreignObject><text x="43" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Repository</text></switch></g><path d="M 3504 624 L 3767.53 624" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3779.53 624 L 3763.53 632 L 3767.53 624 L 3763.53 616 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="3264" y="564" width="240" height="120" rx="18" ry="18" fill="#e1d5e7" stroke="#9673a6" stroke-width="2" pointer-events="none"/><g transform="translate(3300.5,602.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PHP PDO</div></div></foreignObject><text x="41" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">PHP PDO</text></switch></g><path d="M 3904 564 L 3904 404" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3904 684 L 3904 844" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="3784" y="564" width="240" height="120" rx="18" ry="18" fill="#f8cecc" stroke="#b85450" stroke-width="2" pointer-events="none"/><g transform="translate(3786.5,581.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Database Host</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Database Host</text></switch></g><path d="M 3784 868 C 3784 836 4024 836 4024 868 L 4024 940 C 4024 972 3784 972 3784 940 Z" fill="#f8cecc" stroke="#b85450" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><path d="M 3784 868 C 3784 892 4024 892 4024 868" fill="none" stroke="#b85450" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(3815.5,899.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 87px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Data Store</div></div></foreignObject><text x="43" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Data Store</text></switch></g><rect x="3784" y="284" width="240" height="120" rx="18" ry="18" fill="#f8cecc" stroke="#b85450" stroke-width="2" pointer-events="none"/><g transform="translate(3786.5,301.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Query Optimiser</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Query Optimiser</text></switch></g><rect x="2264" y="304" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2266.5,321.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Action Handler</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Action Handler</text></switch></g><rect x="2864" y="824" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2895.5,862.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 87px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Repository</div></div></foreignObject><text x="43" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Repository</text></switch></g><rect x="2864" y="304" width="240" height="120" rx="18" ry="18" fill="#fff2cc" stroke="#d6b656" stroke-width="2" pointer-events="none"/><g transform="translate(2895.5,342.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="86" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 87px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Repository</div></div></foreignObject><text x="43" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Repository</text></switch></g><path d="M 3166 214 L 3356 214 L 3386 244 L 3386 314 L 3166 314 L 3166 214 Z" fill="#f5f5f5" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 3356 214 L 3356 244 L 3386 244" fill="none" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(3168.5,223.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="105" height="38" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 105px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Wrapper Class</div></div></foreignObject><text x="53" y="28" fill="#000000" text-anchor="middle" font-size="17px" font-family="Helvetica">Wrapper Class</text></switch></g><rect x="3556" y="598" width="166" height="50" rx="7.5" ry="7.5" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(3564.5,601.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="71" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 72px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Contacts<br /></div></div></foreignObject><text x="36" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Contacts&lt;br&gt;</text></switch></g><rect x="3115" y="600" width="110" height="50" rx="7.5" ry="7.5" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(3131.5,602.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="36" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 37px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">SQL<br /></div></div></foreignObject><text x="18" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">SQL&lt;br&gt;</text></switch></g><rect x="2594" y="579" width="180" height="90" rx="13.5" ry="13.5" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(2605.5,581.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="76" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 77px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><span>Requests</span><br /><span>Data</span></div></div></foreignObject><text x="38" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="2119" y="599" width="110" height="46" rx="6.9" ry="6.9" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(2130.5,600.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="40" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 41px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Calls<br /></div></div></foreignObject><text x="20" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Calls&lt;br&gt;</text></switch></g><path d="M 689 774 L 779 774" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 449 773 L 420 773 L 420 933 L 369 933" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 449 773 L 420 773 L 420 1093 L 369 1093" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="449" y="714" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(512.5,752.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="54" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 55px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Leaflet</div></div></foreignObject><text x="27" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Leaflet</text></switch></g><rect x="129" y="874" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(196.5,912.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="50" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 51px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Plugin</div></div></foreignObject><text x="25" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Plugin</text></switch></g><path d="M 1019 773 L 1045 773 L 1045 643 L 1187.53 643" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1199.53 643 L 1183.53 651 L 1187.53 643 L 1183.53 635 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="779" y="714" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(851.5,752.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="45" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 46px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Layer</div></div></foreignObject><text x="23" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Layer</text></switch></g><path d="M 369 774 L 449 774" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="129" y="714" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(196.5,752.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="50" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 51px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Plugin</div></div></foreignObject><text x="25" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Plugin</text></switch></g><path d="M 569 555 L 569 697.53" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 569 709.53 L 561 693.53 L 569 697.53 L 577 693.53 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 569 435 L 569 291.47" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 569 279.47 L 577 295.47 L 569 291.47 L 561 295.47 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 570 435 L 570 363 L 255 363 L 255 291.47" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 255 279.47 L 263 295.47 L 255 291.47 L 247 295.47 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="449" y="435" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(451.5,451.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="115" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 115px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Client Application</div></div></foreignObject><text x="58" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Client Application</text></switch></g><path d="M 689 213 L 730 213 L 725 213 L 747.53 213" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 759.53 213 L 743.53 221 L 747.53 213 L 743.53 205 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="449" y="155" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(507.5,193.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Module</div></div></foreignObject><text x="30" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Module</text></switch></g><rect x="129" y="1034" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(196.5,1072.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="50" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 51px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Plugin</div></div></foreignObject><text x="25" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Plugin</text></switch></g><path d="M 779 933 L 740 933 L 740 773 L 689 773" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="779" y="874" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(851.5,912.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="45" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 46px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Layer</div></div></foreignObject><text x="23" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Layer</text></switch></g><path d="M 779 1093 L 740 1093 L 740 773 L 689 773" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="779" y="1034" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(851.5,1072.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="45" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 46px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Layer</div></div></foreignObject><text x="23" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Layer</text></switch></g><rect x="134" y="155" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(192.5,193.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Module</div></div></foreignObject><text x="30" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Module</text></switch></g><path d="M 1004 213 L 1045 213 L 1045 603 L 1187.53 603" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1199.53 603 L 1183.53 611 L 1187.53 603 L 1183.53 595 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="764" y="155" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#dae8fc" stroke="#6c8ebf" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(822.5,193.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Module</div></div></foreignObject><text x="30" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Module</text></switch></g><path d="M 250 714 L 250 623 L 557 623 C 557 607.4 581 607.4 581 623 L 581 623 L 1187.53 623" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1199.53 623 L 1183.53 631 L 1187.53 623 L 1183.53 615 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="944" y="563" width="200" height="112" rx="16.8" ry="16.8" fill-opacity="0.9" fill="#d5e8d4" stroke="#82b366" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(965.5,576.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="76" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 77px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">HTTP<br />Requests<br /></div></div></foreignObject><text x="38" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">HTTP&lt;br&gt;Requests&lt;br&gt;</text></switch></g><path d="M 1444 623 L 1847.53 623" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1859.53 623 L 1843.53 631 L 1847.53 623 L 1843.53 615 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1324 563 L 1324 419.47" fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1324 407.47 L 1332 423.47 L 1324 419.47 L 1316 423.47 Z" fill="#000000" stroke="#000000" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><rect x="1204" y="563" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#ffe6cc" stroke="#d79b00" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(1274.5,601.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="46" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 47px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Nginx</div></div></foreignObject><text x="23" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Nginx</text></switch></g><rect x="1204" y="283" width="240" height="120" rx="18" ry="18" fill-opacity="0.9" fill="#ffe6cc" stroke="#d79b00" stroke-opacity="0.9" stroke-width="2" pointer-events="none"/><g transform="translate(1268.5,321.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="52" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 53px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Cache</div></div></foreignObject><text x="26" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Cache</text></switch></g><path d="M 1624 84 L 1814 84 L 1844 114 L 1844 184 L 1624 184 L 1624 84 Z" fill="#f5f5f5" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 1814 84 L 1814 114 L 1844 114" fill="none" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(1625.5,93.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="105" height="38" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 105px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Application Starts Here</div></div></foreignObject><text x="53" y="28" fill="#000000" text-anchor="middle" font-size="17px" font-family="Helvetica">Application Starts Here</text></switch></g><g transform="translate(1771.5,1149.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="112" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 113px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Routing Layer</div></div></foreignObject><text x="56" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Routing Layer</text></switch></g><g transform="translate(2302.5,1149.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="121" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 122px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Handling Layer</div></div></foreignObject><text x="61" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Handling Layer</text></switch></g><g transform="translate(2725.5,1149.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="208" height="19" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 209px; white-space: nowrap; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Storage Abstraction Layer</div></div></foreignObject><text x="104" y="19" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Storage Abstraction Layer</text></switch></g><g transform="translate(3185.5,1148.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="238" height="40" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 18px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 238px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Database Driver Abstraction (PHP)</div></div></foreignObject><text x="119" y="29" fill="#000000" text-anchor="middle" font-size="18px" font-family="Helvetica">Database Driver Abstraction (PHP)</text></switch></g><path d="M 2204 964 L 2594 964 L 2624 994 L 2624 1124 L 2204 1124 L 2204 964 Z" fill="#f5f5f5" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><path d="M 2594 964 L 2594 994 L 2624 994" fill="none" stroke="#666666" stroke-width="4" stroke-miterlimit="10" pointer-events="none"/><g opacity="0.8" transform="translate(2204.5,963.5)scale(2)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="206" height="78" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 206px; white-space: normal; word-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Handlers may call extra view classes (not pictured here) to render content for complex responses</div></div></foreignObject><text x="103" y="48" fill="#000000" text-anchor="middle" font-size="17px" font-family="Helvetica">[Not supported by viewer]</text></switch></g></g></svg>
\ No newline at end of file
diff --git a/logic/Actions/Version.php b/logic/Actions/Version.php
new file mode 100644
index 0000000..d256df5
--- /dev/null
+++ b/logic/Actions/Version.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace AirQuality\Actions;
+
+use \SBRL\TomlConfig;
+
+use \AirQuality\PerfFormatter;
+
+class Version implements IAction {
+	/** @var TomlConfig */
+	private $settings;
+	
+	
+	public function __construct(
+		TomlConfig $in_settings) {
+		$this->settings = $in_settings;
+	}
+	
+	public function handle() : bool {
+		global $start_time;
+		
+		$start_handle = microtime(true);
+		
+		
+		// 1: Parse markdown
+		$result = file_get_contents(ROOT_DIR."version");
+		
+		
+		// 2: Send response
+		header("content-length: " . strlen($result));
+		header("content-type: text/plain");
+		header("x-time-taken: " . PerfFormatter::format_perf_data($start_time, $start_handle, null));
+		echo($result);
+		return true;
+	}
+}
diff --git a/version b/version
index 992ac75..4bc4a91 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-v0.5.1
+v0.5.3
