diff --git a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
index a0d477898c688f2cfe0accdf81ba53051a59dead..746306af2b477ca3a79ef584eff67e1374ec273f 100644
--- a/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/timeline/TimelineDialogFragment.kt
@@ -23,7 +23,6 @@ import org.futo.circles.core.extensions.showError
 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.feature.markdown.MarkdownParser
 import org.futo.circles.core.feature.share.ShareProvider
 import org.futo.circles.core.model.CircleRoomTypeArg
 import org.futo.circles.core.model.CreatePollContent
@@ -87,6 +86,8 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli
         }
     }
 
+    private var onLocalAddEmojiCallback: ((String) -> Unit)? = null
+
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         setupViews()
@@ -203,8 +204,9 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli
         navigator.navigateToShowMediaPreview(roomId, eventId)
     }
 
-    override fun onShowEmoji(roomId: String, eventId: String) {
+    override fun onShowEmoji(roomId: String, eventId: String, onAddEmoji: (String) -> Unit) {
         if (showNoInternetConnection()) return
+        onLocalAddEmojiCallback = onAddEmoji
         navigator.navigateToShowEmoji(roomId, eventId)
     }
 
@@ -274,6 +276,8 @@ class TimelineDialogFragment : BaseFullscreenDialogFragment(DialogFragmentTimeli
     override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) {
         roomId ?: return
         eventId ?: return
+        onLocalAddEmojiCallback?.invoke(emoji)
+        onLocalAddEmojiCallback = null
         viewModel.sendReaction(roomId, eventId, emoji)
     }
 
diff --git a/app/src/main/java/org/futo/circles/view/PostFooterView.kt b/app/src/main/java/org/futo/circles/view/PostFooterView.kt
index de1816f0bab7d4aedfb16824b754a07b599e8dea..6747a3d449aeaed835a74be73a5b1d67a672a52a 100644
--- a/app/src/main/java/org/futo/circles/view/PostFooterView.kt
+++ b/app/src/main/java/org/futo/circles/view/PostFooterView.kt
@@ -4,6 +4,7 @@ import android.content.Context
 import android.util.AttributeSet
 import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.children
 import androidx.core.view.isVisible
 import org.futo.circles.core.base.NetworkObserver
 import org.futo.circles.core.extensions.setIsVisible
@@ -41,7 +42,12 @@ class PostFooterView(
                 post?.let { optionsListener?.onShare(it.content) }
             }
             btnLike.setOnClickListener {
-                post?.let { optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) }
+                post?.let {
+                    optionsListener?.onShowEmoji(
+                        it.postInfo.roomId,
+                        it.id
+                    ) { addEmojiFromPickerLocalUpdate(it) }
+                }
             }
         }
     }
