diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index 99a7e3278cd60980a7ae0504a6d35d90ad7a8c16..083cd9f419e3e90d93baa55c44bcf5ef9087d17f 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -443,7 +443,6 @@ HEADERS += \
     src/CmdLineOptParser.h \
     src/FirmwarePlugin/PX4/px4_custom_mode.h \
     src/FlightDisplay/VideoManager.h \
-    src/FlightMap/FlightMapSettings.h \
     src/FlightMap/Widgets/ValuesWidgetController.h \
     src/FollowMe/FollowMe.h \
     src/GAudioOutput.h \
@@ -502,6 +501,7 @@ HEADERS += \
     src/QtLocationPlugin/QMLControl/QGCMapEngineManager.h \
     src/Settings/AppSettings.h \
     src/Settings/AutoConnectSettings.h \
+    src/Settings/FlightMapSettings.h \
     src/Settings/SettingsGroup.h \
     src/Settings/SettingsManager.h \
     src/Settings/UnitsSettings.h \
@@ -622,7 +622,6 @@ SOURCES += \
     src/AnalyzeView/ExifParser.cc \
     src/CmdLineOptParser.cc \
     src/FlightDisplay/VideoManager.cc \
-    src/FlightMap/FlightMapSettings.cc \
     src/FlightMap/Widgets/ValuesWidgetController.cc \
     src/FollowMe/FollowMe.cc \
     src/GAudioOutput.cc \
@@ -678,6 +677,7 @@ SOURCES += \
     src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc \
     src/Settings/AppSettings.cc \
     src/Settings/AutoConnectSettings.cc \
+    src/Settings/FlightMapSettings.cc \
     src/Settings/SettingsGroup.cc \
     src/Settings/SettingsManager.cc \
     src/Settings/UnitsSettings.cc \
diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index fcdf43b5342f9ec4ea6c9ab54cea42a571d7552a..584a96c04ea8afdfbe86a60c1eb24477672e6657 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -188,6 +188,7 @@
         <file alias="MavCmdInfoVTOL.json">src/MissionManager/MavCmdInfoVTOL.json</file>
         <file alias="App.SettingsGroup.json">src/Settings/App.SettingsGroup.json</file>
         <file alias="AutoConnect.SettingsGroup.json">src/Settings/AutoConnect.SettingsGroup.json</file>
+        <file alias="FlightMap.SettingsGroup.json">src/Settings/FlightMap.SettingsGroup.json</file>
         <file alias="Survey.SettingsGroup.json">src/MissionManager/Survey.SettingsGroup.json</file>
         <file alias="Units.SettingsGroup.json">src/Settings/Units.SettingsGroup.json</file>
         <file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
