diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index 8b512bf..a0d7d8d 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -315,6 +315,7 @@
             (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) {
             useFbMem = true;
         } else {
+            usage &= ~GRALLOC_USAGE_PRIVATE_ALLOC_UBWC;
             if (property_get("debug.gralloc.enable_fb_ubwc", isUBWC, NULL) > 0){
                 if ((!strncmp(isUBWC, "1", PROPERTY_VALUE_MAX)) ||
                     (!strncasecmp(isUBWC, "true", PROPERTY_VALUE_MAX))) {
diff --git a/libqdutils/display_config.cpp b/libqdutils/display_config.cpp
index 43887e0..e9b30f3 100644
--- a/libqdutils/display_config.cpp
+++ b/libqdutils/display_config.cpp
@@ -280,26 +280,6 @@
     return err;
 }
 
-int minHdcpEncryptionLevelChanged(int dpy) {
-    status_t err = (status_t) FAILED_TRANSACTION;
-    sp<IQService> binder = getBinder();
-    Parcel inParcel, outParcel;
-    inParcel.writeInt32(dpy);
-
-    if(binder != NULL) {
-        err = binder->dispatch(IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED,
-                &inParcel, &outParcel);
-    }
-
-    if(err) {
-        ALOGE("%s: Failed for dpy %d err=%d", __FUNCTION__, dpy, err);
-    } else {
-        err = outParcel.readInt32();
-    }
-
-    return err;
-}
-
 int setPanelBrightness(int level) {
     status_t err = (status_t) FAILED_TRANSACTION;
     sp<IQService> binder = getBinder();
@@ -338,8 +318,28 @@
 }// namespace
 
 // ----------------------------------------------------------------------------
-// Screen refresh for native daemons linking dynamically to libqdutils
+// Functions for linking dynamically to libqdutils
 // ----------------------------------------------------------------------------
+extern "C" int minHdcpEncryptionLevelChanged(int dpy) {
+    status_t err = (status_t) FAILED_TRANSACTION;
+    sp<IQService> binder = getBinder();
+    Parcel inParcel, outParcel;
+    inParcel.writeInt32(dpy);
+
+    if(binder != NULL) {
+        err = binder->dispatch(IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED,
+                &inParcel, &outParcel);
+    }
+
+    if(err) {
+        ALOGE("%s: Failed for dpy %d err=%d", __FUNCTION__, dpy, err);
+    } else {
+        err = outParcel.readInt32();
+    }
+
+    return err;
+}
+
 extern "C" int refreshScreen() {
     int ret = 0;
     ret = screenRefresh();
diff --git a/libqdutils/display_config.h b/libqdutils/display_config.h
index 101e230..9ba60f2 100644
--- a/libqdutils/display_config.h
+++ b/libqdutils/display_config.h
@@ -141,11 +141,6 @@
 // Set the primary display mode to command or video mode
 int setDisplayMode(int mode);
 
-// Notify change in minimum encryption level for HDCP
-// Return -1 on error.
-// Only HDMI display is supported as dpy for now
-int minHdcpEncryptionLevelChanged(int dpy);
-
 // Sets the panel brightness of the primary display
 int setPanelBrightness(int level);
 
diff --git a/sdm/include/core/debug_interface.h b/sdm/include/core/debug_interface.h
index bd2b5dd..67a38be 100644
--- a/sdm/include/core/debug_interface.h
+++ b/sdm/include/core/debug_interface.h
@@ -118,6 +118,15 @@
   */
   virtual DisplayError GetProperty(const char *property_name, int *value) = 0;
 
+  /*! @brief Method to get property value corresponding to give string.
+
+   @param[in] property_name name of the property
+   @param[out] string value corresponding to the property name
+
+   @return \link DisplayError \endlink
+  */
+  virtual DisplayError GetProperty(const char *property_name, char *value) = 0;
+
  protected:
   virtual ~DebugHandler() { }
 };
diff --git a/sdm/include/utils/debug.h b/sdm/include/utils/debug.h
index c8a3a98..b4a286a 100644
--- a/sdm/include/utils/debug.h
+++ b/sdm/include/utils/debug.h
@@ -72,6 +72,7 @@
   static bool IsRotatorSplitDisabled();
   static bool IsScalarDisabled();
   static bool IsUbwcTiledFrameBuffer();
+  static bool GetProperty(const char *property_name, char *value);
 
  private:
   Debug();
@@ -91,6 +92,9 @@
     virtual DisplayError GetProperty(const char */*property_name*/, int */*value*/) {
       return kErrorNotSupported;
     }
+    virtual DisplayError GetProperty(const char */*property_name*/, char */*value*/) {
+      return kErrorNotSupported;
+    }
   };
 
   DefaultDebugHandler default_debug_handler_;
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index de4b326..9e1b277 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -202,7 +202,11 @@
     constraints->safe_mode = true;
   }
 
