diff --git a/camera/QCamera2/HAL3/Android.mk b/camera/QCamera2/HAL3/Android.mk
index 579bbde..f5c02d7 100644
--- a/camera/QCamera2/HAL3/Android.mk
+++ b/camera/QCamera2/HAL3/Android.mk
@@ -11,9 +11,8 @@
         QCamera3Channel.cpp \
         QCamera3PostProc.cpp \
 
-#LOCAL_CFLAGS = -Wall -Werror
+LOCAL_CFLAGS = -Wall -Werror
 LOCAL_CFLAGS := -Wall
-LOCAL_CFLAGS += -DFAKE_FRAME_NUMBERS
 
 
 LOCAL_C_INCLUDES := \
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp
index 1aba281..c6a5849 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp
@@ -73,14 +73,16 @@
 {
     m_camHandle = cam_handle;
     m_camOps = cam_ops;
-    mChannelCB = cb_routine;
-    mPaddingInfo = paddingInfo;
-    mUserData = userData;
     m_bIsActive = false;
 
     m_handle = 0;
     m_numStreams = 0;
     memset(mStreams, 0, sizeof(mStreams));
+    mUserData = userData;
+
+    mStreamInfoBuf = NULL;
+    mChannelCB = cb_routine;
+    mPaddingInfo = paddingInfo;
 }
 
 /*===========================================================================
@@ -96,13 +98,16 @@
 {
     m_camHandle = 0;
     m_camOps = NULL;
-    mPaddingInfo = NULL;
-    mUserData = NULL;
     m_bIsActive = false;
 
     m_handle = 0;
     m_numStreams = 0;
     memset(mStreams, 0, sizeof(mStreams));
+    mUserData = NULL;
+
+    mStreamInfoBuf = NULL;
+    mChannelCB = NULL;
+    mPaddingInfo = NULL;
 }
 
 /*===========================================================================
@@ -610,7 +615,7 @@
     mMemory = NULL;
 }
 
-int QCamera3RegularChannel::kMaxBuffers = 7;
+int QCamera3RegularChannel::kMaxBuffers = 4;
 
 QCamera3MetadataChannel::QCamera3MetadataChannel(uint32_t cam_handle,
                     mm_camera_ops_t *cam_ops,
@@ -621,9 +626,6 @@
                                 cb_routine, paddingInfo, userData),
                         mMemory(NULL)
 {
-#ifdef FAKE_FRAME_NUMBERS
-    startingFrameNumber=0;
-#endif
 }
 
 QCamera3MetadataChannel::~QCamera3MetadataChannel()
@@ -668,9 +670,6 @@
                                                 uint32_t frameNumber)
 {
     if (!m_bIsActive) {
-#ifdef FAKE_FRAME_NUMBERS
-        startingFrameNumber=frameNumber;
-#endif
         return start();
     }
     else
@@ -693,9 +692,6 @@
         ALOGE("%s: super_frame is not valid", __func__);
         return;
     }
-#ifdef FAKE_FRAME_NUMBERS
-    requestNumber = startingFrameNumber++;
-#endif
     mChannelCB(super_frame, NULL, requestNumber, mUserData);
 
     //Return the buffer
@@ -794,7 +790,7 @@
         result.acquire_fence = -1;
         result.release_fence = -1;
 
-        ALOGE("%s: Issue Callback", __func__);
+        ALOGD("%s: Issue Callback", __func__);
         obj->mChannelCB(NULL, &result, resultFrameNumber, obj->mUserData);
 
         // release internal data for jpeg job
@@ -818,10 +814,13 @@
                         QCamera3Channel(cam_handle, cam_ops, cb_routine,
                         paddingInfo, userData),
                         mCamera3Stream(stream),
-                        m_postprocessor(this),
+                        mNumBufs(0),
                         mCamera3Buffers(NULL),
+                        mJpegSettings(NULL),
+                        mCurrentBufIndex(-1),
                         mMemory(NULL),
-                        mYuvMemory(NULL)
+                        mYuvMemory(NULL),
+                        m_postprocessor(this)
 {
     int32_t rc = m_postprocessor.init(jpegEvtHandle, this);
     if (rc != 0) {
@@ -887,7 +886,7 @@
         //Stream on for main image. YUV buffer is queued to the kernel at the end of this call.
         rc = start();
     } else {
-        ALOGE("%s: Request on an existing stream",__func__);
+        ALOGD("%s: Request on an existing stream",__func__);
     }
 
     if(rc != NO_ERROR) {
@@ -934,7 +933,7 @@
 void QCamera3PicChannel::dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
                                  void *userdata)
 {
-    ALOGE("%s: E\n", __func__);
+    ALOGV("%s: E\n", __func__);
     QCamera3PicChannel *channel = (QCamera3PicChannel *)userdata;
 
     if (channel == NULL) {
@@ -954,8 +953,8 @@
     }
 
     channel->QCamera3PicChannel::streamCbRoutine(recvd_frame, channel->mStreams[0]);
-    ALOGE("%s: X\n", __func__);
 
+    ALOGV("%s: X\n", __func__);
     return;
 }
 
@@ -964,12 +963,10 @@
                         buffer_handle_t **buffers)
 {
     int rc = 0;
-    struct private_handle_t *priv_handle = (struct private_handle_t *)(*buffers[0]);
     cam_stream_type_t streamType;
     cam_format_t streamFormat;
-    cam_dimension_t streamDim;
 
-    ALOGE("%s: E",__func__);
+    ALOGV("%s: E",__func__);
     rc = QCamera3PicChannel::initialize();
     if (rc < 0) {
         ALOGE("%s: init failed", __func__);
@@ -994,6 +991,7 @@
     for (size_t i = 0; i < num_buffers; i++)
         mCamera3Buffers[i] = buffers[i];
 
+    ALOGV("%s: X",__func__);
     return rc;
 }
 
@@ -1001,8 +999,8 @@
                             QCamera3Stream *stream)
 {
     //TODO
-    //Used only for getting YUV. Jpeg callback will be sent back from channel directly to HWI.
-    //Refer to func jpegEvtHandle
+    //Used only for getting YUV. Jpeg callback will be sent back from channel
+    //directly to HWI. Refer to func jpegEvtHandle
 
     //Got the yuv callback. Calling yuv callback handler in PostProc
     uint8_t frameIndex;
@@ -1034,7 +1032,8 @@
 
     frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
     if (frame == NULL) {
-       ALOGE("%s: Error allocating memory to save received_frame structure.", __func__);
+       ALOGE("%s: Error allocating memory to save received_frame structure.",
+                                                                    __func__);
        if(stream) {
            stream->bufDone(frameIndex);
        }
@@ -1109,7 +1108,7 @@
 {
     //TBD_Later
     //if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
-       if (mJpegSettings->jpeg_orientation > 0) {
+    if (mJpegSettings->jpeg_orientation > 0) {
         // current rotation is not zero, and pp has the capability to process rotation
         ALOGD("%s: need do online rotation", __func__);
         return true;
@@ -1420,11 +1419,11 @@
  *              none-zero failure code
  *==========================================================================*/
 int32_t getExifGpsDateTimeStamp(char *gpsDateStamp,
-                                                   uint32_t bufLen,
-                                                   rat_t *gpsTimeStamp, int64_t value)
+                                           uint32_t bufLen,
+                                           rat_t *gpsTimeStamp, int64_t value)
 {
     char str[30];
-    snprintf(str, sizeof(str), "%d", value);
+    snprintf(str, sizeof(str), "%lld", value);
     if(str != NULL) {
         time_t unixTime = (time_t)atol(str);
         struct tm *UTCTimestamp = gmtime(&unixTime);
diff --git a/camera/QCamera2/HAL3/QCamera3Channel.h b/camera/QCamera2/HAL3/QCamera3Channel.h
index 03451b8..20fa3a1 100644
--- a/camera/QCamera2/HAL3/QCamera3Channel.h
+++ b/camera/QCamera2/HAL3/QCamera3Channel.h
@@ -165,10 +165,6 @@
     virtual QCamera3Memory *getStreamBufs(uint32_t le);
     virtual void putStreamBufs();
 
-#ifdef FAKE_FRAME_NUMBERS
-    uint32_t startingFrameNumber;
-#endif
-
 private:
     QCamera3HeapMemory *mMemory;
 };
diff --git a/camera/QCamera2/HAL3/QCamera3Factory.cpp b/camera/QCamera2/HAL3/QCamera3Factory.cpp
index 8b145ea..80744cf 100644
--- a/camera/QCamera2/HAL3/QCamera3Factory.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Factory.cpp
@@ -132,7 +132,7 @@
 int QCamera3Factory::getCameraInfo(int camera_id, struct camera_info *info)
 {
     int rc;
-    ALOGE("%s: E, camera_id = %d", __func__, camera_id);
+    ALOGV("%s: E, camera_id = %d", __func__, camera_id);
 
     if (!mNumOfCameras || camera_id >= mNumOfCameras || !info) {
         return INVALID_OPERATION;
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 81bf9ad..c07677d 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -184,30 +184,31 @@
  *==========================================================================*/
 QCamera3HardwareInterface::~QCamera3HardwareInterface()
 {
-    ALOGE("%s: %d", __func__, __LINE__);
+    ALOGV("%s: E", __func__);
     /* Clean up all channels */
     mMetadataChannel->stop();
     delete mMetadataChannel;
     mMetadataChannel = NULL;
+    /* We need to stop all streams before deleting any stream */
     for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
         it != mStreamInfo.end(); it++) {
         QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
         channel->stop();
+    }
+    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
+        it != mStreamInfo.end(); it++) {
+        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
         delete channel;
         free (*it);
     }
 
-    ALOGE("%s: %d", __func__, __LINE__);
     if (mJpegSettings != NULL) {
         free(mJpegSettings);
         mJpegSettings = NULL;
     }
-    ALOGE("%s: %d", __func__, __LINE__);
     deinitParameters();
-    ALOGE("%s: %d", __func__, __LINE__);
     closeCamera();
 
-    ALOGE("%s: %d", __func__, __LINE__);
     for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
         if (mDefaultMetadata[i])
             free_camera_metadata(mDefaultMetadata[i]);
@@ -217,6 +218,7 @@
 
     pthread_mutex_destroy(&mMutex);
     pthread_mutex_destroy(&mCaptureResultLock);
+    ALOGV("%s: X", __func__);
 }
 
 /*===========================================================================
@@ -394,8 +396,11 @@
      * if they appear again, they will be validated */
     for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
             it != mStreamInfo.end(); it++) {
+        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
+        channel->stop();
         (*it)->status = INVALID;
     }
