diff --git a/app/config/app.php b/app/config/app.php
index 27f995f..3e1abe2 100755
--- a/app/config/app.php
+++ b/app/config/app.php
@@ -123,6 +123,7 @@
         'Illuminate\Workbench\WorkbenchServiceProvider',
         'Wsis\WsisServiceProvider',
         'Airavata\AiravataServiceProvider',
+        'Airavata\DataManager\DataManagerServiceProvider',
         'Teepluss\Theme\ThemeServiceProvider',
         'GrahamCampbell\Markdown\MarkdownServiceProvider',
     ),
@@ -193,6 +194,7 @@
         'View' => 'Illuminate\Support\Facades\View',
         'WSIS' => 'Wsis\Facades\Wsis',
         'Airavata' => 'Airavata\Facades\Airavata',
+        'DataManager' => 'Airavata\DataManager\Facades\DataManager',
         'Theme' => 'Teepluss\Theme\Facades\Theme',
         'Markdown' => 'GrahamCampbell\Markdown\Facades\Markdown',
     ),
diff --git a/app/config/pga_config.php b/app/config/pga_config.php
new file mode 100644
index 0000000..cfdd6b0
--- /dev/null
+++ b/app/config/pga_config.php
@@ -0,0 +1,224 @@
+<?php
+return array(
+    /**
+     * *****************************************************************
+     *  These are WSO2 Identity Server Related Configurations
+     * *****************************************************************
+     */
+
+    'wsis' => [
+
+        /**
+         * Admin Role Name
+         */
+        'admin-role-name' => 'Internal/everyone',
+
+        /**
+         * Read only Admin Role Name
+         */
+        'read-only-admin-role-name' => 'admin-read-only',
+
+        /**
+         * Gateway user role
+         */
+        'user-role-name' => 'airavata-user',
+
+        /**
+         * Tenant Domain
+         */
+        'tenant-domain' => 'master.airavata',
+
+        /**
+         * Tenant admin's username
+         */
+        'admin-username' => 'master',
+
+        /**
+         * Tenant admin's password
+         */
+        'admin-password' => 'master',
+
+        /**
+         * OAuth client key
+         */
+        'oauth-client-key' => 'O3iUdkkVYyHgzWPiVTQpY_tb96Ma',
+
+        /**
+         * OAuth client secret
+         */
+        'oauth-client-secret' => '6Ck1jZoa2oRtrzodSqkUZ2iINkUa',
+
+        /**
+         * Identity server domain
+         */
+        'server' => 'idp.scigap.org',
+
+        /**
+         * Identity server url
+         */
+        'service-url' => 'https://idp.scigap.org:7443/',
+
+        /**
+         * Enable HTTPS server verification
+         */
+        'verify-peer' => true,
+
+        /**
+         * Path to the server certificate file
+         */
+        'cafile-path' => app_path() . '/resources/security/idp_scigap_org.pem',
+
+        /**
+         * Allow self signed server certificates
+         */
+        'allow-self-signed-cert' => false
+    ],
+
+
+    /**
+     * *****************************************************************
+     *  These are Airavata Related Configurations
+     * *****************************************************************
+     */
+    'airavata' => [
+
+        /**
+         * Airavata API server location. Use tls:// as the protocol to
+         * connect TLS enabled Airavata
+         */
+        'airavata-server' => 'gw77.iu.xsede.org',
+
+        /**
+         * Airavata API server port
+         */
+        'airavata-port' => '8930',
+
+        /**
+         * Airavata API server thrift communication timeout
+         */
+        'airavata-timeout' => '1000000',
+
+        /**
+         * Data Manager CPI server host
+         */
+        'data-manager-server' => 'localhost',
+
+        /**
+         * Data Manager CPI server port
+         */
+        'data-manager-port' => '8990',
+
+        /**
+         * Data Manager CPI server thrift communication timeout
+         */
+        'data-manager-timeout' => '1000000',
+
+        /**
+         * PGA Gateway ID
+         */
+        'gateway-id' => 'seagrid',
+
+        /**
+         * Maximum size of a file which is allowed to upload to the server
+         */
+        'server-allowed-file-size' => 64,
+
+        /**
+         * absolute path of the data dir
+         */
+        'experiment-data-absolute-path' => '/Library/WebServer/Documents/experimentData',
+
+        /**
+         * username for the user for accessing the experiment data over ssh
+         */
+        'ssh-user' => 'root',
+
+        /**
+         * Advanced experiments options
+         */
+        'advanced-experiment-options' => '',
+
+        /**
+         * Default queue name
+         */
+        'queue-name' => 'long',
+
+        /**
+         * Default node count
+         */
+        'node-count' => '1',
+
+        /**
+         * Default total core count
+         */
+        'total-cpu-count' => '16',
+
+        /**
+         * Default wall time limit
+         */
+        'wall-time-limit' => '30',
+
+        /**
+         * Enable app-catalog cache
+         */
+        'enable-app-catalog-cache' => true,
+
+        /**
+         * Life time of app catalog data cache in minutes
+         */
+        'app-catalog-cache-duration' => 5,
+
+        /**
+         * Gateway data store resource id
+         */
+         'gateway-data-store-resource-id' => ''
+    ],
+    /**
+     * *****************************************************************
+     *  Portal Related Configurations
+     * *****************************************************************
+     */
+    'portal' => [
+
+        /**
+         * Whether this portal is the super admin portal
+         */
+        'super-admin-portal' => true,
+
+        /**
+         * Set the name of theme in use here
+         */
+        'theme' => 'base',
+
+        /**
+         * Portal titles
+         */
+        'portal-title' => 'Airavata PHP Gateway',
+
+        /**
+         * Email addresses of the portal admins. Portal admins well get email notifications for events
+         * such as new user creation
+         */
+        'admin-emails' => ['eroma.abeysinghe@gmail.com','supun.nakandala@gmail.com'],
+
+        /**
+         * Email account that the portal should login to send emails
+         */
+        'portal-email-username' => 'pga.airavata@gmail.com',
+
+        /**
+         * Password for the portal's email account
+         */
+        'portal-email-password' => 'airavata12',
+
+        /**
+         * SMTP server on which the portal should connect
+         */
+        'portal-smtp-server-host' => 'smtp.gmail.com',
+
+        /**
+         * SMTP server port on which the portal should connect
+         */
+        'portal-smtp-server-port' => '587'
+    ]
+);
diff --git a/app/config/pga_config.php.template b/app/config/pga_config.php.template
index 07520a4..d95a1cb 100644
--- a/app/config/pga_config.php.template
+++ b/app/config/pga_config.php.template
@@ -99,6 +99,21 @@
         'airavata-timeout' => '1000000',
 
         /**
+         * Data Manager CPI server host
+         */
+        'data-manager-server' => 'localhost',
+
+        /**
+         * Data Manager CPI server port
+         */
+        'data-manager-port' => '8990',
+
+        /**
+         * Data Manager CPI server thrift communication timeout
+         */
+        'data-manager-timeout' => '1000000',
+
+        /**
          * PGA Gateway ID
          */
         'gateway-id' => 'default',