-  if (display_comp_ctx->idle_fallback || display_comp_ctx->fallback_) {
+  // Avoid idle fallback, if there is only one app layer.
+  // TODO(user): App layer count will change for hybrid composition
+  uint32_t app_layer_count = hw_layers->info.stack->layer_count - 1;
+  if ((app_layer_count > 1 && display_comp_ctx->idle_fallback) || display_comp_ctx->fallback_) {
+    // Handle the idle timeout by falling back
     constraints->safe_mode = true;
   }
 
@@ -218,13 +222,6 @@
   display_comp_ctx->strategy->Start(&hw_layers->info, &display_comp_ctx->max_strategies,
                                     display_comp_ctx->partial_update_enable);
   display_comp_ctx->remaining_strategies = display_comp_ctx->max_strategies;
-
-  // Avoid idle fallback, if there is only one app layer.
-  // TODO(user): App layer count will change for hybrid composition
-  uint32_t app_layer_count = hw_layers->info.stack->layer_count - 1;
-  if (!display_comp_ctx->idle_fallback && app_layer_count > 1) {
-    display_comp_ctx->handle_idle_timeout = true;
-  }
 }
 
 DisplayError CompManager::Prepare(Handle display_ctx, HWLayers *hw_layers) {
@@ -351,16 +348,7 @@
     return;
   }
 
-  // 1. handle_idle_timeout flag is set to true on start of every draw call, if the current
-  //    composition is not due to idle fallback.
-  // 2. idle_fallback flag will be set only if handle_idle_timeout flag is true and there is no
-  //    update to the screen for specified amount of time.
-  // 3. handle_idle_timeout flag helps us handle the very first idle timeout event and
-  //    ignore the next idle timeout event on consecutive two idle timeout events.
-  if (display_comp_ctx->handle_idle_timeout) {
-    display_comp_ctx->idle_fallback = true;
-    display_comp_ctx->handle_idle_timeout = false;
-  }
+  display_comp_ctx->idle_fallback = true;
 }
 
 void CompManager::ProcessThermalEvent(Handle display_ctx, int64_t thermal_level) {
@@ -448,5 +436,20 @@
   return supported;
 }
 
+bool CompManager::CanSetIdleTimeout(Handle display_ctx) {
+  DisplayCompositionContext *display_comp_ctx =
+                             reinterpret_cast<DisplayCompositionContext *>(display_ctx);
+
+  if (!display_comp_ctx) {
+    return false;
+  }
+
+  if (!display_comp_ctx->idle_fallback) {
+    return true;
+  }
+
+  return false;
+}
+
 }  // namespace sdm
 
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index 8db045a..a6b1432 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -59,6 +59,7 @@
   DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90);
   DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y);
   bool SupportLayerAsCursor(Handle display_ctx, HWLayers *hw_layers);
+  bool CanSetIdleTimeout(Handle display_ctx);
 
   // DumpImpl method
   virtual void AppendDump(char *buffer, uint32_t length);
@@ -69,21 +70,15 @@
   void PrepareStrategyConstraints(Handle display_ctx, HWLayers *hw_layers);
 
   struct DisplayCompositionContext {
-    Strategy *strategy;
+    Strategy *strategy = NULL;
     StrategyConstraints constraints;
-    Handle display_resource_ctx;
-    DisplayType display_type;
-    uint32_t max_strategies;
-    uint32_t remaining_strategies;
-    bool idle_fallback;
-    bool handle_idle_timeout;
-    bool fallback_;
-    uint32_t partial_update_enable;
-
-    DisplayCompositionContext()
-      : display_resource_ctx(NULL), display_type(kPrimary), max_strategies(0),
-        remaining_strategies(0), idle_fallback(false), handle_idle_timeout(true),
-        fallback_(false), partial_update_enable(true) { }
+    Handle display_resource_ctx = NULL;
+    DisplayType display_type = kPrimary;
+    uint32_t max_strategies = 0;
+    uint32_t remaining_strategies = 0;
+    bool idle_fallback = false;
+    bool fallback_ = false;
+    uint32_t partial_update_enable = true;
   };
 
   Locker locker_;
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
old mode 100755
new mode 100644
index 06bbccb..63fe6b2
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -57,10 +57,7 @@
     return error;
   }
 
