diff --git a/src/com/havoc/support/preferences/SystemSettingListPreference.java b/src/com/havoc/support/preferences/SystemSettingListPreference.java
index e10b561..7e9447f 100644
--- a/src/com/havoc/support/preferences/SystemSettingListPreference.java
+++ b/src/com/havoc/support/preferences/SystemSettingListPreference.java
@@ -1,11 +1,11 @@
 /*
- * Copyright (C) 2016 The CyanogenMod project
+ * Copyright (C) 2017 AICP
  *
  * 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
+ * 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,
@@ -17,47 +17,61 @@
 package com.havoc.support.preferences;
 
 import android.content.Context;
-import android.provider.Settings;
 import android.support.v7.preference.ListPreference;
+import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.provider.Settings;
 
 public class SystemSettingListPreference extends ListPreference {
+    private boolean mAutoSummary = false;
+
     public SystemSettingListPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
     }
 
     public SystemSettingListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+    }
+
+    public SystemSettingListPreference(Context context) {
+        super(context);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
     }
 
     @Override
-    protected boolean persistString(String value) {
-        if (shouldPersist()) {
-            if (value == getPersistedString(null)) {
-                // It's already there, so the same as persisting
-                return true;
-            }
-            Settings.System.putString(getContext().getContentResolver(), getKey(), value);
-            return true;
+    public void setValue(String value) {
+        super.setValue(value);
+        if (mAutoSummary || TextUtils.isEmpty(getSummary())) {
+            setSummary(getEntry(), true);
         }
-        return false;
     }
 
     @Override
-    protected String getPersistedString(String defaultReturnValue) {
-        if (!shouldPersist()) {
-            return defaultReturnValue;
-        }
-        String value = Settings.System.getString(getContext().getContentResolver(), getKey());
-        return value == null ? defaultReturnValue : value;
+    public void setSummary(CharSequence summary) {
+        setSummary(summary, false);
+    }
+
+    private void setSummary(CharSequence summary, boolean autoSummary) {
+        mAutoSummary = autoSummary;
+        super.setSummary(summary);
+    }
+
+    @Override
+    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+        // This is what default ListPreference implementation is doing without respecting
+        // real default value:
+        //setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
+        // Instead, we better do
+        setValue(restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue);
     }
 
     @Override
     protected boolean isPersisted() {
-        return Settings.System.getString(getContext().getContentResolver(), getKey()) != null;
+        // Using getString instead of getInt so we can simply check for null
+        // instead of catching an exception. (All values are stored as strings.)
+        return Settings.Secure.getString(getContext().getContentResolver(), getKey()) != null;
     }
 
-    public int getIntValue(int defValue) {
-        return getValue() == null ? defValue : Integer.valueOf(getValue());
-    }
 }
diff --git a/src/com/havoc/support/preferences/SystemSettingsStore.java b/src/com/havoc/support/preferences/SystemSettingsStore.java
new file mode 100644
index 0000000..ccdf4f7
--- /dev/null
+++ b/src/com/havoc/support/preferences/SystemSettingsStore.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2017 AICP
+ *
+ * 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.havoc.support.preferences;
+
+import android.content.ContentResolver;
+import android.preference.PreferenceDataStore;
+import android.provider.Settings;
+
+public class SystemSettingsStore extends android.support.v7.preference.PreferenceDataStore
+        implements PreferenceDataStore {
+
+    private ContentResolver mContentResolver;
+
+    public SystemSettingsStore(ContentResolver contentResolver) {
+        mContentResolver = contentResolver;
+    }
+
+    public boolean getBoolean(String key, boolean defValue) {
+        return getInt(key, defValue ? 1 : 0) != 0;
+    }
+
+    public float getFloat(String key, float defValue) {
+        return Settings.System.getFloat(mContentResolver, key, defValue);
+    }
+
+    public int getInt(String key, int defValue) {
+        return Settings.System.getInt(mContentResolver, key, defValue);
+    }
+
+    public long getLong(String key, long defValue) {
+        return Settings.System.getLong(mContentResolver, key, defValue);
+    }
+
+    public String getString(String key, String defValue) {
+        String result = Settings.System.getString(mContentResolver, key);
+        return result == null ? defValue : result;
+    }
+
+    public void putBoolean(String key, boolean value) {
+        putInt(key, value ? 1 : 0);
+    }
+
+    public void putFloat(String key, float value) {
+        Settings.System.putFloat(mContentResolver, key, value);
+    }
+
+    public void putInt(String key, int value) {
+        Settings.System.putInt(mContentResolver, key, value);
+    }
+
+    public void putLong(String key, long value) {
+        Settings.System.putLong(mContentResolver, key, value);
+    }
+
+    public void putString(String key, String value) {
+        Settings.System.putString(mContentResolver, key, value);
+    }
+
+}
