diff --git a/src/modules/fw_pos_control_l1/fw_pos_control_l1_main.cpp b/src/modules/fw_pos_control_l1/fw_pos_control_l1_main.cpp
index d7aebbe0a8def08ed33f495ff14fc9be36bcc43a..034c48a08b7533aea49facf249d64ec068a1043e 100644
--- a/src/modules/fw_pos_control_l1/fw_pos_control_l1_main.cpp
+++ b/src/modules/fw_pos_control_l1/fw_pos_control_l1_main.cpp
@@ -973,24 +973,41 @@ void FixedwingPositionControl::get_waypoint_heading_distance(float heading, floa
 {
 	waypoint_prev.valid = true;
 	waypoint_prev.alt = _hold_alt;
+	position_setpoint_s temp_next {};
+	position_setpoint_s temp_prev {};
 
 	if (flag_init) {
-		// on init set first waypoint to momentary position
-		waypoint_prev.lat = _global_pos.lat - cos(heading) * (double)(HDG_HOLD_SET_BACK_DIST) / 1e6;
-		waypoint_prev.lon = _global_pos.lon - sin(heading) * (double)(HDG_HOLD_SET_BACK_DIST) / 1e6;
+		// on init set previous waypoint HDG_HOLD_SET_BACK_DIST meters behind us
+		waypoint_from_heading_and_distance(_global_pos.lat, _global_pos.lon, heading + 180.0f * M_DEG_TO_RAD_F ,
+						   HDG_HOLD_SET_BACK_DIST,
+						   &temp_prev.lat, &temp_prev.lon);
+
+		// set next waypoint HDG_HOLD_DIST_NEXT meters in front of us
+		waypoint_from_heading_and_distance(_global_pos.lat, _global_pos.lon, heading, HDG_HOLD_DIST_NEXT,
+						   &temp_next.lat, &temp_next.lon);
+		waypoint_prev = temp_prev;
+		waypoint_next = temp_next;
+		waypoint_next.valid = true;
+		waypoint_next.alt = _hold_alt;
+
+		return;
+
 
 	} else {
-		/*
-		for previous waypoint use the one still in front of us but shift it such that it is
-		located on the desired flight path but HDG_HOLD_SET_BACK_DIST behind us
-		*/
-		waypoint_prev.lat = waypoint_next.lat - cos(heading) * (double)(HDG_HOLD_REACHED_DIST + HDG_HOLD_SET_BACK_DIST) / 1e6;
-		waypoint_prev.lon = waypoint_next.lon - sin(heading) * (double)(HDG_HOLD_REACHED_DIST + HDG_HOLD_SET_BACK_DIST) / 1e6;
+		// for previous waypoint use the one still in front of us but shift it such that it is
+		// located on the desired flight path but HDG_HOLD_SET_BACK_DIST behind us
+		create_waypoint_from_line_and_dist(waypoint_next.lat, waypoint_next.lon, waypoint_prev.lat, waypoint_prev.lon,
+						   HDG_HOLD_REACHED_DIST + HDG_HOLD_SET_BACK_DIST,
+						   &temp_prev.lat, &temp_prev.lon);
 	}
 
 	waypoint_next.valid = true;
-	waypoint_next.lat = waypoint_prev.lat + cos(heading) * (double)(distance + HDG_HOLD_SET_BACK_DIST) / 1e6;
-	waypoint_next.lon = waypoint_prev.lon + sin(heading) * (double)(distance + HDG_HOLD_SET_BACK_DIST) / 1e6;
+
+	create_waypoint_from_line_and_dist(waypoint_next.lat, waypoint_next.lon, waypoint_prev.lat, waypoint_prev.lon,
+					   -(HDG_HOLD_DIST_NEXT + HDG_HOLD_REACHED_DIST),
+					   &temp_next.lat, &temp_next.lon);
+	waypoint_prev = temp_prev;
+	waypoint_next = temp_next;
 	waypoint_next.alt = _hold_alt;
 }