Merge "Revert "Add Wearable node.db to Bullhead dumpstate."" into nyc-mr1-dev
diff --git a/BoardConfig.mk b/BoardConfig.mk
index f2d8c5f..2fac196 100644
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -48,7 +48,6 @@
 BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/lge/bullhead/bluetooth
 BOARD_HAS_QCA_BT_ROME := true
 WCNSS_FILTER_USES_SIBS := true
-BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED := false
 
 BOARD_HAS_QCOM_WLAN := true
 BOARD_WLAN_DEVICE := qcwcn
@@ -137,6 +136,9 @@
 # 32-bit or 64-bit), the following line should be deleted
 BOARD_QTI_CAMERA_32BIT_ONLY := true
 
+#NFC
+NXP_CHIP_TYPE := 2
+
 #Enable peripheral manager
 TARGET_PER_MGR_ENABLED := true
 
diff --git a/aosp_bullhead.mk b/aosp_bullhead.mk
index ec81ad3..b7fb70f 100644
--- a/aosp_bullhead.mk
+++ b/aosp_bullhead.mk
@@ -31,6 +31,8 @@
 PRODUCT_MANUFACTURER := LGE
 PRODUCT_RESTRICT_VENDOR_FILES := true
 
+PRODUCT_COPY_FILES += device/lge/bullhead/fstab.aosp_bullhead:root/fstab.bullhead
+
 $(call inherit-product, device/lge/bullhead/device.mk)
 $(call inherit-product-if-exists, vendor/lge/bullhead/device-vendor.mk)
 
diff --git a/apns-full-conf.xml b/apns-full-conf.xml
index 319d6fb..19f5317 100644
--- a/apns-full-conf.xml
+++ b/apns-full-conf.xml
@@ -979,6 +979,27 @@
       mvno_match_data="IUSACELL"
   />
 
+  <apn carrier="upcnet"
+      mcc="206"
+      mnc="01"
+      apn="internet.ch.upcmobile.com"
+      type="default,supl"
+      mvno_match_data="75636832"
+      mvno_type="gid"
+  />
+
+  <apn carrier="upcmms"
+      mcc="206"
+      mnc="01"
+      apn="mms.ch.upcmobile.com"
+      mmsc="http://mms.ch.upcmobile.com:8080/servlets/mms"
+      mmsproxy="062.179.127.018"
+      mmsport="8080"
+      type="mms"
+      mvno_match_data="75636832"
+      mvno_type="gid"
+  />
+
   <apn carrier="Telenet Internet"
       mcc="206"
       mnc="05"
@@ -1718,6 +1739,107 @@
       type="mms"
   />
 
+  <apn carrier="internet simyo"
+      mcc="214"
+      mnc="03"
+      apn="gprs-service.com"
+      mvno_type="spn"
+      mvno_match_data="simyo"
+      type="default,supl"
+  />
+
+  <apn carrier="simyo MMS"
+      mcc="214"
+      mnc="03"
+      apn="mms-service.com"
+      authtype="1"
+      mmsc="http://mms.orange.es"
+      mmsproxy="172.22.188.25"
+      mmsport="8080"
+      mvno_type="spn"
+      mvno_match_data="simyo"
+      type="mms"
+  />
+
+  <apn carrier="Jazztel Internet"
+      mcc="214"
+      mnc="03"
+      apn=""
+      type="ia"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="jazzinternet"
+      mcc="214"
+      mnc="03"
+      apn="jazzinternet"
+      type="default,supl"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="MMS"
+      mcc="214"
+      mnc="03"
+      apn="jazzmms"
+      user=""
+      password=""
+      mmsc="http://jazztelmms.com/servlets/mms"
+      mmsproxy="37.132.0.10"
+      mmsport="8080"
+      authtype="1"
+      type="mms"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="INTERNET R"
+      mcc="214"
+      mnc="03"
+      apn="internet.mundo-r.com"
+      authtype="1"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="21403508xxxxxxx"
+  />
+
+  <apn carrier="MMS R"
+      mcc="214"
+      mnc="03"
+      apn="mms.mundo-r.com"
+      authtype="1"
+      mmsc="http://mms.mundo-r.com"
+      mmsproxy="010.000.157.169"
+      mmsport="8080"
+      mvno_type="imsi"
+      mvno_match_data="21403508xxxxxxx"
+      type="mms"
+  />
+
+  <apn carrier="INTERNET R"
+      mcc="214"
+      mnc="03"
+      apn="internet.mundo-r.com"
+      authtype="1"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="21403509xxxxxxx"
+  />
+
+  <apn carrier="MMS R"
+      mcc="214"
+      mnc="03"
+      apn="mms.mundo-r.com"
+      authtype="1"
+      mmsc="http://mms.mundo-r.com"
+      mmsproxy="010.000.157.169"
+      mmsport="8080"
+      mvno_type="imsi"
+      mvno_match_data="21403509xxxxxxx"
+      type="mms"
+  />
+
   <apn carrier="Yoigo Internet"
       mcc="214"
       mnc="04"
@@ -1930,13 +2052,22 @@
   <apn carrier="Jazztel Internet"
       mcc="214"
       mnc="07"
+      apn=""
+      type="ia"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="jazzinternet"
+      mcc="214"
+      mnc="07"
       apn="jazzinternet"
       type="default,supl"
       mvno_match_data="JAZZTEL"
       mvno_type="spn"
   />
 
-  <apn carrier="Jazztel MMS"
+  <apn carrier="MMS"
       mcc="214"
       mnc="07"
       apn="jazzmms"
@@ -2048,14 +2179,26 @@
       type="mms"
   />
 
-  <apn carrier="Simyo Internet"
+  <apn carrier="internet simyo"
       mcc="214"
       mnc="19"
       apn="gprs-service.com"
-      mmsc="http://217.18.32.180:8080"
-      mmsproxy="217.18.32.181"
+      mvno_type="spn"
+      mvno_match_data="simyo"
+      type="default,supl"
+  />
+
+  <apn carrier="simyo MMS"
+      mcc="214"
+      mnc="19"
+      apn="mms-service.com"
+      authtype="1"
+      mmsc="http://mms.orange.es"
+      mmsproxy="172.22.188.25"
       mmsport="8080"
-      type="default,supl,mms"
+      mvno_type="spn"
+      mvno_match_data="simyo"
+      type="mms"
   />
 
   <apn carrier="Jazztel Internet"