-  // Idle fallback feature is supported only for video mode panel.
-  if (hw_panel_info_.mode == kModeVideo) {
-    hw_intf_->SetIdleTimeoutMs(Debug::GetIdleTimeoutMs());
-  }
+  idle_timeout_ms_ = Debug::GetIdleTimeoutMs();
 
   if (hw_panel_info_.mode == kModeCommand && Debug::IsVideoModeEnabled()) {
     error = hw_intf_->SetDisplayMode(kModeVideo);
@@ -94,6 +91,8 @@
   HWDisplayAttributes display_attributes;
   uint32_t active_index = 0;
 
+  bool set_idle_timeout = comp_manager_->CanSetIdleTimeout(display_comp_ctx_);
+
   error = DisplayBase::Commit(layer_stack);
   if (error != kErrorNone) {
     return error;
@@ -108,6 +107,10 @@
     hw_panel_info_ = panel_info;
   }
 
+  if (set_idle_timeout && hw_panel_info_.mode != kModeCommand) {
+    hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_);
+  }
+
   return error;
 }
 
@@ -187,10 +190,12 @@
 
 void DisplayPrimary::SetIdleTimeoutMs(uint32_t timeout_ms) {
   SCOPE_LOCK(locker_);
+
   // Idle fallback feature is supported only for video mode panel.
   if (hw_panel_info_.mode == kModeVideo) {
     hw_intf_->SetIdleTimeoutMs(timeout_ms);
   }
+  idle_timeout_ms_ = timeout_ms;
 }
 
 DisplayError DisplayPrimary::SetMaxMixerStages(uint32_t max_mixer_stages) {
@@ -241,7 +246,7 @@
   }
 
   if (hw_display_mode == kModeVideo) {
-    hw_intf_->SetIdleTimeoutMs(Debug::GetIdleTimeoutMs());
+    hw_intf_->SetIdleTimeoutMs(idle_timeout_ms_);
   } else if (hw_display_mode == kModeCommand) {
     hw_intf_->SetIdleTimeoutMs(0);
   }
@@ -278,12 +283,15 @@
 DisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate) {
   SCOPE_LOCK(locker_);
 
-  if (!hw_panel_info_.dynamic_fps || refresh_rate < hw_panel_info_.min_fps ||
-       refresh_rate > hw_panel_info_.max_fps) {
-    DLOGW("Invalid Request");
+  if (state_ != kStateOn || !hw_panel_info_.dynamic_fps) {
     return kErrorNotSupported;
   }
 
+  if (refresh_rate < hw_panel_info_.min_fps || refresh_rate > hw_panel_info_.max_fps) {
+    DLOGE("Invalid Fps = %d request", refresh_rate);
+    return kErrorParameters;
+  }
+
   DisplayError error = hw_intf_->SetRefreshRate(refresh_rate);
   if (error != kErrorNone) {
     return error;
@@ -332,9 +340,9 @@
 }
 
 void DisplayPrimary::IdleTimeout() {
-  if (event_handler_->Refresh() == kErrorNone) {
-    comp_manager_->ProcessIdleTimeout(display_comp_ctx_);
-  }
+  event_handler_->Refresh();
+  comp_manager_->ProcessIdleTimeout(display_comp_ctx_);
+  hw_intf_->SetIdleTimeoutMs(0);
 }
 
 void DisplayPrimary::ThermalEvent(int64_t thermal_level) {
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index 900939d..b0f2934 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -71,6 +71,7 @@
 
  private:
   Locker locker_;
+  uint32_t idle_timeout_ms_ = 0;
 };
 
 }  // namespace sdm
diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp
index 50e686a..590c23c 100644
--- a/sdm/libs/core/fb/hw_device.cpp
+++ b/sdm/libs/core/fb/hw_device.cpp
@@ -852,7 +852,6 @@
 }
 
 bool HWDevice::EnableHotPlugDetection(int enable) {
-  bool ret_value = true;
   char hpdpath[kMaxStringLength];
   int hdmi_node_index = GetFBNodeIndex(kDeviceHDMI);
   if (hdmi_node_index < 0) {
@@ -860,22 +859,14 @@
   }
 
   snprintf(hpdpath , sizeof(hpdpath), "%s%d/hpd", fb_path_, hdmi_node_index);
-  int hpdfd = Sys::open_(hpdpath, O_RDWR, 0);
-  if (hpdfd < 0) {
-    DLOGW("Open failed = %s", hpdpath);
+
+  char value = enable ? '1' : '0';
+  ssize_t length = SysFsWrite(hpdpath, &value, sizeof(value));
+  if (length <= 0) {
     return false;
   }
 
-  char value = enable ? '1' : '0';
-  ssize_t length = Sys::pwrite_(hpdfd, &value, 1, 0);
-  if (length <= 0) {
-    DLOGE("Write failed 'hpd' = %d", enable);
-    ret_value = false;
-  }
-
-  Sys::close_(hpdfd);
-
-  return ret_value;
+  return true;
 }
 
 void HWDevice::ResetDisplayParams() {
@@ -1012,5 +1003,20 @@
   return kErrorNotSupported;
 }
 
+ssize_t HWDevice::SysFsWrite(char* file_node, char* value, ssize_t length) {
+  int fd = Sys::open_(file_node, O_RDWR, 0);
+  if (fd < 0) {
+    DLOGW("Open failed = %s", file_node);
+    return -1;
+  }
+  ssize_t len = Sys::pwrite_(fd, value, length, 0);
+  if (length <= 0) {
+    DLOGE("Write failed for path %s with value %s", file_node, value);
+  }
+  Sys::close_(fd);
+
+  return len;
+}
+
 }  // namespace sdm
 
diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h
index cde3efa..138dbda 100644
--- a/sdm/libs/core/fb/hw_device.h
+++ b/sdm/libs/core/fb/hw_device.h
@@ -111,6 +111,7 @@
   void SetColorSpace(LayerColorSpace source, mdp_color_space *color_space);
 
   bool EnableHotPlugDetection(int enable);
+  ssize_t SysFsWrite(char* file_node, char* value, ssize_t length);
 
   // Store the Device EventHandler - used for callback
   HWEventHandler *event_handler_;
diff --git a/sdm/libs/core/fb/hw_hdmi.cpp b/sdm/libs/core/fb/hw_hdmi.cpp
index c47a0bd..a5fff54 100644
--- a/sdm/libs/core/fb/hw_hdmi.cpp
+++ b/sdm/libs/core/fb/hw_hdmi.cpp
@@ -107,6 +107,9 @@
 DisplayError HWHDMI::Init(HWEventHandler *eventhandler) {
   DisplayError error = kErrorNone;
 
+  SetSourceProductInformation("vendor_name", "ro.product.manufacturer");
+  SetSourceProductInformation("product_description", "ro.product.name");
+
   error = HWDevice::Init(eventhandler);
   if (error != kErrorNone) {
     return error;
@@ -530,5 +533,26 @@
   return is_file_present;
 }
 
+void HWHDMI::SetSourceProductInformation(const char *node, const char *name) {
+  char property_value[kMaxStringLength];
+  char sys_fs_path[kMaxStringLength];
+  int hdmi_node_index = GetFBNodeIndex(kDeviceHDMI);
+  if (hdmi_node_index < 0) {
+    return;
+  }
+
+  ssize_t length = 0;
+  bool prop_read_success = Debug::GetProperty(name, property_value);
+  if (!prop_read_success) {
+    return;
+  }
+
+  snprintf(sys_fs_path , sizeof(sys_fs_path), "%s%d/%s", fb_path_, hdmi_node_index, node);
+  length = HWDevice::SysFsWrite(sys_fs_path, property_value, strlen(property_value));
+  if (length <= 0) {
+    DLOGW("Failed to write %s = %s", node, property_value);
+  }
+}
+
 }  // namespace sdm
 
diff --git a/sdm/libs/core/fb/hw_hdmi.h b/sdm/libs/core/fb/hw_hdmi.h
index 3f18b28..c216b8f 100644
--- a/sdm/libs/core/fb/hw_hdmi.h
+++ b/sdm/libs/core/fb/hw_hdmi.h
@@ -62,6 +62,7 @@
   DisplayError ReadTimingInfo();
   bool ReadResolutionFile(char *config_buffer);
   bool IsResolutionFilePresent();
+  void SetSourceProductInformation(const char *node, const char *name);
 
   uint32_t hdmi_mode_count_;
   uint32_t hdmi_modes_[256];
diff --git a/sdm/libs/core/fb/hw_primary.cpp b/sdm/libs/core/fb/hw_primary.cpp
index c548a26..884f87c 100644
--- a/sdm/libs/core/fb/hw_primary.cpp
+++ b/sdm/libs/core/fb/hw_primary.cpp
@@ -382,6 +382,7 @@
 
   char refresh_rate_string[kMaxStringLength];
   snprintf(refresh_rate_string, sizeof(refresh_rate_string), "%d", refresh_rate);