+
     for (size_t i = 0; i < streamList->num_streams; i++) {
         camera3_stream_t *newStream = streamList->streams[i];
         ALOGV("%s: newStream type = %d, stream format = %d",
@@ -411,7 +416,6 @@
                 (*it)->status = RECONFIGURE;
                 /*delete the channel object associated with the stream because
                   we need to reconfigure*/
-                channel->stop();
                 delete channel;
                 (*it)->stream->priv = NULL;
             }
@@ -436,14 +440,11 @@
     }
     mInputStream = inputStream;
 
-    /* TODO: Clean up no longer used streams, and maintain others if this
-     * is not the 1st time configureStreams is called */
     /*clean up invalid streams*/
     for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
             it != mStreamInfo.end();) {
         if(((*it)->status) == INVALID){
             QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
-            channel->stop();
             delete channel;
             delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
             free(*it);
@@ -532,7 +533,7 @@
                     ALOGE("%s: Failed to register the buffers of old stream,\
                             rc = %d", __func__, rc);
                 }
-                ALOGE("%s: channel %p has %d buffers",
+                ALOGD("%s: channel %p has %d buffers",
                         __func__, channel, (*it)->buffer_set.num_buffers);
             }
         }
@@ -552,7 +553,6 @@
     memset(mParameters, 0, sizeof(parm_buffer_t));
     mFirstRequest = true;
 
