diff --git a/src/com/bliss/support/preferences/CustomSystemSettingListPreference.java b/src/com/bliss/support/preferences/CustomSystemSettingListPreference.java
new file mode 100644
index 0000000..bfacd19
--- /dev/null
+++ b/src/com/bliss/support/preferences/CustomSystemSettingListPreference.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017-2018 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.bliss.support.preferences;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+public class CustomSystemSettingListPreference extends ListPreference {
+
+    public CustomSystemSettingListPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+    }
+
+    public CustomSystemSettingListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+    }
+
+    public CustomSystemSettingListPreference(Context context) {
+        super(context);
+        setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+    }
+
+    @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);
+    }
+
+}
diff --git a/src/com/bliss/support/preferences/ListPreference.java b/src/com/bliss/support/preferences/ListPreference.java
new file mode 100644
index 0000000..0bcec03
--- /dev/null
+++ b/src/com/bliss/support/preferences/ListPreference.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017-2018 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.bliss.support.preferences;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+public class ListPreference extends androidx.preference.ListPreference {
+    private boolean mAutoSummary = false;
+
+    public ListPreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public ListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public ListPreference(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void setValue(String value) {
+        super.setValue(value);
+        if (mAutoSummary || TextUtils.isEmpty(getSummary())) {
+            setSummary(getEntry(), true);
+        }
+    }
+
+    @Override
+    public void setSummary(CharSequence summary) {
+        setSummary(summary, false);
+    }
+
+    private void setSummary(CharSequence summary, boolean autoSummary) {
+        mAutoSummary = autoSummary;
+        super.setSummary(summary);
+    }
+}
diff --git a/src/com/bliss/support/preferences/LongClickablePreference.java b/src/com/bliss/support/preferences/LongClickablePreference.java
new file mode 100644
index 0000000..598cd67
--- /dev/null
+++ b/src/com/bliss/support/preferences/LongClickablePreference.java
@@ -0,0 +1,137 @@
+/*
+ * 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.bliss.support.preferences;
+
+import android.content.Context;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+public class LongClickablePreference extends Preference {
+
+    private Handler mHandler = new Handler();
+    private boolean mAllowNormalClick;
+    private boolean mAllowBurst;
+
+    private int mClickableViewId = 0;
+    private int mLongClickDurationMillis;
+    private int mLongClickBurstMillis = 0;
+    private PreferenceViewHolder mViewHolder;
+    private Preference.OnPreferenceClickListener mClickListener;
+    private Preference.OnPreferenceClickListener mLongClickListener;
+
+    public LongClickablePreference(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public LongClickablePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public LongClickablePreference(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        mViewHolder = holder;
+
+        setupClickListeners();
+    }
+
+    @Override
+    public void setOnPreferenceClickListener(
+            Preference.OnPreferenceClickListener onPreferenceClickListener) {
+        mClickListener = onPreferenceClickListener;
+
+        setupClickListeners();
+    }
+
+    public void setOnLongClickListener(int viewId, int longClickDurationMillis,
+            Preference.OnPreferenceClickListener onPreferenceClickListener) {
+        mClickableViewId = viewId;
+        mLongClickDurationMillis = longClickDurationMillis;
+        mLongClickListener = onPreferenceClickListener;
+
+        setupClickListeners();
+    }
+
+    private Runnable mLongClickRunnable = new Runnable() {
+            @Override
+            public void run() {
+                mAllowNormalClick = false;
+                mLongClickListener.onPreferenceClick(LongClickablePreference.this);
+                if (mAllowBurst && mLongClickBurstMillis > 0) {
+                    mHandler.postDelayed(this, mLongClickBurstMillis);
+                }
+            }
+    };
+
+    public void setLongClickBurst(int intervalMillis) {
+        mLongClickBurstMillis = intervalMillis;
+    }
+
+    private void setupClickListeners() {
+        // We can't put long click listener on our view without sacrificing default
+        // preference click functionality, so detect long clicks manually with touch listener
+        if (mClickableViewId != 0 && mViewHolder != null) {
+            View view = mViewHolder.findViewById(mClickableViewId);
+            if (view != null) {
+                view.setOnTouchListener(new View.OnTouchListener() {
+                        @Override
+                        public boolean onTouch(View v, MotionEvent event) {
+                            switch (event.getActionMasked()) {
+                                case MotionEvent.ACTION_DOWN:
+                                    mAllowNormalClick = true;
+                                    mAllowBurst = true;
+                                    mHandler.postDelayed(mLongClickRunnable,
+                                            mLongClickDurationMillis);
+                                    break;
+                                case MotionEvent.ACTION_UP:
+                                    mHandler.removeCallbacks(mLongClickRunnable);
+                                    mAllowBurst = false;
+                                    break;
+                            }
+                            return false;
+                        }
+                });
+            }
+        }
+        // Use our own preference click listener to handle both normal and long clicks
+        if (getOnPreferenceClickListener() == null) {
+            super.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        mAllowBurst = false;
+                        mHandler.removeCallbacks(mLongClickRunnable);
+                        if (mAllowNormalClick) {
+                            return mClickListener != null &&
+                                    mClickListener.onPreferenceClick(preference);
+                        } else {
+                            // Long press done
+                            return true;
+                        }
+                    }
+
+            });
+        }
+    }
+}