+  DLOGI_IF(kTagDriverConfig, "Setting refresh rate = %d", refresh_rate);
   ssize_t len = Sys::pwrite_(fd, refresh_rate_string, strlen(refresh_rate_string), 0);
   if (len < 0) {
     DLOGE("Failed to write %d with error %s", refresh_rate, strerror(errno));
@@ -546,7 +547,7 @@
 void HWPrimary::SetIdleTimeoutMs(uint32_t timeout_ms) {
   char node_path[kMaxStringLength] = {0};
 
-  DLOGI("Setting idle timeout to = %d ms", timeout_ms);
+  DLOGI_IF(kTagDriverConfig, "Setting idle timeout to = %d ms", timeout_ms);
 
   snprintf(node_path, sizeof(node_path), "%s%d/idle_time", fb_path_, fb_node_index_);
 
diff --git a/sdm/libs/hwc/hwc_color_manager.cpp b/sdm/libs/hwc/hwc_color_manager.cpp
index fcd2a55..5abe94a 100644
--- a/sdm/libs/hwc/hwc_color_manager.cpp
+++ b/sdm/libs/hwc/hwc_color_manager.cpp
@@ -217,13 +217,27 @@
   if (solid_fill_enable_ && solid_fill_layers_ && layer_list) {
     hwc_display->Commit(solid_fill_layers_);
 
-    // release SF layers corresponding Fences manually before returning to Framework.
+    // SurfaceFlinger layer stack is dropped in solid fill case and replaced with local layer stack
+    // Close acquire fence fds associated with SF layer stack
+    // Close release/retire fence fds returned along with local layer stack
     for (size_t i = 0; i < (layer_list->numHwLayers - 1); i++) {
-      if (layer_list->hwLayers[i].acquireFenceFd >= 0) {
-        close(layer_list->hwLayers[i].acquireFenceFd);
-        layer_list->hwLayers[i].acquireFenceFd = -1;
+      int &fence_fd = layer_list->hwLayers[i].acquireFenceFd;
+      if (fence_fd >= 0) {
+        close(fence_fd);
+        fence_fd = -1;
       }
-      layer_list->retireFenceFd = -1;
+    }
+
+    for (size_t i = 0; i < (solid_fill_layers_->numHwLayers - 1); i++) {
+      int &fence_fd = solid_fill_layers_->hwLayers[i].releaseFenceFd;
+      if (fence_fd >= 0) {
+        close(fence_fd);
+        fence_fd = -1;
+      }
+    }
+    if (solid_fill_layers_->retireFenceFd >= 0) {
+      close(solid_fill_layers_->retireFenceFd);
+      solid_fill_layers_->retireFenceFd = -1;
     }
 
     return true;
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index 7fe8984..099a507 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -381,9 +381,10 @@
 
   if (pvt_handle) {
     layer_buffer->format = GetSDMFormat(pvt_handle->format, pvt_handle->flags);
+    layer_buffer->width = pvt_handle->width;
+    layer_buffer->height = pvt_handle->height;
 
-    const MetaData_t *meta_data = reinterpret_cast<MetaData_t *>(pvt_handle->base_metadata);
-    if (meta_data && (SetMetaData(*meta_data, layer) != kErrorNone)) {
+    if (SetMetaData(pvt_handle, layer) != kErrorNone) {
       return -EINVAL;
     }
 
@@ -391,8 +392,6 @@
       return -EINVAL;
     }
 
-    layer_buffer->width = pvt_handle->width;
-    layer_buffer->height = pvt_handle->height;
     if (pvt_handle->bufferType == BUFFER_TYPE_VIDEO) {
       layer_stack_.flags.video_present = true;
       layer_buffer->flags.video = true;
@@ -463,7 +462,7 @@
   layer_buffer->acquire_fence_fd = hwc_layer->acquireFenceFd;
 }
 
-int HWCDisplay::PrepareLayerStack(hwc_display_contents_1_t *content_list) {
+int HWCDisplay::PrePrepareLayerStack(hwc_display_contents_1_t *content_list) {
   if (shutdown_pending_) {
     return 0;
   }
@@ -591,6 +590,15 @@
   // Configure layer stack
   layer_stack_.flags.geometry_changed = ((content_list->flags & HWC_GEOMETRY_CHANGED) > 0);
 
+  return 0;
+}
+
+int HWCDisplay::PrepareLayerStack(hwc_display_contents_1_t *content_list) {
+  if (shutdown_pending_) {
+    return 0;
+  }
+  size_t num_hw_layers = content_list->numHwLayers;
+
   if (!skip_prepare_) {
     DisplayError error = display_intf_->Prepare(&layer_stack_);
     if (error != kErrorNone) {
@@ -871,9 +879,7 @@
 }
 
 void HWCDisplay::SetIdleTimeoutMs(uint32_t timeout_ms) {
-  if (display_intf_) {
-    display_intf_->SetIdleTimeoutMs(timeout_ms);
-  }
+  return;
 }
 
 DisplayError HWCDisplay::SetMaxMixerStages(uint32_t max_mixer_stages) {
@@ -1260,25 +1266,40 @@
   return kErrorNone;
 }
 
-DisplayError HWCDisplay::SetMetaData(const MetaData_t &meta_data, Layer *layer) {
-  if (meta_data.operation & UPDATE_REFRESH_RATE) {
-    layer->frame_rate = RoundToStandardFPS(meta_data.refreshrate);
+DisplayError HWCDisplay::SetMetaData(const private_handle_t *pvt_handle, Layer *layer) {
+  const MetaData_t *meta_data = reinterpret_cast<MetaData_t *>(pvt_handle->base_metadata);
+  LayerBuffer *layer_buffer = layer->input_buffer;
+
+  if (!meta_data) {
+    return kErrorNone;
   }
 
-  if ((meta_data.operation & PP_PARAM_INTERLACED) && meta_data.interlaced) {
-    layer->input_buffer->flags.interlace = true;
-  }
-
-  if (meta_data.operation & LINEAR_FORMAT) {
-    layer->input_buffer->format = GetSDMFormat(meta_data.linearFormat, 0);
-  }
-
-  if (meta_data.operation & UPDATE_COLOR_SPACE) {
-    if (SetColorSpace(meta_data.colorSpace, &layer->color_space) != kErrorNone) {
+  if (meta_data->operation & UPDATE_COLOR_SPACE) {
+    if (SetColorSpace(meta_data->colorSpace, &layer->color_space) != kErrorNone) {
       return kErrorNotSupported;
     }
   }
 
+  if (meta_data->operation & UPDATE_REFRESH_RATE) {
+    layer->frame_rate = RoundToStandardFPS(meta_data->refreshrate);
+  }
+
+  if ((meta_data->operation & PP_PARAM_INTERLACED) && meta_data->interlaced) {
+    layer_buffer->flags.interlace = true;
+  }
+
+  if (meta_data->operation & LINEAR_FORMAT) {
+    layer_buffer->format = GetSDMFormat(meta_data->linearFormat, 0);
+  }
+
+  if (meta_data->operation & UPDATE_BUFFER_GEOMETRY) {
+    int actual_width = pvt_handle->width;
+    int actual_height = pvt_handle->height;
+    AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(pvt_handle, actual_width, actual_height);
+    layer_buffer->width = actual_width;
+    layer_buffer->height = actual_height;
+  }
+
   return kErrorNone;
 }
 
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index ce624a3..9154225 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -126,6 +126,7 @@
   virtual DisplayError Refresh();
 
   virtual int AllocateLayerStack(hwc_display_contents_1_t *content_list);
+  virtual int PrePrepareLayerStack(hwc_display_contents_1_t *content_list);
   virtual int PrepareLayerStack(hwc_display_contents_1_t *content_list);
   virtual int CommitLayerStack(hwc_display_contents_1_t *content_list);
   virtual int PostCommitLayerStack(hwc_display_contents_1_t *content_list);
@@ -144,7 +145,7 @@
   uint32_t RoundToStandardFPS(uint32_t fps);
   virtual void ApplyScanAdjustment(hwc_rect_t *display_frame);
   DisplayError SetColorSpace(const ColorSpace_t source, LayerColorSpace *target);
-  DisplayError SetMetaData(const MetaData_t &meta_data, Layer *layer);
+  DisplayError SetMetaData(const private_handle_t *pvt_handle, Layer *layer);
   bool NeedsFrameBufferRefresh(hwc_display_contents_1_t *content_list);
   void CacheLayerStackInfo(hwc_display_contents_1_t *content_list);
   bool IsLayerUpdating(const hwc_layer_1_t &hwc_layer, const LayerCache &layer_cache);
@@ -181,7 +182,6 @@
   uint32_t force_refresh_rate_ = 0;
   bool boot_animation_completed_ = false;
   bool shutdown_pending_ = false;
-  bool handle_refresh_ = true;
   bool use_blit_comp_ = false;
   bool secure_display_active_ = false;
   bool skip_prepare_ = false;
diff --git a/sdm/libs/hwc/hwc_display_external.cpp b/sdm/libs/hwc/hwc_display_external.cpp
index a02be81..99c903c 100644
--- a/sdm/libs/hwc/hwc_display_external.cpp
+++ b/sdm/libs/hwc/hwc_display_external.cpp
@@ -98,6 +98,11 @@
     return 0;
   }
 
+  status = PrePrepareLayerStack(content_list);
+  if (status) {
+    return status;
+  }
+
   status = PrepareLayerStack(content_list);
   if (status) {
     return status;
diff --git a/sdm/libs/hwc/hwc_display_primary.cpp b/sdm/libs/hwc/hwc_display_primary.cpp
index 9842b61..416e390 100644
--- a/sdm/libs/hwc/hwc_display_primary.cpp
+++ b/sdm/libs/hwc/hwc_display_primary.cpp
@@ -133,31 +133,28 @@
     return 0;
   }
 
-  status = PrepareLayerStack(content_list);
+  status = PrePrepareLayerStack(content_list);
   if (status) {
     return status;
   }
 
-  // Drop invalidate trigger to SurfaceFlinger
-  // if all layers in previous draw cycle were composed using GPU
-  // OR
-  // if all layers were composed using GPU sometime in past and the cached content
-  // is being used currently.
-  handle_refresh_ = false;
-  int app_layer_count = content_list->numHwLayers - 1;
-  if (app_layer_count > 1) {
-    int fb_layer_count = 0;
-    for (int i = 0; i < app_layer_count; i++) {
-      if (content_list->hwLayers[i].compositionType == HWC_FRAMEBUFFER) {
-        fb_layer_count++;
-      }
-    }
+  bool one_updating_layer = SingleLayerUpdating(content_list->numHwLayers - 1);
+  ToggleCPUHint(one_updating_layer);
 
-    if ((fb_layer_count == 0) && !layer_stack_cache_.in_use) {
-      handle_refresh_ = true;
-    } else if (fb_layer_count > 0 && fb_layer_count < app_layer_count) {
-      handle_refresh_ = true;
-    }
+  uint32_t refresh_rate = GetOptimalRefreshRate(one_updating_layer);
+  DisplayError error = display_intf_->SetRefreshRate(refresh_rate);
+  if (error == kErrorNone) {
+    // On success, set current refresh rate to new refresh rate
+    current_refresh_rate_ = refresh_rate;
+  }
+
+  if (handle_idle_timeout_) {
+    handle_idle_timeout_ = false;
+  }
+
+  status = PrepareLayerStack(content_list);
+  if (status) {
+    return status;
   }
 
   return 0;
@@ -192,24 +189,9 @@
     return status;
   }
 
-  bool one_updating_layer = SingleLayerUpdating(content_list->numHwLayers - 1);
-
-  SetMetadataRefreshRate(one_updating_layer);
-  ToggleCPUHint(one_updating_layer);
-
   return 0;
 }
 
-int HWCDisplayPrimary::SetRefreshRate(uint32_t refresh_rate) {
-  DisplayError error = kErrorNone;
-
-  if (display_intf_) {
-    error = display_intf_->SetRefreshRate(refresh_rate);
-  }
-
-  return (error ? -1 : 0);
-}
-
 int HWCDisplayPrimary::Perform(uint32_t operation, ...) {
   va_list args;
   va_start(args, operation);
@@ -287,52 +269,33 @@
   return;
 }
 
-void HWCDisplayPrimary::SetMetadataRefreshRate(bool one_updating_layer) {
-  // return if force_refresh_rate_ is set or metadata_refresh_rate is not enabled
-  if (force_refresh_rate_) {
-    return;
-  }
-
-  uint32_t refresh_rate = max_refresh_rate_;
-  if (use_metadata_refresh_rate_ && one_updating_layer && metadata_refresh_rate_) {
-    refresh_rate = metadata_refresh_rate_;
-  }
-
-  int status = SetRefreshRate(refresh_rate);
-  if (status == 0) {
-    // Set current refresh rate to metadata refresh rate
-    current_refresh_rate_ = refresh_rate;
-  } else {
-    // Failed - Restore to max refresh rate
-    current_refresh_rate_ = max_refresh_rate_;
-  }
-}
-
 void HWCDisplayPrimary::ForceRefreshRate(uint32_t refresh_rate) {
-  if (refresh_rate && (refresh_rate < min_refresh_rate_ || refresh_rate > max_refresh_rate_)) {
-    // Cannot honor force refresh rate, as its beyond the range
+  if ((refresh_rate && (refresh_rate < min_refresh_rate_ || refresh_rate > max_refresh_rate_)) ||
+       force_refresh_rate_ == refresh_rate) {
+    // Cannot honor force refresh rate, as its beyond the range or new request is same
     return;
   }
 
-  uint32_t rate = refresh_rate;
+  const hwc_procs_t *hwc_procs = *hwc_procs_;
   force_refresh_rate_ = refresh_rate;
-  if (refresh_rate == 0) {
-    // refresh rate request of 0 means the client is resetting the forced request rate
-    rate = max_refresh_rate_;
-  }
 
-  int status = SetRefreshRate(rate);
-  if (status) {
-    // failed Reset force_refresh_rate to 0, and restore max refresh rate
-    force_refresh_rate_ = 0;
-    rate = max_refresh_rate_;
-    DLOGE("Setting Refresh Rate = %d Failed", refresh_rate);
-  }
-  current_refresh_rate_ = rate;
+  hwc_procs->invalidate(hwc_procs);
 
   return;
 }
 
+uint32_t HWCDisplayPrimary::GetOptimalRefreshRate(bool one_updating_layer) {
+  if (force_refresh_rate_) {
+    return force_refresh_rate_;
+  } else if (handle_idle_timeout_) {
+    return min_refresh_rate_;
+  } else if (use_metadata_refresh_rate_ && one_updating_layer && metadata_refresh_rate_) {
+    return metadata_refresh_rate_;
+  }
+
+  return max_refresh_rate_;
+}
+
 DisplayError HWCDisplayPrimary::Refresh() {
   const hwc_procs_t *hwc_procs = *hwc_procs_;
   DisplayError error = kErrorNone;
@@ -341,25 +304,15 @@
     return kErrorParameters;
   }
 
-  if (!handle_refresh_) {
-    error = kErrorNotSupported;
-  }
-
-  if (error == kErrorNone) {
-    hwc_procs->invalidate(hwc_procs);
-  }
-
-  uint32_t refresh_rate = force_refresh_rate_ ? force_refresh_rate_ : min_refresh_rate_;
-
-  int status = SetRefreshRate(refresh_rate);
-  if (status) {
-    DLOGE("Setting Refresh Rate = %d Failed", refresh_rate);
-  } else {
-    current_refresh_rate_ = refresh_rate;
-  }
+  hwc_procs->invalidate(hwc_procs);
+  handle_idle_timeout_ = true;
 
   return error;
 }
 
+void HWCDisplayPrimary::SetIdleTimeoutMs(uint32_t timeout_ms) {
+  display_intf_->SetIdleTimeoutMs(timeout_ms);
+}
+
 }  // namespace sdm
 
diff --git a/sdm/libs/hwc/hwc_display_primary.h b/sdm/libs/hwc/hwc_display_primary.h
index 230d2d5..e30d200 100644
--- a/sdm/libs/hwc/hwc_display_primary.h
+++ b/sdm/libs/hwc/hwc_display_primary.h
@@ -46,10 +46,10 @@
   virtual int Init();
   virtual int Prepare(hwc_display_contents_1_t *content_list);
   virtual int Commit(hwc_display_contents_1_t *content_list);
-  virtual int SetRefreshRate(uint32_t refresh_rate);
   virtual int Perform(uint32_t operation, ...);
   virtual void SetSecureDisplay(bool secure_display_active);
   virtual DisplayError Refresh();
+  virtual void SetIdleTimeoutMs(uint32_t timeout_ms);
 
  private:
   HWCDisplayPrimary(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
@@ -58,10 +58,11 @@
   void ProcessBootAnimCompleted();
   void SetQDCMSolidFillInfo(bool enable, uint32_t color);
   void ToggleCPUHint(bool set);
-  void SetMetadataRefreshRate(bool one_updating_layer);
   void ForceRefreshRate(uint32_t refresh_rate);
+  uint32_t GetOptimalRefreshRate(bool one_updating_layer);
 
   CPUHint *cpu_hint_;
+  bool handle_idle_timeout_ = false;
 };
 
 }  // namespace sdm
diff --git a/sdm/libs/hwc/hwc_display_virtual.cpp b/sdm/libs/hwc/hwc_display_virtual.cpp
index 219a81b..f292656 100644
--- a/sdm/libs/hwc/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc/hwc_display_virtual.cpp
@@ -147,6 +147,11 @@
     return status;
   }
 
+  status = PrePrepareLayerStack(content_list);
+  if (status) {
+    return status;
+  }
+
   status = PrepareLayerStack(content_list);
   if (status) {
     return status;
diff --git a/sdm/libs/utils/debug.cpp b/sdm/libs/utils/debug.cpp
index 33f94b9..003be5a 100644
--- a/sdm/libs/utils/debug.cpp
+++ b/sdm/libs/utils/debug.cpp
@@ -133,5 +133,13 @@
   return (ubwc_framebuffer == 1);
 }
 
+bool Debug::GetProperty(const char* property_name, char* value) {
+  if (debug_.debug_handler_->GetProperty(property_name, value) != kErrorNone) {
+    return false;
+  }
+
+  return true;
+}
+
 }  // namespace sdm
 
