diff --git a/res/drawable/ic_custom_seekbar_minus.xml b/res/drawable/ic_custom_seekbar_minus.xml
new file mode 100644
index 0000000..56f0066
--- /dev/null
+++ b/res/drawable/ic_custom_seekbar_minus.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 crDroid Android 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0" >
+    <path
+        android:fillColor="?android:attr/colorControlNormal"
+        android:pathData="M19,13H5V11H19V13Z" />
+</vector>
diff --git a/res/drawable/ic_custom_seekbar_plus.xml b/res/drawable/ic_custom_seekbar_plus.xml
new file mode 100644
index 0000000..26f3b54
--- /dev/null
+++ b/res/drawable/ic_custom_seekbar_plus.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 crDroid Android 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="48.0"
+        android:viewportHeight="48.0" >
+    <path
+        android:fillColor="?android:attr/colorControlNormal"
+        android:pathData="M38.0,26.0L26.0,26.0l0.0,12.0l-4.0,0.0L22.0,26.0L10.0,26.0l0.0,-4.0l12.0,0.0L22.0,10.0l4.0,0.0l0.0,12.0l12.0,0.0l0.0,4.0z" />
+</vector>
diff --git a/res/drawable/ic_custom_seekbar_reset.xml b/res/drawable/ic_custom_seekbar_reset.xml
new file mode 100644
index 0000000..e072b05
--- /dev/null
+++ b/res/drawable/ic_custom_seekbar_reset.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2018 crDroid Android 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0" >
+    <path
+        android:fillColor="?android:attr/colorControlNormal"
+        android:pathData="M12.5,8C9.85,8 7.45,9 5.6,10.6L2,7V16H11L7.38,12.38C8.77,11.22 10.54,10.5 12.5,10.5C16.04,10.5 19.05,12.81 20.1,16L22.47,15.22C21.08,11.03 17.15,8 12.5,8Z" />
+</vector>
diff --git a/res/layout/preference_custom_seekbar.xml b/res/layout/preference_custom_seekbar.xml
index a703f68..53e3982 100644
--- a/res/layout/preference_custom_seekbar.xml
+++ b/res/layout/preference_custom_seekbar.xml
@@ -22,70 +22,117 @@
     android:gravity="center_vertical"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:clickable="false"
-    android:orientation="horizontal">
+    android:background="?android:attr/activatedBackgroundIndicator"
+    android:clipToPadding="false">
 
     <LinearLayout
-        android:id="@+id/text_container"
+        android:id="@android:id/icon_frame"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:minWidth="44dp"
-        android:gravity="center"
+        android:layout_marginStart="-4dp"
+        android:minWidth="60dp"
+        android:gravity="start|center_vertical"
         android:orientation="horizontal"
+        android:paddingEnd="12dp"
         android:paddingTop="4dp"
         android:paddingBottom="4dp">
-        <TextView
-            android:id="@+id/seekBarPrefValue"
+        <com.android.internal.widget.PreferenceImageView
+            android:id="@android:id/icon"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textAlignment="center"
-            android:singleLine="false"
-            android:ellipsize="end"
-            android:textAppearance="@android:style/TextAppearance.Material.Body1"
-            android:textColor="?android:attr/textColorSecondary"/>
+            android:maxWidth="48dp"
+            android:maxHeight="48dp" />
     </LinearLayout>
 
-    <LinearLayout
-        android:layout_width="match_parent"
+    <RelativeLayout
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:layout_marginTop="8dip"
-        android:layout_marginBottom="8dip">
+        android:layout_weight="1"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp">
 
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:ellipsize="marquee" />
+
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@android:id/title"
+            android:layout_alignStart="@android:id/title"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"
+            android:maxLines="10"
+            android:ellipsize="end" />
+
+        <RelativeLayout
+            android:id="@+id/value_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@android:id/summary"
+            android:layout_alignStart="@android:id/title" >
+
             <TextView