@@ -2085,6 +2228,39 @@
       type="mms"
   />
 
+  <apn carrier="Jazztel Internet"
+      mcc="214"
+      mnc="21"
+      apn=""
+      type="ia"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="jazzinternet"
+      mcc="214"
+      mnc="21"
+      apn="jazzinternet"
+      type="default,supl"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
+  <apn carrier="MMS"
+      mcc="214"
+      mnc="21"
+      apn="jazzmms"
+      user=""
+      password=""
+      mmsc="http://jazztelmms.com/servlets/mms"
+      mmsproxy="37.132.0.10"
+      mmsport="8080"
+      authtype="1"
+      type="mms"
+      mvno_match_data="JAZZTEL"
+      mvno_type="spn"
+  />
+
   <apn carrier="Truphone"
       mcc="214"
       mnc="27"
@@ -2979,6 +3155,13 @@
       type="default"
   />
 
+  <apn carrier="Swisscom Services"
+      mcc="228"
+      mnc="01"
+      apn=""
+      type="ia"
+  />
+
   <apn carrier="Swisscom MMS"
       mcc="228"
       mnc="01"
@@ -2996,14 +3179,14 @@
       type="default,supl"
   />
 
-  <apn carrier="Sunrise live"
+  <apn carrier="Internet"
       mcc="228"
       mnc="02"
       apn="internet"
       type="default,supl"
   />
 
-  <apn carrier="Sunrise MMS"
+  <apn carrier="MMS"
       mcc="228"
       mnc="02"
       apn="mms.sunrise.ch"
@@ -3030,6 +3213,27 @@
       type="mms"
   />
 
+  <apn carrier="upcnet"
+      mcc="228"
+      mnc="53"
+      apn="internet.ch.upcmobile.com"
+      type="default,supl"
+      mvno_match_data="75636832"
+      mvno_type="gid"
+  />
+
+  <apn carrier="upcmms"
+      mcc="228"
+      mnc="53"
+      apn="mms.ch.upcmobile.com"
+      mmsc="http://mms.ch.upcmobile.com:8080/servlets/mms"
+      mmsproxy="062.179.127.018"
+      mmsport="8080"
+      type="mms"
+      mvno_match_data="75636832"
+      mvno_type="gid"
+  />
+
   <apn carrier="T-Mobile CZ"
       mcc="230"
       mnc="01"
@@ -3168,6 +3372,13 @@
       type="mms"
   />
 
+  <apn carrier="A1 Internet"
+      mcc="232"
+      mnc="01"
+      apn=""
+      type="ia"
+  />
+
   <apn carrier="live!"
       mcc="232"
       mnc="01"
@@ -3254,7 +3465,14 @@
       type="default,supl,agps,fota,dun"
   /-->
 
-  <apn carrier="tele.ring mms"
+  <apn carrier="tele.ring ia"
+      mcc="232"
+      mnc="07"
+      apn=""
+      type="ia"
+  />
+
+  <apn carrier="telering mms"
       mcc="232"
       mnc="07"
       apn="mms"
@@ -3267,7 +3485,7 @@
       type="mms"
   />
 
-  <apn carrier="tele.ring web"
+  <apn carrier="telering web"
       mcc="232"
       mnc="07"
       apn="web"
@@ -3277,6 +3495,69 @@
       type="default,supl"
   />
 
+  <apn carrier="0677 web"
+      mcc="232"
+      mnc="07"
+      apn="webaut"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="23207718xxxxxxx"
+  />
+
+  <apn carrier="0677 mms"
+      mcc="232"
+      mnc="07"
+      apn="mmsaut"
+      mmsc="http://mmsaut.at/send"
+      mmsproxy="212.95.31.50"
+      mmsport="80"
+      type="mms"
+      mvno_type="imsi"
+      mvno_match_data="23207718xxxxxxx"
+  />
+
+  <apn carrier="0677 web"
+      mcc="232"
+      mnc="07"
+      apn="webaut"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="2320776xxxxxxxx"
+  />
+
+  <apn carrier="0677 mms"
+      mcc="232"
+      mnc="07"
+      apn="mmsaut"
+      mmsc="http://mmsaut.at/send"
+      mmsproxy="212.95.31.50"
+      mmsport="80"
+      type="mms"
+      mvno_type="imsi"
+      mvno_match_data="2320776xxxxxxxx"
+  />
+
+  <apn carrier="0677 web"
+      mcc="232"
+      mnc="07"
+      apn="webaut"
+      type="default,supl"
+      mvno_type="imsi"
+      mvno_match_data="23207799xxxxxxx"
+  />
+
+  <apn carrier="0677 mms"
+      mcc="232"
+      mnc="07"
+      apn="mmsaut"
+      mmsc="http://mmsaut.at/send"
+      mmsproxy="212.95.31.50"
+      mmsport="80"
+      type="mms"
+      mvno_type="imsi"
+      mvno_match_data="23207799xxxxxxx"
+  />
+
   <apn carrier="Planet3"
       mcc="232"
       mnc="10"
@@ -3310,10 +3591,10 @@
       type="mms"
   />
 
-  <apn carrier="yesss!"
+  <apn carrier="Internet"
       mcc="232"
       mnc="12"
-      apn="web.yesss.at"
+      apn="webapn.at"
       type="default,supl"
   />
 
@@ -3395,7 +3676,9 @@
       apn="mobile.o2.co.uk"
       user="o2web"
       password="password"
+      authtype="1"
       type="default,supl"
+      protocol="IPV4V6"
   />
 
   <apn carrier="O2 MMS"
@@ -3409,6 +3692,7 @@
       mmsproxy="82.132.254.1"
       mmsport="8080"
       type="mms"
+      protocol="IPV4V6"
   />
 
   <apn carrier="O2 Pay &amp; Go"
@@ -3419,10 +3703,12 @@
       port="8080"
       user="payandgo"
       password="password"
+      authtype="1"
       mmsc="http://mmsc.mms.o2.co.uk:8002"
       mmsproxy="82.132.254.1"
       mmsport="8080"
       type="default,supl,mms"
+      protocol="IPV4V6"
   />
 
   <apn carrier="TESCO"
@@ -3523,7 +3809,7 @@
       type="mms"
   />
 
