diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.cpp b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.cpp
index 08c02cf..4339bc4 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.cpp
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.cpp
@@ -1220,4 +1220,101 @@
   }
 }
 
+
+DataManagerServiceException::~DataManagerServiceException() throw() {
+}
+
+
+void DataManagerServiceException::__set_message(const std::string& val) {
+  this->message = val;
+}
+
+uint32_t DataManagerServiceException::read(::apache::thrift::protocol::TProtocol* iprot) {
+
+  apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);
+  uint32_t xfer = 0;
+  std::string fname;
+  ::apache::thrift::protocol::TType ftype;
+  int16_t fid;
+
+  xfer += iprot->readStructBegin(fname);
+
+  using ::apache::thrift::protocol::TProtocolException;
+
+  bool isset_message = false;
+
+  while (true)
+  {
+    xfer += iprot->readFieldBegin(fname, ftype, fid);
+    if (ftype == ::apache::thrift::protocol::T_STOP) {
+      break;
+    }
+    switch (fid)
+    {
+      case 1:
+        if (ftype == ::apache::thrift::protocol::T_STRING) {
+          xfer += iprot->readString(this->message);
+          isset_message = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      default:
+        xfer += iprot->skip(ftype);
+        break;
+    }
+    xfer += iprot->readFieldEnd();
+  }
+
+  xfer += iprot->readStructEnd();
+
+  if (!isset_message)
+    throw TProtocolException(TProtocolException::INVALID_DATA);
+  return xfer;
+}
+
+uint32_t DataManagerServiceException::write(::apache::thrift::protocol::TProtocol* oprot) const {
+  uint32_t xfer = 0;
+  apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);
+  xfer += oprot->writeStructBegin("DataManagerServiceException");
+
+  xfer += oprot->writeFieldBegin("message", ::apache::thrift::protocol::T_STRING, 1);
+  xfer += oprot->writeString(this->message);
+  xfer += oprot->writeFieldEnd();
+
+  xfer += oprot->writeFieldStop();
+  xfer += oprot->writeStructEnd();
+  return xfer;
+}
+
+void swap(DataManagerServiceException &a, DataManagerServiceException &b) {
+  using ::std::swap;
+  swap(a.message, b.message);
+}
+
+DataManagerServiceException::DataManagerServiceException(const DataManagerServiceException& other30) : TException() {
+  message = other30.message;
+}
+DataManagerServiceException& DataManagerServiceException::operator=(const DataManagerServiceException& other31) {
+  message = other31.message;
+  return *this;
+}
+void DataManagerServiceException::printTo(std::ostream& out) const {
+  using ::apache::thrift::to_string;
+  out << "DataManagerServiceException(";
+  out << "message=" << to_string(message);
+  out << ")";
+}
+
+const char* DataManagerServiceException::what() const throw() {
+  try {
+    std::stringstream ss;
+    ss << "TException - service has thrown: " << *this;
+    this->thriftTExceptionMessageHolder_ = ss.str();
+    return this->thriftTExceptionMessageHolder_.c_str();
+  } catch (const std::exception&) {
+    return "TException - service has thrown: DataManagerServiceException";
+  }
+}
+
 }}}} // namespace
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.h b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.h
index e756d0a..c2fa605 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.h
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/airavata_errors_types.h
@@ -74,6 +74,8 @@
 
 class AiravataSystemException;
 
+class DataManagerServiceException;
+
 
 class ExperimentNotFoundException : public ::apache::thrift::TException {
  public:
@@ -584,6 +586,48 @@
   return out;
 }
 
+
+class DataManagerServiceException : public ::apache::thrift::TException {
+ public:
+
+  DataManagerServiceException(const DataManagerServiceException&);
+  DataManagerServiceException& operator=(const DataManagerServiceException&);
+  DataManagerServiceException() : message() {
+  }
+
+  virtual ~DataManagerServiceException() throw();
+  std::string message;
+
+  void __set_message(const std::string& val);
+
+  bool operator == (const DataManagerServiceException & rhs) const
+  {
+    if (!(message == rhs.message))
+      return false;
+    return true;
+  }
+  bool operator != (const DataManagerServiceException &rhs) const {
+    return !(*this == rhs);
+  }
+
+  bool operator < (const DataManagerServiceException & ) const;
+
+  uint32_t read(::apache::thrift::protocol::TProtocol* iprot);
+  uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const;
+
+  virtual void printTo(std::ostream& out) const;
+  mutable std::string thriftTExceptionMessageHolder_;
+  const char* what() const throw();
+};
+
+void swap(DataManagerServiceException &a, DataManagerServiceException &b);
+
+inline std::ostream& operator<<(std::ostream& out, const DataManagerServiceException& obj)
+{
+  obj.printTo(out);
+  return out;
+}
+
 }}}} // namespace
 
 #endif
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.cpp b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.cpp
index f7d964e..b111fa7 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.cpp
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.cpp
@@ -60,6 +60,11 @@
 __isset.username = true;
 }
 
+void MetadataModel::__set_size(const double val) {
+  this->size = val;
+__isset.size = true;
+}
+
 void MetadataModel::__set_sharedUsers(const std::vector<std::string> & val) {
   this->sharedUsers = val;
 __isset.sharedUsers = true;
@@ -95,6 +100,16 @@
 __isset.customInformation = true;
 }
 
+void MetadataModel::__set_creationTime(const int64_t val) {
+  this->creationTime = val;
+__isset.creationTime = true;
+}
+
+void MetadataModel::__set_lastModifiedTime(const int64_t val) {
+  this->lastModifiedTime = val;
+__isset.lastModifiedTime = true;
+}
+
 uint32_t MetadataModel::read(::apache::thrift::protocol::TProtocol* iprot) {
 
   apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);
@@ -141,6 +156,14 @@
         }
         break;
       case 4:
+        if (ftype == ::apache::thrift::protocol::T_DOUBLE) {
+          xfer += iprot->readDouble(this->size);
+          this->__isset.size = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 5:
         if (ftype == ::apache::thrift::protocol::T_LIST) {
           {
             this->sharedUsers.clear();
@@ -160,7 +183,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 5:
+      case 6:
         if (ftype == ::apache::thrift::protocol::T_BOOL) {
           xfer += iprot->readBool(this->sharedPublic);
           this->__isset.sharedPublic = true;
@@ -168,7 +191,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 6:
+      case 7:
         if (ftype == ::apache::thrift::protocol::T_STRING) {
           xfer += iprot->readString(this->userFriendlyName);
           this->__isset.userFriendlyName = true;
@@ -176,7 +199,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 7:
+      case 8:
         if (ftype == ::apache::thrift::protocol::T_STRING) {
           xfer += iprot->readString(this->userFriendlyDescription);
           this->__isset.userFriendlyDescription = true;
@@ -184,7 +207,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 8:
+      case 9:
         if (ftype == ::apache::thrift::protocol::T_I32) {
           int32_t ecast5;
           xfer += iprot->readI32(ecast5);
@@ -194,7 +217,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 9:
+      case 10:
         if (ftype == ::apache::thrift::protocol::T_STRING) {
           xfer += iprot->readString(this->associatedEntityId);
           this->__isset.associatedEntityId = true;
@@ -202,7 +225,7 @@
           xfer += iprot->skip(ftype);
         }
         break;
-      case 10:
+      case 11:
         if (ftype == ::apache::thrift::protocol::T_MAP) {
           {
             this->customInformation.clear();
@@ -225,6 +248,22 @@
           xfer += iprot->skip(ftype);
         }
         break;
+      case 12:
+        if (ftype == ::apache::thrift::protocol::T_I64) {
+          xfer += iprot->readI64(this->creationTime);
+          this->__isset.creationTime = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
+      case 13:
+        if (ftype == ::apache::thrift::protocol::T_I64) {
+          xfer += iprot->readI64(this->lastModifiedTime);
+          this->__isset.lastModifiedTime = true;
+        } else {
+          xfer += iprot->skip(ftype);
+        }
+        break;
       default:
         xfer += iprot->skip(ftype);
         break;
@@ -257,8 +296,13 @@
     xfer += oprot->writeString(this->username);
     xfer += oprot->writeFieldEnd();
   }
+  if (this->__isset.size) {
+    xfer += oprot->writeFieldBegin("size", ::apache::thrift::protocol::T_DOUBLE, 4);
+    xfer += oprot->writeDouble(this->size);
+    xfer += oprot->writeFieldEnd();
+  }
   if (this->__isset.sharedUsers) {
-    xfer += oprot->writeFieldBegin("sharedUsers", ::apache::thrift::protocol::T_LIST, 4);
+    xfer += oprot->writeFieldBegin("sharedUsers", ::apache::thrift::protocol::T_LIST, 5);
     {
       xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->sharedUsers.size()));
       std::vector<std::string> ::const_iterator _iter13;
@@ -271,32 +315,32 @@
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.sharedPublic) {
-    xfer += oprot->writeFieldBegin("sharedPublic", ::apache::thrift::protocol::T_BOOL, 5);
+    xfer += oprot->writeFieldBegin("sharedPublic", ::apache::thrift::protocol::T_BOOL, 6);
     xfer += oprot->writeBool(this->sharedPublic);
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.userFriendlyName) {
-    xfer += oprot->writeFieldBegin("userFriendlyName", ::apache::thrift::protocol::T_STRING, 6);
+    xfer += oprot->writeFieldBegin("userFriendlyName", ::apache::thrift::protocol::T_STRING, 7);
     xfer += oprot->writeString(this->userFriendlyName);
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.userFriendlyDescription) {
-    xfer += oprot->writeFieldBegin("userFriendlyDescription", ::apache::thrift::protocol::T_STRING, 7);
+    xfer += oprot->writeFieldBegin("userFriendlyDescription", ::apache::thrift::protocol::T_STRING, 8);
     xfer += oprot->writeString(this->userFriendlyDescription);
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.metadataType) {
-    xfer += oprot->writeFieldBegin("metadataType", ::apache::thrift::protocol::T_I32, 8);
+    xfer += oprot->writeFieldBegin("metadataType", ::apache::thrift::protocol::T_I32, 9);
     xfer += oprot->writeI32((int32_t)this->metadataType);
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.associatedEntityId) {
-    xfer += oprot->writeFieldBegin("associatedEntityId", ::apache::thrift::protocol::T_STRING, 9);
+    xfer += oprot->writeFieldBegin("associatedEntityId", ::apache::thrift::protocol::T_STRING, 10);
     xfer += oprot->writeString(this->associatedEntityId);
     xfer += oprot->writeFieldEnd();
   }
   if (this->__isset.customInformation) {
-    xfer += oprot->writeFieldBegin("customInformation", ::apache::thrift::protocol::T_MAP, 10);
+    xfer += oprot->writeFieldBegin("customInformation", ::apache::thrift::protocol::T_MAP, 11);
     {
       xfer += oprot->writeMapBegin(::apache::thrift::protocol::T_STRING, ::apache::thrift::protocol::T_STRING, static_cast<uint32_t>(this->customInformation.size()));
       std::map<std::string, std::string> ::const_iterator _iter14;
@@ -309,6 +353,16 @@
     }
     xfer += oprot->writeFieldEnd();
   }
+  if (this->__isset.creationTime) {
+    xfer += oprot->writeFieldBegin("creationTime", ::apache::thrift::protocol::T_I64, 12);
+    xfer += oprot->writeI64(this->creationTime);
+    xfer += oprot->writeFieldEnd();
+  }
+  if (this->__isset.lastModifiedTime) {
+    xfer += oprot->writeFieldBegin("lastModifiedTime", ::apache::thrift::protocol::T_I64, 13);
+    xfer += oprot->writeI64(this->lastModifiedTime);
+    xfer += oprot->writeFieldEnd();
+  }
   xfer += oprot->writeFieldStop();
   xfer += oprot->writeStructEnd();
   return xfer;
@@ -319,6 +373,7 @@
   swap(a.metadataId, b.metadataId);
   swap(a.gatewayId, b.gatewayId);
   swap(a.username, b.username);
+  swap(a.size, b.size);
   swap(a.sharedUsers, b.sharedUsers);
   swap(a.sharedPublic, b.sharedPublic);
   swap(a.userFriendlyName, b.userFriendlyName);
@@ -326,6 +381,8 @@
   swap(a.metadataType, b.metadataType);
   swap(a.associatedEntityId, b.associatedEntityId);
   swap(a.customInformation, b.customInformation);
+  swap(a.creationTime, b.creationTime);
+  swap(a.lastModifiedTime, b.lastModifiedTime);
   swap(a.__isset, b.__isset);
 }
 
@@ -333,6 +390,7 @@
   metadataId = other15.metadataId;
   gatewayId = other15.gatewayId;
   username = other15.username;
+  size = other15.size;
   sharedUsers = other15.sharedUsers;
   sharedPublic = other15.sharedPublic;
   userFriendlyName = other15.userFriendlyName;
@@ -340,12 +398,15 @@
   metadataType = other15.metadataType;
   associatedEntityId = other15.associatedEntityId;
   customInformation = other15.customInformation;
+  creationTime = other15.creationTime;
+  lastModifiedTime = other15.lastModifiedTime;
   __isset = other15.__isset;
 }
 MetadataModel& MetadataModel::operator=(const MetadataModel& other16) {
   metadataId = other16.metadataId;
   gatewayId = other16.gatewayId;
   username = other16.username;
+  size = other16.size;
   sharedUsers = other16.sharedUsers;
   sharedPublic = other16.sharedPublic;
   userFriendlyName = other16.userFriendlyName;
@@ -353,6 +414,8 @@
   metadataType = other16.metadataType;
   associatedEntityId = other16.associatedEntityId;
   customInformation = other16.customInformation;
+  creationTime = other16.creationTime;
+  lastModifiedTime = other16.lastModifiedTime;
   __isset = other16.__isset;
   return *this;
 }
@@ -362,6 +425,7 @@
   out << "metadataId="; (__isset.metadataId ? (out << to_string(metadataId)) : (out << "<null>"));
   out << ", " << "gatewayId="; (__isset.gatewayId ? (out << to_string(gatewayId)) : (out << "<null>"));
   out << ", " << "username="; (__isset.username ? (out << to_string(username)) : (out << "<null>"));
+  out << ", " << "size="; (__isset.size ? (out << to_string(size)) : (out << "<null>"));
   out << ", " << "sharedUsers="; (__isset.sharedUsers ? (out << to_string(sharedUsers)) : (out << "<null>"));
   out << ", " << "sharedPublic="; (__isset.sharedPublic ? (out << to_string(sharedPublic)) : (out << "<null>"));
   out << ", " << "userFriendlyName="; (__isset.userFriendlyName ? (out << to_string(userFriendlyName)) : (out << "<null>"));
@@ -369,6 +433,8 @@
   out << ", " << "metadataType="; (__isset.metadataType ? (out << to_string(metadataType)) : (out << "<null>"));
   out << ", " << "associatedEntityId="; (__isset.associatedEntityId ? (out << to_string(associatedEntityId)) : (out << "<null>"));
   out << ", " << "customInformation="; (__isset.customInformation ? (out << to_string(customInformation)) : (out << "<null>"));
+  out << ", " << "creationTime="; (__isset.creationTime ? (out << to_string(creationTime)) : (out << "<null>"));
+  out << ", " << "lastModifiedTime="; (__isset.lastModifiedTime ? (out << to_string(lastModifiedTime)) : (out << "<null>"));
   out << ")";
 }
 
diff --git a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.h b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.h
index 2be82d9..71866e7 100644
--- a/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.h
+++ b/airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/metadata_models_types.h
@@ -48,10 +48,11 @@
 class MetadataModel;
 
 typedef struct _MetadataModel__isset {
-  _MetadataModel__isset() : metadataId(false), gatewayId(false), username(false), sharedUsers(false), sharedPublic(false), userFriendlyName(false), userFriendlyDescription(false), metadataType(false), associatedEntityId(false), customInformation(false) {}
+  _MetadataModel__isset() : metadataId(false), gatewayId(false), username(false), size(false), sharedUsers(false), sharedPublic(false), userFriendlyName(false), userFriendlyDescription(false), metadataType(false), associatedEntityId(false), customInformation(false), creationTime(false), lastModifiedTime(false) {}
   bool metadataId :1;
   bool gatewayId :1;
   bool username :1;
+  bool size :1;
   bool sharedUsers :1;
   bool sharedPublic :1;
   bool userFriendlyName :1;
@@ -59,6 +60,8 @@
   bool metadataType :1;
   bool associatedEntityId :1;
   bool customInformation :1;
+  bool creationTime :1;
+  bool lastModifiedTime :1;
 } _MetadataModel__isset;
 
 class MetadataModel {
@@ -66,13 +69,14 @@
 
   MetadataModel(const MetadataModel&);
   MetadataModel& operator=(const MetadataModel&);
-  MetadataModel() : metadataId(), gatewayId(), username(), sharedPublic(0), userFriendlyName(), userFriendlyDescription(), metadataType((MetadataType::type)0), associatedEntityId() {
+  MetadataModel() : metadataId(), gatewayId(), username(), size(0), sharedPublic(0), userFriendlyName(), userFriendlyDescription(), metadataType((MetadataType::type)0), associatedEntityId(), creationTime(0), lastModifiedTime(0) {
   }
 
   virtual ~MetadataModel() throw();
   std::string metadataId;
   std::string gatewayId;
   std::string username;
+  double size;
   std::vector<std::string>  sharedUsers;
   bool sharedPublic;
   std::string userFriendlyName;
@@ -80,6 +84,8 @@
   MetadataType::type metadataType;
   std::string associatedEntityId;
   std::map<std::string, std::string>  customInformation;
+  int64_t creationTime;
+  int64_t lastModifiedTime;
 
   _MetadataModel__isset __isset;
 
@@ -89,6 +95,8 @@
 
   void __set_username(const std::string& val);
 
+  void __set_size(const double val);
+
   void __set_sharedUsers(const std::vector<std::string> & val);
 
   void __set_sharedPublic(const bool val);
@@ -103,6 +111,10 @@
 
   void __set_customInformation(const std::map<std::string, std::string> & val);
 
+  void __set_creationTime(const int64_t val);
+
+  void __set_lastModifiedTime(const int64_t val);
+
   bool operator == (const MetadataModel & rhs) const
   {
     if (__isset.metadataId != rhs.__isset.metadataId)
@@ -117,6 +129,10 @@
       return false;
     else if (__isset.username && !(username == rhs.username))
       return false;
+    if (__isset.size != rhs.__isset.size)
+      return false;
+    else if (__isset.size && !(size == rhs.size))
+      return false;
     if (__isset.sharedUsers != rhs.__isset.sharedUsers)
       return false;
     else if (__isset.sharedUsers && !(sharedUsers == rhs.sharedUsers))
@@ -145,6 +161,14 @@
       return false;
     else if (__isset.customInformation && !(customInformation == rhs.customInformation))
       return false;
+    if (__isset.creationTime != rhs.__isset.creationTime)
+      return false;
+    else if (__isset.creationTime && !(creationTime == rhs.creationTime))
+      return false;
+    if (__isset.lastModifiedTime != rhs.__isset.lastModifiedTime)
+      return false;
+    else if (__isset.lastModifiedTime && !(lastModifiedTime == rhs.lastModifiedTime))
+      return false;
     return true;
   }
   bool operator != (const MetadataModel &rhs) const {
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Error/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Error/Types.php
index edaa6de..15ed5fa 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Error/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/API/Error/Types.php
@@ -1061,4 +1061,79 @@
 
 }
 
+class DataManagerServiceException extends TException {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $message = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'message',
+          'type' => TType::STRING,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['message'])) {
+        $this->message = $vals['message'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'DataManagerServiceException';
+  }
+
+  public function read($input)
+  {
+    $xfer = 0;
+    $fname = null;
+    $ftype = 0;
+    $fid = 0;
+    $xfer += $input->readStructBegin($fname);
+    while (true)
+    {
+      $xfer += $input->readFieldBegin($fname, $ftype, $fid);
+      if ($ftype == TType::STOP) {
+        break;
+      }
+      switch ($fid)
+      {
+        case 1:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->message);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        default:
+          $xfer += $input->skip($ftype);
+          break;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('DataManagerServiceException');
+    if ($this->message !== null) {
+      $xfer += $output->writeFieldBegin('message', TType::STRING, 1);
+      $xfer += $output->writeString($this->message);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 
diff --git a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Data/metadata/Types.php b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Data/metadata/Types.php
index bb99359..ccc9ede 100644
--- a/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Data/metadata/Types.php
+++ b/airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib/Airavata/Model/Data/metadata/Types.php
@@ -1,5 +1,5 @@
 <?php
-namespace Airavata\Model\data\metadata;
+namespace Airavata\Model\Data\Metadata;
 
 /**
  * Autogenerated by Thrift Compiler (0.9.3)
@@ -42,6 +42,10 @@
    */
   public $username = null;
   /**
+   * @var double
+   */
+  public $size = null;
+  /**
    * @var string[]
    */
   public $sharedUsers = null;
@@ -69,6 +73,14 @@
    * @var array
    */
   public $customInformation = null;
+  /**
+   * @var int
+   */
+  public $creationTime = null;
+  /**
+   * @var int
+   */
+  public $lastModifiedTime = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -86,6 +98,10 @@
           'type' => TType::STRING,
           ),
         4 => array(
+          'var' => 'size',
+          'type' => TType::DOUBLE,
+          ),
+        5 => array(
           'var' => 'sharedUsers',
           'type' => TType::LST,
           'etype' => TType::STRING,
@@ -93,27 +109,27 @@
             'type' => TType::STRING,
             ),
           ),
-        5 => array(
+        6 => array(
           'var' => 'sharedPublic',
           'type' => TType::BOOL,
           ),
-        6 => array(
+        7 => array(
           'var' => 'userFriendlyName',
           'type' => TType::STRING,
           ),
-        7 => array(
+        8 => array(
           'var' => 'userFriendlyDescription',
           'type' => TType::STRING,
           ),
-        8 => array(
+        9 => array(
           'var' => 'metadataType',
           'type' => TType::I32,
           ),
-        9 => array(
+        10 => array(
           'var' => 'associatedEntityId',
           'type' => TType::STRING,
           ),
-        10 => array(
+        11 => array(
           'var' => 'customInformation',
           'type' => TType::MAP,
           'ktype' => TType::STRING,
@@ -125,6 +141,14 @@
             'type' => TType::STRING,
             ),
           ),
+        12 => array(
+          'var' => 'creationTime',
+          'type' => TType::I64,
+          ),
+        13 => array(
+          'var' => 'lastModifiedTime',
+          'type' => TType::I64,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -137,6 +161,9 @@
       if (isset($vals['username'])) {
         $this->username = $vals['username'];
       }
+      if (isset($vals['size'])) {
+        $this->size = $vals['size'];
+      }
       if (isset($vals['sharedUsers'])) {
         $this->sharedUsers = $vals['sharedUsers'];
       }
@@ -158,6 +185,12 @@
       if (isset($vals['customInformation'])) {
         $this->customInformation = $vals['customInformation'];
       }
+      if (isset($vals['creationTime'])) {
+        $this->creationTime = $vals['creationTime'];
+      }
+      if (isset($vals['lastModifiedTime'])) {
+        $this->lastModifiedTime = $vals['lastModifiedTime'];
+      }
     }
   }
 
@@ -202,6 +235,13 @@
           }
           break;
         case 4:
+          if ($ftype == TType::DOUBLE) {
+            $xfer += $input->readDouble($this->size);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
           if ($ftype == TType::LST) {
             $this->sharedUsers = array();
             $_size0 = 0;
@@ -218,42 +258,42 @@
             $xfer += $input->skip($ftype);
           }
           break;
-        case 5:
+        case 6:
           if ($ftype == TType::BOOL) {
             $xfer += $input->readBool($this->sharedPublic);
           } else {
             $xfer += $input->skip($ftype);
           }
           break;
-        case 6:
+        case 7:
           if ($ftype == TType::STRING) {
             $xfer += $input->readString($this->userFriendlyName);
           } else {
             $xfer += $input->skip($ftype);
           }
           break;
-        case 7:
+        case 8:
           if ($ftype == TType::STRING) {
             $xfer += $input->readString($this->userFriendlyDescription);
           } else {
             $xfer += $input->skip($ftype);
           }
           break;
-        case 8:
+        case 9:
           if ($ftype == TType::I32) {
             $xfer += $input->readI32($this->metadataType);
           } else {
             $xfer += $input->skip($ftype);
           }
           break;
-        case 9:
+        case 10:
           if ($ftype == TType::STRING) {
             $xfer += $input->readString($this->associatedEntityId);
           } else {
             $xfer += $input->skip($ftype);
           }
           break;
-        case 10:
+        case 11:
           if ($ftype == TType::MAP) {
             $this->customInformation = array();
             $_size6 = 0;
@@ -273,6 +313,20 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 12:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->creationTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 13:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->lastModifiedTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -301,11 +355,16 @@
       $xfer += $output->writeString($this->username);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->size !== null) {
+      $xfer += $output->writeFieldBegin('size', TType::DOUBLE, 4);
+      $xfer += $output->writeDouble($this->size);
+      $xfer += $output->writeFieldEnd();
+    }
     if ($this->sharedUsers !== null) {
       if (!is_array($this->sharedUsers)) {
         throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
       }
-      $xfer += $output->writeFieldBegin('sharedUsers', TType::LST, 4);
+      $xfer += $output->writeFieldBegin('sharedUsers', TType::LST, 5);
       {
         $output->writeListBegin(TType::STRING, count($this->sharedUsers));
         {
@@ -319,27 +378,27 @@
       $xfer += $output->writeFieldEnd();
     }
     if ($this->sharedPublic !== null) {
-      $xfer += $output->writeFieldBegin('sharedPublic', TType::BOOL, 5);
+      $xfer += $output->writeFieldBegin('sharedPublic', TType::BOOL, 6);
       $xfer += $output->writeBool($this->sharedPublic);
       $xfer += $output->writeFieldEnd();
     }
     if ($this->userFriendlyName !== null) {
-      $xfer += $output->writeFieldBegin('userFriendlyName', TType::STRING, 6);
+      $xfer += $output->writeFieldBegin('userFriendlyName', TType::STRING, 7);
       $xfer += $output->writeString($this->userFriendlyName);
       $xfer += $output->writeFieldEnd();
     }
     if ($this->userFriendlyDescription !== null) {
-      $xfer += $output->writeFieldBegin('userFriendlyDescription', TType::STRING, 7);
+      $xfer += $output->writeFieldBegin('userFriendlyDescription', TType::STRING, 8);
       $xfer += $output->writeString($this->userFriendlyDescription);
       $xfer += $output->writeFieldEnd();
     }
     if ($this->metadataType !== null) {
-      $xfer += $output->writeFieldBegin('metadataType', TType::I32, 8);
+      $xfer += $output->writeFieldBegin('metadataType', TType::I32, 9);
       $xfer += $output->writeI32($this->metadataType);
       $xfer += $output->writeFieldEnd();
     }
     if ($this->associatedEntityId !== null) {
-      $xfer += $output->writeFieldBegin('associatedEntityId', TType::STRING, 9);
+      $xfer += $output->writeFieldBegin('associatedEntityId', TType::STRING, 10);
       $xfer += $output->writeString($this->associatedEntityId);
       $xfer += $output->writeFieldEnd();
     }
@@ -347,7 +406,7 @@
       if (!is_array($this->customInformation)) {
         throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
       }
-      $xfer += $output->writeFieldBegin('customInformation', TType::MAP, 10);
+      $xfer += $output->writeFieldBegin('customInformation', TType::MAP, 11);
       {
         $output->writeMapBegin(TType::STRING, TType::STRING, count($this->customInformation));
         {
@@ -361,6 +420,16 @@
       }
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->creationTime !== null) {
+      $xfer += $output->writeFieldBegin('creationTime', TType::I64, 12);
+      $xfer += $output->writeI64($this->creationTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->lastModifiedTime !== null) {
+      $xfer += $output->writeFieldBegin('lastModifiedTime', TType::I64, 13);
+      $xfer += $output->writeI64($this->lastModifiedTime);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/api/error/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/api/error/ttypes.py
index 522cc18..dc2ca9d 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/api/error/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/api/error/ttypes.py
@@ -938,3 +938,73 @@
 
   def __ne__(self, other):
     return not (self == other)
+
+class DataManagerServiceException(TException):
+  """
+  Attributes:
+   - message
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'message', None, None, ), # 1
+  )
+
+  def __init__(self, message=None,):
+    self.message = message
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.message = iprot.readString()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('DataManagerServiceException')
+    if self.message is not None:
+      oprot.writeFieldBegin('message', TType.STRING, 1)
+      oprot.writeString(self.message)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    if self.message is None:
+      raise TProtocol.TProtocolException(message='Required field message is unset!')
+    return
+
+
+  def __str__(self):
+    return repr(self)
+
+  def __hash__(self):
+    value = 17
+    value = (value * 31) ^ hash(self.message)
+    return value
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
diff --git a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/data/metadata/ttypes.py b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/data/metadata/ttypes.py
index b50ac94..863a2aa 100644
--- a/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/data/metadata/ttypes.py
+++ b/airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/apache/airavata/model/data/metadata/ttypes.py
@@ -37,6 +37,7 @@
    - metadataId
    - gatewayId
    - username
+   - size
    - sharedUsers
    - sharedPublic
    - userFriendlyName
@@ -44,6 +45,8 @@
    - metadataType
    - associatedEntityId
    - customInformation
+   - creationTime
+   - lastModifiedTime
   """
 
   thrift_spec = (
@@ -51,19 +54,23 @@
     (1, TType.STRING, 'metadataId', None, None, ), # 1
     (2, TType.STRING, 'gatewayId', None, None, ), # 2
     (3, TType.STRING, 'username', None, None, ), # 3
-    (4, TType.LIST, 'sharedUsers', (TType.STRING,None), None, ), # 4
-    (5, TType.BOOL, 'sharedPublic', None, None, ), # 5
-    (6, TType.STRING, 'userFriendlyName', None, None, ), # 6
-    (7, TType.STRING, 'userFriendlyDescription', None, None, ), # 7
-    (8, TType.I32, 'metadataType', None, None, ), # 8
-    (9, TType.STRING, 'associatedEntityId', None, None, ), # 9
-    (10, TType.MAP, 'customInformation', (TType.STRING,None,TType.STRING,None), None, ), # 10
+    (4, TType.DOUBLE, 'size', None, None, ), # 4
+    (5, TType.LIST, 'sharedUsers', (TType.STRING,None), None, ), # 5
+    (6, TType.BOOL, 'sharedPublic', None, None, ), # 6
+    (7, TType.STRING, 'userFriendlyName', None, None, ), # 7
+    (8, TType.STRING, 'userFriendlyDescription', None, None, ), # 8
+    (9, TType.I32, 'metadataType', None, None, ), # 9
+    (10, TType.STRING, 'associatedEntityId', None, None, ), # 10
+    (11, TType.MAP, 'customInformation', (TType.STRING,None,TType.STRING,None), None, ), # 11
+    (12, TType.I64, 'creationTime', None, None, ), # 12
+    (13, TType.I64, 'lastModifiedTime', None, None, ), # 13
   )
 
-  def __init__(self, metadataId=None, gatewayId=None, username=None, sharedUsers=None, sharedPublic=None, userFriendlyName=None, userFriendlyDescription=None, metadataType=None, associatedEntityId=None, customInformation=None,):
+  def __init__(self, metadataId=None, gatewayId=None, username=None, size=None, sharedUsers=None, sharedPublic=None, userFriendlyName=None, userFriendlyDescription=None, metadataType=None, associatedEntityId=None, customInformation=None, creationTime=None, lastModifiedTime=None,):
     self.metadataId = metadataId
     self.gatewayId = gatewayId
     self.username = username
+    self.size = size
     self.sharedUsers = sharedUsers
     self.sharedPublic = sharedPublic
     self.userFriendlyName = userFriendlyName
@@ -71,6 +78,8 @@
     self.metadataType = metadataType
     self.associatedEntityId = associatedEntityId
     self.customInformation = customInformation
+    self.creationTime = creationTime
+    self.lastModifiedTime = lastModifiedTime
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -97,6 +106,11 @@
         else:
           iprot.skip(ftype)
       elif fid == 4:
+        if ftype == TType.DOUBLE:
+          self.size = iprot.readDouble()
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
         if ftype == TType.LIST:
           self.sharedUsers = []
           (_etype3, _size0) = iprot.readListBegin()
@@ -106,32 +120,32 @@
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
-      elif fid == 5:
+      elif fid == 6:
         if ftype == TType.BOOL:
           self.sharedPublic = iprot.readBool()
         else:
           iprot.skip(ftype)
-      elif fid == 6:
+      elif fid == 7:
         if ftype == TType.STRING:
           self.userFriendlyName = iprot.readString()
         else:
           iprot.skip(ftype)
-      elif fid == 7:
+      elif fid == 8:
         if ftype == TType.STRING:
           self.userFriendlyDescription = iprot.readString()
         else:
           iprot.skip(ftype)
-      elif fid == 8:
+      elif fid == 9:
         if ftype == TType.I32:
           self.metadataType = iprot.readI32()
         else:
           iprot.skip(ftype)
-      elif fid == 9:
+      elif fid == 10:
         if ftype == TType.STRING:
           self.associatedEntityId = iprot.readString()
         else:
           iprot.skip(ftype)
-      elif fid == 10:
+      elif fid == 11:
         if ftype == TType.MAP:
           self.customInformation = {}
           (_ktype7, _vtype8, _size6 ) = iprot.readMapBegin()
@@ -142,6 +156,16 @@
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
+      elif fid == 12:
+        if ftype == TType.I64:
+          self.creationTime = iprot.readI64()
+        else:
+          iprot.skip(ftype)
+      elif fid == 13:
+        if ftype == TType.I64:
+          self.lastModifiedTime = iprot.readI64()
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -164,41 +188,53 @@
       oprot.writeFieldBegin('username', TType.STRING, 3)
       oprot.writeString(self.username)
       oprot.writeFieldEnd()
+    if self.size is not None:
+      oprot.writeFieldBegin('size', TType.DOUBLE, 4)
+      oprot.writeDouble(self.size)
+      oprot.writeFieldEnd()
     if self.sharedUsers is not None:
-      oprot.writeFieldBegin('sharedUsers', TType.LIST, 4)
+      oprot.writeFieldBegin('sharedUsers', TType.LIST, 5)
       oprot.writeListBegin(TType.STRING, len(self.sharedUsers))
       for iter13 in self.sharedUsers:
         oprot.writeString(iter13)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.sharedPublic is not None:
-      oprot.writeFieldBegin('sharedPublic', TType.BOOL, 5)
+      oprot.writeFieldBegin('sharedPublic', TType.BOOL, 6)
       oprot.writeBool(self.sharedPublic)
       oprot.writeFieldEnd()
     if self.userFriendlyName is not None:
-      oprot.writeFieldBegin('userFriendlyName', TType.STRING, 6)
+      oprot.writeFieldBegin('userFriendlyName', TType.STRING, 7)
       oprot.writeString(self.userFriendlyName)
       oprot.writeFieldEnd()
     if self.userFriendlyDescription is not None:
-      oprot.writeFieldBegin('userFriendlyDescription', TType.STRING, 7)
+      oprot.writeFieldBegin('userFriendlyDescription', TType.STRING, 8)
       oprot.writeString(self.userFriendlyDescription)
       oprot.writeFieldEnd()
     if self.metadataType is not None:
-      oprot.writeFieldBegin('metadataType', TType.I32, 8)
+      oprot.writeFieldBegin('metadataType', TType.I32, 9)
       oprot.writeI32(self.metadataType)
       oprot.writeFieldEnd()
     if self.associatedEntityId is not None:
-      oprot.writeFieldBegin('associatedEntityId', TType.STRING, 9)
+      oprot.writeFieldBegin('associatedEntityId', TType.STRING, 10)
       oprot.writeString(self.associatedEntityId)
       oprot.writeFieldEnd()
     if self.customInformation is not None:
-      oprot.writeFieldBegin('customInformation', TType.MAP, 10)
+      oprot.writeFieldBegin('customInformation', TType.MAP, 11)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.customInformation))
       for kiter14,viter15 in self.customInformation.items():
         oprot.writeString(kiter14)
         oprot.writeString(viter15)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
+    if self.creationTime is not None:
+      oprot.writeFieldBegin('creationTime', TType.I64, 12)
+      oprot.writeI64(self.creationTime)
+      oprot.writeFieldEnd()
+    if self.lastModifiedTime is not None:
+      oprot.writeFieldBegin('lastModifiedTime', TType.I64, 13)
+      oprot.writeI64(self.lastModifiedTime)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -211,6 +247,7 @@
     value = (value * 31) ^ hash(self.metadataId)
     value = (value * 31) ^ hash(self.gatewayId)
     value = (value * 31) ^ hash(self.username)
+    value = (value * 31) ^ hash(self.size)
     value = (value * 31) ^ hash(self.sharedUsers)
     value = (value * 31) ^ hash(self.sharedPublic)
     value = (value * 31) ^ hash(self.userFriendlyName)
@@ -218,6 +255,8 @@
     value = (value * 31) ^ hash(self.metadataType)
     value = (value * 31) ^ hash(self.associatedEntityId)
     value = (value * 31) ^ hash(self.customInformation)
+    value = (value * 31) ^ hash(self.creationTime)
+    value = (value * 31) ^ hash(self.lastModifiedTime)
     return value
 
   def __repr__(self):
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/data/metadata/MetadataModel.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/data/metadata/MetadataModel.java
index d6688e8..d1e3c01 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/data/metadata/MetadataModel.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/data/metadata/MetadataModel.java
@@ -58,13 +58,16 @@
   private static final org.apache.thrift.protocol.TField METADATA_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("metadataId", org.apache.thrift.protocol.TType.STRING, (short)1);
   private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)2);
   private static final org.apache.thrift.protocol.TField USERNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("username", org.apache.thrift.protocol.TType.STRING, (short)3);
-  private static final org.apache.thrift.protocol.TField SHARED_USERS_FIELD_DESC = new org.apache.thrift.protocol.TField("sharedUsers", org.apache.thrift.protocol.TType.LIST, (short)4);
-  private static final org.apache.thrift.protocol.TField SHARED_PUBLIC_FIELD_DESC = new org.apache.thrift.protocol.TField("sharedPublic", org.apache.thrift.protocol.TType.BOOL, (short)5);
-  private static final org.apache.thrift.protocol.TField USER_FRIENDLY_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userFriendlyName", org.apache.thrift.protocol.TType.STRING, (short)6);
-  private static final org.apache.thrift.protocol.TField USER_FRIENDLY_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("userFriendlyDescription", org.apache.thrift.protocol.TType.STRING, (short)7);
-  private static final org.apache.thrift.protocol.TField METADATA_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("metadataType", org.apache.thrift.protocol.TType.I32, (short)8);
-  private static final org.apache.thrift.protocol.TField ASSOCIATED_ENTITY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("associatedEntityId", org.apache.thrift.protocol.TType.STRING, (short)9);
-  private static final org.apache.thrift.protocol.TField CUSTOM_INFORMATION_FIELD_DESC = new org.apache.thrift.protocol.TField("customInformation", org.apache.thrift.protocol.TType.MAP, (short)10);
+  private static final org.apache.thrift.protocol.TField SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("size", org.apache.thrift.protocol.TType.DOUBLE, (short)4);
+  private static final org.apache.thrift.protocol.TField SHARED_USERS_FIELD_DESC = new org.apache.thrift.protocol.TField("sharedUsers", org.apache.thrift.protocol.TType.LIST, (short)5);
+  private static final org.apache.thrift.protocol.TField SHARED_PUBLIC_FIELD_DESC = new org.apache.thrift.protocol.TField("sharedPublic", org.apache.thrift.protocol.TType.BOOL, (short)6);
+  private static final org.apache.thrift.protocol.TField USER_FRIENDLY_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userFriendlyName", org.apache.thrift.protocol.TType.STRING, (short)7);
+  private static final org.apache.thrift.protocol.TField USER_FRIENDLY_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("userFriendlyDescription", org.apache.thrift.protocol.TType.STRING, (short)8);
+  private static final org.apache.thrift.protocol.TField METADATA_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("metadataType", org.apache.thrift.protocol.TType.I32, (short)9);
+  private static final org.apache.thrift.protocol.TField ASSOCIATED_ENTITY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("associatedEntityId", org.apache.thrift.protocol.TType.STRING, (short)10);
+  private static final org.apache.thrift.protocol.TField CUSTOM_INFORMATION_FIELD_DESC = new org.apache.thrift.protocol.TField("customInformation", org.apache.thrift.protocol.TType.MAP, (short)11);
+  private static final org.apache.thrift.protocol.TField CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("creationTime", org.apache.thrift.protocol.TType.I64, (short)12);
+  private static final org.apache.thrift.protocol.TField LAST_MODIFIED_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("lastModifiedTime", org.apache.thrift.protocol.TType.I64, (short)13);
 
   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
   static {
@@ -75,6 +78,7 @@
   private String metadataId; // optional
   private String gatewayId; // optional
   private String username; // optional
+  private double size; // optional
   private List<String> sharedUsers; // optional
   private boolean sharedPublic; // optional
   private String userFriendlyName; // optional
@@ -82,23 +86,28 @@
   private MetadataType metadataType; // optional
   private String associatedEntityId; // optional
   private Map<String,String> customInformation; // optional
+  private long creationTime; // optional
+  private long lastModifiedTime; // optional
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     METADATA_ID((short)1, "metadataId"),
     GATEWAY_ID((short)2, "gatewayId"),
     USERNAME((short)3, "username"),
-    SHARED_USERS((short)4, "sharedUsers"),
-    SHARED_PUBLIC((short)5, "sharedPublic"),
-    USER_FRIENDLY_NAME((short)6, "userFriendlyName"),
-    USER_FRIENDLY_DESCRIPTION((short)7, "userFriendlyDescription"),
+    SIZE((short)4, "size"),
+    SHARED_USERS((short)5, "sharedUsers"),
+    SHARED_PUBLIC((short)6, "sharedPublic"),
+    USER_FRIENDLY_NAME((short)7, "userFriendlyName"),
+    USER_FRIENDLY_DESCRIPTION((short)8, "userFriendlyDescription"),
     /**
      * 
      * @see MetadataType
      */
-    METADATA_TYPE((short)8, "metadataType"),
-    ASSOCIATED_ENTITY_ID((short)9, "associatedEntityId"),
-    CUSTOM_INFORMATION((short)10, "customInformation");
+    METADATA_TYPE((short)9, "metadataType"),
+    ASSOCIATED_ENTITY_ID((short)10, "associatedEntityId"),
+    CUSTOM_INFORMATION((short)11, "customInformation"),
+    CREATION_TIME((short)12, "creationTime"),
+    LAST_MODIFIED_TIME((short)13, "lastModifiedTime");
 
     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
 
@@ -119,20 +128,26 @@
           return GATEWAY_ID;
         case 3: // USERNAME
           return USERNAME;
-        case 4: // SHARED_USERS
+        case 4: // SIZE
+          return SIZE;
+        case 5: // SHARED_USERS
           return SHARED_USERS;
-        case 5: // SHARED_PUBLIC
+        case 6: // SHARED_PUBLIC
           return SHARED_PUBLIC;
-        case 6: // USER_FRIENDLY_NAME
+        case 7: // USER_FRIENDLY_NAME
           return USER_FRIENDLY_NAME;
-        case 7: // USER_FRIENDLY_DESCRIPTION
+        case 8: // USER_FRIENDLY_DESCRIPTION
           return USER_FRIENDLY_DESCRIPTION;
-        case 8: // METADATA_TYPE
+        case 9: // METADATA_TYPE
           return METADATA_TYPE;
-        case 9: // ASSOCIATED_ENTITY_ID
+        case 10: // ASSOCIATED_ENTITY_ID
           return ASSOCIATED_ENTITY_ID;
-        case 10: // CUSTOM_INFORMATION
+        case 11: // CUSTOM_INFORMATION
           return CUSTOM_INFORMATION;
+        case 12: // CREATION_TIME
+          return CREATION_TIME;
+        case 13: // LAST_MODIFIED_TIME
+          return LAST_MODIFIED_TIME;
         default:
           return null;
       }
@@ -173,9 +188,12 @@
   }
 
   // isset id assignments
-  private static final int __SHAREDPUBLIC_ISSET_ID = 0;
+  private static final int __SIZE_ISSET_ID = 0;
+  private static final int __SHAREDPUBLIC_ISSET_ID = 1;
+  private static final int __CREATIONTIME_ISSET_ID = 2;
+  private static final int __LASTMODIFIEDTIME_ISSET_ID = 3;
   private byte __isset_bitfield = 0;
-  private static final _Fields optionals[] = {_Fields.METADATA_ID,_Fields.GATEWAY_ID,_Fields.USERNAME,_Fields.SHARED_USERS,_Fields.SHARED_PUBLIC,_Fields.USER_FRIENDLY_NAME,_Fields.USER_FRIENDLY_DESCRIPTION,_Fields.METADATA_TYPE,_Fields.ASSOCIATED_ENTITY_ID,_Fields.CUSTOM_INFORMATION};
+  private static final _Fields optionals[] = {_Fields.METADATA_ID,_Fields.GATEWAY_ID,_Fields.USERNAME,_Fields.SIZE,_Fields.SHARED_USERS,_Fields.SHARED_PUBLIC,_Fields.USER_FRIENDLY_NAME,_Fields.USER_FRIENDLY_DESCRIPTION,_Fields.METADATA_TYPE,_Fields.ASSOCIATED_ENTITY_ID,_Fields.CUSTOM_INFORMATION,_Fields.CREATION_TIME,_Fields.LAST_MODIFIED_TIME};
   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
   static {
     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
@@ -185,6 +203,8 @@
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.USERNAME, new org.apache.thrift.meta_data.FieldMetaData("username", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.SIZE, new org.apache.thrift.meta_data.FieldMetaData("size", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
     tmpMap.put(_Fields.SHARED_USERS, new org.apache.thrift.meta_data.FieldMetaData("sharedUsers", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
         new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
             new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
@@ -202,6 +222,10 @@
         new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
             new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), 
             new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
+    tmpMap.put(_Fields.CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("creationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
+    tmpMap.put(_Fields.LAST_MODIFIED_TIME, new org.apache.thrift.meta_data.FieldMetaData("lastModifiedTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
     metaDataMap = Collections.unmodifiableMap(tmpMap);
     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(MetadataModel.class, metaDataMap);
   }
@@ -223,6 +247,7 @@
     if (other.isSetUsername()) {
       this.username = other.username;
     }
+    this.size = other.size;
     if (other.isSetSharedUsers()) {
       List<String> __this__sharedUsers = new ArrayList<String>(other.sharedUsers);
       this.sharedUsers = __this__sharedUsers;
@@ -244,6 +269,8 @@
       Map<String,String> __this__customInformation = new HashMap<String,String>(other.customInformation);
       this.customInformation = __this__customInformation;
     }
+    this.creationTime = other.creationTime;
+    this.lastModifiedTime = other.lastModifiedTime;
   }
 
   public MetadataModel deepCopy() {
@@ -255,6 +282,8 @@
     this.metadataId = null;
     this.gatewayId = null;
     this.username = null;
+    setSizeIsSet(false);
+    this.size = 0.0;
     this.sharedUsers = null;
     setSharedPublicIsSet(false);
     this.sharedPublic = false;
@@ -263,6 +292,10 @@
     this.metadataType = null;
     this.associatedEntityId = null;
     this.customInformation = null;
+    setCreationTimeIsSet(false);
+    this.creationTime = 0;
+    setLastModifiedTimeIsSet(false);
+    this.lastModifiedTime = 0;
   }
 
   public String getMetadataId() {
@@ -334,6 +367,28 @@
     }
   }
 
+  public double getSize() {
+    return this.size;
+  }
+
+  public void setSize(double size) {
+    this.size = size;
+    setSizeIsSet(true);
+  }
+
+  public void unsetSize() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __SIZE_ISSET_ID);
+  }
+
+  /** Returns true if field size is set (has been assigned a value) and false otherwise */
+  public boolean isSetSize() {
+    return EncodingUtils.testBit(__isset_bitfield, __SIZE_ISSET_ID);
+  }
+
+  public void setSizeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __SIZE_ISSET_ID, value);
+  }
+
   public int getSharedUsersSize() {
     return (this.sharedUsers == null) ? 0 : this.sharedUsers.size();
   }
@@ -528,6 +583,50 @@
     }
   }
 
+  public long getCreationTime() {
+    return this.creationTime;
+  }
+
+  public void setCreationTime(long creationTime) {
+    this.creationTime = creationTime;
+    setCreationTimeIsSet(true);
+  }
+
+  public void unsetCreationTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
+  }
+
+  /** Returns true if field creationTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetCreationTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
+  }
+
+  public void setCreationTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CREATIONTIME_ISSET_ID, value);
+  }
+
+  public long getLastModifiedTime() {
+    return this.lastModifiedTime;
+  }
+
+  public void setLastModifiedTime(long lastModifiedTime) {
+    this.lastModifiedTime = lastModifiedTime;
+    setLastModifiedTimeIsSet(true);
+  }
+
+  public void unsetLastModifiedTime() {
+    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID);
+  }
+
+  /** Returns true if field lastModifiedTime is set (has been assigned a value) and false otherwise */
+  public boolean isSetLastModifiedTime() {
+    return EncodingUtils.testBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID);
+  }
+
+  public void setLastModifiedTimeIsSet(boolean value) {
+    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __LASTMODIFIEDTIME_ISSET_ID, value);
+  }
+
   public void setFieldValue(_Fields field, Object value) {
     switch (field) {
     case METADATA_ID:
@@ -554,6 +653,14 @@
       }
       break;
 
+    case SIZE:
+      if (value == null) {
+        unsetSize();
+      } else {
+        setSize((Double)value);
+      }
+      break;
+
     case SHARED_USERS:
       if (value == null) {
         unsetSharedUsers();
@@ -610,6 +717,22 @@
       }
       break;
 
+    case CREATION_TIME:
+      if (value == null) {
+        unsetCreationTime();
+      } else {
+        setCreationTime((Long)value);
+      }
+      break;
+
+    case LAST_MODIFIED_TIME:
+      if (value == null) {
+        unsetLastModifiedTime();
+      } else {
+        setLastModifiedTime((Long)value);
+      }
+      break;
+
     }
   }
 
@@ -624,6 +747,9 @@
     case USERNAME:
       return getUsername();
 
+    case SIZE:
+      return getSize();
+
     case SHARED_USERS:
       return getSharedUsers();
 
@@ -645,6 +771,12 @@
     case CUSTOM_INFORMATION:
       return getCustomInformation();
 
+    case CREATION_TIME:
+      return getCreationTime();
+
+    case LAST_MODIFIED_TIME:
+      return getLastModifiedTime();
+
     }
     throw new IllegalStateException();
   }
@@ -662,6 +794,8 @@
       return isSetGatewayId();
     case USERNAME:
       return isSetUsername();
+    case SIZE:
+      return isSetSize();
     case SHARED_USERS:
       return isSetSharedUsers();
     case SHARED_PUBLIC:
@@ -676,6 +810,10 @@
       return isSetAssociatedEntityId();
     case CUSTOM_INFORMATION:
       return isSetCustomInformation();
+    case CREATION_TIME:
+      return isSetCreationTime();
+    case LAST_MODIFIED_TIME:
+      return isSetLastModifiedTime();
     }
     throw new IllegalStateException();
   }
@@ -720,6 +858,15 @@
         return false;
     }
 
