diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m
index aa46ef9f5..5a97d4ba8 100644
--- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m
+++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m
@@ -4180,13 +4180,10 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) {
 
                 // Canary check in case we later have another reason to set navigationController.delegate - we don't
                 // want to inadvertently clobber it here.
-                OWSAssert(self.navigationController.delegate == nil) self.navigationController.delegate = self;
-                TSMessage *message = (TSMessage *)interaction;
-                MessageDetailViewController *view =
-                    [[MessageDetailViewController alloc] initWithViewItem:conversationItem
-                                                                  message:message
-                                                                     mode:MessageMetadataViewModeFocusOnMetadata];
-                [self.navigationController pushViewController:view animated:YES];
+                OWSAssert(self.navigationController.delegate == nil);
+                self.navigationController.delegate = self;
+
+                [self showMetadataViewForViewItem:conversationItem];
             } else {
                 OWSFail(@"%@ Can't show message metadata for message of type: %@", self.logTag, [interaction class]);
             }
diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift
index bac831bcd..2c20f4371 100644
--- a/Signal/src/ViewControllers/MessageDetailViewController.swift
+++ b/Signal/src/ViewControllers/MessageDetailViewController.swift
@@ -38,7 +38,7 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate {
     var messageTextProxyViewHeightConstraint: NSLayoutConstraint?
     var bubbleViewWidthConstraint: NSLayoutConstraint?
 
-    var scrollView: UIScrollView?
+    var scrollView: UIScrollView!
     var contentView: UIView?
 
     var attachment: TSAttachment?
@@ -96,11 +96,22 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate {
                 view.setNeedsLayout()
                 view.layoutIfNeeded()
 
+                let contentHeight = scrollView.contentSize.height
+                let scrollViewHeight = scrollView.frame.size.height
+                guard contentHeight >=  scrollViewHeight else {
+                    // All content is visible within the scroll view. No need to offset.
+                    return
+                }
+
+                // We want to include at least a little portion of the message, but scroll no farther than necessary.
                 let showAtLeast: CGFloat = 50
-                let middleCenter = CGPoint(x: bubbleView.frame.origin.x + bubbleView.frame.width / 2,
-                                           y: bubbleView.frame.origin.y + bubbleView.frame.height - showAtLeast)
-                let offset = bubbleView.superview!.convert(middleCenter, to: scrollView)
-                self.scrollView!.setContentOffset(offset, animated: false)
+                let bubbleViewBottom = bubbleView.superview!.convert(bubbleView.frame, to: scrollView).maxY
+                let maxOffset =  bubbleViewBottom - showAtLeast
+                let lastPage = contentHeight - scrollViewHeight
+
+                let offset = CGPoint(x: 0, y: min(maxOffset, lastPage))
+
+                scrollView.setContentOffset(offset, animated: false)
             }
         }
     }