diff --git a/library/main/src/com/android/car/setupwizardlib/summary/DeferredAction.java b/library/main/src/com/android/car/setupwizardlib/summary/DeferredAction.java
new file mode 100644
index 0000000..3add5be
--- /dev/null
+++ b/library/main/src/com/android/car/setupwizardlib/summary/DeferredAction.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2019 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.car.setupwizardlib.summary;
+
+/**
+ * An instance of a summary action's deferred state. This includes the deferred notification
+ * description and the completion state.
+ */
+public class DeferredAction implements Comparable<DeferredAction> {
+
+    public final String deferredNotificationDescription;
+    public final boolean completed;
+    public final int priority;
+
+    public DeferredAction(String deferredNotificationDescription, boolean completed, int priority) {
+        this.deferredNotificationDescription = deferredNotificationDescription;
+        this.completed = completed;
+        this.priority = priority;
+    }
+
+    @Override
+    public int compareTo(DeferredAction o) {
+        if (o == null) {
+            return 1;
+        }
+        return priority - o.priority;
+    }
+}
diff --git a/library/main/src/com/android/car/setupwizardlib/summary/PartnerSummaryActionsCollector.java b/library/main/src/com/android/car/setupwizardlib/summary/PartnerSummaryActionsCollector.java
index 15f180a..aae89dc 100644
--- a/library/main/src/com/android/car/setupwizardlib/summary/PartnerSummaryActionsCollector.java
+++ b/library/main/src/com/android/car/setupwizardlib/summary/PartnerSummaryActionsCollector.java
@@ -47,6 +47,8 @@
     // Methods for fetching info from the content provider.
     private static final String METHOD_GET_ACTION_COMPLETION_STATE = "get_action_completion_state";
     private static final String METHOD_GET_ACTION_SUMMARY_STATE = "get_action_summary_state";
+    private static final String METHOD_GET_DEFERRED_ACTION_STATE =
+            "get_deferred_action_state";
     private static final String METHOD_GET_SUMMARY_ACTIONS = "get_summary_actions";
 
     // Constants for fetching information from the bundles passed back by the content provider.
@@ -68,15 +70,30 @@
             "summary_action_icon_resource_name";
     private static final String EXTRA_SUMMARY_COMPLETED_DESCRIPTION =
             "summary_action_completed_description";
+    private static final String EXTRA_SUMMARY_ACTION_DEFERRED_NOTIFICATION_DESCRIPTION =
+            "summary_action_deferred_notification_description";
 
     // Extra used as a key for the action id passed in to query summary action state.
     private static final String EXTRA_ACTION_ID = "action_id";
     private static PartnerSummaryActionsCollector partnerSummaryActionsCollector;
     private final Context context;
+    private Uri mContentProviderUri;
 
     /** private constructor, should use getter. */
     private PartnerSummaryActionsCollector(Context context) {
         this.context = context;
+        ResolveInfo resolveInfo = getSummaryContentProviderResolveInfo(context.getPackageManager());
+
+        if (resolveInfo == null) {
+            Log.e(TAG, "Could not find partner content provider, ignoring partner summary items.");
+            return;
+        }
+
+        mContentProviderUri = getSummaryContentProviderUri(resolveInfo);
+
+        if (mContentProviderUri == null) {
+            Log.e(TAG, "Could not fetch content provider URI, ignoring partner summary items.");
+        }
     }
 
     /** Gets the current instance of the {@link PartnerSummaryActionsCollector}. */
@@ -146,6 +163,28 @@
                 completedDescription);
     }
 
