diff --git a/src/QtLocationPlugin/EsriMapProvider.cpp b/src/QtLocationPlugin/EsriMapProvider.cpp
new file mode 100644
index 0000000..86a29c8
--- /dev/null
+++ b/src/QtLocationPlugin/EsriMapProvider.cpp
@@ -0,0 +1,61 @@
+#include "EsriMapProvider.h"
+#include "QGCApplication.h"
+#include "QGCMapEngine.h"
+#include "SettingsManager.h"
+
+QNetworkRequest
+EsriMapProvider::getTileURL(int x, int y, int zoom,
+                            QNetworkAccessManager* networkManager) {
+    //-- Build URL
+    QNetworkRequest request;
+    QString         url = _getURL(x, y, zoom, networkManager);
+    if (url.isEmpty()) {
+        return request;
+    }
+    request.setUrl(QUrl(url));
+    request.setRawHeader("Accept", "*/*");
+    QByteArray token = qgcApp()
+                           ->toolbox()
+                           ->settingsManager()
+                           ->appSettings()
+                           ->esriToken()
+                           ->rawValue()
+                           .toString()
+                           .toLatin1();
+    request.setRawHeader("User-Agent",
+                         QByteArrayLiteral("Qt Location based application"));
+    request.setRawHeader("User-Token", token);
+    return request;
+}
+
+QString
+EsriWorldStreetMapProvider::_getURL(int x, int y, int zoom,
+                                    QNetworkAccessManager* networkManager) {
+    Q_UNUSED(networkManager);
+    return QString("http://services.arcgisonline.com/ArcGIS/rest/services/"
+                   "World_Street_Map/MapServer/tile/%1/%2/%3")
+        .arg(zoom)
+        .arg(y)
+        .arg(x);
+}
+
+QString
+EsriWorldSatelliteMapProvider::_getURL(int x, int y, int zoom,
+                                       QNetworkAccessManager* networkManager) {
+    Q_UNUSED(networkManager);
+    return QString("http://server.arcgisonline.com/ArcGIS/rest/"
+                   "services/World_Imagery/MapServer/tile/%1/%2/%3")
+        .arg(zoom)
+        .arg(y)
+        .arg(x);
+}
+
+QString EsriTerrainMapProvider::_getURL(int x, int y, int zoom,
+                                        QNetworkAccessManager* networkManager) {
+    Q_UNUSED(networkManager);
+    return QString("http://server.arcgisonline.com/ArcGIS/rest/services/"
+                   "World_Terrain_Base/MapServer/tile/%1/%2/%3")
+        .arg(zoom)
+        .arg(y)
+        .arg(x);
+}
diff --git a/src/QtLocationPlugin/EsriMapProvider.h b/src/QtLocationPlugin/EsriMapProvider.h
new file mode 100644
index 0000000..bc703cc
--- /dev/null
+++ b/src/QtLocationPlugin/EsriMapProvider.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "MapProvider.h"
+
+#include <QByteArray>
+#include <QMutex>
+#include <QNetworkProxy>
+#include <QNetworkReply>
+#include <QPoint>
+#include <QString>
+
+class EsriMapProvider : public MapProvider {
+    Q_OBJECT
+  public:
+    using MapProvider::MapProvider;
+
+    QNetworkRequest getTileURL(int x, int y, int zoom,
+                               QNetworkAccessManager* networkManager);
+};
+
+class EsriWorldStreetMapProvider : public EsriMapProvider {
+    Q_OBJECT
+  public:
+    EsriWorldStreetMapProvider(QObject* parent)
+        : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE,
+                          QGeoMapType::StreetMap, parent) {}
+    QString _getURL(int x, int y, int zoom,
+                    QNetworkAccessManager* networkManager);
+};
+
+class EsriWorldSatelliteMapProvider : public EsriMapProvider {
+    Q_OBJECT
+  public:
+    EsriWorldSatelliteMapProvider(QObject* parent)
+        : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE,
+                          QGeoMapType::SatelliteMapDay, parent) {}
+    QString _getURL(int x, int y, int zoom,
+                    QNetworkAccessManager* networkManager);
+};
+
+class EsriTerrainMapProvider : public EsriMapProvider {
+    Q_OBJECT
+  public:
+    EsriTerrainMapProvider(QObject* parent)
+        : EsriMapProvider(QString(""), QString(""), AVERAGE_TILE_SIZE,
+                          QGeoMapType::TerrainMap, parent) {}
+    QString _getURL(int x, int y, int zoom,
+                    QNetworkAccessManager* networkManager);
+};
diff --git a/src/QtLocationPlugin/StatkartMapProvider.cpp b/src/QtLocationPlugin/GenericMapProvider.cpp
similarity index 50%
rename from src/QtLocationPlugin/StatkartMapProvider.cpp
rename to src/QtLocationPlugin/GenericMapProvider.cpp
index ce7e44e..6dfbdc5 100644
--- a/src/QtLocationPlugin/StatkartMapProvider.cpp
+++ b/src/QtLocationPlugin/GenericMapProvider.cpp
@@ -1,15 +1,5 @@
-#include "StatkartMapProvider.h"
-#if defined(DEBUG_GOOGLE_MAPS)
-#include <QFile>
-#include <QStandardPaths>
-#endif
 #include "QGCMapEngine.h"
