diff --git a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp
index 20c55cd636cd55b23299c2d6e4e4af669c8caa10..5f21fe4e9fef7063f2c8457dd0b820cd928cebb9 100644
--- a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp
+++ b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.cpp
@@ -61,8 +61,18 @@ void FlightTaskManualPositionSmoothVel::_updateSetpoints()
 	_smoothing[0].setMaxVel(_constraints.speed_xy);
 	_smoothing[1].setMaxVel(_constraints.speed_xy);
 
+	if (_velocity_setpoint(2) < 0.f) { // up
+		_smoothing[2].setMaxAccel(MPC_ACC_UP_MAX.get());
+		_smoothing[2].setMaxVel(_constraints.speed_up);
+
+	} else { // down
+		_smoothing[2].setMaxAccel(MPC_ACC_DOWN_MAX.get());
+		_smoothing[2].setMaxVel(_constraints.speed_down);
+	}
+
 	Vector2f vel_xy = Vector2f(&_velocity(0));
-	float jerk = _jerk_max.get();
+	float jerk[3] = {_jerk_max.get(), _jerk_max.get(), _jerk_max.get()};
+	float jerk_xy = _jerk_max.get();
 
 	if (_jerk_min.get() > _jerk_max.get()) {
 		_jerk_min.set(0.f);
@@ -70,24 +80,25 @@ void FlightTaskManualPositionSmoothVel::_updateSetpoints()
 
 	if (_jerk_min.get() > FLT_EPSILON) {
 		// interpolate between min and max jerk
-		jerk = math::min(_jerk_min.get() + (_jerk_max.get() - _jerk_min.get()) * vel_xy.length() / _constraints.speed_xy,
+		jerk_xy = math::min(_jerk_min.get() + (_jerk_max.get() - _jerk_min.get()) * vel_xy.length() / _constraints.speed_xy,
 				 _jerk_max.get());
 	}
 
-	for (int i = 0; i < 2; ++i) {
-		_smoothing[i].setMaxJerk(jerk);
+	jerk[0] = jerk_xy;
+	jerk[1] = jerk_xy;
+
+	for (int i = 0; i < 3; ++i) {
+		_smoothing[i].setMaxJerk(jerk[i]);
 		_smoothing[i].updateDurations(_deltatime, _velocity_setpoint(i));
 	}
 
-	VelocitySmoothing::timeSynchronization(_smoothing, 2);
-
-	for (int i = 0; i < 2; ++i) {
+	VelocitySmoothing::timeSynchronization(_smoothing, 2); // Synchronize x and y only
 
-		float smoothed_velocity_setpoint, smoothed_position_setpoint;
-		_smoothing[i].integrate(_position(i), smoothed_velocity_setpoint, smoothed_position_setpoint);
+	for (int i = 0; i < 3; ++i) {
+		float smoothed_position_setpoint;
+		_smoothing[i].integrate(_position(i), _vel_sp_smooth(i), smoothed_position_setpoint);
+		//printf("\nTraj %d\tNew total time = %.3f", i, (double)_smoothing[i].getTotalTime());
 		_position_setpoint(i) = smoothed_position_setpoint;
-		_velocity_setpoint(i) = smoothed_velocity_setpoint;
+		_velocity_setpoint(i) = _vel_sp_smooth(i);
 	}
-
-	// TODO: z
 }
diff --git a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.hpp b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.hpp
index fac63e9564317250de63f8d22f1d1c00287c84f0..5b02552c36eeaef0c051331a412f5f0ac5f5e1ae 100644
--- a/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.hpp
+++ b/src/lib/FlightTasks/tasks/ManualPositionSmoothVel/FlightTaskManualPositionSmoothVel.hpp
@@ -57,9 +57,12 @@ protected:
 
 	DEFINE_PARAMETERS_CUSTOM_PARENT(FlightTaskManualPosition,
 					(ParamFloat<px4::params::MPC_JERK_MIN>) _jerk_min, /**< Minimum jerk (velocity-based if > 0) */
-					(ParamFloat<px4::params::MPC_JERK_MAX>) _jerk_max
+					(ParamFloat<px4::params::MPC_JERK_MAX>) _jerk_max,
+					(ParamFloat<px4::params::MPC_ACC_UP_MAX>) MPC_ACC_UP_MAX,
+					(ParamFloat<px4::params::MPC_ACC_DOWN_MAX>) MPC_ACC_DOWN_MAX
 				       )
 private:
 
 	VelocitySmoothing _smoothing[3]; ///< Smoothing in x, y and z directions
+	matrix::Vector3f _vel_sp_smooth;
 };