diff --git a/src/location/maps/qgeoserviceprovider.cpp b/src/location/maps/qgeoserviceprovider.cpp
index fef4a82603dfa29f55d58105a8ffe91e46f5bb9e..79e27ff0db5ef0891d8e4cebd32f3564bfabba67 100644
--- a/src/location/maps/qgeoserviceprovider.cpp
+++ b/src/location/maps/qgeoserviceprovider.cpp
@@ -360,7 +360,9 @@ template <> QPlaceManagerEngine *createEngine<QPlaceManagerEngine>(QGeoServicePr
 }
 template <> QNavigationManagerEngine *createEngine<QNavigationManagerEngine>(QGeoServiceProviderPrivate *d_ptr)
 {
-    return d_ptr->factory->createNavigationManagerEngine(d_ptr->cleanedParameterMap, &(d_ptr->placeError), &(d_ptr->placeErrorString));
+    if (!d_ptr->factoryV2)
+        return nullptr;
+    return d_ptr->factoryV2->createNavigationManagerEngine(d_ptr->cleanedParameterMap, &(d_ptr->placeError), &(d_ptr->placeErrorString));
 }
 
 /* Template for generating the code for each of the geocodingManager(),
@@ -656,7 +658,7 @@ void QGeoServiceProviderPrivate::unload()
     delete navigationManager;
     navigationManager = nullptr;
 
-    factory = 0;
+    factory = factoryV2 = nullptr;
     error = QGeoServiceProvider::NoError;
     errorString = QLatin1String("");
     metaData = QJsonObject();
@@ -686,7 +688,7 @@ void QGeoServiceProviderPrivate::filterParameterMap()
 
 void QGeoServiceProviderPrivate::loadMeta()
 {
-    factory = 0;
+    factory = factoryV2 = nullptr;
     metaData = QJsonObject();
     metaData.insert(QStringLiteral("index"), -1);
     error = QGeoServiceProvider::NotSupportedError;
@@ -727,7 +729,7 @@ void QGeoServiceProviderPrivate::loadPlugin(const QVariantMap &parameters)
     if (int(metaData.value(QStringLiteral("index")).toDouble()) < 0) {
         error = QGeoServiceProvider::NotSupportedError;
         errorString = QString(QLatin1String("The geoservices provider is not supported."));
-        factory = 0;
+        factory = factoryV2 = nullptr;
         return;
     }
 
@@ -737,7 +739,9 @@ void QGeoServiceProviderPrivate::loadPlugin(const QVariantMap &parameters)
     int idx = int(metaData.value(QStringLiteral("index")).toDouble());
 
     // load the actual plugin
-    factory = qobject_cast<QGeoServiceProviderFactory *>(loader()->instance(idx));
+    QObject *instance = loader()->instance(idx);
+    factory = qobject_cast<QGeoServiceProviderFactory *>(instance);
+    factoryV2 = qobject_cast<QGeoServiceProviderFactoryV2 *>(instance);
 }
 
 QHash<QString, QJsonObject> QGeoServiceProviderPrivate::plugins(bool reload)
diff --git a/src/location/maps/qgeoserviceprovider_p.h b/src/location/maps/qgeoserviceprovider_p.h
index 1aaa498cda6dce5799ab25b511acaabb2e998370..11b86badb3b71842ef6102bd470c5253796aafb7 100644
--- a/src/location/maps/qgeoserviceprovider_p.h
+++ b/src/location/maps/qgeoserviceprovider_p.h
@@ -62,6 +62,7 @@ class QGeoRoutingManager;
 class QGeoMappingManager;
 
 class QGeoServiceProviderFactory;
+class QGeoServiceProviderFactoryV2;
 
 class QGeoServiceProviderPrivate
 {
@@ -82,6 +83,7 @@ public:
     Flags features(const char *enumName);
 
     QGeoServiceProviderFactory *factory;
+    QGeoServiceProviderFactoryV2 *factoryV2 = nullptr;
     QJsonObject metaData;
 
     QVariantMap parameterMap;
diff --git a/src/location/maps/qgeoserviceproviderfactory.cpp b/src/location/maps/qgeoserviceproviderfactory.cpp
index c8192a32b5e98dd02f7875534cb6b62244c47518..44ed35358a2ca4e14986480d97a47dca4eb39431 100644
--- a/src/location/maps/qgeoserviceproviderfactory.cpp
+++ b/src/location/maps/qgeoserviceproviderfactory.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
     \inmodule QtLocation
     \ingroup QtLocation-impl
     \since 5.6
+    \deprecated
 
     \brief The QGeoServiceProviderFactory class is a factory class used as the
     plugin interface for services related to geographical information.
@@ -52,6 +53,8 @@ QT_BEGIN_NAMESPACE
 
     The other functions should be overridden if the plugin supports the
     associated set of functionality.
+
+    \sa QGeoServiceProviderFactoryV2
 */
 
 /*!
@@ -160,6 +163,28 @@ QPlaceManagerEngine *QGeoServiceProviderFactory::createPlaceManagerEngine(const
     return 0;
 }
 
+/*!
+    \class QGeoServiceProviderFactoryV2
+    \inmodule QtLocation
+    \ingroup QtLocation-impl
+    \since 5.11
+
+    \brief The QGeoServiceProviderFactoryV2 class is a factory class used as the
+    plugin interface for services related to geographical information.
+
+    Implementers must provide a unique combination of providerName() and
+    providerVersion() per plugin.
+
+    The other functions should be overridden if the plugin supports the
+    associated set of functionality.
+*/
+
+/*!
+\fn QGeoServiceProviderFactoryV2::~QGeoServiceProviderFactoryV2()
+
+Destroys this QGeoServiceProviderFactoryV2 instance.
+*/
+
 /*!
     Returns a new QNavigationManagerEngine instance, initialized with \a
     parameters, which implements navigation functionality.
@@ -173,7 +198,7 @@ QPlaceManagerEngine *QGeoServiceProviderFactory::createPlaceManagerEngine(const
     The default implementation returns nullptr, which causes a
     QGeoServiceProvider::NotSupportedError in QGeoServiceProvider.
 */