-                android:id="@android:id/title"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:paddingStart="12dp"
-                android:singleLine="true"
-                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-                android:textColor="?android:attr/textColorPrimary"
-                android:ellipsize="marquee"
-                android:fadingEdge="horizontal"/>
-            <!-- Preference should place its actual preference widget here. -->
-            <LinearLayout
-                android:id="@android:id/widget_frame"
+                android:id="@+id/value"
                 android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:gravity="end|center_vertical"
-                android:paddingStart="16dp"
-                android:orientation="vertical"/>
-        </LinearLayout>
+                android:layout_height="wrap_content"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+                android:textColor="?android:attr/textColorSecondary"
+                android:maxLines="1"
+                android:ellipsize="end" />
 
-        <FrameLayout
+            <ImageView
+                android:id="@+id/reset"
+                android:src="@drawable/ic_custom_seekbar_reset"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="4dp"
+                android:layout_toEndOf="@id/value"
+                android:layout_centerVertical="true" />
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/seekbar_frame"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginTop="6dp">
+            android:layout_below="@id/value_frame"
+            android:layout_alignStart="@android:id/title" >
 
-            <LinearLayout android:id="@+id/seekBarPrefBarContainer"
-                android:layout_gravity="center_vertical"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-        </FrameLayout>
-    </LinearLayout>
+            <ImageView
+                android:id="@+id/minus"
+                android:src="@drawable/ic_custom_seekbar_minus"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentStart="true"
+                android:layout_centerVertical="true" />
+
+            <ImageView
+                android:id="@+id/plus"
+                android:src="@drawable/ic_custom_seekbar_plus"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true" />
+
+            <SeekBar
+                android:id="@+id/seekbar"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_toEndOf="@id/minus"
+                android:layout_toStartOf="@id/plus"
+                android:layout_centerVertical="true" />
+
+        </RelativeLayout>
+
+    </RelativeLayout>
 
 </LinearLayout>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 7ef177a..c8d3895 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -18,8 +18,9 @@
     <!-- Base attributes available to CustomSeekBarPreference. -->
     <declare-styleable name="CustomSeekBarPreference">
         <attr name="interval" format="integer" />
-        <attr name="min" format="integer" />
+        <attr name="showSign" format="boolean" />
         <attr name="units" format="string|reference" />
+        <attr name="continuousUpdates" format="boolean" />
         <attr name="defaultText" format="string|reference" />
     </declare-styleable>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
new file mode 100644
index 0000000..cc2096c
--- /dev/null
+++ b/res/values/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 Havoc-OS
+
+     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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <color name="disabled_text_color">#66000000</color>
+
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index af51b26..578a4e8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -26,4 +26,10 @@
     <string name="set">Set</string>
     <string name="color_default">Default</string>
 
+    <!-- Custom seekbar -->
+    <string name="custom_seekbar_value">Value: <xliff:g id="v">%s</xliff:g></string>
+    <string name="custom_seekbar_default_value">by default</string>
+    <string name="custom_seekbar_default_value_to_set">Default value: <xliff:g id="v">%s</xliff:g>\nLong tap to set</string>
+    <string name="custom_seekbar_default_value_is_set">Default value is set</string>
+
 </resources>
diff --git a/src/com/bliss/support/preferences/CustomSeekBarPreference.java b/src/com/bliss/support/preferences/CustomSeekBarPreference.java
index 7e74e42..06caab0 100644
--- a/src/com/bliss/support/preferences/CustomSeekBarPreference.java
+++ b/src/com/bliss/support/preferences/CustomSeekBarPreference.java
@@ -18,69 +18,73 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.graphics.PorterDuff;
+import android.support.v4.content.res.TypedArrayUtils;
+import android.support.v7.preference.*;
 import android.util.AttributeSet;
 import android.util.Log;
-import android.view.ViewParent;
-import android.view.ViewGroup;
+import android.view.View;
+import android.widget.ImageView;
 import android.widget.SeekBar;
 import android.widget.TextView;
-import android.support.v7.preference.*;
+import android.widget.Toast;
 
 import com.bliss.support.R;
 
