@@ -75,6 +75,8 @@ import com.google.common.base.Optional;
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.HashMultimap;
 
 import io.ipfs.cid.Cid;
 
@@ -126,6 +128,7 @@ import eu.siacs.conversations.databinding.CommandTextFieldBinding;
 import eu.siacs.conversations.databinding.CommandSliderFieldBinding;
 import eu.siacs.conversations.databinding.CommandWebviewBinding;
 import eu.siacs.conversations.databinding.DialogQuickeditBinding;
+import eu.siacs.conversations.entities.Reaction;
 import eu.siacs.conversations.entities.ListItem.Tag;
 import eu.siacs.conversations.http.HttpConnectionManager;
 import eu.siacs.conversations.persistance.DatabaseBackend;
@@ -136,6 +139,7 @@ import eu.siacs.conversations.ui.UriHandlerActivity;
 import eu.siacs.conversations.ui.text.FixedURLSpan;
 import eu.siacs.conversations.ui.util.ShareUtil;
 import eu.siacs.conversations.ui.util.SoftKeyboardUtils;
+import eu.siacs.conversations.utils.Emoticons;
 import eu.siacs.conversations.utils.JidHelper;
 import eu.siacs.conversations.utils.MessageUtils;
 import eu.siacs.conversations.utils.PhoneNumberUtilWrapper;
@@ -207,6 +211,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
     protected boolean userSelectedThread = false;
     protected Message replyTo = null;
     protected HashMap<String, Thread> threads = new HashMap<>();
+    protected Multimap<String, Reaction> reactions = HashMultimap.create();
     private String displayState = null;
 
     public Conversation(final String name, final Account account, final Jid contactJid,
@@ -684,6 +689,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
             messages.clear();
             messages.addAll(this.messages);
             threads.clear();
+            reactions.clear();
         }
         Set<String> extraIds = new HashSet<>();
         for (ListIterator<Message> iterator = messages.listIterator(messages.size()); iterator.hasPrevious(); ) {
@@ -702,17 +708,38 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                     thread.first = m;
                 }
             }
+            final var reply = m.getReply();
+            if (reply != null && reply.getAttribute("id") != null) {
+                extraIds.add(reply.getAttribute("id"));
+                final var body = m.getBody(true).toString().replaceAll("\\s", "");
+                if (Emoticons.isEmoji(body)) {
+                    reactions.put(reply.getAttribute("id"), new Reaction(body, true, m.getCounterpart(), m.getTrueCounterpart(), m.getOccupantId()));
+                    iterator.remove();
+                }
+            }
+
             if (m.wasMergedIntoPrevious(xmppConnectionService) || (m.getSubject() != null && !m.isOOb() && (m.getRawBody() == null || m.getRawBody().length() == 0)) || (getLockThread() && !extraIds.contains(m.replyId()) && (mthread == null || !mthread.getContent().equals(getThread() == null ? "" : getThread().getContent())))) {
                 iterator.remove();
             } else if (getLockThread() && mthread != null) {
-                Element reply = m.getReply();
-                if (reply != null && reply.getAttribute("id") != null) extraIds.add(reply.getAttribute("id"));
                 Element reactions = m.getReactionsEl();
                 if (reactions != null && reactions.getAttribute("id") != null) extraIds.add(reactions.getAttribute("id"));
             }
         }
     }
 
+    public Reaction.Aggregated aggregatedReactionsFor(Message m) {
+        Set<Reaction> result = new HashSet<>();
+        if (getMode() == MODE_MULTI) {
+            result.addAll(reactions.get(m.getServerMsgId()));
+        } else if (m.getStatus() > Message.STATUS_RECEIVED) {
+            result.addAll(reactions.get(m.getUuid()));
+        } else {
+            result.addAll(reactions.get(m.getRemoteMsgId()));
+        }
+        result.addAll(m.getReactions());
+        return Reaction.aggregated(result);
+    }
+
     public Thread getThread(String id) {
         return threads.get(id);
     }
  
  
  
    
    @@ -1534,13 +1534,13 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             }
             BindingAdapters.setReactionsOnReceived(
                     viewHolder.reactions,
-                    message.getAggregatedReactions(),
+                    conversation instanceof Conversation ? ((Conversation) conversation).aggregatedReactionsFor(message) : message.getAggregatedReactions(),
                     reactions -> sendReactions(message, reactions),
                     () -> addReaction(message));
         } else if (type == SENT) {
             BindingAdapters.setReactionsOnReceived(
                     viewHolder.reactions,
-                    message.getAggregatedReactions(),
+                    conversation instanceof Conversation ? ((Conversation) conversation).aggregatedReactionsFor(message) : message.getAggregatedReactions(),
                     reactions -> sendReactions(message, reactions),
                     () -> addReaction(message));
         }