-end:
     pthread_mutex_unlock(&mMutex);
     return rc;
 }
@@ -769,14 +769,11 @@
         }
     }
 
-    ALOGV("%s: %d", __func__, __LINE__);
-
     /* Update pending request list and pending buffers map */
     pthread_mutex_lock(&mRequestLock);
     PendingRequestInfo pendingRequest;
     pendingRequest.frame_number = frameNumber;
     pendingRequest.num_buffers = request->num_output_buffers;
-//    pendingRequest.metadata = NULL;
     for (size_t i = 0; i < request->num_output_buffers; i++) {
         RequestedBufferInfo requestedBuf;
         requestedBuf.stream = request->output_buffers[i].stream;
@@ -804,7 +801,7 @@
         if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
             rc = channel->request(output.buffer, frameNumber, mJpegSettings);
         } else {
-            ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber);
+            ALOGI("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber);
             rc = channel->request(output.buffer, frameNumber);
         }
         if (rc < 0)
@@ -898,11 +895,11 @@
             tv->tv_usec * NSEC_PER_USEC;
 
         if (!frame_number_valid) {
-            ALOGI("%s: Not a valid frame number, used as SOF only", __func__);
+            ALOGD("%s: Not a valid frame number, used as SOF only", __func__);
             mMetadataChannel->bufDone(metadata_buf);
             goto done_metadata;
         }