-public class CustomSeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener {
-    private final String TAG = getClass().getName();
-    private static final String SETTINGS_NS = "http://schemas.android.com/apk/res/com.android.settings";
-    private static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
-    private static final int DEFAULT_VALUE = 50;
+public class CustomSeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener,
+        View.OnClickListener, View.OnLongClickListener {
+    protected final String TAG = getClass().getName();
+    protected static final String ANDROIDNS = "http://schemas.android.com/apk/res/android";
 
-    private int mMin = 0;
-    private int mInterval = 1;
-    private int mCurrentValue;
-    private int mDefaultValue = -1;
-    private int mMax = 100;
-    private String mUnits = "";
-    private String mDefaultText = "";
-    private SeekBar mSeekBar;
-    private TextView mTitle;
-    private TextView mStatusText;
+    protected int mInterval = 1;
+    protected boolean mShowSign = false;
+    protected String mUnits = "";
+    protected boolean mContinuousUpdates = false;
 
-    public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    protected int mMinValue = 0;
+    protected int mMaxValue = 100;
+    protected boolean mDefaultValueExists = false;
+    protected int mDefaultValue;
+
+    protected int mValue;
+
+    protected TextView mValueTextView;
+    protected ImageView mResetImageView;
+    protected ImageView mMinusImageView;
+    protected ImageView mPlusImageView;
+    protected SeekBar mSeekBar;
+
+    protected boolean mTrackingTouch = false;
+    protected int mTrackingValue;
+
+    public CustomSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, R.styleable.CustomSeekBarPreference);
 
-        mMax = attrs.getAttributeIntValue(ANDROIDNS, "max", 100);
-        mMin = attrs.getAttributeIntValue(SETTINGS_NS, "min", 0);
-        mDefaultValue = attrs.getAttributeIntValue(ANDROIDNS, "defaultValue", -1);
-        if (mDefaultValue > mMax) {
-            mDefaultValue = mMax;
-        }
-        mUnits = getAttributeStringValue(attrs, SETTINGS_NS, "units", "");
-        mDefaultText = getAttributeStringValue(attrs, SETTINGS_NS, "defaultText", "Def");
-
-        Integer id = a.getResourceId(R.styleable.CustomSeekBarPreference_units, 0);
-        if (id > 0) {
-            mUnits = context.getResources().getString(id);
-        }
-        id = a.getResourceId(R.styleable.CustomSeekBarPreference_defaultText, 0);
-        if (id > 0) {
-            mDefaultText = context.getResources().getString(id);
-        }
-
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomSeekBarPreference);
         try {
-            String newInterval = attrs.getAttributeValue(SETTINGS_NS, "interval");
-            if (newInterval != null)
-                mInterval = Integer.parseInt(newInterval);
-        } catch (Exception e) {
-            Log.e(TAG, "Invalid interval value", e);
+            mInterval = a.getInt(R.styleable.CustomSeekBarPreference_interval, mInterval);
+            mShowSign = a.getBoolean(R.styleable.CustomSeekBarPreference_showSign, mShowSign);
+            String units = a.getString(R.styleable.CustomSeekBarPreference_units);
+            if (units != null)
+                mUnits = units;
+            mContinuousUpdates = a.getBoolean(R.styleable.CustomSeekBarPreference_continuousUpdates, mContinuousUpdates);
+        } finally {
+            a.recycle();
         }
 
-        a.recycle();
-        mSeekBar = new SeekBar(context, attrs);
-        mSeekBar.setMax(mMax - mMin);
-        mSeekBar.setOnSeekBarChangeListener(this);
+        mMinValue = attrs.getAttributeIntValue(ANDROIDNS, "min", mMinValue);
+        mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", mMaxValue);
+        if (mMaxValue < mMinValue)
+            mMaxValue = mMinValue;
+        String defaultValue = attrs.getAttributeValue(ANDROIDNS, "defaultValue");
+        mDefaultValueExists = defaultValue != null && !defaultValue.isEmpty();
+        if (mDefaultValueExists) {
+            mDefaultValue = getLimitedValue(Integer.parseInt(defaultValue));
+            mValue = mDefaultValue;
+        } else {
+            mValue = mMinValue;
+        }
+
         setLayoutResource(R.layout.preference_custom_seekbar);
     }
 
