From 774fad4ef6a27d5bb7fcff2e9682a767ee4fd9e2 Mon Sep 17 00:00:00 2001
From: DonLakeFlyer <don@thegagnes.com>
Date: Sat, 1 Apr 2017 13:51:57 -0700
Subject: [PATCH] Major cleanup to Guided Bar

---
 src/FirmwarePlugin/APM/APMFirmwarePlugin.cc        |  10 -
 src/FirmwarePlugin/APM/APMFirmwarePlugin.h         |   2 -
 src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc |  24 +-
 src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h  |   9 +-
 src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc  |   5 -
 src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h   |   1 -
 src/FirmwarePlugin/FirmwarePlugin.cc               |  22 --
 src/FirmwarePlugin/FirmwarePlugin.h                |  35 +--
 src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc        |  30 +-
 src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h         |   8 +-
 src/FlightDisplay/FlightDisplayViewWidgets.qml     | 308 +++++++++++----------
 src/FlightMap/FlightMap.qml                        |   1 +
 src/FlightMap/qmldir                               |   1 -
 src/MissionManager/SimpleMissionItem.cc            |  16 +-
 src/QmlControls/QGCSlider.qml                      |  62 +++--
 src/QmlControls/ScreenTools.qml                    |   1 +
 src/QmlControls/SliderSwitch.qml                   |  12 +-
 src/Vehicle/Vehicle.cc                             |  14 +-
 src/Vehicle/Vehicle.h                              |   9 +-
 19 files changed, 296 insertions(+), 274 deletions(-)

diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc
index ebe40c0..284ca89 100644
--- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc
+++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc
@@ -806,13 +806,3 @@ QString APMFirmwarePlugin::internalParameterMetaDataFile(Vehicle* vehicle)
         return QString();
     }
 }
-
-QString APMFirmwarePlugin::missionFlightMode(void)
-{
-    return QStringLiteral("Auto");
-}
-
-QString APMFirmwarePlugin::rtlFlightMode(void)
-{
-    return QStringLiteral("RTL");
-}
diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h
index 6722169..f53f1fa 100644
--- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h
+++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h
@@ -97,8 +97,6 @@ public:
     RallyPointManager*  newRallyPointManager            (Vehicle* vehicle) { return new APMRallyPointManager(vehicle); }
     QString             brandImageIndoor                (const Vehicle* vehicle) const { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); }
     QString             brandImageOutdoor               (const Vehicle* vehicle) const { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); }
-    QString             missionFlightMode               (void) final;
-    QString             rtlFlightMode                   (void) final;
 
 protected:
     /// All access to singleton is through stack specific implementation
diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc
index 1ff4869..270fb99 100644
--- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc
+++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc
@@ -162,13 +162,22 @@ void ArduCopterFirmwarePlugin::guidedModeGotoLocation(Vehicle* vehicle, const QG
     vehicle->missionManager()->writeArduPilotGuidedMissionItem(coordWithAltitude, false /* altChangeOnly */);
 }
 
-void ArduCopterFirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitudeRel)
+void ArduCopterFirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange)
 {
     if (qIsNaN(vehicle->altitudeRelative()->rawValue().toDouble())) {
         qgcApp()->showMessage(QStringLiteral("Unable to change altitude, vehicle altitude not known."));
         return;
     }
 
+    // Don't allow altitude to fall below 3 meters above home
+    double currentAltRel = vehicle->altitudeRelative()->rawValue().toDouble();
+    if (altitudeChange <= 0 && currentAltRel <= 3) {
+        return;
+    }
+    if (currentAltRel + altitudeChange < 3) {
+        altitudeChange = 3 - currentAltRel;
+    }
+
     mavlink_message_t msg;
     mavlink_set_position_target_local_ned_t cmd;
 
@@ -180,7 +189,7 @@ void ArduCopterFirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double
     cmd.type_mask = 0xFFF8; // Only x/y/z valid
     cmd.x = 0.0f;
     cmd.y = 0.0f;
-    cmd.z = -(altitudeRel - vehicle->altitudeRelative()->rawValue().toDouble());
+    cmd.z = -(altitudeChange);
 
     MAVLinkProtocol* mavlink = qgcApp()->toolbox()->mavlinkProtocol();
     mavlink_msg_set_position_target_local_ned_encode_chan(mavlink->getSystemId(),
@@ -192,11 +201,6 @@ void ArduCopterFirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double
     vehicle->sendMessageOnLink(vehicle->priorityLink(), msg);
 }
 
-bool ArduCopterFirmwarePlugin::isPaused(const Vehicle* vehicle) const
-{
-    return vehicle->flightMode() == "Brake";
-}
-
 void ArduCopterFirmwarePlugin::pauseVehicle(Vehicle* vehicle)
 {
     vehicle->setFlightMode("Brake");
@@ -228,12 +232,6 @@ QString ArduCopterFirmwarePlugin::geoFenceRadiusParam(Vehicle* vehicle)
     return QStringLiteral("FENCE_RADIUS");
 }
 
-QString ArduCopterFirmwarePlugin::takeControlFlightMode(void)
-{
-    return QStringLiteral("Stabilize");
-}
-
-
 bool ArduCopterFirmwarePlugin::vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const
 {
     if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, QStringLiteral("WP_YAW_BEHAVIOR"))) {
diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
index 041d839..ea33ee7 100644
--- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
+++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
@@ -54,7 +54,6 @@ public:
 
     // Overrides from FirmwarePlugin
     bool isCapable(const Vehicle *vehicle, FirmwareCapabilities capabilities) final;
-    bool isPaused(const Vehicle* vehicle) const final;
     void setGuidedMode(Vehicle* vehicle, bool guidedMode) final;
     void pauseVehicle(Vehicle* vehicle) final;
     void guidedModeRTL(Vehicle* vehicle) final;
@@ -64,14 +63,18 @@ public:
     void guidedModeTakeoff(Vehicle* vehicle) final;
 #endif
     void guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoordinate& gotoCoord) final;
