diff --git a/src/modules/simulator/simulator.h b/src/modules/simulator/simulator.h
index 53f500910a3a6e1d43332ac3dc5a9c4e6ee45d96..4aae03b0f6ed2b784538f576550def25f4772d47 100644
--- a/src/modules/simulator/simulator.h
+++ b/src/modules/simulator/simulator.h
@@ -332,6 +332,7 @@ private:
 
 	void handle_message(mavlink_message_t *msg, bool publish);
 	void handle_message_distance_sensor(const mavlink_message_t *msg);
+	void handle_message_hil_state_quaternion(const mavlink_message_t *msg);
 	void handle_message_landing_target(const mavlink_message_t *msg);
 	void handle_message_optical_flow(const mavlink_message_t *msg);
 
diff --git a/src/modules/simulator/simulator_mavlink.cpp b/src/modules/simulator/simulator_mavlink.cpp
index 6801da32f768c2a9f22efea84d02e4be2d749394..99acf86e7c8196cf9e2b512a1c7a0845ee02eae4 100644
--- a/src/modules/simulator/simulator_mavlink.cpp
+++ b/src/modules/simulator/simulator_mavlink.cpp
@@ -399,107 +399,111 @@ void Simulator::handle_message(mavlink_message_t *msg, bool publish)
 		}
 
 	case MAVLINK_MSG_ID_HIL_STATE_QUATERNION:
-		mavlink_hil_state_quaternion_t hil_state;
-		mavlink_msg_hil_state_quaternion_decode(msg, &hil_state);
+		handle_message_hil_state_quaternion(msg);
+		break;
+	}
 
-		uint64_t timestamp = hrt_absolute_time();
+}
 