@@ -89,168 +93,201 @@
     }
 
     public CustomSeekBarPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
+        this(context, attrs, TypedArrayUtils.getAttr(context,
+                android.support.v7.preference.R.attr.preferenceStyle,
+                android.R.attr.preferenceStyle));
     }
 
     public CustomSeekBarPreference(Context context) {
         this(context, null);
     }
 
-    private String getAttributeStringValue(AttributeSet attrs, String namespace, String name,
-            String defaultValue) {
-        String value = attrs.getAttributeValue(namespace, name);
-        if (value == null)
-            value = defaultValue;
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
 
-        return value;
+        mValueTextView = (TextView) holder.findViewById(R.id.value);
+        mResetImageView = (ImageView) holder.findViewById(R.id.reset);
+        mMinusImageView = (ImageView) holder.findViewById(R.id.minus);
+        mPlusImageView = (ImageView) holder.findViewById(R.id.plus);
+
+        mSeekBar = (SeekBar) holder.findViewById(R.id.seekbar);
+
+        mSeekBar.setMax(getSeekValue(mMaxValue));
+        mSeekBar.setProgress(getSeekValue(mValue));
+
+        updateValueViews();
+
+        mSeekBar.setOnSeekBarChangeListener(this);
+
+        mResetImageView.setOnClickListener(this);
+        mMinusImageView.setOnClickListener(this);
+        mPlusImageView.setOnClickListener(this);
+        mResetImageView.setOnLongClickListener(this);
+        mMinusImageView.setOnLongClickListener(this);
+        mPlusImageView.setOnLongClickListener(this);
     }
 
