diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp
index f1eece9..ae23b53 100644
--- a/libqdutils/qdMetaData.cpp
+++ b/libqdutils/qdMetaData.cpp
@@ -35,6 +35,10 @@
 #include <gralloc_priv.h>
 #include "qdMetaData.h"
 
+unsigned long getMetaDataSize() {
+    return static_cast<unsigned long>(ROUND_UP_PAGESIZE(sizeof(MetaData_t)));
+}
+
 static int validateAndMap(private_handle_t* handle) {
     if (private_handle_t::validate(handle)) {
         ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
@@ -47,7 +51,7 @@
     }
 
     if (!handle->base_metadata) {
-        unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
+        auto size = getMetaDataSize();
         void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
                 handle->fd_metadata, 0);
         if (base == reinterpret_cast<void*>(MAP_FAILED)) {
@@ -62,12 +66,18 @@
 }
 
 int setMetaData(private_handle_t *handle, DispParamType paramType,
-                                                    void *param) {
+                void *param) {
     auto err = validateAndMap(handle);
     if (err != 0)
         return err;
+    return setMetaDataVa(reinterpret_cast<MetaData_t*>(handle->base_metadata),
+                         paramType, param);
+}
 
-    MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
+int setMetaDataVa(MetaData_t *data, DispParamType paramType,
+                  void *param) {
+    if (data == nullptr)
+        return -EINVAL;
     // If parameter is NULL reset the specific MetaData Key
     if (!param) {
        data->operation &= ~paramType;
@@ -126,8 +136,13 @@
     auto err = validateAndMap(handle);
     if (err != 0)
         return err;
+    return clearMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
+            paramType);
+}
 
-    MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
+int clearMetaDataVa(MetaData_t *data, DispParamType paramType) {
+    if (data == nullptr)
+        return -EINVAL;
     data->operation &= ~paramType;
     switch (paramType) {
         case SET_S3D_COMP:
@@ -146,9 +161,16 @@
     int ret = validateAndMap(handle);
     if (ret != 0)
         return ret;
-    MetaData_t *data = reinterpret_cast <MetaData_t *>(handle->base_metadata);
+    return getMetaDataVa(reinterpret_cast<MetaData_t *>(handle->base_metadata),
+                         paramType, param);
+}
+
+int getMetaDataVa(MetaData_t *data, DispFetchParamType paramType,
+                  void *param) {
     // Make sure we send 0 only if the operation queried is present
-    ret = -EINVAL;
+    int ret = -EINVAL;
+    if (data == nullptr)
+        return ret;
 
     switch (paramType) {
         case GET_PP_PARAM_INTERLACED:
@@ -241,9 +263,49 @@
     if (err != 0)
         return err;
 
-    unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
     MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
     MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
-    memcpy(src_data, dst_data, size);
+    memcpy(src_data, dst_data, getMetaDataSize());
     return 0;
 }
+
+int copyMetaDataVaToHandle(MetaData_t *src_data, struct private_handle_t *dst) {
+    int err = -EINVAL;
+    if (src_data == nullptr)
+        return err;
+
+    err = validateAndMap(dst);
+    if (err != 0)
+        return err;
+
+    MetaData_t *dst_data = reinterpret_cast <MetaData_t *>(dst->base_metadata);
+    memcpy(src_data, dst_data, getMetaDataSize());
+    return 0;
+}
+
+int copyMetaDataHandleToVa(struct private_handle_t *src, MetaData_t *dst_data) {
+    int err = -EINVAL;
+    if (dst_data == nullptr)
+        return err;
+
+    err = validateAndMap(src);
+    if (err != 0)
+        return err;
+
+    MetaData_t *src_data = reinterpret_cast <MetaData_t *>(src->base_metadata);
+    memcpy(src_data, dst_data, getMetaDataSize());
+    return 0;
+}
+
+int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) {
+    int err = -EINVAL;
+    if (src_data == nullptr)
+        return err;
+
+    if (dst_data == nullptr)
+        return err;
+
+    memcpy(src_data, dst_data, getMetaDataSize());
+    return 0;
+}
+
