diff --git a/src/bluetooth/qbluetoothuuid.cpp b/src/bluetooth/qbluetoothuuid.cpp
index bc00aa95..cab899c8 100644
--- a/src/bluetooth/qbluetoothuuid.cpp
+++ b/src/bluetooth/qbluetoothuuid.cpp
@@ -503,6 +503,11 @@ Q_GLOBAL_STATIC_WITH_ARGS(QUuid, baseUuid, ("{00000000-0000-1000-8000-00805F9B34
     \value UnknownDescriptorType             The descriptor type is unknown.
 */
 
+struct QBluetoothUuidPrivate
+{
+    QString key;
+};
+
 static void registerQBluetoothUuidMetaType()
 {
     static bool initDone = false;
@@ -615,9 +620,14 @@ QT_WARNING_POP
     If the conversion fails, a null UUID is created. See \l QUuid::toString() for an
     explanation of how the five hex fields map to the public data members in QUuid.
 */
-QBluetoothUuid::QBluetoothUuid(const QString &uuid)
+QBluetoothUuid::QBluetoothUuid(const QString &uuid, const QString &key)
 :   QUuid(uuid)
 {
+    if(key.size() > 0)
+    {
+        data = QSharedPointer<QBluetoothUuidPrivate>(new QBluetoothUuidPrivate);
+        data->key = key;
+    }
     registerQBluetoothUuidMetaType();
 }
 
@@ -627,6 +637,7 @@ QBluetoothUuid::QBluetoothUuid(const QString &uuid)
 QBluetoothUuid::QBluetoothUuid(const QBluetoothUuid &uuid)
 :   QUuid(uuid)
 {
+    data = uuid.data;
     registerQBluetoothUuidMetaType();
 }
 
@@ -1117,6 +1128,7 @@ QString QBluetoothUuid::descriptorToString(QBluetoothUuid::DescriptorType uuid)
     case QBluetoothUuid::CharacteristicAggregateFormat:
         return QBluetoothServiceDiscoveryAgent::tr("Characteristic Aggregate Format");
     case QBluetoothUuid::ValidRange:
+
         return QBluetoothServiceDiscoveryAgent::tr("Valid Range");
     case QBluetoothUuid::ExternalReportReference:
         return QBluetoothServiceDiscoveryAgent::tr("External Report Reference");
@@ -1140,6 +1152,10 @@ QString QBluetoothUuid::descriptorToString(QBluetoothUuid::DescriptorType uuid)
 */
 bool QBluetoothUuid::operator==(const QBluetoothUuid &other) const
 {
+    // Check if unique key is present on both and check if they match if no key on other skip check for match
+    if(data.data() && other.data.data() && other.data->key.size() > 0 && data->key.size() > 0) {
+        return data->key == other.data->key;
+    }
     return QUuid::operator==(other);
 }
 
diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h
index 25c7896c..f8822db4 100644
--- a/src/bluetooth/qbluetoothuuid.h
+++ b/src/bluetooth/qbluetoothuuid.h
@@ -45,7 +45,7 @@
 #include <QtCore/QtGlobal>
 #include <QtCore/QMetaType>
 #include <QtCore/QUuid>
-
+#include <QtCore/QSharedPointer>
 #include <QtCore/QDebug>
 
 QT_BEGIN_NAMESPACE
@@ -55,6 +55,8 @@ struct quint128
     quint8 data[16];
 };
 
+struct QBluetoothUuidPrivate;
+
 class Q_BLUETOOTH_EXPORT QBluetoothUuid : public QUuid
 {
 public:
@@ -374,7 +376,7 @@ public:
     explicit QBluetoothUuid(quint16 uuid);
     explicit QBluetoothUuid(quint32 uuid);
     explicit QBluetoothUuid(quint128 uuid);
-    explicit QBluetoothUuid(const QString &uuid);
+    explicit QBluetoothUuid(const QString &uuid, const QString &key=QString());
     QBluetoothUuid(const QBluetoothUuid &uuid);
     QBluetoothUuid(const QUuid &uuid);
     ~QBluetoothUuid();
@@ -394,6 +396,9 @@ public:
     static QString protocolToString(ProtocolUuid uuid);
     static QString characteristicToString(CharacteristicType uuid);
     static QString descriptorToString(DescriptorType uuid);
+
+protected:
+    QSharedPointer<QBluetoothUuidPrivate> data;
 };
 
 #ifndef QT_NO_DEBUG_STREAM
diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp
index 6b4c17d6..415668e1 100644
--- a/src/bluetooth/qlowenergycontroller.cpp
+++ b/src/bluetooth/qlowenergycontroller.cpp
@@ -696,11 +696,17 @@ QLowEnergyService *QLowEnergyController::createServiceObject(
 
     QLowEnergyService *service = nullptr;
 
-    ServiceDataMap::const_iterator it = d->serviceList.constFind(serviceUuid);
-    if (it != d->serviceList.constEnd()) {
-        const QSharedPointer<QLowEnergyServicePrivate> &serviceData = it.value();
-
-        service = new QLowEnergyService(serviceData, parent);
+    ServiceDataMap::const_iterator it = d->serviceList.constBegin();
+    while(it != d->serviceList.constEnd())
+    {
+        if(it.key() == serviceUuid)
+        {
+            const QSharedPointer<QLowEnergyServicePrivate> &serviceData = it.value();
+
+            service = new QLowEnergyService(serviceData, parent);
+            break;
+        }
+        it++;
     }
 
     return service;
diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp
index d288f3ad..412e226f 100644
--- a/src/bluetooth/qlowenergycontroller_bluez.cpp
+++ b/src/bluetooth/qlowenergycontroller_bluez.cpp
@@ -1217,7 +1217,7 @@ void QLowEnergyControllerPrivateBluez::processReply(
                 p->includedServices = includedServices;
                 foreach (const QBluetoothUuid &uuid, includedServices) {
                     if (serviceList.contains(uuid))
-                        serviceList[uuid]->type |= QLowEnergyService::IncludedService;
+                        serviceList.value(uuid)->type |= QLowEnergyService::IncludedService;
                 }
             }
         }
diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp
index afc4b8c1..d3d7c754 100644
--- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp
+++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp
@@ -373,7 +373,7 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServices()
                                     QDBusConnection::systemBus(), this));
 
                 QSharedPointer<QLowEnergyServicePrivate> priv = QSharedPointer<QLowEnergyServicePrivate>::create();
-                priv->uuid = QBluetoothUuid(service->uUID());
+                priv->uuid = QBluetoothUuid(service->uUID(), it.key().path());
                 service->primary()
                         ? priv->type = QLowEnergyService::PrimaryService
                         : priv->type = QLowEnergyService::IncludedService;
@@ -382,8 +382,8 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServices()
                 GattService serviceContainer;
                 serviceContainer.servicePath = it.key().path();
 
-                serviceList.insert(priv->uuid, priv);
-                dbusServices.insert(priv->uuid, serviceContainer);
+                serviceList.insertMulti(priv->uuid, priv);
+                dbusServices.insertMulti(priv->uuid, serviceContainer);
 
                 emit q->serviceDiscovered(priv->uuid);
             }
