diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..9f4aed2
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=review.blissroms.com
+port=29418
+project=platform_frameworks_support.git
+defaultbranch=p9.0
diff --git a/content/src/main/java/androidx/contentpager/content/Query.java b/content/src/main/java/androidx/contentpager/content/Query.java
index d1cfbde..d9d35e0 100644
--- a/content/src/main/java/androidx/contentpager/content/Query.java
+++ b/content/src/main/java/androidx/contentpager/content/Query.java
@@ -37,7 +37,7 @@
  */
 public final class Query {
 
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
     private static final String TAG = "Query";
 
     private final Uri mUri;
diff --git a/preference/res/drawable-v21/ic_arrow_down_24dp.xml b/preference/res/drawable-v21/ic_arrow_down_24dp.xml
index 1815b8c..7a709eb 100644
--- a/preference/res/drawable-v21/ic_arrow_down_24dp.xml
+++ b/preference/res/drawable-v21/ic_arrow_down_24dp.xml
@@ -18,9 +18,8 @@
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorAccent">
+        android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="@*android:color/accent_device_default_dark"
         android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
 </vector>
diff --git a/preference/res/drawable/ic_arrow_down_24dp.xml b/preference/res/drawable/ic_arrow_down_24dp.xml
index c52399e..84628df 100644
--- a/preference/res/drawable/ic_arrow_down_24dp.xml
+++ b/preference/res/drawable/ic_arrow_down_24dp.xml
@@ -20,6 +20,6 @@
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
     <path
-        android:fillColor="#FF000000"
+        android:fillColor="@*android:color/accent_device_default_dark"
         android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
 </vector>
diff --git a/preference/res/values/colors.xml b/preference/res/values/colors.xml
index cb4f235..86b5f69 100644
--- a/preference/res/values/colors.xml
+++ b/preference/res/values/colors.xml
@@ -17,5 +17,5 @@
 
 <resources>
     <!-- Fallback color for versions of the system where ?android:attr/colorAccent is not available -->
-    <color name="preference_fallback_accent_color">#ff80cbc4</color>
+    <color name="preference_fallback_accent_color">@*android:color/accent_device_default_light</color>
 </resources>
diff --git a/preference/src/main/java/androidx/preference/Preference.java b/preference/src/main/java/androidx/preference/Preference.java
index 50833b5..1bec258 100644
--- a/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/src/main/java/androidx/preference/Preference.java
@@ -1510,6 +1510,14 @@
         mDefaultValue = defaultValue;
     }
 
