diff --git a/src-bind/com/android/contactsbind/experiments/Flags.java b/src-bind/com/android/contactsbind/experiments/Flags.java
index 5bf47e8..e2bfb5c 100644
--- a/src-bind/com/android/contactsbind/experiments/Flags.java
+++ b/src-bind/com/android/contactsbind/experiments/Flags.java
@@ -30,7 +30,7 @@
 
     private static Flags sInstance;
 
-    private Map<String,Boolean> mMap;
+    private Map<String, Object> mMap;
 
     public static Flags getInstance(Context context) {
         if (sInstance == null) {
@@ -44,6 +44,10 @@
     }
 
     public boolean getBoolean(String flagName) {
-        return mMap.containsKey(flagName) ? mMap.get(flagName) : false;
+        return mMap.containsKey(flagName) ? (boolean) mMap.get(flagName) : false;
+    }
+
+    public int getInteger(String flagName) {
+        return mMap.containsKey(flagName) ? ((Integer) mMap.get(flagName)).intValue() : 0;
     }
 }
diff --git a/src/com/android/contacts/DynamicShortcuts.java b/src/com/android/contacts/DynamicShortcuts.java
index 2e873d8..72e5fec 100644
--- a/src/com/android/contacts/DynamicShortcuts.java
+++ b/src/com/android/contacts/DynamicShortcuts.java
@@ -78,23 +78,6 @@
     private static final int LONG_LABEL_MAX_LENGTH = 30;
     private static final int MAX_SHORTCUTS = 3;
 
-    /**
-     * How long  to wait after a change to the contacts content uri before updating the shortcuts
-     * This increases the likelihood that multiple updates will be coalesced in the case that
-     * the updates are happening rapidly
-     *
-     * TODO: this should probably be externally configurable to make it easier to manually test the
-     * behavior
-     */
-    private static final int CONTENT_CHANGE_MIN_UPDATE_DELAY_MILLIS = 10000; // 10 seconds
-    /**
-     * The maximum time to wait before updating the shortcuts that may have changed.
-     *
-     * TODO: this should probably be externally configurable to make it easier to manually test the
-     * behavior
-     */
-    private static final int CONTENT_CHANGE_MAX_UPDATE_DELAY_MILLIS = 24*60*60*1000; // 1 day
-
     // The spec specifies that it should be 44dp @ xxxhdpi
     // Note that ShortcutManager.getIconMaxWidth and ShortcutManager.getMaxHeight return different
     // (larger) values.
@@ -110,6 +93,8 @@
     private final ShortcutManager mShortcutManager;
     private int mShortLabelMaxLength = SHORT_LABEL_MAX_LENGTH;
     private int mLongLabelMaxLength = LONG_LABEL_MAX_LENGTH;
+    private final int mContentChangeMinUpdateDelay;
+    private final int mContentChangeMaxUpdateDelay;
 
     public DynamicShortcuts(Context context) {
         this(context, context.getContentResolver(), (ShortcutManager)
@@ -121,6 +106,10 @@
         mContext = context;
         mContentResolver = contentResolver;
         mShortcutManager = shortcutManager;
+        mContentChangeMinUpdateDelay = Flags.getInstance(mContext)
+                .getInteger(Experiments.DYNAMIC_MIN_CONTENT_CHANGE_UPDATE_DELAY_MILLIS);
+        mContentChangeMaxUpdateDelay = Flags.getInstance(mContext)
+                .getInteger(Experiments.DYNAMIC_MAX_CONTENT_CHANGE_UPDATE_DELAY_MILLIS);
     }
 
     @VisibleForTesting
@@ -365,8 +354,8 @@
                 // that complexity.
                 .addTriggerContentUri(new JobInfo.TriggerContentUri(ContactsContract.AUTHORITY_URI,
                         JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
-                .setTriggerContentUpdateDelay(CONTENT_CHANGE_MIN_UPDATE_DELAY_MILLIS)
-                .setTriggerContentMaxDelay(CONTENT_CHANGE_MAX_UPDATE_DELAY_MILLIS).build();
+                .setTriggerContentUpdateDelay(mContentChangeMinUpdateDelay)
+                .setTriggerContentMaxDelay(mContentChangeMaxUpdateDelay).build();
         final JobScheduler scheduler = (JobScheduler)
                 mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);
         scheduler.schedule(job);
diff --git a/src/com/android/contacts/common/Experiments.java b/src/com/android/contacts/common/Experiments.java
index 7d318af..2e3b6d2 100644
--- a/src/com/android/contacts/common/Experiments.java
+++ b/src/com/android/contacts/common/Experiments.java
@@ -25,6 +25,19 @@
      */
     public static final String DYNAMIC_SHORTCUTS = "Shortcuts__dynamic_shortcuts";
 
+    /**
+     * Flags for minimum content update time
+     */
+    public static final String DYNAMIC_MIN_CONTENT_CHANGE_UPDATE_DELAY_MILLIS =
+            "Shortcuts__dynamic_min_content_change_update_delay_millis";
+
+    /**
+     * Flags for maximum content update time
+     */
+    public static final String DYNAMIC_MAX_CONTENT_CHANGE_UPDATE_DELAY_MILLIS =
+            "Shortcuts__dynamic_max_content_change_update_delay_millis";
+
+
     private Experiments() {
     }
 }