-        ALOGE("%s: valid frame_number = %d, capture_time = %lld", __func__,
+        ALOGD("%s: valid frame_number = %d, capture_time = %lld", __func__,
                 frame_number, capture_time);
 
         // Go through the pending requests info and send shutter/results to frameworks
@@ -910,7 +907,7 @@
                 i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
             camera3_capture_result_t result;
             camera3_notify_msg_t notify_msg;
-            ALOGE("%s: frame_number in the list is %d", __func__, i->frame_number);
+            ALOGD("%s: frame_number in the list is %d", __func__, i->frame_number);
 
             // Flush out all entries with less or equal frame numbers.
 
@@ -928,7 +925,7 @@
             notify_msg.message.shutter.frame_number = i->frame_number;
             notify_msg.message.shutter.timestamp = current_capture_time;
             mCallbackOps->notify(mCallbackOps, &notify_msg);
-            ALOGE("%s: notify frame_number = %d, capture_time = %lld", __func__,
+            ALOGD("%s: notify frame_number = %d, capture_time = %lld", __func__,
                     i->frame_number, capture_time);
 
             // Send empty metadata with already filled buffers for dropped metadata
@@ -975,15 +972,14 @@
                 result.output_buffers = result_buffers;
 
                 mCallbackOps->process_capture_result(mCallbackOps, &result);
-                ALOGE("%s: meta frame_number = %d, capture_time = %lld", __func__,
-                        result.frame_number,
-                        current_capture_time);
+                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
+                        __func__, result.frame_number, current_capture_time);
                 free_camera_metadata((camera_metadata_t *)result.result);
                 delete[] result_buffers;
             } else {
                 mCallbackOps->process_capture_result(mCallbackOps, &result);
-                ALOGE("%s: meta frame_number = %d, capture_time = %lld", __func__,
-                        result.frame_number, current_capture_time);
+                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
+                        __func__, result.frame_number, current_capture_time);
                 free_camera_metadata((camera_metadata_t *)result.result);
             }
             // erase the element from the list
@@ -1027,7 +1023,7 @@
             result.frame_number = frame_number;
             result.num_output_buffers = 1;
             result.output_buffers = buffer;
-            ALOGE("%s: result frame_number = %d, buffer = %p",
+            ALOGD("%s: result frame_number = %d, buffer = %p",
                     __func__, frame_number, buffer);
             mPendingBuffersMap.editValueFor(buffer->stream)--;
             mCallbackOps->process_capture_result(mCallbackOps, &result);
@@ -1041,7 +1037,7 @@
                         j->buffer = (camera3_stream_buffer_t *)malloc(
                                 sizeof(camera3_stream_buffer_t));
                         *(j->buffer) = *buffer;
-                        ALOGE("%s: cache buffer %p at result frame_number %d",
+                        ALOGD("%s: cache buffer %p at result frame_number %d",
                                 __func__, buffer, frame_number);
                     }
                 }
@@ -1921,7 +1917,6 @@
                       avail_antibanding_modes,
                       size);
 
