diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
index 4361b471f7059c8750870c348a598e9113aa0afe..f88f305edf1a0429d77598c34b8643f9da23192d 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
@@ -45,6 +45,7 @@ import cx.ring.application.JamiApplication;
 import cx.ring.databinding.ActivityConversationBinding;
 import cx.ring.fragments.ConversationFragment;
 import cx.ring.interfaces.Colorable;
+import cx.ring.services.NotificationServiceImpl;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.MediaButtonsHelper;
 
@@ -56,12 +57,16 @@ public class ConversationActivity extends AppCompatActivity implements Colorable
     private Intent mPendingIntent = null;
     private ActivityConversationBinding binding;
 
+    private boolean mIsBubble;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         JamiApplication.getInstance().startDaemon();
 
+        mIsBubble = getIntent().getBooleanExtra(NotificationServiceImpl.EXTRA_BUBBLE, false);
+
         binding = ActivityConversationBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
@@ -95,8 +100,11 @@ public class ConversationActivity extends AppCompatActivity implements Colorable
             conversationPath = ConversationPath.fromBundle(savedInstanceState);
         }
         if (mConversationFragment == null) {
+            Bundle bundle = conversationPath.toBundle();
+            bundle.putBoolean(NotificationServiceImpl.EXTRA_BUBBLE, mIsBubble);
+
             mConversationFragment = new ConversationFragment();
-            mConversationFragment.setArguments(conversationPath.toBundle());
+            mConversationFragment.setArguments(bundle);
             getSupportFragmentManager().beginTransaction()
                     .replace(R.id.main_frame, mConversationFragment, null)
                     .commit();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index a2c226e0893a0278facafae6c1936bf43abbfc3c..d3427f8294cd4fbe87e05e52ad98f70740b12c71 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -102,6 +102,7 @@ import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.services.LocationSharingService;
 import cx.ring.plugins.PluginUtils;
 import cx.ring.services.NotificationService;
+import cx.ring.services.NotificationServiceImpl;
 import cx.ring.settings.pluginssettings.PluginDetails;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.AndroidFileUtils;
@@ -156,6 +157,8 @@ public class ConversationFragment extends BaseSupportFragment<ConversationPresen
     private final CompositeDisposable mCompositeDisposable = new CompositeDisposable();
     private int mSelectedPosition;
 
+    private boolean mIsBubble;
+
     private AvatarDrawable mConversationAvatar;
     private final Map<String, AvatarDrawable> mParticipantAvatars = new HashMap<>();
     private final Map<String, AvatarDrawable> mSmallParticipantAvatars = new HashMap<>();
@@ -771,7 +774,7 @@ public class ConversationFragment extends BaseSupportFragment<ConversationPresen
     @Override
     public void onResume() {
         super.onResume();
-        presenter.resume();
+        presenter.resume(mIsBubble);
     }
 
     @Override
@@ -813,6 +816,7 @@ public class ConversationFragment extends BaseSupportFragment<ConversationPresen
     @Override
     protected void initPresenter(ConversationPresenter presenter) {
         ConversationPath path = ConversationPath.fromBundle(getArguments());
+        mIsBubble = getArguments().getBoolean(NotificationServiceImpl.EXTRA_BUBBLE);
         if (path == null)
             return;
         Uri contactUri = new Uri(path.getContactId());
diff --git a/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
index 0a501cac962e68f33621f9e5bada7c6560875503..4989a335fb5681ab58a6f3cba8f2dbfdf3b67689 100644
--- a/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/NotificationServiceImpl.java
@@ -89,6 +89,8 @@ import cx.ring.utils.Tuple;
 
 public class NotificationServiceImpl implements NotificationService {
 
+    public static final String EXTRA_BUBBLE = "bubble";
+
     private static final String TAG = NotificationServiceImpl.class.getSimpleName();
 
     private static final String NOTIF_MSG = "MESSAGE";
@@ -517,10 +519,12 @@ public class NotificationServiceImpl implements NotificationService {
         if (contactPicture != null) {
             messageNotificationBuilder.setLargeIcon(contactPicture);
             Intent intentBubble = new Intent(Intent.ACTION_VIEW, path, mContext, ConversationActivity.class);
+            intentBubble.putExtra(EXTRA_BUBBLE, true);
             messageNotificationBuilder.setBubbleMetadata(new NotificationCompat.BubbleMetadata.Builder()
                     .setDesiredHeight(600)
                     .setIcon(IconCompat.createWithAdaptiveBitmap(contactPicture))
-                    .setIntent(PendingIntent.getActivity(mContext, 0, intentBubble, 0))
+                    .setIntent(PendingIntent.getActivity(mContext, 0, intentBubble,
+                            PendingIntent.FLAG_UPDATE_CURRENT))
                     .build());
         }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
index aac47e91f81565e563e7b1d60d8eafcb0434ce2c..f2e99705a846873c10d3374a437261d436f048d6 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
@@ -147,7 +147,7 @@ public class ConversationPresenter extends RootPresenter<ConversationView> {
         }
     }
 
-    public void resume() {
+    public void resume(boolean isBubble) {
         Log.w(TAG, "resume " + mConversation + " " + mAccountId + " " + mContactUri);
         mVisibilityDisposable.clear();
         mVisibilityDisposable.add(mConversationSubject
@@ -155,7 +155,7 @@ public class ConversationPresenter extends RootPresenter<ConversationView> {
                 .subscribe(conversation -> {
                     conversation.setVisible(true);
                     updateOngoingCallView(conversation);
-                    mConversationFacade.readMessages(mAccountService.getAccount(mAccountId), conversation);
+                    mConversationFacade.readMessages(mAccountService.getAccount(mAccountId), conversation, !isBubble);
                 }, e -> Log.e(TAG, "Error loading conversation", e)));
     }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
index 4c920930bd9e32bfc4d9da395c2cb92445574f4b..e603c789842be6428fcb934a3451b5a1826ec7be 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/facades/ConversationFacade.java
@@ -196,16 +196,18 @@ public class ConversationFacade {
     public void readMessages(String accountId, Uri contact) {
         Account account = mAccountService.getAccount(accountId);
         if (account != null)
-            readMessages(account, account.getByUri(contact));
+            readMessages(account, account.getByUri(contact), true);
     }
 
-    public void readMessages(Account account, Conversation conversation) {
+    public void readMessages(Account account, Conversation conversation, boolean cancelNotification) {
         if (conversation != null) {
             String lastMessage = readMessages(conversation);
             if (lastMessage != null) {
                 account.refreshed(conversation);
-                mNotificationService.cancelTextNotification(conversation.getContact().getPrimaryUri());
                 mAccountService.setMessageDisplayed(account.getAccountID(), conversation.getContact().getPrimaryNumber(), lastMessage);
+                if (cancelNotification) {
+                    mNotificationService.cancelTextNotification(conversation.getContact().getPrimaryUri());
+                }
             }
         }
     }