-QNavigationManagerEngine *QGeoServiceProviderFactory::createNavigationManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
+QNavigationManagerEngine *QGeoServiceProviderFactoryV2::createNavigationManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
 {
     Q_UNUSED(parameters)
     Q_UNUSED(error)
diff --git a/src/location/maps/qgeoserviceproviderfactory.h b/src/location/maps/qgeoserviceproviderfactory.h
index e1164189cf241a2763694a2692588249502424f5..1eb93a18981e763763e4af922af8d80132959726 100644
--- a/src/location/maps/qgeoserviceproviderfactory.h
+++ b/src/location/maps/qgeoserviceproviderfactory.h
@@ -62,13 +62,25 @@ public:
     virtual QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap &parameters,
             QGeoServiceProvider::Error *error,
             QString *errorString) const;
+};
+
+Q_DECLARE_INTERFACE(QGeoServiceProviderFactory,
+                    "org.qt-project.qt.geoservice.serviceproviderfactory/5.0")
+
+class Q_LOCATION_EXPORT QGeoServiceProviderFactoryV2 : public QGeoServiceProviderFactory
+{
+public:
+    virtual ~QGeoServiceProviderFactoryV2() {}
+
     virtual QNavigationManagerEngine *createNavigationManagerEngine(const QVariantMap &parameters,
             QGeoServiceProvider::Error *error,
             QString *errorString) const;
 };
 
-Q_DECLARE_INTERFACE(QGeoServiceProviderFactory,
-                    "org.qt-project.qt.geoservice.serviceproviderfactory/5.0")
+// Although not actually used for constructing a specialized loader, this is required for
+// casting a QObject * into QGeoServiceProviderFactoryV2 *
+Q_DECLARE_INTERFACE(QGeoServiceProviderFactoryV2,
+                    "org.qt-project.qt.geoservice.serviceproviderfactoryV2/5.0")
 
 QT_END_NAMESPACE