diff --git a/camera/QCamera2/HAL/QCamera2HWI.cpp b/camera/QCamera2/HAL/QCamera2HWI.cpp
index fda921202c8e87549075bf87be70fa1fd731ed2b..087dea98e63d8852d0e36d016347e5b6d4da2e13 100644
--- a/camera/QCamera2/HAL/QCamera2HWI.cpp
+++ b/camera/QCamera2/HAL/QCamera2HWI.cpp
@@ -113,7 +113,7 @@ camera_device_ops_t QCamera2HardwareInterface::mCameraOps = {
     .release =                   QCamera2HardwareInterface::release,
     .dump =                      QCamera2HardwareInterface::dump,
 };
-
+uint32_t QCamera2HardwareInterface::sessionId[] = {0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF};
 /*===========================================================================
  * FUNCTION   : set_preview_window
  *
@@ -1979,7 +1979,8 @@ int QCamera2HardwareInterface::openCamera()
     memset(value, 0, sizeof(value));
     property_get("persist.camera.depth.focus.cb", value, "1");
     bDepthAFCallbacks = atoi(value);
-
+    mCameraHandle->ops->get_session_id(mCameraHandle->camera_handle,
+        &sessionId[mCameraId]);
     return NO_ERROR;
 
 error_exit3:
@@ -2227,7 +2228,7 @@ int QCamera2HardwareInterface::closeCamera()
     mCameraOpened = false;
 
     // Reset Stream config info
-    mParameters.setStreamConfigure(false, false, true);
+    mParameters.setStreamConfigure(false, false, true, sessionId);
 
     // deinit Parameters
     mParameters.deinit();
@@ -2632,7 +2633,11 @@ uint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_ty
             if (is4k2kResolution(&dim)) {
                  //get additional buffer count
                  property_get("vidc.enc.dcvs.extra-buff-count", value, "0");
-                 bufferCnt += atoi(value);
+                 persist_cnt = atoi(value);
+                 if (persist_cnt >= 0 &&
+                     persist_cnt < CAM_MAX_NUM_BUFS_PER_STREAM) {
+                     bufferCnt += persist_cnt;
+                 }
             }
         }
         break;
@@ -2686,7 +2691,7 @@ uint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_ty
     }
 
     LOGH("Buffer count = %d for stream type = %d", bufferCnt, stream_type);
-    if (CAM_MAX_NUM_BUFS_PER_STREAM < bufferCnt) {
+    if (bufferCnt < 0 || CAM_MAX_NUM_BUFS_PER_STREAM < bufferCnt) {
         LOGW("Buffer count %d for stream type %d exceeds limit %d",
                  bufferCnt, stream_type, CAM_MAX_NUM_BUFS_PER_STREAM);
         return CAM_MAX_NUM_BUFS_PER_STREAM;
@@ -4877,7 +4882,7 @@ int32_t QCamera2HardwareInterface::declareSnapshotStreams()
     int rc = NO_ERROR;
 
     // Update stream info configuration
-    rc = mParameters.setStreamConfigure(true, mLongshotEnabled, false);
+    rc = mParameters.setStreamConfigure(true, mLongshotEnabled, false, sessionId);
     if (rc != NO_ERROR) {
         LOGE("setStreamConfigure failed %d", rc);
         return rc;
@@ -8193,7 +8198,7 @@ int32_t QCamera2HardwareInterface::preparePreview()
     int32_t rc = NO_ERROR;
 
     LOGI("E");
-    rc = mParameters.setStreamConfigure(false, false, false);
+    rc = mParameters.setStreamConfigure(false, false, false, sessionId);
     if (rc != NO_ERROR) {
         LOGE("setStreamConfigure failed %d", rc);
         return rc;
diff --git a/camera/QCamera2/HAL/QCamera2HWI.h b/camera/QCamera2/HAL/QCamera2HWI.h
index 161f0691555253ebe70cd4da4ac50e1f1ffdbc30..5e9e38d8dcba0959cc8d2353e06885865c1e1a74 100644
--- a/camera/QCamera2/HAL/QCamera2HWI.h
+++ b/camera/QCamera2/HAL/QCamera2HWI.h
@@ -279,7 +279,7 @@ public:
     virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo);
     virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo);
     virtual void waitForDeferredAlloc(cam_stream_type_t stream_type);
-
+    static uint32_t sessionId[MM_CAMERA_MAX_NUM_SENSORS];
     // Implementation of QCameraThermalCallback
     virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level,
             void *userdata, void *data);
diff --git a/camera/QCamera2/HAL/QCameraMem.cpp b/camera/QCamera2/HAL/QCameraMem.cpp
old mode 100644
new mode 100755
index 5d88fbd13f3d82557657122785f4debb1f89f15c..6bddd0cf38563bc8a2dbf51b7eab918e2cb29042
--- a/camera/QCamera2/HAL/QCameraMem.cpp
+++ b/camera/QCamera2/HAL/QCameraMem.cpp
@@ -652,7 +652,7 @@ int QCameraMemoryPool::findBufferLocked(
         size_t size, bool cached, cam_stream_type_t streamType)
 {
     int rc = NAME_NOT_FOUND;
-
+    size_t alignsize = (size + 4095U) & (~4095U);
     if (mPools[streamType].empty()) {
         return NAME_NOT_FOUND;
     }
@@ -660,7 +660,7 @@ int QCameraMemoryPool::findBufferLocked(
     List<struct QCameraMemory::QCameraMemInfo>::iterator it = mPools[streamType].begin();
     if (streamType == CAM_STREAM_TYPE_OFFLINE_PROC) {
         for( ; it != mPools[streamType].end() ; it++) {
-            if( ((*it).size == size) &&
+            if( ((*it).size == alignsize) &&
                     ((*it).heap_id == heap_id) &&
                     ((*it).cached == cached) ) {
                 memInfo = *it;
diff --git a/camera/QCamera2/HAL/QCameraParameters.cpp b/camera/QCamera2/HAL/QCameraParameters.cpp
index 59d99d55b9eb990ac9c3ed1d17379a0d4d006f7a..7830330bcfd49fec5c5e2ceba17a46ad34b4a0f0 100644
--- a/camera/QCamera2/HAL/QCameraParameters.cpp
+++ b/camera/QCamera2/HAL/QCameraParameters.cpp
@@ -213,6 +213,9 @@ const char QCameraParameters::KEY_QC_INSTANT_AEC_SUPPORTED_MODES[] = "instant-ae
 const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES[] = "instant-capture-values";
 const char QCameraParameters::KEY_QC_LED_CALIBRATION_MODES[] = "led-calibration-mode";
 
+const char QCameraParameters::KEY_QC_DUAL_CAMERA_MODE[] = "dual-camera-mode";
+const char QCameraParameters::KEY_QC_DUAL_CAMERA_ID[] = "dual-camera-id";
+const char QCameraParameters::KEY_QC_DUAL_CAMERA_MAIN_CAMERA[] = "dual-camera-main-camera";
 // Values for effect settings.
 const char QCameraParameters::EFFECT_EMBOSS[] = "emboss";
 const char QCameraParameters::EFFECT_SKETCH[] = "sketch";
@@ -991,7 +994,10 @@ QCameraParameters::QCameraParameters()
       mAecFrameBound(0),
       mAecSkipDisplayFrameBound(0),
       m_bQuadraCfa(false),
-      m_bSmallJpegSize(false)
+      m_bSmallJpegSize(false),
+      m_bDualCameraMode(false),
+      mDualCamId(0),
+      m_bMainCamera(false)
 {
     char value[PROPERTY_VALUE_MAX];
     // TODO: may move to parameter instead of sysprop
@@ -1124,7 +1130,10 @@ QCameraParameters::QCameraParameters(const String8 &params)
     mAecFrameBound(0),
     mAecSkipDisplayFrameBound(0),
     m_bQuadraCfa(false),
-    m_bSmallJpegSize(false)
+    m_bSmallJpegSize(false),
+    m_bDualCameraMode(false),
+    mDualCamId(0),
+    m_bMainCamera(false)
 {
     memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize));
     memset(&m_default_fps_range, 0, sizeof(m_default_fps_range));
@@ -5280,6 +5289,7 @@ int32_t QCameraParameters::updateParameters(const String8& p,
 
     if ((rc = setLongshotParam(params)))                final_rc = rc;
     if ((rc = setLedCalibration(params)))               final_rc = rc;
+    if ((rc = setDualCameraMode(params)))               final_rc = rc;
 
     setQuadraCfa(params);
     setVideoBatchSize();
@@ -6139,7 +6149,10 @@ int32_t QCameraParameters::initDefaultParameters()
     // Set default burst number
     set(KEY_QC_SNAPSHOT_BURST_NUM, 0);
     set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0);
-
+    // Set default dual camera info
+    set(KEY_QC_DUAL_CAMERA_MODE,VALUE_OFF);
+    set(KEY_QC_DUAL_CAMERA_ID,0);
+    set(KEY_QC_DUAL_CAMERA_MAIN_CAMERA,VALUE_FALSE);
     //Get RAM size and disable features which are memory rich
     struct sysinfo info;
     sysinfo(&info);
@@ -6391,7 +6404,7 @@ void QCameraParameters::deinit()
                              m_pCamOpsTbl->camera_handle,
                              CAM_MAPPING_BUF_TYPE_PARM_BUF);
 
-        if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) {
+        if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON || m_bDualCameraMode) {
             m_pCamOpsTbl->ops->unmap_buf(
                     m_pCamOpsTbl->camera_handle,
                     CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF);
@@ -13089,7 +13102,6 @@ bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_conf
         LOGE("Failed to initialize group update table");
         return BAD_TYPE;
     }
-
     if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf,
             CAM_INTF_META_STREAM_INFO, stream_config_info)) {
         LOGE("Failed to update table");
@@ -13119,7 +13131,7 @@ bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_conf
  *              none-zero failure code
  *==========================================================================*/
 bool QCameraParameters::setStreamConfigure(bool isCapture,
-        bool previewAsPostview, bool resetConfig) {
+        bool previewAsPostview, bool resetConfig, uint32_t* sessionId) {
 
     int32_t rc = NO_ERROR;
     cam_stream_size_info_t stream_config_info;
@@ -13407,8 +13419,67 @@ bool QCameraParameters::setStreamConfigure(bool isCapture,
                 stream_config_info.sub_format_type[k],
                 stream_config_info.is_type[k]);
     }