diff --git a/src/FlightDisplay/FlightDisplayViewMap.qml b/src/FlightDisplay/FlightDisplayViewMap.qml
index 14ef37dd2d97efa5ae22e940660d45f62b1bb07a..602b9057eab3b0d881e569775ae52442d27c1ce1 100644
--- a/src/FlightDisplay/FlightDisplayViewMap.qml
+++ b/src/FlightDisplay/FlightDisplayViewMap.qml
@@ -164,7 +164,7 @@ FlightMap {
         color:              qgcPal.window
         title:              qsTr("Fly")
         z:                  QGroundControl.zOrderWidgets
-        buttonVisible:      [ true, true, _showZoom, _showZoom ]
+        buttonVisible:      [ true, _showZoom, _showZoom ]
         maxHeight:          (_flightVideo.visible ? _flightVideo.y : parent.height) - toolStrip.y   // Massive reach across hack
 
         property bool _showZoom: !ScreenTools.isMobile
@@ -175,11 +175,6 @@ FlightMap {
                 iconSource:         "/qmlimages/MapCenter.svg",
                 dropPanelComponent: centerMapDropPanel
             },
-            {
-                name:               "Map",
-                iconSource:         "/qmlimages/MapType.svg",
-                dropPanelComponent: mapTypeDropPanel
-            },
             {
                 name:               "In",
                 iconSource:         "/qmlimages/ZoomPlus.svg"
@@ -229,33 +224,6 @@ FlightMap {
         }
     }
 
-    Component {
-        id: mapTypeDropPanel
-
-        Column {
-            spacing: ScreenTools.defaultFontPixelHeight / 2
-
-            QGCLabel { text: qsTr("Map type:") }
-            Row {
-                spacing: ScreenTools.defaultFontPixelWidth
-                Repeater {
-                    model: QGroundControl.flightMapSettings.mapTypes
-
-                    QGCButton {
-                        checkable:      true
-                        checked:        QGroundControl.flightMapSettings.mapType === text
-                        text:           modelData
-                        exclusiveGroup: _mapTypeButtonsExclusiveGroup
-                        onClicked: {
-                            QGroundControl.flightMapSettings.mapType = text
-                            dropPanel.hide()
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     // Add trajectory points to the map
     MapItemView {
         model: _mainIsMap ? _activeVehicle ? _activeVehicle.trajectoryPoints : 0 : 0
diff --git a/src/FlightMap/FlightMap.qml b/src/FlightMap/FlightMap.qml
index 5f689620edb87cb225fc4cbcac3d865351f51f08..af6aed338dc4153ba9f2d1959b2ed971dabffd56 100644
--- a/src/FlightMap/FlightMap.qml
+++ b/src/FlightMap/FlightMap.qml
@@ -85,7 +85,8 @@ Map {
     }
 
     function updateActiveMapType() {
-        var fullMapName = QGroundControl.flightMapSettings.mapProvider + " " + QGroundControl.flightMapSettings.mapType
+        var settings =  QGroundControl.settingsManager.flightMapSettings
+        var fullMapName = settings.mapProvider.enumStringValue + " " + settings.mapType.enumStringValue
         for (var i = 0; i < _map.supportedMapTypes.length; i++) {
             if (fullMapName === _map.supportedMapTypes[i].name) {
                 _map.activeMapType = _map.supportedMapTypes[i]
@@ -97,8 +98,13 @@ Map {
     Component.onCompleted: updateActiveMapType()
 
     Connections {
-        target:             QGroundControl.flightMapSettings
-        onMapTypeChanged:   updateActiveMapType()
+        target:             QGroundControl.settingsManager.flightMapSettings.mapType
+        onRawValueChanged:  updateActiveMapType()
+    }
+
+    Connections {
+        target:             QGroundControl.settingsManager.flightMapSettings.mapProvider
+        onRawValueChanged:  updateActiveMapType()
     }
 
     /// Ground Station location
diff --git a/src/FlightMap/FlightMapSettings.cc b/src/FlightMap/FlightMapSettings.cc
deleted file mode 100644
index 462a48fef3fc1c69ec170359f4825118a9906a99..0000000000000000000000000000000000000000
--- a/src/FlightMap/FlightMapSettings.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/****************************************************************************
- *
- *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
- *
- * QGroundControl is licensed according to the terms in the file
- * COPYING.md in the root of the source code directory.
- *
- ****************************************************************************/
-
-
-#include "FlightMapSettings.h"
-
-#include <QSettings>
-#include <QtQml>
-
-const char* FlightMapSettings::_defaultMapProvider      = "Bing";                 // Bing is default since it support full street/satellite/hybrid set
-const char* FlightMapSettings::_settingsGroup           = "FlightMapSettings";
-const char* FlightMapSettings::_mapProviderKey          = "MapProvider";
-const char* FlightMapSettings::_mapTypeKey              = "MapType";
-
-FlightMapSettings::FlightMapSettings(QGCApplication* app)
-    : QGCTool(app)
-    , _mapProvider(_defaultMapProvider)
-{
-}
-
-void FlightMapSettings::setToolbox(QGCToolbox *toolbox)
-{
-    QGCTool::setToolbox(toolbox);
-    qmlRegisterUncreatableType<FlightMapSettings> ("QGroundControl", 1, 0, "FlightMapSetting", "Reference only");
-    _supportedMapProviders << "Bing";
-#ifndef QGC_NO_GOOGLE_MAPS
-    _supportedMapProviders << "Google";
-#endif
-    _supportedMapProviders << "Statkart";
-    _loadSettings();
-}
-
-void FlightMapSettings::_storeSettings(void)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.setValue(_mapProviderKey, _supportedMapProviders.contains(_mapProvider) ? _mapProvider : _defaultMapProvider);
-}
-
-void FlightMapSettings::_loadSettings(void)
-{
-#ifdef QGC_NO_GOOGLE_MAPS
-    _mapProvider = _defaultMapProvider;
-#else
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    _mapProvider = settings.value(_mapProviderKey, _defaultMapProvider).toString();
-    if (!_supportedMapProviders.contains(_mapProvider)) {
-        _mapProvider = _defaultMapProvider;
-    }
-#endif
-    _setMapTypesForCurrentProvider();
-}
-
-QString FlightMapSettings::mapProvider(void)
-{
-    return _mapProvider;
-}
-
-void FlightMapSettings::setMapProvider(const QString& mapProvider)
-{
-    if (_supportedMapProviders.contains(mapProvider)) {
-        _mapProvider = mapProvider;
-        _storeSettings();
-        _setMapTypesForCurrentProvider();
-        emit mapProviderChanged(mapProvider);
-    }
-}
-
-void FlightMapSettings::_setMapTypesForCurrentProvider(void)
-{
-    _mapTypes.clear();
-#ifdef QGC_NO_GOOGLE_MAPS
-    _mapTypes << "Street Map" << "Satellite Map" << "Hybrid Map";
-#else
-    if (_mapProvider == "Bing") {
-        _mapTypes << "Street Map" << "Satellite Map" << "Hybrid Map";
-    } else if (_mapProvider == "Google") {
-        _mapTypes << "Street Map" << "Satellite Map" << "Terrain Map";
-    } else if (_mapProvider == "Statkart") {
-        _mapTypes << "Topo2";
-    }
-#endif
-    emit mapTypesChanged(_mapTypes);
-}
-
-QString FlightMapSettings::mapType(void)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(_mapProvider);
-    return settings.value(_mapTypeKey, "Satellite Map").toString();
-}
-
-void FlightMapSettings::setMapType(const QString& mapType)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(_mapProvider);
-    settings.setValue(_mapTypeKey, mapType);
-    emit mapTypeChanged(mapType);
-}
-
-void FlightMapSettings::saveMapSetting (const QString &mapName, const QString& key, const QString& value)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(mapName);
-    settings.setValue(key, value);
-}
-
-QString FlightMapSettings::loadMapSetting (const QString &mapName, const QString& key, const QString& defaultValue)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(mapName);
-    return settings.value(key, defaultValue).toString();
-}
-
-void FlightMapSettings::saveBoolMapSetting (const QString &mapName, const QString& key, bool value)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(mapName);
-    settings.setValue(key, value);
-}
-
-bool FlightMapSettings::loadBoolMapSetting (const QString &mapName, const QString& key, bool defaultValue)
-{
-    QSettings settings;
-    settings.beginGroup(_settingsGroup);
-    settings.beginGroup(mapName);
-    return settings.value(key, defaultValue).toBool();
-}
diff --git a/src/FlightMap/FlightMapSettings.h b/src/FlightMap/FlightMapSettings.h
deleted file mode 100644
index 66e7b396480fe9325b800548923ec464e1463bf8..0000000000000000000000000000000000000000
--- a/src/FlightMap/FlightMapSettings.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/****************************************************************************
- *
- *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
- *
- * QGroundControl is licensed according to the terms in the file
- * COPYING.md in the root of the source code directory.
- *
- ****************************************************************************/
-
-
-#ifndef FlightMapSettings_H
-#define FlightMapSettings_H
-
-#include "QGCToolbox.h"
-
-#include <QObject>
-#include <QStringList>
-
-/*
-  TODO: Map settings should come from QGCMapEngineManager. What is currently in
-  FlightMapSettings should be moved there so all map related funtions are in
-  one place.
- */
-
-class FlightMapSettings : public QGCTool
-{
-    Q_OBJECT
-
-public:
-    FlightMapSettings(QGCApplication* app);
-
-    /// mapProvider is either Bing, Google or Open to specify to set of maps available
-    Q_PROPERTY(QString      mapProvider     READ mapProvider    WRITE setMapProvider    NOTIFY mapProviderChanged)
-
-    /// Map providers
-    Q_PROPERTY(QStringList  mapProviders    READ mapProviders                           CONSTANT)
-
-    /// Map types associated with current map provider
-    Q_PROPERTY(QStringList  mapTypes        MEMBER _mapTypes                            NOTIFY mapTypesChanged)
-
-    /// Map type to be used for all maps
-    Q_PROPERTY(QString      mapType         READ mapType        WRITE setMapType        NOTIFY mapTypeChanged)
-
-    /// Is Google Maps Enabled
-    Q_PROPERTY(bool         googleMapEnabled    READ googleMapEnabled                   CONSTANT)
-
-    Q_INVOKABLE void        saveMapSetting      (const QString &mapName, const QString& key, const QString& value);
-    Q_INVOKABLE QString     loadMapSetting      (const QString &mapName, const QString& key, const QString& defaultValue);
-    Q_INVOKABLE void        saveBoolMapSetting  (const QString &mapName, const QString& key, bool value);
-    Q_INVOKABLE bool        loadBoolMapSetting  (const QString &mapName, const QString& key, bool defaultValue);
-
-    // Property accessors
-
-    QString mapProvider(void);
-    void setMapProvider(const QString& mapProvider);
-
-    QString mapType(void);
-    void setMapType(const QString& mapType);
-
-    // Override from QGCTool
-    virtual void setToolbox(QGCToolbox *toolbox);
-
-    QStringList mapProviders() { return _supportedMapProviders; }
-
-#ifdef QGC_NO_GOOGLE_MAPS
-    bool    googleMapEnabled    () { return false; }
-#else
-    bool    googleMapEnabled    () { return true; }
-#endif
-
-
-signals:
-    void mapProviderChanged (const QString& mapProvider);
-    void mapTypesChanged    (const QStringList& mapTypes);
-    void mapTypeChanged     (const QString& mapType);
-
-private:
-    void    _storeSettings              (void);
-    void    _loadSettings               (void);
-
-    void    _setMapTypesForCurrentProvider(void);
-
-    QString     _mapProvider;               ///< Current map provider
-    QStringList _supportedMapProviders;
-    QStringList _mapTypes;                  ///< Map types associated with current map provider
-
-    static const char* _defaultMapProvider;
-    static const char* _settingsGroup;
-    static const char* _mapProviderKey;
-    static const char* _mapTypeKey;
-};
-
-#endif
diff --git a/src/MissionEditor/MissionEditor.qml b/src/MissionEditor/MissionEditor.qml
index b3ecbf9f71c2d3b8e21651712952fb2b6ac79727..0396eaded3751d36d2352b9a67b4fb10c9f6dfa0 100644
--- a/src/MissionEditor/MissionEditor.qml
+++ b/src/MissionEditor/MissionEditor.qml
@@ -678,11 +678,11 @@ QGCView {
                     color:              qgcPal.window
                     title:              qsTr("Plan")
                     z:                  QGroundControl.zOrderWidgets
-                    showAlternateIcon:  [ false, false, _syncDropDownController.dirty, false, false, false, false ]
-                    rotateImage:        [ false, false, _syncDropDownController.syncInProgress, false, false, false, false ]
-                    animateImage:       [ false, false, _syncDropDownController.dirty, false, false, false, false ]
-                    buttonEnabled:      [ true, true, !_syncDropDownController.syncInProgress, true, true, true, true ]
-                    buttonVisible:      [ true, true, true, true, true, _showZoom, _showZoom ]
+                    showAlternateIcon:  [ false, false, _syncDropDownController.dirty, false, false, false ]
+                    rotateImage:        [ false, false, _syncDropDownController.syncInProgress, false, false, false ]
+                    animateImage:       [ false, false, _syncDropDownController.dirty, false, false, false ]
+                    buttonEnabled:      [ true, true, !_syncDropDownController.syncInProgress, true, true, true ]
+                    buttonVisible:      [ true, true, true, true, _showZoom, _showZoom ]
                     maxHeight:          mapScale.y - toolStrip.y
 
                     property bool _showZoom: !ScreenTools.isMobile
@@ -709,11 +709,6 @@ QGCView {
                             iconSource:         "/qmlimages/MapCenter.svg",
                             dropPanelComponent: centerMapDropPanel
                         },
-                        {
-                            name:               "Map",
-                            iconSource:         "/qmlimages/MapType.svg",
-                            dropPanelComponent: mapTypeDropPanel
-                        },
                         {
                             name:               "In",
                             iconSource:         "/qmlimages/ZoomPlus.svg"
@@ -903,34 +898,6 @@ QGCView {
         }
     }
 
-    Component {
-        id: mapTypeDropPanel
-
-        Column {
-            spacing: _margin
-
-            QGCLabel { text: qsTr("Map type:") }
-            Row {
-                spacing: ScreenTools.defaultFontPixelWidth
-                Repeater {
-                    model: QGroundControl.flightMapSettings.mapTypes
-
-                    QGCButton {
-                        checkable:      true
-                        checked:        QGroundControl.flightMapSettings.mapType === text
-                        text:           modelData
-                        exclusiveGroup: _mapTypeButtonsExclusiveGroup
-
-                        onClicked: {
-                            QGroundControl.flightMapSettings.mapType = text
-                            dropPanel.hide()
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     Component {
         id: patternDropPanel
 
diff --git a/src/QGCToolbox.cc b/src/QGCToolbox.cc
index f67e57bae205a62072ebe9769b9ee3be564c1753..d6371bdf66119a5fb3d565f2a5e26e028d052582 100644
--- a/src/QGCToolbox.cc
+++ b/src/QGCToolbox.cc
@@ -10,7 +10,6 @@
 
 #include "FactSystem.h"
 #include "FirmwarePluginManager.h"
-#include "FlightMapSettings.h"
 #include "GAudioOutput.h"
 #ifndef __mobile__
 #include "GPSManager.h"
@@ -39,7 +38,6 @@ QGCToolbox::QGCToolbox(QGCApplication* app)
     : _audioOutput(NULL)
     , _factSystem(NULL)
     , _firmwarePluginManager(NULL)
-    , _flightMapSettings(NULL)
 #ifndef __mobile__
     , _gpsManager(NULL)
 #endif
@@ -66,7 +64,6 @@ QGCToolbox::QGCToolbox(QGCApplication* app)
     _audioOutput =              new GAudioOutput(app);
     _factSystem =               new FactSystem(app);
     _firmwarePluginManager =    new FirmwarePluginManager(app);
-    _flightMapSettings =        new FlightMapSettings(app);
 #ifndef __mobile__
     _gpsManager =               new GPSManager(app);
 #endif
@@ -93,7 +90,6 @@ void QGCToolbox::setChildToolboxes(void)
     _audioOutput->setToolbox(this);
     _factSystem->setToolbox(this);
     _firmwarePluginManager->setToolbox(this);
-    _flightMapSettings->setToolbox(this);
 #ifndef __mobile__
     _gpsManager->setToolbox(this);
 #endif
@@ -118,7 +114,6 @@ QGCToolbox::~QGCToolbox()
     delete _audioOutput;
     delete _factSystem;
     delete _firmwarePluginManager;
-    delete _flightMapSettings;
     delete _joystickManager;
     delete _linkManager;
     delete _mavlinkProtocol;
diff --git a/src/QGCToolbox.h b/src/QGCToolbox.h
index 762996fd522828ae76db1c10366cbdcc37774427..85d6a615191845c1e77f8466263cbc9b38e24bd4 100644
--- a/src/QGCToolbox.h
+++ b/src/QGCToolbox.h
@@ -15,7 +15,6 @@
 
 class FactSystem;
 class FirmwarePluginManager;
-class FlightMapSettings;
 class GAudioOutput;
 class GPSManager;
 class JoystickManager;
@@ -42,7 +41,6 @@ public:
     ~QGCToolbox();
 
     FirmwarePluginManager*      firmwarePluginManager(void)     { return _firmwarePluginManager; }
-    FlightMapSettings*          flightMapSettings(void)         { return _flightMapSettings; }
     GAudioOutput*               audioOutput(void)               { return _audioOutput; }
     JoystickManager*            joystickManager(void)           { return _joystickManager; }
     LinkManager*                linkManager(void)               { return _linkManager; }
@@ -71,7 +69,6 @@ private:
     GAudioOutput*               _audioOutput;
     FactSystem*                 _factSystem;
     FirmwarePluginManager*      _firmwarePluginManager;
-    FlightMapSettings*          _flightMapSettings;
 #ifndef __mobile__
     GPSManager*                 _gpsManager;
 #endif
diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc
index 9a00807e0d4f8148b1e676b7fa03d2f1b65c4384..7152dde642faf991b02e47fb91f3a93c35bb5591 100644
--- a/src/QmlControls/QGroundControlQmlGlobal.cc
+++ b/src/QmlControls/QGroundControlQmlGlobal.cc
@@ -21,7 +21,6 @@ static const char* kQmlGlobalKeyName = "QGCQml";
 
 QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app)
     : QGCTool(app)
-    , _flightMapSettings(NULL)
     , _linkManager(NULL)
     , _multiVehicleManager(NULL)
     , _mapEngineManager(NULL)
@@ -47,7 +46,6 @@ void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox)
 {
     QGCTool::setToolbox(toolbox);
 
-    _flightMapSettings      = toolbox->flightMapSettings();
     _linkManager            = toolbox->linkManager();
     _multiVehicleManager    = toolbox->multiVehicleManager();
     _mapEngineManager       = toolbox->mapEngineManager();
diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h
index 4f9ea6e82e92d7d9b83f1e1aad7d954ca0cc72d2..0914aaa69ad60da0e5bcf2824a3c5815bac16017 100644
--- a/src/QmlControls/QGroundControlQmlGlobal.h
+++ b/src/QmlControls/QGroundControlQmlGlobal.h
@@ -17,7 +17,6 @@
 #include "QGCToolbox.h"
 #include "QGCApplication.h"
 #include "LinkManager.h"
-#include "FlightMapSettings.h"
 #include "SettingsFact.h"
 #include "FactMetaData.h"
 #include "SimulatedPosition.h"
@@ -39,7 +38,6 @@ public:
 
     Q_PROPERTY(QString              appName             READ appName                CONSTANT)
 
-    Q_PROPERTY(FlightMapSettings*   flightMapSettings   READ flightMapSettings      CONSTANT)
     Q_PROPERTY(LinkManager*         linkManager         READ linkManager            CONSTANT)
     Q_PROPERTY(MultiVehicleManager* multiVehicleManager READ multiVehicleManager    CONSTANT)
     Q_PROPERTY(QGCMapEngineManager* mapEngineManager    READ mapEngineManager       CONSTANT)
@@ -126,7 +124,6 @@ public:
     // Property accesors
 
     QString                 appName             ()  { return qgcApp()->applicationName(); }
-    FlightMapSettings*      flightMapSettings   ()  { return _flightMapSettings; }
     LinkManager*            linkManager         ()  { return _linkManager; }
     MultiVehicleManager*    multiVehicleManager ()  { return _multiVehicleManager; }
     QGCMapEngineManager*    mapEngineManager    ()  { return _mapEngineManager; }
@@ -172,7 +169,6 @@ signals:
     void skipSetupPageChanged           ();
 
 private:
-    FlightMapSettings*      _flightMapSettings;
     LinkManager*            _linkManager;
     MultiVehicleManager*    _multiVehicleManager;
     QGCMapEngineManager*    _mapEngineManager;
diff --git a/src/QtLocationPlugin/QMLControl/OfflineMap.qml b/src/QtLocationPlugin/QMLControl/OfflineMap.qml
index 6fc91a610daff0b2c9884fc8cad0a68a75e41139..5bd45f92ffcf5cdf0b2afb231e18984a22e823f3 100644
--- a/src/QtLocationPlugin/QMLControl/OfflineMap.qml
+++ b/src/QtLocationPlugin/QMLControl/OfflineMap.qml
@@ -31,7 +31,7 @@ QGCView {
 
     property string mapKey:             "lastMapType"
 
-    property string mapType:            QGroundControl.flightMapSettings.mapProvider + " " + QGroundControl.flightMapSettings.mapType
+    property string mapType:            _settings.mapProvider.enumStringValue + " " + _settings.mapType.enumStringValue
     property bool   isMapInteractive:   false
     property var    savedCenter:        undefined
     property real   savedZoom:          3
@@ -47,6 +47,7 @@ QGCView {
 
     property var    _mapAdjustedColor:  _map.isSatelliteMap ? "white" : "black"
     property bool   _tooManyTiles:      QGroundControl.mapEngineManager.tileCount > _maxTilesForDownload
+    property var    _settings:          QGroundControl.settingsManager.flightMapSettings
 
     readonly property real minZoomLevel: 3
     readonly property real maxZoomLevel: 20
@@ -97,7 +98,7 @@ QGCView {
 
     function addNewSet() {
         isMapInteractive = true
-        mapType = QGroundControl.flightMapSettings.mapProvider + " " + QGroundControl.flightMapSettings.mapType
+        mapType = _settings.mapProvider.enumStringValue + " " + _settings.mapType.enumStringValue
         resetMapToDefaults()
         handleChanges()
         _map.visible = true
diff --git a/src/Settings/FlightMap.SettingsGroup.json b/src/Settings/FlightMap.SettingsGroup.json
new file mode 100644
index 0000000000000000000000000000000000000000..f76bf56fde93d407a5752a82c2db19527610e6bc
--- /dev/null
+++ b/src/Settings/FlightMap.SettingsGroup.json
@@ -0,0 +1,18 @@
+[
+{
+    "name":             "MapProvider",
+    "shortDescription": "Currently selected map provider for flight maps",
+    "type":             "uint32",
+    "enumStrings":      "Bing,Google,Statkart",
+    "enumValues":       "0,1,2",
+    "defaultValue":     0
+},
+{
+    "name":             "MapType",
+    "shortDescription": "Currently selected map type for flight maps",
+    "type":             "uint32",
+    "enumStrings":      "Street Map,Satellite Map,Hybrid Map,Terrain Map",
+    "enumValues":       "0,1,2,3",
+    "defaultValue":     2
+}
+]
diff --git a/src/Settings/FlightMapSettings.cc b/src/Settings/FlightMapSettings.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e904f18f2040c4622770e6e8c4cdc1397598fdc7
--- /dev/null
+++ b/src/Settings/FlightMapSettings.cc
@@ -0,0 +1,116 @@
+/****************************************************************************
+ *
+ *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+#include "FlightMapSettings.h"
+
+#include <QQmlEngine>
+#include <QtQml>
+
+const char* FlightMapSettings::flightMapSettingsGroupName =  "FlightMap";
+const char* FlightMapSettings::mapProviderSettingsName =     "MapProvider";
+const char* FlightMapSettings::mapTypeSettingsName =         "MapType";
+const char* FlightMapSettings::_settingsGroupName =          "FlightMap";
+
+FlightMapSettings::FlightMapSettings(QObject* parent)
+    : SettingsGroup(flightMapSettingsGroupName, QString(_settingsGroupName) /* root settings group */, parent)
+    , _mapProviderFact(NULL)
+    , _mapTypeFact(NULL)
+{
+    QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
+    qmlRegisterUncreatableType<FlightMapSettings>("QGroundControl.SettingsManager", 1, 0, "FlightMapSettings", "Reference only");
+
+    // Save the original version since we modify based on map provider
+    _savedMapTypeStrings = _nameToMetaDataMap[mapTypeSettingsName]->enumStrings();
+    _savedMapTypeValues = _nameToMetaDataMap[mapTypeSettingsName]->enumValues();
+
+#ifdef QGC_NO_GOOGLE_MAPS
+    // Find google in the list and remove it
+    FactMetaData* metaData = _nameToMetaDataMap[mapProviderSettingsName];
+    QVariantList enumValues = metaData->enumValues();
+    QStringList enumStrings = metaData->enumStrings();
+    _removeEnumValue(mapProviderGoogle, enumStrings, enumValues);
+    metaData->setEnumInfo(enumStrings, enumValues);
+#endif
+
+    _newMapProvider(mapProvider()->rawValue());
+}
+
+Fact* FlightMapSettings::mapProvider(void)
+{
+    if (!_mapProviderFact) {
+        _mapProviderFact = _createSettingsFact(mapProviderSettingsName);
+        connect(_mapProviderFact, &Fact::rawValueChanged, this, &FlightMapSettings::_newMapProvider);
+    }
+
+    return _mapProviderFact;
+}
+
+Fact* FlightMapSettings::mapType(void)
+{
+    if (!_mapTypeFact) {
+        _mapTypeFact = _createSettingsFact(mapTypeSettingsName);
+    }
+
+    return _mapTypeFact;
+}
+
+void FlightMapSettings::_removeEnumValue(int value, QStringList& enumStrings, QVariantList& enumValues)
+{
+    bool found = false;
+    int removeIndex;
+    for (removeIndex=0; removeIndex<enumValues.count(); removeIndex++) {
+        if (enumValues[removeIndex].toInt() == value) {
+            found = true;
+            break;
+        }
+    }
+
+    if (found) {
+        enumValues.removeAt(removeIndex);
+        enumStrings.removeAt(removeIndex);
+    }
+}
+
+void FlightMapSettings::_newMapProvider(QVariant value)
+{
+    FactMetaData* metaData = _nameToMetaDataMap[mapTypeSettingsName];
+
+    QStringList enumStrings = _savedMapTypeStrings;
+    QVariantList enumValues = _savedMapTypeValues;
+
+    switch (value.toInt()) {
+    case mapProviderBing:
+        _removeEnumValue(mapTypeTerrain, enumStrings, enumValues);
+        break;
+    case mapProviderGoogle:
+        _removeEnumValue(mapTypeHybrid, enumStrings, enumValues);
+        break;
+    case mapProviderStarkart:
+        _removeEnumValue(mapTypeStreet, enumStrings, enumValues);
+        _removeEnumValue(mapTypeSatellite, enumStrings, enumValues);
+        _removeEnumValue(mapTypeHybrid, enumStrings, enumValues);
+        break;
+    }
+    metaData->setEnumInfo(enumStrings, enumValues);
+    emit mapTypeChanged();
+
+    // Check that map type is still valid for this new map provider
+
+    bool found = false;
+    int currentMapType = mapType()->rawValue().toInt();
+    for (int i=0; i<enumValues.count(); i++) {
+        if (currentMapType == enumValues[i].toInt()) {
+            found = true;
+            break;
+        }
+    }
+    if (!found) {
+        mapType()->setRawValue(0);
+    }
+}
diff --git a/src/Settings/FlightMapSettings.h b/src/Settings/FlightMapSettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..85c7ea623fea78176da862a6054c5600baca50b3
--- /dev/null
+++ b/src/Settings/FlightMapSettings.h
@@ -0,0 +1,64 @@
+/****************************************************************************
+ *
+ *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+#ifndef FlightMapSettings_H
+#define FlightMapSettings_H
+
+#include "SettingsGroup.h"
+
+class FlightMapSettings : public SettingsGroup
+{
+    Q_OBJECT
+
+public:
+    FlightMapSettings(QObject* parent = NULL);
+
+    // This enum must match the json meta data
+    typedef enum {
+        mapProviderBing,
+        mapProviderGoogle,
+        mapProviderStarkart
+    } MapProvider_t;
+
+    // This enum must match the json meta data
+    typedef enum {
+        mapTypeStreet,
+        mapTypeSatellite,
+        mapTypeHybrid,
+        mapTypeTerrain
+    } MapType_t;
+
+    Q_PROPERTY(Fact* mapProvider     READ mapProvider   CONSTANT)               ///< Currently selected map provider
+    Q_PROPERTY(Fact* mapType         READ mapType       NOTIFY mapTypeChanged)  ///< Current selected map type
+
+    Fact* mapProvider   (void);
+    Fact* mapType       (void);
+
+    static const char* flightMapSettingsGroupName;
+    static const char* mapProviderSettingsName;
+    static const char* mapTypeSettingsName;
+
+signals:
+    void mapTypeChanged(void);
+
+private slots:
+    void _newMapProvider(QVariant value);
+
+private:
+    void _removeEnumValue(int value, QStringList& enumStrings, QVariantList& enumValues);
+
+    SettingsFact*   _mapProviderFact;
+    SettingsFact*   _mapTypeFact;
+    QStringList     _savedMapTypeStrings;
+    QVariantList    _savedMapTypeValues;
+
+    static const char* _settingsGroupName;
+};
+
+#endif
diff --git a/src/Settings/SettingsManager.cc b/src/Settings/SettingsManager.cc
index 226976f28e2d7b9ca33940b211a483fa2739d4f9..11f913e8b9f6845a2f4a1c019042b86d85405266 100644
--- a/src/Settings/SettingsManager.cc
+++ b/src/Settings/SettingsManager.cc
@@ -18,6 +18,7 @@ SettingsManager::SettingsManager(QGCApplication* app)
     , _unitsSettings(NULL)
     , _autoConnectSettings(NULL)
     , _videoSettings(NULL)
+    , _flightMapSettings(NULL)
 {
 
 }
@@ -32,4 +33,5 @@ void SettingsManager::setToolbox(QGCToolbox *toolbox)
     _appSettings =          new AppSettings(this);
     _autoConnectSettings =  new AutoConnectSettings(this);
     _videoSettings =        new VideoSettings(this);
+    _flightMapSettings =    new FlightMapSettings(this);
 }
diff --git a/src/Settings/SettingsManager.h b/src/Settings/SettingsManager.h
index 40e67555c4a1881ec96c3a2b2a8de5c1e2c690ff..ec65d9bd13762d20c48f711828ec96e4fe2812f3 100644
--- a/src/Settings/SettingsManager.h
+++ b/src/Settings/SettingsManager.h
@@ -18,6 +18,7 @@
 #include "UnitsSettings.h"
 #include "AutoConnectSettings.h"
 #include "VideoSettings.h"
+#include "FlightMapSettings.h"
 
 #include <QVariantList>
 
@@ -33,6 +34,7 @@ public:
     Q_PROPERTY(QObject* unitsSettings       READ unitsSettings          CONSTANT)
     Q_PROPERTY(QObject* autoConnectSettings READ autoConnectSettings    CONSTANT)
     Q_PROPERTY(QObject* videoSettings       READ videoSettings          CONSTANT)
+    Q_PROPERTY(QObject* flightMapSettings   READ flightMapSettings      CONSTANT)
 
     // Override from QGCTool
     virtual void setToolbox(QGCToolbox *toolbox);
@@ -41,12 +43,14 @@ public:
     UnitsSettings*          unitsSettings       (void) { return _unitsSettings; }
     AutoConnectSettings*    autoConnectSettings (void) { return _autoConnectSettings; }
     VideoSettings*          videoSettings       (void) { return _videoSettings; }
+    FlightMapSettings*      flightMapSettings   (void) { return _flightMapSettings; }
 
 private:
     AppSettings*            _appSettings;
     UnitsSettings*          _unitsSettings;
     AutoConnectSettings*    _autoConnectSettings;
     VideoSettings*          _videoSettings;
+    FlightMapSettings*      _flightMapSettings;
 };
 
 #endif
diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml
index 6ca4a16c84d07b2a40fb434c2757d26db357990f..0d6e9ac31230a80df1dce7607fdf3f7971c75428 100644
--- a/src/ui/preferences/GeneralSettings.qml
+++ b/src/ui/preferences/GeneralSettings.qml
@@ -39,6 +39,8 @@ QGCView {
     property real _editFieldWidth:              ScreenTools.defaultFontPixelWidth * 30
     property Fact _telemPath:                   QGroundControl.settingsManager.appSettings.telemetrySavePath
     property Fact _videoPath:                   QGroundControl.settingsManager.videoSettings.videoSavePath
+    property Fact _mapProvider:                 QGroundControl.settingsManager.flightMapSettings.mapProvider
+    property Fact _mapType:                     QGroundControl.settingsManager.flightMapSettings.mapType
 
     readonly property string _requiresRestart:  qsTr("(Requires Restart)")
 
@@ -375,39 +377,49 @@ QGCView {
                                 }
                             }
                         }
+
                         //-----------------------------------------------------------------
-                        //-- Map Providers
+                        //-- Map Provider
                         Row {
-                            /*
-                              TODO: Map settings should come from QGroundControl.mapEngineManager. What is currently in
-                              QGroundControl.flightMapSettings should be moved there so all map related funtions are in
-                              one place.
-                             */
                             spacing:    ScreenTools.defaultFontPixelWidth
-                            visible:    QGroundControl.flightMapSettings.googleMapEnabled
+                            visible:    _mapProvider.visible
+
                             QGCLabel {
-                                id:                 mapProvidersLabel
                                 anchors.baseline:   mapProviders.baseline
                                 text:               qsTr("Map Provider:")
                                 width:              _labelWidth
                             }
-                            QGCComboBox {
-                                id:                 mapProviders
-                                width:              _editFieldWidth
-                                model:              QGroundControl.flightMapSettings.mapProviders
-                                Component.onCompleted: {
-                                    var index = mapProviders.find(QGroundControl.flightMapSettings.mapProvider)
-                                    if (index < 0) {
-                                        console.warn(qsTr("Active map provider not in combobox"), QGroundControl.flightMapSettings.mapProvider)
-                                    } else {
-                                        mapProviders.currentIndex = index
-                                    }
-                                }
-                                onActivated: {
-                                    if (index != -1) {
-                                        currentIndex = index
-                                        console.log(qsTr("New map provider: ") + model[index])
-                                        QGroundControl.flightMapSettings.mapProvider = model[index]
+
+                            FactComboBox {
+                                id:         mapProviders
+                                width:      _editFieldWidth
+                                fact:       _mapProvider
+                                indexModel: false
+                            }
+                        }
+
+                        //-----------------------------------------------------------------
+                        //-- Map Type
+                        Row {
+                            spacing:    ScreenTools.defaultFontPixelWidth
+                            visible:    _mapType.visible
+
+                            QGCLabel {
+                                anchors.baseline:   mapTypes.baseline
+                                text:               qsTr("Map Type:")
+                                width:              _labelWidth
+                            }
+
+                            FactComboBox {
+                                id:         mapTypes
+                                width:      _editFieldWidth
+                                fact:       _mapType
+                                indexModel: false
+
+                                Connections {
+                                    target: QGroundControl.settingsManager.flightMapSettings
+                                    onMapTypeChanged: {
+                                        mapTypes.model = _mapType.enumStrings
                                     }
                                 }
                             }