diff --git a/Signal/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json
new file mode 100644
index 000000000..04380b6ec
--- /dev/null
+++ b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-dark@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-dark@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-dark@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png
new file mode 100644
index 000000000..7cafa41f9
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@1x.png differ
diff --git a/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png
new file mode 100644
index 000000000..efce04881
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@2x.png differ
diff --git a/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png
new file mode 100644
index 000000000..5ecdfa362
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-dark.imageset/ios-rick-roll-dark@3x.png differ
diff --git a/Signal/Images.xcassets/introducing-link-previews-light.imageset/Contents.json b/Signal/Images.xcassets/introducing-link-previews-light.imageset/Contents.json
new file mode 100644
index 000000000..cbae4da59
--- /dev/null
+++ b/Signal/Images.xcassets/introducing-link-previews-light.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-light@1x.png",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-light@2x.png",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "filename" : "ios-rick-roll-light@3x.png",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
\ No newline at end of file
diff --git a/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png
new file mode 100644
index 000000000..b7ed78e34
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@1x.png differ
diff --git a/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png
new file mode 100644
index 000000000..16422c6da
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@2x.png differ
diff --git a/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png
new file mode 100644
index 000000000..a73f3e7c9
Binary files /dev/null and b/Signal/Images.xcassets/introducing-link-previews-light.imageset/ios-rick-roll-light@3x.png differ
diff --git a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift
index fbdc4a0ad..c9e291af0 100644
--- a/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift
+++ b/Signal/src/ViewControllers/ExperienceUpgradesPageViewController.swift
@@ -640,6 +640,17 @@ public class ExperienceUpgradesPageViewController: OWSViewController, UIPageView
         self.pageViewController.setViewControllers([ firstViewController ], direction: .forward, animated: false, completion: nil)
     }
 
+    func dismissButtonTitle() -> String {
+        // This should be true for "Opt-in" features/upgrades.
+        let useNotNowButton = false
+        if useNotNowButton {
+            return NSLocalizedString("EXPERIENCE_UPGRADE_DISMISS_BUTTON",
+                                     comment: "Button to dismiss/ignore the one time splash screen that appears after upgrading")
+        } else {
+            return NSLocalizedString("OK", comment: "")
+        }
+    }
+
     @objc public override func loadView() {
         self.view = UIView.container()
         view.backgroundColor = Theme.backgroundColor
@@ -658,7 +669,7 @@ public class ExperienceUpgradesPageViewController: OWSViewController, UIPageView
         // Dismiss button
         let dismissButton = UIButton()
         view.addSubview(dismissButton)
-        dismissButton.setTitle(NSLocalizedString("EXPERIENCE_UPGRADE_DISMISS_BUTTON", comment: "Button to dismiss/ignore the one time splash screen that appears after upgrading"), for: .normal)
+        dismissButton.setTitle(dismissButtonTitle(), for: .normal)
         dismissButton.setTitleColor(UIColor.ows_signalBrandBlue, for: .normal)
         dismissButton.isUserInteractionEnabled = true
         dismissButton.addTarget(self, action: #selector(didTapDismissButton), for: .touchUpInside)
diff --git a/Signal/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift b/Signal/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift
index 03ccb1cef..ea55bfc09 100644
--- a/Signal/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift
+++ b/Signal/src/environment/ExperienceUpgrades/ExperienceUpgradeFinder.swift
@@ -1,5 +1,5 @@
 //
-//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
+//  Copyright (c) 2019 Open Whisper Systems. All rights reserved.
 //
 
 import Foundation
@@ -11,7 +11,8 @@ enum ExperienceUpgradeId: String {
     introducingProfiles = "003",
     introducingReadReceipts = "004",
     introducingCustomNotificationAudio = "005",
-    introducingTypingIndicators = "006"
+    introducingTypingIndicators = "006",
+    introducingLinkPreviews = "007"
 }
 
 @objc public class ExperienceUpgradeFinder: NSObject {
@@ -69,6 +70,21 @@ enum ExperienceUpgradeId: String {
                                  image: #imageLiteral(resourceName: "introductory_splash_custom_audio"))
     }
 
+    var linkPreviews: ExperienceUpgrade {
+        let imageName = Theme.isDarkThemeEnabled ? "introducing-link-previews-dark" : "introducing-link-previews-light"
+        let image: UIImage
+        if let heroImage = UIImage(named: imageName) {
+            image = heroImage
+        } else {
+            owsFailDebug("Could not load hero image.")
+            image = #imageLiteral(resourceName: "introductory_splash_custom_audio")
+        }
+        return ExperienceUpgrade(uniqueId: ExperienceUpgradeId.introducingLinkPreviews.rawValue,
+                                 title: NSLocalizedString("UPGRADE_EXPERIENCE_INTRODUCING_LINK_PREVIEWS_TITLE", comment: "Header for upgrading users"),
+                                 body: NSLocalizedString("UPGRADE_EXPERIENCE_INTRODUCING_LINK_PREVIEWS_DESCRIPTION", comment: "Body text for upgrading users"),
+                                 image: image)
+    }
+
     // Keep these ordered by increasing uniqueId.
     @objc
     public var allExperienceUpgrades: [ExperienceUpgrade] {
@@ -82,7 +98,8 @@ enum ExperienceUpgradeId: String {
             // introducingProfiles,
             // introducingReadReceipts,
             // configurableNotificationAudio
-            typingIndicators
+            // typingIndicators
+            linkPreviews
         ].compactMap { $0 }
     }
 
diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings
index 97ca3abdc..4b1cf2ddf 100644
--- a/Signal/translations/en.lproj/Localizable.strings
+++ b/Signal/translations/en.lproj/Localizable.strings
@@ -2375,6 +2375,12 @@
 /* button label shown one time, after upgrade */
 "UPGRADE_EXPERIENCE_ENABLE_TYPING_INDICATOR_BUTTON" = "Turn On Typing Indicators";
 
+/* Body text for upgrading users */
+"UPGRADE_EXPERIENCE_INTRODUCING_LINK_PREVIEWS_DESCRIPTION" = "Optional link previews are now supported for some of the most popular sites on the Internet. You can disable or enable this feature anytime in your Signal settings (Privacy > Send link previews).";
+
+/* Header for upgrading users */
+"UPGRADE_EXPERIENCE_INTRODUCING_LINK_PREVIEWS_TITLE" = "Link Previews";
+
 /* Description for notification audio customization */
 "UPGRADE_EXPERIENCE_INTRODUCING_NOTIFICATION_AUDIO_DESCRIPTION" = "You can now choose default and per-conversation notification sounds, and calls will respect the ringtone you've chosen for each system contact.";