-  <apn carrier="Vodafone UK"
+  <apn carrier="Contract WAP"
       mcc="234"
       mnc="15"
       apn="wap.vodafone.co.uk"
@@ -3536,7 +3822,7 @@
       type="default,supl,mms"
   />
 
-  <apn carrier="Vodafone UK Prepay"
+  <apn carrier="PAYG WAP"
       mcc="234"
       mnc="15"
       apn="pp.vodafone.co.uk"
@@ -3719,7 +4005,7 @@
       protocol="IPV6"
   />
 
-  <apn carrier="EE Internet"
+  <apn carrier="Internet"
       mcc="234"
       mnc="30"
       apn="everywhere"
@@ -3727,9 +4013,10 @@
       password="secure"
       authtype="1"
       type="default,supl"
+      protocol="IPV4V6"
   />
 
-  <apn carrier="EE MMS"
+  <apn carrier="MMS"
       mcc="234"
       mnc="30"
       apn="eezone"
@@ -4816,6 +5103,7 @@
       mnc="05"
       apn="internet"
       type="default,supl"
+      protocol="IPV4V6"
   />
 
   <apn carrier="Elisa MMS"
@@ -5336,14 +5624,15 @@
       type="mms"
   />
 
-  <apn carrier="Bite LV Internet"
+  <apn carrier="BITE Internet"
       mcc="247"
       mnc="05"
       apn="internet"
       type="default,supl"
+      protocol="IPV4V6"
   />
 
-  <apn carrier="Bite LV MMS"
+  <apn carrier="BITE MMS"
       mcc="247"
       mnc="05"
       apn="mms"
@@ -5354,15 +5643,7 @@
       mmsport="8080"
       authtype="1"
       type="mms"
-  />
-
-  <apn carrier="Bite LV WAP"
-      mcc="247"
-      mnc="05"
-      apn="wap"
-      proxy="213.226.131.133"
-      port="8080"
-      type="default,supl"
+      protocol="IPV4V6"
   />
 
   <apn carrier="EMT Internet"
@@ -5382,15 +5663,6 @@
       type="mms"
   />
 
-  <apn carrier="EMT WAP"
-      mcc="248"
-      mnc="01"
-      apn="wap.emt.ee"
-      proxy="217.71.32.236"
-      port="8080"
-      type="default,supl"
-  />
-
   <apn carrier="Send"
       mcc="248"
       mnc="01"
@@ -5420,6 +5692,7 @@
       mnc="02"
       apn="internet"
       type="default,supl"
+      protocol="IPV4V6"
   />
 
   <apn carrier="Elisa MMS"
@@ -5430,15 +5703,7 @@
       mmsproxy="194.204.2.6"
       mmsport="8000"
       type="mms"
-  />
-
-  <apn carrier="Elisa WAP"
-      mcc="248"
-      mnc="02"
-      apn="wap"
-      proxy="194.204.2.6"
-      port="8000"
-      type="default,supl"
+      protocol="IPV4V6"
   />
 
   <apn carrier="Tele2 Internet"
@@ -6614,10 +6879,10 @@
       apn="internet"
       user="mobitel"
       password="internet"
-      mmsc="http://mms.mobitel.si/servlets/mms"
+      mmsc="http://mms.telekom.si"
       mmsproxy="213.229.249.40"
       mmsport="8080"
-      type="default,supl,mms"
+      type="default,hipri,supl,mms"
   />
 
   <apn carrier="T2"
@@ -24041,12 +24306,12 @@
       type="mms"
   />
 
-  <apn carrier="3G Portal"
+  <apn carrier="Partner"
       mcc="425"
       mnc="01"
-      apn="uwap.orange.co.il"
+      apn="uinternet"
       mmsc="http://192.168.220.15/servlets/mms"
-      mmsproxy="192.118.11.55"
+      mmsproxy=""
       mmsport="8080"
       type="default,supl,mms"
   />
@@ -24171,11 +24436,11 @@
       type="mms"
   />
 
-  <apn carrier="3G Portal"
+  <apn carrier="Partner"
       mcc="425"
       mnc="10"
-      apn="uwap.orange.co.il"
-      mmsc="http://192.168.220.15/servlets/mms"
+      apn="uinternet"
+      mmsc=""
       mmsport="8080"
       type="default,supl,mms"
   />
@@ -30424,21 +30689,23 @@
       mcc='722'
       mnc='36'
       apn='mms.nuestro.com.ar'
+      user='mms'
+      password='mms'
       authtype='0'
       mmsc='http://mms.nuestro.com.ar'
       mmsproxy='172.16.0.20'
       mmsport='8080'
       type='mms'
-      user='mms'
   />
 
   <apn carrier="Nuestro Internet"
       mcc='722'
       mnc='36'
       apn='gprs.nuestro.com.ar'
+      user='gprs'
+      password='gprs'
       authtype='0'
       type='default'
-      user='gprs'
   />
 
   <apn carrier='Argentina:Personal :Datos'
diff --git a/audio_policy_configuration.xml b/audio_policy_configuration.xml
index 9c68b5c..ebdcd13 100644
--- a/audio_policy_configuration.xml
+++ b/audio_policy_configuration.xml
@@ -63,12 +63,12 @@
                              samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
                 </mixPort>
                 <mixPort name="primary input" role="sink">
-                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                    <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
                 <mixPort name="fast input" role="sink" flags="AUDIO_INPUT_FLAG_FAST">
-                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                    <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
                 </mixPort>
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 59ef87b..652fde8 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -2312,7 +2312,7 @@
         urgentFrameNumDiff = last_urgent_frame_number + 1 -
                 first_urgent_frame_number;
 
-        CDBG("%s: urgent_frm: valid: %d frm_num: %d - %d",
+        CDBG_HIGH("%s: urgent_frm: valid: %d frm_num: %d - %d",
                 __func__, urgent_frame_number_valid,
                 first_urgent_frame_number, last_urgent_frame_number);
     }
@@ -2323,7 +2323,7 @@
                 first_frame_number;
         mPendingBatchMap.removeItem(last_frame_number);
 