diff --git a/app/controllers/DataController.php b/app/controllers/DataController.php
new file mode 100755
index 0000000..285fb74
--- /dev/null
+++ b/app/controllers/DataController.php
@@ -0,0 +1,13 @@
+<?php
+
+class DataController extends BaseController {
+
+	public function browseView()
+	{
+		$metadataModels = DataManager::searchMetadata("scnakandala", "default", "test query");
+		return View::make('data/browse', array("metadataModels" => $metadataModels));
+	}
+
+}
+
+?>
diff --git a/app/libraries/Airavata/Data/Manager/Cpi/DataManagerService.php b/app/libraries/Airavata/Data/Manager/Cpi/DataManagerService.php
new file mode 100644
index 0000000..9c936a1
--- /dev/null
+++ b/app/libraries/Airavata/Data/Manager/Cpi/DataManagerService.php
@@ -0,0 +1,534 @@
+<?php
+namespace Airavata\Data\Manager\Cpi;
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+use Thrift\Base\TBase;
+use Thrift\Type\TType;
+use Thrift\Type\TMessageType;
+use Thrift\Exception\TException;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Exception\TApplicationException;
+
+
+interface DataManagerServiceIf {
+  /**
+   * Query DM server to fetch the CPI version
+   * 
+   * @return string
+   */
+  public function getDMServiceVersion();
+  /**
+   *  * Query the DM server to fetch matching metadata models
+   * *
+   * 
+   * @param string $username
+   * @param string $gatewayId
+   * @param string $searchText
+   * @return \Airavata\Model\Data\Metadata\MetadataModel[]
+   * @throws \Airavata\API\Error\DataManagerServiceException
+   */
+  public function searchMetadata($username, $gatewayId, $searchText);
+}
+
+class DataManagerServiceClient implements \Airavata\Data\Manager\Cpi\DataManagerServiceIf {
+  protected $input_ = null;
+  protected $output_ = null;
+
+  protected $seqid_ = 0;
+
+  public function __construct($input, $output=null) {
+    $this->input_ = $input;
+    $this->output_ = $output ? $output : $input;
+  }
+
+  public function getDMServiceVersion()
+  {
+    $this->send_getDMServiceVersion();
+    return $this->recv_getDMServiceVersion();
+  }
+
+  public function send_getDMServiceVersion()
+  {
+    $args = new \Airavata\Data\Manager\Cpi\DataManagerService_getDMServiceVersion_args();
+    $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
+    if ($bin_accel)
+    {
+      thrift_protocol_write_binary($this->output_, 'getDMServiceVersion', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
+    }
+    else
+    {
+      $this->output_->writeMessageBegin('getDMServiceVersion', TMessageType::CALL, $this->seqid_);
+      $args->write($this->output_);
+      $this->output_->writeMessageEnd();
+      $this->output_->getTransport()->flush();
+    }
+  }
+
+  public function recv_getDMServiceVersion()
+  {
+    $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
+    if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Airavata\Data\Manager\Cpi\DataManagerService_getDMServiceVersion_result', $this->input_->isStrictRead());
+    else
+    {
+      $rseqid = 0;
+      $fname = null;
+      $mtype = 0;
+
+      $this->input_->readMessageBegin($fname, $mtype, $rseqid);
+      if ($mtype == TMessageType::EXCEPTION) {
+        $x = new TApplicationException();
+        $x->read($this->input_);
+        $this->input_->readMessageEnd();
+        throw $x;
+      }
+      $result = new \Airavata\Data\Manager\Cpi\DataManagerService_getDMServiceVersion_result();
+      $result->read($this->input_);
+      $this->input_->readMessageEnd();
+    }
+    if ($result->success !== null) {
+      return $result->success;
+    }
+    throw new \Exception("getDMServiceVersion failed: unknown result");
+  }
+
+  public function searchMetadata($username, $gatewayId, $searchText)
+  {
+    $this->send_searchMetadata($username, $gatewayId, $searchText);
+    return $this->recv_searchMetadata();
+  }
+
+  public function send_searchMetadata($username, $gatewayId, $searchText)
+  {
+    $args = new \Airavata\Data\Manager\Cpi\DataManagerService_searchMetadata_args();
+    $args->username = $username;
+    $args->gatewayId = $gatewayId;
+    $args->searchText = $searchText;
+    $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
+    if ($bin_accel)
+    {
+      thrift_protocol_write_binary($this->output_, 'searchMetadata', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
+    }
+    else
+    {
+      $this->output_->writeMessageBegin('searchMetadata', TMessageType::CALL, $this->seqid_);
+      $args->write($this->output_);
+      $this->output_->writeMessageEnd();
+      $this->output_->getTransport()->flush();
+    }
+  }
+
+  public function recv_searchMetadata()
+  {
+    $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
+    if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Airavata\Data\Manager\Cpi\DataManagerService_searchMetadata_result', $this->input_->isStrictRead());
+    else
+    {
+      $rseqid = 0;
+      $fname = null;
+      $mtype = 0;
+
+      $this->input_->readMessageBegin($fname, $mtype, $rseqid);
+      if ($mtype == TMessageType::EXCEPTION) {
+        $x = new TApplicationException();
+        $x->read($this->input_);
+        $this->input_->readMessageEnd();
+        throw $x;
+      }
+      $result = new \Airavata\Data\Manager\Cpi\DataManagerService_searchMetadata_result();
+      $result->read($this->input_);
+      $this->input_->readMessageEnd();
+    }
+    if ($result->success !== null) {
+      return $result->success;
+    }
+    if ($result->dme !== null) {
+      throw $result->dme;
+    }
+    throw new \Exception("searchMetadata failed: unknown result");
+  }
+
+}
+
+// HELPER FUNCTIONS AND STRUCTURES
+
+class DataManagerService_getDMServiceVersion_args {
+  static $_TSPEC;
+
+
+  public function __construct() {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        );
+    }
+  }
+
+  public function getName() {
+    return 'DataManagerService_getDMServiceVersion_args';
+  }
+
+  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)
+      {
+        default:
+          $xfer += $input->skip($ftype);
+          break;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('DataManagerService_getDMServiceVersion_args');
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class DataManagerService_getDMServiceVersion_result {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $success = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        0 => array(
+          'var' => 'success',
+          'type' => TType::STRING,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['success'])) {
+        $this->success = $vals['success'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'DataManagerService_getDMServiceVersion_result';
+  }
+
+  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 0:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->success);
+          } 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('DataManagerService_getDMServiceVersion_result');
+    if ($this->success !== null) {
+      $xfer += $output->writeFieldBegin('success', TType::STRING, 0);
+      $xfer += $output->writeString($this->success);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class DataManagerService_searchMetadata_args {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $username = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $searchText = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'username',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'searchText',
+          'type' => TType::STRING,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['username'])) {
+        $this->username = $vals['username'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['searchText'])) {
+        $this->searchText = $vals['searchText'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'DataManagerService_searchMetadata_args';
+  }
+
+  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->username);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->searchText);
+          } 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('DataManagerService_searchMetadata_args');
+    if ($this->username !== null) {
+      $xfer += $output->writeFieldBegin('username', TType::STRING, 1);
+      $xfer += $output->writeString($this->username);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->searchText !== null) {
+      $xfer += $output->writeFieldBegin('searchText', TType::STRING, 3);
+      $xfer += $output->writeString($this->searchText);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class DataManagerService_searchMetadata_result {
+  static $_TSPEC;
+
+  /**
+   * @var \Airavata\Model\Data\Metadata\MetadataModel[]
+   */
+  public $success = null;
+  /**
+   * @var \Airavata\API\Error\DataManagerServiceException
+   */
+  public $dme = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        0 => array(
+          'var' => 'success',
+          'type' => TType::LST,
+          'etype' => TType::STRUCT,
+          'elem' => array(
+            'type' => TType::STRUCT,
+            'class' => '\Airavata\Model\Data\Metadata\MetadataModel',
+            ),
+          ),
+        1 => array(
+          'var' => 'dme',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\DataManagerServiceException',
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['success'])) {
+        $this->success = $vals['success'];
+      }
+      if (isset($vals['dme'])) {
+        $this->dme = $vals['dme'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'DataManagerService_searchMetadata_result';
+  }
+
+  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 0:
+          if ($ftype == TType::LST) {
+            $this->success = array();
+            $_size0 = 0;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $elem5 = new \Airavata\Model\Data\Metadata\MetadataModel();
+              $xfer += $elem5->read($input);
+              $this->success []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 1:
+          if ($ftype == TType::STRUCT) {
+            $this->dme = new \Airavata\API\Error\DataManagerServiceException();
+            $xfer += $this->dme->read($input);
+          } 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('DataManagerService_searchMetadata_result');
+    if ($this->success !== null) {
+      if (!is_array($this->success)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('success', TType::LST, 0);
+      {
+        $output->writeListBegin(TType::STRUCT, count($this->success));
+        {
+          foreach ($this->success as $iter6)
+          {
+            $xfer += $iter6->write($output);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->dme !== null) {
+      $xfer += $output->writeFieldBegin('dme', TType::STRUCT, 1);
+      $xfer += $this->dme->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+
diff --git a/app/libraries/Airavata/Data/Manager/Cpi/Types.php b/app/libraries/Airavata/Data/Manager/Cpi/Types.php
new file mode 100644
index 0000000..dc567dd
--- /dev/null
+++ b/app/libraries/Airavata/Data/Manager/Cpi/Types.php
@@ -0,0 +1,28 @@
+<?php
+namespace Airavata\Data\Manager\Cpi;
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+use Thrift\Base\TBase;
+use Thrift\Type\TType;
+use Thrift\Type\TMessageType;
+use Thrift\Exception\TException;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Exception\TApplicationException;
+
+
+final class Constant extends \Thrift\Type\TConstant {
+  static protected $DM_CPI_VERSION;
+
+  static protected function init_DM_CPI_VERSION() {
+    return "0.16.0";
+  }
+}
+
+
diff --git a/app/libraries/Airavata/Data/Manager/DataManagerServiceProvider.php b/app/libraries/Airavata/Data/Manager/DataManagerServiceProvider.php
new file mode 100755
index 0000000..b2ae084
--- /dev/null
+++ b/app/libraries/Airavata/Data/Manager/DataManagerServiceProvider.php
@@ -0,0 +1,78 @@
+<?php namespace Airavata\DataManager;
+
+use Illuminate\Routing\UrlGenerator;
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Support\Facades\Config;
+use Airavata\Data\Manager\Cpi;
+use Thrift\Transport\TSocket;
+use Thrift\Protocol\TBinaryProtocol;
+use Illuminate\Routing\Redirector;
+
+class DataManagerServiceProvider extends ServiceProvider {
+
+	/**
+	 * Indicates if loading of the provider is deferred.
+	 *
+	 * @var bool
+	 */
+	protected $defer = false;
+
+    /**
+     * Bootstrap the application events.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->package('airavata/data-manager');
+    }
+
+	/**
+	 * Register the service provider.
+	 *
+	 * @return void
+	 */
+	public function register()
+	{
+        //registering service provider
+        $this->app['data-manager'] = $this->app->share(function($app)
+        {
+            try{
+                $transport = new TSocket(Config::get('pga_config.airavata')['data-manager-server'], Config::get('pga_config.airavata')['data-manager-port']);
+                $transport->setRecvTimeout(Config::get('pga_config.airavata')['data-manager-timeout']);
+                $transport->setSendTimeout(Config::get('pga_config.airavata')['data-manager-timeout']);
+
+                $protocol = new TBinaryProtocol($transport);
+                $transport->open();
+
+                $client = new Cpi\DataManagerServiceClient($protocol);
+
+            }catch (\Exception $ex){
+                throw new \Exception("Unable to instantiate Data Manager Client", 0,  $ex);
+            }
+
+            if( is_object( $client))
+                return $client;
+            else
+                throw new \Exception("Unable to instantiate Data Manager Client");
+        });
+
+        //registering alias
+        $this->app->booting(function()
+        {
+            $loader = \Illuminate\Foundation\AliasLoader::getInstance();
+            $loader->alias('DataManager', 'Airavata\DataManager\Facades\DataManager');
+        });
+	}
+
+	/**
+	 * Get the services provided by the provider.
+	 *
+	 * @return array
+	 */
+	public function provides()
+	{
+		return array('data-manager');
+	}
+
+}
diff --git a/app/libraries/Airavata/Data/Manager/Facades/DataManager.php b/app/libraries/Airavata/Data/Manager/Facades/DataManager.php
new file mode 100755
index 0000000..0dea04d
--- /dev/null
+++ b/app/libraries/Airavata/Data/Manager/Facades/DataManager.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Airavata\DataManager\Facades;
+
+use Illuminate\Support\Facades\Facade;
+
+class DataManager extends Facade {
+
+    /**
+     * Get the registered name of the component.
+     *
+     * @return string
+     */
+    protected static function getFacadeAccessor() { return 'data-manager'; }
+
+}
\ No newline at end of file
diff --git a/app/libraries/Airavata/Model/Data/Metadata/Types.php b/app/libraries/Airavata/Model/Data/Metadata/Types.php
new file mode 100644
index 0000000..ccc9ede
--- /dev/null
+++ b/app/libraries/Airavata/Model/Data/Metadata/Types.php
@@ -0,0 +1,440 @@
+<?php
+namespace Airavata\Model\Data\Metadata;
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+use Thrift\Base\TBase;
+use Thrift\Type\TType;
+use Thrift\Type\TMessageType;
+use Thrift\Exception\TException;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Exception\TApplicationException;
+
+
+final class MetadataType {
+  const FILE = 0;
+  const COLLECTION = 1;
+  static public $__names = array(
+    0 => 'FILE',
+    1 => 'COLLECTION',
+  );
+}
+
+class MetadataModel {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $metadataId = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $username = null;
+  /**
+   * @var double
+   */
+  public $size = null;
+  /**
+   * @var string[]
+   */
+  public $sharedUsers = null;
+  /**
+   * @var bool
+   */
+  public $sharedPublic = null;
+  /**
+   * @var string
+   */
+  public $userFriendlyName = null;
+  /**
+   * @var string
+   */
+  public $userFriendlyDescription = null;
+  /**
+   * @var int
+   */
+  public $metadataType = null;
+  /**
+   * @var string
+   */
+  public $associatedEntityId = null;
+  /**
+   * @var array
+   */
+  public $customInformation = null;
+  /**
+   * @var int
+   */
+  public $creationTime = null;
+  /**
+   * @var int
+   */
+  public $lastModifiedTime = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'metadataId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'username',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'size',
+          'type' => TType::DOUBLE,
+          ),
+        5 => array(
+          'var' => 'sharedUsers',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        6 => array(
+          'var' => 'sharedPublic',
+          'type' => TType::BOOL,
+          ),
+        7 => array(
+          'var' => 'userFriendlyName',
+          'type' => TType::STRING,
+          ),
+        8 => array(
+          'var' => 'userFriendlyDescription',
+          'type' => TType::STRING,
+          ),
+        9 => array(
+          'var' => 'metadataType',
+          'type' => TType::I32,
+          ),
+        10 => array(
+          'var' => 'associatedEntityId',
+          'type' => TType::STRING,
+          ),
+        11 => array(
+          'var' => 'customInformation',
+          'type' => TType::MAP,
+          'ktype' => TType::STRING,
+          'vtype' => TType::STRING,
+          'key' => array(
+            'type' => TType::STRING,
+          ),
+          'val' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        12 => array(
+          'var' => 'creationTime',
+          'type' => TType::I64,
+          ),
+        13 => array(
+          'var' => 'lastModifiedTime',
+          'type' => TType::I64,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['metadataId'])) {
+        $this->metadataId = $vals['metadataId'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['username'])) {
+        $this->username = $vals['username'];
+      }
+      if (isset($vals['size'])) {
+        $this->size = $vals['size'];
+      }
+      if (isset($vals['sharedUsers'])) {
+        $this->sharedUsers = $vals['sharedUsers'];
+      }
+      if (isset($vals['sharedPublic'])) {
+        $this->sharedPublic = $vals['sharedPublic'];
+      }
+      if (isset($vals['userFriendlyName'])) {
+        $this->userFriendlyName = $vals['userFriendlyName'];
+      }
+      if (isset($vals['userFriendlyDescription'])) {
+        $this->userFriendlyDescription = $vals['userFriendlyDescription'];
+      }
+      if (isset($vals['metadataType'])) {
+        $this->metadataType = $vals['metadataType'];
+      }
+      if (isset($vals['associatedEntityId'])) {
+        $this->associatedEntityId = $vals['associatedEntityId'];
+      }
+      if (isset($vals['customInformation'])) {
+        $this->customInformation = $vals['customInformation'];
+      }
+      if (isset($vals['creationTime'])) {
+        $this->creationTime = $vals['creationTime'];
+      }
+      if (isset($vals['lastModifiedTime'])) {
+        $this->lastModifiedTime = $vals['lastModifiedTime'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'MetadataModel';
+  }
+
+  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->metadataId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->username);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          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;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $xfer += $input->readString($elem5);
+              $this->sharedUsers []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::BOOL) {
+            $xfer += $input->readBool($this->sharedPublic);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->userFriendlyName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->userFriendlyDescription);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->metadataType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 10:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->associatedEntityId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 11:
+          if ($ftype == TType::MAP) {
+            $this->customInformation = array();
+            $_size6 = 0;
+            $_ktype7 = 0;
+            $_vtype8 = 0;
+            $xfer += $input->readMapBegin($_ktype7, $_vtype8, $_size6);
+            for ($_i10 = 0; $_i10 < $_size6; ++$_i10)
+            {
+              $key11 = '';
+              $val12 = '';
+              $xfer += $input->readString($key11);
+              $xfer += $input->readString($val12);
+              $this->customInformation[$key11] = $val12;
+            }
+            $xfer += $input->readMapEnd();
+          } else {
+            $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;
+      }
+      $xfer += $input->readFieldEnd();
+    }
+    $xfer += $input->readStructEnd();
+    return $xfer;
+  }
+
+  public function write($output) {
+    $xfer = 0;
+    $xfer += $output->writeStructBegin('MetadataModel');
+    if ($this->metadataId !== null) {
+      $xfer += $output->writeFieldBegin('metadataId', TType::STRING, 1);
+      $xfer += $output->writeString($this->metadataId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->username !== null) {
+      $xfer += $output->writeFieldBegin('username', TType::STRING, 3);
+      $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, 5);
+      {
+        $output->writeListBegin(TType::STRING, count($this->sharedUsers));
+        {
+          foreach ($this->sharedUsers as $iter13)
+          {
+            $xfer += $output->writeString($iter13);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->sharedPublic !== null) {
+      $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, 7);
+      $xfer += $output->writeString($this->userFriendlyName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->userFriendlyDescription !== null) {
+      $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, 9);
+      $xfer += $output->writeI32($this->metadataType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->associatedEntityId !== null) {
+      $xfer += $output->writeFieldBegin('associatedEntityId', TType::STRING, 10);
+      $xfer += $output->writeString($this->associatedEntityId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->customInformation !== null) {
+      if (!is_array($this->customInformation)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('customInformation', TType::MAP, 11);
+      {
+        $output->writeMapBegin(TType::STRING, TType::STRING, count($this->customInformation));
+        {
+          foreach ($this->customInformation as $kiter14 => $viter15)
+          {
+            $xfer += $output->writeString($kiter14);
+            $xfer += $output->writeString($viter15);
+          }
+        }
+        $output->writeMapEnd();
+      }
+      $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/app/libraries/Airavata/Model/Data/Replica/Types.php b/app/libraries/Airavata/Model/Data/Replica/Types.php
new file mode 100644
index 0000000..38ee07f
--- /dev/null
+++ b/app/libraries/Airavata/Model/Data/Replica/Types.php
@@ -0,0 +1,1028 @@
+<?php
+namespace Airavata\Model\Data\Replica;
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+use Thrift\Base\TBase;
+use Thrift\Type\TType;
+use Thrift\Type\TMessageType;
+use Thrift\Exception\TException;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Exception\TApplicationException;
+
+
+final class FileModelType {
+  const FILE = 0;
+  const DIRECTORY = 1;
+  static public $__names = array(
+    0 => 'FILE',
+    1 => 'DIRECTORY',
+  );
+}
+
+final class StorageResourceType {
+  const GATEWAY_DATA_STORE = 0;
+  const BACKUP_GATEWAY_DATA_STORE = 1;
+  const COMPUTE_RESOURCE = 2;
+  const LONG_TERM_STORAGE_RESOURCE = 3;
+  const OTHER = 4;
+  static public $__names = array(
+    0 => 'GATEWAY_DATA_STORE',
+    1 => 'BACKUP_GATEWAY_DATA_STORE',
+    2 => 'COMPUTE_RESOURCE',
+    3 => 'LONG_TERM_STORAGE_RESOURCE',
+    4 => 'OTHER',
+  );
+}
+
+final class ReplicaPersistentType {
+  const TRANSIENT = 0;
+  const PERSISTENT = 1;
+  static public $__names = array(
+    0 => 'TRANSIENT',
+    1 => 'PERSISTENT',
+  );
+}
+
+class FileCollectionModel {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $collectionId = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $username = null;
+  /**
+   * @var string[]
+   */
+  public $sharedUsers = null;
+  /**
+   * @var bool
+   */
+  public $sharedPublic = null;
+  /**
+   * @var string
+   */
+  public $collectionName = null;
+  /**
+   * @var string
+   */
+  public $collectionDescription = null;
+  /**
+   * @var string[]
+   */
+  public $fileIdList = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'collectionId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'username',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'sharedUsers',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        5 => array(
+          'var' => 'sharedPublic',
+          'type' => TType::BOOL,
+          ),
+        6 => array(
+          'var' => 'collectionName',
+          'type' => TType::STRING,
+          ),
+        7 => array(
+          'var' => 'collectionDescription',
+          'type' => TType::STRING,
+          ),
+        8 => array(
+          'var' => 'fileIdList',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['collectionId'])) {
+        $this->collectionId = $vals['collectionId'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['username'])) {
+        $this->username = $vals['username'];
+      }
+      if (isset($vals['sharedUsers'])) {
+        $this->sharedUsers = $vals['sharedUsers'];
+      }
+      if (isset($vals['sharedPublic'])) {
+        $this->sharedPublic = $vals['sharedPublic'];
+      }
+      if (isset($vals['collectionName'])) {
+        $this->collectionName = $vals['collectionName'];
+      }
+      if (isset($vals['collectionDescription'])) {
+        $this->collectionDescription = $vals['collectionDescription'];
+      }
+      if (isset($vals['fileIdList'])) {
+        $this->fileIdList = $vals['fileIdList'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'FileCollectionModel';
+  }
+
+  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->collectionId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->username);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::LST) {
+            $this->sharedUsers = array();
+            $_size0 = 0;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $xfer += $input->readString($elem5);
+              $this->sharedUsers []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::BOOL) {
+            $xfer += $input->readBool($this->sharedPublic);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->collectionName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->collectionDescription);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::LST) {
+            $this->fileIdList = array();
+            $_size6 = 0;
+            $_etype9 = 0;
+            $xfer += $input->readListBegin($_etype9, $_size6);
+            for ($_i10 = 0; $_i10 < $_size6; ++$_i10)
+            {
+              $elem11 = null;
+              $xfer += $input->readString($elem11);
+              $this->fileIdList []= $elem11;
+            }
+            $xfer += $input->readListEnd();
+          } 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('FileCollectionModel');
+    if ($this->collectionId !== null) {
+      $xfer += $output->writeFieldBegin('collectionId', TType::STRING, 1);
+      $xfer += $output->writeString($this->collectionId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->username !== null) {
+      $xfer += $output->writeFieldBegin('username', TType::STRING, 3);
+      $xfer += $output->writeString($this->username);
+      $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);
+      {
+        $output->writeListBegin(TType::STRING, count($this->sharedUsers));
+        {
+          foreach ($this->sharedUsers as $iter12)
+          {
+            $xfer += $output->writeString($iter12);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->sharedPublic !== null) {
+      $xfer += $output->writeFieldBegin('sharedPublic', TType::BOOL, 5);
+      $xfer += $output->writeBool($this->sharedPublic);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->collectionName !== null) {
+      $xfer += $output->writeFieldBegin('collectionName', TType::STRING, 6);
+      $xfer += $output->writeString($this->collectionName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->collectionDescription !== null) {
+      $xfer += $output->writeFieldBegin('collectionDescription', TType::STRING, 7);
+      $xfer += $output->writeString($this->collectionDescription);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileIdList !== null) {
+      if (!is_array($this->fileIdList)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('fileIdList', TType::LST, 8);
+      {
+        $output->writeListBegin(TType::STRING, count($this->fileIdList));
+        {
+          foreach ($this->fileIdList as $iter13)
+          {
+            $xfer += $output->writeString($iter13);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class FileModel {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $fileId = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $username = null;
+  /**
+   * @var string[]
+   */
+  public $sharedUsers = null;
+  /**
+   * @var bool
+   */
+  public $sharedPublic = null;
+  /**
+   * @var string
+   */
+  public $fileName = null;
+  /**
+   * @var string
+   */
+  public $fileDescription = null;
+  /**
+   * @var string
+   */
+  public $sha256Checksum = null;
+  /**
+   * @var int
+   */
+  public $fileType = null;
+  /**
+   * @var int
+   */
+  public $fileSize = null;
+  /**
+   * @var string
+   */
+  public $dataType = null;
+  /**
+   * @var int
+   */
+  public $creationTime = null;
+  /**
+   * @var int
+   */
+  public $lastModifiedTime = null;
+  /**
+   * @var \Airavata\Model\Data\Replica\FileReplicaModel[]
+   */
+  public $fileReplicas = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'fileId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'username',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'sharedUsers',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        5 => array(
+          'var' => 'sharedPublic',
+          'type' => TType::BOOL,
+          ),
+        6 => array(
+          'var' => 'fileName',
+          'type' => TType::STRING,
+          ),
+        7 => array(
+          'var' => 'fileDescription',
+          'type' => TType::STRING,
+          ),
+        8 => array(
+          'var' => 'sha256Checksum',
+          'type' => TType::STRING,
+          ),
+        9 => array(
+          'var' => 'fileType',
+          'type' => TType::I32,
+          ),
+        10 => array(
+          'var' => 'fileSize',
+          'type' => TType::I32,
+          ),
+        11 => array(
+          'var' => 'dataType',
+          'type' => TType::STRING,
+          ),
+        12 => array(
+          'var' => 'creationTime',
+          'type' => TType::I64,
+          ),
+        13 => array(
+          'var' => 'lastModifiedTime',
+          'type' => TType::I64,
+          ),
+        14 => array(
+          'var' => 'fileReplicas',
+          'type' => TType::LST,
+          'etype' => TType::STRUCT,
+          'elem' => array(
+            'type' => TType::STRUCT,
+            'class' => '\Airavata\Model\Data\Replica\FileReplicaModel',
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['fileId'])) {
+        $this->fileId = $vals['fileId'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['username'])) {
+        $this->username = $vals['username'];
+      }
+      if (isset($vals['sharedUsers'])) {
+        $this->sharedUsers = $vals['sharedUsers'];
+      }
+      if (isset($vals['sharedPublic'])) {
+        $this->sharedPublic = $vals['sharedPublic'];
+      }
+      if (isset($vals['fileName'])) {
+        $this->fileName = $vals['fileName'];
+      }
+      if (isset($vals['fileDescription'])) {
+        $this->fileDescription = $vals['fileDescription'];
+      }
+      if (isset($vals['sha256Checksum'])) {
+        $this->sha256Checksum = $vals['sha256Checksum'];
+      }
+      if (isset($vals['fileType'])) {
+        $this->fileType = $vals['fileType'];
+      }
+      if (isset($vals['fileSize'])) {
+        $this->fileSize = $vals['fileSize'];
+      }
+      if (isset($vals['dataType'])) {
+        $this->dataType = $vals['dataType'];
+      }
+      if (isset($vals['creationTime'])) {
+        $this->creationTime = $vals['creationTime'];
+      }
+      if (isset($vals['lastModifiedTime'])) {
+        $this->lastModifiedTime = $vals['lastModifiedTime'];
+      }
+      if (isset($vals['fileReplicas'])) {
+        $this->fileReplicas = $vals['fileReplicas'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'FileModel';
+  }
+
+  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->fileId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->username);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::LST) {
+            $this->sharedUsers = array();
+            $_size14 = 0;
+            $_etype17 = 0;
+            $xfer += $input->readListBegin($_etype17, $_size14);
+            for ($_i18 = 0; $_i18 < $_size14; ++$_i18)
+            {
+              $elem19 = null;
+              $xfer += $input->readString($elem19);
+              $this->sharedUsers []= $elem19;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::BOOL) {
+            $xfer += $input->readBool($this->sharedPublic);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->fileName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->fileDescription);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->sha256Checksum);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->fileType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 10:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->fileSize);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 11:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->dataType);
+          } else {
+            $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;
+        case 14:
+          if ($ftype == TType::LST) {
+            $this->fileReplicas = array();
+            $_size20 = 0;
+            $_etype23 = 0;
+            $xfer += $input->readListBegin($_etype23, $_size20);
+            for ($_i24 = 0; $_i24 < $_size20; ++$_i24)
+            {
+              $elem25 = null;
+              $elem25 = new \Airavata\Model\Data\Replica\FileReplicaModel();
+              $xfer += $elem25->read($input);
+              $this->fileReplicas []= $elem25;
+            }
+            $xfer += $input->readListEnd();
+          } 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('FileModel');
+    if ($this->fileId !== null) {
+      $xfer += $output->writeFieldBegin('fileId', TType::STRING, 1);
+      $xfer += $output->writeString($this->fileId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->username !== null) {
+      $xfer += $output->writeFieldBegin('username', TType::STRING, 3);
+      $xfer += $output->writeString($this->username);
+      $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);
+      {
+        $output->writeListBegin(TType::STRING, count($this->sharedUsers));
+        {
+          foreach ($this->sharedUsers as $iter26)
+          {
+            $xfer += $output->writeString($iter26);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->sharedPublic !== null) {
+      $xfer += $output->writeFieldBegin('sharedPublic', TType::BOOL, 5);
+      $xfer += $output->writeBool($this->sharedPublic);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileName !== null) {
+      $xfer += $output->writeFieldBegin('fileName', TType::STRING, 6);
+      $xfer += $output->writeString($this->fileName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileDescription !== null) {
+      $xfer += $output->writeFieldBegin('fileDescription', TType::STRING, 7);
+      $xfer += $output->writeString($this->fileDescription);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->sha256Checksum !== null) {
+      $xfer += $output->writeFieldBegin('sha256Checksum', TType::STRING, 8);
+      $xfer += $output->writeString($this->sha256Checksum);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileType !== null) {
+      $xfer += $output->writeFieldBegin('fileType', TType::I32, 9);
+      $xfer += $output->writeI32($this->fileType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileSize !== null) {
+      $xfer += $output->writeFieldBegin('fileSize', TType::I32, 10);
+      $xfer += $output->writeI32($this->fileSize);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->dataType !== null) {
+      $xfer += $output->writeFieldBegin('dataType', TType::STRING, 11);
+      $xfer += $output->writeString($this->dataType);
+      $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();
+    }
+    if ($this->fileReplicas !== null) {
+      if (!is_array($this->fileReplicas)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('fileReplicas', TType::LST, 14);
+      {
+        $output->writeListBegin(TType::STRUCT, count($this->fileReplicas));
+        {
+          foreach ($this->fileReplicas as $iter27)
+          {
+            $xfer += $iter27->write($output);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class FileReplicaModel {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $replicaName = null;
+  /**
+   * @var string
+   */
+  public $replicaDescription = null;
+  /**
+   * @var string
+   */
+  public $storageHostname = null;
+  /**
+   * @var string
+   */
+  public $storageResourceId = null;
+  /**
+   * @var string
+   */
+  public $filePath = null;
+  /**
+   * @var int
+   */
+  public $creationTime = null;
+  /**
+   * @var int
+   */
+  public $validUntilTime = null;
+  /**
+   * @var int
+   */
+  public $storageResourceType = null;
+  /**
+   * @var int
+   */
+  public $replicaPersistentType = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'replicaName',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'replicaDescription',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'storageHostname',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'storageResourceId',
+          'type' => TType::STRING,
+          ),
+        5 => array(
+          'var' => 'filePath',
+          'type' => TType::STRING,
+          ),
+        6 => array(
+          'var' => 'creationTime',
+          'type' => TType::I64,
+          ),
+        7 => array(
+          'var' => 'validUntilTime',
+          'type' => TType::I64,
+          ),
+        8 => array(
+          'var' => 'storageResourceType',
+          'type' => TType::I32,
+          ),
+        9 => array(
+          'var' => 'replicaPersistentType',
+          'type' => TType::I32,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['replicaName'])) {
+        $this->replicaName = $vals['replicaName'];
+      }
+      if (isset($vals['replicaDescription'])) {
+        $this->replicaDescription = $vals['replicaDescription'];
+      }
+      if (isset($vals['storageHostname'])) {
+        $this->storageHostname = $vals['storageHostname'];
+      }
+      if (isset($vals['storageResourceId'])) {
+        $this->storageResourceId = $vals['storageResourceId'];
+      }
+      if (isset($vals['filePath'])) {
+        $this->filePath = $vals['filePath'];
+      }
+      if (isset($vals['creationTime'])) {
+        $this->creationTime = $vals['creationTime'];
+      }
+      if (isset($vals['validUntilTime'])) {
+        $this->validUntilTime = $vals['validUntilTime'];
+      }
+      if (isset($vals['storageResourceType'])) {
+        $this->storageResourceType = $vals['storageResourceType'];
+      }
+      if (isset($vals['replicaPersistentType'])) {
+        $this->replicaPersistentType = $vals['replicaPersistentType'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'FileReplicaModel';
+  }
+
+  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->replicaName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->replicaDescription);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->storageHostname);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->storageResourceId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->filePath);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->creationTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->validUntilTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->storageResourceType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->replicaPersistentType);
+          } 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('FileReplicaModel');
+    if ($this->replicaName !== null) {
+      $xfer += $output->writeFieldBegin('replicaName', TType::STRING, 1);
+      $xfer += $output->writeString($this->replicaName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->replicaDescription !== null) {
+      $xfer += $output->writeFieldBegin('replicaDescription', TType::STRING, 2);
+      $xfer += $output->writeString($this->replicaDescription);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storageHostname !== null) {
+      $xfer += $output->writeFieldBegin('storageHostname', TType::STRING, 3);
+      $xfer += $output->writeString($this->storageHostname);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storageResourceId !== null) {
+      $xfer += $output->writeFieldBegin('storageResourceId', TType::STRING, 4);
+      $xfer += $output->writeString($this->storageResourceId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->filePath !== null) {
+      $xfer += $output->writeFieldBegin('filePath', TType::STRING, 5);
+      $xfer += $output->writeString($this->filePath);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->creationTime !== null) {
+      $xfer += $output->writeFieldBegin('creationTime', TType::I64, 6);
+      $xfer += $output->writeI64($this->creationTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->validUntilTime !== null) {
+      $xfer += $output->writeFieldBegin('validUntilTime', TType::I64, 7);
+      $xfer += $output->writeI64($this->validUntilTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storageResourceType !== null) {
+      $xfer += $output->writeFieldBegin('storageResourceType', TType::I32, 8);
+      $xfer += $output->writeI32($this->storageResourceType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->replicaPersistentType !== null) {
+      $xfer += $output->writeFieldBegin('replicaPersistentType', TType::I32, 9);
+      $xfer += $output->writeI32($this->replicaPersistentType);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+
diff --git a/app/libraries/Airavata/Model/Data/Resource/Types.php b/app/libraries/Airavata/Model/Data/Resource/Types.php
deleted file mode 100644
index cd5542a..0000000
--- a/app/libraries/Airavata/Model/Data/Resource/Types.php
+++ /dev/null
@@ -1,854 +0,0 @@
-<?php
-namespace Airavata\Model\Data\Resource;
-
-/**
- * Autogenerated by Thrift Compiler (0.9.3)
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- *  @generated
- */
-use Thrift\Base\TBase;
-use Thrift\Type\TType;
-use Thrift\Type\TMessageType;
-use Thrift\Exception\TException;
-use Thrift\Exception\TProtocolException;
-use Thrift\Protocol\TProtocol;
-use Thrift\Protocol\TBinaryProtocolAccelerated;
-use Thrift\Exception\TApplicationException;
-
-
-final class ReplicaLocationCategory {
-  const GATEWAY_DATA_STORE = 0;
-  const COMPUTE_RESOURCE = 1;
-  const LONG_TERM_STORAGE_RESOURCE = 2;
-  const OTHER = 3;
-  static public $__names = array(
-    0 => 'GATEWAY_DATA_STORE',
-    1 => 'COMPUTE_RESOURCE',
-    2 => 'LONG_TERM_STORAGE_RESOURCE',
-    3 => 'OTHER',
-  );
-}
-
-final class ReplicaPersistentType {
-  const TRANSIENT = 0;
-  const PERSISTENT = 1;
-  static public $__names = array(
-    0 => 'TRANSIENT',
-    1 => 'PERSISTENT',
-  );
-}
-
-final class DataResourceType {
-  const COLLECTION = 0;
-  const FILE = 1;
-  static public $__names = array(
-    0 => 'COLLECTION',
-    1 => 'FILE',
-  );
-}
-
-class DataResourceModel {
-  static $_TSPEC;
-
-  /**
-   * @var string
-   */
-  public $resourceId = null;
-  /**
-   * @var string
-   */
-  public $gatewayId = null;
-  /**
-   * @var string
-   */
-  public $parentResourceId = null;
-  /**
-   * @var string
-   */
-  public $resourceName = null;
-  /**
-   * @var string
-   */
-  public $resourceDescription = null;
-  /**
-   * @var string
-   */
-  public $ownerName = null;
-  /**
-   * @var int
-   */
-  public $dataResourceType = null;
-  /**
-   * @var int
-   */
-  public $resourceSize = null;
-  /**
-   * @var int
-   */
-  public $creationTime = null;
-  /**
-   * @var int
-   */
-  public $lastModifiedTime = null;
-  /**
-   * @var array
-   */
-  public $resourceMetadata = null;
-  /**
-   * @var \Airavata\Model\Data\Resource\DataReplicaLocationModel[]
-   */
-  public $replicaLocations = null;
-  /**
-   * @var \Airavata\Model\Data\Resource\DataResourceModel[]
-   */
-  public $childResources = null;
-
-  public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'resourceId',
-          'type' => TType::STRING,
-          ),
-        2 => array(
-          'var' => 'gatewayId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'parentResourceId',
-          'type' => TType::STRING,
-          ),
-        4 => array(
-          'var' => 'resourceName',
-          'type' => TType::STRING,
-          ),
-        5 => array(
-          'var' => 'resourceDescription',
-          'type' => TType::STRING,
-          ),
-        6 => array(
-          'var' => 'ownerName',
-          'type' => TType::STRING,
-          ),
-        7 => array(
-          'var' => 'dataResourceType',
-          'type' => TType::I32,
-          ),
-        8 => array(
-          'var' => 'resourceSize',
-          'type' => TType::I32,
-          ),
-        9 => array(
-          'var' => 'creationTime',
-          'type' => TType::I64,
-          ),
-        10 => array(
-          'var' => 'lastModifiedTime',
-          'type' => TType::I64,
-          ),
-        11 => array(
-          'var' => 'resourceMetadata',
-          'type' => TType::MAP,
-          'ktype' => TType::STRING,
-          'vtype' => TType::STRING,
-          'key' => array(
-            'type' => TType::STRING,
-          ),
-          'val' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        12 => array(
-          'var' => 'replicaLocations',
-          'type' => TType::LST,
-          'etype' => TType::STRUCT,
-          'elem' => array(
-            'type' => TType::STRUCT,
-            'class' => '\Airavata\Model\Data\Resource\DataReplicaLocationModel',
-            ),
-          ),
-        13 => array(
-          'var' => 'childResources',
-          'type' => TType::LST,
-          'etype' => TType::STRUCT,
-          'elem' => array(
-            'type' => TType::STRUCT,
-            'class' => '\Airavata\Model\Data\Resource\DataResourceModel',
-            ),
-          ),
-        );
-    }
-    if (is_array($vals)) {
-      if (isset($vals['resourceId'])) {
-        $this->resourceId = $vals['resourceId'];
-      }
-      if (isset($vals['gatewayId'])) {
-        $this->gatewayId = $vals['gatewayId'];
-      }
-      if (isset($vals['parentResourceId'])) {
-        $this->parentResourceId = $vals['parentResourceId'];
-      }
-      if (isset($vals['resourceName'])) {
-        $this->resourceName = $vals['resourceName'];
-      }
-      if (isset($vals['resourceDescription'])) {
-        $this->resourceDescription = $vals['resourceDescription'];
-      }
-      if (isset($vals['ownerName'])) {
-        $this->ownerName = $vals['ownerName'];
-      }
-      if (isset($vals['dataResourceType'])) {
-        $this->dataResourceType = $vals['dataResourceType'];
-      }
-      if (isset($vals['resourceSize'])) {
-        $this->resourceSize = $vals['resourceSize'];
-      }
-      if (isset($vals['creationTime'])) {
-        $this->creationTime = $vals['creationTime'];
-      }
-      if (isset($vals['lastModifiedTime'])) {
-        $this->lastModifiedTime = $vals['lastModifiedTime'];
-      }
-      if (isset($vals['resourceMetadata'])) {
-        $this->resourceMetadata = $vals['resourceMetadata'];
-      }
-      if (isset($vals['replicaLocations'])) {
-        $this->replicaLocations = $vals['replicaLocations'];
-      }
-      if (isset($vals['childResources'])) {
-        $this->childResources = $vals['childResources'];
-      }
-    }
-  }
-
-  public function getName() {
-    return 'DataResourceModel';
-  }
-
-  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->resourceId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 2:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->gatewayId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 3:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->parentResourceId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 4:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->resourceName);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 5:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->resourceDescription);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 6:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->ownerName);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 7:
-          if ($ftype == TType::I32) {
-            $xfer += $input->readI32($this->dataResourceType);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 8:
-          if ($ftype == TType::I32) {
-            $xfer += $input->readI32($this->resourceSize);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 9:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->creationTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 10:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->lastModifiedTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 11:
-          if ($ftype == TType::MAP) {
-            $this->resourceMetadata = array();
-            $_size0 = 0;
-            $_ktype1 = 0;
-            $_vtype2 = 0;
-            $xfer += $input->readMapBegin($_ktype1, $_vtype2, $_size0);
-            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
-            {
-              $key5 = '';
-              $val6 = '';
-              $xfer += $input->readString($key5);
-              $xfer += $input->readString($val6);
-              $this->resourceMetadata[$key5] = $val6;
-            }
-            $xfer += $input->readMapEnd();
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 12:
-          if ($ftype == TType::LST) {
-            $this->replicaLocations = array();
-            $_size7 = 0;
-            $_etype10 = 0;
-            $xfer += $input->readListBegin($_etype10, $_size7);
-            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
-            {
-              $elem12 = null;
-              $elem12 = new \Airavata\Model\Data\Resource\DataReplicaLocationModel();
-              $xfer += $elem12->read($input);
-              $this->replicaLocations []= $elem12;
-            }
-            $xfer += $input->readListEnd();
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 13:
-          if ($ftype == TType::LST) {
-            $this->childResources = array();
-            $_size13 = 0;
-            $_etype16 = 0;
-            $xfer += $input->readListBegin($_etype16, $_size13);
-            for ($_i17 = 0; $_i17 < $_size13; ++$_i17)
-            {
-              $elem18 = null;
-              $elem18 = new \Airavata\Model\Data\Resource\DataResourceModel();
-              $xfer += $elem18->read($input);
-              $this->childResources []= $elem18;
-            }
-            $xfer += $input->readListEnd();
-          } 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('DataResourceModel');
-    if ($this->resourceId !== null) {
-      $xfer += $output->writeFieldBegin('resourceId', TType::STRING, 1);
-      $xfer += $output->writeString($this->resourceId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->gatewayId !== null) {
-      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
-      $xfer += $output->writeString($this->gatewayId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->parentResourceId !== null) {
-      $xfer += $output->writeFieldBegin('parentResourceId', TType::STRING, 3);
-      $xfer += $output->writeString($this->parentResourceId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->resourceName !== null) {
-      $xfer += $output->writeFieldBegin('resourceName', TType::STRING, 4);
-      $xfer += $output->writeString($this->resourceName);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->resourceDescription !== null) {
-      $xfer += $output->writeFieldBegin('resourceDescription', TType::STRING, 5);
-      $xfer += $output->writeString($this->resourceDescription);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->ownerName !== null) {
-      $xfer += $output->writeFieldBegin('ownerName', TType::STRING, 6);
-      $xfer += $output->writeString($this->ownerName);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->dataResourceType !== null) {
-      $xfer += $output->writeFieldBegin('dataResourceType', TType::I32, 7);
-      $xfer += $output->writeI32($this->dataResourceType);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->resourceSize !== null) {
-      $xfer += $output->writeFieldBegin('resourceSize', TType::I32, 8);
-      $xfer += $output->writeI32($this->resourceSize);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->creationTime !== null) {
-      $xfer += $output->writeFieldBegin('creationTime', TType::I64, 9);
-      $xfer += $output->writeI64($this->creationTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->lastModifiedTime !== null) {
-      $xfer += $output->writeFieldBegin('lastModifiedTime', TType::I64, 10);
-      $xfer += $output->writeI64($this->lastModifiedTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->resourceMetadata !== null) {
-      if (!is_array($this->resourceMetadata)) {
-        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
-      }
-      $xfer += $output->writeFieldBegin('resourceMetadata', TType::MAP, 11);
-      {
-        $output->writeMapBegin(TType::STRING, TType::STRING, count($this->resourceMetadata));
-        {
-          foreach ($this->resourceMetadata as $kiter19 => $viter20)
-          {
-            $xfer += $output->writeString($kiter19);
-            $xfer += $output->writeString($viter20);
-          }
-        }
-        $output->writeMapEnd();
-      }
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaLocations !== null) {
-      if (!is_array($this->replicaLocations)) {
-        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
-      }
-      $xfer += $output->writeFieldBegin('replicaLocations', TType::LST, 12);
-      {
-        $output->writeListBegin(TType::STRUCT, count($this->replicaLocations));
-        {
-          foreach ($this->replicaLocations as $iter21)
-          {
-            $xfer += $iter21->write($output);
-          }
-        }
-        $output->writeListEnd();
-      }
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->childResources !== null) {
-      if (!is_array($this->childResources)) {
-        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
-      }
-      $xfer += $output->writeFieldBegin('childResources', TType::LST, 13);
-      {
-        $output->writeListBegin(TType::STRUCT, count($this->childResources));
-        {
-          foreach ($this->childResources as $iter22)
-          {
-            $xfer += $iter22->write($output);
-          }
-        }
-        $output->writeListEnd();
-      }
-      $xfer += $output->writeFieldEnd();
-    }
-    $xfer += $output->writeFieldStop();
-    $xfer += $output->writeStructEnd();
-    return $xfer;
-  }
-
-}
-
-class DataReplicaLocationModel {
-  static $_TSPEC;
-
-  /**
-   * @var string
-   */
-  public $replicaId = null;
-  /**
-   * @var string
-   */
-  public $resourceId = null;
-  /**
-   * @var string
-   */
-  public $replicaName = null;
-  /**
-   * @var string
-   */
-  public $replicaDescription = null;
-  /**
-   * @var int
-   */
-  public $creationTime = null;
-  /**
-   * @var int
-   */
-  public $lastModifiedTime = null;
-  /**
-   * @var int
-   */
-  public $validUntilTime = null;
-  /**
-   * @var int
-   */
-  public $replicaLocationCategory = null;
-  /**
-   * @var int
-   */
-  public $replicaPersistentType = null;
-  /**
-   * @var string
-   */
-  public $storageResourceId = null;
-  /**
-   * @var string
-   */
-  public $fileAbsolutePath = null;
-  /**
-   * @var array
-   */
-  public $replicaMetadata = null;
-
-  public function __construct($vals=null) {
-    if (!isset(self::$_TSPEC)) {
-      self::$_TSPEC = array(
-        1 => array(
-          'var' => 'replicaId',
-          'type' => TType::STRING,
-          ),
-        2 => array(
-          'var' => 'resourceId',
-          'type' => TType::STRING,
-          ),
-        3 => array(
-          'var' => 'replicaName',
-          'type' => TType::STRING,
-          ),
-        4 => array(
-          'var' => 'replicaDescription',
-          'type' => TType::STRING,
-          ),
-        5 => array(
-          'var' => 'creationTime',
-          'type' => TType::I64,
-          ),
-        6 => array(
-          'var' => 'lastModifiedTime',
-          'type' => TType::I64,
-          ),
-        7 => array(
-          'var' => 'validUntilTime',
-          'type' => TType::I64,
-          ),
-        8 => array(
-          'var' => 'replicaLocationCategory',
-          'type' => TType::I32,
-          ),
-        9 => array(
-          'var' => 'replicaPersistentType',
-          'type' => TType::I32,
-          ),
-        10 => array(
-          'var' => 'storageResourceId',
-          'type' => TType::STRING,
-          ),
-        11 => array(
-          'var' => 'fileAbsolutePath',
-          'type' => TType::STRING,
-          ),
-        12 => array(
-          'var' => 'replicaMetadata',
-          'type' => TType::MAP,
-          'ktype' => TType::STRING,
-          'vtype' => TType::STRING,
-          'key' => array(
-            'type' => TType::STRING,
-          ),
-          'val' => array(
-            'type' => TType::STRING,
-            ),
-          ),
-        );
-    }
-    if (is_array($vals)) {
-      if (isset($vals['replicaId'])) {
-        $this->replicaId = $vals['replicaId'];
-      }
-      if (isset($vals['resourceId'])) {
-        $this->resourceId = $vals['resourceId'];
-      }
-      if (isset($vals['replicaName'])) {
-        $this->replicaName = $vals['replicaName'];
-      }
-      if (isset($vals['replicaDescription'])) {
-        $this->replicaDescription = $vals['replicaDescription'];
-      }
-      if (isset($vals['creationTime'])) {
-        $this->creationTime = $vals['creationTime'];
-      }
-      if (isset($vals['lastModifiedTime'])) {
-        $this->lastModifiedTime = $vals['lastModifiedTime'];
-      }
-      if (isset($vals['validUntilTime'])) {
-        $this->validUntilTime = $vals['validUntilTime'];
-      }
-      if (isset($vals['replicaLocationCategory'])) {
-        $this->replicaLocationCategory = $vals['replicaLocationCategory'];
-      }
-      if (isset($vals['replicaPersistentType'])) {
-        $this->replicaPersistentType = $vals['replicaPersistentType'];
-      }
-      if (isset($vals['storageResourceId'])) {
-        $this->storageResourceId = $vals['storageResourceId'];
-      }
-      if (isset($vals['fileAbsolutePath'])) {
-        $this->fileAbsolutePath = $vals['fileAbsolutePath'];
-      }
-      if (isset($vals['replicaMetadata'])) {
-        $this->replicaMetadata = $vals['replicaMetadata'];
-      }
-    }
-  }
-
-  public function getName() {
-    return 'DataReplicaLocationModel';
-  }
-
-  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->replicaId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 2:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->resourceId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 3:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->replicaName);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 4:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->replicaDescription);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 5:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->creationTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 6:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->lastModifiedTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 7:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->validUntilTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 8:
-          if ($ftype == TType::I32) {
-            $xfer += $input->readI32($this->replicaLocationCategory);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 9:
-          if ($ftype == TType::I32) {
-            $xfer += $input->readI32($this->replicaPersistentType);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 10:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->storageResourceId);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 11:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->fileAbsolutePath);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 12:
-          if ($ftype == TType::MAP) {
-            $this->replicaMetadata = array();
-            $_size23 = 0;
-            $_ktype24 = 0;
-            $_vtype25 = 0;
-            $xfer += $input->readMapBegin($_ktype24, $_vtype25, $_size23);
-            for ($_i27 = 0; $_i27 < $_size23; ++$_i27)
-            {
-              $key28 = '';
-              $val29 = '';
-              $xfer += $input->readString($key28);
-              $xfer += $input->readString($val29);
-              $this->replicaMetadata[$key28] = $val29;
-            }
-            $xfer += $input->readMapEnd();
-          } 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('DataReplicaLocationModel');
-    if ($this->replicaId !== null) {
-      $xfer += $output->writeFieldBegin('replicaId', TType::STRING, 1);
-      $xfer += $output->writeString($this->replicaId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->resourceId !== null) {
-      $xfer += $output->writeFieldBegin('resourceId', TType::STRING, 2);
-      $xfer += $output->writeString($this->resourceId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaName !== null) {
-      $xfer += $output->writeFieldBegin('replicaName', TType::STRING, 3);
-      $xfer += $output->writeString($this->replicaName);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaDescription !== null) {
-      $xfer += $output->writeFieldBegin('replicaDescription', TType::STRING, 4);
-      $xfer += $output->writeString($this->replicaDescription);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->creationTime !== null) {
-      $xfer += $output->writeFieldBegin('creationTime', TType::I64, 5);
-      $xfer += $output->writeI64($this->creationTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->lastModifiedTime !== null) {
-      $xfer += $output->writeFieldBegin('lastModifiedTime', TType::I64, 6);
-      $xfer += $output->writeI64($this->lastModifiedTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->validUntilTime !== null) {
-      $xfer += $output->writeFieldBegin('validUntilTime', TType::I64, 7);
-      $xfer += $output->writeI64($this->validUntilTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaLocationCategory !== null) {
-      $xfer += $output->writeFieldBegin('replicaLocationCategory', TType::I32, 8);
-      $xfer += $output->writeI32($this->replicaLocationCategory);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaPersistentType !== null) {
-      $xfer += $output->writeFieldBegin('replicaPersistentType', TType::I32, 9);
-      $xfer += $output->writeI32($this->replicaPersistentType);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->storageResourceId !== null) {
-      $xfer += $output->writeFieldBegin('storageResourceId', TType::STRING, 10);
-      $xfer += $output->writeString($this->storageResourceId);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->fileAbsolutePath !== null) {
-      $xfer += $output->writeFieldBegin('fileAbsolutePath', TType::STRING, 11);
-      $xfer += $output->writeString($this->fileAbsolutePath);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->replicaMetadata !== null) {
-      if (!is_array($this->replicaMetadata)) {
-        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
-      }
-      $xfer += $output->writeFieldBegin('replicaMetadata', TType::MAP, 12);
-      {
-        $output->writeMapBegin(TType::STRING, TType::STRING, count($this->replicaMetadata));
-        {
-          foreach ($this->replicaMetadata as $kiter30 => $viter31)
-          {
-            $xfer += $output->writeString($kiter30);
-            $xfer += $output->writeString($viter31);
-          }
-        }
-        $output->writeMapEnd();
-      }
-      $xfer += $output->writeFieldEnd();
-    }
-    $xfer += $output->writeFieldStop();
-    $xfer += $output->writeStructEnd();
-    return $xfer;
-  }
-
-}
-
-
diff --git a/app/libraries/Airavata/Model/Data/Transfer/Types.php b/app/libraries/Airavata/Model/Data/Transfer/Types.php
new file mode 100644
index 0000000..e8a211c
--- /dev/null
+++ b/app/libraries/Airavata/Model/Data/Transfer/Types.php
@@ -0,0 +1,890 @@
+<?php
+namespace Airavata\Model\Data\Transfer;
+
+/**
+ * Autogenerated by Thrift Compiler (0.9.3)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+use Thrift\Base\TBase;
+use Thrift\Type\TType;
+use Thrift\Type\TMessageType;
+use Thrift\Exception\TException;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Exception\TApplicationException;
+
+
+final class StorageResourceProtocol {
+  const SCP = 0;
+  const SFTP = 1;
+  const HTTP = 2;
+  const HTTPS = 3;
+  const GridFTP = 4;
+  const LOCAL = 5;
+  static public $__names = array(
+    0 => 'SCP',
+    1 => 'SFTP',
+    2 => 'HTTP',
+    3 => 'HTTPS',
+    4 => 'GridFTP',
+    5 => 'LOCAL',
+  );
+}
+
+final class LSEntryType {
+  const DIRECTORY = 0;
+  const FILE = 1;
+  static public $__names = array(
+    0 => 'DIRECTORY',
+    1 => 'FILE',
+  );
+}
+
+final class FileTransferMode {
+  const SYNC = 0;
+  const ASYNC = 1;
+  static public $__names = array(
+    0 => 'SYNC',
+    1 => 'ASYNC',
+  );
+}
+
+final class FileTransferStatus {
+  const CREATED = 0;
+  const QUEUED = 1;
+  const RUNNING = 2;
+  const COMPLETED = 3;
+  const FAILED = 4;
+  static public $__names = array(
+    0 => 'CREATED',
+    1 => 'QUEUED',
+    2 => 'RUNNING',
+    3 => 'COMPLETED',
+    4 => 'FAILED',
+  );
+}
+
+class FileTransferRequestModel {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $transferId = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $username = null;
+  /**
+   * @var string
+   */
+  public $srcHostname = null;
+  /**
+   * @var string
+   */
+  public $srcLoginName = null;
+  /**
+   * @var int
+   */
+  public $srcPort = null;
+  /**
+   * @var int
+   */
+  public $srcProtocol = null;
+  /**
+   * @var string
+   */
+  public $srcFilePath = null;
+  /**
+   * @var string
+   */
+  public $srcHostCredToken = null;
+  /**
+   * @var string
+   */
+  public $destHostname = null;
+  /**
+   * @var string
+   */
+  public $destLoginName = null;
+  /**
+   * @var int
+   */
+  public $destPort = null;
+  /**
+   * @var int
+   */
+  public $destProtocol = null;
+  /**
+   * @var string
+   */
+  public $destFilePath = null;
+  /**
+   * @var string
+   */
+  public $destHostCredToken = null;
+  /**
+   * @var int
+   */
+  public $fileTransferMode = null;
+  /**
+   * @var int
+   */
+  public $transferStatus = null;
+  /**
+   * @var int
+   */
+  public $fileSize = null;
+  /**
+   * @var int
+   */
+  public $transferTime = null;
+  /**
+   * @var int
+   */
+  public $createdTime = null;
+  /**
+   * @var int
+   */
+  public $lastModifiedType = null;
+  /**
+   * @var string[]
+   */
+  public $callbackEmails = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'transferId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'username',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'srcHostname',
+          'type' => TType::STRING,
+          ),
+        5 => array(
+          'var' => 'srcLoginName',
+          'type' => TType::STRING,
+          ),
+        6 => array(
+          'var' => 'srcPort',
+          'type' => TType::I64,
+          ),
+        7 => array(
+          'var' => 'srcProtocol',
+          'type' => TType::I32,
+          ),
+        8 => array(
+          'var' => 'srcFilePath',
+          'type' => TType::STRING,
+          ),
+        9 => array(
+          'var' => 'srcHostCredToken',
+          'type' => TType::STRING,
+          ),
+        10 => array(
+          'var' => 'destHostname',
+          'type' => TType::STRING,
+          ),
+        11 => array(
+          'var' => 'destLoginName',
+          'type' => TType::STRING,
+          ),
+        12 => array(
+          'var' => 'destPort',
+          'type' => TType::I64,
+          ),
+        13 => array(
+          'var' => 'destProtocol',
+          'type' => TType::I32,
+          ),
+        14 => array(
+          'var' => 'destFilePath',
+          'type' => TType::STRING,
+          ),
+        15 => array(
+          'var' => 'destHostCredToken',
+          'type' => TType::STRING,
+          ),
+        16 => array(
+          'var' => 'fileTransferMode',
+          'type' => TType::I32,
+          ),
+        17 => array(
+          'var' => 'transferStatus',
+          'type' => TType::I32,
+          ),
+        18 => array(
+          'var' => 'fileSize',
+          'type' => TType::I64,
+          ),
+        19 => array(
+          'var' => 'transferTime',
+          'type' => TType::I64,
+          ),
+        20 => array(
+          'var' => 'createdTime',
+          'type' => TType::I64,
+          ),
+        21 => array(
+          'var' => 'lastModifiedType',
+          'type' => TType::I64,
+          ),
+        22 => array(
+          'var' => 'callbackEmails',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['transferId'])) {
+        $this->transferId = $vals['transferId'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['username'])) {
+        $this->username = $vals['username'];
+      }
+      if (isset($vals['srcHostname'])) {
+        $this->srcHostname = $vals['srcHostname'];
+      }
+      if (isset($vals['srcLoginName'])) {
+        $this->srcLoginName = $vals['srcLoginName'];
+      }
+      if (isset($vals['srcPort'])) {
+        $this->srcPort = $vals['srcPort'];
+      }
+      if (isset($vals['srcProtocol'])) {
+        $this->srcProtocol = $vals['srcProtocol'];
+      }
+      if (isset($vals['srcFilePath'])) {
+        $this->srcFilePath = $vals['srcFilePath'];
+      }
+      if (isset($vals['srcHostCredToken'])) {
+        $this->srcHostCredToken = $vals['srcHostCredToken'];
+      }
+      if (isset($vals['destHostname'])) {
+        $this->destHostname = $vals['destHostname'];
+      }
+      if (isset($vals['destLoginName'])) {
+        $this->destLoginName = $vals['destLoginName'];
+      }
+      if (isset($vals['destPort'])) {
+        $this->destPort = $vals['destPort'];
+      }
+      if (isset($vals['destProtocol'])) {
+        $this->destProtocol = $vals['destProtocol'];
+      }
+      if (isset($vals['destFilePath'])) {
+        $this->destFilePath = $vals['destFilePath'];
+      }
+      if (isset($vals['destHostCredToken'])) {
+        $this->destHostCredToken = $vals['destHostCredToken'];
+      }
+      if (isset($vals['fileTransferMode'])) {
+        $this->fileTransferMode = $vals['fileTransferMode'];
+      }
+      if (isset($vals['transferStatus'])) {
+        $this->transferStatus = $vals['transferStatus'];
+      }
+      if (isset($vals['fileSize'])) {
+        $this->fileSize = $vals['fileSize'];
+      }
+      if (isset($vals['transferTime'])) {
+        $this->transferTime = $vals['transferTime'];
+      }
+      if (isset($vals['createdTime'])) {
+        $this->createdTime = $vals['createdTime'];
+      }
+      if (isset($vals['lastModifiedType'])) {
+        $this->lastModifiedType = $vals['lastModifiedType'];
+      }
+      if (isset($vals['callbackEmails'])) {
+        $this->callbackEmails = $vals['callbackEmails'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'FileTransferRequestModel';
+  }
+
+  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->transferId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->username);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->srcHostname);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->srcLoginName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->srcPort);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->srcProtocol);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->srcFilePath);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->srcHostCredToken);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 10:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->destHostname);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 11:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->destLoginName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 12:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->destPort);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 13:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->destProtocol);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 14:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->destFilePath);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 15:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->destHostCredToken);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 16:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->fileTransferMode);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 17:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->transferStatus);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 18:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->fileSize);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 19:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->transferTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 20:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->createdTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 21:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->lastModifiedType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 22:
+          if ($ftype == TType::LST) {
+            $this->callbackEmails = array();
+            $_size0 = 0;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $xfer += $input->readString($elem5);
+              $this->callbackEmails []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } 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('FileTransferRequestModel');
+    if ($this->transferId !== null) {
+      $xfer += $output->writeFieldBegin('transferId', TType::STRING, 1);
+      $xfer += $output->writeString($this->transferId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->username !== null) {
+      $xfer += $output->writeFieldBegin('username', TType::STRING, 3);
+      $xfer += $output->writeString($this->username);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcHostname !== null) {
+      $xfer += $output->writeFieldBegin('srcHostname', TType::STRING, 4);
+      $xfer += $output->writeString($this->srcHostname);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcLoginName !== null) {
+      $xfer += $output->writeFieldBegin('srcLoginName', TType::STRING, 5);
+      $xfer += $output->writeString($this->srcLoginName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcPort !== null) {
+      $xfer += $output->writeFieldBegin('srcPort', TType::I64, 6);
+      $xfer += $output->writeI64($this->srcPort);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcProtocol !== null) {
+      $xfer += $output->writeFieldBegin('srcProtocol', TType::I32, 7);
+      $xfer += $output->writeI32($this->srcProtocol);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcFilePath !== null) {
+      $xfer += $output->writeFieldBegin('srcFilePath', TType::STRING, 8);
+      $xfer += $output->writeString($this->srcFilePath);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->srcHostCredToken !== null) {
+      $xfer += $output->writeFieldBegin('srcHostCredToken', TType::STRING, 9);
+      $xfer += $output->writeString($this->srcHostCredToken);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destHostname !== null) {
+      $xfer += $output->writeFieldBegin('destHostname', TType::STRING, 10);
+      $xfer += $output->writeString($this->destHostname);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destLoginName !== null) {
+      $xfer += $output->writeFieldBegin('destLoginName', TType::STRING, 11);
+      $xfer += $output->writeString($this->destLoginName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destPort !== null) {
+      $xfer += $output->writeFieldBegin('destPort', TType::I64, 12);
+      $xfer += $output->writeI64($this->destPort);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destProtocol !== null) {
+      $xfer += $output->writeFieldBegin('destProtocol', TType::I32, 13);
+      $xfer += $output->writeI32($this->destProtocol);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destFilePath !== null) {
+      $xfer += $output->writeFieldBegin('destFilePath', TType::STRING, 14);
+      $xfer += $output->writeString($this->destFilePath);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->destHostCredToken !== null) {
+      $xfer += $output->writeFieldBegin('destHostCredToken', TType::STRING, 15);
+      $xfer += $output->writeString($this->destHostCredToken);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileTransferMode !== null) {
+      $xfer += $output->writeFieldBegin('fileTransferMode', TType::I32, 16);
+      $xfer += $output->writeI32($this->fileTransferMode);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->transferStatus !== null) {
+      $xfer += $output->writeFieldBegin('transferStatus', TType::I32, 17);
+      $xfer += $output->writeI32($this->transferStatus);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->fileSize !== null) {
+      $xfer += $output->writeFieldBegin('fileSize', TType::I64, 18);
+      $xfer += $output->writeI64($this->fileSize);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->transferTime !== null) {
+      $xfer += $output->writeFieldBegin('transferTime', TType::I64, 19);
+      $xfer += $output->writeI64($this->transferTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->createdTime !== null) {
+      $xfer += $output->writeFieldBegin('createdTime', TType::I64, 20);
+      $xfer += $output->writeI64($this->createdTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->lastModifiedType !== null) {
+      $xfer += $output->writeFieldBegin('lastModifiedType', TType::I64, 21);
+      $xfer += $output->writeI64($this->lastModifiedType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->callbackEmails !== null) {
+      if (!is_array($this->callbackEmails)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('callbackEmails', TType::LST, 22);
+      {
+        $output->writeListBegin(TType::STRING, count($this->callbackEmails));
+        {
+          foreach ($this->callbackEmails as $iter6)
+          {
+            $xfer += $output->writeString($iter6);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class LSEntryModel {
+  static $_TSPEC;
+
+  /**
+   * @var int
+   */
+  public $type = null;
+  /**
+   * @var int
+   */
+  public $size = null;
+  /**
+   * @var string
+   */
+  public $nativeType = null;
+  /**
+   * @var string
+   */
+  public $name = null;
+  /**
+   * @var string
+   */
+  public $path = null;
+  /**
+   * @var string
+   */
+  public $storageHostName = null;
+  /**
+   * @var int
+   */
+  public $lastModifiedType = null;
+  /**
+   * @var int
+   */
+  public $createdTime = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'type',
+          'type' => TType::I32,
+          ),
+        2 => array(
+          'var' => 'size',
+          'type' => TType::I64,
+          ),
+        3 => array(
+          'var' => 'nativeType',
+          'type' => TType::STRING,
+          ),
+        4 => array(
+          'var' => 'name',
+          'type' => TType::STRING,
+          ),
+        5 => array(
+          'var' => 'path',
+          'type' => TType::STRING,
+          ),
+        6 => array(
+          'var' => 'storageHostName',
+          'type' => TType::STRING,
+          ),
+        7 => array(
+          'var' => 'lastModifiedType',
+          'type' => TType::I64,
+          ),
+        8 => array(
+          'var' => 'createdTime',
+          'type' => TType::I64,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['type'])) {
+        $this->type = $vals['type'];
+      }
+      if (isset($vals['size'])) {
+        $this->size = $vals['size'];
+      }
+      if (isset($vals['nativeType'])) {
+        $this->nativeType = $vals['nativeType'];
+      }
+      if (isset($vals['name'])) {
+        $this->name = $vals['name'];
+      }
+      if (isset($vals['path'])) {
+        $this->path = $vals['path'];
+      }
+      if (isset($vals['storageHostName'])) {
+        $this->storageHostName = $vals['storageHostName'];
+      }
+      if (isset($vals['lastModifiedType'])) {
+        $this->lastModifiedType = $vals['lastModifiedType'];
+      }
+      if (isset($vals['createdTime'])) {
+        $this->createdTime = $vals['createdTime'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'LSEntryModel';
+  }
+
+  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::I32) {
+            $xfer += $input->readI32($this->type);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->size);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->nativeType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->name);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->path);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->storageHostName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 7:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->lastModifiedType);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 8:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->createdTime);
+          } 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('LSEntryModel');
+    if ($this->type !== null) {
+      $xfer += $output->writeFieldBegin('type', TType::I32, 1);
+      $xfer += $output->writeI32($this->type);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->size !== null) {
+      $xfer += $output->writeFieldBegin('size', TType::I64, 2);
+      $xfer += $output->writeI64($this->size);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->nativeType !== null) {
+      $xfer += $output->writeFieldBegin('nativeType', TType::STRING, 3);
+      $xfer += $output->writeString($this->nativeType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->name !== null) {
+      $xfer += $output->writeFieldBegin('name', TType::STRING, 4);
+      $xfer += $output->writeString($this->name);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->path !== null) {
+      $xfer += $output->writeFieldBegin('path', TType::STRING, 5);
+      $xfer += $output->writeString($this->path);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->storageHostName !== null) {
+      $xfer += $output->writeFieldBegin('storageHostName', TType::STRING, 6);
+      $xfer += $output->writeString($this->storageHostName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->lastModifiedType !== null) {
+      $xfer += $output->writeFieldBegin('lastModifiedType', TType::I64, 7);
+      $xfer += $output->writeI64($this->lastModifiedType);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->createdTime !== null) {
+      $xfer += $output->writeFieldBegin('createdTime', TType::I64, 8);
+      $xfer += $output->writeI64($this->createdTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+
diff --git a/app/libraries/CommonUtilities.php b/app/libraries/CommonUtilities.php
index 4c55d7b..d79ee5d 100644
--- a/app/libraries/CommonUtilities.php
+++ b/app/libraries/CommonUtilities.php
@@ -112,6 +112,10 @@
                 (
                     array('label' => 'Create', 'url' => URL::to('/') . '/experiment/create', "nav-active" => "experiment"),
                     array('label' => 'Browse', 'url' => URL::to('/') . '/experiment/browse', "nav-active" => "experiment")
+                ),
+                'Data' => array
+                (
+                    array('label' => 'Browse', 'url' => URL::to('/') . '/data/browse', "nav-active" => "experiment")
                 )
             );
 
diff --git a/app/routes.php b/app/routes.php
index c32dd48..b394190 100755
--- a/app/routes.php
+++ b/app/routes.php
@@ -1,5 +1,11 @@
 <?php
 
+
+/**
+ * Data Manager Related Routes
+ */
+Route::get("data/browse", "DataController@browseView");
+
 /*
 |--------------------------------------------------------------------------
 | Application Routes
diff --git a/app/views/data/browse.blade.php b/app/views/data/browse.blade.php
new file mode 100644
index 0000000..0d92e7c
--- /dev/null
+++ b/app/views/data/browse.blade.php
@@ -0,0 +1,35 @@
+@extends('layout.basic')
+
+@section('page-header')
+    @parent
+@stop
+
+@section('content')
+    <br/>
+    <div class="container" style="max-width: 60%;">
+        @foreach( $metadataModels as $index => $metadataModel )
+        <div>
+            <div><a href="">{{$metadataModel->userFriendlyName}}</a></div>
+            <div>
+
+            </div>
+            <div>
+                <span><a href="">{{$metadataModel->username}}</a></span> |
+                <span>2016-01-05 02:22</span> |
+                <span>ID: {{$metadataModel->metadataId}}</span> |
+                <span>{{$metadataModel->size/1024}} MB</span>
+            </div>
+            <div>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
+            </div>
+        </div>
+        <hr/>
+        @endforeach
+    </div>
+@stop
+
+@section('scripts')
+    @parent
+@stop
\ No newline at end of file