-		/* attitude */
-		struct vehicle_attitude_s hil_attitude = {};
-		{
-			hil_attitude.timestamp = timestamp;
+void Simulator::handle_message_distance_sensor(const mavlink_message_t *msg)
+{
+	mavlink_distance_sensor_t dist;
+	mavlink_msg_distance_sensor_decode(msg, &dist);
+	publish_distance_topic(&dist);
+}
 
-			matrix::Quatf q(hil_state.attitude_quaternion);
-			q.copyTo(hil_attitude.q);
+void Simulator::handle_message_hil_state_quaternion(const mavlink_message_t *msg)
+{
+	mavlink_hil_state_quaternion_t hil_state;
+	mavlink_msg_hil_state_quaternion_decode(msg, &hil_state);
 
-			hil_attitude.rollspeed = hil_state.rollspeed;
-			hil_attitude.pitchspeed = hil_state.pitchspeed;
-			hil_attitude.yawspeed = hil_state.yawspeed;
+	uint64_t timestamp = hrt_absolute_time();
 
-			// always publish ground truth attitude message
-			int hilstate_multi;
-			orb_publish_auto(ORB_ID(vehicle_attitude_groundtruth), &_attitude_pub, &hil_attitude, &hilstate_multi, ORB_PRIO_HIGH);
-		}
+	/* attitude */
+	struct vehicle_attitude_s hil_attitude = {};
+	{
+		hil_attitude.timestamp = timestamp;
 
-		/* global position */
-		struct vehicle_global_position_s hil_gpos = {};
-		{
-			hil_gpos.timestamp = timestamp;
+		matrix::Quatf q(hil_state.attitude_quaternion);
+		q.copyTo(hil_attitude.q);
 
-			hil_gpos.lat = hil_state.lat / 1E7;//1E7
-			hil_gpos.lon = hil_state.lon / 1E7;//1E7
-			hil_gpos.alt = hil_state.alt / 1E3;//1E3
+		hil_attitude.rollspeed = hil_state.rollspeed;
+		hil_attitude.pitchspeed = hil_state.pitchspeed;
+		hil_attitude.yawspeed = hil_state.yawspeed;
 
-			hil_gpos.vel_n = hil_state.vx / 100.0f;
-			hil_gpos.vel_e = hil_state.vy / 100.0f;
-			hil_gpos.vel_d = hil_state.vz / 100.0f;
+		// always publish ground truth attitude message
+		int hilstate_multi;
+		orb_publish_auto(ORB_ID(vehicle_attitude_groundtruth), &_attitude_pub, &hil_attitude, &hilstate_multi, ORB_PRIO_HIGH);
+	}
 
-			// always publish ground truth attitude message
-			int hil_gpos_multi;
-			orb_publish_auto(ORB_ID(vehicle_global_position_groundtruth), &_gpos_pub, &hil_gpos, &hil_gpos_multi,
-					 ORB_PRIO_HIGH);
-		}
+	/* global position */
+	struct vehicle_global_position_s hil_gpos = {};
+	{
+		hil_gpos.timestamp = timestamp;
 
-		/* local position */
-		struct vehicle_local_position_s hil_lpos = {};
-		{
-			hil_lpos.timestamp = timestamp;
-
-			double lat = hil_state.lat * 1e-7;
-			double lon = hil_state.lon * 1e-7;
-
-			if (!_hil_local_proj_inited) {
-				_hil_local_proj_inited = true;
-				map_projection_init(&_hil_local_proj_ref, lat, lon);
-				_hil_ref_timestamp = timestamp;
-				_hil_ref_lat = lat;
-				_hil_ref_lon = lon;
-				_hil_ref_alt = hil_state.alt / 1000.0f;
-			}
+		hil_gpos.lat = hil_state.lat / 1E7;//1E7
+		hil_gpos.lon = hil_state.lon / 1E7;//1E7
+		hil_gpos.alt = hil_state.alt / 1E3;//1E3
 
-			float x;
-			float y;
-			map_projection_project(&_hil_local_proj_ref, lat, lon, &x, &y);
-			hil_lpos.timestamp = timestamp;
-			hil_lpos.xy_valid = true;
-			hil_lpos.z_valid = true;
-			hil_lpos.v_xy_valid = true;
-			hil_lpos.v_z_valid = true;
-			hil_lpos.x = x;
-			hil_lpos.y = y;
-			hil_lpos.z = _hil_ref_alt - hil_state.alt / 1000.0f;
-			hil_lpos.vx = hil_state.vx / 100.0f;
-			hil_lpos.vy = hil_state.vy / 100.0f;
-			hil_lpos.vz = hil_state.vz / 100.0f;
-			matrix::Eulerf euler = matrix::Quatf(hil_attitude.q);
-			hil_lpos.yaw = euler.psi();
-			hil_lpos.xy_global = true;
-			hil_lpos.z_global = true;
-			hil_lpos.ref_lat = _hil_ref_lat;
-			hil_lpos.ref_lon = _hil_ref_lon;
-			hil_lpos.ref_alt = _hil_ref_alt;
-			hil_lpos.ref_timestamp = _hil_ref_timestamp;
-			hil_lpos.vxy_max = std::numeric_limits<float>::infinity();
-			hil_lpos.vz_max = std::numeric_limits<float>::infinity();
-			hil_lpos.hagl_min = std::numeric_limits<float>::infinity();
-			hil_lpos.hagl_max = std::numeric_limits<float>::infinity();
-
-			// always publish ground truth attitude message
-			int hil_lpos_multi;
-			orb_publish_auto(ORB_ID(vehicle_local_position_groundtruth), &_lpos_pub, &hil_lpos, &hil_lpos_multi,
-					 ORB_PRIO_HIGH);
-		}
+		hil_gpos.vel_n = hil_state.vx / 100.0f;
+		hil_gpos.vel_e = hil_state.vy / 100.0f;
+		hil_gpos.vel_d = hil_state.vz / 100.0f;
 
-		break;
+		// always publish ground truth attitude message
+		int hil_gpos_multi;
+		orb_publish_auto(ORB_ID(vehicle_global_position_groundtruth), &_gpos_pub, &hil_gpos, &hil_gpos_multi,
+				 ORB_PRIO_HIGH);
 	}
 
-}
+	/* local position */
+	struct vehicle_local_position_s hil_lpos = {};
+	{
+		hil_lpos.timestamp = timestamp;
+
+		double lat = hil_state.lat * 1e-7;
+		double lon = hil_state.lon * 1e-7;
+
+		if (!_hil_local_proj_inited) {
+			_hil_local_proj_inited = true;
+			map_projection_init(&_hil_local_proj_ref, lat, lon);
+			_hil_ref_timestamp = timestamp;
+			_hil_ref_lat = lat;
+			_hil_ref_lon = lon;
+			_hil_ref_alt = hil_state.alt / 1000.0f;
+		}
 
-void Simulator::handle_message_distance_sensor(const mavlink_message_t *msg)
-{
-	mavlink_distance_sensor_t dist;
-	mavlink_msg_distance_sensor_decode(msg, &dist);
-	publish_distance_topic(&dist);
+		float x;
+		float y;
+		map_projection_project(&_hil_local_proj_ref, lat, lon, &x, &y);
+		hil_lpos.timestamp = timestamp;
+		hil_lpos.xy_valid = true;
+		hil_lpos.z_valid = true;
+		hil_lpos.v_xy_valid = true;
+		hil_lpos.v_z_valid = true;
+		hil_lpos.x = x;
+		hil_lpos.y = y;
+		hil_lpos.z = _hil_ref_alt - hil_state.alt / 1000.0f;
+		hil_lpos.vx = hil_state.vx / 100.0f;
+		hil_lpos.vy = hil_state.vy / 100.0f;
+		hil_lpos.vz = hil_state.vz / 100.0f;
+		matrix::Eulerf euler = matrix::Quatf(hil_attitude.q);
+		hil_lpos.yaw = euler.psi();
+		hil_lpos.xy_global = true;
+		hil_lpos.z_global = true;
+		hil_lpos.ref_lat = _hil_ref_lat;
+		hil_lpos.ref_lon = _hil_ref_lon;
+		hil_lpos.ref_alt = _hil_ref_alt;
+		hil_lpos.ref_timestamp = _hil_ref_timestamp;
+		hil_lpos.vxy_max = std::numeric_limits<float>::infinity();
+		hil_lpos.vz_max = std::numeric_limits<float>::infinity();
+		hil_lpos.hagl_min = std::numeric_limits<float>::infinity();
+		hil_lpos.hagl_max = std::numeric_limits<float>::infinity();
+
+		// always publish ground truth attitude message
+		int hil_lpos_multi;
+		orb_publish_auto(ORB_ID(vehicle_local_position_groundtruth), &_lpos_pub, &hil_lpos, &hil_lpos_multi,
+				 ORB_PRIO_HIGH);
+	}
 }
 
 void Simulator::handle_message_landing_target(const mavlink_message_t *msg)