-    ALOGE("%s: %d", __func__, __LINE__);
     static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
     size = 0;
     for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
@@ -2139,12 +2134,16 @@
                                              int len, int hal_name)
 {
 
-   for (int i = 0; i < len; i++) {
-       if (arr[i].hal_name == hal_name)
-           return arr[i].fwk_name;
+    for (int i = 0; i < len; i++) {
+        if (arr[i].hal_name == hal_name)
+            return arr[i].fwk_name;
     }
-   ALOGE("%s: Cannot find matching framework type", __func__);
-   return NAME_NOT_FOUND;
+
+    /* Not able to find matching framework type is not necessarily
+     * an error case. This happens when mm-camera supports more attributes
+     * than the frameworks do */
+    ALOGD("%s: Cannot find matching framework type", __func__);
+    return NAME_NOT_FOUND;
 }
 
 /*===========================================================================
@@ -2371,7 +2370,6 @@
         rc = translateMetadataToParameters(settings);
     }
     /*set the parameters to backend*/
-    ALOGE("%s: %d", __func__, __LINE__);
     mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
     return rc;
 }
@@ -2820,7 +2818,7 @@
 int QCamera3HardwareInterface::initialize(const struct camera3_device *device,
                                   const camera3_callback_ops_t *callback_ops)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2829,7 +2827,7 @@
     }
 
     int rc = hw->initialize(callback_ops);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return rc;
 }
 
@@ -2850,7 +2848,7 @@
         const struct camera3_device *device,
         camera3_stream_configuration_t *stream_list)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2858,7 +2856,7 @@
         return -ENODEV;
     }
     int rc = hw->configureStreams(stream_list);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return rc;
 }
 
@@ -2875,7 +2873,7 @@
         const struct camera3_device *device,
         const camera3_stream_buffer_set_t *buffer_set)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2883,7 +2881,7 @@
         return -ENODEV;
     }
     int rc = hw->registerStreamBuffers(buffer_set);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return rc;
 }
 
@@ -2903,7 +2901,7 @@
                                         int type)
 {
 
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     camera_metadata_t* fwk_metadata = NULL;
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
@@ -2914,7 +2912,7 @@
 
     fwk_metadata = hw->translateCapabilityToMetadata(type);
 
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return fwk_metadata;
 }
 
@@ -2932,7 +2930,7 @@
                     const struct camera3_device *device,
                     camera3_capture_request_t *request)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2941,7 +2939,7 @@
     }
 
     int rc = hw->processCaptureRequest(request);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return rc;
 }
 
@@ -2960,7 +2958,7 @@
                 const struct camera3_device *device,
                 vendor_tag_query_ops_t* ops)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2969,7 +2967,7 @@
     }
 
     hw->getMetadataVendorTagOps(ops);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return;
 }
 
@@ -2987,7 +2985,7 @@
 void QCamera3HardwareInterface::dump(
                 const struct camera3_device *device, int fd)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
     if (!hw) {
@@ -2996,7 +2994,7 @@
     }
 
     hw->dump(fd);
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return;
 }
 