-
-StatkartMapProvider::StatkartMapProvider(QObject* parent)
-    : MapProvider(QString("https://www.norgeskart.no/"), QString("png"),
-                  AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {}
-
-StatkartMapProvider::~StatkartMapProvider() {}
+#include "GenericMapProvider.h"
 
 QString StatkartMapProvider::_getURL(int x, int y, int zoom,
                                      QNetworkAccessManager* networkManager) {
@@ -21,3 +11,12 @@ QString StatkartMapProvider::_getURL(int x, int y, int zoom,
         .arg(y);
 }
 
+QString EniroMapProvider::_getURL(int x, int y, int zoom,
+                                  QNetworkAccessManager* networkManager) {
+    Q_UNUSED(networkManager);
+    return QString("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/"
+                   "%2/%3.png")
+        .arg(zoom)
+        .arg(x)
+        .arg((1 << zoom) - 1 - y);
+}
diff --git a/src/QtLocationPlugin/GenericMapProvider.h b/src/QtLocationPlugin/GenericMapProvider.h
new file mode 100644
index 0000000..7750420
--- /dev/null
+++ b/src/QtLocationPlugin/GenericMapProvider.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include "MapProvider.h"
+
+#include <QByteArray>
+#include <QMutex>
+#include <QNetworkProxy>
+#include <QNetworkReply>
+#include <QPoint>
+#include <QString>
+
+class StatkartMapProvider : public MapProvider {
+    Q_OBJECT
+  public:
+    StatkartMapProvider(QObject* parent)
+        : MapProvider(QString("https://www.norgeskart.no/"), QString("png"),
+                      AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {}
+
+    QString _getURL(int x, int y, int zoom,
+                    QNetworkAccessManager* networkManager);
+};
+
+class EniroMapProvider : public MapProvider {
+    Q_OBJECT
+  public:
+    EniroMapProvider(QObject* parent)
+        : MapProvider(QString("https://www.eniro.se/"), QString("png"),
+                      AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {}
+
+    QString _getURL(int x, int y, int zoom,
+                    QNetworkAccessManager* networkManager);
+};
diff --git a/src/QtLocationPlugin/MapProvider.h b/src/QtLocationPlugin/MapProvider.h
index b37baab..b92ab6d 100644
--- a/src/QtLocationPlugin/MapProvider.h
+++ b/src/QtLocationPlugin/MapProvider.h
@@ -11,37 +11,37 @@ static const unsigned char pngSignature[]  = {0x89, 0x50, 0x4E, 0x47, 0x0D,
 static const unsigned char jpegSignature[] = {0xFF, 0xD8, 0xFF, 0x00};
 static const unsigned char gifSignature[]  = {0x47, 0x49, 0x46, 0x38, 0x00};
 
-const quint32 AVERAGE_MAPBOX_SAT_MAP    = 15739;
-const quint32 AVERAGE_MAPBOX_STREET_MAP = 5648;
-const quint32 AVERAGE_TILE_SIZE         = 13652;
-const quint32 AVERAGE_AIRMAP_ELEV_SIZE  = 2786;
+const quint32 AVERAGE_MAPBOX_SAT_MAP     = 15739;
+const quint32 AVERAGE_MAPBOX_STREET_MAP  = 5648;
+const quint32 AVERAGE_TILE_SIZE          = 13652;
+const quint32 AVERAGE_AIRMAP_ELEV_SIZE   = 2786;
 
 class MapProvider : public QObject {
     Q_OBJECT
   public:
-    MapProvider(QString referrer, QString imageFormat, quint32 averageSize,
-                QGeoMapType::MapStyle _mapType = QGeoMapType::CustomMap,
-                QObject*              parent   = nullptr);
+    MapProvider(
+        QString referrer, QString imageFormat, quint32 averageSize,
+        QGeoMapType::MapStyle _mapType = QGeoMapType::CustomMap, QObject* parent = nullptr);
 
     QNetworkRequest getTileURL(int x, int y, int zoom,
                                QNetworkAccessManager* networkManager);
 
     QString getImageFormat(const QByteArray& image);
 
-    quint32 getAverageSize() { return _averageSize; }
+    quint32 getAverageSize(){return _averageSize;}
 
-    QGeoMapType::MapStyle getMapStyle() { return _mapType; }
+    QGeoMapType::MapStyle getMapStyle(){return _mapType;}
 
   protected:
     QString _tileXYToQuadKey(int tileX, int tileY, int levelOfDetail);
     int     _getServerNum(int x, int y, int max);
 
     // Define Referrer for Request RawHeader
-    QString               _referrer;
-    QString               _imageFormat;
-    quint32               _averageSize;
-    QByteArray            _userAgent;
-    QString               _language;
+    QString     _referrer;
+    QString     _imageFormat;
+    quint32     _averageSize;
+    QByteArray  _userAgent;
+    QString     _language;
     QGeoMapType::MapStyle _mapType;
 
     // Define the url to Request
diff --git a/src/QtLocationPlugin/QGCLocationPlugin.pri b/src/QtLocationPlugin/QGCLocationPlugin.pri
index 7ce81a9..b72b5a3 100644
--- a/src/QtLocationPlugin/QGCLocationPlugin.pri
+++ b/src/QtLocationPlugin/QGCLocationPlugin.pri
@@ -25,7 +25,8 @@ HEADERS += \
     $$PWD/MapProvider.h \
     $$PWD/GoogleMapProvider.h \
     $$PWD/BingMapProvider.h \
-    $$PWD/StatkartMapProvider.h \
+    $$PWD/GenericMapProvider.h \
+    $$PWD/EsriMapProvider.h \
 
 SOURCES += \
     $$PWD/QGCMapEngine.cpp \
@@ -41,7 +42,8 @@ SOURCES += \
     $$PWD/MapProvider.cpp \
     $$PWD/GoogleMapProvider.cpp \
     $$PWD/BingMapProvider.cpp \
-    $$PWD/StatkartMapProvider.cpp \
+    $$PWD/GenericMapProvider.cpp \
+    $$PWD/EsriMapProvider.cpp \
 
 OTHER_FILES += \
     $$PWD/qgc_maps_plugin.json
diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp
index 7bce34f..64bff2e 100644
--- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp
+++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp
@@ -37,19 +37,27 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) {
     // BingMaps
     //_versionBingMaps             = "563";
 
-    // Warning : in _providersTable, keys needs to follow this format : "Provider Type"
+    // Warning : in _providersTable, keys needs to follow this format :
+    // "Provider Type"
 #ifndef QGC_NO_GOOGLE_MAPS
     _providersTable["Google Street Map"] = new GoogleStreetMapProvider(this);
-    _providersTable["Google Satellite"]   = new GoogleSatelliteMapProvider(this);
-    _providersTable["Google Terrain"]   = new GoogleTerrainMapProvider(this);
-    _providersTable["Google Labels"]   = new GoogleTerrainMapProvider(this);
+    _providersTable["Google Satellite"]  = new GoogleSatelliteMapProvider(this);
+    _providersTable["Google Terrain"]    = new GoogleTerrainMapProvider(this);
+    _providersTable["Google Labels"]     = new GoogleTerrainMapProvider(this);
 #endif
 
     _providersTable["Bing Road"]      = new BingRoadMapProvider(this);
     _providersTable["Bing Satellite"] = new BingSatelliteMapProvider(this);
     _providersTable["Bing Hybrid"]    = new BingHybridMapProvider(this);
 
-    _providersTable["Statkart Topo"]    = new StatkartMapProvider(this);
+    _providersTable["Statkart Topo"] = new StatkartMapProvider(this);
+
+    _providersTable["Eniro Topo"] = new EniroMapProvider(this);
+
+    // To be add later on Token entry !
+    //_providersTable["Esri World Street"] = new EsriWorldStreetMapProvider(this);
+    //_providersTable["Esri World Satellite"] = new EsriWorldSatelliteMapProvider(this);
+    //_providersTable["Esri Terrain"] = new EsriTerrainMapProvider(this);
 }
 
 void UrlFactory::registerProvider(QString name, MapProvider* provider) {
@@ -219,7 +227,6 @@ UrlFactory::_getURL(QString type, int x, int y, int zoom, QNetworkAccessManager*
     break;
     case EniroTopo:
     {
-    	return QString("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/%2/%3.png").arg(zoom).arg(x).arg((1<<zoom)-1-y);
     }
     break;
     /*
@@ -274,11 +281,6 @@ UrlFactory::_getURL(QString type, int x, int y, int zoom, QNetworkAccessManager*
     break;
     */
     case EsriWorldStreet:
-        return QString("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x);
-    case EsriWorldSatellite:
-        return QString("http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x);
-    case EsriTerrain:
-        return QString("http://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/%1/%2/%3").arg(zoom).arg(y).arg(x);
 
     case MapboxStreets:
     case MapboxLight:
diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h
index 541a151..858e833 100644
--- a/src/QtLocationPlugin/QGCMapUrlEngine.h
+++ b/src/QtLocationPlugin/QGCMapUrlEngine.h
@@ -18,7 +18,8 @@
 
 #include "GoogleMapProvider.h"
 #include "BingMapProvider.h"
-#include "StatkartMapProvider.h"
+#include "GenericMapProvider.h"
+#include "EsriMapProvider.h"
 
 #define MAX_MAP_ZOOM (20.0)
 
diff --git a/src/QtLocationPlugin/StatkartMapProvider.h b/src/QtLocationPlugin/StatkartMapProvider.h
deleted file mode 100644
index 4c2cc25..0000000
--- a/src/QtLocationPlugin/StatkartMapProvider.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#pragma once
-
-#include "MapProvider.h"
-
-#include <QByteArray>
-#include <QMutex>
-#include <QNetworkProxy>
-#include <QNetworkReply>
-#include <QPoint>
-#include <QString>
-
-class StatkartMapProvider : public MapProvider {
-
-    Q_OBJECT
-  public:
-    StatkartMapProvider(QObject* parent);
-    ~StatkartMapProvider();
-
-  protected:
-    QString _getURL(int x, int y, int zoom,
-                    QNetworkAccessManager* networkManager);
-};
-