diff --git a/src/modules/mc_pos_control/mc_pos_control_main.cpp b/src/modules/mc_pos_control/mc_pos_control_main.cpp
index 7729d282a5b9948702171ee248fe6bb5cfb420f4..18aef4908035c81b0219196956a0ac456ef2b942 100644
--- a/src/modules/mc_pos_control/mc_pos_control_main.cpp
+++ b/src/modules/mc_pos_control/mc_pos_control_main.cpp
@@ -676,21 +676,35 @@ MulticopterPositionControl::run()
 				update_smooth_takeoff(setpoint.z, setpoint.vz);
 			}
 
+			// disable horizontal / yaw control during smooth takeoff and limit maximum speed upwards
 			if (_in_smooth_takeoff) {
+
 				// during smooth takeoff, constrain speed to takeoff speed
 				constraints.speed_up = _takeoff_speed;
-				// disable yaw command
-				setpoint.yaw = setpoint.yawspeed = NAN;
-				// don't control position in xy
-				setpoint.x = setpoint.y = NAN;
-				setpoint.vx = setpoint.vy = NAN;
-				setpoint.thrust[0] = setpoint.thrust[1] = NAN;
-
-				if (PX4_ISFINITE(_states.velocity(0)) && PX4_ISFINITE(_states.velocity(1))) {
-					setpoint.vx = setpoint.vy = 0.0f; // try to keep zero velocity
-
-				} else {
-					setpoint.thrust[0] = setpoint.thrust[1] = 0.0f; // just keeping pointing upwards
+				// altitude above reference takeoff
+				const float alt_above_tko = -(_states.position(2) - _takeoff_reference_z);
+				// altitude threshold at which full control is enabled
+				const float alt_threshold = 0.5f; //at 0.5m above grouund, control all setpoints
+
+				// disable position-xy / yaw control when close to ground
+				if (alt_above_tko <= alt_threshold) {
+					// don't control position in xy
+					setpoint.x = setpoint.y = NAN;
+					setpoint.vx = setpoint.vy = NAN;
+					setpoint.thrust[0] = setpoint.thrust[1] = NAN;
+					setpoint.yaw = setpoint.yawspeed = NAN;
+
+					if (PX4_ISFINITE(_states.velocity(0)) && PX4_ISFINITE(_states.velocity(1))) {
+						setpoint.vx = setpoint.vy = 0.0f; // try to keep zero velocity
+
+					} else {
+						setpoint.thrust[0] = setpoint.thrust[1] = 0.0f; // just keeping pointing upwards
+					}
+
+					// if there is a valid yaw estimate, just set setpoint to yaw
+					if (PX4_ISFINITE(_states.yaw)) {
+						setpoint.yaw = _states.yaw;
+					}
 				}
 			}