+    boolean this_present_size = true && this.isSetSize();
+    boolean that_present_size = true && that.isSetSize();
+    if (this_present_size || that_present_size) {
+      if (!(this_present_size && that_present_size))
+        return false;
+      if (this.size != that.size)
+        return false;
+    }
+
     boolean this_present_sharedUsers = true && this.isSetSharedUsers();
     boolean that_present_sharedUsers = true && that.isSetSharedUsers();
     if (this_present_sharedUsers || that_present_sharedUsers) {
@@ -783,6 +930,24 @@
         return false;
     }
 
+    boolean this_present_creationTime = true && this.isSetCreationTime();
+    boolean that_present_creationTime = true && that.isSetCreationTime();
+    if (this_present_creationTime || that_present_creationTime) {
+      if (!(this_present_creationTime && that_present_creationTime))
+        return false;
+      if (this.creationTime != that.creationTime)
+        return false;
+    }
+
+    boolean this_present_lastModifiedTime = true && this.isSetLastModifiedTime();
+    boolean that_present_lastModifiedTime = true && that.isSetLastModifiedTime();
+    if (this_present_lastModifiedTime || that_present_lastModifiedTime) {
+      if (!(this_present_lastModifiedTime && that_present_lastModifiedTime))
+        return false;
+      if (this.lastModifiedTime != that.lastModifiedTime)
+        return false;
+    }
+
     return true;
   }
 
