diff --git a/src/modules/commander/Commander.cpp b/src/modules/commander/Commander.cpp
index 0ea25af2431c87d3213f491f0d45f6e5b174bdf7..904b83efa60bf7d3ba37dd38092553afe40e4584 100644
--- a/src/modules/commander/Commander.cpp
+++ b/src/modules/commander/Commander.cpp
@@ -560,9 +560,9 @@ Commander::Commander() :
 	_auto_disarm_killed.set_hysteresis_time_from(false, 5_s);
 	_battery_sub = orb_subscribe(ORB_ID(battery_status));
 
-	for (int i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) {
-		_telemetry_status_sub[i] = -1;
-	}
+
+	_telemetry_status_sub = orb_subscribe(ORB_ID(telemetry_status));
+
 
 	// We want to accept RC inputs as default
 	status.rc_input_mode = vehicle_status_s::RC_IN_MODE_DEFAULT;
@@ -585,12 +585,8 @@ Commander::Commander() :
 Commander::~Commander()
 {
 	orb_unsubscribe(_battery_sub);
+	orb_unsubscribe(_telemetry_status_sub);
 
-	for (int i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) {
-		if (_telemetry_status_sub[i] >= 0) {
-			orb_unsubscribe(_telemetry_status_sub[i]);
-		}
-	}
 
 	if (_iridiumsbd_status_sub >= 0) {
 		orb_unsubscribe(_iridiumsbd_status_sub);
@@ -3831,112 +3827,105 @@ bool Commander::preflight_check(bool report)
 
 void Commander::data_link_check(bool &status_changed)
 {
-	for (int i = 0; i < ORB_MULTI_MAX_INSTANCES; i++) {
+	bool updated = false;
 
-		if (_telemetry_status_sub[i] < 0) {
-			if (orb_exists(ORB_ID(telemetry_status), i) == PX4_OK) {
-				_telemetry_status_sub[i] = orb_subscribe_multi(ORB_ID(telemetry_status), i);
-			}
-		}
+	orb_check(_telemetry_status_sub, &updated);
 
-		bool updated = false;
+	if (updated) {
 
-		orb_check(_telemetry_status_sub[i], &updated);
+		telemetry_status_s telemetry;
 
-		if (updated) {
-			telemetry_status_s telemetry;
+		if (orb_copy(ORB_ID(telemetry_status), _telemetry_status_sub, &telemetry) == PX4_OK) {
 
-			if (orb_copy(ORB_ID(telemetry_status), _telemetry_status_sub[i], &telemetry) == PX4_OK) {
-
-				// handle different radio types
-				switch (telemetry.type) {
-				case telemetry_status_s::LINK_TYPE_USB:
-					// set (but don't unset) telemetry via USB as active once a MAVLink connection is up
-					status_flags.usb_connected = true;
-					break;
+			// handle different radio types
+			switch (telemetry.type) {
+			case telemetry_status_s::LINK_TYPE_USB:
+				// set (but don't unset) telemetry via USB as active once a MAVLink connection is up
+				status_flags.usb_connected = true;
+				break;
 
-				case telemetry_status_s::LINK_TYPE_IRIDIUM:
+			case telemetry_status_s::LINK_TYPE_IRIDIUM:
 
-					// lazily subscribe
-					if (_iridiumsbd_status_sub == -1 && orb_exists(ORB_ID(iridiumsbd_status), 0) == PX4_OK) {
-						_iridiumsbd_status_sub = orb_subscribe(ORB_ID(iridiumsbd_status));
-					}
+				// lazily subscribe
+				if (_iridiumsbd_status_sub == -1 && orb_exists(ORB_ID(iridiumsbd_status), 0) == PX4_OK) {
+					_iridiumsbd_status_sub = orb_subscribe(ORB_ID(iridiumsbd_status));
+				}
 
-					if (_iridiumsbd_status_sub >= 0) {
-						bool iridiumsbd_updated = false;
-						orb_check(_iridiumsbd_status_sub, &iridiumsbd_updated);
+				if (_iridiumsbd_status_sub >= 0) {
+					bool iridiumsbd_updated = false;
+					orb_check(_iridiumsbd_status_sub, &iridiumsbd_updated);
 
-						if (iridiumsbd_updated) {
-							iridiumsbd_status_s iridium_status;
+					if (iridiumsbd_updated) {
+						iridiumsbd_status_s iridium_status;
 
-							if (orb_copy(ORB_ID(iridiumsbd_status), _iridiumsbd_status_sub, &iridium_status) == PX4_OK) {
-								_high_latency_datalink_heartbeat = iridium_status.last_heartbeat;
+						if (orb_copy(ORB_ID(iridiumsbd_status), _iridiumsbd_status_sub, &iridium_status) == PX4_OK) {
+							_high_latency_datalink_heartbeat = iridium_status.last_heartbeat;
 
-								if (status.high_latency_data_link_lost) {
-									if (hrt_elapsed_time(&_high_latency_datalink_lost) > (_high_latency_datalink_regain_threshold.get() * 1_s)) {
-										status.high_latency_data_link_lost = false;
-										status_changed = true;
-									}
+							if (status.high_latency_data_link_lost) {
+								if (hrt_elapsed_time(&_high_latency_datalink_lost) > (_high_latency_datalink_regain_threshold.get() * 1_s)) {
+									status.high_latency_data_link_lost = false;
+									status_changed = true;
 								}
-
 							}
+
 						}
 					}
-
-					break;
 				}
 
+				break;
+			}
 
-				// handle different remote types
-				switch (telemetry.remote_type) {
-				case telemetry_status_s::MAV_TYPE_GCS:
 
-					// Recover from data link lost
-					if (status.data_link_lost) {
-						if (telemetry.heartbeat_time > _datalink_last_heartbeat_gcs) {
-							status.data_link_lost = false;
-							status_changed = true;
-							mavlink_log_info(&mavlink_log_pub, "Data link regained");
-						}
+			// handle different remote types
+			switch (telemetry.remote_type) {
+			case telemetry_status_s::MAV_TYPE_GCS:
+
+				// Recover from data link lost
+				if (status.data_link_lost) {
+					if (telemetry.heartbeat_time > _datalink_last_heartbeat_gcs) {
+						status.data_link_lost = false;
+						status_changed = true;
+						mavlink_log_info(&mavlink_log_pub, "Data link regained");
 					}
+				}
 
-					_datalink_last_heartbeat_gcs = telemetry.heartbeat_time;
+				_datalink_last_heartbeat_gcs = telemetry.heartbeat_time;
 
-					break;
+				break;
 
-				case telemetry_status_s::MAV_TYPE_ONBOARD_CONTROLLER:
-
-					if (_onboard_controller_lost) {
-						if (telemetry.heartbeat_time > _datalink_last_heartbeat_onboard_controller) {
-							mavlink_log_info(&mavlink_log_pub, "Onboard controller regained");
-							_onboard_controller_lost = false;
-						}
+			case telemetry_status_s::MAV_TYPE_ONBOARD_CONTROLLER:
 
+				if (_onboard_controller_lost) {
+					if (telemetry.heartbeat_time > _datalink_last_heartbeat_onboard_controller) {
+						mavlink_log_info(&mavlink_log_pub, "Onboard controller regained");
+						_onboard_controller_lost = false;
 					}
 
-					_datalink_last_heartbeat_onboard_controller = telemetry.heartbeat_time;
+				}
 
-					if (telemetry.remote_component_id == telemetry_status_s::COMPONENT_ID_OBSTACLE_AVOIDANCE) {
-						if (telemetry.heartbeat_time != _datalink_last_heartbeat_avoidance_system) {
-							_avoidance_system_status_change = _datalink_last_status_avoidance_system != telemetry.remote_system_status;
-						}
+				_datalink_last_heartbeat_onboard_controller = telemetry.heartbeat_time;
 
-						_datalink_last_heartbeat_avoidance_system = telemetry.heartbeat_time;
-						_datalink_last_status_avoidance_system = telemetry.remote_system_status;
+				if (telemetry.remote_component_id == telemetry_status_s::COMPONENT_ID_OBSTACLE_AVOIDANCE) {
+					if (telemetry.heartbeat_time != _datalink_last_heartbeat_avoidance_system) {
+						_avoidance_system_status_change = _datalink_last_status_avoidance_system != telemetry.remote_system_status;
+					}
 
-						if (_avoidance_system_lost) {
-							mavlink_log_info(&mavlink_log_pub, "Avoidance system regained");
-						}
+					_datalink_last_heartbeat_avoidance_system = telemetry.heartbeat_time;
+					_datalink_last_status_avoidance_system = telemetry.remote_system_status;
 
-						_avoidance_system_lost = false;
+					if (_avoidance_system_lost) {
+						mavlink_log_info(&mavlink_log_pub, "Avoidance system regained");
 					}
 
-					break;
+					_avoidance_system_lost = false;
 				}
+
+				break;
 			}
 		}
 	}
 
+
 	// GCS data link loss failsafe
 	if (!status.data_link_lost) {
 		if (_datalink_last_heartbeat_gcs != 0
diff --git a/src/modules/commander/Commander.hpp b/src/modules/commander/Commander.hpp
index 8aa9d635c7eea31a0ef9223e3040719c608620ee..ce55e0dd5f7a5b09fd0a99caee66af2fe570a871 100644
--- a/src/modules/commander/Commander.hpp
+++ b/src/modules/commander/Commander.hpp
@@ -173,7 +173,7 @@ private:
 	 * Checks the status of all available data links and handles switching between different system telemetry states.
 	 */
 	void		data_link_check(bool &status_changed);
-	int		_telemetry_status_sub[ORB_MULTI_MAX_INSTANCES] {};
+	int		_telemetry_status_sub{-1};
 
 	hrt_abstime	_datalink_last_heartbeat_gcs{0};
 
diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp
index 4f205362cde8470c0e0fc65663ff6e7d1c0dd725..3cea61845ede2cda847aa679b839f24940c23b20 100644
--- a/src/modules/mavlink/mavlink_main.cpp
+++ b/src/modules/mavlink/mavlink_main.cpp
@@ -2552,8 +2552,13 @@ void Mavlink::publish_telemetry_status()
 	_tstatus.streams = _streams.size();
 
 	_tstatus.timestamp = hrt_absolute_time();
-	int instance;
-	orb_publish_auto(ORB_ID(telemetry_status), &_telem_status_pub, &_tstatus, &instance, ORB_PRIO_DEFAULT);
+
+	if (_telem_status_pub == nullptr) {
+		_telem_status_pub = orb_advertise_queue(ORB_ID(telemetry_status), &_tstatus, 3);
+
+	} else {
+		orb_publish(ORB_ID(telemetry_status), _telem_status_pub, &_tstatus);
+	}
 }
 
 void Mavlink::check_radio_config()
diff --git a/src/modules/mavlink/mavlink_receiver.cpp b/src/modules/mavlink/mavlink_receiver.cpp
index bea892ef02331ef7ba5890ebb39d6f5f6ed2463d..4dc67274f8af389a01cf973db255208b9dbd5730 100644
--- a/src/modules/mavlink/mavlink_receiver.cpp
+++ b/src/modules/mavlink/mavlink_receiver.cpp
@@ -1896,14 +1896,8 @@ MavlinkReceiver::handle_message_heartbeat(mavlink_message_t *msg)
 			tstatus.remote_component_id = msg->compid;
 			tstatus.remote_type = hb.type;
 			tstatus.remote_system_status = hb.system_status;
-
-			if (_telem_status_pub == nullptr) {
-				_telem_status_pub = orb_advertise(ORB_ID(telemetry_status), &tstatus);
-
-			} else {
-				orb_publish(ORB_ID(telemetry_status), _telem_status_pub, &tstatus);
-			}
 		}
+
 	}
 }
 
diff --git a/src/modules/mavlink/mavlink_receiver.h b/src/modules/mavlink/mavlink_receiver.h
index 676b441d77cdd5efdb3c7de3910178c23b001206..caa294ea6e749f3391ae365d3207f1538ea2d4cf 100644
--- a/src/modules/mavlink/mavlink_receiver.h
+++ b/src/modules/mavlink/mavlink_receiver.h
@@ -253,7 +253,6 @@ private:
 	orb_advert_t _rc_pub{nullptr};
 	orb_advert_t _trajectory_waypoint_pub{nullptr};
 	orb_advert_t _transponder_report_pub{nullptr};
-	orb_advert_t _telem_status_pub{nullptr};
 	orb_advert_t _visual_odometry_pub{nullptr};
 
 	static constexpr int _gps_inject_data_queue_size{6};