diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index c74553ee7afcbecc4768b811c89bf54cb758e33d..1e35f1e6df8a0135b3053771e15c32f5cdebc0c4 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -571,6 +571,7 @@ HEADERS += \
     src/qgcunittest/MavlinkLogTest.h \
     src/qgcunittest/MessageBoxTest.h \
     src/qgcunittest/MultiSignalSpy.h \
+    src/qgcunittest/ParameterLoaderTest.h \
     src/qgcunittest/RadioConfigTest.h \
     src/qgcunittest/TCPLinkTest.h \
     src/qgcunittest/TCPLoopBackServer.h \
@@ -596,6 +597,7 @@ SOURCES += \
     src/qgcunittest/MavlinkLogTest.cc \
     src/qgcunittest/MessageBoxTest.cc \
     src/qgcunittest/MultiSignalSpy.cc \
+    src/qgcunittest/ParameterLoaderTest.cc \
     src/qgcunittest/RadioConfigTest.cc \
     src/qgcunittest/TCPLinkTest.cc \
     src/qgcunittest/TCPLoopBackServer.cc \
diff --git a/src/qgcunittest/ParameterLoaderTest.cc b/src/qgcunittest/ParameterLoaderTest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0089f410c31c5e66530db0bcc0c1f8f95a0f179f
--- /dev/null
+++ b/src/qgcunittest/ParameterLoaderTest.cc
@@ -0,0 +1,137 @@
+/****************************************************************************
+ *
+ *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+
+#include "ParameterLoaderTest.h"
+#include "MultiVehicleManager.h"
+#include "QGCApplication.h"
+#include "ParameterLoader.h"
+
+/// Test failure modes which should still lead to param load success
+void ParameterLoaderTest::_noFailureWorker(MockConfiguration::FailureMode_t failureMode)
+{
+    Q_ASSERT(!_mockLink);
+    _mockLink = MockLink::startPX4MockLink(false, failureMode);
+
+    MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager();
+    QVERIFY(vehicleMgr);
+
+    // Wait for the Vehicle to get created
+    QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool)));
+    QCOMPARE(spyVehicle.wait(5000), true);
+    QCOMPARE(spyVehicle.count(), 1);
+    QList<QVariant> arguments = spyVehicle.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QCOMPARE(arguments.at(0).toBool(), true);
+
+    Vehicle* vehicle = vehicleMgr->activeVehicle();
+    QVERIFY(vehicle);
+
+    // We should get progress bar updates during load
+    QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float)));
+    QCOMPARE(spyProgress.wait(2000), true);
+    arguments = spyProgress.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QVERIFY(arguments.at(0).toFloat() > 0.0f);
+
+    // When param load is complete we get the param ready signal
+    QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool)));
+    QCOMPARE(spyParamsReady.wait(60000), true);
+    arguments = spyParamsReady.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QCOMPARE(arguments.at(0).toBool(), true);
+
+    // Progress should have been set back to 0
+    arguments = spyProgress.takeLast();
+    QCOMPARE(arguments.count(), 1);
+    QCOMPARE(arguments.at(0).toFloat(), 0.0f);
+}
+
+
+void ParameterLoaderTest::_noFailure(void)
+{
+    _noFailureWorker(MockConfiguration::FailNone);
+}
+
+void ParameterLoaderTest::_requestListMissingParamSuccess(void)
+{
+    _noFailureWorker(MockConfiguration::FailMissingParamOnInitialReqest);
+}
+
+// Test no response to param_request_list
+void ParameterLoaderTest::_requestListNoResponse(void)
+{
+    Q_ASSERT(!_mockLink);
+    _mockLink = MockLink::startPX4MockLink(false, MockConfiguration::FailParamNoReponseToRequestList);
+
+    MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager();
+    QVERIFY(vehicleMgr);
+
+    // Wait for the Vehicle to get created
+    QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool)));
+    QCOMPARE(spyVehicle.wait(5000), true);
+    QCOMPARE(spyVehicle.count(), 1);
+    QList<QVariant> arguments = spyVehicle.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QCOMPARE(arguments.at(0).toBool(), true);
+
+    Vehicle* vehicle = vehicleMgr->activeVehicle();
+    QVERIFY(vehicle);
+
+    QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool)));
+    QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float)));
+
+    // We should not get any progress bar updates, nor a parameter ready signal
+    QCOMPARE(spyProgress.wait(500), false);
+    QCOMPARE(spyParamsReady.wait(40000), false);
+
+    // User should have been notified
+    checkMultipleExpectedMessageBox(5);
+}
+
+// MockLink will fail to send a param on initial request, it will also fail to send it on subsequent
+// param_read requests.
+void ParameterLoaderTest::_requestListMissingParamFail(void)
+{
+    // Will pop error about missing params
+    setExpectedMessageBox(QMessageBox::Ok);
+
+    Q_ASSERT(!_mockLink);
+    _mockLink = MockLink::startPX4MockLink(false, MockConfiguration::FailMissingParamOnAllRequests);
+
+    MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager();
+    QVERIFY(vehicleMgr);
+
+    // Wait for the Vehicle to get created
+    QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool)));
+    QCOMPARE(spyVehicle.wait(5000), true);
+    QCOMPARE(spyVehicle.count(), 1);
+    QList<QVariant> arguments = spyVehicle.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QCOMPARE(arguments.at(0).toBool(), true);
+
+    Vehicle* vehicle = vehicleMgr->activeVehicle();
+    QVERIFY(vehicle);
+
+    QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool)));
+    QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float)));
+
+    // We will get progress bar updates, since it will fail after getting partially through the request
+    QCOMPARE(spyProgress.wait(2000), true);
+    arguments = spyProgress.takeFirst();
+    QCOMPARE(arguments.count(), 1);
+    QVERIFY(arguments.at(0).toFloat() > 0.0f);
+
+    // We should get a parameters ready signal, but Vehicle should indicate missing params
+    QCOMPARE(spyParamsReady.wait(40000), true);
+    QCOMPARE(vehicle->missingParameters(), true);
+
+    // User should have been notified
+    checkExpectedMessageBox();
+}
diff --git a/src/qgcunittest/ParameterLoaderTest.h b/src/qgcunittest/ParameterLoaderTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..2b251bd430047c5e7107c7d19f5abb614f03a848
--- /dev/null
+++ b/src/qgcunittest/ParameterLoaderTest.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+ *
+ *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+
+#ifndef ParameterLoaderTest_H
+#define ParameterLoaderTest_H
+
+#include "UnitTest.h"
+#include "MockLink.h"
+#include "MultiSignalSpy.h"
+#include "MockLink.h"
+
+class ParameterLoaderTest : public UnitTest
+{
+    Q_OBJECT
+    
+private slots:
+    void _noFailure(void);
+    void _requestListNoResponse(void);
+    void _requestListMissingParamSuccess(void);
+    void _requestListMissingParamFail(void);
+
+private:
+    void _noFailureWorker(MockConfiguration::FailureMode_t failureMode);
+};
+
+#endif
diff --git a/src/qgcunittest/UnitTestList.cc b/src/qgcunittest/UnitTestList.cc
index 7b1a1b461d0d4af33dc92891d126d1a04068b4dc..c8355a40e0a4c5ca64c35d392f62d7f78383db57 100644
--- a/src/qgcunittest/UnitTestList.cc
+++ b/src/qgcunittest/UnitTestList.cc
@@ -29,6 +29,7 @@
 #include "MainWindowTest.h"
 #include "FileManagerTest.h"
 #include "TCPLinkTest.h"
+#include "ParameterLoaderTest.h"
 
 UT_REGISTER_TEST(FactSystemTestGeneric)
 UT_REGISTER_TEST(FactSystemTestPX4)
@@ -46,6 +47,7 @@ UT_REGISTER_TEST(MissionManagerTest)
 UT_REGISTER_TEST(RadioConfigTest)
 UT_REGISTER_TEST(TCPLinkTest)
 UT_REGISTER_TEST(FileManagerTest)
+UT_REGISTER_TEST(ParameterLoaderTest)
 
 // List of unit test which are currently disabled.
 // If disabling a new test, include reason in comment.