-    void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeRel) final;
+    void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange) final;
     const FirmwarePlugin::remapParamNameMajorVersionMap_t& paramNameRemapMajorVersionMap(void) const final { return _remapParamName; }
     int remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const final;
     bool multiRotorCoaxialMotors(Vehicle* vehicle) final;
     bool multiRotorXConfig(Vehicle* vehicle) final;
     QString geoFenceRadiusParam(Vehicle* vehicle) final;
     QString offlineEditingParamFile(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Copter.OfflineEditing.params"); }
-    QString takeControlFlightMode(void) final;
+    QString pauseFlightMode(void) const override { return QString("Brake"); }
+    QString missionFlightMode(void) const override { return QString("Auto"); }
+    QString rtlFlightMode(void) const override { return QString("RTL"); }
+    QString landFlightMode(void) const override { return QString("Land"); }
+    QString takeControlFlightMode(void) const override { return QString("Stablize"); }
     bool vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const final;
 
 private:
diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc
index 88a380a..996551e 100644
--- a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc
+++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.cc
@@ -86,8 +86,3 @@ int ArduPlaneFirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVer
     // Remapping supports up to 3.8
     return majorVersionNumber == 3 ? 8 : Vehicle::versionNotSetValue;
 }
-
-QString ArduPlaneFirmwarePlugin::takeControlFlightMode(void)
-{
-    return QStringLiteral("Manual");
-}
diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
index 3ec63a6..dfa4340 100644
--- a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
+++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
@@ -57,7 +57,6 @@ public:
 
     // Overrides from FirmwarePlugin
     QString offlineEditingParamFile(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Plane.OfflineEditing.params"); }
-    QString takeControlFlightMode(void) final;
     const FirmwarePlugin::remapParamNameMajorVersionMap_t& paramNameRemapMajorVersionMap(void) const final { return _remapParamName; }
     int remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const final;
 
diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc
index 5739615..17f583f 100644
--- a/src/FirmwarePlugin/FirmwarePlugin.cc
+++ b/src/FirmwarePlugin/FirmwarePlugin.cc
@@ -237,13 +237,6 @@ void FirmwarePlugin::setGuidedMode(Vehicle* vehicle, bool guidedMode)
     qgcApp()->showMessage(guided_mode_not_supported_by_vehicle);
 }
 
-bool FirmwarePlugin::isPaused(const Vehicle* vehicle) const
-{
-    // Not supported by generic vehicle
-    Q_UNUSED(vehicle);
-    return false;
-}
-
 void FirmwarePlugin::pauseVehicle(Vehicle* vehicle)
 {
     // Not supported by generic vehicle
@@ -314,21 +307,6 @@ int FirmwarePlugin::remapParamNameHigestMinorVersionNumber(int majorVersionNumbe
     return 0;
 }
 
-QString FirmwarePlugin::missionFlightMode(void)
-{
-    return QString();
-}
-
-QString FirmwarePlugin::rtlFlightMode(void)
-{
-    return QString();
-}
-
-QString FirmwarePlugin::takeControlFlightMode(void)
-{
-    return QString();
-}
-
 QString FirmwarePlugin::vehicleImageOpaque(const Vehicle* vehicle) const
 {
     Q_UNUSED(vehicle);
diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h
index ed139f7..fa964cf 100644
--- a/src/FirmwarePlugin/FirmwarePlugin.h
+++ b/src/FirmwarePlugin/FirmwarePlugin.h
@@ -93,15 +93,27 @@ public:
     ///     @param[out] custom_mode Custom mode for SET_MODE mavlink message
     virtual bool setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode);
 
+    /// Returns The flight mode which indicates the vehicle is paused
+    virtual QString pauseFlightMode(void) const { return QString(); }
+
+    /// Returns the flight mode for running missions
+    virtual QString missionFlightMode(void) const { return QString(); }
+
+    /// Returns the flight mode for RTL
+    virtual QString rtlFlightMode(void) const { return QString(); }
+
+    /// Returns the flight mode for Land
+    virtual QString landFlightMode(void) const { return QString(); }
+
+    /// Returns the flight mode to use when the operator wants to take back control from autonomouse flight.
+    virtual QString takeControlFlightMode(void) const { return QString(); }
+
     /// Returns whether the vehicle is in guided mode or not.
     virtual bool isGuidedMode(const Vehicle* vehicle) const;
 
     /// Set guided flight mode
     virtual void setGuidedMode(Vehicle* vehicle, bool guidedMode);
 
-    /// Returns whether the vehicle is paused or not.
-    virtual bool isPaused(const Vehicle* vehicle) const;
-
     /// Causes the vehicle to stop at current position. If guide mode is supported, vehicle will be let in guide mode.
     /// If not, vehicle will be left in Loiter.
     virtual void pauseVehicle(Vehicle* vehicle);
@@ -125,20 +137,9 @@ public:
     /// Command vehicle to move to specified location (altitude is included and relative)
     virtual void guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoordinate& gotoCoord);
 
-    /// Command vehicle to change to the specified relatice altitude
-    virtual void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeRel);
-
-
-
-
-    /// Returns the flight mode for running missions
-    virtual QString missionFlightMode(void);
-
-    /// Returns the flight mode for RTL
-    virtual QString rtlFlightMode(void);
-
-    /// Returns the flight mode to use when the operator wants to take back control from autonomouse flight.
-    virtual QString takeControlFlightMode(void);
+    /// Command vehicle to change altitude
+    ///     @param altitudeChange If > 0, go up by amount specified, if < 0, go down by amount specified
+    virtual void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange);
 
     /// FIXME: This isn't quite correct being here. All code for Joystick suvehicleTypepport is currently firmware specific
     /// not just this. I'm going to try to change that. If not, this will need to be removed.
diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc
index d1d5a1f..07a3b16 100644
--- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc
+++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc
@@ -399,7 +399,7 @@ void PX4FirmwarePlugin::guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoord
                             vehicle->altitudeAMSL()->rawValue().toFloat());
 }
 
