@@ -598,6 +598,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 
     private void displayTextMessage(
             final ViewHolder viewHolder, final Message message, final BubbleColor bubbleColor, final int type) {
+        viewHolder.inReplyToQuote.setVisibility(View.GONE);
         viewHolder.download_button.setVisibility(View.GONE);
         viewHolder.image.setVisibility(View.GONE);
         viewHolder.audioPlayer.setVisibility(View.GONE);
@@ -609,6 +610,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
         viewHolder.messageBody.setLayoutParams(layoutParams);
 
+        final ViewGroup.LayoutParams qlayoutParams = viewHolder.inReplyToQuote.getLayoutParams();
+        qlayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
+        viewHolder.messageBody.setLayoutParams(qlayoutParams);
+
         viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
 
         if (message.getBody() != null && !message.getBody().equals("")) {
@@ -636,9 +641,19 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             for (final android.text.style.QuoteSpan quote : body.getSpans(0, body.length(), android.text.style.QuoteSpan.class)) {
                 int start = body.getSpanStart(quote);
                 int end = body.getSpanEnd(quote);
-                if (start == 0) startsWithQuote = true;
                 body.removeSpan(quote);
                 applyQuoteSpan(viewHolder.messageBody, body, start, end, bubbleColor, true);
+                if (start == 0) {
+                    if (message.getInReplyTo() == null) {
+                        startsWithQuote = true;
+                    } else {
+                        viewHolder.inReplyToQuote.setText(body.subSequence(start, end));
+                        viewHolder.inReplyToQuote.setVisibility(View.VISIBLE);
+                        body.delete(start, end);
+                        while (body.length() > start && body.charAt(start) == '\n') body.delete(start, 1); // Newlines after quote
+                        continue;
+                    }
+                }
             }
             startsWithQuote = (processMarkup ? handleTextQuotes(viewHolder.messageBody, body, bubbleColor, true) : false) || startsWithQuote;
             if (!message.isPrivateMessage()) {
@@ -739,6 +754,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 
             viewHolder.messageBody.setAutoLinkMask(0);
             viewHolder.messageBody.setText(body);
+            if (body.length() <= 0) viewHolder.messageBody.setVisibility(View.GONE);
             BetterLinkMovementMethod method = new BetterLinkMovementMethod() {
                 @Override
                 protected void dispatchUrlLongClick(TextView tv, ClickableSpan span) {
@@ -813,7 +829,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 if (height < 1) height = 1080;
 
                 viewHolder.image.setVisibility(View.VISIBLE);
-                imagePreviewLayout(width, height, viewHolder.image, true, type, viewHolder);
+                imagePreviewLayout(width, height, viewHolder.image, message.getInReplyTo() != null, true, type, viewHolder);
                 activity.loadBitmap(message, viewHolder.image);
                 viewHolder.image.setOnClickListener(v -> ConversationFragment.downloadFile(activity, message));
 
@@ -928,12 +944,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         viewHolder.audioPlayer.setVisibility(View.GONE);
         viewHolder.image.setVisibility(View.VISIBLE);
         final FileParams params = message.getFileParams();
-        imagePreviewLayout(params.width, params.height, viewHolder.image, viewHolder.messageBody.getVisibility() != View.GONE, type, viewHolder);
+        imagePreviewLayout(params.width, params.height, viewHolder.image, message.getInReplyTo() != null, viewHolder.messageBody.getVisibility() != View.GONE, type, viewHolder);
         activity.loadBitmap(message, viewHolder.image);
         viewHolder.image.setOnClickListener(v -> openDownloadable(message));
     }
 
-    private void imagePreviewLayout(int w, int h, ShapeableImageView image, boolean withOther, int type, ViewHolder viewHolder) {
+    private void imagePreviewLayout(int w, int h, ShapeableImageView image, boolean otherAbove, boolean otherBelow, int type, ViewHolder viewHolder) {
         final float target = activity.getResources().getDimension(R.dimen.image_preview_width);
         final int scaledW;
         final int scaledH;
@@ -950,15 +966,22 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             scaledW = (int) target;
             scaledH = (int) (h / ((double) w / target));
         }
-        final var small = withOther ? scaledW < target : scaledW < 110 * metrics.density;
+        final var bodyWidth = Math.max(viewHolder.messageBody.getWidth(), viewHolder.download_button.getWidth());
+        var targetImageWidth = 200 * metrics.density;
+        if (!otherBelow) targetImageWidth = 110 * metrics.density;
+        if (bodyWidth > 0 && bodyWidth < targetImageWidth) targetImageWidth = bodyWidth;
+        final var small = scaledW < targetImageWidth;
         final LinearLayout.LayoutParams layoutParams =
                 new LinearLayout.LayoutParams(scaledW, scaledH);
         image.setLayoutParams(layoutParams);
 
         final var bubbleRadius = activity.getResources().getDimension(R.dimen.bubble_radius);
-        var shape = new ShapeAppearanceModel.Builder().setTopRightCorner(CornerFamily.ROUNDED, bubbleRadius);
-        if (type == SENT) {
-            shape = shape.setTopLeftCorner(CornerFamily.ROUNDED, bubbleRadius);
+        var shape = new ShapeAppearanceModel.Builder();
+        if (!otherAbove) {
+            shape = shape.setTopRightCorner(CornerFamily.ROUNDED, bubbleRadius);
+            if (type == SENT) {
+                shape = shape.setTopLeftCorner(CornerFamily.ROUNDED, bubbleRadius);
+            }
         }
         if (small) {
             final var imageRadius = activity.getResources().getDimension(R.dimen.image_radius);
@@ -971,8 +994,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 
         if (!small) {
             final ViewGroup.LayoutParams blayoutParams = viewHolder.messageBody.getLayoutParams();
-            blayoutParams.width = (int) (target - (22 * metrics.density));
+            blayoutParams.width = (int) (scaledW - (22 * metrics.density));
             viewHolder.messageBody.setLayoutParams(blayoutParams);
+
+            final ViewGroup.LayoutParams qlayoutParams = viewHolder.inReplyToQuote.getLayoutParams();
+            qlayoutParams.width = (int) (scaledW - (22 * metrics.density));
+            viewHolder.messageBody.setLayoutParams(qlayoutParams);
         }
     }
 
@@ -1078,6 +1105,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     viewHolder.subject = view.findViewById(R.id.message_subject);
                     viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to);
                     viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box);
+                    viewHolder.inReplyToQuote = view.findViewById(R.id.in_reply_to_quote);
                     viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received);
                     viewHolder.audioPlayer = view.findViewById(R.id.audio_player);
                     viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon);
@@ -1096,6 +1124,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     viewHolder.time = view.findViewById(R.id.message_time);
                     viewHolder.subject = view.findViewById(R.id.message_subject);
                     viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to);
+                    viewHolder.inReplyToQuote = view.findViewById(R.id.in_reply_to_quote);
                     viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box);
                     viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received);
                     viewHolder.encryption = view.findViewById(R.id.message_encryption);
@@ -1481,6 +1510,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 viewHolder.inReplyToBox.setVisibility(View.VISIBLE);
                 viewHolder.inReplyTo.setText(UIHelper.getMessageDisplayName(message.getInReplyTo()));
                 viewHolder.inReplyTo.setOnClickListener((v) -> mConversationFragment.jumpTo(message.getInReplyTo()));
+                viewHolder.inReplyToQuote.setOnClickListener((v) -> mConversationFragment.jumpTo(message.getInReplyTo()));
                 setTextColor(viewHolder.inReplyTo, bubbleColor);
             }
         }
@@ -1703,6 +1733,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         protected TextView time;
         protected TextView subject;
         protected TextView inReplyTo;
+        protected TextView inReplyToQuote;
         protected LinearLayout inReplyToBox;
         protected TextView messageBody;
         protected ImageView contact_picture;