@@ -3012,7 +3010,7 @@
  *==========================================================================*/
 int QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
 {
-    ALOGE("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     int ret = NO_ERROR;
     QCamera3HardwareInterface *hw =
         reinterpret_cast<QCamera3HardwareInterface *>(
@@ -3022,7 +3020,7 @@
         return BAD_VALUE;
     }
     delete hw;
-    ALOGE("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return ret;
 }
 
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 0fe55aa..71a9fa5 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -179,7 +179,6 @@
         uint32_t frame_number;
         uint32_t num_buffers;
         List<RequestedBufferInfo> buffers;
-        //mm_camera_super_buf_t *metadata;
     } PendingRequestInfo;
     typedef KeyedVector<camera3_stream_t *, uint32_t> PendingBuffersMap;
 
diff --git a/camera/QCamera2/HAL3/QCamera3Mem.cpp b/camera/QCamera2/HAL3/QCamera3Mem.cpp
index a50893d..2bb10ea 100644
--- a/camera/QCamera2/HAL3/QCamera3Mem.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Mem.cpp
@@ -600,9 +600,10 @@
 {
     status_t ret = NO_ERROR;
     struct ion_fd_data ion_info_fd;
+    ALOGV(" %s : E ", __FUNCTION__);
+
     memset(&ion_info_fd, 0, sizeof(ion_info_fd));
 
-    ALOGI(" %s : E ", __FUNCTION__);
 
     if (num_buffers > MM_CAMERA_MAX_NUM_FRAMES) {
         ALOGE("%s: Number of buffers %d greater than what's supported %d",
@@ -683,7 +684,7 @@
     mBufferCount = num_buffers;
 
 end:
-    ALOGI(" %s : X ",__func__);
+    ALOGV(" %s : X ",__func__);
     return ret;
 }
 
@@ -698,7 +699,7 @@
  *==========================================================================*/
 void QCamera3GrallocMemory::unregisterBuffers()
 {
-    ALOGI("%s: E ", __FUNCTION__);
+    ALOGV("%s: E ", __FUNCTION__);
 
     for (int cnt = 0; cnt < mBufferCount; cnt++) {
         munmap(mPtr[cnt], mMemInfo[cnt].size);
@@ -714,7 +715,7 @@
         ALOGD("put buffer %d successfully", cnt);
     }
     mBufferCount = 0;
-    ALOGI(" %s : X ",__FUNCTION__);
+    ALOGV(" %s : X ",__FUNCTION__);
 }
 
 /*===========================================================================
diff --git a/camera/QCamera2/HAL3/QCamera3PostProc.cpp b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
index 8291584..236f170 100644
--- a/camera/QCamera2/HAL3/QCamera3PostProc.cpp
+++ b/camera/QCamera2/HAL3/QCamera3PostProc.cpp
@@ -129,7 +129,7 @@
 
     if(mJpegClientHandle > 0) {
         int rc = mJpegHandle.close(mJpegClientHandle);
-        ALOGE("%s: Jpeg closed, rc = %d, mJpegClientHandle = %x",
+        ALOGD("%s: Jpeg closed, rc = %d, mJpegClientHandle = %x",
               __func__, rc, mJpegClientHandle);
         mJpegClientHandle = 0;
         memset(&mJpegHandle, 0, sizeof(mJpegHandle));
@@ -692,14 +692,14 @@
         return UNKNOWN_ERROR;
     }
 
-    ALOGE("%s: Need new session?:%d",__func__, needNewSess);
+    ALOGD("%s: Need new session?:%d",__func__, needNewSess);
     if (needNewSess) {
         // create jpeg encoding session
         mm_jpeg_encode_params_t encodeParam;
         memset(&encodeParam, 0, sizeof(mm_jpeg_encode_params_t));
 
         getJpegEncodingConfig(encodeParam, main_stream, thumb_stream);
-        ALOGE("%s: #src bufs:%d # tmb bufs:%d #dst_bufs:%d", __func__,
+        ALOGD("%s: #src bufs:%d # tmb bufs:%d #dst_bufs:%d", __func__,
                      encodeParam.num_src_bufs,encodeParam.num_tmb_bufs,encodeParam.num_dst_bufs);
         ret = mJpegHandle.create_session(mJpegClientHandle, &encodeParam, &mJpegSessionId);
         if (ret != NO_ERROR) {
@@ -731,7 +731,7 @@
     jpg_job.encode_job.main_dim.crop = crop;
 
     // thumbnail dim
-    ALOGE("%s: Thumbnail needed:%d",__func__, m_bThumbnailNeeded);
+    ALOGD("%s: Thumbnail needed:%d",__func__, m_bThumbnailNeeded);
     if (m_bThumbnailNeeded == TRUE) {
         if (thumb_stream == NULL) {
             // need jpeg thumbnail, but no postview/preview stream exists
@@ -791,7 +791,7 @@
         jpeg_job_data->jobId = jobId;
     }
 
-    ALOGD("%s : X", __func__);
+    ALOGV("%s : X", __func__);
     return ret;
 }
 
@@ -813,10 +813,10 @@
     int ret;
     uint8_t is_active = FALSE;
     uint8_t needNewSess = TRUE;
+    ALOGV("%s: E", __func__);
     QCamera3PostProcessor *pme = (QCamera3PostProcessor *)data;
     QCameraCmdThread *cmdThread = &pme->m_dataProcTh;
 
-    ALOGD("%s: E", __func__);
     do {
         do {
             ret = cam_sem_wait(&cmdThread->cmd_sem);
@@ -960,7 +960,7 @@
             break;
         }
     } while (running);
-    ALOGD("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return NULL;
 }
 
diff --git a/camera/QCamera2/HAL3/QCamera3Stream.cpp b/camera/QCamera2/HAL3/QCamera3Stream.cpp
index 6d68018..6e8073f 100644
--- a/camera/QCamera2/HAL3/QCamera3Stream.cpp
+++ b/camera/QCamera2/HAL3/QCamera3Stream.cpp
@@ -285,7 +285,7 @@
     switch(streamType) {
         case CAM_STREAM_TYPE_SNAPSHOT:
             stream_config.stream_cb = NULL;
-            ALOGE("%s: disabling stream_cb for snapshot", __func__);
+            ALOGI("%s: disabling stream_cb for snapshot", __func__);
             break;
         default:
             stream_config.stream_cb = dataNotifyCB;
@@ -372,9 +372,11 @@
  *==========================================================================*/
 int32_t QCamera3Stream::processDataNotify(mm_camera_super_buf_t *frame)
 {
-    ALOGI("%s:\n", __func__);
+    ALOGV("%s: E\n", __func__);
     mDataQ.enqueue((void *)frame);
-    return mProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE);
+    int32_t rc = mProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE);
+    ALOGV("%s: X\n", __func__);
+    return rc;
 }
 
 /*===========================================================================
@@ -392,7 +394,7 @@
 void QCamera3Stream::dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
                                  void *userdata)
 {
-    ALOGI("%s:\n", __func__);
+    ALOGV("%s: E\n", __func__);
     QCamera3Stream* stream = (QCamera3Stream *)userdata;
     if (stream == NULL ||
         recvd_frame == NULL ||
@@ -431,7 +433,7 @@
     QCamera3Stream *pme = (QCamera3Stream *)data;
     QCameraCmdThread *cmdThread = &pme->mProcTh;
 
-    ALOGI("%s: E", __func__);
+    ALOGV("%s: E", __func__);
     do {
         do {
             ret = cam_sem_wait(&cmdThread->cmd_sem);
@@ -471,7 +473,7 @@
             break;
         }
     } while (running);
-    ALOGD("%s: X", __func__);
+    ALOGV("%s: X", __func__);
     return NULL;
 }
 
@@ -564,7 +566,7 @@
 
     mBufDefs = (mm_camera_buf_def_t *)malloc(mNumBufs * sizeof(mm_camera_buf_def_t));
     if (mBufDefs == NULL) {
-        ALOGE("%s: getRegFlags failed %d", __func__, rc);
+        ALOGE("%s: Failed to allocate mm_camera_buf_def_t %d", __func__, rc);
         for (int i = 0; i < mNumBufs; i++) {
             ops_tbl->unmap_ops(i, -1, ops_tbl->userdata);
         }
@@ -802,7 +804,6 @@
     return mCamOps->unmap_stream_buf(mCamHandle, mChannelHandle,
                                      mHandle, buf_type,
                                      buf_idx, plane_idx);
-
 }
 
 /*===========================================================================
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
index 8c61c42..f938959 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
@@ -975,7 +975,7 @@
         buf_info->buf->frame_idx = vb.sequence;
         buf_info->buf->ts.tv_sec  = vb.timestamp.tv_sec;
         buf_info->buf->ts.tv_nsec = vb.timestamp.tv_usec * 1000;
-        CDBG("%s: VIDIOC_DQBUF buf_index %d, frame_idx %d, stream type %d\n",
+        CDBG_HIGH("%s: VIDIOC_DQBUF buf_index %d, frame_idx %d, stream type %d\n",
              __func__, vb.index, buf_info->buf->frame_idx, my_obj->stream_info->stream_type);
         if ( NULL != my_obj->mem_vtbl.clean_invalidate_buf ) {
             rc = my_obj->mem_vtbl.clean_invalidate_buf(idx,
