diff --git a/src/contactadapter.cpp b/src/contactadapter.cpp
index e9aafdf8f615a87e5be8a1f85a4c61e52215c666..49ad99911560ae95049e3158f31c26c55aba25a1 100644
--- a/src/contactadapter.cpp
+++ b/src/contactadapter.cpp
@@ -91,7 +91,8 @@ ContactAdapter::getContactSelectableModel(int type)
             if (!conv.participants.isEmpty()) {
                 QString calleeDisplayId = lrcInstance_
                                               ->getAccountInfo(lrcInstance_->get_currentAccountId())
-                                              .contactModel->bestIdForContact(conv.participants[0]);
+                                              .contactModel->bestIdForContact(
+                                                  conv.participants[0].uri);
 
                 QRegularExpression matchExcept = QRegularExpression(
                     QString("\\b(?!" + calleeDisplayId + "\\b)\\w+"));
diff --git a/src/currentconversation.cpp b/src/currentconversation.cpp
index 53f98f4c8f1c5f4be254c79c066c2c47dd99ad04..be6008ea88a1d992ed4563886cf6127a5408023e 100644
--- a/src/currentconversation.cpp
+++ b/src/currentconversation.cpp
@@ -52,7 +52,7 @@ CurrentConversation::updateData()
             auto& convInfo = optConv->get();
             set_title(accInfo.conversationModel->title(convId));
             set_description(accInfo.conversationModel->description(convId));
-            set_uris(convInfo.participants.toList());
+            set_uris(convInfo.participantsUris());
             set_isSwarm(convInfo.isSwarm());
             set_isLegacy(convInfo.isLegacy());
             set_isCoreDialog(convInfo.isCoreDialog());
diff --git a/src/mainview/components/SwarmDetailsPanel.qml b/src/mainview/components/SwarmDetailsPanel.qml
index 8cac190c883cf262e88b83c6c7e7580b7643b290..c92e9a917d16720ac87a282ea4611a1ad8a4502f 100644
--- a/src/mainview/components/SwarmDetailsPanel.qml
+++ b/src/mainview/components/SwarmDetailsPanel.qml
@@ -214,7 +214,6 @@ Rectangle {
                         ElidedTextLabel {
                             id: bestName
 
-                            Layout.preferredWidth: JamiTheme.preferredFieldWidth
                             Layout.preferredHeight: JamiTheme.preferredFieldHeight
 
                             eText: UtilsAdapter.getContactBestName(CurrentAccount.id, modelData)
diff --git a/src/mainview/components/SwarmParticipantContextMenu.qml b/src/mainview/components/SwarmParticipantContextMenu.qml
index 17f0df985f6ca07f9034d9a2c78f812ef8820faf..4dcc5ce57100f516895fb297a37843dbdf507573 100644
--- a/src/mainview/components/SwarmParticipantContextMenu.qml
+++ b/src/mainview/components/SwarmParticipantContextMenu.qml
@@ -54,6 +54,7 @@ ContextMenuAutoLoader {
         },
         GeneralMenuItem {
             id: promoteAdministrator
+            canTrigger: false // No API yet
             itemName: JamiStrings.promoteAdministrator
         },
         GeneralMenuItem {
diff --git a/src/qmlregister.cpp b/src/qmlregister.cpp
index 527d7ccd2a66b32d9088769ae08b574949613a33..a181ecfbabaa0a357034d545f02b40a5a2e61e6e 100644
--- a/src/qmlregister.cpp
+++ b/src/qmlregister.cpp
@@ -192,6 +192,7 @@ registerTypes(QQmlEngine* engine,
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::call::staticMetaObject, "Call");
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::datatransfer::staticMetaObject, "Datatransfer");
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::interaction::staticMetaObject, "Interaction");
+    QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::member::staticMetaObject, "Member");
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::video::staticMetaObject, "Video");
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::profile::staticMetaObject, "Profile");
     QML_REGISTERNAMESPACE(NS_MODELS, lrc::api::conversation::staticMetaObject, "Conversation");