-        CDBG("%s:        frm: valid: %d frm_num: %d - %d",
+        CDBG_HIGH("%s:        frm: valid: %d frm_num: %d - %d",
                 __func__, frame_number_valid,
                 first_frame_number, last_frame_number);
 
@@ -2379,18 +2379,19 @@
             if (last_frame_capture_time) {
                 //Infer timestamp
                 first_frame_capture_time = last_frame_capture_time -
-                        (((loopCount - 1) * NSEC_PER_SEC) / mHFRVideoFps);
+                        (((loopCount - 1) * NSEC_PER_SEC) / (double) mHFRVideoFps);
                 capture_time =
-                        first_frame_capture_time + (i * NSEC_PER_SEC / mHFRVideoFps);
+                        first_frame_capture_time + (i * NSEC_PER_SEC / (double) mHFRVideoFps);
                 ADD_SET_PARAM_ENTRY_TO_BATCH(metadata,
                         CAM_INTF_META_SENSOR_TIMESTAMP, capture_time);
-                CDBG("%s: batch capture_time: %lld, capture_time: %lld",
+                CDBG_HIGH("%s: batch capture_time: %lld, capture_time: %lld",
                         __func__, last_frame_capture_time, capture_time);
             }
         }
         pthread_mutex_lock(&mMutex);
         handleMetadataWithLock(metadata_buf,
-                false /* free_and_bufdone_meta_buf */);
+                false /* free_and_bufdone_meta_buf */,
+                (i == 0) /* first metadata in the batch metadata */);
         pthread_mutex_unlock(&mMutex);
     }
 
@@ -2410,12 +2411,15 @@
  * PARAMETERS : @metadata_buf: metadata buffer
  *              @free_and_bufdone_meta_buf: Buf done on the meta buf and free
  *                 the meta buf in this method
+ *              @firstMetadataInBatch: Boolean to indicate whether this is the
+ *                  first metadata in a batch. Valid only for batch mode
  *
  * RETURN     :
  *
  *==========================================================================*/
 void QCamera3HardwareInterface::handleMetadataWithLock(
-    mm_camera_super_buf_t *metadata_buf, bool free_and_bufdone_meta_buf)
+    mm_camera_super_buf_t *metadata_buf, bool free_and_bufdone_meta_buf,
+    bool firstMetadataInBatch)
 {
     ATRACE_CALL();
 
@@ -2635,7 +2639,8 @@
 
             result.result = translateFromHalMetadata(metadata,
                     i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth,
-                    i->capture_intent, i->hybrid_ae_enable, internalPproc, i->need_dynamic_blklvl);
+                    i->capture_intent, i->hybrid_ae_enable, internalPproc, i->need_dynamic_blklvl,
+                    firstMetadataInBatch);
 
             saveExifParams(metadata);
 
@@ -4023,7 +4028,8 @@
             hdrPlusPerfLock(metadata_buf);
             pthread_mutex_lock(&mMutex);
             handleMetadataWithLock(metadata_buf,
-                    true /* free_and_bufdone_meta_buf */);
+                    true /* free_and_bufdone_meta_buf */,
+                    false /* first frame of batch metadata */ );
             pthread_mutex_unlock(&mMutex);
         }
     } else if (isInputBuffer) {
@@ -4197,11 +4203,19 @@
                                  uint8_t capture_intent,
                                  uint8_t hybrid_ae_enable,
                                  bool pprocDone,
-                                 bool dynamic_blklvl)
+                                 bool dynamic_blklvl,
+                                 bool firstMetadataInBatch)
 {
     CameraMetadata camMetadata;
     camera_metadata_t *resultMetadata;
 
+    if (mBatchSize && !firstMetadataInBatch) {
+        /* In batch mode, use cached metadata from the first metadata
+            in the batch */
+        camMetadata.clear();
+        camMetadata = mCachedMetadata;
+    }
+
     if (jpegMetadata.entryCount())
         camMetadata.append(jpegMetadata);
 
@@ -4211,6 +4225,12 @@
     camMetadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &capture_intent, 1);
     camMetadata.update(NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, &hybrid_ae_enable, 1);
 
+    if (mBatchSize && !firstMetadataInBatch) {
+        /* In batch mode, use cached metadata instead of parsing metadata buffer again */
+        resultMetadata = camMetadata.release();
+        return resultMetadata;
+    }
+
     IF_META_AVAILABLE(uint32_t, frame_number, CAM_INTF_META_FRAME_NUMBER, metadata) {
         int64_t fwk_frame_number = *frame_number;
         camMetadata.update(ANDROID_SYNC_FRAME_NUMBER, &fwk_frame_number, 1);
@@ -4781,10 +4801,22 @@
                 hAeRegions->rect.height);
     }
 
+    IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, metadata) {
+        int val = lookupFwkName(FOCUS_MODES_MAP, METADATA_MAP_SIZE(FOCUS_MODES_MAP), *focusMode);
+        if (NAME_NOT_FOUND != val) {
+            uint8_t fwkAfMode = (uint8_t)val;
+            camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
+            CDBG("%s: Metadata : ANDROID_CONTROL_AF_MODE %d", __func__, val);
+        } else {
+            CDBG_HIGH("%s: Metadata not found : ANDROID_CONTROL_AF_MODE %d",
+                    __func__, val);
+        }
+    }
+
     IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, metadata) {
         uint8_t fwk_afState = (uint8_t) *afState;
         camMetadata.update(ANDROID_CONTROL_AF_STATE, &fwk_afState, 1);
-        CDBG("%s: urgent Metadata : ANDROID_CONTROL_AF_STATE %u", __func__, *afState);
+        CDBG("%s: Metadata : ANDROID_CONTROL_AF_STATE %u", __func__, *afState);
     }
 
     IF_META_AVAILABLE(float, focusDistance, CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata) {
@@ -4996,6 +5028,12 @@
         camMetadata.update(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST, &postRawSensitivity, 1);
     }
 
+    /* In batch mode, cache the first metadata in the batch */
+    if (mBatchSize && firstMetadataInBatch) {
+        mCachedMetadata.clear();
+        mCachedMetadata = camMetadata;
+    }
+
     resultMetadata = camMetadata.release();
     return resultMetadata;
 }
@@ -5098,18 +5136,6 @@
         CDBG("%s: urgent Metadata : ANDROID_CONTROL_AE_STATE %u", __func__, *ae_state);
     }
 
