diff --git a/src/drivers/vmount/CMakeLists.txt b/src/drivers/vmount/CMakeLists.txt
index 058ca9e5ddf5aadaf2404d40f156123c57bd8b2d..f720fd6c5426c09b185780281338643e1adfd26e 100644
--- a/src/drivers/vmount/CMakeLists.txt
+++ b/src/drivers/vmount/CMakeLists.txt
@@ -34,8 +34,6 @@ px4_add_module(
 	MODULE drivers__vmount
 	MAIN vmount
 	STACK_MAIN 1024
-	COMPILE_FLAGS
-		-Os
 	SRCS
 		input.cpp
 		input_mavlink.cpp
diff --git a/src/drivers/vmount/common.h b/src/drivers/vmount/common.h
index 77401ed6f5fc925232bedc0e827486d9ff365e76..77d307ee67f9668a766d6ad6729ae4219ea89c80 100644
--- a/src/drivers/vmount/common.h
+++ b/src/drivers/vmount/common.h
@@ -80,7 +80,8 @@ struct ControlData {
 	} type_data;
 
 
-	bool stabilize_axis[3] = { false, false, false }; /**< whether the vmount driver should stabilize an axis */
+	bool stabilize_axis[3] = { false, false, false }; /**< whether the vmount driver should stabilize an axis
+	 	 	 	 	 	 	 	 	 	 (if the output supports it, this can also be done externally) */
 
 	bool gimbal_shutter_retract = false; /**< whether to lock the gimbal (only in RC output mode) */
 
diff --git a/src/drivers/vmount/input_rc.h b/src/drivers/vmount/input_rc.h
index 845bd81faece63a032257ee1306aa03d0517389c..178768e3b6b63207ac20f19fd4d52b18220c4dc9 100644
--- a/src/drivers/vmount/input_rc.h
+++ b/src/drivers/vmount/input_rc.h
@@ -64,19 +64,18 @@ public:
 	InputRC(int aux_channel_roll, int aux_channel_pitch, int aux_channel_yaw);
 	virtual ~InputRC();
 
+	virtual void print_status();
 
 protected:
 	virtual int update_impl(unsigned int timeout_ms, ControlData **control_data);
 	virtual int initialize();
 
-	virtual void print_status();
-
-private:
-	float _get_aux_value(const manual_control_setpoint_s &manual_control_setpoint, int channel_idx);
+	virtual void _read_control_data_from_subscription(ControlData &control_data);
 
 	int _get_subscription_fd() const { return _manual_control_setpoint_sub; }
 
-	void _read_control_data_from_subscription(ControlData &control_data);
+private:
+	float _get_aux_value(const manual_control_setpoint_s &manual_control_setpoint, int channel_idx);
 
 	int _aux_channels[3];
 	int _manual_control_setpoint_sub = -1;
diff --git a/src/drivers/vmount/output.h b/src/drivers/vmount/output.h
index 9bcaa30c155c89e17e15bc19eb5ffb03c22c8b3c..256bc1efcde821a48c6ea24dfd51f261b1de6799 100644
--- a/src/drivers/vmount/output.h
+++ b/src/drivers/vmount/output.h
@@ -101,6 +101,8 @@ protected:
 	float _angle_outputs[3] = { 0.f, 0.f, 0.f };
 	hrt_abstime _last_update;
 
+	int _get_vehicle_attitude_sub() const { return _vehicle_attitude_sub; }
+
 private:
 	int _vehicle_attitude_sub = -1;
 	int _vehicle_global_position_sub = -1;
diff --git a/src/drivers/vmount/vmount.cpp b/src/drivers/vmount/vmount.cpp
index ede648fd721a98fba24e822a4b07696020ee50dd..4dd36fb25be4a5d58974a7368a7ce6fe9daa9c6a 100644
--- a/src/drivers/vmount/vmount.cpp
+++ b/src/drivers/vmount/vmount.cpp
@@ -67,7 +67,11 @@ using namespace vmount;
 /* thread state */
 static volatile bool thread_should_exit = false;
 static volatile bool thread_running = false;
-static volatile bool thread_do_report_status = false;
+struct ThreadData {
+	InputBase *input_obj = nullptr;
+	OutputBase *output_obj = nullptr;
+};
+static volatile ThreadData *g_thread_data = nullptr;
 
 struct Parameters {
 	int mnt_mode_in;
@@ -128,11 +132,24 @@ static int vmount_thread_main(int argc, char *argv[])
 {
 	ParameterHandles param_handles;
 	Parameters params;
+	OutputConfig output_config;
+	ThreadData thread_data;
 	memset(&params, 0, sizeof(params));
 
 
 	InputTest *test_input = nullptr;
 
+#ifdef __PX4_NUTTX
+	/* the NuttX optarg handler does not
+	 * ignore argv[0] like the POSIX handler
+	 * does, nor does it deal with non-flag
+	 * verbs well. So we Remove the application
+	 * name and the verb.
+	 */
+	argc -= 1;
+	argv += 1;
+#endif
+
 	if (argc > 0 && !strcmp(argv[0], "test")) {
 		PX4_INFO("Starting in test mode");
 
@@ -175,15 +192,13 @@ static int vmount_thread_main(int argc, char *argv[])
 
 	int parameter_update_sub = orb_subscribe(ORB_ID(parameter_update));
 	thread_running = true;
-	OutputConfig output_config;
 	ControlData *control_data = nullptr;
-	InputBase *input_obj = nullptr;
-	OutputBase *output_obj = nullptr;
 	InputRC *manual_input = nullptr;
+	g_thread_data = &thread_data;
 
 	while (!thread_should_exit) {
 
-		if (!input_obj && params.mnt_mode_in != 0) { //need to initialize
+		if (!thread_data.input_obj && params.mnt_mode_in != 0) { //need to initialize
 
 			output_config.gimbal_normal_mode_value = params.mnt_ob_norm_mode;
 			output_config.gimbal_retracted_mode_value = params.mnt_ob_lock_mode;
@@ -191,7 +206,7 @@ static int vmount_thread_main(int argc, char *argv[])
 			output_config.mavlink_comp_id = params.mnt_mav_compid;
 
 			if (test_input) {
-				input_obj = test_input;
+				thread_data.input_obj = test_input;
 
 			} else {
 				if (params.mnt_man_control) {
@@ -206,21 +221,21 @@ static int vmount_thread_main(int argc, char *argv[])
 				switch (params.mnt_mode_in) {
 				case 1: //RC
 					if (manual_input) {
-						input_obj = manual_input;
+						thread_data.input_obj = manual_input;
 						manual_input = nullptr;
 
 					} else {
-						input_obj = new InputRC(params.mnt_man_roll, params.mnt_man_pitch, params.mnt_man_yaw);
+						thread_data.input_obj = new InputRC(params.mnt_man_roll, params.mnt_man_pitch, params.mnt_man_yaw);
 					}
 
 					break;
 
 				case 2: //MAVLINK_ROI
-					input_obj = new InputMavlinkROI(manual_input);
+					thread_data.input_obj = new InputMavlinkROI(manual_input);
 					break;
 
 				case 3: //MAVLINK_DO_MOUNT
-					input_obj = new InputMavlinkCmdMount(manual_input);
+					thread_data.input_obj = new InputMavlinkCmdMount(manual_input);
 					break;
 
 				default:
@@ -231,11 +246,11 @@ static int vmount_thread_main(int argc, char *argv[])
 
 			switch (params.mnt_mode_out) {
 			case 0: //AUX
-				output_obj = new OutputRC(output_config);
+				thread_data.output_obj = new OutputRC(output_config);
 				break;
 
 			case 1: //MAVLINK
-				output_obj = new OutputMavlink(output_config);
+				thread_data.output_obj = new OutputMavlink(output_config);
 				break;
 
 			default:
@@ -243,13 +258,13 @@ static int vmount_thread_main(int argc, char *argv[])
 				break;
 			}
 
-			if (!input_obj || !output_obj) {
+			if (!thread_data.input_obj || !thread_data.output_obj) {
 				PX4_ERR("memory allocation failed");
 				thread_should_exit = true;
 				break;
 			}
 
-			int ret = output_obj->initialize();
+			int ret = thread_data.output_obj->initialize();
 
 			if (ret) {
 				PX4_ERR("failed to initialize output mode (%i)", ret);
@@ -262,7 +277,7 @@ static int vmount_thread_main(int argc, char *argv[])
 
 			//get input: we cannot make the timeout too large, because the output needs to update
 			//periodically for stabilization and angle updates.
-			int ret = input_obj->update(50, &control_data);
+			int ret = thread_data.input_obj->update(50, &control_data);
 
 			if (ret) {
 				PX4_ERR("failed to read input (%i)", ret);
@@ -270,7 +285,7 @@ static int vmount_thread_main(int argc, char *argv[])
 			}
 
 			//update output
-			ret = output_obj->update(control_data);
+			ret = thread_data.output_obj->update(control_data);
 
 			if (ret) {
 				PX4_ERR("failed to write output (%i)", ret);
@@ -298,14 +313,14 @@ static int vmount_thread_main(int argc, char *argv[])
 
 			if (updated) {
 				//re-init objects
-				if (input_obj) {
-					delete(input_obj);
-					input_obj = nullptr;
+				if (thread_data.input_obj) {
+					delete(thread_data.input_obj);
+					thread_data.input_obj = nullptr;
 				}
 
-				if (output_obj) {
-					delete(output_obj);
-					output_obj = nullptr;
+				if (thread_data.output_obj) {
+					delete(thread_data.output_obj);
+					thread_data.output_obj = nullptr;
 				}
 
 				if (manual_input) {
@@ -314,38 +329,25 @@ static int vmount_thread_main(int argc, char *argv[])
 				}
 			}
 		}
-
-		if (thread_do_report_status) {
-			if (input_obj) {
-				input_obj->print_status();
-
-			} else {
-				PX4_INFO("Input: None");
-			}
-
-			if (output_obj) {
-				output_obj->print_status();
-
-			} else {
-				PX4_INFO("Output: None");
-			}
-
-			thread_do_report_status = false;
-		}
 	}
 
+	g_thread_data = nullptr;
+
 	orb_unsubscribe(parameter_update_sub);
 
-	if (input_obj) {
-		delete(input_obj);
+	if (thread_data.input_obj) {
+		delete(thread_data.input_obj);
+		thread_data.input_obj = nullptr;
 	}
 
-	if (output_obj) {
-		delete(output_obj);
+	if (thread_data.output_obj) {
+		delete(thread_data.output_obj);
+		thread_data.output_obj = nullptr;
 	}
 
 	if (manual_input) {
 		delete(manual_input);
+		manual_input = nullptr;
 	}
 
 	thread_running = false;
@@ -376,7 +378,7 @@ int vmount_main(int argc, char *argv[])
 		int vmount_task = px4_task_spawn_cmd("vmount",
 						     SCHED_DEFAULT,
 						     SCHED_PRIORITY_DEFAULT + 40,
-						     1200,
+						     1500,
 						     vmount_thread_main,
 						     (char *const *)argv + 1);
 
@@ -390,6 +392,11 @@ int vmount_main(int argc, char *argv[])
 			}
 		}
 
+		if (vmount_task < 0) {
+			PX4_ERR("failed to start");
+			return -1;
+		}
+
 		return counter < 100 || thread_should_exit ? 0 : -1;
 	}
 
@@ -411,11 +418,20 @@ int vmount_main(int argc, char *argv[])
 	}
 
 	if (!strcmp(argv[1], "status")) {
-		if (thread_running) {
-			thread_do_report_status = true;
+		if (thread_running && g_thread_data) {
 
-			while (thread_do_report_status) {
-				usleep(10000);
+			if (g_thread_data->input_obj) {
+				g_thread_data->input_obj->print_status();
+
+			} else {
+				PX4_INFO("Input: None");
+			}
+
+			if (g_thread_data->output_obj) {
+				g_thread_data->output_obj->print_status();
+
+			} else {
+				PX4_INFO("Output: None");
 			}
 
 		} else {