-
+    if (m_bMainCamera && m_bDualCameraMode){
+        stream_config_info.sync_type = CAM_TYPE_MAIN;
+    } else if (m_bDualCameraMode){
+        stream_config_info.sync_type = CAM_TYPE_AUX;
+    }
     rc = sendStreamConfigInfo(stream_config_info);
+    if (m_bDualCameraMode) {
+        if (m_pRelCamSyncHeap == NULL) {
+            m_pRelCamSyncHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE);
+            rc = m_pRelCamSyncHeap->allocate(1,
+                   sizeof(cam_sync_related_sensors_event_info_t), NON_SECURE);
+            if(rc != OK) {
+                rc = NO_MEMORY;
+                LOGE("Failed to allocate Related cam sync Heap memory");
+                delete m_pRelCamSyncHeap;
+                m_pRelCamSyncHeap = NULL;
+                return rc;
+            }
+
+            //Map memory for related cam sync buffer
+            rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle,
+                    CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF,
+                    m_pRelCamSyncHeap->getFd(0),
+                    sizeof(cam_sync_related_sensors_event_info_t),
+                    (cam_sync_related_sensors_event_info_t*)DATA_PTR(m_pRelCamSyncHeap,0));
+            if(rc < 0) {
+                LOGE("failed to map Related cam sync buffer");
+                rc = FAILED_TRANSACTION;
+                m_pRelCamSyncHeap->deallocate();
+                delete m_pRelCamSyncHeap;
+                m_pRelCamSyncHeap = NULL;
+                return rc;
+            }
+            m_pRelCamSyncBuf =
+                    (cam_sync_related_sensors_event_info_t*) DATA_PTR(m_pRelCamSyncHeap,0);
+        }
+        if (!resetConfig) {
+            m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_ON;
+        } else {
+            m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_OFF;
+        }
+        if (m_bMainCamera){
+             m_pRelCamSyncBuf->mode = CAM_MODE_PRIMARY;
+             m_pRelCamSyncBuf->type = CAM_TYPE_MAIN;
+             m_pRelCamSyncBuf->related_sensor_session_id = sessionId[mDualCamId];
+        } else {
+             m_pRelCamSyncBuf->mode = CAM_MODE_SECONDARY;
+             m_pRelCamSyncBuf->type = CAM_TYPE_AUX;
+             m_pRelCamSyncBuf->related_sensor_session_id = sessionId[mDualCamId];
+        }
+        rc = m_pCamOpsTbl->ops->sync_related_sensors(
+                m_pCamOpsTbl->camera_handle, m_pRelCamSyncBuf);
+        if(rc < 0) {
+            LOGE("failed to send sync command");
+            rc = FAILED_TRANSACTION;
+            m_pRelCamSyncHeap->deallocate();
+            delete m_pRelCamSyncHeap;
+            m_pRelCamSyncHeap = NULL;
+            return rc;
+        }
+    }
     updateSnapshotPpMask(stream_config_info);
     return rc;
 }