+     /**
+     * Returns whether the preference can be found in persistent storage
+     * @hide
+     */
+    protected boolean isPersisted() {
+        return getSharedPreferences().contains(mKey);
+    }
+
     private void dispatchSetInitialValue() {
         if (getPreferenceDataStore() != null) {
             onSetInitialValue(true, mDefaultValue);
@@ -1518,7 +1526,7 @@
 
         // By now, we know if we are persistent.
         final boolean shouldPersist = shouldPersist();
-        if (!shouldPersist || !getSharedPreferences().contains(mKey)) {
+        if (!shouldPersist || !isPersisted()) {
             if (mDefaultValue != null) {
                 onSetInitialValue(false, mDefaultValue);
             }
diff --git a/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 6cde56d..3fa60db 100644
--- a/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/v7/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -164,6 +164,10 @@
 
     static final boolean DEBUG = false;
 
+    private static final boolean OPTS_INPUT = true;
+
+    private static final double MOVE_TOUCH_SLOP = 0.3;
+
     static final boolean VERBOSE_TRACING = false;
 
     private static final int[]  NESTED_SCROLLING_ATTRS =
@@ -234,6 +238,10 @@
      */
     public static final int TOUCH_SLOP_DEFAULT = 0;
 
+    private boolean mIsFirstTouchMoveEvent = false;
+    private int mMoveAcceleration;
+    private int mNumTouchMoveEvent = 0;
+
     /**
      * Constant for use with {@link #setScrollingTouchSlop(int)}. Indicates
      * that the RecyclerView should use the standard touch slop for scrolling
@@ -619,6 +627,9 @@
                 ViewConfigurationCompat.getScaledHorizontalScrollFactor(vc, context);
         mScaledVerticalScrollFactor =
                 ViewConfigurationCompat.getScaledVerticalScrollFactor(vc, context);
+        if (OPTS_INPUT) {
+            mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+        }
         mMinFlingVelocity = vc.getScaledMinimumFlingVelocity();
         mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
         setWillNotDraw(getOverScrollMode() == View.OVER_SCROLL_NEVER);
@@ -1066,10 +1077,16 @@
                 // fall-through
             case TOUCH_SLOP_DEFAULT:
                 mTouchSlop = vc.getScaledTouchSlop();
+                if (OPTS_INPUT) {
+                    mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+                }
                 break;
 
             case TOUCH_SLOP_PAGING:
                 mTouchSlop = vc.getScaledPagingTouchSlop();
+                if (OPTS_INPUT) {
+                    mMoveAcceleration = (int)(mTouchSlop * MOVE_TOUCH_SLOP);
+                }
                 break;
         }
     }
@@ -2951,6 +2968,9 @@
 
         switch (action) {
             case MotionEvent.ACTION_DOWN:
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 if (mIgnoreMotionEventTillDown) {
                     mIgnoreMotionEventTillDown = false;
                 }
@@ -2977,12 +2997,18 @@
                 break;
 
             case MotionEvent.ACTION_POINTER_DOWN:
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(actionIndex);
                 mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
                 break;
 
             case MotionEvent.ACTION_MOVE: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent++;
+                }
                 final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id "
@@ -2996,11 +3022,31 @@
                     final int dx = x - mInitialTouchX;
                     final int dy = y - mInitialTouchY;
                     boolean startScroll = false;
-                    if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {
+
+                    boolean isFarEnoughX = false;
+                    boolean isFarEnoughY = false;
+                    int realTouchSlop;
+                    if (OPTS_INPUT) {
+                        if (mNumTouchMoveEvent == 1) {
+                            isFarEnoughX = Math.abs(dx) > mMoveAcceleration;
+                            isFarEnoughY = Math.abs(dy) > mMoveAcceleration;
+                            realTouchSlop = mMoveAcceleration;
+                        } else {
+                            isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                            isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                            realTouchSlop = mTouchSlop;
+                        }
+                    } else {
+                        isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                        isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                        realTouchSlop = mTouchSlop;
+                    }
+
+                    if (canScrollHorizontally && isFarEnoughX) {
                         mLastTouchX = x;
                         startScroll = true;
                     }
-                    if (canScrollVertically && Math.abs(dy) > mTouchSlop) {
+                    if (canScrollVertically && isFarEnoughY) {
                         mLastTouchY = y;
                         startScroll = true;
                     }
@@ -3011,15 +3057,24 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 onPointerUp(e);
             } break;
 
             case MotionEvent.ACTION_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mVelocityTracker.clear();
                 stopNestedScroll(TYPE_TOUCH);
             } break;
 
             case MotionEvent.ACTION_CANCEL: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 cancelTouch();
             }
         }
@@ -3069,6 +3124,9 @@
 
         switch (action) {
             case MotionEvent.ACTION_DOWN: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(0);
                 mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f);
@@ -3084,12 +3142,18 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_DOWN: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mScrollPointerId = e.getPointerId(actionIndex);
                 mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
             } break;
 
             case MotionEvent.ACTION_MOVE: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent++;
+                }
                 final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id "
@@ -3111,21 +3175,40 @@
                     mNestedOffsets[1] += mScrollOffset[1];
                 }
 
+                boolean isFarEnoughX = false;
+                boolean isFarEnoughY = false;
+                int realTouchSlop;
+                if (OPTS_INPUT) {
+                    if (mNumTouchMoveEvent == 1) {
+                        isFarEnoughX = Math.abs(dx) > mMoveAcceleration;
+                        isFarEnoughY = Math.abs(dy) > mMoveAcceleration;
+                        realTouchSlop = mMoveAcceleration;
+                    } else {
+                        isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                        isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                        realTouchSlop = mTouchSlop;
+                    }
+                } else {
+                    isFarEnoughX = Math.abs(dx) > mTouchSlop;
+                    isFarEnoughY = Math.abs(dy) > mTouchSlop;
+                    realTouchSlop = mTouchSlop;
+                }
+
                 if (mScrollState != SCROLL_STATE_DRAGGING) {
                     boolean startScroll = false;
-                    if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {
+                    if (canScrollHorizontally && isFarEnoughX) {
                         if (dx > 0) {
-                            dx -= mTouchSlop;
+                            dx -= realTouchSlop;
                         } else {
-                            dx += mTouchSlop;
+                            dx += realTouchSlop;
                         }
                         startScroll = true;
                     }
-                    if (canScrollVertically && Math.abs(dy) > mTouchSlop) {
+                    if (canScrollVertically && isFarEnoughY) {
                         if (dy > 0) {
-                            dy -= mTouchSlop;
+                            dy -= realTouchSlop;
                         } else {
-                            dy += mTouchSlop;
+                            dy += realTouchSlop;
                         }
                         startScroll = true;
                     }
@@ -3151,10 +3234,16 @@
             } break;
 
             case MotionEvent.ACTION_POINTER_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 onPointerUp(e);
             } break;
 
             case MotionEvent.ACTION_UP: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 mVelocityTracker.addMovement(vtev);
                 eventAddedToVelocityTracker = true;
                 mVelocityTracker.computeCurrentVelocity(1000, mMaxFlingVelocity);
@@ -3169,6 +3258,9 @@
             } break;
 
             case MotionEvent.ACTION_CANCEL: {
+                if (OPTS_INPUT) {
+                    mNumTouchMoveEvent = 0;
+                }
                 cancelTouch();
             } break;
         }