@@ -805,6 +970,11 @@
     if (present_username)
       list.add(username);
 
+    boolean present_size = true && (isSetSize());
+    list.add(present_size);
+    if (present_size)
+      list.add(size);
+
     boolean present_sharedUsers = true && (isSetSharedUsers());
     list.add(present_sharedUsers);
     if (present_sharedUsers)
@@ -840,6 +1010,16 @@
     if (present_customInformation)
       list.add(customInformation);
 
+    boolean present_creationTime = true && (isSetCreationTime());
+    list.add(present_creationTime);
+    if (present_creationTime)
+      list.add(creationTime);
+
+    boolean present_lastModifiedTime = true && (isSetLastModifiedTime());
+    list.add(present_lastModifiedTime);
+    if (present_lastModifiedTime)
+      list.add(lastModifiedTime);
+
     return list.hashCode();
   }
 
@@ -881,6 +1061,16 @@
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetSize()).compareTo(other.isSetSize());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetSize()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.size, other.size);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = Boolean.valueOf(isSetSharedUsers()).compareTo(other.isSetSharedUsers());
     if (lastComparison != 0) {
       return lastComparison;
@@ -951,6 +1141,26 @@
         return lastComparison;
       }
     }
+    lastComparison = Boolean.valueOf(isSetCreationTime()).compareTo(other.isSetCreationTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetCreationTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.creationTime, other.creationTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetLastModifiedTime()).compareTo(other.isSetLastModifiedTime());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetLastModifiedTime()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.lastModifiedTime, other.lastModifiedTime);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     return 0;
   }
 
@@ -1000,6 +1210,12 @@
       }
       first = false;
     }
+    if (isSetSize()) {
+      if (!first) sb.append(", ");
+      sb.append("size:");
+      sb.append(this.size);
+      first = false;
+    }
     if (isSetSharedUsers()) {
       if (!first) sb.append(", ");
       sb.append("sharedUsers:");
@@ -1066,6 +1282,18 @@
       }
       first = false;
     }
+    if (isSetCreationTime()) {
+      if (!first) sb.append(", ");
+      sb.append("creationTime:");
+      sb.append(this.creationTime);
+      first = false;
+    }
+    if (isSetLastModifiedTime()) {
+      if (!first) sb.append(", ");
+      sb.append("lastModifiedTime:");
+      sb.append(this.lastModifiedTime);
+      first = false;
+    }
     sb.append(")");
     return sb.toString();
   }
@@ -1135,7 +1363,15 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 4: // SHARED_USERS
+          case 4: // SIZE
+            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
+              struct.size = iprot.readDouble();
+              struct.setSizeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 5: // SHARED_USERS
             if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
               {
                 org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
@@ -1153,7 +1389,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 5: // SHARED_PUBLIC
+          case 6: // SHARED_PUBLIC
             if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
               struct.sharedPublic = iprot.readBool();
               struct.setSharedPublicIsSet(true);
@@ -1161,7 +1397,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 6: // USER_FRIENDLY_NAME
+          case 7: // USER_FRIENDLY_NAME
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.userFriendlyName = iprot.readString();
               struct.setUserFriendlyNameIsSet(true);
@@ -1169,7 +1405,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 7: // USER_FRIENDLY_DESCRIPTION
+          case 8: // USER_FRIENDLY_DESCRIPTION
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.userFriendlyDescription = iprot.readString();
               struct.setUserFriendlyDescriptionIsSet(true);
@@ -1177,7 +1413,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 8: // METADATA_TYPE
+          case 9: // METADATA_TYPE
             if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
               struct.metadataType = org.apache.airavata.model.data.metadata.MetadataType.findByValue(iprot.readI32());
               struct.setMetadataTypeIsSet(true);
@@ -1185,7 +1421,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 9: // ASSOCIATED_ENTITY_ID
+          case 10: // ASSOCIATED_ENTITY_ID
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.associatedEntityId = iprot.readString();
               struct.setAssociatedEntityIdIsSet(true);
@@ -1193,7 +1429,7 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 10: // CUSTOM_INFORMATION
+          case 11: // CUSTOM_INFORMATION
             if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
               {
                 org.apache.thrift.protocol.TMap _map3 = iprot.readMapBegin();
@@ -1213,6 +1449,22 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
+          case 12: // CREATION_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.creationTime = iprot.readI64();
+              struct.setCreationTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 13: // LAST_MODIFIED_TIME
+            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
+              struct.lastModifiedTime = iprot.readI64();
+              struct.setLastModifiedTimeIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
           default:
             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
         }
@@ -1247,6 +1499,11 @@
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetSize()) {
+        oprot.writeFieldBegin(SIZE_FIELD_DESC);
+        oprot.writeDouble(struct.size);
+        oprot.writeFieldEnd();
+      }
       if (struct.sharedUsers != null) {
         if (struct.isSetSharedUsers()) {
           oprot.writeFieldBegin(SHARED_USERS_FIELD_DESC);
@@ -1309,6 +1566,16 @@
           oprot.writeFieldEnd();
         }
       }