diff --git a/src/utils.cpp b/src/utils.cpp
index 819e9863aa9915dfec935acd26585aa68a670baa..0d7d2b4dfec1ffb84dc03ec13a4f0201d762dc08 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -570,7 +570,7 @@ Utils::profileType(const lrc::api::conversation::Info& conv,
                    const lrc::api::ConversationModel& model)
 {
     try {
-        auto contact = model.owner.contactModel->getContact(conv.participants[0]);
+        auto contact = model.owner.contactModel->getContact(conv.participants[0].uri);
         return contact.profileInfo.type;
     } catch (const std::out_of_range& e) {
         qDebug() << e.what();
diff --git a/src/utilsadapter.cpp b/src/utilsadapter.cpp
index 7d493a7fa177ce99e89af444fbfa7824d7a92f78..300dc6297ed40591af00f3154157eaec2d929d37 100644
--- a/src/utilsadapter.cpp
+++ b/src/utilsadapter.cpp
@@ -131,7 +131,7 @@ UtilsAdapter::getBestName(const QString& accountId, const QString& uid)
     const auto& conv = lrcInstance_->getConversationFromConvUid(uid);
     if (!conv.participants.isEmpty())
         return lrcInstance_->getAccountInfo(accountId).contactModel->bestNameForContact(
-            conv.participants[0]);
+            conv.participants[0].uri);
     return QString();
 }
 
@@ -141,7 +141,7 @@ UtilsAdapter::getPeerUri(const QString& accountId, const QString& uid)
     try {
         auto* convModel = lrcInstance_->getAccountInfo(accountId).conversationModel.get();
         const auto& convInfo = convModel->getConversationForUid(uid).value();
-        return convInfo.get().participants.front();
+        return convInfo.get().participants.front().uri;
     } catch (const std::out_of_range& e) {
         qDebug() << e.what();
         return "";
@@ -162,7 +162,7 @@ UtilsAdapter::getBestId(const QString& accountId, const QString& uid)
     const auto& conv = lrcInstance_->getConversationFromConvUid(uid);
     if (!conv.participants.isEmpty())
         return lrcInstance_->getAccountInfo(accountId).contactModel->bestIdForContact(
-            conv.participants[0]);
+            conv.participants[0].uri);
     return QString();
 }
 
@@ -498,9 +498,12 @@ UtilsAdapter::getContactBestName(const QString& accountId, const QString& uri)
     return {};
 }
 
-QString
+lrc::api::member::Role
 UtilsAdapter::getParticipantRole(const QString& accountId, const QString& convId, const QString& uri)
 {
-    // TODO get role
-    return {};
+    try {
+        return lrcInstance_->getAccountInfo(accountId).conversationModel->memberRole(convId, uri);
+    } catch (...) {
+    }
+    return lrc::api::member::Role::MEMBER;
 }
diff --git a/src/utilsadapter.h b/src/utilsadapter.h
index eef62ed429a75dabcf96f1ff738cc647057677ac..cf1164fcf379770d91ae3aee60ab7a3c709a8232 100644
--- a/src/utilsadapter.h
+++ b/src/utilsadapter.h
@@ -95,9 +95,9 @@ public:
     // For Swarm details page
     Q_INVOKABLE bool getContactPresence(const QString& accountId, const QString& uri);
     Q_INVOKABLE QString getContactBestName(const QString& accountId, const QString& uri);
-    Q_INVOKABLE QString getParticipantRole(const QString& accountId,
-                                           const QString& convId,
-                                           const QString& uri);
+    Q_INVOKABLE lrc::api::member::Role getParticipantRole(const QString& accountId,
+                                                          const QString& convId,
+                                                          const QString& uri);
 
 Q_SIGNALS:
     void debugMessageReceived(const QString& message);