@@ -394,6 +394,20 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServices()
     emit q->discoveryFinished();
 }
 
+QSharedPointer<QLowEnergyServicePrivate> QLowEnergyControllerPrivateBluezDBus::findServiceData(const QBluetoothUuid &serviceUuid)
+{
+    ServiceDataMap::const_iterator it = serviceList.constBegin();
+    while(it != serviceList.constEnd())
+    {
+        if(it.key() == serviceUuid)
+        {
+            return it.value();
+        }
+        it++;
+    }
+    return QSharedPointer<QLowEnergyServicePrivate>(0L);
+}
+
 void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoothUuid &service)
 {
     if (!serviceList.contains(service) || !dbusServices.contains(service)) {
@@ -403,7 +417,7 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo
     }
 
     //clear existing service data and run new discovery
-    QSharedPointer<QLowEnergyServicePrivate> serviceData = serviceList.value(service);
+    QSharedPointer<QLowEnergyServicePrivate> serviceData = findServiceData(service);
     serviceData->characteristicList.clear();
 
     GattService &dbusData = dbusServices[service];
@@ -488,7 +502,7 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo
             //all others ignored - not relevant for this API
         }
 
-        charData.uuid = QBluetoothUuid(dbusChar.characteristic->uUID());
+        charData.uuid = QBluetoothUuid(dbusChar.characteristic->uUID(), dbusChar.characteristic->path());
 
         // schedule read for initial char value
         if (charData.properties.testFlag(QLowEnergyCharacteristic::Read)) {
@@ -503,7 +517,7 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo
         for (const auto &descEntry : qAsConst(dbusChar.descriptors)) {
             const QLowEnergyHandle descriptorHandle = runningHandle++;
             QLowEnergyServicePrivate::DescData descData;
-            descData.uuid = QBluetoothUuid(descEntry->uUID());
+            descData.uuid = QBluetoothUuid(descEntry->uUID(), descEntry->path());
             charData.descriptorList.insert(descriptorHandle, descData);
 
 
@@ -775,7 +789,7 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob()
                             service->characteristicList.value(nextJob.handle);
         bool foundChar = false;
         for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) {
-            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID()))
+            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID(), gattChar.characteristic->path()))
                 continue;
 
             QDBusPendingReply<QByteArray> reply = gattChar.characteristic->ReadValue(QVariantMap());
