diff --git a/res/layout/support_disclaimer_content.xml b/res/layout/support_disclaimer_content.xml
new file mode 100644
index 0000000..c7a5689
--- /dev/null
+++ b/res/layout/support_disclaimer_content.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:padding="24dp">
+
+    <TextView
+        android:id="@+id/support_disclaimer_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/support_disclaimer_content"/>
+
+</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 07f36e1..9e6f77e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7532,6 +7532,13 @@
 
     <!-- Button label that redirects user who needs help for signin to help screen [CHAR LIMIT=NONE]-->
     <string name="support_sign_in_required_help">Can\'t access your account?</string>
+
+    <!-- Dialog title displayed before initiating real time support [CHAR LIMIT=80]-->
+    <string name="support_disclaimer_title">Send system information</string>
+
+    <!-- Dialog content displayed before initiating real time support  [CHAR LIMIT=NONE]-->
+    <string name="support_disclaimer_content">To help address your issue quickly, we need system information for diagnosis.</string>
+
     <!-- [CHAR LIMIT=60] Title of work profile setting page -->
     <string name="managed_profile_settings_title">Work profile settings</string>
     <!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java
index d3862b4..4956464 100644
--- a/src/com/android/settings/dashboard/SupportItemAdapter.java
+++ b/src/com/android/settings/dashboard/SupportItemAdapter.java
@@ -20,6 +20,7 @@
 import android.annotation.LayoutRes;
 import android.annotation.StringRes;
 import android.app.Activity;
+import android.app.DialogFragment;
 import android.content.Intent;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
@@ -30,6 +31,7 @@
 
 import com.android.settings.R;
 import com.android.settings.overlay.SupportFeatureProvider;