+      if (struct.isSetCreationTime()) {
+        oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
+        oprot.writeI64(struct.creationTime);
+        oprot.writeFieldEnd();
+      }
+      if (struct.isSetLastModifiedTime()) {
+        oprot.writeFieldBegin(LAST_MODIFIED_TIME_FIELD_DESC);
+        oprot.writeI64(struct.lastModifiedTime);
+        oprot.writeFieldEnd();
+      }
       oprot.writeFieldStop();
       oprot.writeStructEnd();
     }
@@ -1336,28 +1603,37 @@
       if (struct.isSetUsername()) {
         optionals.set(2);
       }
-      if (struct.isSetSharedUsers()) {
+      if (struct.isSetSize()) {
         optionals.set(3);
       }
-      if (struct.isSetSharedPublic()) {
+      if (struct.isSetSharedUsers()) {
         optionals.set(4);
       }
-      if (struct.isSetUserFriendlyName()) {
+      if (struct.isSetSharedPublic()) {
         optionals.set(5);
       }
-      if (struct.isSetUserFriendlyDescription()) {
+      if (struct.isSetUserFriendlyName()) {
         optionals.set(6);
       }
-      if (struct.isSetMetadataType()) {
+      if (struct.isSetUserFriendlyDescription()) {
         optionals.set(7);
       }
-      if (struct.isSetAssociatedEntityId()) {
+      if (struct.isSetMetadataType()) {
         optionals.set(8);
       }
-      if (struct.isSetCustomInformation()) {
+      if (struct.isSetAssociatedEntityId()) {
         optionals.set(9);
       }
-      oprot.writeBitSet(optionals, 10);
+      if (struct.isSetCustomInformation()) {
+        optionals.set(10);
+      }
+      if (struct.isSetCreationTime()) {
+        optionals.set(11);
+      }
+      if (struct.isSetLastModifiedTime()) {
+        optionals.set(12);
+      }
+      oprot.writeBitSet(optionals, 13);
       if (struct.isSetMetadataId()) {
         oprot.writeString(struct.metadataId);
       }
@@ -1367,6 +1643,9 @@
       if (struct.isSetUsername()) {
         oprot.writeString(struct.username);
       }
+      if (struct.isSetSize()) {
+        oprot.writeDouble(struct.size);
+      }
       if (struct.isSetSharedUsers()) {
         {
           oprot.writeI32(struct.sharedUsers.size());
@@ -1401,12 +1680,18 @@
           }
         }
       }
+      if (struct.isSetCreationTime()) {
+        oprot.writeI64(struct.creationTime);
+      }
+      if (struct.isSetLastModifiedTime()) {
+        oprot.writeI64(struct.lastModifiedTime);
+      }
     }
 
     @Override
     public void read(org.apache.thrift.protocol.TProtocol prot, MetadataModel struct) throws org.apache.thrift.TException {
       TTupleProtocol iprot = (TTupleProtocol) prot;
-      BitSet incoming = iprot.readBitSet(10);
+      BitSet incoming = iprot.readBitSet(13);
       if (incoming.get(0)) {
         struct.metadataId = iprot.readString();
         struct.setMetadataIdIsSet(true);
@@ -1420,6 +1705,10 @@
         struct.setUsernameIsSet(true);
       }
       if (incoming.get(3)) {
+        struct.size = iprot.readDouble();
+        struct.setSizeIsSet(true);
+      }
+      if (incoming.get(4)) {
         {
           org.apache.thrift.protocol.TList _list11 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
           struct.sharedUsers = new ArrayList<String>(_list11.size);
@@ -1432,27 +1721,27 @@
         }
         struct.setSharedUsersIsSet(true);
       }
-      if (incoming.get(4)) {
+      if (incoming.get(5)) {
         struct.sharedPublic = iprot.readBool();
         struct.setSharedPublicIsSet(true);
       }
-      if (incoming.get(5)) {
+      if (incoming.get(6)) {
         struct.userFriendlyName = iprot.readString();
         struct.setUserFriendlyNameIsSet(true);
       }
-      if (incoming.get(6)) {
+      if (incoming.get(7)) {
         struct.userFriendlyDescription = iprot.readString();
         struct.setUserFriendlyDescriptionIsSet(true);
       }
-      if (incoming.get(7)) {
+      if (incoming.get(8)) {
         struct.metadataType = org.apache.airavata.model.data.metadata.MetadataType.findByValue(iprot.readI32());
         struct.setMetadataTypeIsSet(true);
       }
-      if (incoming.get(8)) {
+      if (incoming.get(9)) {
         struct.associatedEntityId = iprot.readString();
         struct.setAssociatedEntityIdIsSet(true);
       }
-      if (incoming.get(9)) {
+      if (incoming.get(10)) {
         {
           org.apache.thrift.protocol.TMap _map14 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
           struct.customInformation = new HashMap<String,String>(2*_map14.size);
@@ -1467,6 +1756,14 @@
         }
         struct.setCustomInformationIsSet(true);
       }
+      if (incoming.get(11)) {
+        struct.creationTime = iprot.readI64();
+        struct.setCreationTimeIsSet(true);
+      }
+      if (incoming.get(12)) {
+        struct.lastModifiedTime = iprot.readI64();
+        struct.setLastModifiedTimeIsSet(true);
+      }
     }
   }
 
diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/error/DataManagerServiceException.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/error/DataManagerServiceException.java
new file mode 100644
index 0000000..5d6a116
--- /dev/null
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/error/DataManagerServiceException.java
@@ -0,0 +1,406 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.model.error;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import javax.annotation.Generated;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.3)", date = "2016-01-12")
+public class DataManagerServiceException extends TException implements org.apache.thrift.TBase<DataManagerServiceException, DataManagerServiceException._Fields>, java.io.Serializable, Cloneable, Comparable<DataManagerServiceException> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("DataManagerServiceException");
+
+  private static final org.apache.thrift.protocol.TField MESSAGE_FIELD_DESC = new org.apache.thrift.protocol.TField("message", org.apache.thrift.protocol.TType.STRING, (short)1);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new DataManagerServiceExceptionStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new DataManagerServiceExceptionTupleSchemeFactory());
+  }
+
+  private String message; // required
+
+  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+    MESSAGE((short)1, "message");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // MESSAGE
+          return MESSAGE;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+  static {
+    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.MESSAGE, new org.apache.thrift.meta_data.FieldMetaData("message", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(DataManagerServiceException.class, metaDataMap);
+  }
+
+  public DataManagerServiceException() {
+  }
+
+  public DataManagerServiceException(
+    String message)
+  {
+    this();
+    this.message = message;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public DataManagerServiceException(DataManagerServiceException other) {
+    if (other.isSetMessage()) {
+      this.message = other.message;
+    }
+  }
+
+  public DataManagerServiceException deepCopy() {
+    return new DataManagerServiceException(this);
+  }
+
+  @Override
+  public void clear() {
+    this.message = null;
+  }
+
+  public String getMessage() {
+    return this.message;
+  }
+
+  public void setMessage(String message) {
+    this.message = message;
+  }
+
+  public void unsetMessage() {
+    this.message = null;
+  }
+
+  /** Returns true if field message is set (has been assigned a value) and false otherwise */
+  public boolean isSetMessage() {
+    return this.message != null;
+  }
+
+  public void setMessageIsSet(boolean value) {
+    if (!value) {
+      this.message = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case MESSAGE:
+      if (value == null) {
+        unsetMessage();
+      } else {
+        setMessage((String)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case MESSAGE:
+      return getMessage();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case MESSAGE:
+      return isSetMessage();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof DataManagerServiceException)
+      return this.equals((DataManagerServiceException)that);
+    return false;
+  }
+
+  public boolean equals(DataManagerServiceException that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_message = true && this.isSetMessage();
+    boolean that_present_message = true && that.isSetMessage();
+    if (this_present_message || that_present_message) {
+      if (!(this_present_message && that_present_message))
+        return false;
+      if (!this.message.equals(that.message))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    List<Object> list = new ArrayList<Object>();
+
+    boolean present_message = true && (isSetMessage());
+    list.add(present_message);
+    if (present_message)
+      list.add(message);
+
+    return list.hashCode();
+  }
+
+  @Override
+  public int compareTo(DataManagerServiceException other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = Boolean.valueOf(isSetMessage()).compareTo(other.isSetMessage());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetMessage()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.message, other.message);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("DataManagerServiceException(");
+    boolean first = true;
+
+    sb.append("message:");
+    if (this.message == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.message);
+    }
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws org.apache.thrift.TException {
+    // check for required fields
+    if (!isSetMessage()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'message' is unset! Struct:" + toString());
+    }
+
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+    try {
+      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class DataManagerServiceExceptionStandardSchemeFactory implements SchemeFactory {
+    public DataManagerServiceExceptionStandardScheme getScheme() {
+      return new DataManagerServiceExceptionStandardScheme();
+    }
+  }
+
+  private static class DataManagerServiceExceptionStandardScheme extends StandardScheme<DataManagerServiceException> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, DataManagerServiceException struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // MESSAGE
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.message = iprot.readString();
+              struct.setMessageIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, DataManagerServiceException struct) throws org.apache.thrift.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.message != null) {
+        oprot.writeFieldBegin(MESSAGE_FIELD_DESC);
+        oprot.writeString(struct.message);
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class DataManagerServiceExceptionTupleSchemeFactory implements SchemeFactory {
+    public DataManagerServiceExceptionTupleScheme getScheme() {
+      return new DataManagerServiceExceptionTupleScheme();
+    }
+  }
+
+  private static class DataManagerServiceExceptionTupleScheme extends TupleScheme<DataManagerServiceException> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, DataManagerServiceException struct) throws org.apache.thrift.TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      oprot.writeString(struct.message);
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, DataManagerServiceException struct) throws org.apache.thrift.TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      struct.message = iprot.readString();
+      struct.setMessageIsSet(true);
+    }
+  }
+
+}
+
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerFactory.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerFactory.java
similarity index 87%
rename from modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerFactory.java
rename to modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerFactory.java
index af908a3..cd92146 100644
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerFactory.java
+++ b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerFactory.java
@@ -25,10 +25,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class FileManagerFactory {
-    private final static Logger logger = LoggerFactory.getLogger(FileManagerFactory.class);
+public class DataManagerFactory {
+    private final static Logger logger = LoggerFactory.getLogger(DataManagerFactory.class);
 
-    public static DataManager getFileManager() throws DataManagerException {
-        return new FileManagerImpl();
+    public static DataManager getDataManager() throws DataManagerException {
+        return new DataManagerImpl();
     }
 }
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerImpl.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerImpl.java
similarity index 84%
rename from modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerImpl.java
rename to modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerImpl.java
index 2570fc5..f675890 100644
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/FileManagerImpl.java
+++ b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/DataManagerImpl.java
@@ -20,16 +20,13 @@
 */
 package org.apache.airavata.data.manager.core;
 
-import org.apache.airavata.data.manager.cpi.DataManager;
-import org.apache.airavata.data.manager.cpi.DataManagerException;
-import org.apache.airavata.data.manager.cpi.FileTransferService;
-import org.apache.airavata.data.manager.cpi.ReplicaCatalogService;
+import org.apache.airavata.data.manager.cpi.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-public class FileManagerImpl implements DataManager {
-    private final static Logger logger = LoggerFactory.getLogger(FileManagerImpl.class);
+public class DataManagerImpl implements DataManager {
+    private final static Logger logger = LoggerFactory.getLogger(DataManagerImpl.class);
 
     /**
      * Return file transfer service instance
@@ -67,9 +64,11 @@
      * @return
      */
     @Override
+
+
     public MetadataCatalogService getMetadataCatalogService()  throws DataManagerException {
         try{
-            return new MetadataCatalogServiceImpl();
+            return  new MetadataCatalogServiceImpl();
         }catch (Exception e){
             logger.error(e.getMessage(), e);
             throw new DataManagerException(e);
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogService.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogService.java
deleted file mode 100644
index 15172a3..0000000
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-package org.apache.airavata.data.manager.core;
-
-import org.apache.airavata.data.manager.cpi.DataManagerException;
-import org.apache.airavata.model.data.metadata.MetadataModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MetadataCatalogService implements org.apache.airavata.data.manager.cpi.MetadataCatalogService {
-    private final static Logger logger = LoggerFactory.getLogger(MetadataCatalogService.class);
-
-    /**
-     * Create new metadata model
-     *
-     * @param metadataModel
-     * @return
-     * @throws DataManagerException
-     */
-    @Override
-    public String createMetadata(MetadataModel metadataModel) throws DataManagerException {
-        return null;
-    }
-
-    /**
-     * Update existing metadata model
-     *
-     * @param metadataModel
-     * @throws DataManagerException
-     */
-    @Override
-    public void updateMetadata(MetadataModel metadataModel) throws DataManagerException {
-
-    }
-
-    /**
-     * Delete existing metadata model
-     *
-     * @param metadataId
-     * @throws DataManagerException
-     */
-    @Override
-    public void deleteMetadata(String metadataId) throws DataManagerException {
-
-    }
-
-    /**
-     * Retrieve metadata model
-     *
-     * @param metadataId
-     * @return
-     * @throws DataManagerException
-     */
-    @Override
-    public MetadataModel getMetadata(String metadataId) throws DataManagerException {
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogServiceImpl.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogServiceImpl.java
index 9f29c92..a297744 100644
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogServiceImpl.java
+++ b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/MetadataCatalogServiceImpl.java
@@ -22,13 +22,15 @@
 
 import org.apache.airavata.data.manager.core.db.dao.MetadataDao;
 import org.apache.airavata.data.manager.cpi.DataManagerException;
+import org.apache.airavata.data.manager.cpi.MetadataCatalogService;
 import org.apache.airavata.model.data.metadata.MetadataModel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.List;
 
-public class MetadataCatalogServiceImpl extends MetadataCatalogService {
+public class MetadataCatalogServiceImpl implements MetadataCatalogService {
     private final static Logger logger = LoggerFactory.getLogger(MetadataCatalogServiceImpl.class);
 
     private MetadataDao metadataDao;
@@ -102,4 +104,34 @@
             throw new DataManagerException(e);
         }
     }
+
+    /**
+     * Search Metadata
+     *
+     * @param username
+     * @param gatewayId
+     * @param searchText
+     * @return
+     * @throws DataManagerException
+     */
+    @Override
+    public List<MetadataModel> searchMetadata(String username, String gatewayId, String searchText) throws DataManagerException {
+        try{
+            return metadataDao.searchMetaDataModels(username, gatewayId, searchText);
+        }catch (Exception e){
+            logger.error(e.getMessage(), e);
+            throw new DataManagerException(e);
+        }
+    }
+
+//    public static void main(String[] args) throws IOException, DataManagerServiceException {
+//        MetadataModel metadataModel = new MetadataModel();
+//        metadataModel.setUsername("scnakandala");
+//        metadataModel.setUserFriendlyName("Stress Free, 100km Tlayer");
+//        metadataModel.setSize(103.67 * 1024);
+//        metadataModel.setUserFriendlyDescription("Dynamo similar to C2-2, with a stress-free boundaries and a 100km thick" +
+//                " thermal layer codBC.txt.in 2 0 0 0.129 0.0");
+//        MetadataCatalogServiceImpl metadataCatalogService = new MetadataCatalogServiceImpl();
+//        System.out.println(metadataCatalogService.searchMetadata("scnakandala", "default", "").size());
+//    }
 }
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/conversion/AbstractThriftDeserializer.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/conversion/AbstractThriftDeserializer.java
index 0841f45..0201cf6 100644
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/conversion/AbstractThriftDeserializer.java
+++ b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/conversion/AbstractThriftDeserializer.java
@@ -65,7 +65,8 @@
                  * number types, which in turn will make Thrift think the field
                  * has been set. Also we ignore the MongoDB specific _id field
                  */
-                if(currentField.getValue().getNodeType() != JsonNodeType.NULL) {
+                if(!currentField.getKey().equalsIgnoreCase("_id")
+                        && currentField.getValue().getNodeType() != JsonNodeType.NULL) {
                     final E field = getField(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_UNDERSCORE, currentField.getKey()));
                     final JsonParser parser = currentField.getValue().traverse();
                     parser.setCodec(mapper);
diff --git a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/dao/MetadataDao.java b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/dao/MetadataDao.java
index c9c4951..52c2732 100644
--- a/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/dao/MetadataDao.java
+++ b/modules/data-manager/data-manager-core/src/main/java/org/apache/airavata/data/manager/core/db/dao/MetadataDao.java
@@ -31,6 +31,8 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 public class MetadataDao {
@@ -58,6 +60,8 @@
 
     public String createMetadata(MetadataModel metadataModel) throws JsonProcessingException {
         metadataModel.setMetadataId(DataManagerConstants.AIRAVATA_METADATA_ID_PREFIX + UUID.randomUUID().toString());
+        metadataModel.setCreationTime(System.currentTimeMillis());
+        metadataModel.setLastModifiedTime(metadataModel.getCreationTime());
         WriteResult result = collection.insert((DBObject) JSON.parse(
                 modelConversionHelper.serializeObject(metadataModel)));
         logger.debug("No of inserted results " + result.getN());
@@ -67,6 +71,7 @@
     public void updateMetadata(MetadataModel metadataModel) throws JsonProcessingException {
         DBObject query = BasicDBObjectBuilder.start().add(
                 METADATA_ID, metadataModel.getMetadataId()).get();
+        metadataModel.setLastModifiedTime(System.currentTimeMillis());
         WriteResult result = collection.update(query, (DBObject) JSON.parse(
                 modelConversionHelper.serializeObject(metadataModel)));
         logger.debug("No of updated results " + result.getN());
@@ -90,4 +95,15 @@
         }
         return null;
     }
+
+    public List<MetadataModel> searchMetaDataModels(String username, String gatewayId, String searchText) throws IOException{
+        List<MetadataModel> metadataModels = new ArrayList<>();
+        DBCursor cursor = collection.find();
+        for(DBObject document: cursor){
+                metadataModels.add((MetadataModel) modelConversionHelper.deserializeObject(
+                        MetadataModel.class, document.toString()));
+        }
+        return metadataModels;
+    }
+
 }
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-cpi/src/main/java/org/apache/airavata/data/manager/cpi/MetadataCatalogService.java b/modules/data-manager/data-manager-cpi/src/main/java/org/apache/airavata/data/manager/cpi/MetadataCatalogService.java
index a75e0d4..602e7db 100644
--- a/modules/data-manager/data-manager-cpi/src/main/java/org/apache/airavata/data/manager/cpi/MetadataCatalogService.java
+++ b/modules/data-manager/data-manager-cpi/src/main/java/org/apache/airavata/data/manager/cpi/MetadataCatalogService.java
@@ -22,6 +22,8 @@
 
 import org.apache.airavata.model.data.metadata.MetadataModel;
 
+import java.util.List;
+
 public interface MetadataCatalogService {
 
     /**
@@ -53,4 +55,15 @@
      * @throws DataManagerException
      */
     MetadataModel getMetadata(String metadataId) throws DataManagerException;
+
+
+    /**
+     * Search Metadata
+     * @param username
+     * @param gatewayId
+     * @param searchText
+     * @return
+     * @throws DataManagerException
+     */
+    List<MetadataModel> searchMetadata(String username, String gatewayId, String searchText) throws DataManagerException;
 }
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-service/pom.xml b/modules/data-manager/data-manager-service/pom.xml
index ff00d83..d4dae52 100644
--- a/modules/data-manager/data-manager-service/pom.xml
+++ b/modules/data-manager/data-manager-service/pom.xml
@@ -20,5 +20,15 @@
             <artifactId>data-manager-stubs</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>data-manager-cpi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>data-manager-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-service/src/main/java/org/apache/airavata/data/manager/server/DataManagerServerHandler.java b/modules/data-manager/data-manager-service/src/main/java/org/apache/airavata/data/manager/server/DataManagerServerHandler.java
index 0ac3080..f30465a 100644
--- a/modules/data-manager/data-manager-service/src/main/java/org/apache/airavata/data/manager/server/DataManagerServerHandler.java
+++ b/modules/data-manager/data-manager-service/src/main/java/org/apache/airavata/data/manager/server/DataManagerServerHandler.java
@@ -20,15 +20,33 @@
 */
 package org.apache.airavata.data.manager.server;
 
+import org.apache.airavata.data.manager.core.DataManagerFactory;
+import org.apache.airavata.data.manager.cpi.DataManager;
+import org.apache.airavata.data.manager.cpi.DataManagerException;
 import org.apache.airavata.data.manager.cpi.DataManagerService;
 import org.apache.airavata.data.manager.cpi.data_manager_cpiConstants;
+import org.apache.airavata.model.data.metadata.MetadataModel;
+import org.apache.airavata.model.error.DataManagerServiceException;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+
 public class DataManagerServerHandler implements DataManagerService.Iface {
     private final static Logger logger = LoggerFactory.getLogger(DataManagerServerHandler.class);
 
+    private final DataManager dataManager;
+
+    public DataManagerServerHandler() throws DataManagerServiceException {
+        try {
+            dataManager = DataManagerFactory.getDataManager();
+        } catch (DataManagerException e) {
+            logger.error(e.getMessage());
+            throw new DataManagerServiceException(e.getMessage());
+        }
+    }
+
     /**
      * Query DM server to fetch the CPI version
      */
@@ -36,4 +54,23 @@
     public String getDMServiceVersion() throws TException {
         return data_manager_cpiConstants.DM_CPI_VERSION;
     }
+
+    /**
+     * * Query the DM server to fetch matching metadata models
+     * *
+     *
+     * @param username
+     * @param gatewayId
+     * @param searchText
+     */
+    @Override
+    public List<MetadataModel> searchMetadata(String username, String gatewayId, String searchText) throws
+            DataManagerServiceException, TException {
+        try {
+            return dataManager.getMetadataCatalogService().searchMetadata(username, gatewayId, searchText);
+        } catch (org.apache.airavata.data.manager.cpi.DataManagerException e) {
+            logger.error(e.getMessage());
+            throw new DataManagerServiceException(e.getMessage());
+        }
+    }
 }
\ No newline at end of file
diff --git a/modules/data-manager/data-manager-stubs/src/main/java/org/apache/airavata/data/manager/cpi/DataManagerService.java b/modules/data-manager/data-manager-stubs/src/main/java/org/apache/airavata/data/manager/cpi/DataManagerService.java
index dbc06ef..b53d585 100644
--- a/modules/data-manager/data-manager-stubs/src/main/java/org/apache/airavata/data/manager/cpi/DataManagerService.java
+++ b/modules/data-manager/data-manager-stubs/src/main/java/org/apache/airavata/data/manager/cpi/DataManagerService.java
@@ -22,14 +22,13 @@
  */
 package org.apache.airavata.data.manager.cpi;
 
+import org.apache.airavata.model.error.DataManagerServiceException;
 import org.apache.thrift.scheme.IScheme;
 import org.apache.thrift.scheme.SchemeFactory;
 import org.apache.thrift.scheme.StandardScheme;
 
 import org.apache.thrift.scheme.TupleScheme;
 import org.apache.thrift.protocol.TTupleProtocol;
-import org.apache.thrift.protocol.TProtocolException;
-import org.apache.thrift.EncodingUtils;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.server.AbstractNonblockingServer.*;
@@ -38,13 +37,9 @@
 import java.util.Map;
 import java.util.HashMap;
 import java.util.EnumMap;
-import java.util.Set;
-import java.util.HashSet;
 import java.util.EnumSet;
 import java.util.Collections;
 import java.util.BitSet;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
 import javax.annotation.Generated;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,12 +55,24 @@
      */
     public String getDMServiceVersion() throws org.apache.thrift.TException;
 
+    /**
+     *  * Query the DM server to fetch matching metadata models
+     * *
+     * 
+     * @param username
+     * @param gatewayId
+     * @param searchText
+     */
+    public List<org.apache.airavata.model.data.metadata.MetadataModel> searchMetadata(String username, String gatewayId, String searchText) throws DataManagerServiceException, org.apache.thrift.TException;
+
   }
 
   public interface AsyncIface {
 
     public void getDMServiceVersion(org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
 
+    public void searchMetadata(String username, String gatewayId, String searchText, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException;
+
   }
 
   public static class Client extends org.apache.thrift.TServiceClient implements Iface {
@@ -110,6 +117,34 @@
       throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "getDMServiceVersion failed: unknown result");
     }
 
+    public List<org.apache.airavata.model.data.metadata.MetadataModel> searchMetadata(String username, String gatewayId, String searchText) throws DataManagerServiceException, org.apache.thrift.TException
+    {
+      send_searchMetadata(username, gatewayId, searchText);
+      return recv_searchMetadata();
+    }
+
+    public void send_searchMetadata(String username, String gatewayId, String searchText) throws org.apache.thrift.TException
+    {
+      searchMetadata_args args = new searchMetadata_args();
+      args.setUsername(username);
+      args.setGatewayId(gatewayId);
+      args.setSearchText(searchText);
+      sendBase("searchMetadata", args);
+    }
+
+    public List<org.apache.airavata.model.data.metadata.MetadataModel> recv_searchMetadata() throws DataManagerServiceException, org.apache.thrift.TException
+    {
+      searchMetadata_result result = new searchMetadata_result();
+      receiveBase(result, "searchMetadata");
+      if (result.isSetSuccess()) {
+        return result.success;
+      }
+      if (result.dme != null) {
+        throw result.dme;
+      }
+      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "searchMetadata failed: unknown result");
+    }
+
   }
   public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {
     public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {
@@ -157,6 +192,44 @@
       }
     }
 
+    public void searchMetadata(String username, String gatewayId, String searchText, org.apache.thrift.async.AsyncMethodCallback resultHandler) throws org.apache.thrift.TException {
+      checkReady();
+      searchMetadata_call method_call = new searchMetadata_call(username, gatewayId, searchText, resultHandler, this, ___protocolFactory, ___transport);
+      this.___currentMethod = method_call;
+      ___manager.call(method_call);
+    }
+
+    public static class searchMetadata_call extends org.apache.thrift.async.TAsyncMethodCall {
+      private String username;
+      private String gatewayId;
+      private String searchText;
+      public searchMetadata_call(String username, String gatewayId, String searchText, org.apache.thrift.async.AsyncMethodCallback resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+        super(client, protocolFactory, transport, resultHandler, false);
+        this.username = username;
+        this.gatewayId = gatewayId;
+        this.searchText = searchText;
+      }
+
+      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
+        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("searchMetadata", org.apache.thrift.protocol.TMessageType.CALL, 0));
+        searchMetadata_args args = new searchMetadata_args();
+        args.setUsername(username);
+        args.setGatewayId(gatewayId);
+        args.setSearchText(searchText);
+        args.write(prot);
+        prot.writeMessageEnd();
+      }
+
+      public List<org.apache.airavata.model.data.metadata.MetadataModel> getResult() throws DataManagerServiceException, org.apache.thrift.TException {
+        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {
+          throw new IllegalStateException("Method call not finished!");
+        }
+        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
+        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
+        return (new Client(prot)).recv_searchMetadata();
+      }
+    }
+
   }
 
   public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {
@@ -171,6 +244,7 @@
 
     private static <I extends Iface> Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> getProcessMap(Map<String,  org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {
       processMap.put("getDMServiceVersion", new getDMServiceVersion());
+      processMap.put("searchMetadata", new searchMetadata());
       return processMap;
     }
 
@@ -194,6 +268,30 @@
       }
     }
 
+    public static class searchMetadata<I extends Iface> extends org.apache.thrift.ProcessFunction<I, searchMetadata_args> {
+      public searchMetadata() {
+        super("searchMetadata");
+      }
+
+      public searchMetadata_args getEmptyArgsInstance() {
+        return new searchMetadata_args();
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public searchMetadata_result getResult(I iface, searchMetadata_args args) throws org.apache.thrift.TException {
+        searchMetadata_result result = new searchMetadata_result();
+        try {
+          result.success = iface.searchMetadata(args.username, args.gatewayId, args.searchText);
+        } catch (DataManagerServiceException dme) {
+          result.dme = dme;
+        }
+        return result;
+      }
+    }
+
   }
 
   public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {
@@ -208,6 +306,7 @@
 
     private static <I extends AsyncIface> Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(Map<String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {
       processMap.put("getDMServiceVersion", new getDMServiceVersion());
+      processMap.put("searchMetadata", new searchMetadata());
       return processMap;
     }
 
@@ -262,6 +361,63 @@
       }
     }
 
+    public static class searchMetadata<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, searchMetadata_args, List<org.apache.airavata.model.data.metadata.MetadataModel>> {
+      public searchMetadata() {
+        super("searchMetadata");
+      }
+
+      public searchMetadata_args getEmptyArgsInstance() {
+        return new searchMetadata_args();
+      }
+
+      public AsyncMethodCallback<List<org.apache.airavata.model.data.metadata.MetadataModel>> getResultHandler(final AsyncFrameBuffer fb, final int seqid) {
+        final org.apache.thrift.AsyncProcessFunction fcall = this;
+        return new AsyncMethodCallback<List<org.apache.airavata.model.data.metadata.MetadataModel>>() { 
+          public void onComplete(List<org.apache.airavata.model.data.metadata.MetadataModel> o) {
+            searchMetadata_result result = new searchMetadata_result();
+            result.success = o;
+            try {
+              fcall.sendResponse(fb,result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);
+              return;
+            } catch (Exception e) {
+              LOGGER.error("Exception writing to internal frame buffer", e);
+            }
+            fb.close();
+          }
+          public void onError(Exception e) {
+            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
+            org.apache.thrift.TBase msg;
+            searchMetadata_result result = new searchMetadata_result();
+            if (e instanceof DataManagerServiceException) {
+                        result.dme = (DataManagerServiceException) e;
+                        result.setDmeIsSet(true);
+                        msg = result;
+            }
+             else 
+            {
+              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;
+              msg = (org.apache.thrift.TBase)new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());
+            }
+            try {
+              fcall.sendResponse(fb,msg,msgType,seqid);
+              return;
+            } catch (Exception ex) {
+              LOGGER.error("Exception writing to internal frame buffer", ex);
+            }
+            fb.close();
+          }
+        };
+      }
+
+      protected boolean isOneway() {
+        return false;
+      }
+
+      public void start(I iface, searchMetadata_args args, org.apache.thrift.async.AsyncMethodCallback<List<org.apache.airavata.model.data.metadata.MetadataModel>> resultHandler) throws TException {
+        iface.searchMetadata(args.username, args.gatewayId, args.searchText,resultHandler);
+      }
+    }
+
   }
 
   public static class getDMServiceVersion_args implements org.apache.thrift.TBase<getDMServiceVersion_args, getDMServiceVersion_args._Fields>, java.io.Serializable, Cloneable, Comparable<getDMServiceVersion_args>   {
@@ -873,4 +1029,1097 @@
 
   }
 
+  public static class searchMetadata_args implements org.apache.thrift.TBase<searchMetadata_args, searchMetadata_args._Fields>, java.io.Serializable, Cloneable, Comparable<searchMetadata_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("searchMetadata_args");
+
+    private static final org.apache.thrift.protocol.TField USERNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("username", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)2);
+    private static final org.apache.thrift.protocol.TField SEARCH_TEXT_FIELD_DESC = new org.apache.thrift.protocol.TField("searchText", org.apache.thrift.protocol.TType.STRING, (short)3);
+
+    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+    static {
+      schemes.put(StandardScheme.class, new searchMetadata_argsStandardSchemeFactory());
+      schemes.put(TupleScheme.class, new searchMetadata_argsTupleSchemeFactory());
+    }
+
+    public String username; // required
+    public String gatewayId; // required
+    public String searchText; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      USERNAME((short)1, "username"),
+      GATEWAY_ID((short)2, "gatewayId"),
+      SEARCH_TEXT((short)3, "searchText");
+
+      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+      static {
+        for (_Fields field : EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 1: // USERNAME
+            return USERNAME;
+          case 2: // GATEWAY_ID
+            return GATEWAY_ID;
+          case 3: // SEARCH_TEXT
+            return SEARCH_TEXT;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final String _fieldName;
+
+      _Fields(short thriftId, String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.USERNAME, new org.apache.thrift.meta_data.FieldMetaData("username", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.SEARCH_TEXT, new org.apache.thrift.meta_data.FieldMetaData("searchText", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      metaDataMap = Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(searchMetadata_args.class, metaDataMap);
+    }
+
+    public searchMetadata_args() {
+    }
+
+    public searchMetadata_args(
+      String username,
+      String gatewayId,
+      String searchText)
+    {
+      this();
+      this.username = username;
+      this.gatewayId = gatewayId;
+      this.searchText = searchText;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public searchMetadata_args(searchMetadata_args other) {
+      if (other.isSetUsername()) {
+        this.username = other.username;
+      }
+      if (other.isSetGatewayId()) {
+        this.gatewayId = other.gatewayId;
+      }
+      if (other.isSetSearchText()) {
+        this.searchText = other.searchText;
+      }
+    }
+
+    public searchMetadata_args deepCopy() {
+      return new searchMetadata_args(this);
+    }
+
+    @Override
+    public void clear() {
+      this.username = null;
+      this.gatewayId = null;
+      this.searchText = null;
+    }
+
+    public String getUsername() {
+      return this.username;
+    }
+
+    public searchMetadata_args setUsername(String username) {
+      this.username = username;
+      return this;
+    }
+
+    public void unsetUsername() {
+      this.username = null;
+    }
+
+    /** Returns true if field username is set (has been assigned a value) and false otherwise */
+    public boolean isSetUsername() {
+      return this.username != null;
+    }
+
+    public void setUsernameIsSet(boolean value) {
+      if (!value) {
+        this.username = null;
+      }
+    }
+
+    public String getGatewayId() {
+      return this.gatewayId;
+    }
+
+    public searchMetadata_args setGatewayId(String gatewayId) {
+      this.gatewayId = gatewayId;
+      return this;
+    }
+
+    public void unsetGatewayId() {
+      this.gatewayId = null;
+    }
+
+    /** Returns true if field gatewayId is set (has been assigned a value) and false otherwise */
+    public boolean isSetGatewayId() {
+      return this.gatewayId != null;
+    }
+
+    public void setGatewayIdIsSet(boolean value) {
+      if (!value) {
+        this.gatewayId = null;
+      }
+    }
+
+    public String getSearchText() {
+      return this.searchText;
+    }
+
+    public searchMetadata_args setSearchText(String searchText) {
+      this.searchText = searchText;
+      return this;
+    }
+
+    public void unsetSearchText() {
+      this.searchText = null;
+    }
+
+    /** Returns true if field searchText is set (has been assigned a value) and false otherwise */
+    public boolean isSetSearchText() {
+      return this.searchText != null;
+    }
+
+    public void setSearchTextIsSet(boolean value) {
+      if (!value) {
+        this.searchText = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+      switch (field) {
+      case USERNAME:
+        if (value == null) {
+          unsetUsername();
+        } else {
+          setUsername((String)value);
+        }
+        break;
+
+      case GATEWAY_ID:
+        if (value == null) {
+          unsetGatewayId();
+        } else {
+          setGatewayId((String)value);
+        }
+        break;
+
+      case SEARCH_TEXT:
+        if (value == null) {
+          unsetSearchText();
+        } else {
+          setSearchText((String)value);
+        }
+        break;
+
+      }
+    }
+
+    public Object getFieldValue(_Fields field) {
+      switch (field) {
+      case USERNAME:
+        return getUsername();
+
+      case GATEWAY_ID:
+        return getGatewayId();
+
+      case SEARCH_TEXT:
+        return getSearchText();
+
+      }
+      throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new IllegalArgumentException();
+      }
+
+      switch (field) {
+      case USERNAME:
+        return isSetUsername();
+      case GATEWAY_ID:
+        return isSetGatewayId();
+      case SEARCH_TEXT:
+        return isSetSearchText();
+      }
+      throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof searchMetadata_args)
+        return this.equals((searchMetadata_args)that);
+      return false;
+    }
+
+    public boolean equals(searchMetadata_args that) {
+      if (that == null)
+        return false;
+
+      boolean this_present_username = true && this.isSetUsername();
+      boolean that_present_username = true && that.isSetUsername();
+      if (this_present_username || that_present_username) {
+        if (!(this_present_username && that_present_username))
+          return false;
+        if (!this.username.equals(that.username))
+          return false;
+      }
+
+      boolean this_present_gatewayId = true && this.isSetGatewayId();
+      boolean that_present_gatewayId = true && that.isSetGatewayId();
+      if (this_present_gatewayId || that_present_gatewayId) {
+        if (!(this_present_gatewayId && that_present_gatewayId))
+          return false;
+        if (!this.gatewayId.equals(that.gatewayId))
+          return false;
+      }
+
+      boolean this_present_searchText = true && this.isSetSearchText();
+      boolean that_present_searchText = true && that.isSetSearchText();
+      if (this_present_searchText || that_present_searchText) {
+        if (!(this_present_searchText && that_present_searchText))
+          return false;
+        if (!this.searchText.equals(that.searchText))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      List<Object> list = new ArrayList<Object>();
+
+      boolean present_username = true && (isSetUsername());
+      list.add(present_username);
+      if (present_username)
+        list.add(username);
+
+      boolean present_gatewayId = true && (isSetGatewayId());
+      list.add(present_gatewayId);
+      if (present_gatewayId)
+        list.add(gatewayId);
+
+      boolean present_searchText = true && (isSetSearchText());
+      list.add(present_searchText);
+      if (present_searchText)
+        list.add(searchText);
+
+      return list.hashCode();
+    }
+
+    @Override
+    public int compareTo(searchMetadata_args other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = Boolean.valueOf(isSetUsername()).compareTo(other.isSetUsername());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetUsername()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.username, other.username);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = Boolean.valueOf(isSetGatewayId()).compareTo(other.isSetGatewayId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetGatewayId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayId, other.gatewayId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = Boolean.valueOf(isSetSearchText()).compareTo(other.isSetSearchText());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSearchText()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.searchText, other.searchText);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+    }
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder("searchMetadata_args(");
+      boolean first = true;
+
+      sb.append("username:");
+      if (this.username == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.username);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("gatewayId:");
+      if (this.gatewayId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.gatewayId);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("searchText:");
+      if (this.searchText == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.searchText);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class searchMetadata_argsStandardSchemeFactory implements SchemeFactory {
+      public searchMetadata_argsStandardScheme getScheme() {
+        return new searchMetadata_argsStandardScheme();
+      }
+    }
+
+    private static class searchMetadata_argsStandardScheme extends StandardScheme<searchMetadata_args> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, searchMetadata_args struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 1: // USERNAME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.username = iprot.readString();
+                struct.setUsernameIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 2: // GATEWAY_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.gatewayId = iprot.readString();
+                struct.setGatewayIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 3: // SEARCH_TEXT
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.searchText = iprot.readString();
+                struct.setSearchTextIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, searchMetadata_args struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.username != null) {
+          oprot.writeFieldBegin(USERNAME_FIELD_DESC);
+          oprot.writeString(struct.username);
+          oprot.writeFieldEnd();
+        }
+        if (struct.gatewayId != null) {
+          oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
+          oprot.writeString(struct.gatewayId);
+          oprot.writeFieldEnd();
+        }
+        if (struct.searchText != null) {
+          oprot.writeFieldBegin(SEARCH_TEXT_FIELD_DESC);
+          oprot.writeString(struct.searchText);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class searchMetadata_argsTupleSchemeFactory implements SchemeFactory {
+      public searchMetadata_argsTupleScheme getScheme() {
+        return new searchMetadata_argsTupleScheme();
+      }
+    }
+
+    private static class searchMetadata_argsTupleScheme extends TupleScheme<searchMetadata_args> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, searchMetadata_args struct) throws org.apache.thrift.TException {
+        TTupleProtocol oprot = (TTupleProtocol) prot;
+        BitSet optionals = new BitSet();
+        if (struct.isSetUsername()) {
+          optionals.set(0);
+        }
+        if (struct.isSetGatewayId()) {
+          optionals.set(1);
+        }
+        if (struct.isSetSearchText()) {
+          optionals.set(2);
+        }
+        oprot.writeBitSet(optionals, 3);
+        if (struct.isSetUsername()) {
+          oprot.writeString(struct.username);
+        }
+        if (struct.isSetGatewayId()) {
+          oprot.writeString(struct.gatewayId);
+        }
+        if (struct.isSetSearchText()) {
+          oprot.writeString(struct.searchText);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, searchMetadata_args struct) throws org.apache.thrift.TException {
+        TTupleProtocol iprot = (TTupleProtocol) prot;
+        BitSet incoming = iprot.readBitSet(3);
+        if (incoming.get(0)) {
+          struct.username = iprot.readString();
+          struct.setUsernameIsSet(true);
+        }
+        if (incoming.get(1)) {
+          struct.gatewayId = iprot.readString();
+          struct.setGatewayIdIsSet(true);
+        }
+        if (incoming.get(2)) {
+          struct.searchText = iprot.readString();
+          struct.setSearchTextIsSet(true);
+        }
+      }
+    }
+
+  }
+
+  public static class searchMetadata_result implements org.apache.thrift.TBase<searchMetadata_result, searchMetadata_result._Fields>, java.io.Serializable, Cloneable, Comparable<searchMetadata_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("searchMetadata_result");
+
+    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.LIST, (short)0);
+    private static final org.apache.thrift.protocol.TField DME_FIELD_DESC = new org.apache.thrift.protocol.TField("dme", org.apache.thrift.protocol.TType.STRUCT, (short)1);
+
+    private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+    static {
+      schemes.put(StandardScheme.class, new searchMetadata_resultStandardSchemeFactory());
+      schemes.put(TupleScheme.class, new searchMetadata_resultTupleSchemeFactory());
+    }
+
+    public List<org.apache.airavata.model.data.metadata.MetadataModel> success; // required
+    public DataManagerServiceException dme; // required
+
+    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+    public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+      SUCCESS((short)0, "success"),
+      DME((short)1, "dme");
+
+      private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+      static {
+        for (_Fields field : EnumSet.allOf(_Fields.class)) {
+          byName.put(field.getFieldName(), field);
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, or null if its not found.
+       */
+      public static _Fields findByThriftId(int fieldId) {
+        switch(fieldId) {
+          case 0: // SUCCESS
+            return SUCCESS;
+          case 1: // DME
+            return DME;
+          default:
+            return null;
+        }
+      }
+
+      /**
+       * Find the _Fields constant that matches fieldId, throwing an exception
+       * if it is not found.
+       */
+      public static _Fields findByThriftIdOrThrow(int fieldId) {
+        _Fields fields = findByThriftId(fieldId);
+        if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+        return fields;
+      }
+
+      /**
+       * Find the _Fields constant that matches name, or null if its not found.
+       */
+      public static _Fields findByName(String name) {
+        return byName.get(name);
+      }
+
+      private final short _thriftId;
+      private final String _fieldName;
+
+      _Fields(short thriftId, String fieldName) {
+        _thriftId = thriftId;
+        _fieldName = fieldName;
+      }
+
+      public short getThriftFieldId() {
+        return _thriftId;
+      }
+
+      public String getFieldName() {
+        return _fieldName;
+      }
+    }
+
+    // isset id assignments
+    public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+    static {
+      Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData("success", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
+              new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.data.metadata.MetadataModel.class))));
+      tmpMap.put(_Fields.DME, new org.apache.thrift.meta_data.FieldMetaData("dme", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRUCT)));
+      metaDataMap = Collections.unmodifiableMap(tmpMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(searchMetadata_result.class, metaDataMap);
+    }
+
+    public searchMetadata_result() {
+    }
+
+    public searchMetadata_result(
+      List<org.apache.airavata.model.data.metadata.MetadataModel> success,
+      DataManagerServiceException dme)
+    {
+      this();
+      this.success = success;
+      this.dme = dme;
+    }
+
+    /**
+     * Performs a deep copy on <i>other</i>.
+     */
+    public searchMetadata_result(searchMetadata_result other) {
+      if (other.isSetSuccess()) {
+        List<org.apache.airavata.model.data.metadata.MetadataModel> __this__success = new ArrayList<org.apache.airavata.model.data.metadata.MetadataModel>(other.success.size());
+        for (org.apache.airavata.model.data.metadata.MetadataModel other_element : other.success) {
+          __this__success.add(new org.apache.airavata.model.data.metadata.MetadataModel(other_element));
+        }
+        this.success = __this__success;
+      }
+      if (other.isSetDme()) {
+        this.dme = new DataManagerServiceException(other.dme);
+      }
+    }
+
+    public searchMetadata_result deepCopy() {
+      return new searchMetadata_result(this);
+    }
+
+    @Override
+    public void clear() {
+      this.success = null;
+      this.dme = null;
+    }
+
+    public int getSuccessSize() {
+      return (this.success == null) ? 0 : this.success.size();
+    }
+
+    public java.util.Iterator<org.apache.airavata.model.data.metadata.MetadataModel> getSuccessIterator() {
+      return (this.success == null) ? null : this.success.iterator();
+    }
+
+    public void addToSuccess(org.apache.airavata.model.data.metadata.MetadataModel elem) {
+      if (this.success == null) {
+        this.success = new ArrayList<org.apache.airavata.model.data.metadata.MetadataModel>();
+      }
+      this.success.add(elem);
+    }
+
+    public List<org.apache.airavata.model.data.metadata.MetadataModel> getSuccess() {
+      return this.success;
+    }
+
+    public searchMetadata_result setSuccess(List<org.apache.airavata.model.data.metadata.MetadataModel> success) {
+      this.success = success;
+      return this;
+    }
+
+    public void unsetSuccess() {
+      this.success = null;
+    }
+
+    /** Returns true if field success is set (has been assigned a value) and false otherwise */
+    public boolean isSetSuccess() {
+      return this.success != null;
+    }
+
+    public void setSuccessIsSet(boolean value) {
+      if (!value) {
+        this.success = null;
+      }
+    }
+
+    public DataManagerServiceException getDme() {
+      return this.dme;
+    }
+
+    public searchMetadata_result setDme(DataManagerServiceException dme) {
+      this.dme = dme;
+      return this;
+    }
+
+    public void unsetDme() {
+      this.dme = null;
+    }
+
+    /** Returns true if field dme is set (has been assigned a value) and false otherwise */
+    public boolean isSetDme() {
+      return this.dme != null;
+    }
+
+    public void setDmeIsSet(boolean value) {
+      if (!value) {
+        this.dme = null;
+      }
+    }
+
+    public void setFieldValue(_Fields field, Object value) {
+      switch (field) {
+      case SUCCESS:
+        if (value == null) {
+          unsetSuccess();
+        } else {
+          setSuccess((List<org.apache.airavata.model.data.metadata.MetadataModel>)value);
+        }
+        break;
+
+      case DME:
+        if (value == null) {
+          unsetDme();
+        } else {
+          setDme((DataManagerServiceException)value);
+        }
+        break;
+
+      }
+    }
+
+    public Object getFieldValue(_Fields field) {
+      switch (field) {
+      case SUCCESS:
+        return getSuccess();
+
+      case DME:
+        return getDme();
+
+      }
+      throw new IllegalStateException();
+    }
+
+    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+    public boolean isSet(_Fields field) {
+      if (field == null) {
+        throw new IllegalArgumentException();
+      }
+
+      switch (field) {
+      case SUCCESS:
+        return isSetSuccess();
+      case DME:
+        return isSetDme();
+      }
+      throw new IllegalStateException();
+    }
+
+    @Override
+    public boolean equals(Object that) {
+      if (that == null)
+        return false;
+      if (that instanceof searchMetadata_result)
+        return this.equals((searchMetadata_result)that);
+      return false;
+    }
+
+    public boolean equals(searchMetadata_result that) {
+      if (that == null)
+        return false;
+
+      boolean this_present_success = true && this.isSetSuccess();
+      boolean that_present_success = true && that.isSetSuccess();
+      if (this_present_success || that_present_success) {
+        if (!(this_present_success && that_present_success))
+          return false;
+        if (!this.success.equals(that.success))
+          return false;
+      }
+
+      boolean this_present_dme = true && this.isSetDme();
+      boolean that_present_dme = true && that.isSetDme();
+      if (this_present_dme || that_present_dme) {
+        if (!(this_present_dme && that_present_dme))
+          return false;
+        if (!this.dme.equals(that.dme))
+          return false;
+      }
+
+      return true;
+    }
+
+    @Override
+    public int hashCode() {
+      List<Object> list = new ArrayList<Object>();
+
+      boolean present_success = true && (isSetSuccess());
+      list.add(present_success);
+      if (present_success)
+        list.add(success);
+
+      boolean present_dme = true && (isSetDme());
+      list.add(present_dme);
+      if (present_dme)
+        list.add(dme);
+
+      return list.hashCode();
+    }
+
+    @Override
+    public int compareTo(searchMetadata_result other) {
+      if (!getClass().equals(other.getClass())) {
+        return getClass().getName().compareTo(other.getClass().getName());
+      }
+
+      int lastComparison = 0;
+
+      lastComparison = Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetSuccess()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = Boolean.valueOf(isSetDme()).compareTo(other.isSetDme());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetDme()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.dme, other.dme);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      return 0;
+    }
+
+    public _Fields fieldForId(int fieldId) {
+      return _Fields.findByThriftId(fieldId);
+    }
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+      schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+      schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+      }
+
+    @Override
+    public String toString() {
+      StringBuilder sb = new StringBuilder("searchMetadata_result(");
+      boolean first = true;
+
+      sb.append("success:");
+      if (this.success == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.success);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("dme:");
+      if (this.dme == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.dme);
+      }
+      first = false;
+      sb.append(")");
+      return sb.toString();
+    }
+
+    public void validate() throws org.apache.thrift.TException {
+      // check for required fields
+      // check for sub-struct validity
+    }
+
+    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+      try {
+        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+      try {
+        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+      } catch (org.apache.thrift.TException te) {
+        throw new java.io.IOException(te);
+      }
+    }
+
+    private static class searchMetadata_resultStandardSchemeFactory implements SchemeFactory {
+      public searchMetadata_resultStandardScheme getScheme() {
+        return new searchMetadata_resultStandardScheme();
+      }
+    }
+
+    private static class searchMetadata_resultStandardScheme extends StandardScheme<searchMetadata_result> {
+
+      public void read(org.apache.thrift.protocol.TProtocol iprot, searchMetadata_result struct) throws org.apache.thrift.TException {
+        org.apache.thrift.protocol.TField schemeField;
+        iprot.readStructBegin();
+        while (true)
+        {
+          schemeField = iprot.readFieldBegin();
+          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+            break;
+          }
+          switch (schemeField.id) {
+            case 0: // SUCCESS
+              if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
+                {
+                  org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
+                  struct.success = new ArrayList<org.apache.airavata.model.data.metadata.MetadataModel>(_list0.size);
+                  org.apache.airavata.model.data.metadata.MetadataModel _elem1;
+                  for (int _i2 = 0; _i2 < _list0.size; ++_i2)
+                  {
+                    _elem1 = new org.apache.airavata.model.data.metadata.MetadataModel();
+                    _elem1.read(iprot);
+                    struct.success.add(_elem1);
+                  }
+                  iprot.readListEnd();
+                }
+                struct.setSuccessIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 1: // DME
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
+                struct.dme = new DataManagerServiceException();
+                struct.dme.read(iprot);
+                struct.setDmeIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            default:
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+          }
+          iprot.readFieldEnd();
+        }
+        iprot.readStructEnd();
+
+        // check for required fields of primitive type, which can't be checked in the validate method
+        struct.validate();
+      }
+
+      public void write(org.apache.thrift.protocol.TProtocol oprot, searchMetadata_result struct) throws org.apache.thrift.TException {
+        struct.validate();
+
+        oprot.writeStructBegin(STRUCT_DESC);
+        if (struct.success != null) {
+          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);
+          {
+            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.success.size()));
+            for (org.apache.airavata.model.data.metadata.MetadataModel _iter3 : struct.success)
+            {
+              _iter3.write(oprot);
+            }
+            oprot.writeListEnd();
+          }
+          oprot.writeFieldEnd();
+        }
+        if (struct.dme != null) {
+          oprot.writeFieldBegin(DME_FIELD_DESC);
+          struct.dme.write(oprot);
+          oprot.writeFieldEnd();
+        }
+        oprot.writeFieldStop();
+        oprot.writeStructEnd();
+      }
+
+    }
+
+    private static class searchMetadata_resultTupleSchemeFactory implements SchemeFactory {
+      public searchMetadata_resultTupleScheme getScheme() {
+        return new searchMetadata_resultTupleScheme();
+      }
+    }
+
+    private static class searchMetadata_resultTupleScheme extends TupleScheme<searchMetadata_result> {
+
+      @Override
+      public void write(org.apache.thrift.protocol.TProtocol prot, searchMetadata_result struct) throws org.apache.thrift.TException {
+        TTupleProtocol oprot = (TTupleProtocol) prot;
+        BitSet optionals = new BitSet();
+        if (struct.isSetSuccess()) {
+          optionals.set(0);
+        }
+        if (struct.isSetDme()) {
+          optionals.set(1);
+        }
+        oprot.writeBitSet(optionals, 2);
+        if (struct.isSetSuccess()) {
+          {
+            oprot.writeI32(struct.success.size());
+            for (org.apache.airavata.model.data.metadata.MetadataModel _iter4 : struct.success)
+            {
+              _iter4.write(oprot);
+            }
+          }
+        }
+        if (struct.isSetDme()) {
+          struct.dme.write(oprot);
+        }
+      }
+
+      @Override
+      public void read(org.apache.thrift.protocol.TProtocol prot, searchMetadata_result struct) throws org.apache.thrift.TException {
+        TTupleProtocol iprot = (TTupleProtocol) prot;
+        BitSet incoming = iprot.readBitSet(2);
+        if (incoming.get(0)) {
+          {
+            org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
+            struct.success = new ArrayList<org.apache.airavata.model.data.metadata.MetadataModel>(_list5.size);
+            org.apache.airavata.model.data.metadata.MetadataModel _elem6;
+            for (int _i7 = 0; _i7 < _list5.size; ++_i7)
+            {
+              _elem6 = new org.apache.airavata.model.data.metadata.MetadataModel();
+              _elem6.read(iprot);
+              struct.success.add(_elem6);
+            }
+          }
+          struct.setSuccessIsSet(true);
+        }
+        if (incoming.get(1)) {
+          struct.dme = new DataManagerServiceException();
+          struct.dme.read(iprot);
+          struct.setDmeIsSet(true);
+        }
+      }
+    }
+
+  }
+
 }