-    IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, metadata) {
-        int val = lookupFwkName(FOCUS_MODES_MAP, METADATA_MAP_SIZE(FOCUS_MODES_MAP), *focusMode);
-        if (NAME_NOT_FOUND != val) {
-            uint8_t fwkAfMode = (uint8_t)val;
-            camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1);
-            CDBG("%s: urgent Metadata : ANDROID_CONTROL_AF_MODE", __func__);
-        } else {
-            CDBG_HIGH("%s: urgent Metadata not found : ANDROID_CONTROL_AF_MODE %d", __func__,
-                    val);
-        }
-    }
-
     IF_META_AVAILABLE(cam_trigger_t, af_trigger, CAM_INTF_META_AF_TRIGGER, metadata) {
         camMetadata.update(ANDROID_CONTROL_AF_TRIGGER,
                 &af_trigger->trigger, 1);
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 0302b05..eb75f97 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -174,7 +174,8 @@
                             nsecs_t timestamp, int32_t request_id,
                             const CameraMetadata& jpegMetadata, uint8_t pipeline_depth,
                             uint8_t capture_intent, uint8_t hybrid_ae_enable,
-                            bool pprocDone, bool dynamic_blklvl);
+                            bool pprocDone, bool dynamic_blklvl,
+                            bool firstMetadataInBatch);
     camera_metadata_t* saveRequestSettings(const CameraMetadata& jpegMetadata,
                             camera3_capture_request_t *request);
     int initParameters();