@@ -804,7 +818,7 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob()
                             service->characteristicList.value(nextJob.handle);
         bool foundChar = false;
         for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) {
-            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID()))
+            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID(), gattChar.characteristic->path()))
                 continue;
 
             QDBusPendingReply<> reply = gattChar.characteristic->WriteValue(nextJob.value, QVariantMap());
@@ -841,11 +855,11 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob()
         const QBluetoothUuid descUuid = charData.descriptorList[nextJob.handle].uuid;
         bool foundDesc = false;
         for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) {
-            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID()))
+            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID(), gattChar.characteristic->path()))
                 continue;
 
             for (const auto &gattDesc : qAsConst(gattChar.descriptors)) {
-                if (descUuid != QBluetoothUuid(gattDesc->uUID()))
+                if (descUuid != QBluetoothUuid(gattDesc->uUID(), gattDesc->path()))
                     continue;
 
                 QDBusPendingReply<QByteArray> reply = gattDesc->ReadValue(QVariantMap());
@@ -885,11 +899,11 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob()
         const QBluetoothUuid descUuid = charData.descriptorList[nextJob.handle].uuid;
         bool foundDesc = false;
         for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) {
-            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID()))
+            if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID(), gattChar.characteristic->path()))
                 continue;
 
             for (const auto &gattDesc : qAsConst(gattChar.descriptors)) {
-                if (descUuid != QBluetoothUuid(gattDesc->uUID()))
+                if (descUuid != QBluetoothUuid(gattDesc->uUID(), gattDesc->path()))
                     continue;
 
                 //notifications enabled via characteristics Start/StopNotify() functions
diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
index 7ac1808f..56f0f7d1 100644
--- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
+++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h
@@ -184,6 +184,7 @@ private:
     bool jobPending = false;
 
     void prepareNextJob();
+    QSharedPointer<QLowEnergyServicePrivate> findServiceData(const QBluetoothUuid &serviceUuid);
 };
 
 QT_END_NAMESPACE
diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h
index a8d1c676..25c5d74c 100644
--- a/src/bluetooth/qlowenergycontrollerbase_p.h
+++ b/src/bluetooth/qlowenergycontrollerbase_p.h
@@ -78,7 +78,7 @@ QT_END_NAMESPACE
 
 QT_BEGIN_NAMESPACE
 
-typedef QMap<QBluetoothUuid, QSharedPointer<QLowEnergyServicePrivate> > ServiceDataMap;
+typedef QMultiMap<QBluetoothUuid, QSharedPointer<QLowEnergyServicePrivate> > ServiceDataMap;
 
 class QLowEnergyControllerPrivate : public QObject
 {
