diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index cf08f4a..3bec337 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -68,7 +68,10 @@
     }
     public static class BackgroundCheckSummaryActivity extends SettingsActivity { /* empty */ }
     public static class StorageUseActivity extends SettingsActivity { /* empty */ }
-    public static class DevelopmentSettingsActivity extends SettingsActivity { /* empty */ }
+    public static class DevelopmentSettingsActivity extends SettingsActivity {
+        public static final String DASHBOARD_ALIAS =
+                "com.android.settings.DevelopmentSettingsDashboardAlias";
+    }
     public static class AccessibilitySettingsActivity extends SettingsActivity { /* empty */ }
     public static class CaptioningSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
@@ -161,6 +164,7 @@
     public static class SystemSettings extends SettingsActivity { /* empty */ }
 
     // Top level categories for new IA
-    public static class SupportActivity extends SettingsActivity {}
+    public static class SystemDashboardActivity extends SettingsActivity {}
+    public static class SupportDashboardActivity extends SettingsActivity {}
 
 }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index ecfc373..08fa971 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -124,6 +124,7 @@
 import com.android.settings.search.DynamicIndexableContentMonitor;
 import com.android.settings.search.Index;
 import com.android.settings.sim.SimSettings;
+import com.android.settings.system.SystemDashboardFragment;
 import com.android.settings.tts.TextToSpeechSettings;
 import com.android.settings.users.UserSettings;
 import com.android.settings.vpn2.VpnSettings;
@@ -264,6 +265,18 @@
             Settings.AccessibilitySettingsActivity.class.getName(),
             Settings.PrintSettingsActivity.class.getName(),
             Settings.PaymentSettingsActivity.class.getName(),
+
+            // New IA
+            // Home page
+            "com.android.settings.Settings.BatteryDashboardAlias",
+            Settings.SystemDashboardActivity.class.getName(),
+            Settings.SupportDashboardActivity.class.getName(),
+            // Home page > System
+            "com.android.settings.Settings.LanguageAndInputDashboardAlias",
+            "com.android.settings.Settings.DateTimeDashboardAlias",
+            "com.android.settings.Settings.AccessibilityDashboardAlias",
+            "com.android.settings.Settings.AboutDeviceDashboardAlias",
+
     };
 
     private static final String[] ENTRY_FRAGMENTS = {
@@ -363,7 +376,8 @@
             NightDisplaySettings.class.getName(),
             ManageDomainUrls.class.getName(),
             AutomaticStorageManagerSettings.class.getName(),
-            SupportFragment.class.getName()
+            SupportFragment.class.getName(),
+            SystemDashboardFragment.class.getName(),
     };
 
 
@@ -1120,6 +1134,9 @@
         setTileEnabled(new ComponentName(packageName,
                         Settings.DevelopmentSettingsActivity.class.getName()),
                 showDev, isAdmin, pm);
+        setTileEnabled(new ComponentName(packageName,
+                        Settings.DevelopmentSettingsActivity.DASHBOARD_ALIAS),
+                showDev, isAdmin, pm);
 
         // Reveal development-only quick settings tiles
         DevelopmentTiles.setTilesEnabled(this, showDev);
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 9e86688..1186c46 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
@@ -88,6 +87,7 @@
 import android.view.animation.AnimationUtils;
 import android.widget.ListView;
 import android.widget.TabWidget;
+
 import com.android.internal.app.UnlaunchableAppActivity;
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.UserIcons;
diff --git a/src/com/android/settings/core/InstrumentedFragment.java b/src/com/android/settings/core/InstrumentedFragment.java
index e50eae3..79ba5c7 100644
--- a/src/com/android/settings/core/InstrumentedFragment.java
+++ b/src/com/android/settings/core/InstrumentedFragment.java
@@ -33,6 +33,10 @@
 
     protected MetricsFeatureProvider mMetricsFeatureProvider;
 
