diff --git a/src/com/android/settings/SummaryPreference.java b/src/com/android/settings/SummaryPreference.java
index 38449b1..d129661 100644
--- a/src/com/android/settings/SummaryPreference.java
+++ b/src/com/android/settings/SummaryPreference.java
@@ -34,6 +34,7 @@
 
     private int mLeft, mMiddle, mRight;
     private boolean mColorsSet = false;
+    private boolean mChartEnabled = true;
     private float mLeftRatio, mMiddleRatio, mRightRatio;
     private String mStartLabel;
     private String mEndLabel;
@@ -43,6 +44,13 @@
         setLayoutResource(R.layout.settings_summary_preference);
     }
 
+    public void setChartEnabled(boolean enabled) {
+        if (mChartEnabled != enabled) {
+            mChartEnabled = enabled;
+            notifyChanged();
+        }
+    }
+
     public void setAmount(String amount) {
         mAmount = amount;
         if (mAmount != null && mUnits != null) {
@@ -85,12 +93,18 @@
         super.onBindViewHolder(holder);
 
         LinearColorBar colorBar = (LinearColorBar) holder.itemView.findViewById(R.id.color_bar);
-        colorBar.setRatios(mLeftRatio, mMiddleRatio, mRightRatio);
-        if (mColorsSet) {
-            colorBar.setColors(mLeft, mMiddle, mRight);
+
+        if (mChartEnabled) {
+            colorBar.setVisibility(View.VISIBLE);
+            colorBar.setRatios(mLeftRatio, mMiddleRatio, mRightRatio);
+            if (mColorsSet) {
+                colorBar.setColors(mLeft, mMiddle, mRight);
+            }
+        } else {
+            colorBar.setVisibility(View.GONE);
         }
 
-        if (!TextUtils.isEmpty(mStartLabel) || !TextUtils.isEmpty(mEndLabel)) {
+        if (mChartEnabled && (!TextUtils.isEmpty(mStartLabel) || !TextUtils.isEmpty(mEndLabel))) {
             holder.findViewById(R.id.label_bar).setVisibility(View.VISIBLE);
             ((TextView) holder.findViewById(android.R.id.text1)).setText(mStartLabel);
             ((TextView) holder.findViewById(android.R.id.text2)).setText(mEndLabel);
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index 796aad7..d755a7b 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -34,6 +34,7 @@
 import android.widget.EditText;
 import android.widget.NumberPicker;
 import android.widget.Spinner;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settingslib.NetworkPolicyEditor;
@@ -55,6 +56,7 @@
     private static final String TAG_WARNING_EDITOR = "warningEditor";
 
     private static final String KEY_BILLING_CYCLE = "billing_cycle";
+    private static final String KEY_SET_DATA_WARNING = "set_data_warning";
     private static final String KEY_DATA_WARNING = "data_warning";
     private static final String KEY_SET_DATA_LIMIT = "set_data_limit";
     private static final String KEY_DATA_LIMIT = "data_limit";
@@ -62,6 +64,7 @@
     private NetworkTemplate mNetworkTemplate;
     private Preference mBillingCycle;
     private Preference mDataWarning;
+    private SwitchPreference mEnableDataWarning;
     private SwitchPreference mEnableDataLimit;
     private Preference mDataLimit;
     private DataUsageController mDataUsageController;
@@ -77,6 +80,8 @@
 
         addPreferencesFromResource(R.xml.billing_cycle);
         mBillingCycle = findPreference(KEY_BILLING_CYCLE);
+        mEnableDataWarning = (SwitchPreference) findPreference(KEY_SET_DATA_WARNING);
+        mEnableDataWarning.setOnPreferenceChangeListener(this);
         mDataWarning = findPreference(KEY_DATA_WARNING);
         mEnableDataLimit = (SwitchPreference) findPreference(KEY_SET_DATA_LIMIT);
         mEnableDataLimit.setOnPreferenceChangeListener(this);
@@ -93,10 +98,15 @@
         NetworkPolicy policy = services.mPolicyEditor.getPolicy(mNetworkTemplate);
         mBillingCycle.setSummary(getString(R.string.billing_cycle_summary, policy != null ?
                 policy.cycleDay : 1));
-        mDataWarning.setSummary(Formatter.formatFileSize(getContext(),
-                policy != null
-                        ? policy.warningBytes
-                        : mDataUsageController.getDefaultWarningLevel()));
+        if (policy != null && policy.warningBytes != WARNING_DISABLED) {
+            mDataWarning.setSummary(Formatter.formatFileSize(getContext(), policy.warningBytes));
+            mDataWarning.setEnabled(true);
+            mEnableDataWarning.setChecked(true);
+        } else {
+            mDataWarning.setSummary(null);
+            mDataWarning.setEnabled(false);
+            mEnableDataWarning.setChecked(false);
+        }
         if (policy != null && policy.limitBytes != LIMIT_DISABLED) {
             mDataLimit.setSummary(Formatter.formatFileSize(getContext(), policy.limitBytes));
             mDataLimit.setEnabled(true);
@@ -133,6 +143,14 @@
                 setPolicyLimitBytes(LIMIT_DISABLED);
             }
             return true;
+        } else if (mEnableDataWarning == preference) {
+            boolean enabled = (Boolean) newValue;
+            if (enabled) {
+                setPolicyWarningBytes(mDataUsageController.getDefaultWarningLevel());
+            } else {
+                setPolicyWarningBytes(WARNING_DISABLED);
+            }
+            return true;
         }
         return false;
     }
@@ -148,6 +166,12 @@
         updatePrefs();
     }
 
+    private void setPolicyWarningBytes(long warningBytes) {
+        if (LOGD) Log.d(TAG, "setPolicyWarningBytes()");
+        services.mPolicyEditor.setPolicyWarningBytes(mNetworkTemplate, warningBytes);
+        updatePrefs();
+    }
+
     @Override
     public NetworkPolicyEditor getNetworkPolicyEditor() {
         return services.mPolicyEditor;
@@ -255,7 +279,7 @@
                 bytesString = "0";
             }
             final long bytes = (long) (Float.valueOf(bytesString)
-                        * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
+                    * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
             if (isLimit) {
                 editor.setPolicyLimitBytes(template, bytes);
             } else {
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index f975d11..fb05699 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -246,16 +246,24 @@
                     formatTitle(context, getString(mDataUsageTemplate), info.usageLevel));
             long limit = mDataInfoController.getSummaryLimit(info);
             mSummaryPreference.setSummary(info.period);
-            mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0),
-                    Formatter.formatFileSize(context, limit));
-            mSummaryPreference.setRatios(info.usageLevel / (float) limit, 0,
-                    (limit - info.usageLevel) / (float) limit);
+
+            if (limit <= 0) {
+                mSummaryPreference.setChartEnabled(false);
+            } else {
+                mSummaryPreference.setChartEnabled(true);
+                mSummaryPreference.setLabels(Formatter.formatFileSize(context, 0),
+                        Formatter.formatFileSize(context, limit));
+                mSummaryPreference.setRatios(info.usageLevel / (float) limit, 0,
+                        (limit - info.usageLevel) / (float) limit);
+            }
         }
-        if (mLimitPreference != null) {
+        if (mLimitPreference != null && (info.warningLevel > 0 || info.limitLevel > 0)) {
             String warning = Formatter.formatFileSize(context, info.warningLevel);
             String limit = Formatter.formatFileSize(context, info.limitLevel);
             mLimitPreference.setSummary(getString(info.limitLevel <= 0 ? R.string.cell_warning_only
                     : R.string.cell_warning_and_limit, warning, limit));
+        } else if (mLimitPreference != null) {
+            mLimitPreference.setSummary(null);
         }
 
         PreferenceScreen screen = getPreferenceScreen();