+    /**
+     * Creates a {@link DeferredAction} based on the passed in completion state and deferred action
+     * state bundle. Will return null if there is no notification description or a null bundle.
+     */
+    private static DeferredAction buildDeferredAction(boolean completed,
+            Bundle deferredActionState) {
+        if (deferredActionState == null) {
+            Log.e(TAG, "Cannot build deferred action with null deferredActionState");
+            return null;
+        }
+
+        String deferredNotificationDescription = deferredActionState.getString(
+                EXTRA_SUMMARY_ACTION_DEFERRED_NOTIFICATION_DESCRIPTION);
+        if (deferredNotificationDescription == null) {
+            Log.v(TAG, "Cannot build deferred action with no notification description");
+            return null;
+        }
+
+        int priority = deferredActionState.getInt(EXTRA_SUMMARY_ACTION_PRIORITY, 0);
+        return new DeferredAction(deferredNotificationDescription, completed, priority);
+    }
+
     private static ResolveInfo getSummaryContentProviderResolveInfo(PackageManager packageManager) {
         Intent contentProviderQueryIntent = new Intent(CONTENT_PROVIDER_INTENT_ACTION);
         List<ResolveInfo> queryResults =
@@ -188,26 +227,17 @@
 
     /**
      * Gets the list of provided partner summary actions. Will return an empty list if none are
-     * found
-     * or there is an error loading them.
+     * found or there is an error loading them.
      */
     public List<SummaryAction> getPartnerSummaryActions() {
-        ResolveInfo resolveInfo = getSummaryContentProviderResolveInfo(context.getPackageManager());
-
-        if (resolveInfo == null) {
-            Log.v(TAG, "Could not find partner content provider.");
-            return new ArrayList<>();
-        }
-
-        Uri contentProviderUri = getSummaryContentProviderUri(resolveInfo);
-
-        if (contentProviderUri == null) {
-            Log.e(TAG, "Could not fetch content provider URI, ignoring partner summary items");
+        if (mContentProviderUri == null) {
+            Log.e(TAG, "No content provider URI found, summary actions ignored");
             return new ArrayList<>();
         }
         ArrayList<String> partnerSummaryActions;
         try {
-            partnerSummaryActions = getPartnerSummaryActionsFromContentProvider(contentProviderUri);
+            partnerSummaryActions = getPartnerSummaryActionsFromContentProvider(
+                    mContentProviderUri);
         } catch (NullPointerException | IllegalArgumentException e) {
             Log.e(TAG, "Unable to find or successfully query content provider, ignoring action", e);
             return new ArrayList<>();
@@ -223,9 +253,9 @@
             Log.v(TAG, "Attempting to generate summary action for id: " + actionId);
             try {
                 boolean completed =
-                        getActionCompletionStateFromContentProvider(actionId, contentProviderUri);
+                        getActionCompletionStateFromContentProvider(actionId, mContentProviderUri);
                 Bundle summaryActionBundle =
-                        getActionSummaryStateFromContentProvider(actionId, contentProviderUri);
+                        getActionSummaryStateFromContentProvider(actionId, mContentProviderUri);
                 SummaryAction summaryAction = buildSummaryAction(completed, summaryActionBundle);
                 if (summaryAction != null) {
                     summaryActionList.add(summaryAction);
@@ -236,12 +266,60 @@
                         "Unable to load the completion or config state for summary action: "
                                 + actionId,
                         e);
-                continue;
             }
         }
         return summaryActionList;
     }
 
+    /** Returns the set of partner deferred actions provided by the partner content provider. */
+    public List<DeferredAction> getPartnerDeferredActions() {
+        if (mContentProviderUri == null) {
+            Log.e(TAG, "No content provider URI found, deferred actions ignored");
+            return new ArrayList<>();
+        }
+
+        ArrayList<String> partnerSummaryActions;
+        try {
+            partnerSummaryActions = getPartnerSummaryActionsFromContentProvider(
+                    mContentProviderUri);
+        } catch (NullPointerException | IllegalArgumentException e) {
+            Log.e(TAG, "Unable to find or successfully query content provider, ignoring action", e);
+            return new ArrayList<>();
+        }
+
+        if (partnerSummaryActions == null || partnerSummaryActions.isEmpty()) {
+            Log.v(TAG, "No actions were fetched for partners");
+            return new ArrayList<>();
+        }
+
+        List<DeferredAction> deferredActions = new ArrayList<>();
+        for (String actionId : partnerSummaryActions) {
+            Log.v(TAG, "Attempting to generate deferred action for id: " + actionId);
+            try {
+                boolean completed =
+                        getActionCompletionStateFromContentProvider(actionId, mContentProviderUri);
+                Bundle deferredActionBundle =
+                        getDeferredActionStateFromContentProvider(actionId, mContentProviderUri);
+                if (deferredActionBundle == null) {
+                    Log.v(TAG, "No valid deferredActionBundle for action: " + actionId);
+                    continue;
+                }
+                DeferredAction deferredAction = buildDeferredAction(completed,
+                        deferredActionBundle);
+                if (deferredAction != null) {
+                    deferredActions.add(deferredAction);
+                }
+            } catch (NullPointerException e) {
+                Log.e(
+                        TAG,
+                        "Unable to load the completion or config state for deferred action: "
+                                + actionId,
+                        e);
+            }
+        }
+        return deferredActions;
+    }
+
     /**
      * Gets the list of actionId's for the partner summary actions form the passed in content
      * provider
@@ -253,10 +331,10 @@
      */
     private ArrayList<String> getPartnerSummaryActionsFromContentProvider(Uri contentProviderUri) {
         Bundle result = context.getContentResolver().call(
-                        contentProviderUri,
-                        METHOD_GET_SUMMARY_ACTIONS,
-                        /* arg= */ null,
-                        /* extras= */ null);
+                contentProviderUri,
+                METHOD_GET_SUMMARY_ACTIONS,
+                /* arg= */ null,
+                /* extras= */ null);
         if (result == null || result.getStringArrayList(EXTRA_SUMMARY_ACTIONS_LIST) == null) {
             Log.e(
                     TAG,
@@ -281,10 +359,10 @@
         Bundle completionStateArgs = new Bundle();
         completionStateArgs.putString(EXTRA_ACTION_ID, actionId);
         Bundle result = context.getContentResolver().call(
-                        contentProviderUri,
-                        METHOD_GET_ACTION_COMPLETION_STATE,
-                        /* arg= */ null,
-                        completionStateArgs);
+                contentProviderUri,
+                METHOD_GET_ACTION_COMPLETION_STATE,
+                /* arg= */ null,
+                completionStateArgs);
         if (result == null || !result.containsKey(EXTRA_IS_ACTION_COMPLETED)) {
             throw new IllegalArgumentException(
                     "No action with id " + actionId + " found in content provider");
@@ -297,14 +375,26 @@
         Bundle summaryStateArgs = new Bundle();
         summaryStateArgs.putString(EXTRA_ACTION_ID, actionId);
         Bundle result = context.getContentResolver().call(
-                        contentProviderUri,
-                        METHOD_GET_ACTION_SUMMARY_STATE,
-                        /* arg= */ null,
-                        summaryStateArgs);
+                contentProviderUri,
+                METHOD_GET_ACTION_SUMMARY_STATE,
+                /* arg= */ null,
+                summaryStateArgs);
         if (result == null) {
             throw new IllegalArgumentException(
                     "No action summary found in content provider for " + actionId);
         }
         return result;
     }
+
+    private Bundle getDeferredActionStateFromContentProvider(String actionId,
+            Uri contentProviderUri) {
+        Bundle deferredStateArgs = new Bundle();
+        deferredStateArgs.putString(EXTRA_ACTION_ID, actionId);
+        Bundle result = context.getContentResolver().call(
+                contentProviderUri,
+                METHOD_GET_DEFERRED_ACTION_STATE,
+                /* arg= */ null,
+                deferredStateArgs);
+        return result;
+    }
 }
diff --git a/library/main/src/com/android/car/setupwizardlib/summary/SummaryAction.java b/library/main/src/com/android/car/setupwizardlib/summary/SummaryAction.java
index 3a84651..aac4ce7 100644
--- a/library/main/src/com/android/car/setupwizardlib/summary/SummaryAction.java
+++ b/library/main/src/com/android/car/setupwizardlib/summary/SummaryAction.java
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-
 package com.android.car.setupwizardlib.summary;
 
 import android.annotation.NonNull;