-void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitudeRel)
+void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange)
 {
     if (!vehicle->homePositionAvailable()) {
         qgcApp()->showMessage(tr("Unable to change altitude, home position unknown."));
@@ -410,6 +410,17 @@ void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitu
         return;
     }
 
+    // Don't allow altitude to fall below 3 meters above home
+    double currentAltRel = vehicle->altitudeRelative()->rawValue().toDouble();
+    double newAltRel = currentAltRel;
+    if (altitudeChange <= 0 && currentAltRel <= 3) {
+        return;
+    }
+    if (currentAltRel + altitudeChange < 3) {
+        altitudeChange = 3 - currentAltRel;
+    }
+    newAltRel = currentAltRel + altitudeChange;
+
     vehicle->sendMavCommand(vehicle->defaultComponentId(),
                             MAV_CMD_DO_REPOSITION,
                             true,   // show error is fails
@@ -419,7 +430,7 @@ void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitu
                             NAN,
                             NAN,
                             NAN,
-                            vehicle->homePosition().altitude() + altitudeRel);
+                            vehicle->homePosition().altitude() + newAltRel);
 }
 
 void PX4FirmwarePlugin::startMission(Vehicle* vehicle)
@@ -504,21 +515,6 @@ void PX4FirmwarePlugin::_handleAutopilotVersion(Vehicle* vehicle, mavlink_messag
     }
 }
 