@@ -85,35 +91,56 @@ class PostFooterView(
     }
 
     private fun bindReactionsList(reactions: List<ReactionsData>) {
-        binding.rvEmojis.setIsVisible(reactions.isNotEmpty())
+        binding.hsEmojis.setIsVisible(reactions.isNotEmpty())
         binding.lEmojisContainer.removeAllViews()
-        reactions.forEach {
-            binding.lEmojisContainer.addView(ReactionItemView(context).apply {
-                setup(it) { reaction ->
-                    locallyUpdateEmojisList(this, reaction)
-                    post?.let {
-                        optionsListener?.onEmojiChipClicked(
-                            it.postInfo.roomId,
-                            it.id,
-                            reaction.key,
-                            reaction.addedByMe
-                        )
-                    }
+        reactions.forEach { addReactionItem(it) }
+    }
+
+    private fun addReactionItem(reactionsData: ReactionsData) {
+        binding.lEmojisContainer.addView(ReactionItemView(context).apply {
+            setup(reactionsData) { reaction ->
+                locallyUpdateEmojisList(this, reaction)
+                post?.let {
+                    optionsListener?.onEmojiChipClicked(
+                        it.postInfo.roomId,
+                        it.id,
+                        reaction.key,
+                        reaction.addedByMe
+                    )
                 }
-            })
-        }
+            }
+        })
     }
 
     private fun locallyUpdateEmojisList(view: ReactionItemView, reaction: ReactionsData) {
         if (!NetworkObserver.isConnected()) return
         if (areUserAbleToPost().not()) return
         if (reaction.addedByMe) {
-            if (reaction.count == 1) binding.lEmojisContainer.removeView(view)
-            else view.bindReactionData(reaction.copy(addedByMe = false, count = reaction.count - 1))
+            if (reaction.count == 1) {
+                binding.lEmojisContainer.removeView(view)
+                if (binding.lEmojisContainer.children.count() == 0)
+                    binding.hsEmojis.setIsVisible(false)
+            } else view.bindReactionData(
+                reaction.copy(
+                    addedByMe = false,
+                    count = reaction.count - 1
+                )
+            )
         } else {
             view.bindReactionData(reaction.copy(addedByMe = true, count = reaction.count + 1))
         }
     }
 
+    fun addEmojiFromPickerLocalUpdate(emoji: String) {
+        val view = binding.lEmojisContainer.findViewWithTag<ReactionItemView>(emoji)
+        view?.let {
+            val data = it.reactionsData ?: return
+            it.bindReactionData(data.copy(count = data.count + 1, addedByMe = true))
+        } ?: kotlin.run {
+            binding.hsEmojis.setIsVisible(true)
+            addReactionItem(ReactionsData(emoji, 1, true))
+        }
+    }
+
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/view/PostLayout.kt b/app/src/main/java/org/futo/circles/view/PostLayout.kt
index 808ffc9dd615465989ee663fb6a9b71ca99621a2..1976049f69bc9eb634b757f7c993f19145bc067a 100644
--- a/app/src/main/java/org/futo/circles/view/PostLayout.kt
+++ b/app/src/main/java/org/futo/circles/view/PostLayout.kt
@@ -11,13 +11,13 @@ import android.view.ViewGroup
 import android.widget.FrameLayout
 import org.futo.circles.R
 import org.futo.circles.core.extensions.setIsVisible
+import org.futo.circles.core.feature.markdown.MarkdownParser
 import org.futo.circles.core.model.MediaContent
 import org.futo.circles.core.model.PollContent
 import org.futo.circles.core.model.Post
 import org.futo.circles.core.model.PostContent
 import org.futo.circles.core.model.TextContent
 import org.futo.circles.databinding.LayoutPostBinding
-import org.futo.circles.core.feature.markdown.MarkdownParser
 import org.futo.circles.model.PostItemPayload
 import org.matrix.android.sdk.api.session.room.send.SendState
 
@@ -28,7 +28,7 @@ interface PostOptionsListener {
     fun onShare(content: PostContent)
     fun onReply(roomId: String, eventId: String)
     fun onShowPreview(roomId: String, eventId: String)
-    fun onShowEmoji(roomId: String, eventId: String)
+    fun onShowEmoji(roomId: String, eventId: String, onAddEmoji: (String) -> Unit)
     fun onEmojiChipClicked(roomId: String, eventId: String, emoji: String, isUnSend: Boolean)
     fun onPollOptionSelected(roomId: String, eventId: String, optionId: String)
 }
@@ -49,7 +49,11 @@ class PostLayout(
         GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
             override fun onDoubleTap(e: MotionEvent): Boolean {
                 if (binding.postFooter.areUserAbleToPost())
-                    post?.let { optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) }
+                    post?.let {
+                        optionsListener?.onShowEmoji(it.postInfo.roomId, it.id) { emoji ->
+                            binding.postFooter.addEmojiFromPickerLocalUpdate(emoji)
+                        }
+                    }
                 return true
             }
 
diff --git a/app/src/main/java/org/futo/circles/view/ReactionItemView.kt b/app/src/main/java/org/futo/circles/view/ReactionItemView.kt
index a22d653e16d9f91029907e0022080da5d879ddba..062826b9864a7bc4192e17120ed5dc643731d7d9 100644
--- a/app/src/main/java/org/futo/circles/view/ReactionItemView.kt
+++ b/app/src/main/java/org/futo/circles/view/ReactionItemView.kt
@@ -15,14 +15,19 @@ class ReactionItemView(
     private val binding =
         ListItemTimelineReactionBinding.inflate(LayoutInflater.from(context), this)
 
+    var reactionsData: ReactionsData? = null
+        private set
+
     fun setup(data: ReactionsData, onClick: (ReactionsData) -> Unit) {
         binding.emojiChip.setOnClickListener { onClick(data) }
         bindReactionData(data)
     }
 
     fun bindReactionData(data: ReactionsData) {
+        reactionsData = data
         binding.emojiChip.apply {
             val title = "${data.key} ${data.count}"
+            tag = data.key
             text = title
             isChecked = data.addedByMe
         }
diff --git a/app/src/main/res/layout/view_post_footer.xml b/app/src/main/res/layout/view_post_footer.xml
index d19627b2e41dc829d0ce946fd061bb7b8d34f1f5..03c5f2fb4f2fd3dcf02c175333be5e28841158d8 100644
--- a/app/src/main/res/layout/view_post_footer.xml
+++ b/app/src/main/res/layout/view_post_footer.xml
@@ -8,7 +8,7 @@
 
 
     <HorizontalScrollView
-        android:id="@+id/rvEmojis"
+        android:id="@+id/hsEmojis"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:orientation="horizontal"
@@ -47,7 +47,7 @@
         app:iconTint="@color/button_src_state_color"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toStartOf="@id/btnReply"
-        app:layout_constraintStart_toEndOf="@id/rvEmojis"
+        app:layout_constraintStart_toEndOf="@id/hsEmojis"
         app:layout_constraintTop_toBottomOf="@id/divider"
         app:tint="@color/button_src_state_color" />