diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml
index 2d5542b..34ec611 100644
--- a/java/com/android/dialer/app/res/values/strings.xml
+++ b/java/com/android/dialer/app/res/values/strings.xml
@@ -686,8 +686,8 @@
   <!-- Content of voicemail donation promo dialog
        [CHAR LIMIT=NONE] -->
   <string name="voicemail_donation_promo_content">
-    Let Google review your voicemail messages to improve transcription quality. Your
-    voicemail messages will not be tied to your Google Account.
+    Let Google review your voicemail messages to improve transcription quality.
+    For voicemail transcription analysis, your voicemail messages are stored anonymously.
   </string>
 
   <!-- Text for a 'learn more' link at the end of the voicemail donation promo dialog content -->
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
index 5ae26f5..7f5bb79 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
@@ -32,12 +32,14 @@
 import android.telecom.TelecomManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.TelephonyManager;
+import android.text.Html;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.notification.NotificationChannelManager;
 import com.android.dialer.telecom.TelecomUtil;
+import com.android.dialer.widget.TextViewPreference;
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailClient.ActivationStateListener;
 import com.android.voicemail.VoicemailComponent;
@@ -73,6 +75,7 @@
   private SwitchPreference donateVoicemailSwitchPreference;
   private Preference voicemailChangePinPreference;
   private PreferenceScreen advancedSettings;
+  private TextViewPreference voicemailTranscriptionInstructionText;
 
   @Override
   public void onCreate(Bundle icicle) {
@@ -209,6 +212,10 @@
             return false;
           }
         });
+
+    voicemailTranscriptionInstructionText =
+        (TextViewPreference) findPreference(getString(R.string.voicemail_transcription_text_key));
+    voicemailTranscriptionInstructionText.setTitle(getVoicemailTranscriptionInstructionsText());
   }
 
   @Override
@@ -348,4 +355,20 @@
     builder.setCancelable(true);
     builder.show();
   }
+
+  /**
+   * Builds a spannable string containing the voicemail transcription instructions text containing
+   * the appropriate "Learn More" urls.
+   *
+   * @return The voicemail transcription instructions text.
+   */
+  private CharSequence getVoicemailTranscriptionInstructionsText() {
+    String settingText =
+        getString(
+            R.string.voicemail_transcription_instruction_text,
+            getString(R.string.transcription_learn_more_url),
+            getString(R.string.donation_learn_more_url));
+    CharSequence settingSeq = Html.fromHtml(settingText);
+    return settingSeq;
+  }
 }
diff --git a/java/com/android/dialer/voicemail/settings/res/values/strings.xml b/java/com/android/dialer/voicemail/settings/res/values/strings.xml
index 10fa459..47228b7 100644
--- a/java/com/android/dialer/voicemail/settings/res/values/strings.xml
+++ b/java/com/android/dialer/voicemail/settings/res/values/strings.xml
@@ -44,7 +44,7 @@
   <string name="voicemail_change_pin_key" translatable="false">voicemail_change_pin_key</string>
 
   <!-- Visual voicemail on/off title [CHAR LIMIT=40] -->
-  <string name="voicemail_visual_voicemail_switch_title">Visual Voicemail</string>
+  <string name="voicemail_visual_voicemail_switch_title">Visual voicemail</string>
 
   <!-- Visual voicemail archive on/off title [CHAR LIMIT=40] -->
   <string name="voicemail_visual_voicemail_auto_archive_switch_title">Extra backup and storage</string>
@@ -125,4 +125,18 @@
   <!-- The label for the confirm-disable-voicemail button [CHAR LIMIT=16] -->
   <string name="confirm_disable_voicemail_accept_dialog_label">TURN OFF</string>
 
+  <!-- Internal preferences key for static instruction text. -->
+  <string name="voicemail_transcription_text_key" translatable="false">voicemail_transcription_text_key</string>
+
+  <!-- Additional information text and links for visual voicemail and voicemail donation setting page
+       [CHAR LIMIT=NONE] -->
+  <string name="voicemail_transcription_instruction_text">
+    Visual voicemail allows you to check voicemail messages without having to call voicemail. Transcripts provided by Google. &lt;a href="<xliff:g example="http://www.google.com" id="url1">%1$s</xliff:g>">Learn&#160;more&lt;/a>
+    &lt;br>&lt;br>
+    For voicemail transcription analysis, your voicemail messages are stored anonymously. &lt;a href="<xliff:g example="http://www.google.com" id="url2">%2$s</xliff:g>">Learn&#160;more&lt;/a>
+  </string>
+
+  <string translatable="false" name="transcription_learn_more_url">https://support.google.com/phoneapp/answer/2811844?hl=en%26ref_topic=7539039</string>
+  <string translatable="false" name="donation_learn_more_url">https://support.google.com/phoneapp/answer/2811844#voicemail_transcript</string>
+
 </resources>