-QString PX4FirmwarePlugin::missionFlightMode(void)
-{
-    return QString(_missionFlightMode);
-}
-
-QString PX4FirmwarePlugin::rtlFlightMode(void)
-{
-    return QString(_rtlFlightMode);
-}
-
-QString PX4FirmwarePlugin::takeControlFlightMode(void)
-{
-    return QString(_manualFlightMode);
-}
-
 bool PX4FirmwarePlugin::vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const
 {
     if ( vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, QStringLiteral("MIS_YAWMODE"))) {
diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
index 4707411..c75bb8d 100644
--- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
+++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
@@ -37,6 +37,11 @@ public:
     QString             flightMode                      (uint8_t base_mode, uint32_t custom_mode) const override;
     bool                setFlightMode                   (const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) override;
     void                setGuidedMode                   (Vehicle* vehicle, bool guidedMode) override;
+    QString             pauseFlightMode                 (void) const override { return _holdFlightMode; }
+    QString             missionFlightMode               (void) const override { return _missionFlightMode; }
+    QString             rtlFlightMode                   (void) const override { return _rtlFlightMode; }
+    QString             landFlightMode                  (void) const override { return _landingFlightMode; }
+    QString             takeControlFlightMode           (void) const override { return _manualFlightMode; }
     void                pauseVehicle                    (Vehicle* vehicle) override;
     void                guidedModeRTL                   (Vehicle* vehicle) override;
     void                guidedModeLand                  (Vehicle* vehicle) override;
@@ -61,9 +66,6 @@ public:
     QString             offlineEditingParamFile(Vehicle* vehicle) override { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/PX4/PX4.OfflineEditing.params"); }
     QString             brandImageIndoor                (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/PX4/BrandImage"); }
     QString             brandImageOutdoor               (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/PX4/BrandImage"); }
-    QString             missionFlightMode               (void) override;
-    QString             rtlFlightMode                   (void) override;
-    QString             takeControlFlightMode           (void) override;
     bool                vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const override;
 
 protected:
diff --git a/src/FlightDisplay/FlightDisplayViewWidgets.qml b/src/FlightDisplay/FlightDisplayViewWidgets.qml
index 10de92b..b540cfe 100644
--- a/src/FlightDisplay/FlightDisplayViewWidgets.qml
+++ b/src/FlightDisplay/FlightDisplayViewWidgets.qml
@@ -7,13 +7,13 @@
  *
  ****************************************************************************/
 
-
 import QtQuick                  2.3
 import QtQuick.Controls         1.2
 import QtQuick.Controls.Styles  1.4
 import QtQuick.Dialogs          1.2
 import QtLocation               5.3
 import QtPositioning            5.3
+import QtQuick.Layouts          1.2
 
 import QGroundControl                           1.0
 import QGroundControl.ScreenTools               1.0
@@ -38,6 +38,9 @@ Item {
     // Guided bar properties
     property bool _missionAvailable:    missionController.containsItems
     property bool _missionActive:       _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.missionFlightMode : false
+    property bool _vehiclePaused:       _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.pauseFlightMode : false
+    property bool _vehicleInRTLMode:    _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.rtlFlightMode : false
+    property bool _vehicleInLandMode:   _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.landFlightMode : false
     property int  _resumeMissionItem:   missionController.resumeMissionItem
     property bool _showEmergenyStop:    QGroundControl.corePlugin.options.guidedBarShowEmergencyStop
     property bool _showOrbit:           QGroundControl.corePlugin.options.guidedBarShowOrbit
@@ -171,58 +174,30 @@ Item {
         anchors.margins:            _barMargin
         anchors.bottom:             parent.bottom
         anchors.horizontalCenter:   parent.horizontalCenter
-        width:                      guidedModeColumn.width  + (_margins * 2)
-        height:                     guidedModeColumn.height + (_margins * 2)
+        width:                      (guidedModeButtons.visible ?  guidedModeButtons.width : guidedModeConfirm.width) + (_margins * 2)
+        height:                     (guidedModeButtons.visible ?  guidedModeButtons.height : guidedModeConfirm.height) + (_margins * 2)
         radius:                     ScreenTools.defaultFontPixelHeight * 0.25
-        color:                      _isSatellite ? Qt.rgba(qgcPal.mapWidgetBorderLight.r, qgcPal.mapWidgetBorderLight.g, qgcPal.mapWidgetBorderLight.b, 0.8) : Qt.rgba(qgcPal.mapWidgetBorderDark.r, qgcPal.mapWidgetBorderDark.g, qgcPal.mapWidgetBorderDark.b, 0.75)
+        color:                      _backgroundColor
         visible:                    _activeVehicle
         z:                          QGroundControl.zOrderWidgets
-        state:                      "Shown"
-
-        property real _fontPointSize: ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize
-
-        states: [
-            State {
-                name: "Shown"
-                PropertyChanges { target: showAnimation; running: true  }
-                PropertyChanges { target: guidedModeHideTimer; running: true }
-            },
-            State {
-                name: "Hidden"
-                PropertyChanges { target: hideAnimation; running: true  }
-            }
-        ]
 
-        PropertyAnimation {
-            id:             hideAnimation
-            target:         _guidedModeBar
-            property:       "_barMargin"
-            duration:       1000
-            easing.type:    Easing.InOutQuad
-            from:           _guidedModeBar._showMargin
-            to:             _guidedModeBar._hideMargin
-        }
+        property real   _fontPointSize:     ScreenTools.isMobile ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize
+        property color  _backgroundColor:   _isSatellite ? qgcPal.mapWidgetBorderLight : qgcPal.mapWidgetBorderDark
+        property color  _textColor:         _isSatellite ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight
 
-        PropertyAnimation {
-            id:             showAnimation
-            target:         _guidedModeBar
-            property:       "_barMargin"
-            duration:       250
-            easing.type:    Easing.InOutQuad
-            from:           _guidedModeBar._hideMargin
-            to:             _guidedModeBar._showMargin
-        }
+        property string _emergencyStopTitle:    qsTr("Emergency Stop")
+        property string _armTitle:              qsTr("Arm")
+        property string _disarmTitle:           qsTr("Disarm")
+        property string _rtlTitle:              qsTr("RTL")
+        property string _takeoffTitle:          qsTr("Takeoff")
+        property string _landTitle:             qsTr("Land")
+        property string _startMissionTitle:     qsTr("Start Mission")
+        property string _resumeMissionTitle:    qsTr("Resume Mission")
+        property string _pauseTitle:            _missionActive ? qsTr("Pause Mission") : qsTr("Pause")
+        property string _changeAltTitle:        qsTr("Change Altitude")
+        property string _orbitTitle:            qsTr("Orbit")
+        property string _abortTitle:            qsTr("Abort")
 
-        Timer {
-            id:             guidedModeHideTimer
-            interval:       7000
-            running:        true
-            onTriggered: {
-                if (ScreenTools.isTinyScreen) {
-                    _guidedModeBar.state = "Hidden"
-                }
-            }
-        }
 
         readonly property int confirmHome:                  1
         readonly property int confirmLand:                  2
@@ -274,10 +249,7 @@ Item {
                 _activeVehicle.emergencyStop()
                 break;
             case confirmChangeAlt:
-                var altitude2 = altitudeSlider.getValue()
-                if (!isNaN(altitude2)) {
-                    _activeVehicle.guidedModeChangeAltitude(altitude2)
-                }
+                _activeVehicle.guidedModeChangeAltitude(altitudeSlider.getValue())
                 break;
             case confirmGoTo:
                 _activeVehicle.guidedModeGotoLocation(_flightMap._gotoHereCoordinate)
@@ -300,190 +272,239 @@ Item {
         }
 
         function rejectGuidedModeConfirm() {
+            guidedModeButtons.visible = true
             guidedModeConfirm.visible = false
-            _guidedModeBar.visible = true
             altitudeSlider.visible = false
             _flightMap._gotoHereCoordinate = QtPositioning.coordinate()
-            guidedModeHideTimer.restart()
         }
 
         function confirmAction(actionCode) {
-            guidedModeHideTimer.stop()
             confirmActionCode = actionCode
             switch (confirmActionCode) {
             case confirmArm:
-                guidedModeConfirm.confirmText = qsTr("arm")
+                guidedModeConfirm.title = _armTitle
+                guidedModeConfirm.message = qsTr("arm")
                 break;
             case confirmDisarm:
-                guidedModeConfirm.confirmText = qsTr("disarm")
+                guidedModeConfirm.title = _disarmTitle
+                guidedModeConfirm.message = qsTr("disarm")
                 break;
             case confirmEmergencyStop:
-                guidedModeConfirm.confirmText = qsTr("STOP ALL MOTORS!")
+                guidedModeConfirm.title = _emergencyStopTitle
+                guidedModeConfirm.message = qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.")
                 break;
             case confirmTakeoff:
-                guidedModeConfirm.confirmText = qsTr("takeoff")
+                guidedModeConfirm.title = _takeoffTitle
+                guidedModeConfirm.message = qsTr("Takeoff from ground and hold position.")
                 break;
             case confirmStartMission:
-                guidedModeConfirm.confirmText = qsTr("start mission")
+                guidedModeConfirm.title = _startMissionTitle
+                guidedModeConfirm.message = qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.")
                 break;
             case confirmResumeMission:
-                guidedModeConfirm.confirmText = qsTr("resume mission")
+                guidedModeConfirm.title = _resumeMissionTitle
+                guidedModeConfirm.message = qsTr("Resume the mission which is displayed above. This will re-generate the mission from waypoint %1, takeoff and continue the mission.").arg(_resumeMissionItem)
                 break;
             case confirmResumeMissionReady:
-                guidedModeConfirm.confirmText = qsTr("resume modified mission after review")
+                guidedModeConfirm.title = _resumeMissionTitle
+                guidedModeConfirm.message = qsTr("Review the modified mission above. Confirm if you want to takeoff and begin mission.")
                 break;
             case confirmLand:
-                guidedModeConfirm.confirmText = qsTr("land")
+                guidedModeConfirm.title = _landTitle
+                guidedModeConfirm.message = qsTr("Land the vehicle at the current position.")
                 break;
             case confirmHome:
-                guidedModeConfirm.confirmText = qsTr("return to land")
+                guidedModeConfirm.title = _rtlTitle
+                guidedModeConfirm.message = qsTr("Return to the home position of the vehicle.")
                 break;
             case confirmChangeAlt:
                 altitudeSlider.visible = true
-                altitudeSlider.setInitialValueAppSettingsDistanceUnits(_activeVehicle.altitudeRelative.value)
-                guidedModeConfirm.confirmText = qsTr("change altitude")
+                altitudeSlider.setValue(0)
+                guidedModeConfirm.title = _changeAltTitle
+                guidedModeConfirm.message = qsTr("Adjust the slider to the left up or down to change the altitude of the vehicle.")
                 break;
             case confirmGoTo:
-                guidedModeConfirm.confirmText = qsTr("move vehicle")
+                guidedModeConfirm.title = qsTr("Go To Location")
+                guidedModeConfirm.message = qsTr("Confirm to move to the new location.")
                 break;
             case confirmRetask:
-                guidedModeConfirm.confirmText = qsTr("activate waypoint change")
+                guidedModeConfirm.title = qsTr("Waypoint Change")
+                guidedModeConfirm.message = qsTr("Confirm to change current mission item to %1.").arg(_flightMap._retaskSequence)
                 break;
             case confirmOrbit:
-                guidedModeConfirm.confirmText = qsTr("enter orbit mode")
+                guidedModeConfirm.title = _orbitTitle
+                guidedModeConfirm.message = qsTr("Confirm to enter Orbit mode.")
                 break;
             case confirmAbort:
-                guidedModeConfirm.confirmText = qsTr("abort landing")
+                guidedModeConfirm.title = _abortTitle
+                guidedModeConfirm.message = qsTr("Confirm to abort the current landing.")
                 break;
             }
-            _guidedModeBar.visible = false
+            guidedModeButtons.visible = false
             guidedModeConfirm.visible = true
         }
 
-        Column {
-            id:                 guidedModeColumn
+        ColumnLayout {
+            id:                 guidedModeButtons
             anchors.margins:    _margins
             anchors.top:        parent.top
             anchors.left:       parent.left
             spacing:            _margins
 
             QGCLabel {
-                anchors.horizontalCenter: parent.horizontalCenter
-                color:      _isSatellite ? qgcPal.mapWidgetBorderDark : qgcPal.mapWidgetBorderLight
-                text:       "Click in map to move vehicle"
-                visible:    gotoEnabled
+                anchors.horizontalCenter:   parent.horizontalCenter
+                color:                      _guidedModeBar._textColor
+                text:                       qsTr("Click in map to move vehicle")
+                visible:                    gotoEnabled
             }
 
             Row {
-                spacing: _margins * 2
+                spacing:    _margins * 2
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Emergency Stop")
+                    text:       _guidedModeBar._emergencyStopTitle
                     visible:    _showEmergenyStop && _activeVehicle && _activeVehicle.armed && _activeVehicle.flying
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmEmergencyStop)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Disarm")
+                    text:       _guidedModeBar._disarmTitle
                     visible:    _activeVehicle && _activeVehicle.armed && !_activeVehicle.flying
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmDisarm)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("RTL")
-                    visible:    _activeVehicle && _activeVehicle.armed && _activeVehicle.guidedModeSupported && _activeVehicle.flying
+                    text:       _guidedModeBar._rtlTitle
+                    visible:    _activeVehicle && _activeVehicle.armed && _activeVehicle.guidedModeSupported && _activeVehicle.flying && !_vehicleInRTLMode
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmHome)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Takeoff")
+                    text:       _guidedModeBar._takeoffTitle
                     visible:    _activeVehicle && _activeVehicle.guidedModeSupported && !_activeVehicle.flying  && !_activeVehicle.fixedWing
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmTakeoff)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Land")
-                    visible:    _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing
+                    text:       _guidedModeBar._landTitle
+                    visible:    _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing && !_vehicleInLandMode
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmLand)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       _resumeMissionItem !== -1 ? qsTr("Restart Mission") : qsTr("Start Mission")
-                    visible:    _activeVehicle && !_activeVehicle.flying && _missionAvailable
+                    text:       _guidedModeBar._startMissionTitle
+                    visible:    _activeVehicle && _missionAvailable && !_missionActive
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmStartMission)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Resume Mission (%1)").arg(_resumeMissionItem)
+                    text:       _guidedModeBar._resumeMissionTitle
                     visible:    _activeVehicle && !_activeVehicle.flying && _missionAvailable && _resumeMissionItem !== -1
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmResumeMission)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       _missionActive ? qsTr("Pause Mission") : qsTr("Pause")
-                    visible:    _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying
+                    text:       _guidedModeBar._pauseTitle
+                    visible:    _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying && !_vehiclePaused
                     onClicked:  _activeVehicle.pauseVehicle()
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Change Altitude")
+                    text:       _guidedModeBar._changeAltTitle
                     visible:    (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_missionActive
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmChangeAlt)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Orbit")
+                    text:       _guidedModeBar._orbitTitle
                     visible:    _showOrbit && _activeVehicle && _activeVehicle.flying && _activeVehicle.orbitModeSupported && _activeVehicle.armed && !_missionActive
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmOrbit)
                 }
 
                 QGCButton {
                     pointSize:  _guidedModeBar._fontPointSize
-                    text:       qsTr("Abort")
+                    text:       _guidedModeBar._abortTitle
                     visible:    _activeVehicle && _activeVehicle.flying && _activeVehicle.fixedWing
                     onClicked:  _guidedModeBar.confirmAction(_guidedModeBar.confirmAbort)
                 }
+            }
+        }
 