@@ -234,7 +235,8 @@
     int32_t handlePendingReprocResults(uint32_t frame_number);
     int64_t getMinFrameDuration(const camera3_capture_request_t *request);
     void handleMetadataWithLock(mm_camera_super_buf_t *metadata_buf,
-            bool free_and_bufdone_meta_buf);
+            bool free_and_bufdone_meta_buf,
+            bool firstMetadataInBatch);
     void handleBatchMetadata(mm_camera_super_buf_t *metadata_buf,
             bool free_and_bufdone_meta_buf);
     void handleBufferWithLock(camera3_stream_buffer_t *buffer,
@@ -435,6 +437,7 @@
     uint32_t mLdafCalib[2];
     bool mPowerHintEnabled;
     int32_t mLastCustIntentFrmNum;
+    CameraMetadata  mCachedMetadata;
 
     static const QCameraMap<camera_metadata_enum_android_control_effect_mode_t,
             cam_effect_mode_type> EFFECT_MODES_MAP[];
diff --git a/fstab.aosp_bullhead b/fstab.aosp_bullhead
new file mode 100644
index 0000000..b5b3a01
--- /dev/null
+++ b/fstab.aosp_bullhead
@@ -0,0 +1,37 @@
+# Android fstab file.
+#<src>                                         <mnt_point>  <type>  <mnt_flags and options>  <fs_mgr_flags>
+# The filesystem that contains the filesystem checker binary (typically /system) cannot
+# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
+
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/system       /system         ext4    ro,barrier=1,inode_readahead_blks=8                             wait,verify=/dev/block/platform/soc.0/f9824900.sdhci/by-name/metadata
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/vendor       /vendor         ext4    ro,barrier=1,inode_readahead_blks=8                             wait
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/userdata     /data           ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic,inode_readahead_blks=8 wait,check,forcefdeorfbe=/dev/block/platform/soc.0/f9824900.sdhci/by-name/metadata
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/cache        /cache          ext4    noatime,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic wait,check
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/persist      /persist        ext4    nosuid,nodev,barrier=1,data=ordered,nodelalloc,nomblk_io_submit,errors=panic wait,notrim
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem        /firmware       vfat    ro,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0        wait
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/boot         /boot           emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/recovery     /recovery       emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/misc         /misc           emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/modem        /radio          emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/sbl1         /sbl1           emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/tz           /tz             emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/rpm          /rpm            emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/sdi          /sdi            emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/aboot        /aboot          emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/imgdata      /imgdata        emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/pmic         /pmic           emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/hyp          /hyp            emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/sec          /sec            emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/keymaster    /keymaster      emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/cmnlib       /cmnlib         emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/persistent   /persistent     emmc    defaults                                                        defaults
+/devices/soc.0/f9200000.ssusb/f9200000.dwc3/xhci-hcd.0.auto/usb*    auto      auto    defaults                                                        voldmanaged=usb:auto
+/dev/block/zram0                                              none            swap    defaults                                                        zramsize=533413200,notrim
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/sbl1bak      /sbl1bak        emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/tzbak        /tzbak          emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/rpmbak       /rpmbak         emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/abootbak     /abootbak       emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/pmicbak      /pmicbak        emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/hypbak       /hypbak         emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/keymasterbak /keymasterbak   emmc    defaults                                                        defaults
+/dev/block/platform/soc.0/f9824900.sdhci/by-name/cmnlibbak    /cmnlibbak      emmc    defaults                                                        defaults
diff --git a/media_codecs_performance.xml b/media_codecs_performance.xml
index a591095..9bd6458 100644
--- a/media_codecs_performance.xml
+++ b/media_codecs_performance.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8" ?>
-<!-- Copyright 2015 The Android Open Source Project
+<!-- Copyright 2016 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -16,100 +16,113 @@
 
 <MediaCodecs>
     <Encoders>
-        <MediaCodec name="OMX.qcom.video.encoder.avc" type="video/avc" update="true">
-            <Limit name="measured-frame-rate-320x240" range="468-468" />
-            <Limit name="measured-frame-rate-720x480" range="240-240" />
-            <Limit name="measured-frame-rate-1280x720" range="123-123" />
-            <Limit name="measured-frame-rate-1920x1080" range="57-57" />
-        </MediaCodec>
         <MediaCodec name="OMX.qcom.video.encoder.h263" type="video/3gpp" update="true">
-            <Limit name="measured-frame-rate-176x144" range="625-625" />
-            <Limit name="measured-frame-rate-352x288" range="298-298" />
+            <Limit name="measured-frame-rate-176x144" range="404-404" /> <!-- N=92 v98%=1.3 -->
+            <Limit name="measured-frame-rate-352x288" range="237-239" /> <!-- N=92 v98%=1.3 -->
+            <!-- measured 93%:58-67 med:60 FLAKY(30 - 126 < mx=130.9) -->
+            <Limit name="measured-frame-rate-704x576" range="60-63" /> <!-- N=92 v93%=1.1 -->
+        </MediaCodec>
+        <MediaCodec name="OMX.qcom.video.encoder.avc" type="video/avc" update="true">
+            <Limit name="measured-frame-rate-320x240" range="276-276" /> <!-- N=92 v98%=1.2 -->
+            <Limit name="measured-frame-rate-720x480" range="71-82" /> <!-- N=92 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1280x720" range="44-53" /> <!-- N=92 v98%=1.3 -->
+            <Limit name="measured-frame-rate-1920x1080" range="22-26" /> <!-- N=92 v98%=1.3 -->
         </MediaCodec>
         <MediaCodec name="OMX.qcom.video.encoder.mpeg4" type="video/mp4v-es" update="true">
-            <Limit name="measured-frame-rate-176x144" range="620-620" />
-            <Limit name="measured-frame-rate-352x288" range="295-295" />
-            <Limit name="measured-frame-rate-640x480" range="155-155" />
+            <Limit name="measured-frame-rate-176x144" range="358-358" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-352x288" range="199-199" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-640x480" range="79-79" /> <!-- N=88 v98%=1.0 -->
         </MediaCodec>
         <MediaCodec name="OMX.qcom.video.encoder.vp8" type="video/x-vnd.on2.vp8" update="true">
-            <Limit name="measured-frame-rate-320x180" range="148-148" />
-            <Limit name="measured-frame-rate-640x360" range="141-141" />
-            <Limit name="measured-frame-rate-1280x720" range="49-49" />
-        </MediaCodec>
-        <MediaCodec name="OMX.google.h264.encoder" type="video/avc" update="true">
-            <Limit name="measured-frame-rate-320x240" range="326-326" />
-            <Limit name="measured-frame-rate-720x480" range="94-94" />
-            <Limit name="measured-frame-rate-1280x720" range="40-40" />
-            <Limit name="measured-frame-rate-1920x1080" range="17-17" />
+            <Limit name="measured-frame-rate-320x180" range="113-115" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-640x360" range="108-109" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1280x720" range="38-38" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1920x1080" range="15-15" /> <!-- N=88 v98%=1.0 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.h263.encoder" type="video/3gpp" update="true">
-            <Limit name="measured-frame-rate-176x144" range="490-490" />
+            <Limit name="measured-frame-rate-176x144" range="235-235" /> <!-- N=92 v98%=1.2 -->
+        </MediaCodec>
+        <MediaCodec name="OMX.google.h264.encoder" type="video/avc" update="true">
+            <Limit name="measured-frame-rate-320x240" range="130-153" /> <!-- N=92 v98%=1.5 -->
+            <!-- measured 95%:28-71 med:46 FLAKY(mn=13.1 < 23 - 90) -->
+            <Limit name="measured-frame-rate-720x480" range="45-45" /> <!-- N=92 v95%=1.6 -->
+            <!-- measured 98%:18-27 med:22 FLAKY(mn=10.9 < 11 - 44) -->
+            <Limit name="measured-frame-rate-1280x720" range="22-22" /> <!-- N=92 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1920x1080" range="11-11" /> <!-- N=92 v98%=1.2 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.mpeg4.encoder" type="video/mp4v-es" update="true">
-            <Limit name="measured-frame-rate-176x144" range="541-541" />
+            <Limit name="measured-frame-rate-176x144" range="292-294" /> <!-- N=88 v98%=1.2 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.vp8.encoder" type="video/x-vnd.on2.vp8" update="true">
-            <Limit name="measured-frame-rate-320x180" range="300-300" />
-            <Limit name="measured-frame-rate-640x360" range="127-127" />
-            <Limit name="measured-frame-rate-1280x720" range="34-34" />
-            <Limit name="measured-frame-rate-1920x1080" range="16-16" />
+            <Limit name="measured-frame-rate-320x180" range="85-85" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-640x360" range="37-37" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1280x720" range="18-18" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1920x1080" range="8-8" /> <!-- N=88 v98%=1.2 -->
         </MediaCodec>
     </Encoders>
     <Decoders>
-        <MediaCodec name="OMX.qcom.video.decoder.avc" type="video/avc" update="true">
-            <Limit name="measured-frame-rate-320x240" range="567-567" />
-            <Limit name="measured-frame-rate-720x480" range="315-315" />
-            <Limit name="measured-frame-rate-1280x720" range="151-151" />
-            <Limit name="measured-frame-rate-1920x1088" range="71-71" />
-        </MediaCodec>
         <MediaCodec name="OMX.qcom.video.decoder.h263" type="video/3gpp" update="true">
-            <Limit name="measured-frame-rate-176x144" range="818-818" />
-            <Limit name="measured-frame-rate-352x288" range="930-930" />
+            <Limit name="measured-frame-rate-176x144" range="633-633" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-352x288" range="655-655" /> <!-- N=88 v98%=1.2 -->
+        </MediaCodec>
+        <MediaCodec name="OMX.qcom.video.decoder.avc" type="video/avc" update="true">
+            <Limit name="measured-frame-rate-320x240" range="363-363" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-720x480" range="254-275" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-1280x720" range="155-155" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1920x1088" range="69-69" /> <!-- N=88 v98%=1.0 -->
         </MediaCodec>
         <MediaCodec name="OMX.qcom.video.decoder.hevc" type="video/hevc" update="true">
-            <Limit name="measured-frame-rate-352x288" range="668-668" />
-            <Limit name="measured-frame-rate-640x360" range="544-544" />
-            <Limit name="measured-frame-rate-1280x720" range="332-332" />
-            <Limit name="measured-frame-rate-1920x1080" range="201-201" />
-            <Limit name="measured-frame-rate-3840x2160" range="59-59" />
+            <Limit name="measured-frame-rate-352x288" range="478-478" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-640x360" range="343-343" /> <!-- N=88 v98%=1.3 -->
+            <Limit name="measured-frame-rate-720x480" range="323-323" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1280x720" range="185-202" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-1920x1080" range="115-119" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-3840x2160" range="32-32" /> <!-- N=88 v98%=1.0 -->
         </MediaCodec>
         <MediaCodec name="OMX.qcom.video.decoder.mpeg4" type="video/mp4v-es" update="true">
-            <Limit name="measured-frame-rate-480x360" range="693-693" />
+            <Limit name="measured-frame-rate-176x144" range="623-623" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-480x360" range="572-572" /> <!-- N=88 v98%=1.1 -->
         </MediaCodec>
         <MediaCodec name="OMX.qcom.video.decoder.vp8" type="video/x-vnd.on2.vp8" update="true">
-            <Limit name="measured-frame-rate-320x180" range="507-507" />
-            <Limit name="measured-frame-rate-640x360" range="502-502" />
-            <Limit name="measured-frame-rate-1280x720" range="599-599" />
-            <Limit name="measured-frame-rate-1920x1080" range="395-395" />
-        </MediaCodec>
-        <MediaCodec name="OMX.google.h264.decoder" type="video/avc" update="true">
-            <Limit name="measured-frame-rate-320x240" range="854-854" />
-            <Limit name="measured-frame-rate-720x480" range="233-233" />
-            <Limit name="measured-frame-rate-1280x720" range="108-108" />
-            <Limit name="measured-frame-rate-1920x1080" range="36-36" />
+            <Limit name="measured-frame-rate-320x180" range="377-377" /> <!-- N=87 v98%=1.1 -->
+            <Limit name="measured-frame-rate-640x360" range="338-338" /> <!-- N=86 v98%=1.1 -->
+            <Limit name="measured-frame-rate-1280x720" range="376-376" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1920x1080" range="246-246" /> <!-- N=86 v98%=1.0 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.h263.decoder" type="video/3gpp" update="true">
-            <Limit name="measured-frame-rate-176x144" range="693-693" />
-            <Limit name="measured-frame-rate-352x288" range="805-805" />
+            <!-- measured 98%:99-414 med:122 FLAKY(mn=98.6 < 61 - 414 < mx=422.5) variance:2.0 -->
+            <Limit name="measured-frame-rate-176x144" range="121-207" /> <!-- N=88 -->
+        </MediaCodec>
+        <MediaCodec name="OMX.google.h264.decoder" type="video/avc" update="true">
+            <!-- measured 98%:175-366 med:330 FLAKY(mn=113.4 < 127 - 506) -->
+            <Limit name="measured-frame-rate-320x240" range="253-253" /> <!-- N=88 v98%=1.4 -->
+            <Limit name="measured-frame-rate-720x480" range="93-93" /> <!-- N=88 v98%=1.2 -->
+            <!-- measured 98%:33-43 med:42 FLAKY(mn=17.4 < 19 - 74) -->
+            <Limit name="measured-frame-rate-1280x720" range="37-37" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-1920x1080" range="16-16" /> <!-- N=88 v98%=1.1 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.hevc.decoder" type="video/hevc" update="true">
-            <Limit name="measured-frame-rate-352x288" range="665-665" />
-            <Limit name="measured-frame-rate-640x360" range="406-406" />
-            <Limit name="measured-frame-rate-1280x720" range="127-127" />
-            <Limit name="measured-frame-rate-1920x1080" range="75-75" />
+            <Limit name="measured-frame-rate-352x288" range="205-205" /> <!-- N=88 v98%=1.5 -->
+            <Limit name="measured-frame-rate-640x360" range="99-99" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-720x480" range="83-83" /> <!-- N=88 v98%=1.3 -->
+            <Limit name="measured-frame-rate-1280x720" range="42-42" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-1920x1080" range="24-24" /> <!-- N=88 v98%=1.0 -->
+        </MediaCodec>
+        <MediaCodec name="OMX.google.mpeg4.decoder" type="video/mp4v-es" update="true">
+            <!-- measured 98%:134-383 med:163 FLAKY(81 - 454 < mx=484.0) -->
+            <Limit name="measured-frame-rate-176x144" range="162-227" /> <!-- N=88 v98%=1.7 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.vp8.decoder" type="video/x-vnd.on2.vp8" update="true">
-            <Limit name="measured-frame-rate-320x180" range="855-855" />
-            <Limit name="measured-frame-rate-640x360" range="256-256" />
-            <Limit name="measured-frame-rate-1280x720" range="61-61" />
-            <Limit name="measured-frame-rate-1920x1080" range="38-38" />
+            <Limit name="measured-frame-rate-320x180" range="608-608" /> <!-- N=88 v98%=1.5 -->
+            <Limit name="measured-frame-rate-640x360" range="111-174" /> <!-- N=88 v98%=1.6 -->
+            <Limit name="measured-frame-rate-1280x720" range="25-26" /> <!-- N=88 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1920x1080" range="10-13" /> <!-- N=88 v98%=1.3 -->
         </MediaCodec>
         <MediaCodec name="OMX.google.vp9.decoder" type="video/x-vnd.on2.vp9" update="true">
-            <Limit name="measured-frame-rate-320x180" range="385-385" />
-            <Limit name="measured-frame-rate-640x360" range="337-337" />
-            <Limit name="measured-frame-rate-1280x720" range="90-90" />
-            <Limit name="measured-frame-rate-1920x1080" range="58-58" />
+            <Limit name="measured-frame-rate-320x180" range="249-249" /> <!-- N=88 v98%=1.1 -->
+            <Limit name="measured-frame-rate-640x360" range="108-108" /> <!-- N=86 v98%=1.0 -->
+            <Limit name="measured-frame-rate-1280x720" range="39-39" /> <!-- N=88 v98%=1.2 -->
+            <Limit name="measured-frame-rate-1920x1080" range="23-23" /> <!-- N=86 v98%=1.1 -->
         </MediaCodec>
     </Decoders>
 </MediaCodecs>
-
diff --git a/mixer_paths.xml b/mixer_paths.xml
index a7d3120..1644b8a 100644
--- a/mixer_paths.xml
+++ b/mixer_paths.xml
@@ -428,6 +428,14 @@
         <ctl name="AUDIO_REF_EC_UL1 MUX" value="SEC_AUX_PCM_RX" />
     </path>
 
+    <path name="echo-reference bt-sco">
+        <path name="bt-sco-echo-reference" />
+    </path>
+
+    <path name="echo-reference bt-sco-wb">
+        <path name="bt-sco-echo-reference" />
+    </path>
+
     <path name="deep-buffer-playback hdmi">
         <ctl name="HDMI Mixer MultiMedia1" value="1" />
     </path>
@@ -997,7 +1005,7 @@
     </path>
 
     <path name="low-latency-record bt-sco">
-      <ctl name="MultiMedia5 Mixer SEC_AUX_PCM_UL_TX" value="1" />
+      <ctl name="MultiMedia5 Mixer SEC_AUX_PCM_TX" value="1" />
     </path>
 
     <path name="low-latency-record bt-sco-wb">
@@ -1650,7 +1658,7 @@
 
     <path name="unprocessed-handset-mic">
         <path name="dmic1" />
-        <ctl name="DEC7 Volume" value="70" />
+        <ctl name="DEC7 Volume" value="76" />
     </path>
 
     <path name="camcorder-handset-mic">
@@ -1949,6 +1957,7 @@
 
     <path name="voice-rec-mic">
         <path name="handset-mic" />
+        <ctl name="DEC7 Volume" value="82" />
     </path>
 
     <path name="unprocessed-mic">
@@ -2349,4 +2358,25 @@
     </path>
     <!--  voip loopback -->
 
+    <path name="unprocessed-stereo-mic">
+        <path name="voice-rec-dmic-ef" />
+        <ctl name="DEC7 Volume" value="76" />
+        <ctl name="DEC10 Volume" value="77" />
+    </path>
+
+    <path name="unprocessed-three-mic">
+        <path name="three-mic" />
+        <ctl name="DEC7 Volume" value="76" />
+        <ctl name="DEC10 Volume" value="77" />
+        <ctl name="DEC5 Volume" value="75" />
+    </path>
+
+    <path name="unprocessed-quad-mic">
+        <path name="quad-mic" />
+    </path>
+
+    <path name="unprocessed-headset-mic">
+        <path name="headset-mic" />
+    </path>
+
 </mixer>
diff --git a/sepolicy/bluetooth.te b/sepolicy/bluetooth.te
index dfef43f..edab8e0 100644
--- a/sepolicy/bluetooth.te
+++ b/sepolicy/bluetooth.te
@@ -1,4 +1,5 @@
 allow bluetooth sysfs:file rw_file_perms;
+allow bluetooth sysfs_usb:file w_file_perms;
 
 allow bluetooth ttyHS0_device:chr_file rw_file_perms;
 allow bluetooth start_hci_filter:unix_stream_socket connectto;
diff --git a/sepolicy/domain.te b/sepolicy/domain.te
index ef82827..ee24d7f 100644
--- a/sepolicy/domain.te
+++ b/sepolicy/domain.te
@@ -1,5 +1,5 @@
 userdebug_or_eng(`
-  allow domain diag_device:chr_file rw_file_perms;
+  allow { domain -appdomain } diag_device:chr_file rw_file_perms;
 ')
 
 r_dir_file(domain, sysfs_socinfo);
diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts
index 4ff4376..c82c234 100644
--- a/sepolicy/file_contexts
+++ b/sepolicy/file_contexts
@@ -154,6 +154,7 @@
 /sys/module/cpu_boost(/.*)?                                         u:object_r:sysfs_devices_system_cpu:s0
 /sys/devices/virtual/net/rmnet_ipa0/queues/rx-0/rps_cpus            u:object_r:sysfs_devices_system_cpu:s0
 /sys/devices/soc\.0/qcom,cpubw\.[0-9]+/devfreq/qcom,cpubw\.[0-9]+(/.*)? u:object_r:sysfs_devices_system_cpu:s0
+/sys/devices/soc\.0/f9200000\.ssusb(/.*)?                           u:object_r:sysfs_usb:s0
 /sys/devices/soc\.0/f9966000\.spi_fpc(/.*)?                         u:object_r:sysfs_devices_fingerprint:s0
 /sys/kernel/range/enable_ps_sensor                                  u:object_r:sysfs_camera:s0
 /sys/devices/soc\.0/fd900000\.qcom,mdss_mdp/qcom,mdss_fb_primary\.[0-9]+/leds/lcd-backlight/max_brightness u:object_r:sysfs_thermal:s0
diff --git a/sepolicy/netmgrd.te b/sepolicy/netmgrd.te
index 20a3535..6dbdbb0 100644
--- a/sepolicy/netmgrd.te
+++ b/sepolicy/netmgrd.te
@@ -51,6 +51,7 @@
 r_dir_file(netmgrd, sysfs_ssr);
 
 allow netmgrd sysfs:file write;
+allow netmgrd sysfs_usb:file write;
 
 allow netmgrd kernel:system module_request;
 
diff --git a/sepolicy/wcnss_service.te b/sepolicy/wcnss_service.te
index ae12e55..6a80b39 100644
--- a/sepolicy/wcnss_service.te
+++ b/sepolicy/wcnss_service.te
@@ -10,5 +10,6 @@
 allow wcnss_service smem_log_device:chr_file rw_file_perms;
 allow wcnss_service self:capability { setuid net_admin setgid };
 allow wcnss_service sysfs:file w_file_perms;
+allow wcnss_service sysfs_usb:file w_file_perms;
 
 qmux_socket(wcnss_service)
diff --git a/uinput-fpc.kl b/uinput-fpc.kl
index 0479cf8..2bc2054 100644
--- a/uinput-fpc.kl
+++ b/uinput-fpc.kl
@@ -1,4 +1,4 @@
-key 105   FP_NAV_LEFT
-key 108   FP_NAV_DOWN
-key 103   FP_NAV_UP
-key 106   FP_NAV_RIGHT
+key 105   SYSTEM_NAVIGATION_LEFT
+key 108   SYSTEM_NAVIGATION_DOWN
+key 103   SYSTEM_NAVIGATION_UP
+key 106   SYSTEM_NAVIGATION_RIGHT
diff --git a/voice_processing/voice_processing_descriptors.c b/voice_processing/voice_processing_descriptors.c
index 632fc14..e2a6629 100644
--- a/voice_processing/voice_processing_descriptors.c
+++ b/voice_processing/voice_processing_descriptors.c
@@ -27,7 +27,7 @@
         { 0x7b491460, 0x8d4d, 0x11e0, 0xbd61, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type
         { 0xd2f1b180, 0x4a8c, 0x11e5, 0x9883, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid
         EFFECT_CONTROL_API_VERSION,
-        (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND),
+        (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND|EFFECT_FLAG_HW_ACC_TUNNEL),
         0,
         0,
         "Acoustic Echo Canceler",
@@ -39,7 +39,7 @@
         { 0x58b4b260, 0x8e06, 0x11e0, 0xaa8e, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type
         { 0x30890b40, 0x4a8d, 0x11e5, 0xb3ee, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid
         EFFECT_CONTROL_API_VERSION,
-        (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND),
+        (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND|EFFECT_FLAG_HW_ACC_TUNNEL),
         0,
         0,
         "Noise Suppression",