diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCard.java b/src/com/android/settings/homepage/contextualcards/ContextualCard.java
index 4e4e34f..ca5555b 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCard.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCard.java
@@ -33,13 +33,16 @@
     /**
      * Flags indicating the type of the ContextualCard.
      */
-    @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.LEGACY_SUGGESTION, CardType.CONDITIONAL})
+    @IntDef({CardType.DEFAULT, CardType.SLICE, CardType.LEGACY_SUGGESTION, CardType.CONDITIONAL,
+            CardType.CONDITIONAL_HEADER, CardType.CONDITIONAL_FOOTER})
     @Retention(RetentionPolicy.SOURCE)
     public @interface CardType {
         int DEFAULT = 0;
         int SLICE = 1;
         int LEGACY_SUGGESTION = 2;
         int CONDITIONAL = 3;
+        int CONDITIONAL_HEADER = 4;
+        int CONDITIONAL_FOOTER = 5;
     }
 
     private final Builder mBuilder;
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
index 6fcc636..4eb4c6b 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
@@ -42,6 +42,7 @@
     private final ConditionManager mConditionManager;
 
     private ContextualCardUpdateListener mListener;
+    private boolean mIsExpanded;
 
     public ConditionContextualCardController(Context context) {
         mContext = context;
@@ -49,6 +50,10 @@
         mConditionManager.startMonitoringStateChange();
     }
 
