diff --git a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
index c5ac092786bc304e4a80a3f25bb10176c5b8ea8e..e5b172b7097c5320eccd8e89c098110c861dc53a 100644
--- a/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/circles/list/CirclesViewHolder.kt
@@ -8,7 +8,7 @@ import org.futo.circles.R
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.base.list.context
 import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.databinding.ListItemInvitedCircleBinding
@@ -45,7 +45,7 @@ class JoinedCircleViewHolder(
         if (data !is JoinedCircleListItem) return
 
         with(binding) {
-            ivCircle.loadProfileIcon(data.info.avatarUrl, data.info.title)
+            ivCircle.loadRoomProfileIcon(data.info.avatarUrl, data.info.title)
             setTitle(tvCircleTitle, data.info.title)
             setFollowingCount(data.followingCount)
             setFollowedByCount(data.followedByCount)
@@ -103,7 +103,7 @@ class InvitedCircleViewHolder(
 
         with(binding) {
             tvShowProfileImage.setIsVisible(data.shouldBlurIcon)
-            ivCircle.loadProfileIcon(
+            ivCircle.loadRoomProfileIcon(
                 data.info.avatarUrl,
                 data.info.title,
                 applyBlur = data.shouldBlurIcon
diff --git a/app/src/main/java/org/futo/circles/feature/groups/list/GroupViewHolder.kt b/app/src/main/java/org/futo/circles/feature/groups/list/GroupViewHolder.kt
index 7dfef1833cdb61506cc4367533dbc31ceb1b78fa..60e8163cc4196a5e66870ebf703b5f00890d67c4 100644
--- a/app/src/main/java/org/futo/circles/feature/groups/list/GroupViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/groups/list/GroupViewHolder.kt
@@ -9,7 +9,7 @@ import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.R
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.base.list.context
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.databinding.ListItemInvitedGroupBinding
@@ -49,7 +49,7 @@ class JoinedGroupViewHolder(
     override fun bind(data: GroupListItem) {
         if (data !is JoinedGroupListItem) return
 
-        binding.ivGroup.loadProfileIcon(data.info.avatarUrl, data.info.title)
+        binding.ivGroup.loadRoomProfileIcon(data.info.avatarUrl, data.info.title)
         setIsEncrypted(binding.ivLock, data.isEncrypted)
         setTitle(binding.tvGroupTitle, data.info.title)
         setTopic(data.topic)
@@ -122,7 +122,7 @@ class InvitedGroupViewHolder(
         if (data !is InvitedGroupListItem) return
 
         with(binding) {
-            ivGroup.loadProfileIcon(
+            ivGroup.loadRoomProfileIcon(
                 data.info.avatarUrl,
                 data.info.title,
                 applyBlur = data.shouldBlurIcon
diff --git a/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt b/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt
index 3103bbda42ffb2391659ceb8915849cf1cd65cc3..86e19d4a4769c2977ba0d42c3e98b5a2e4a139ea 100644
--- a/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt
@@ -6,12 +6,11 @@ import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.base.list.context
 import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.model.CirclesUserSummary
 import org.futo.circles.databinding.ListItemPeopleDefaultBinding
-import org.futo.circles.databinding.ListItemPeopleIgnoredBinding
 import org.futo.circles.databinding.ListItemPeopleRequestBinding
 import org.futo.circles.model.PeopleHeaderItem
 import org.futo.circles.model.PeopleListItem
@@ -76,7 +75,7 @@ class PeopleRequestUserViewHolder(
     private fun bindUser(user: CirclesUserSummary) {
         with(binding) {
             tvUserName.text = user.name
-            ivUserImage.loadProfileIcon(user.avatarUrl, user.name)
+            ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
         }
     }
 }
diff --git a/app/src/main/java/org/futo/circles/feature/people/user/UserDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/people/user/UserDialogFragment.kt
index 6cd31da3f5cc35cc024d4d0fd743ec44edc38fd9..fcbd792f1c777798628b6864c96d4eac040e9134 100644
--- a/app/src/main/java/org/futo/circles/feature/people/user/UserDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/people/user/UserDialogFragment.kt
@@ -9,7 +9,8 @@ import androidx.recyclerview.widget.DividerItemDecoration
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.R
 import org.futo.circles.core.base.NetworkObserver
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.notEmptyDisplayName
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
@@ -19,7 +20,6 @@ import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.extensions.showNoInternetConnection
 import org.futo.circles.core.extensions.showSuccess
 import org.futo.circles.core.extensions.withConfirmation
-import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.databinding.DialogFragmentUserBinding
 import org.futo.circles.extensions.*
 import org.futo.circles.feature.people.user.list.UsersCirclesAdapter
@@ -133,7 +133,7 @@ class UserDialogFragment : BaseFullscreenDialogFragment(DialogFragmentUserBindin
             toolbar.title = user.notEmptyDisplayName()
             tvUserId.text = user.userId
             tvUserName.text = user.notEmptyDisplayName()
-            ivUser.loadProfileIcon(user.avatarUrl, user.notEmptyDisplayName())
+            ivUser.loadUserProfileIcon(user.avatarUrl, user.userId)
             tvEmptyCirclesList.text =
                 getString(R.string.not_following_any_circles_format, user.notEmptyDisplayName())
         }
diff --git a/app/src/main/java/org/futo/circles/feature/people/user/list/UsersCircleViewHolder.kt b/app/src/main/java/org/futo/circles/feature/people/user/list/UsersCircleViewHolder.kt
index 0d07c545c6bc35cd16910e96d1b56313953a2b64..d9896b6fc4387d99b676665182637aeee0416eaa 100644
--- a/app/src/main/java/org/futo/circles/feature/people/user/list/UsersCircleViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/people/user/list/UsersCircleViewHolder.kt
@@ -4,7 +4,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.base.list.ViewBindingHolder
@@ -38,7 +38,7 @@ class UsersTimelineRoomViewHolder(
         if (data !is TimelineRoomListItem) return
         with(binding) {
             tvTimelineName.text = data.info.title
-            ivTimelineImage.loadProfileIcon(data.info.avatarUrl, data.info.title)
+            ivTimelineImage.loadRoomProfileIcon(data.info.avatarUrl, data.info.title)
             btnFollow.setIsVisible(!data.isJoined)
             btnUnFollow.setIsVisible(data.isJoined)
         }
diff --git a/app/src/main/java/org/futo/circles/feature/room/select/list/SelectRoomsViewHolder.kt b/app/src/main/java/org/futo/circles/feature/room/select/list/SelectRoomsViewHolder.kt
index 3ce87c665a01f981a467a9dc565a228930c26258..bbc2df7193112f4ebfc4c6a8227cb7f9e92d43b4 100644
--- a/app/src/main/java/org/futo/circles/feature/room/select/list/SelectRoomsViewHolder.kt
+++ b/app/src/main/java/org/futo/circles/feature/room/select/list/SelectRoomsViewHolder.kt
@@ -3,7 +3,7 @@ package org.futo.circles.feature.room.select.list
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.R
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setSelectableItemBackground
 import org.futo.circles.core.base.list.ViewBindingHolder
@@ -36,7 +36,7 @@ class SelectRoomsViewHolder(
             binding.ivCircleImage.setImageResource(R.drawable.ic_check_circle)
             binding.lRoot.setBackgroundColor(context.getColor(R.color.highlight_color))
         } else {
-            binding.ivCircleImage.loadProfileIcon(data.info.avatarUrl, data.info.title)
+            binding.ivCircleImage.loadRoomProfileIcon(data.info.avatarUrl, data.info.title)
             binding.lRoot.setSelectableItemBackground()
         }
     }
diff --git a/app/src/main/java/org/futo/circles/feature/room/well_known/RoomWellKnownDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/room/well_known/RoomWellKnownDialogFragment.kt
index e2fa98343937dc54b6d7a7ca3fc8c4faa385286a..9b9e4ebd2a69ffee3c8d8118dc5dc2e67b871787 100644
--- a/app/src/main/java/org/futo/circles/feature/room/well_known/RoomWellKnownDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/room/well_known/RoomWellKnownDialogFragment.kt
@@ -9,7 +9,7 @@ import org.futo.circles.R
 import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
 import org.futo.circles.core.extensions.getText
 import org.futo.circles.core.extensions.gone
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.onBackPressed
@@ -76,7 +76,7 @@ class RoomWellKnownDialogFragment :
         with(binding) {
             ivCover.apply {
                 if (roomInfo.avatarUrl != null || roomInfo.name != null)
-                    loadProfileIcon(roomInfo.avatarUrl, roomInfo.name ?: "")
+                    loadRoomProfileIcon(roomInfo.avatarUrl, roomInfo.name ?: "")
                 else setImageResource(R.drawable.ic_logo)
             }
             tvRoomName.apply {
diff --git a/app/src/main/java/org/futo/circles/feature/settings/SettingsFragment.kt b/app/src/main/java/org/futo/circles/feature/settings/SettingsFragment.kt
index 97a60a0ed5dc7eace1210022797518376a256d21..0956f183bec8ab916439e09c46cd205fc6ec653b 100644
--- a/app/src/main/java/org/futo/circles/feature/settings/SettingsFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/settings/SettingsFragment.kt
@@ -14,7 +14,7 @@ import org.futo.circles.auth.model.LogOut
 import org.futo.circles.auth.model.SwitchUser
 import org.futo.circles.core.base.CirclesAppConfig
 import org.futo.circles.core.base.NetworkObserver
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.notEmptyDisplayName
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
@@ -130,7 +130,7 @@ class SettingsFragment : Fragment(R.layout.fragment_settings) {
 
     private fun bindProfile(user: User) {
         with(binding) {
-            ivProfile.loadProfileIcon(user.avatarUrl, user.notEmptyDisplayName())
+            ivProfile.loadUserProfileIcon(user.avatarUrl, user.userId)
             tvUserName.text = user.notEmptyDisplayName()
             tvUserId.text = user.userId
         }
diff --git a/app/src/main/java/org/futo/circles/view/CreatePostView.kt b/app/src/main/java/org/futo/circles/view/CreatePostView.kt
index b6d3f11da0619e1fcc356ec5095e92b5ea26eda8..648e41d7eb1754472f6e8beee003e1ec640aa74a 100644
--- a/app/src/main/java/org/futo/circles/view/CreatePostView.kt
+++ b/app/src/main/java/org/futo/circles/view/CreatePostView.kt
@@ -8,8 +8,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.content.ContextCompat
 import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.extensions.gone
-import org.futo.circles.core.extensions.loadProfileIcon
-import org.futo.circles.core.extensions.notEmptyDisplayName
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.extensions.visible
 import org.futo.circles.databinding.ViewCreatePostBinding
@@ -53,7 +52,7 @@ class CreatePostView(
     }
 
     fun setUserInfo(user: User) {
-        binding.ivProfile.loadProfileIcon(user.avatarUrl, user.notEmptyDisplayName())
+        binding.ivProfile.loadUserProfileIcon(user.avatarUrl, user.userId)
     }
 
     private fun setupButtons(isThread: Boolean) {
diff --git a/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt b/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt
index 1dad4b9b9ca646917b98dcd654ff0b70edc24334..37815325cc0c77a1ddd11ba3f736ccbd78fad22a 100644
--- a/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt
+++ b/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt
@@ -4,9 +4,9 @@ import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
-import org.futo.circles.core.extensions.loadProfileIcon
-import org.futo.circles.databinding.ViewPeopleTabUserListItemBinding
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.model.CirclesUserSummary
+import org.futo.circles.databinding.ViewPeopleTabUserListItemBinding
 
 class PeopleTabUserListItemView(
     context: Context,
@@ -19,7 +19,7 @@ class PeopleTabUserListItemView(
         with(binding) {
             tvUserName.text = user.name
             tvUserId.text = user.id
-            ivUserImage.loadProfileIcon(user.avatarUrl, user.name)
+            ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/view/PostHeaderView.kt b/app/src/main/java/org/futo/circles/view/PostHeaderView.kt
index b4fd3aaba13f285206dccb26320b2dc3eb6809ed..c6d3f16bc2f230b1cbfb9577c05201fecf4a00ea 100644
--- a/app/src/main/java/org/futo/circles/view/PostHeaderView.kt
+++ b/app/src/main/java/org/futo/circles/view/PostHeaderView.kt
@@ -7,7 +7,7 @@ import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
 import org.futo.circles.R
 import org.futo.circles.core.extensions.getAttributes
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.notEmptyDisplayName
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.model.Post
@@ -53,7 +53,7 @@ class PostHeaderView(
     ) {
         with(binding) {
             ivSenderImage.apply {
-                loadProfileIcon(avatarUrl, name)
+                loadUserProfileIcon(avatarUrl, userId)
                 setOnClickListener {
                     if (userId != MatrixSessionProvider.currentSession?.myUserId)
                         optionsListener?.onUserClicked(userId)
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/log_in/switch_user/list/SwitchUsersViewHolder.kt b/auth/src/main/java/org/futo/circles/auth/feature/log_in/switch_user/list/SwitchUsersViewHolder.kt
index a7818a834b7a284acbfb9a05f640ef00488be02d..379ecc277af7f15b76e866af14640ed26ce23772 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/log_in/switch_user/list/SwitchUsersViewHolder.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/log_in/switch_user/list/SwitchUsersViewHolder.kt
@@ -6,7 +6,8 @@ import org.futo.circles.auth.databinding.ListItemSwitchUserBinding
 import org.futo.circles.core.extensions.notEmptyDisplayName
 import org.futo.circles.auth.model.SwitchUserListItem
 import org.futo.circles.core.base.list.ViewBindingHolder
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.onClick
 
 class SwitchUsersViewHolder(
@@ -26,9 +27,9 @@ class SwitchUsersViewHolder(
 
     fun bind(data: SwitchUserListItem) {
         with(binding) {
-            ivUserImage.loadProfileIcon(
+            ivUserImage.loadUserProfileIcon(
                 data.user.avatarUrl,
-                data.user.notEmptyDisplayName(),
+                data.user.userId,
                 session = data.session
             )
             tvUserName.text = data.user.notEmptyDisplayName()
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/profile/edit/EditProfileDialogFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/profile/edit/EditProfileDialogFragment.kt
index a71265aebfc2350b2e3453730bb96163f3193442..b8564af5ee33489ffb13455990cb919f4a223236 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/profile/edit/EditProfileDialogFragment.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/profile/edit/EditProfileDialogFragment.kt
@@ -8,15 +8,14 @@ import androidx.fragment.app.viewModels
 import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.auth.R
 import org.futo.circles.auth.databinding.DialogFragmentEditProfileBinding
+import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
+import org.futo.circles.core.base.fragment.HasLoadingState
 import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.extensions.loadProfileIcon
-import org.futo.circles.core.extensions.notEmptyDisplayName
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.onBackPressed
 import org.futo.circles.core.extensions.showSuccess
-import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment
-import org.futo.circles.core.base.fragment.HasLoadingState
 import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
 import org.matrix.android.sdk.api.session.user.model.User
 
@@ -83,7 +82,7 @@ class EditProfileDialogFragment :
 
     private fun setInitialUserInfo(user: User) {
         with(binding) {
-            ivProfile.loadProfileIcon(user.avatarUrl, user.notEmptyDisplayName())
+            ivProfile.loadUserProfileIcon(user.avatarUrl, user.userId)
             tilName.editText?.setText(user.displayName)
             tilUserId.editText?.setText(user.userId)
         }
diff --git a/core/build.gradle b/core/build.gradle
index a4510df615fabc9fc9f5c38b7c213954ec386696..a0dce0f1ba47e173843e86371b9ef360fd18032e 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -107,6 +107,10 @@ dependencies {
     //Shake detection
     implementation 'com.squareup:seismic:1.0.3'
 
+    //profile placeholder
+    implementation 'com.github.WycliffeAssociates:jdenticon-kotlin:1.1'
+    implementation 'com.caverock:androidsvg-aar:1.4'
+
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.5'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
diff --git a/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt b/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt
index 05fed5bff02412e75a474249dab419a1705c545f..c00ca63f5dcc67c02cc1b916de9c16fc1ffe7566 100644
--- a/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt
+++ b/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt
@@ -4,10 +4,13 @@ import android.annotation.SuppressLint
 import android.graphics.Color
 import android.graphics.drawable.BitmapDrawable
 import android.graphics.drawable.Drawable
+import android.graphics.drawable.PictureDrawable
 import android.util.Size
 import android.widget.ImageView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.target.Target
+import com.caverock.androidsvg.SVG
+import jdenticon.Jdenticon
 import jp.wasabeef.glide.transformations.BlurTransformation
 import org.futo.circles.core.feature.blurhash.ThumbHash
 import org.futo.circles.core.feature.textDrawable.ColorGenerator
@@ -52,7 +55,7 @@ fun ImageView.loadEncryptedImage(
     } ?: loadMatrixImage(content.fileUrl, loadOriginalSize, preferredSize = preferredSize)
 }
 
-fun ImageView.loadProfileIcon(
+fun ImageView.loadRoomProfileIcon(
     url: String?,
     userId: String,
     loadOriginalSize: Boolean = false,
@@ -73,6 +76,19 @@ fun ImageView.loadProfileIcon(
     loadMatrixImage(url, loadOriginalSize, placeholder, preferredSize, session, applyBlur)
 }
 
+fun ImageView.loadUserProfileIcon(
+    url: String?,
+    userId: String,
+    session: Session? = null
+) {
+    post {
+        val svgString = Jdenticon.toSvg(userId, measuredWidth)
+        val svg = SVG.getFromString(svgString)
+        val placeholder = PictureDrawable(svg.renderToPicture())
+        loadMatrixImage(url, placeholder = placeholder, session = session)
+    }
+}
+
 
 @SuppressLint("CheckResult")
 fun ImageView.loadMatrixImage(
diff --git a/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
index 8a99eaf466608c1ba89e88405f80892d1cf8226c..78a8465f26641193878b66c03ce72febe4ce123e 100644
--- a/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/picker/gallery/rooms/list/GalleryViewHolder.kt
@@ -9,7 +9,7 @@ import org.futo.circles.core.base.list.context
 import org.futo.circles.core.databinding.ListItemInvitedGalleryBinding
 import org.futo.circles.core.databinding.ListItemJoinedGalleryBinding
 import org.futo.circles.core.extensions.loadMatrixImage
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.feature.textDrawable.ColorGenerator
@@ -71,7 +71,7 @@ class InvitedGalleryViewHolder(
 
         with(binding) {
             tvGalleryTitle.text = data.info.title
-            ivGallery.loadProfileIcon(
+            ivGallery.loadRoomProfileIcon(
                 data.info.avatarUrl,
                 data.info.title,
                 applyBlur = data.shouldBlurIcon
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/circles/following/list/FollowingViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/room/circles/following/list/FollowingViewHolder.kt
index 77e20cc02dbd3827af31720b21fc9f1e630628b0..5cac6fd53f8658c7de46e8e9fcbc43c11a8d6178 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/circles/following/list/FollowingViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/circles/following/list/FollowingViewHolder.kt
@@ -5,7 +5,7 @@ import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.R
 import org.futo.circles.core.databinding.ListItemFollowingBinding
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.base.list.ViewBindingHolder
@@ -28,7 +28,7 @@ class FollowingViewHolder(
     fun bind(data: FollowingListItem) {
         binding.tvCircleName.text = data.name
         binding.tvUserName.text = data.ownerName
-        binding.ivRoom.loadProfileIcon(data.avatarUrl, data.name)
+        binding.ivRoom.loadRoomProfileIcon(data.avatarUrl, data.name)
         binding.tvUpdateTime.text = context.getString(
             R.string.last_updated_formatter, DateUtils.getRelativeTimeSpanString(
                 data.updatedTime, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/update/circle/UpdateCircleDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/update/circle/UpdateCircleDialogFragment.kt
index b9855a561eb26a70e3e674168a035b35643e7337..85a9b7beb30f897cdf29b260fe22eb021da33ce2 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/update/circle/UpdateCircleDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/update/circle/UpdateCircleDialogFragment.kt
@@ -10,7 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.core.R
 import org.futo.circles.core.databinding.DialogFragmentUpdateCircleBinding
 import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
 import org.futo.circles.core.feature.room.update.UpdateRoomDialogFragment
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -40,7 +40,7 @@ class UpdateCircleDialogFragment :
     }
 
     override fun setInitialRoomData(room: RoomSummary) {
-        binding.ivCover.loadProfileIcon(room.avatarUrl, room.displayName)
+        binding.ivCover.loadRoomProfileIcon(room.avatarUrl, room.displayName)
         binding.tilName.editText?.setText(room.displayName)
         val isCircleShared = viewModel.isCircleShared(roomId)
         binding.btnPrivate.isChecked = !isCircleShared
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/update/gallery/UpdateGalleryDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/update/gallery/UpdateGalleryDialogFragment.kt
index 8f070b37cbfbbbb0f7a3714fd411ff9e832f496b..1b30b1792b64fe681967d13ec8036b86fab79c13 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/update/gallery/UpdateGalleryDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/update/gallery/UpdateGalleryDialogFragment.kt
@@ -11,7 +11,7 @@ import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.core.R
 import org.futo.circles.core.databinding.DialogFragmentUpdateGalleryBinding
 import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
 import org.futo.circles.core.feature.room.update.UpdateRoomDialogFragment
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -41,7 +41,7 @@ class UpdateGalleryDialogFragment :
     }
 
     override fun setInitialRoomData(room: RoomSummary) {
-        binding.ivCover.loadProfileIcon(room.avatarUrl, room.displayName)
+        binding.ivCover.loadRoomProfileIcon(room.avatarUrl, room.displayName)
         binding.tilName.editText?.setText(room.displayName)
     }
 
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/update/group/UpdateGroupDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/update/group/UpdateGroupDialogFragment.kt
index f1332ce5fae6ee206beaa28b8c162c576209dd75..5ee6308baa4d1e3e1e84853546de49de42e2ddb4 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/update/group/UpdateGroupDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/update/group/UpdateGroupDialogFragment.kt
@@ -10,7 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint
 import org.futo.circles.core.R
 import org.futo.circles.core.databinding.DialogFragmentUpdateGroupBinding
 import org.futo.circles.core.extensions.getText
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.feature.picker.helper.MediaPickerHelper
 import org.futo.circles.core.feature.room.update.UpdateRoomDialogFragment
 import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -40,7 +40,7 @@ class UpdateGroupDialogFragment :
     }
 
     override fun setInitialRoomData(room: RoomSummary) {
-        binding.ivCover.loadProfileIcon(room.avatarUrl, room.displayName)
+        binding.ivCover.loadRoomProfileIcon(room.avatarUrl, room.displayName)
         binding.tilName.editText?.setText(room.displayName)
         binding.tilTopic.editText?.setText(room.topic)
     }
diff --git a/core/src/main/java/org/futo/circles/core/feature/timeline/options/TimelineOptionsDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/timeline/options/TimelineOptionsDialogFragment.kt
index 8db7e96147847203b80eeaafc60d4d67e5aafdd7..29f7065eb9428193e84728195a160a7ee70ad7bc 100644
--- a/core/src/main/java/org/futo/circles/core/feature/timeline/options/TimelineOptionsDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/timeline/options/TimelineOptionsDialogFragment.kt
@@ -13,7 +13,7 @@ import org.futo.circles.core.databinding.DialogFragmentTimelineOptionsBinding
 import org.futo.circles.core.extensions.isCurrentUserAbleToChangeSettings
 import org.futo.circles.core.extensions.isCurrentUserAbleToInvite
 import org.futo.circles.core.extensions.isCurrentUserOnlyAdmin
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.observeData
 import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.setEnabledViews
@@ -150,7 +150,7 @@ class TimelineOptionsDialogFragment :
         }
         viewModel.roomSummaryLiveData?.observeData(this) {
             it.getOrNull()?.let { room ->
-                binding.ivCover.loadProfileIcon(room.avatarUrl, room.displayName)
+                binding.ivCover.loadRoomProfileIcon(room.avatarUrl, room.displayName)
                 binding.toolbar.title = room.displayName
             }
         }
diff --git a/core/src/main/java/org/futo/circles/core/view/UserListItemView.kt b/core/src/main/java/org/futo/circles/core/view/UserListItemView.kt
index fdf0c2958f08c8aa1f87a9cef77f125ce7a6e7c9..8cd33c0e818b21590cf9bdb63f89aa32cbd9c702 100644
--- a/core/src/main/java/org/futo/circles/core/view/UserListItemView.kt
+++ b/core/src/main/java/org/futo/circles/core/view/UserListItemView.kt
@@ -6,7 +6,7 @@ import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
 import org.futo.circles.core.R
 import org.futo.circles.core.databinding.ViewUserListItemBinding
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.setSelectableItemBackground
 import org.futo.circles.core.model.CirclesUserSummary
 
@@ -22,7 +22,7 @@ class UserListItemView(
         with(binding) {
             tvUserName.text = user.name
             tvUserId.text = user.id
-            ivUserImage.loadProfileIcon(user.avatarUrl, user.name)
+            ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
         }
     }
 
@@ -37,7 +37,7 @@ class UserListItemView(
             binding.ivUserImage.setImageResource(R.drawable.ic_check_circle)
             setBackgroundColor(context.getColor(R.color.highlight_color))
         } else {
-            binding.ivUserImage.loadProfileIcon(user.avatarUrl, user.name)
+            binding.ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
             setSelectableItemBackground()
         }
     }
diff --git a/gallery/src/main/java/org/futo/circles/gallery/feature/select/list/SelectGalleryViewHolder.kt b/gallery/src/main/java/org/futo/circles/gallery/feature/select/list/SelectGalleryViewHolder.kt
index 297400889cf2c2002ff2a6786d1358fb4e2fab35..501be8803739f33b7abb457947f657429a97cc5a 100644
--- a/gallery/src/main/java/org/futo/circles/gallery/feature/select/list/SelectGalleryViewHolder.kt
+++ b/gallery/src/main/java/org/futo/circles/gallery/feature/select/list/SelectGalleryViewHolder.kt
@@ -2,7 +2,7 @@ package org.futo.circles.gallery.feature.select.list
 
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
-import org.futo.circles.core.extensions.loadProfileIcon
+import org.futo.circles.core.extensions.loadRoomProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsVisible
 import org.futo.circles.core.base.list.ViewBindingHolder
@@ -24,7 +24,7 @@ class SelectGalleryViewHolder(
 
     fun bind(data: SelectableRoomListItem) {
         with(binding) {
-            baseGalleryItem.ivGalleryImage.loadProfileIcon(data.info.avatarUrl, "")
+            baseGalleryItem.ivGalleryImage.loadRoomProfileIcon(data.info.avatarUrl, "")
             baseGalleryItem.tvGalleryName.text = data.info.title
             ivSelect.setImageResource(
                 if (data.isSelected) org.futo.circles.core.R.drawable.ic_check_circle