diff --git a/pom.xml b/pom.xml
index 056108a..c82cc8d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -555,7 +555,6 @@
 				<module>modules/registry</module>
 				<module>modules/security</module>
 				<module>modules/credential-store</module>
-				<module>modules/data-manager</module>
 				<module>modules/orchestrator</module>
 				<module>modules/server</module>
 				<module>modules/test-suite</module>
diff --git a/thrift-interface-descriptions/airavata-apis/airavata_errors.thrift b/thrift-interface-descriptions/airavata-apis/airavata_errors.thrift
index c8e4999..484b33a 100644
--- a/thrift-interface-descriptions/airavata-apis/airavata_errors.thrift
+++ b/thrift-interface-descriptions/airavata-apis/airavata_errors.thrift
@@ -169,4 +169,8 @@
   2:  optional  string message,
 }
 
+exception DataManagerServiceException {
+  1:  required string message
+}
+
 
diff --git a/thrift-interface-descriptions/component-cpis/data-manager-cpi.thrift b/thrift-interface-descriptions/component-cpis/data-manager-cpi.thrift
index f830033..10097a3 100644
--- a/thrift-interface-descriptions/component-cpis/data-manager-cpi.thrift
+++ b/thrift-interface-descriptions/component-cpis/data-manager-cpi.thrift
@@ -25,8 +25,10 @@
 
 include "../data-models/data-manager-models/metadata_models.thrift"
 include "../data-models/data-manager-models/replica_models.thrift"