+import com.android.settings.support.SupportDisclaimerDialogFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -248,25 +250,44 @@
     }
 
     /**
+     * Show a disclaimer dialog and start support action after disclaimer has been acknowledged.
+     */
+    private void tryStartDisclaimerAndSupport(final @SupportFeatureProvider.SupportType int type) {
+        if (mSupportFeatureProvider.shouldShowDisclaimerDialog(mActivity)) {
+            DialogFragment fragment = SupportDisclaimerDialogFragment.newInstance(mAccount, type);
+            fragment.show(mActivity.getFragmentManager(), SupportDisclaimerDialogFragment.TAG);
+            return;
+        }
+        mSupportFeatureProvider.startSupport(mActivity, mAccount, type);
+    }
+
+    /**
      * Click handler for starting escalation options.
      */
     private final class EscalationClickListener implements View.OnClickListener {
         @Override
-        public void onClick(View v) {
-            switch (v.getId()) {
-                case android.R.id.text1: {
-                    final Intent intent = mAccount == null
-                            ? mSupportFeatureProvider.getAccountLoginIntent()
-                            : mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, PHONE);
-                    mActivity.startActivityForResult(intent, 0 /* requestCode */);
-                    break;
+        public void onClick(final View v) {
+            if (mAccount == null) {
+                switch (v.getId()) {
+                    case android.R.id.text1:
+                        mActivity.startActivityForResult(
+                                mSupportFeatureProvider.getAccountLoginIntent(),
+                                0 /* requestCode */);
+                        break;
+                    case android.R.id.text2:
+                        mActivity.startActivityForResult(
+                                mSupportFeatureProvider.getSignInHelpIntent(mActivity),
+                                0 /* requestCode */);
+                        break;
                 }
-                case android.R.id.text2: {
-                    final Intent intent = mAccount == null
-                            ? mSupportFeatureProvider.getSignInHelpIntent(mActivity)
-                            : mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, CHAT);
-                    mActivity.startActivityForResult(intent, 0 /* requestCode */);
-                    break;
+            } else {
+                switch (v.getId()) {
+                    case android.R.id.text1:
+                        tryStartDisclaimerAndSupport(PHONE);
+                        break;
+                    case android.R.id.text2:
+                        tryStartDisclaimerAndSupport(CHAT);
+                        break;
                 }
             }
         }
@@ -321,10 +342,14 @@
         }
 
         static final class Builder {
-            @LayoutRes private final int mType;
-            @DrawableRes private int mIcon;
-            @StringRes private int mText1;
-            @StringRes private int mText2;
+            @LayoutRes
+            private final int mType;
+            @DrawableRes
+            private int mIcon;
+            @StringRes
+            private int mText1;
+            @StringRes
+            private int mText2;
             private String mSummary1;
             private String mSummary2;
             private Intent mIntent;
diff --git a/src/com/android/settings/overlay/SupportFeatureProvider.java b/src/com/android/settings/overlay/SupportFeatureProvider.java
index e0b7862..e95a928 100644
--- a/src/com/android/settings/overlay/SupportFeatureProvider.java
+++ b/src/com/android/settings/overlay/SupportFeatureProvider.java
@@ -18,6 +18,7 @@
 
 import android.accounts.Account;
 import android.annotation.IntDef;
+import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 
@@ -58,18 +59,23 @@
     String getEstimatedWaitTime(Context context, @SupportType int type);
 
     /**
+     * Whether or not a disclaimer dialog should be displayed.
+     */
+    boolean shouldShowDisclaimerDialog(Context context);
+
+    /**
      * Returns an {@link Account} that's eligible for support options.
      */
     Account getSupportEligibleAccount(Context context);
 
     /**
-     * Returns an {@link Intent} that opens email support for specified account.
+     * Starts support activity of specified type
      *
-     * @param context A UI Context
+     * @param activity Calling activity
      * @param account A account returned by {@link #getSupportEligibleAccount}
      * @param type The type of support account needs.
      */
-    Intent getSupportIntent(Context context, Account account, @SupportType int type);
+    void startSupport(Activity activity, Account account, @SupportType int type);
 
     /**
      * Returns an {@link Intent} that opens help and allow user get help on sign in.
diff --git a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
new file mode 100644
index 0000000..98f34bc
--- /dev/null
+++ b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2016 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.settings.support;
+
+import android.accounts.Account;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.Spannable;
+import android.text.TextPaint;
+import android.text.method.LinkMovementMethod;
+import android.text.style.URLSpan;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.overlay.SupportFeatureProvider;
+
+/**
+ * {@link DialogFragment} for support disclaimer.
+ */
+public final class SupportDisclaimerDialogFragment extends DialogFragment implements
+        DialogInterface.OnClickListener {
+
+    public static final String TAG = "SupportDisclaimerDialog";
+    private static final String EXTRA_TYPE = "extra_type";
+    private static final String EXTRA_ACCOUNT = "extra_account";
+
+    public static SupportDisclaimerDialogFragment newInstance(Account account,
+            @SupportFeatureProvider.SupportType int type) {
+        final SupportDisclaimerDialogFragment fragment = new SupportDisclaimerDialogFragment();
+        final Bundle bundle = new Bundle(2);
+        bundle.putParcelable(SupportDisclaimerDialogFragment.EXTRA_ACCOUNT, account);
+        bundle.putInt(SupportDisclaimerDialogFragment.EXTRA_TYPE, type);
+        fragment.setArguments(bundle);
+        return fragment;
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.support_disclaimer_title)
+                .setPositiveButton(android.R.string.ok, this)
+                .setNegativeButton(android.R.string.cancel, null);
+        final View content = LayoutInflater.from(builder.getContext())
+                .inflate(R.layout.support_disclaimer_content, null);
+        final TextView disclaimer = (TextView) content.findViewById(R.id.support_disclaimer_text);
+        disclaimer.setMovementMethod(LinkMovementMethod.getInstance());
+        stripUnderlines((Spannable) disclaimer.getText());
+        return builder
+            .setView(content)
+            .create();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        final Activity activity = getActivity();
+        final SupportFeatureProvider supportFeatureProvider =
+                FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
+        final Bundle bundle = getArguments();
+        supportFeatureProvider.startSupport(getActivity(),
+                (Account) bundle.getParcelable(EXTRA_ACCOUNT), bundle.getInt(EXTRA_TYPE));
+    }
+
+    /**
+     * Removes the underlines of {@link android.text.style.URLSpan}s.
+     */
+    private static void stripUnderlines(Spannable input) {
+        final URLSpan[] urls = input.getSpans(0, input.length(), URLSpan.class);
+
+        for (URLSpan span : urls) {
+            final int start = input.getSpanStart(span);
+            final int end = input.getSpanEnd(span);
+            input.removeSpan(span);
+            input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
+                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+        }
+    }
+
+    /**
+     * A {@link URLSpan} that doesn't decorate the link with underline.
+     */
+    public static class NoUnderlineUrlSpan extends URLSpan {
+
+        public NoUnderlineUrlSpan(String url) {
+            super(url);
+        }
+
+        @Override
+        public void updateDrawState(TextPaint ds) {
+            super.updateDrawState(ds);
+            ds.setUnderlineText(false);
+        }
+    }
+}