@@ -14735,6 +14806,43 @@ int32_t QCameraParameters::setLedCalibration(
     return NO_ERROR;
 }
 
+/*===========================================================================
+ * FUNCTION   : setDualCameraMode
+ *
+ * DESCRIPTION: set dual led calibration
+ *
+ * PARAMETERS :
+ *   @params  : user setting parameters
+ *
+ * RETURN     : int32_t type of status
+ *              NO_ERROR  -- success
+ *              none-zero failure code
+ *==========================================================================*/
+int32_t QCameraParameters::setDualCameraMode(const QCameraParameters& params)
+{
+    const char *str = params.get(KEY_QC_DUAL_CAMERA_MODE);
+    const char *prev_str = get(KEY_QC_DUAL_CAMERA_MODE);
+    int value;
+
+    if (str != NULL) {
+        if (prev_str == NULL || strcmp(str, prev_str) != 0) {
+            value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP),
+                    str);
+            m_bDualCameraMode = value;
+        }
+    }
+    if (m_bDualCameraMode) {
+        mDualCamId  = params.getInt(KEY_QC_DUAL_CAMERA_ID);
+        str = params.get(KEY_QC_DUAL_CAMERA_MAIN_CAMERA);
+        prev_str = get(KEY_QC_DUAL_CAMERA_MAIN_CAMERA);
+        if (prev_str == NULL || strcmp(str, prev_str) != 0) {
+            value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP),
+                    str);
+        m_bMainCamera = value;
+        }
+    }
+    return NO_ERROR;
+}
 
 /*===========================================================================
  * FUNCTION   : setLedCalibration
diff --git a/camera/QCamera2/HAL/QCameraParameters.h b/camera/QCamera2/HAL/QCameraParameters.h
index d814f460eac867d22f1879b51ffe563a40dab570..072c2d430832bb4b4db0b62d89d51b0cd14f3e9b 100644
--- a/camera/QCamera2/HAL/QCameraParameters.h
+++ b/camera/QCamera2/HAL/QCameraParameters.h
@@ -335,6 +335,11 @@ private:
     //Longshot
     static const char KEY_QC_LONGSHOT_SUPPORTED[];
 
+    // Dual camera mode
+    static const char KEY_QC_DUAL_CAMERA_MODE[];
+    static const char KEY_QC_DUAL_CAMERA_ID[];
+    static const char KEY_QC_DUAL_CAMERA_MAIN_CAMERA[];
+
     //ZSL+HDR
     static const char KEY_QC_ZSL_HDR_SUPPORTED[];
 
@@ -758,7 +763,8 @@ public:
     const char *getASDStateString(cam_auto_scene_t scene);
     bool isHDRThumbnailProcessNeeded() { return m_bHDRThumbnailProcessNeeded; };
     void setMinPpMask(cam_feature_mask_t min_pp_mask) { m_nMinRequiredPpMask = min_pp_mask; };
-    bool setStreamConfigure(bool isCapture, bool previewAsPostview, bool resetConfig);
+    bool setStreamConfigure(bool isCapture, bool previewAsPostview, bool resetConfig,
+            uint32_t* sessionId);
     int32_t addOnlineRotation(uint32_t rotation, uint32_t streamId, int32_t device_rotation);
     uint8_t getNumOfExtraBuffersForImageProc();
     uint8_t getNumOfExtraBuffersForVideo();
@@ -976,6 +982,7 @@ private:
     int32_t setSecureMode(const QCameraParameters& );
     int32_t setCacheVideoBuffers(const QCameraParameters& params);
     int32_t setCustomParams(const QCameraParameters& params);
+    int32_t setDualCameraMode(const QCameraParameters& params);
     int32_t setAutoExposure(const char *autoExp);
     int32_t setPreviewFpsRange(int min_fps,int max_fps,
             int vid_min_fps,int vid_max_fps);
@@ -1253,6 +1260,9 @@ private:
     uint8_t mAecSkipDisplayFrameBound;
     bool m_bQuadraCfa;
     bool m_bSmallJpegSize;
+    bool m_bDualCameraMode;
+    int32_t mDualCamId;
+    bool m_bMainCamera;
 };
 
 }; // namespace qcamera
diff --git a/camera/QCamera2/HAL/QCameraParametersIntf.cpp b/camera/QCamera2/HAL/QCameraParametersIntf.cpp
index 5b3f99fecee54d6a112d46efa6c688d4f8233dcf..adaff86cd78e79a4a76d6c35e787ef12df67bd1d 100644
--- a/camera/QCamera2/HAL/QCameraParametersIntf.cpp
+++ b/camera/QCamera2/HAL/QCameraParametersIntf.cpp
@@ -796,12 +796,12 @@ void QCameraParametersIntf::setMinPpMask(cam_feature_mask_t min_pp_mask)
 }
 
 bool QCameraParametersIntf::setStreamConfigure(bool isCapture,
-        bool previewAsPostview, bool resetConfig)
+        bool previewAsPostview, bool resetConfig, uint32_t* sessionId)
 {
     Mutex::Autolock lock(mLock);
     CHECK_PARAM_INTF(mImpl);
     return mImpl->setStreamConfigure(isCapture,
-            previewAsPostview, resetConfig);
+            previewAsPostview, resetConfig, sessionId);
 }
 
 int32_t QCameraParametersIntf::addOnlineRotation(uint32_t rotation,
diff --git a/camera/QCamera2/HAL/QCameraParametersIntf.h b/camera/QCamera2/HAL/QCameraParametersIntf.h
index 9053d4d89b310181293b3e16517142fe2989cc7c..520c378df3d701884ba8be36c5006e00080cac22 100644
--- a/camera/QCamera2/HAL/QCameraParametersIntf.h
+++ b/camera/QCamera2/HAL/QCameraParametersIntf.h
@@ -194,7 +194,7 @@ public:
     bool isHDRThumbnailProcessNeeded();
     void setMinPpMask(cam_feature_mask_t min_pp_mask);
     bool setStreamConfigure(bool isCapture,
-            bool previewAsPostview, bool resetConfig);
+            bool previewAsPostview, bool resetConfig, uint32_t* sessionId);
     int32_t addOnlineRotation(uint32_t rotation, uint32_t streamId,
             int32_t device_rotation);
     uint8_t getNumOfExtraBuffersForImageProc();