+include "../airavata-apis/airavata_errors.thrift"
 
 namespace java org.apache.airavata.data.manager.cpi
+namespace php Airavata.Data.Manager.Cpi
 
 const string DM_CPI_VERSION = "0.16.0"
 
@@ -35,4 +37,9 @@
   /** Query DM server to fetch the CPI version */
   string getDMServiceVersion(),
 
+  /**
+   * Query the DM server to fetch matching metadata models
+  **/
+  list<metadata_models.MetadataModel> searchMetadata(1: string username,2: string gatewayId,3: string searchText)
+      throws(1: airavata_errors.DataManagerServiceException dme)
 }
\ No newline at end of file
diff --git a/thrift-interface-descriptions/data-models/data-manager-models/metadata_models.thrift b/thrift-interface-descriptions/data-models/data-manager-models/metadata_models.thrift
index b3a3649..714eb37 100644
--- a/thrift-interface-descriptions/data-models/data-manager-models/metadata_models.thrift
+++ b/thrift-interface-descriptions/data-models/data-manager-models/metadata_models.thrift
@@ -19,7 +19,7 @@
  */
 
   namespace java org.apache.airavata.model.data.metadata
-  namespace php Airavata.Model.data.metadata
+  namespace php Airavata.Model.Data.Metadata
   namespace cpp apache.airavata.model.data.metadata
   namespace py apache.airavata.model.data.metadata
 
@@ -31,11 +31,14 @@
     1: optional string metadataId,
     2: optional string gatewayId,
     3: optional string username,
-    4: optional list<string> sharedUsers,
-    5: optional bool sharedPublic,
-    6: optional string userFriendlyName,
-    7: optional string userFriendlyDescription,
-    8: optional MetadataType metadataType,
-    9: optional string associatedEntityId,
-   10: optional map<string,string> customInformation
+    4: optional double size,
+    5: optional list<string> sharedUsers,
+    6: optional bool sharedPublic,
+    7: optional string userFriendlyName,
+    8: optional string userFriendlyDescription,
+    9: optional MetadataType metadataType,
+   10: optional string associatedEntityId,
+   11: optional map<string,string> customInformation
+   12: optional i64 creationTime,
+   13: optional i64 lastModifiedTime
   }
\ No newline at end of file
