diff --git a/Tools/autotest/web-firmware/css/main.css b/Tools/autotest/web-firmware/css/main.css
new file mode 100644
index 0000000000..002faef394
--- /dev/null
+++ b/Tools/autotest/web-firmware/css/main.css
@@ -0,0 +1,132 @@
+@charset "utf-8";
+/* CSS Document */
+
+/* Background-Styles */
+html {
+ overflow-y: scroll;
+ }
+
+body {
+ font-family:Helvetica;
+ margin:0px;
+ padding:0px;
+ background-color: #fff;
+ background-image: url(../images/bg.png);
+}
+
+#logo {
+ background-image:url(../images/logo.png);
+ background-repeat:no-repeat;
+ height: 120px;
+ width: 420px;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+ background-color: #000;
+}
+
+h2 {
+ text-shadow: #ccc 0px 1px 0px;
+ text-decoration:none;
+ color:#D14836;
+ padding-top: 0px;
+ padding-right: 5px;
+ padding-bottom: 5px;
+ padding-left: 5px;
+}
+
+#git {
+ background-color: #FFF;
+ font-size: 15px;
+ display: auto;
+ padding: 10px;
+ border: 1px solid #CCC;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+#git a {
+ color:#00F;
+ font-weight: normal;
+ }
+
+#git a:hover {
+ color:#D14836;
+}
+
+.passed-text {
+ color:green;
+}
+
+.failed-text {
+ color:red;
+}
+
+
+#main {
+ padding-top:0px;
+ min-width: 420px;
+ margin-top: 0;
+ margin-right: auto;
+ margin-bottom: 0;
+ margin-left: auto;
+ padding-right: 20px;
+ padding-bottom: 50px;
+ padding-left: 20px;
+}
+
+ul#testresults {
+ background-color: #FFF;
+ display: block;
+ padding: 10px;
+ border: 1px solid #CCC;
+ list-style-type: none;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+ul#testresults li {
+ list-style-type: none;
+ display: block;
+ background-color: #eef1f1;
+ margin: 5px;
+ padding: 5px;
+ }
+
+ul#testlogs {
+ background-color: #FFF;
+ display: block;
+ padding: 10px;
+ border: 1px solid #CCC;
+ list-style-type: none;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+ul#testlogs li {
+ text-decoration:none;
+ list-style-type: none;
+ display: block;
+ background-color: #eef1f1;
+ margin: 5px;
+ padding: 5px;
+ font-size: 15px;
+ }
+
+
+ul#testlogs li a {
+ text-decoration:none;
+ color:#8aa19c;
+ font-weight: bold;
+ font-size: 12px;
+ }
+
+ul#testlogs li a:hover {
+ color:#D14836;
+}
diff --git a/Tools/autotest/web-firmware/images/PX4IO.png b/Tools/autotest/web-firmware/images/PX4IO.png
new file mode 100644
index 0000000000..d2a5ddf09d
Binary files /dev/null and b/Tools/autotest/web-firmware/images/PX4IO.png differ
diff --git a/Tools/autotest/web-firmware/images/bg.png b/Tools/autotest/web-firmware/images/bg.png
new file mode 100644
index 0000000000..a25a40c317
Binary files /dev/null and b/Tools/autotest/web-firmware/images/bg.png differ
diff --git a/Tools/autotest/web-firmware/images/copter.png b/Tools/autotest/web-firmware/images/copter.png
new file mode 100644
index 0000000000..fab0fc0fb2
Binary files /dev/null and b/Tools/autotest/web-firmware/images/copter.png differ
diff --git a/Tools/autotest/web-firmware/images/logo.png b/Tools/autotest/web-firmware/images/logo.png
new file mode 100644
index 0000000000..87a48fa5c7
Binary files /dev/null and b/Tools/autotest/web-firmware/images/logo.png differ
diff --git a/Tools/autotest/web-firmware/images/plane.png b/Tools/autotest/web-firmware/images/plane.png
new file mode 100644
index 0000000000..9870e7beb1
Binary files /dev/null and b/Tools/autotest/web-firmware/images/plane.png differ
diff --git a/Tools/autotest/web-firmware/images/rover.png b/Tools/autotest/web-firmware/images/rover.png
new file mode 100644
index 0000000000..924a326abb
Binary files /dev/null and b/Tools/autotest/web-firmware/images/rover.png differ
diff --git a/Tools/autotest/web-firmware/index.html b/Tools/autotest/web-firmware/index.html
new file mode 100644
index 0000000000..e51d592462
--- /dev/null
+++ b/Tools/autotest/web-firmware/index.html
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
ArduPilot Firmware builds
+
+These firmware builds are automatically generated by the
+
ArduPilot autotest system.
+
+
+
ArduPlane - for fixed wing aircraft
+
+
ArduCopter - for multicopters and
+ traditional helicopters
+
APMrover2 - for land vehicles and boats
+
PX4IO - for the PX4IO board
+
+
Types of firmware available
+
+To choose a firmware to download you need to choose:
+
+
+- The type of board that you have
+- Whether you want the stable, beta or latest version of the
+ firmware
+- Whether you want a HIL (hardware in the loop) image
+
+
+The meanings of the versions are
+
+
+- stable - this is the version recommended for new users. It
+ has had the most testing
+- beta - this is the firmware to choose if you want to be
+ part of beta testing of new versions prior to release as a stable
+ version. Note that during some development times the beta release
+ will be the same as the stable release
+- latest - this is the latest version from our git source
+ code repository. This version is only for developers. The code
+ may have unknown bugs and extreme care should be taken by anyone
+ using it
+
+
+For each vehicle type a firmware image is available for each type of
+autopilot board supported by that vehicle type
+
+How to load your firmware
+
+After downloading a firmware image from one of the links above you will
+need to load it into your board. If you are using
+the APM
+ Mission Planner then you can load a hex file using the
+"Firmware" screen by clicking on the "Load custom firmware" button in
+the bottom right corner of the screen.
+
+Loading firmware to a PX4FMU board
+
+If you have
+a PX4FMU
+board then you can load firmware on Windows using the
+px4uploader.exe utility, which you will find in the "APM Planner"
+installation directory of your Windows machine. When you run that
+utility it will ask you for the location of a px4fmu.px4 file to
+load. It will then wait for your PX4 board to go into bootloader
+mode. The PX4 board enters bootloader mode when it powers on, or when
+the reset switch on the side of the PX4 is pressed. It may take a few
+seconds for Windows to recognise your PX4 board and upload to
+begin.
+
+The PX4 will exit bootloader mode and start the flight firmware 5
+seconds after it boots, so if the firmware load hasn't started within
+5 seconds of booting your PX4 then you should press the PX4 reset
+switch and try again.
+
+
Loading firmware to a PX4IO board
+
+If you have
+a PX4IO board
+attached to your PX4FMU then you will need to separately load the
+latest firmware to that board. To load the PX4IO firmware you need to
+download the px4io.bin file from the above link, then put it in the
+root directory of the microSD card you have in your PX4FMU board.
+
+You then need to hold the arming switch while applying power to your
+PX4FMU board. The PX4IO board detects that the arming switch is held
+when it powers on, and will enter bootloader mode, which is indicated
+by a rapidly flashing red light on your PX4IO board.
+
+The APM firmware for your PX4FMU board will check in the root
+directory of your microSD card every time it boots, and if it finds a
+new px4io.bin file it will attempt to load it to your PX4IO board. A
+log of the firmware load attempt is placed in the APM directory of
+your microSD card to aid with debugging.
+
+
Loading APM1 or APM2 firmware on Linux or MacOS
+
+If you don't use Mission Planner on Linux then you can load firmware
+using the avrdude command. A typical command for uploading a file
+called ArduPlane.hex to an APM2 or APM1-2560 is:
+
+
+avrdude -patmega2560 -cstk500v2 -P /dev/ttyACM0 -b115200 -D -Uflash:w:ArduPlane.hex:i
+
+
+You will need to replace the /dev/ttyACM0 path with the path to your
+APM device. You may wish to use the device paths in /dev/serial/by-id
+so the path doesn't change.
+
+If you have an APM1-1280 then the command would be:
+
+
+avrdude -patmega1280 -cstk500v1 -P /dev/ttyUSB1 -b115200 -D -Uflash:w:ArduPlane.hex:i
+
+
+Loading PX4FMU firmware on Linux or MacOS
+
+To load a PX4FMU firmware on a Linux or MacOS machine you will need to
+use
+the px_uploader.py
+python script. You can run it like this:
+
+
+python px_uploader.py --port /dev/ttyACM0 px4fmu.px4
+
+
+After starting the script, press the reset button on your PX4FMU to
+make it enter bootloader mode.
+
+
+