-    @Override
-    public void onDependencyChanged(Preference dependency, boolean disableDependent) {
-        super.onDependencyChanged(dependency, disableDependent);
-        this.setShouldDisableView(true);
-        if (mTitle != null)
-            mTitle.setEnabled(!disableDependent);
-        if (mSeekBar != null)
-            mSeekBar.setEnabled(!disableDependent);
-        if (mStatusText != null)
-            mStatusText.setEnabled(!disableDependent);
+    protected int getLimitedValue(int v) {
+        return v < mMinValue ? mMinValue : (v > mMaxValue ? mMaxValue : v);
     }
 
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        try
-        {
-            // move our seekbar to the new view we've been given
-            ViewParent oldContainer = mSeekBar.getParent();
-            ViewGroup newContainer = (ViewGroup) view.findViewById(R.id.seekBarPrefBarContainer);
+    protected int getSeekValue(int v) {
+        return 0 - Math.floorDiv(mMinValue - v, mInterval);
+    }
 
-            if (oldContainer != newContainer) {
-                // remove the seekbar from the old view
-                if (oldContainer != null) {
-                    ((ViewGroup) oldContainer).removeView(mSeekBar);
-                }
-                // remove the existing seekbar (there may not be one) and add ours
-                newContainer.removeAllViews();
-                newContainer.addView(mSeekBar, ViewGroup.LayoutParams.FILL_PARENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT);
-            }
-        } catch (Exception ex) {
-            Log.e(TAG, "Error binding view: " + ex.toString());
-        }
-        mStatusText = (TextView) view.findViewById(R.id.seekBarPrefValue);
-        if (mCurrentValue == mDefaultValue) {
-            mStatusText.setText(mDefaultText);
+    protected String getTextValue(int v) {
+        return (mShowSign && v > 0 ? "+" : "") + String.valueOf(v) + mUnits;
+    }
+
+    protected void updateValueViews() {
+        mValueTextView.setText(getContext().getString(R.string.custom_seekbar_value,
+                (!mTrackingTouch || mContinuousUpdates ? getTextValue(mValue) + (mDefaultValueExists && mValue == mDefaultValue ? " (" + getContext().getString(R.string.custom_seekbar_default_value) + ")" : "")
+                    : "[" + getTextValue(mTrackingValue) + "]")));
+        if (!mDefaultValueExists || mValue == mDefaultValue || mTrackingTouch)
+            mResetImageView.setVisibility(View.INVISIBLE);
+        else
+            mResetImageView.setVisibility(View.VISIBLE);
+        if (mValue == mMinValue || mTrackingTouch) {
+            mMinusImageView.setClickable(false);
+            mMinusImageView.setColorFilter(getContext().getColor(R.color.disabled_text_color), PorterDuff.Mode.MULTIPLY);
         } else {
-            mStatusText.setText(String.valueOf(mCurrentValue) + mUnits);
+            mMinusImageView.setClickable(true);
+            mMinusImageView.clearColorFilter();
         }
-        mSeekBar.setProgress(mCurrentValue - mMin);
-        mTitle = (TextView) view.findViewById(android.R.id.title);
-
-        view.setDividerAllowedAbove(false);
-        //view.setDividerAllowedBelow(false);
+        if (mValue == mMaxValue || mTrackingTouch) {
+            mPlusImageView.setClickable(false);
+            mPlusImageView.setColorFilter(getContext().getColor(R.color.disabled_text_color), PorterDuff.Mode.MULTIPLY);
+        } else {
+            mPlusImageView.setClickable(true);
+            mPlusImageView.clearColorFilter();
+        }
     }
 
-    public void setMax(int max) {
-        mMax = max;
-        mSeekBar.setMax(mMax - mMin);
-    }
-
-    public void setMin(int min) {
-        mMin = min;
-        mSeekBar.setMax(mMax - mMin);
-    }
-
-    public void setIntervalValue(int value) {
-        mInterval = value;
-    }
-
-    public void setValue(int value) {
-        mCurrentValue = value;
+    protected void changeValue(int newValue) {
+        // for subclasses
     }
 
     @Override
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        int newValue = progress + mMin;
-        if (newValue > mMax)
-            newValue = mMax;
-        else if (newValue < mMin)
-            newValue = mMin;
-        else if (mInterval != 1 && newValue % mInterval != 0)
-            newValue = Math.round(((float) newValue) / mInterval) * mInterval;
-
-        // change rejected, revert to the previous value
-        if (!callChangeListener(newValue)) {
-            seekBar.setProgress(mCurrentValue - mMin);
-            return;
-        }
-        // change accepted, store it
-        mCurrentValue = newValue;
-        if (mStatusText != null) {
-            if (newValue == mDefaultValue) {
-                mStatusText.setText(mDefaultText);
-            } else {
-                mStatusText.setText(String.valueOf(newValue) + mUnits);
+        int newValue = getLimitedValue(mMinValue + (progress * mInterval));
+        if (mTrackingTouch && !mContinuousUpdates) {
+            mTrackingValue = newValue;
+            updateValueViews();
+        } else if (mValue != newValue) {
+            // change rejected, revert to the previous value
+            if (!callChangeListener(newValue)) {
+                mSeekBar.setProgress(getSeekValue(mValue));
+                return;
             }
-        }
-        persistInt(newValue);
-    }
+            // change accepted, store it
+            changeValue(newValue);
+            persistInt(newValue);
 
-    public void refresh(int newValue) {
-        // this will trigger onProgressChanged and refresh everything
-        mSeekBar.setProgress(newValue - mMin);
+            mValue = newValue;
+            updateValueViews();
+
+            notifyChanged();
+        }
     }
 
     @Override
     public void onStartTrackingTouch(SeekBar seekBar) {
+        mTrackingValue = mValue;
+        mTrackingTouch = true;
     }
 
     @Override
     public void onStopTrackingTouch(SeekBar seekBar) {
-        notifyChanged();
+        mTrackingTouch = false;
+        if (!mContinuousUpdates)
+            onProgressChanged(mSeekBar, getSeekValue(mTrackingValue), false);
     }
 
     @Override
-    protected Object onGetDefaultValue(TypedArray ta, int index) {
-        int defaultValue = ta.getInt(index, DEFAULT_VALUE);
-        return defaultValue;
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.reset) {
+            Toast.makeText(getContext(), getContext().getString(R.string.custom_seekbar_default_value_to_set, getTextValue(mDefaultValue)),
+                    Toast.LENGTH_LONG).show();
+        } else if (id == R.id.minus) {
+            setValue(mValue - mInterval, true);
+        } else if (id == R.id.plus) {
+            setValue(mValue + mInterval, true);
+        }
     }
 
     @Override
+    public boolean onLongClick(View v) {
+        int id = v.getId();
+        if (id == R.id.reset) {
+            setValue(mDefaultValue, true);
+            //Toast.makeText(getContext(), getContext().getString(R.string.custom_seekbar_default_value_is_set),
+            //        Toast.LENGTH_LONG).show();
+        } else if (id == R.id.minus) {
+            setValue(mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue < mValue * 2 ? Math.floorDiv(mMaxValue + mMinValue, 2) : mMinValue, true);
+        } else if (id == R.id.plus) {
+                setValue(mMaxValue - mMinValue > mInterval * 2 && mMaxValue + mMinValue > mValue * 2 ? -1 * Math.floorDiv(-1 * (mMaxValue + mMinValue), 2) : mMaxValue, true);
+        }
+        return true;
+    }
+
+    // dont need too much shit about initial and default values
+    // its all done in constructor already
+
+    @Override
     protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        if (restoreValue) {
-            mCurrentValue = getPersistedInt(mCurrentValue);
-        }
-        else {
-            int temp = 0;
-            try {
-                temp = (Integer) defaultValue;
-            } catch (Exception ex) {
-                Log.e(TAG, "Invalid default value: " + defaultValue.toString());
-            }
-            persistInt(temp);
-            mCurrentValue = temp;
-        }
-    }
-
-    public void setDefaultValue(int value) {
-        mDefaultValue = value;
-        if (mDefaultValue > mMax) {
-            mDefaultValue = mMax;
-        }
-        if (mCurrentValue == mDefaultValue) {
-            mStatusText.setText(mDefaultText);
-        }
+        if (restoreValue)
+            mValue = getPersistedInt(mValue);
     }
 
     @Override
-    public void setEnabled(boolean enabled) {
-        if (mSeekBar != null && mStatusText != null && mTitle != null) {
-            mSeekBar.setEnabled(enabled);
-            mStatusText.setEnabled(enabled);
-            mTitle.setEnabled(enabled);
+    public void setDefaultValue(Object defaultValue) {
+        if (defaultValue instanceof Integer)
+            setDefaultValue((Integer) defaultValue, mSeekBar != null);
+        else
+            setDefaultValue(defaultValue == null ? (String) null : defaultValue.toString(), mSeekBar != null);
+    }
+
+    public void setDefaultValue(int newValue, boolean update) {
+        newValue = getLimitedValue(newValue);
+        if (!mDefaultValueExists || mDefaultValue != newValue) {
+            mDefaultValueExists = true;
+            mDefaultValue = newValue;
+            if (update)
+                updateValueViews();
         }
-        super.setEnabled(enabled);
+    }
+
+    public void setDefaultValue(String newValue, boolean update) {
+        if (mDefaultValueExists && (newValue == null || newValue.isEmpty())) {
+            mDefaultValueExists = false;
+            if (update)
+                updateValueViews();
+        } else if (newValue != null && !newValue.isEmpty()) {
+            setDefaultValue(Integer.parseInt(newValue), update);
+        }
+    }
+
+    public void setValue(int newValue, boolean update) {
+        newValue = getLimitedValue(newValue);
+        if (mValue != newValue) {
+            if (update)
+                mSeekBar.setProgress(getSeekValue(newValue));
+            else
+                mValue = newValue;
+        }
+    }
+
+    public int getValue() {
+        return mValue;
+    }
+
+    // need some methods here to set/get other attrs at runtime,
+    // but who really need this ...
+
+    public void refresh(int newValue) {
+        // this will ...
+        setValue(newValue, mSeekBar != null);
     }
 }