diff --git a/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml b/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml
index 9b0391a..75c8cfe 100644
--- a/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml
+++ b/java/com/android/dialer/voicemail/settings/res/xml/voicemail_settings.xml
@@ -43,4 +43,8 @@
     android:key="@string/voicemail_advanced_settings_key"
     android:title="@string/voicemail_advanced_settings_title">
     </PreferenceScreen>
+
+  <com.android.dialer.widget.TextViewPreference
+    android:key="@string/voicemail_transcription_text_key"/>
+
 </PreferenceScreen>
diff --git a/java/com/android/dialer/widget/TextViewPreference.java b/java/com/android/dialer/widget/TextViewPreference.java
new file mode 100644
index 0000000..2c1885c
--- /dev/null
+++ b/java/com/android/dialer/widget/TextViewPreference.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.widget;
+
+import android.content.Context;
+import android.preference.Preference;
+import android.text.method.LinkMovementMethod;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Provides a {@link TextView} inside a preference. Useful for displaying static text which may
+ * contain hyperlinks.
+ */
+public class TextViewPreference extends Preference {
+
+  /**
+   * The resource ID of the text to be populated in the {@link TextView} when a resource ID is used.
+   */
+  private int textResourceId = 0;
+
+  /** The text to be populated in the {@link TextView} when a {@link CharSequence} is used. */
+  private CharSequence text;
+
+  /** The {@link TextView} containing the text. */
+  private TextView textView;
+
+  /**
+   * Instantiates the {@link TextViewPreference} instance.
+   *
+   * @param context The Context this is associated with, through which it can access the current
+   *     theme, resources, etc.
+   * @param attrs The attributes of the XML tag that is inflating the preference.
+   * @param defStyleAttr An attribute in the current theme that contains a reference to a style
+   *     resource that supplies default values for the view. Can be 0 to not look for defaults.
+   * @param defStyleRes A resource identifier of a style resource that supplies default values for
+   *     the view, used only if defStyleAttr is 0 or can not be found in the theme. Can be 0 to not
+   *     look for defaults.
+   */
+  public TextViewPreference(
+      Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    super(context, attrs, defStyleAttr, defStyleRes);
+
+    setLayoutResource(R.layout.text_view_preference);
+  }
+
+  /**
+   * Instantiates the {@link TextViewPreference} instance.
+   *
+   * @param context The Context this is associated with, through which it can access the current
+   *     theme, resources, etc.
+   * @param attrs The attributes of the XML tag that is inflating the preference.
+   * @param defStyleAttr An attribute in the current theme that contains a reference to a style
+   *     resource that supplies default values for the view. Can be 0 to not look for defaults.
+   */
+  public TextViewPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+    this(context, attrs, defStyleAttr, 0);
+  }
+
+  /**
+   * Instantiates the {@link TextViewPreference} instance.
+   *
+   * @param context The Context this is associated with, through which it can access the current
+   *     theme, resources, etc.
+   * @param attrs The attributes of the XML tag that is inflating the preference.
+   */
+  public TextViewPreference(Context context, AttributeSet attrs) {
+    this(context, attrs, android.R.attr.preferenceStyle, 0);
+  }
+
+  /**
+   * Instantiates the {@link TextViewPreference} instance.
+   *
+   * @param context The Context this is associated with, through which it can access the current
+   *     theme, resources, etc.
+   */
+  public TextViewPreference(Context context) {
+    super(context, null);
+
+    setLayoutResource(R.layout.text_view_preference);
+  }
+
+  /**
+   * Handles binding the preference.
+   *
+   * @param view The view.
+   */
+  @Override
+  protected void onBindView(View view) {
+    super.onBindView(view);
+    textView = (TextView) view.findViewById(R.id.text);
+    if (textResourceId != 0) {
+      setTitle(textResourceId);
+    } else if (text != null) {
+      setTitle(text);
+    }
+  }
+
+  /**
+   * Sets the preference title from a {@link CharSequence}.
+   *
+   * @param text The text.
+   */
+  @Override
+  public void setTitle(CharSequence text) {
+    textResourceId = 0;
+    this.text = text;
+    if (textView == null) {
+      return;
+    }
+
+    textView.setMovementMethod(LinkMovementMethod.getInstance());
+    textView.setText(text);
+  }
+
+  /**
+   * Sets the preference title from a resource id.
+   *
+   * @param textResId The string resource Id.
+   */
+  @Override
+  public void setTitle(int textResId) {
+    textResourceId = textResId;
+    setTitle(getContext().getString(textResId));
+  }
+}
diff --git a/java/com/android/dialer/widget/res/layout/text_view_preference.xml b/java/com/android/dialer/widget/res/layout/text_view_preference.xml
new file mode 100644
index 0000000..39b5506
--- /dev/null
+++ b/java/com/android/dialer/widget/res/layout/text_view_preference.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+  android:id="@+id/text"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:padding="16dp"
+  android:fontFamily="sans-serif"
+  android:linksClickable="true"
+  android:singleLine="false"/>