+    // metrics placeholder value. Only use this for development.
+    protected final int PLACEHOLDER_METRIC = 10000;
+    protected final int SYSTEM_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 1;
+
     public InstrumentedFragment() {
         // Mixin that logs visibility change for activity.
         getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
index c093748..148127e 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -16,6 +16,7 @@
 package com.android.settings.dashboard;
 
 import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
 
 import java.util.List;
 
@@ -35,7 +36,19 @@
     DashboardCategory getTilesForHomepage();
 
     /**
+     * Get tiles (wrapped in {@link DashboardCategory}) for system category.
+     */
+    DashboardCategory getTilesForSystemCategory();
+
+    /**
      * Get all tiles, grouped by category.
      */
     List<DashboardCategory> getAllCategories();
+
+    /**
+     * Returns a priority group for tile. priority level is grouped into hundreds. tiles with
+     * priority 100 - 199 belongs to priority level 100, tiles with priority 200 - 299 is in
+     * group 200, and so on.
+     */
+    int getPriorityGroup(Tile tile);
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 1f0b7f2..836bfb0 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -21,6 +21,7 @@
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.CategoryManager;
 import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
 
 import java.util.List;
 
@@ -49,7 +50,17 @@
     }
 
     @Override
+    public DashboardCategory getTilesForSystemCategory() {
+        return mCategoryManager.getTilesByCategory(mContext, CategoryKey.CATEGORY_SYSTEM);
+    }
+
+    @Override
     public List<DashboardCategory> getAllCategories() {
         return mCategoryManager.getCategories(mContext);
     }
+
+    @Override
+    public int getPriorityGroup(Tile tile) {
+        return tile.priority / 100;
+    }
 }
diff --git a/src/com/android/settings/dashboard/DashboardTilePreference.java b/src/com/android/settings/dashboard/DashboardTilePreference.java
new file mode 100644
index 0000000..918cf08
--- /dev/null
+++ b/src/com/android/settings/dashboard/DashboardTilePreference.java
@@ -0,0 +1,45 @@
+/**
+ * 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.dashboard;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import com.android.settings.DividerPreference;
+import com.android.settings.R;
+
+/**
+ * A {@code Preference} styled as a dashboard tile.
+ */
+public class DashboardTilePreference extends DividerPreference {
+
+    public DashboardTilePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public DashboardTilePreference(Context context) {
+        super(context);
+        init();
+    }
+
+    private void init() {
+        setLayoutResource(R.layout.dashboard_tile);
+        setDividerAllowedAbove(false);
+        setDividerAllowedBelow(false);
+    }
+
+}
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
new file mode 100644
index 0000000..ca56255
--- /dev/null
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -0,0 +1,89 @@
+/*
+ * 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.system;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.dashboard.DashboardFeatureProvider;
+import com.android.settings.dashboard.DashboardTilePreference;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.drawer.DashboardCategory;
+import com.android.settingslib.drawer.Tile;
+
+import java.util.List;
+
+public class SystemDashboardFragment extends SettingsPreferenceFragment implements
+        Preference.OnPreferenceClickListener {
+
+    private DashboardFeatureProvider mDashboardFeatureProvider;
+
+    @Override
+    public int getMetricsCategory() {
+        return SYSTEM_CATEGORY_FRAGMENT;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mDashboardFeatureProvider =
+                FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
+    }
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        super.onCreatePreferences(savedInstanceState, rootKey);
+        addPreferencesFromResource(R.xml.system_dashboard_fragment);
+        addDashboardCategoryAsPreference();
+    }
+
+    @Override
+    public boolean onPreferenceClick(Preference preference) {
+        // Needed to enable preference click ripple
+        return false;
+    }
+
+    /**
+     * Adds dynamic tiles for system category onto PreferenceScreen.
+     */
+    private void addDashboardCategoryAsPreference() {
+        final Context context = getContext();
+        final PreferenceScreen screen = getPreferenceScreen();
+        final DashboardCategory category = mDashboardFeatureProvider.getTilesForSystemCategory();
+        final List<Tile> tiles = category.tiles;
+        for (Tile tile : tiles) {
+            final DashboardTilePreference pref = new DashboardTilePreference(context);
+            pref.setTitle(tile.title);
+            pref.setSummary(tile.summary);
+            if (tile.icon != null) {
+                pref.setIcon(tile.icon.loadDrawable(context));
+            }
+            if (tile.intent != null) {
+                pref.setIntent(tile.intent);
+            }
+            // Use negated priority for order, because tile priority is based on intent-filter
+            // (larger value has higher priority). However pref order defines smaller value has
+            // higher priority.
+            pref.setOrder(-tile.priority);
+            screen.addPreference(pref);
+        }
+    }
+
+}
\ No newline at end of file
