diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
index 8bab2cf..4dedb98 100644
--- a/src/com/android/settings/InstrumentedFragment.java
+++ b/src/com/android/settings/InstrumentedFragment.java
@@ -16,10 +16,14 @@
 
 package com.android.settings;
 
+import android.app.Activity;
+import android.content.BroadcastReceiver;
 import android.os.Bundle;
 import android.support.v14.preference.PreferenceFragment;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.overlay.SurveyFeatureProvider;
 
 /**
  * Instrumented fragment that logs visibility state.
@@ -39,6 +43,7 @@
      * {@link com.android.settings.InstrumentedFragment}.
      */
     protected abstract int getMetricsCategory();
+    private BroadcastReceiver mReceiver;
 
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -48,10 +53,36 @@
     public void onResume() {
         super.onResume();
         MetricsLogger.visible(getActivity(), getMetricsCategory());
+
+        Activity activity = getActivity();
+        // guard against the activity not existing yet or the feature being disabled
+        if (activity != null) {
+            SurveyFeatureProvider provider =
+                    FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity);
+            if (provider != null) {
+                // Try to download a survey if there is none available, show the survey otherwise
+                String id = provider.getSurveyId(activity, getClass().getSimpleName());
+                if (provider.getSurveyExpirationDate(activity, id) <= -1) {
+                    // register the receiver to show the survey on completion.
+                    mReceiver = provider.createAndRegisterReceiver(activity);
+                    provider.downloadSurvey(activity, id, "fakeData");
+                } else {
+                    provider.showSurveyIfAvailable(activity, id);
+                }
+            }
+        }
     }
 
     @Override
     public void onPause() {
+        Activity activity = getActivity();
+        if (mReceiver != null && activity != null) {
+            SurveyFeatureProvider provider =
+                    FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity);
+            provider.unregisterReceiver(activity, mReceiver);
+            mReceiver = null;
+        }
+
         super.onPause();
         MetricsLogger.hidden(getActivity(), getMetricsCategory());
     }
diff --git a/src/com/android/settings/InstrumentedPreferenceFragment.java b/src/com/android/settings/InstrumentedPreferenceFragment.java
index 243e0bc..ee2c629 100644
--- a/src/com/android/settings/InstrumentedPreferenceFragment.java
+++ b/src/com/android/settings/InstrumentedPreferenceFragment.java
@@ -16,9 +16,13 @@
 
 package com.android.settings;
 
+import android.app.Activity;
+import android.content.BroadcastReceiver;
 import android.support.v14.preference.PreferenceFragment;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.overlay.SurveyFeatureProvider;
 
 /**
  * Instrumented preference fragment that logs visibility state.
@@ -32,15 +36,42 @@
      * {@link com.android.settings.InstrumentedFragment}.
      */
     protected abstract int getMetricsCategory();
+    private BroadcastReceiver mReceiver;
 
     @Override
     public void onResume() {
         super.onResume();
         MetricsLogger.visible(getActivity(), getMetricsCategory());
+
+        Activity activity = getActivity();
+        // guard against the activity not existing yet or the feature being disabled
+        if (activity != null) {
+            SurveyFeatureProvider provider =
+                    FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity);
+            if (provider != null) {
+                // Try to download a survey if there is none available, show the survey otherwise
+                String id = provider.getSurveyId(activity, getClass().getSimpleName());
+                if (provider.getSurveyExpirationDate(activity, id) <= -1) {
+                    // register the receiver to show the survey on completion.
+                    mReceiver = provider.createAndRegisterReceiver(activity);
+                    provider.downloadSurvey(activity, id, "fakeData");
+                } else {
+                    provider.showSurveyIfAvailable(activity, id);
+                }
+            }
+        }
     }
 
     @Override
     public void onPause() {
+        Activity activity = getActivity();
+        if (mReceiver != null && activity != null) {
+            SurveyFeatureProvider provider =
+                    FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity);
+            provider.unregisterReceiver(activity, mReceiver);
+            mReceiver = null;
+        }
+
         super.onPause();
         MetricsLogger.hidden(getActivity(), getMetricsCategory());
     }
diff --git a/src/com/android/settings/overlay/SurveyFeatureProvider.java b/src/com/android/settings/overlay/SurveyFeatureProvider.java
index 79e907f..907bed8 100644
--- a/src/com/android/settings/overlay/SurveyFeatureProvider.java
+++ b/src/com/android/settings/overlay/SurveyFeatureProvider.java
@@ -40,16 +40,46 @@
      *
      * @param activity The host activity to show the survey in.
      * @param surveyId A unique Id representing a survey to download.
+     * @return A boolean indicating if a survey was shown or not.
      */
-    void showSurveyIfAvailable(Activity activity, String surveyId);
+    boolean showSurveyIfAvailable(Activity activity, String surveyId);
 
     /**
      * A helper method to get the surveyId. Implementers should create a mapping of
      * keys to surveyIds and provide them via this function.
      *
      * @param context A valid context.
-     * @param key The key to get the surveyId for.
+     * @param simpleKey The simple name of the key to get the surveyId for.
      * @return The unique Id as a string or null on error.
      */
-    String getSurveyId(Context context, String key);
+    String getSurveyId(Context context, String simpleKey);
+
+    /**
+     * Removes the survey for {@code siteId} if it expired, then returns the expiration date (as a
+     * unix timestamp) for the remaining survey should it exist and be ready to show. Returns -1 if
+     * no valid survey exists after removing the potentially expired one.
+     *
+     * @param context the calling context.
+     * @param surveyId the site ID.
+     * @return the unix timestamp for the available survey for the given {@coe siteId} or -1 if
+     * there is none available.
+     */
+    long getSurveyExpirationDate(Context context, String surveyId);
+
+    /**
+     * Registers an activity to show surveys/prompts as soon as they are downloaded. The receiver
+     * should be unregistered prior to destroying the activity to avoid undefined behavior by
+     * calling {@link #unregisterReceiver(Activity, BroadcastReceiver)}.
+     * @param activity The activity that should show surveys once they are downloaded.
+     * @return the broadcast receiver listening for survey downloads. Must be unregistered before
+     * leaving the activity.
+     */
+    BroadcastReceiver createAndRegisterReceiver(Activity activity);
+
+    /**
+     * Unregisters the broadcast receiver for this activity. Should only be called once per activity
+     * after a call to {@link #createAndRegisterReceiver(Activity)}.
+     * @param activity The activity that was used to register the BroadcastReceiver.
+     */
+    void unregisterReceiver(Activity activity, BroadcastReceiver receiver);
 }