-            } // Row
-        } // Column
-    } // Rectangle - Guided mode buttons
+        Column {
+            id:                 guidedModeConfirm
+            anchors.margins:    _margins
+            anchors.top:        parent.top
+            anchors.left:       parent.left
+            spacing:            _margins
+            visible:            false
 
-    MouseArea {
-        anchors.fill:   parent
-        enabled:        guidedModeConfirm.visible
-        onClicked:      _guidedModeBar.rejectGuidedModeConfirm()
-    }
+            property alias title:   titleText.text
+            property alias message: messageText.text
 
-    // Action confirmation control
-    SliderSwitch {
-        id:                         guidedModeConfirm
-        anchors.bottomMargin:       _margins
-        anchors.bottom:             parent.bottom
-        anchors.horizontalCenter:   parent.horizontalCenter
-        visible:                    false
-        z:                          QGroundControl.zOrderWidgets
-        fontPointSize:              _guidedModeBar._fontPointSize
+            QGCLabel {
+                id:                 titleText
+                anchors.left:           slider.left
+                anchors.right:          slider.right
+                color:                  _guidedModeBar._textColor
+                horizontalAlignment:    Text.AlignHCenter
+            }
 
-        onAccept: {
-            guidedModeConfirm.visible = false
-            _guidedModeBar.visible = true
-            _guidedModeBar.actionConfirmed()
-            altitudeSlider.visible = false
-            guidedModeHideTimer.restart()
+            QGCLabel {
+                id:                     messageText
+                anchors.left:           slider.left
+                anchors.right:          slider.right
+                color:                  _guidedModeBar._textColor
+                horizontalAlignment:    Text.AlignHCenter
+                wrapMode:               Text.WordWrap
+            }
+
+            // Action confirmation control
+            SliderSwitch {
+                id:             slider
+                fontPointSize:  _guidedModeBar._fontPointSize
+                confirmText:    qsTr("Slide to confirm")
+                width:          Math.max(implicitWidth, ScreenTools.defaultFontPixelWidth * 30)
+
+                onAccept: {
+                    guidedModeButtons.visible = true
+                    guidedModeConfirm.visible = false
+                    altitudeSlider.visible = false
+                    _guidedModeBar.actionConfirmed()
+                }
+
+                onReject: _guidedModeBar.rejectGuidedModeConfirm()
+            }
         }
 
-        onReject: _guidedModeBar.rejectGuidedModeConfirm()
-    }
+        QGCColoredImage {
+            anchors.margins:    _margins
+            anchors.top:        _guidedModeBar.top
+            anchors.right:      _guidedModeBar.right
+            width:              ScreenTools.defaultFontPixelHeight
+            height:             width
+            sourceSize.height:  width
+            source:             "/res/XDelete.svg"
+            fillMode:           Image.PreserveAspectFit
+            color:              qgcPal.alertText
+            visible:            guidedModeConfirm.visible
+
+            QGCMouseArea {
+                fillItem:   parent
+                onClicked:  _guidedModeBar.rejectGuidedModeConfirm()
+            }
+        }
+
+    } // Rectangle - Guided mode buttons
 
     //-- Altitude slider
     Rectangle {
@@ -492,27 +513,17 @@ Item {
         anchors.right:      parent.right
         anchors.top:        parent.top
         anchors.bottom:     parent.bottom
-        color:              qgcPal.window
+        radius:             ScreenTools.defaultFontPixelWidth / 2
         width:              ScreenTools.defaultFontPixelWidth * 10
-        opacity:            0.8
+        color:              qgcPal.window
         visible:            false
 
-        function setInitialValueMeters(meters) {
-            altSlider.value = QGroundControl.metersToAppSettingsDistanceUnits(meters)
+        function setValue(value) {
+            altSlider.value = value
         }
 
-        function setInitialValueAppSettingsDistanceUnits(height) {
-            altSlider.value = height
-        }
-
-        /// Returns NaN for bad value
         function getValue() {
-            var value =  parseFloat(altField.text)
-            if (!isNaN(value)) {
-                return QGroundControl.appSettingsDistanceUnitsToMeters(value);
-            } else {
-                return value;
-            }
+            return altSlider.value
         }
 
         Column {
@@ -523,24 +534,18 @@ Item {
             anchors.right:      parent.right
 
             QGCLabel {
-                anchors.horizontalCenter: parent.horizontalCenter
-                text: qsTr("Alt (rel)")
+                anchors.horizontalCenter:   parent.horizontalCenter
+                text:                       altSlider.value >=0 ? qsTr("Up") : qsTr("Down")
             }
 
             QGCLabel {
-                anchors.horizontalCenter: parent.horizontalCenter
-                text: QGroundControl.appSettingsDistanceUnitsString
-            }
-
-            QGCTextField {
-                id:             altField
-                anchors.left:   parent.left
-                anchors.right:  parent.right
-                text:           altSlider.value.toFixed(1)
+                id:                         altField
+                anchors.horizontalCenter:   parent.horizontalCenter
+                text:                       Math.abs(altSlider.value.toFixed(1)) + " " + QGroundControl.appSettingsDistanceUnitsString
             }
         }
 
-        Slider {
+        QGCSlider {
             id:                 altSlider
             anchors.margins:    _margins
             anchors.top:        headerColumn.bottom
@@ -548,8 +553,19 @@ Item {
             anchors.left:       parent.left
             anchors.right:      parent.right
             orientation:        Qt.Vertical
-            minimumValue:       QGroundControl.metersToAppSettingsDistanceUnits(0)
-            maximumValue:       QGroundControl.metersToAppSettingsDistanceUnits((_activeVehicle && _activeVehicle.flying) ? Math.round((_activeVehicle.altitudeRelative.value + 100) / 100) * 100 : 10)
+            //minimumValue:       QGroundControl.metersToAppSettingsDistanceUnits(0)
+            //maximumValue:       QGroundControl.metersToAppSettingsDistanceUnits((_activeVehicle && _activeVehicle.flying) ? Math.round((_activeVehicle.altitudeRelative.value + 100) / 100) * 100 : 10)
+            minimumValue:       QGroundControl.metersToAppSettingsDistanceUnits(-10)
+            maximumValue:       QGroundControl.metersToAppSettingsDistanceUnits(10)
+            indicatorCentered:  true
+            rotation:           180
+
+            // We want slide up to be positive values
+            transform: Rotation {
+                origin.x:   altSlider.width / 2
+                origin.y:   altSlider.height / 2
+                angle:      180
+            }
         }
     }
 }
diff --git a/src/FlightMap/FlightMap.qml b/src/FlightMap/FlightMap.qml
index 014387b..e13a9a0 100644
--- a/src/FlightMap/FlightMap.qml
+++ b/src/FlightMap/FlightMap.qml
@@ -54,6 +54,7 @@ Map {
 
     function _possiblyCenterToVehiclePosition() {
         if (!firstVehiclePositionReceived && allowVehicleLocationCenter && activeVehicleCoordinate.isValid) {
+            console.log("Moving to initial vehicle position", QGroundControl.flightMapInitialZoom)
             firstVehiclePositionReceived = true
             center = activeVehicleCoordinate
             zoomLevel = QGroundControl.flightMapInitialZoom
diff --git a/src/FlightMap/qmldir b/src/FlightMap/qmldir
index 4626a37..b507ba2 100644
--- a/src/FlightMap/qmldir
+++ b/src/FlightMap/qmldir
@@ -17,7 +17,6 @@ QGCAttitudeHUD          1.0 QGCAttitudeHUD.qml
 QGCAttitudeWidget       1.0 QGCAttitudeWidget.qml
 QGCCompassWidget        1.0 QGCCompassWidget.qml
 QGCPitchIndicator       1.0 QGCPitchIndicator.qml
-QGCSlider               1.0 QGCSlider.qml
 ValuesWidget            1.0 ValuesWidget.qml
 VehicleHealthWidget     1.0 VehicleHealthWidget.qml
 VibrationWidget         1.0 VibrationWidget.qml
diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc
index 6905057..a5ee83e 100644
--- a/src/MissionManager/SimpleMissionItem.cc
+++ b/src/MissionManager/SimpleMissionItem.cc
@@ -498,7 +498,21 @@ bool SimpleMissionItem::friendlyEditAllowed(void) const
         }
 
         if (specifiesCoordinate() || specifiesAltitudeOnly()) {
-            return _missionItem.frame() == MAV_FRAME_GLOBAL || _missionItem.frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT;
+            MAV_FRAME frame = _missionItem.frame();
+            switch (frame) {
+            case MAV_FRAME_GLOBAL:
+            case MAV_FRAME_GLOBAL_RELATIVE_ALT:
+#if 0
+            Coming soon
+            case MAV_FRAME_GLOBAL_INT:
+            case MAV_FRAME_GLOBAL_RELATIVE_ALT_INT:
+#endif
+                return true;
+                break;
+
+            default:
+                return false;
+            }
         }
 
         return true;
diff --git a/src/QmlControls/QGCSlider.qml b/src/QmlControls/QGCSlider.qml
index 6d4824b..4df568b 100644
--- a/src/QmlControls/QGCSlider.qml
+++ b/src/QmlControls/QGCSlider.qml
@@ -10,47 +10,63 @@
 import QtQuick                  2.3
 import QtQuick.Controls         1.2
 import QtQuick.Controls.Styles  1.4
+import QtQuick.Controls.Private 1.0
 
 import QGroundControl.Palette       1.0
 import QGroundControl.ScreenTools   1.0
-import QtQuick.Controls.Private     1.0
 
 Slider {
-    property var _qgcPal: QGCPalette { colorGroupEnabled: enabled }
+    id:             _root
+    implicitHeight: ScreenTools.implicitSliderHeight
+
+    // Value indicator starts display from center instead of min value
+    property bool indicatorCentered: false
+
+    QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
 
     style: SliderStyle {
         groove: Item {
-            property color fillColor: "#49d"
             anchors.verticalCenter: parent.verticalCenter
-            implicitWidth: Math.round(TextSingleton.implicitHeight * 4.5)
-            implicitHeight: Math.max(6, Math.round(TextSingleton.implicitHeight * 0.3))
+            implicitWidth:  Math.round(ScreenTools.defaultFontPixelHeight * 4.5)
+            implicitHeight: Math.round(ScreenTools.defaultFontPixelHeight * 0.3)
 
             Rectangle {
-                radius: height/2
-                anchors.fill: parent
-                border.width: 1
-                border.color: "#888"
-                gradient: Gradient {
-                    GradientStop { color: "#bbb" ; position: 0 }
-                    GradientStop { color: "#ccc" ; position: 0.6 }
-                    GradientStop { color: "#ccc" ; position: 1 }
-                }
+                radius:         height / 2
+                anchors.fill:   parent
+                color:          qgcPal.button
+                border.width:   1
+                border.color:   qgcPal.buttonText
             }
 
             Item {
-                clip: true
-                width: styleData.handlePosition
+                clip:   true
+                x:      _root.indicatorCentered ? indicatorCenteredIndicatorStart : 0
+                width:  _root.indicatorCentered ? centerIndicatorWidth : styleData.handlePosition
                 height: parent.height
+
+                property real indicatorCenteredIndicatorStart:   Math.min(styleData.handlePosition, parent.width / 2)
+                property real indicatorCenteredIndicatorStop:    Math.max(styleData.handlePosition, parent.width / 2)
+                property real centerIndicatorWidth:     indicatorCenteredIndicatorStop - indicatorCenteredIndicatorStart
+
                 Rectangle {
-                    anchors.fill: parent
-                    border.color: Qt.darker(fillColor, 1.2)
-                    radius: height/2
-                    gradient: Gradient {
-                        GradientStop {color: Qt.lighter(fillColor, 1.3)  ; position: 0}
-                        GradientStop {color: fillColor ; position: 1.4}
-                    }
+                    anchors.fill:   parent
+                    color:          qgcPal.colorBlue
+                    border.color:   Qt.darker(color, 1.2)
+                    radius:         height/2
                 }
             }
         }
+
+        handle: Rectangle {
+            anchors.centerIn: parent
+            color:          qgcPal.button
+            border.color:   qgcPal.buttonText
+            border.width:   1
+            implicitWidth:  _radius * 2
+            implicitHeight: _radius * 2
+            radius:         _radius
+
+            property real _radius: Math.round(ScreenTools.defaultFontPixelHeight * 0.75)
+        }
     }
 }
diff --git a/src/QmlControls/ScreenTools.qml b/src/QmlControls/ScreenTools.qml
index c2085e4..4fd7bd4 100644
--- a/src/QmlControls/ScreenTools.qml
+++ b/src/QmlControls/ScreenTools.qml
@@ -70,6 +70,7 @@ Item {
     property real implicitTextFieldHeight:  Math.round(defaultFontPixelHeight * (isMobile ? 2.0 : 1.6))
     property real implicitComboBoxHeight:   Math.round(defaultFontPixelHeight * (isMobile ? 2.0 : 1.6))
     property real implicitComboBoxWidth:    Math.round(defaultFontPixelWidth *  (isMobile ? 7.0 : 5.0))
+    property real implicitSliderHeight:     isMobile ? Math.Max(defaultFontPixelHeight, minTouchPixels) : defaultFontPixelHeight
 
     readonly property string normalFontFamily:      "opensans"
     readonly property string demiboldFontFamily:    "opensans-demibold"
diff --git a/src/QmlControls/SliderSwitch.qml b/src/QmlControls/SliderSwitch.qml
index b51a6b1..6485723 100644
--- a/src/QmlControls/SliderSwitch.qml
+++ b/src/QmlControls/SliderSwitch.qml
@@ -7,11 +7,11 @@ import QGroundControl.Palette       1.0
 /// The SliderSwitch control implements a sliding switch control similar to the power off
 /// control on an iPhone.
 Rectangle {
-    id:     _root
-    width:  label.contentWidth + (_diameter * 2.5) + (_border * 4)
-    height: Math.max(ScreenTools.isMobile ? ScreenTools.minTouchPixels : 0, label.height * 2.5)
-    radius: height /2
-    color:  qgcPal.window
+    id:             _root
+    implicitWidth:  label.contentWidth + (_diameter * 2.5) + (_border * 4)
+    implicitHeight: Math.max(ScreenTools.isMobile ? ScreenTools.minTouchPixels : 0, label.height * 2.5)
+    radius:         height /2
+    color:          qgcPal.window
 
     signal accept   ///< Action confirmed
     signal reject   ///< Action rejected
@@ -28,7 +28,7 @@ Rectangle {
         id:                         label
         anchors.horizontalCenter:   parent.horizontalCenter
         anchors.verticalCenter:     parent.verticalCenter
-        text:                       qsTr("Slide to %1").arg(confirmText)
+        text:                       confirmText
     }
 
     Rectangle {
diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc
index 00b310a..000cb52 100644
--- a/src/Vehicle/Vehicle.cc
+++ b/src/Vehicle/Vehicle.cc
@@ -1985,13 +1985,13 @@ void Vehicle::guidedModeGotoLocation(const QGeoCoordinate& gotoCoord)
     _firmwarePlugin->guidedModeGotoLocation(this, gotoCoord);
 }
 
-void Vehicle::guidedModeChangeAltitude(double altitudeRel)
+void Vehicle::guidedModeChangeAltitude(double altitudeChange)
 {
     if (!guidedModeSupported()) {
         qgcApp()->showMessage(guided_mode_not_supported_by_vehicle);
         return;
     }
-    _firmwarePlugin->guidedModeChangeAltitude(this, altitudeRel);
+    _firmwarePlugin->guidedModeChangeAltitude(this, altitudeChange);
 }
 
 void Vehicle::guidedModeOrbit(const QGeoCoordinate& centerCoord, double radius, double velocity, double altitude)
@@ -2397,11 +2397,21 @@ QString Vehicle::missionFlightMode(void) const
     return _firmwarePlugin->missionFlightMode();
 }
 
+QString Vehicle::pauseFlightMode(void) const
+{
+    return _firmwarePlugin->pauseFlightMode();
+}
+
 QString Vehicle::rtlFlightMode(void) const
 {
     return _firmwarePlugin->rtlFlightMode();
 }
 
+QString Vehicle::landFlightMode(void) const
+{
+    return _firmwarePlugin->landFlightMode();
+}
+
 QString Vehicle::takeControlFlightMode(void) const
 {
     return _firmwarePlugin->takeControlFlightMode();
diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h
index ab94811..27ac3ec 100644
--- a/src/Vehicle/Vehicle.h
+++ b/src/Vehicle/Vehicle.h
@@ -294,7 +294,9 @@ public:
     Q_PROPERTY(QString              brandImageOutdoor       READ brandImageOutdoor                                      NOTIFY firmwareTypeChanged)
     Q_PROPERTY(QStringList          unhealthySensors        READ unhealthySensors                                       NOTIFY unhealthySensorsChanged)
     Q_PROPERTY(QString              missionFlightMode       READ missionFlightMode                                      CONSTANT)
+    Q_PROPERTY(QString              pauseFlightMode         READ pauseFlightMode                                        CONSTANT)
     Q_PROPERTY(QString              rtlFlightMode           READ rtlFlightMode                                          CONSTANT)
+    Q_PROPERTY(QString              landFlightMode          READ landFlightMode                                         CONSTANT)
     Q_PROPERTY(QString              takeControlFlightMode   READ takeControlFlightMode                                  CONSTANT)
     Q_PROPERTY(QString              firmwareTypeString      READ firmwareTypeString                                     NOTIFY firmwareTypeChanged)
     Q_PROPERTY(QString              vehicleTypeString       READ vehicleTypeString                                      NOTIFY vehicleTypeChanged)
@@ -384,8 +386,9 @@ public:
     /// Command vehicle to move to specified location (altitude is included and relative)
     Q_INVOKABLE void guidedModeGotoLocation(const QGeoCoordinate& gotoCoord);
 
-    /// Command vehicle to change to the specified relatice altitude
-    Q_INVOKABLE void guidedModeChangeAltitude(double altitudeRel);
+    /// Command vehicle to change altitude
+    ///     @param altitudeChange If > 0, go up by amount specified, if < 0, go down by amount specified
+    Q_INVOKABLE void guidedModeChangeAltitude(double altitudeChange);
 
     /// Command vehicle to orbit given center point
     ///     @param centerCoord Center Coordinates
@@ -575,7 +578,9 @@ public:
     QString         brandImageOutdoor       () const;
     QStringList     unhealthySensors        () const;
     QString         missionFlightMode       () const;
+    QString         pauseFlightMode         () const;
     QString         rtlFlightMode           () const;
+    QString         landFlightMode          () const;
     QString         takeControlFlightMode   () const;
     double          defaultCruiseSpeed      () const { return _defaultCruiseSpeed; }
     double          defaultHoverSpeed       () const { return _defaultHoverSpeed; }