+    public void setIsExpanded(boolean isExpanded) {
+        mIsExpanded = isExpanded;
+    }
+
     @Override
     public void setCardUpdateListener(ContextualCardUpdateListener listener) {
         mListener = listener;
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java
new file mode 100644
index 0000000..17a5bfa
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCard.java
@@ -0,0 +1,50 @@
+/*
+ * 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.settings.homepage.contextualcards.conditional;
+
+import com.android.settings.homepage.contextualcards.ContextualCard;
+
+/**
+ * Data class representing a condition footer {@link ContextualCard}.
+ *
+ * Use this class for {@link ConditionFooterContextualCardRenderer} and
+ * {@link ConditionContextualCardController}.
+ */
+public class ConditionFooterContextualCard extends ContextualCard {
+
+    private ConditionFooterContextualCard(Builder builder) {
+        super(builder);
+    }
+
+    @Override
+    public int getCardType() {
+        return CardType.CONDITIONAL_FOOTER;
+    }
+
+    public static class Builder extends ContextualCard.Builder {
+
+        @Override
+        public Builder setCardType(int cardType) {
+            throw new IllegalArgumentException(
+                    "Cannot change card type for " + getClass().getName());
+        }
+
+        public ConditionFooterContextualCard build() {
+            return new ConditionFooterContextualCard(this);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java
new file mode 100644
index 0000000..2465ca4
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionFooterContextualCardRenderer.java
@@ -0,0 +1,79 @@
+/*
+ * 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.settings.homepage.contextualcards.conditional;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.view.View;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
+import com.android.settings.homepage.contextualcards.ControllerRendererPool;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+public class ConditionFooterContextualCardRenderer implements ContextualCardRenderer {
+    public static final int VIEW_TYPE = R.layout.homepage_condition_footer;
+    private static final String TAG = "ConditionFooterRenderer";
+
+    private final Context mContext;
+    private final ControllerRendererPool mControllerRendererPool;
+
+    public ConditionFooterContextualCardRenderer(Context context,
+            ControllerRendererPool controllerRendererPool) {
+        mContext = context;
+        mControllerRendererPool = controllerRendererPool;
+    }
+
+    @Override
+    public int getViewType(boolean isHalfWidth) {
+        return VIEW_TYPE;
+    }
+
+    @Override
+    public RecyclerView.ViewHolder createViewHolder(View view) {
+        return new ConditionFooterCardHolder(view);
+    }
+
+    @Override
+    public void bindView(RecyclerView.ViewHolder holder, ContextualCard card) {
+        final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory(
+                mContext).getMetricsFeatureProvider();
+        holder.itemView.setOnClickListener(v -> {
+            metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
+                    SettingsEnums.SETTINGS_HOMEPAGE,
+                    null /* key */,
+                    0 /* false */);
+            final ConditionContextualCardController controller =
+                    mControllerRendererPool.getController(mContext,
+                            ContextualCard.CardType.CONDITIONAL_FOOTER);
+            controller.setIsExpanded(false);
+            controller.onConditionsChanged();
+        });
+    }
+
+    public static class ConditionFooterCardHolder extends RecyclerView.ViewHolder {
+        public ConditionFooterCardHolder(View itemView) {
+            super(itemView);
+        }
+    }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java
new file mode 100644
index 0000000..f1a0fed
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCard.java
@@ -0,0 +1,66 @@
+/*
+ * 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.settings.homepage.contextualcards.conditional;
+
+import com.android.settings.homepage.contextualcards.ContextualCard;
+
+import java.util.List;
+
+/**
+ * Data class representing a condition header {@link ContextualCard}.
+ *
+ * Use this class to store additional attributes on top of {@link ContextualCard} for
+ * {@link ConditionHeaderContextualCardRenderer} and {@link ConditionContextualCardController}.
+ */
+public class ConditionHeaderContextualCard extends ContextualCard {
+
+    private final List<ContextualCard> mConditionalCards;
+
+    private ConditionHeaderContextualCard(Builder builder) {
+        super(builder);
+        mConditionalCards = builder.mConditionalCards;
+    }
+
+    @Override
+    public int getCardType() {
+        return CardType.CONDITIONAL_HEADER;
+    }
+
+    public List<ContextualCard> getConditionalCards() {
+        return mConditionalCards;
+    }
+
+    public static class Builder extends ContextualCard.Builder {
+
+        private List<ContextualCard> mConditionalCards;
+
+        public Builder setConditionalCards(List<ContextualCard> conditionalCards) {
+            mConditionalCards = conditionalCards;
+            return this;
+        }
+
+        @Override
+        public Builder setCardType(int cardType) {
+            throw new IllegalArgumentException(
+                    "Cannot change card type for " + getClass().getName());
+        }
+
+        public ConditionHeaderContextualCard build() {
+            return new ConditionHeaderContextualCard(this);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java
new file mode 100644
index 0000000..a98c82d
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionHeaderContextualCardRenderer.java
@@ -0,0 +1,97 @@
+/*
+ * 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.settings.homepage.contextualcards.conditional;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
+import com.android.settings.homepage.contextualcards.ControllerRendererPool;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
+public class ConditionHeaderContextualCardRenderer implements ContextualCardRenderer {
+    public static final int VIEW_TYPE = R.layout.homepage_condition_header;
+    private static final String TAG = "ConditionHeaderRenderer";
+
+    private final Context mContext;
+    private final ControllerRendererPool mControllerRendererPool;
+
+    public ConditionHeaderContextualCardRenderer(Context context,
+            ControllerRendererPool controllerRendererPool) {
+        mContext = context;
+        mControllerRendererPool = controllerRendererPool;
+    }
+
+    @Override
+    public int getViewType(boolean isHalfWidth) {
+        return VIEW_TYPE;
+    }
+
+    @Override
+    public RecyclerView.ViewHolder createViewHolder(View view) {
+        return new ConditionHeaderCardHolder(view);
+    }
+
+    @Override
+    public void bindView(RecyclerView.ViewHolder holder, ContextualCard contextualCard) {
+        final ConditionHeaderContextualCard headerCard =
+                (ConditionHeaderContextualCard) contextualCard;
+        final ConditionHeaderCardHolder view = (ConditionHeaderCardHolder) holder;
+        final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory(
+                mContext).getMetricsFeatureProvider();
+        view.icons.removeAllViews();
+        headerCard.getConditionalCards().stream().forEach(card -> {
+            final ImageView icon = (ImageView) LayoutInflater.from(mContext).inflate(
+                    R.layout.homepage_condition_header_icon, view.icons, false);
+            icon.setImageDrawable(card.getIconDrawable());
+            view.icons.addView(icon);
+        });
+        view.itemView.setOnClickListener(v -> {
+            metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                    MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND,
+                    SettingsEnums.SETTINGS_HOMEPAGE,
+                    null /* key */,
+                    1 /* true */);
+            final ConditionContextualCardController controller =
+                    mControllerRendererPool.getController(mContext,
+                            ContextualCard.CardType.CONDITIONAL_HEADER);
+            controller.setIsExpanded(true);
+            controller.onConditionsChanged();
+        });
+    }
+
+    public static class ConditionHeaderCardHolder extends RecyclerView.ViewHolder {
+        public final LinearLayout icons;
+        public final ImageView expandIndicator;
+
+        public ConditionHeaderCardHolder(View itemView) {
+            super(itemView);
+            icons = itemView.findViewById(R.id.header_icons_container);
+            expandIndicator = itemView.findViewById(R.id.expand_indicator);
+        }
+    }
+}
