diff --git a/app/libraries/Airavata/API/Airavata.php b/app/libraries/Airavata/API/Airavata.php
index a296cec..c522dd1 100644
--- a/app/libraries/Airavata/API/Airavata.php
+++ b/app/libraries/Airavata/API/Airavata.php
@@ -533,6 +533,12 @@
    * @param resourceHostName
    *       Hostname id substring with which to further filter statistics.
    * 
+   * @param limit
+   *       Amount of results to be fetched.
+   * 
+   * @param offset
+   *       The starting point of the results to be fetched.
+   * 
    * 
    * 
    * @param \Airavata\Model\Security\AuthzToken $authzToken
@@ -542,13 +548,15 @@
    * @param string $userName
    * @param string $applicationName
    * @param string $resourceHostName
+   * @param int $limit
+   * @param int $offset
    * @return \Airavata\Model\Experiment\ExperimentStatistics
    * @throws \Airavata\API\Error\InvalidRequestException
    * @throws \Airavata\API\Error\AiravataClientException
    * @throws \Airavata\API\Error\AiravataSystemException
    * @throws \Airavata\API\Error\AuthorizationException
    */
-  public function getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName);
+  public function getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName, $limit, $offset);
   /**
    * 
    * Get All Experiments of the Project
@@ -1088,6 +1096,53 @@
    */
   public function getIntermediateOutputs(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId);
   /**
+   * Request fetching of output files for an experiment that is still executing.
+   * This method results in a new Process being created for the Experiment with
+   * tasks for fetching each output file.
+   * 
+   * @param authzToken
+   * 
+   * @param airavataExperimentId
+   *     Experiment ID of the experiment
+   * 
+   * @param outputNames
+   *     List of names of the experiment's outputs to fetch.
+   * 
+   * 
+   * @param \Airavata\Model\Security\AuthzToken $authzToken
+   * @param string $airavataExperimentId
+   * @param string[] $outputNames
+   * @throws \Airavata\API\Error\InvalidRequestException
+   * @throws \Airavata\API\Error\ExperimentNotFoundException
+   * @throws \Airavata\API\Error\AiravataClientException
+   * @throws \Airavata\API\Error\AiravataSystemException
+   * @throws \Airavata\API\Error\AuthorizationException
+   */
+  public function fetchIntermediateOutputs(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames);
+  /**
+   * Get the status of the most recent intermediate output fetching process for the given output names.
+   * 
+   * @param authzToken
+   * 
+   * @param airavataExperimentId
+   *     Experiment ID of the experiment
+   * 
+   * @param outputNames
+   *     List of names of the experiment's outputs to fetch.
+   * 
+   * 
+   * @param \Airavata\Model\Security\AuthzToken $authzToken
+   * @param string $airavataExperimentId
+   * @param string[] $outputNames
+   * @return \Airavata\Model\Status\ProcessStatus
+   * @throws \Airavata\API\Error\InvalidRequestException
+   * @throws \Airavata\API\Error\ExperimentNotFoundException
+   * @throws \Airavata\API\Error\AiravataClientException
+   * @throws \Airavata\API\Error\AiravataSystemException
+   * @throws \Airavata\API\Error\AuthorizationException
+   */
+  public function getIntermediateOutputProcessStatus(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames);
+  /**
    * 
    * Get Job Statuses for an Experiment
    * This method to be used when need to get the job status of an Experiment. An experiment may have one or many jobs; there for one or many job statuses may turnup
@@ -6022,13 +6077,13 @@
     throw new \Exception("searchExperiments failed: unknown result");
   }
 
-  public function getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName)
+  public function getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName, $limit, $offset)
   {
-    $this->send_getExperimentStatistics($authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName);
+    $this->send_getExperimentStatistics($authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName, $limit, $offset);
     return $this->recv_getExperimentStatistics();
   }
 
-  public function send_getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName)
+  public function send_getExperimentStatistics(\Airavata\Model\Security\AuthzToken $authzToken, $gatewayId, $fromTime, $toTime, $userName, $applicationName, $resourceHostName, $limit, $offset)
   {
     $args = new \Airavata\API\Airavata_getExperimentStatistics_args();
     $args->authzToken = $authzToken;
@@ -6038,6 +6093,8 @@
     $args->userName = $userName;
     $args->applicationName = $applicationName;
     $args->resourceHostName = $resourceHostName;
+    $args->limit = $limit;
+    $args->offset = $offset;
     $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
     if ($bin_accel)
     {
@@ -7061,6 +7118,139 @@
     throw new \Exception("getIntermediateOutputs failed: unknown result");
   }
 
+  public function fetchIntermediateOutputs(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames)
+  {
+    $this->send_fetchIntermediateOutputs($authzToken, $airavataExperimentId, $outputNames);
+    $this->recv_fetchIntermediateOutputs();
+  }
+
+  public function send_fetchIntermediateOutputs(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames)
+  {
+    $args = new \Airavata\API\Airavata_fetchIntermediateOutputs_args();
+    $args->authzToken = $authzToken;
+    $args->airavataExperimentId = $airavataExperimentId;
+    $args->outputNames = $outputNames;
+    $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
+    if ($bin_accel)
+    {
+      thrift_protocol_write_binary($this->output_, 'fetchIntermediateOutputs', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
+    }
+    else
+    {
+      $this->output_->writeMessageBegin('fetchIntermediateOutputs', TMessageType::CALL, $this->seqid_);
+      $args->write($this->output_);
+      $this->output_->writeMessageEnd();
+      $this->output_->getTransport()->flush();
+    }
+  }
+
+  public function recv_fetchIntermediateOutputs()
+  {
+    $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
+    if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Airavata\API\Airavata_fetchIntermediateOutputs_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\API\Airavata_fetchIntermediateOutputs_result();
+      $result->read($this->input_);
+      $this->input_->readMessageEnd();
+    }
+    if ($result->ire !== null) {
+      throw $result->ire;
+    }
+    if ($result->enf !== null) {
+      throw $result->enf;
+    }
+    if ($result->ace !== null) {
+      throw $result->ace;
+    }
+    if ($result->ase !== null) {
+      throw $result->ase;
+    }
+    if ($result->ae !== null) {
+      throw $result->ae;
+    }
+    return;
+  }
+
+  public function getIntermediateOutputProcessStatus(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames)
+  {
+    $this->send_getIntermediateOutputProcessStatus($authzToken, $airavataExperimentId, $outputNames);
+    return $this->recv_getIntermediateOutputProcessStatus();
+  }
+
+  public function send_getIntermediateOutputProcessStatus(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId, array $outputNames)
+  {
+    $args = new \Airavata\API\Airavata_getIntermediateOutputProcessStatus_args();
+    $args->authzToken = $authzToken;
+    $args->airavataExperimentId = $airavataExperimentId;
+    $args->outputNames = $outputNames;
+    $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
+    if ($bin_accel)
+    {
+      thrift_protocol_write_binary($this->output_, 'getIntermediateOutputProcessStatus', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
+    }
+    else
+    {
+      $this->output_->writeMessageBegin('getIntermediateOutputProcessStatus', TMessageType::CALL, $this->seqid_);
+      $args->write($this->output_);
+      $this->output_->writeMessageEnd();
+      $this->output_->getTransport()->flush();
+    }
+  }
+
+  public function recv_getIntermediateOutputProcessStatus()
+  {
+    $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
+    if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Airavata\API\Airavata_getIntermediateOutputProcessStatus_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\API\Airavata_getIntermediateOutputProcessStatus_result();
+      $result->read($this->input_);
+      $this->input_->readMessageEnd();
+    }
+    if ($result->success !== null) {
+      return $result->success;
+    }
+    if ($result->ire !== null) {
+      throw $result->ire;
+    }
+    if ($result->enf !== null) {
+      throw $result->enf;
+    }
+    if ($result->ace !== null) {
+      throw $result->ace;
+    }
+    if ($result->ase !== null) {
+      throw $result->ase;
+    }
+    if ($result->ae !== null) {
+      throw $result->ae;
+    }
+    throw new \Exception("getIntermediateOutputProcessStatus failed: unknown result");
+  }
+
   public function getJobStatuses(\Airavata\Model\Security\AuthzToken $authzToken, $airavataExperimentId)
   {
     $this->send_getJobStatuses($authzToken, $airavataExperimentId);
@@ -24686,6 +24876,14 @@
    * @var string
    */
   public $resourceHostName = null;
+  /**
+   * @var int
+   */
+  public $limit = 50;
+  /**
+   * @var int
+   */
+  public $offset = 0;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -24719,6 +24917,14 @@
           'var' => 'resourceHostName',
           'type' => TType::STRING,
           ),
+        8 => array(
+          'var' => 'limit',
+          'type' => TType::I32,
+          ),
+        9 => array(
+          'var' => 'offset',
+          'type' => TType::I32,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -24743,6 +24949,12 @@
       if (isset($vals['resourceHostName'])) {
         $this->resourceHostName = $vals['resourceHostName'];
       }
+      if (isset($vals['limit'])) {
+        $this->limit = $vals['limit'];
+      }
+      if (isset($vals['offset'])) {
+        $this->offset = $vals['offset'];
+      }
     }
   }
 
@@ -24815,6 +25027,20 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 8:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->limit);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 9:
+          if ($ftype == TType::I32) {
+            $xfer += $input->readI32($this->offset);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -24866,6 +25092,16 @@
       $xfer += $output->writeString($this->resourceHostName);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->limit !== null) {
+      $xfer += $output->writeFieldBegin('limit', TType::I32, 8);
+      $xfer += $output->writeI32($this->limit);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->offset !== null) {
+      $xfer += $output->writeFieldBegin('offset', TType::I32, 9);
+      $xfer += $output->writeI32($this->offset);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
@@ -29613,6 +29849,692 @@
 
 }
 
+class Airavata_fetchIntermediateOutputs_args {
+  static $_TSPEC;
+
+  /**
+   * @var \Airavata\Model\Security\AuthzToken
+   */
+  public $authzToken = null;
+  /**
+   * @var string
+   */
+  public $airavataExperimentId = null;
+  /**
+   * @var string[]
+   */
+  public $outputNames = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'authzToken',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\Model\Security\AuthzToken',
+          ),
+        2 => array(
+          'var' => 'airavataExperimentId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'outputNames',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['authzToken'])) {
+        $this->authzToken = $vals['authzToken'];
+      }
+      if (isset($vals['airavataExperimentId'])) {
+        $this->airavataExperimentId = $vals['airavataExperimentId'];
+      }
+      if (isset($vals['outputNames'])) {
+        $this->outputNames = $vals['outputNames'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'Airavata_fetchIntermediateOutputs_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::STRUCT) {
+            $this->authzToken = new \Airavata\Model\Security\AuthzToken();
+            $xfer += $this->authzToken->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->airavataExperimentId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::LST) {
+            $this->outputNames = array();
+            $_size95 = 0;
+            $_etype98 = 0;
+            $xfer += $input->readListBegin($_etype98, $_size95);
+            for ($_i99 = 0; $_i99 < $_size95; ++$_i99)
+            {
+              $elem100 = null;
+              $xfer += $input->readString($elem100);
+              $this->outputNames []= $elem100;
+            }
+            $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('Airavata_fetchIntermediateOutputs_args');
+    if ($this->authzToken !== null) {
+      if (!is_object($this->authzToken)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('authzToken', TType::STRUCT, 1);
+      $xfer += $this->authzToken->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->airavataExperimentId !== null) {
+      $xfer += $output->writeFieldBegin('airavataExperimentId', TType::STRING, 2);
+      $xfer += $output->writeString($this->airavataExperimentId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->outputNames !== null) {
+      if (!is_array($this->outputNames)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('outputNames', TType::LST, 3);
+      {
+        $output->writeListBegin(TType::STRING, count($this->outputNames));
+        {
+          foreach ($this->outputNames as $iter101)
+          {
+            $xfer += $output->writeString($iter101);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class Airavata_fetchIntermediateOutputs_result {
+  static $_TSPEC;
+
+  /**
+   * @var \Airavata\API\Error\InvalidRequestException
+   */
+  public $ire = null;
+  /**
+   * @var \Airavata\API\Error\ExperimentNotFoundException
+   */
+  public $enf = null;
+  /**
+   * @var \Airavata\API\Error\AiravataClientException
+   */
+  public $ace = null;
+  /**
+   * @var \Airavata\API\Error\AiravataSystemException
+   */
+  public $ase = null;
+  /**
+   * @var \Airavata\API\Error\AuthorizationException
+   */
+  public $ae = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'ire',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\InvalidRequestException',
+          ),
+        2 => array(
+          'var' => 'enf',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\ExperimentNotFoundException',
+          ),
+        3 => array(
+          'var' => 'ace',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AiravataClientException',
+          ),
+        4 => array(
+          'var' => 'ase',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AiravataSystemException',
+          ),
+        5 => array(
+          'var' => 'ae',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AuthorizationException',
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['ire'])) {
+        $this->ire = $vals['ire'];
+      }
+      if (isset($vals['enf'])) {
+        $this->enf = $vals['enf'];
+      }
+      if (isset($vals['ace'])) {
+        $this->ace = $vals['ace'];
+      }
+      if (isset($vals['ase'])) {
+        $this->ase = $vals['ase'];
+      }
+      if (isset($vals['ae'])) {
+        $this->ae = $vals['ae'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'Airavata_fetchIntermediateOutputs_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 1:
+          if ($ftype == TType::STRUCT) {
+            $this->ire = new \Airavata\API\Error\InvalidRequestException();
+            $xfer += $this->ire->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRUCT) {
+            $this->enf = new \Airavata\API\Error\ExperimentNotFoundException();
+            $xfer += $this->enf->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRUCT) {
+            $this->ace = new \Airavata\API\Error\AiravataClientException();
+            $xfer += $this->ace->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRUCT) {
+            $this->ase = new \Airavata\API\Error\AiravataSystemException();
+            $xfer += $this->ase->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRUCT) {
+            $this->ae = new \Airavata\API\Error\AuthorizationException();
+            $xfer += $this->ae->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('Airavata_fetchIntermediateOutputs_result');
+    if ($this->ire !== null) {
+      $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+      $xfer += $this->ire->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->enf !== null) {
+      $xfer += $output->writeFieldBegin('enf', TType::STRUCT, 2);
+      $xfer += $this->enf->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ace !== null) {
+      $xfer += $output->writeFieldBegin('ace', TType::STRUCT, 3);
+      $xfer += $this->ace->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ase !== null) {
+      $xfer += $output->writeFieldBegin('ase', TType::STRUCT, 4);
+      $xfer += $this->ase->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ae !== null) {
+      $xfer += $output->writeFieldBegin('ae', TType::STRUCT, 5);
+      $xfer += $this->ae->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class Airavata_getIntermediateOutputProcessStatus_args {
+  static $_TSPEC;
+
+  /**
+   * @var \Airavata\Model\Security\AuthzToken
+   */
+  public $authzToken = null;
+  /**
+   * @var string
+   */
+  public $airavataExperimentId = null;
+  /**
+   * @var string[]
+   */
+  public $outputNames = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'authzToken',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\Model\Security\AuthzToken',
+          ),
+        2 => array(
+          'var' => 'airavataExperimentId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'outputNames',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['authzToken'])) {
+        $this->authzToken = $vals['authzToken'];
+      }
+      if (isset($vals['airavataExperimentId'])) {
+        $this->airavataExperimentId = $vals['airavataExperimentId'];
+      }
+      if (isset($vals['outputNames'])) {
+        $this->outputNames = $vals['outputNames'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'Airavata_getIntermediateOutputProcessStatus_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::STRUCT) {
+            $this->authzToken = new \Airavata\Model\Security\AuthzToken();
+            $xfer += $this->authzToken->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->airavataExperimentId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::LST) {
+            $this->outputNames = array();
+            $_size102 = 0;
+            $_etype105 = 0;
+            $xfer += $input->readListBegin($_etype105, $_size102);
+            for ($_i106 = 0; $_i106 < $_size102; ++$_i106)
+            {
+              $elem107 = null;
+              $xfer += $input->readString($elem107);
+              $this->outputNames []= $elem107;
+            }
+            $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('Airavata_getIntermediateOutputProcessStatus_args');
+    if ($this->authzToken !== null) {
+      if (!is_object($this->authzToken)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('authzToken', TType::STRUCT, 1);
+      $xfer += $this->authzToken->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->airavataExperimentId !== null) {
+      $xfer += $output->writeFieldBegin('airavataExperimentId', TType::STRING, 2);
+      $xfer += $output->writeString($this->airavataExperimentId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->outputNames !== null) {
+      if (!is_array($this->outputNames)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('outputNames', TType::LST, 3);
+      {
+        $output->writeListBegin(TType::STRING, count($this->outputNames));
+        {
+          foreach ($this->outputNames as $iter108)
+          {
+            $xfer += $output->writeString($iter108);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
+class Airavata_getIntermediateOutputProcessStatus_result {
+  static $_TSPEC;
+
+  /**
+   * @var \Airavata\Model\Status\ProcessStatus
+   */
+  public $success = null;
+  /**
+   * @var \Airavata\API\Error\InvalidRequestException
+   */
+  public $ire = null;
+  /**
+   * @var \Airavata\API\Error\ExperimentNotFoundException
+   */
+  public $enf = null;
+  /**
+   * @var \Airavata\API\Error\AiravataClientException
+   */
+  public $ace = null;
+  /**
+   * @var \Airavata\API\Error\AiravataSystemException
+   */
+  public $ase = null;
+  /**
+   * @var \Airavata\API\Error\AuthorizationException
+   */
+  public $ae = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        0 => array(
+          'var' => 'success',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\Model\Status\ProcessStatus',
+          ),
+        1 => array(
+          'var' => 'ire',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\InvalidRequestException',
+          ),
+        2 => array(
+          'var' => 'enf',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\ExperimentNotFoundException',
+          ),
+        3 => array(
+          'var' => 'ace',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AiravataClientException',
+          ),
+        4 => array(
+          'var' => 'ase',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AiravataSystemException',
+          ),
+        5 => array(
+          'var' => 'ae',
+          'type' => TType::STRUCT,
+          'class' => '\Airavata\API\Error\AuthorizationException',
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['success'])) {
+        $this->success = $vals['success'];
+      }
+      if (isset($vals['ire'])) {
+        $this->ire = $vals['ire'];
+      }
+      if (isset($vals['enf'])) {
+        $this->enf = $vals['enf'];
+      }
+      if (isset($vals['ace'])) {
+        $this->ace = $vals['ace'];
+      }
+      if (isset($vals['ase'])) {
+        $this->ase = $vals['ase'];
+      }
+      if (isset($vals['ae'])) {
+        $this->ae = $vals['ae'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'Airavata_getIntermediateOutputProcessStatus_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::STRUCT) {
+            $this->success = new \Airavata\Model\Status\ProcessStatus();
+            $xfer += $this->success->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 1:
+          if ($ftype == TType::STRUCT) {
+            $this->ire = new \Airavata\API\Error\InvalidRequestException();
+            $xfer += $this->ire->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRUCT) {
+            $this->enf = new \Airavata\API\Error\ExperimentNotFoundException();
+            $xfer += $this->enf->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRUCT) {
+            $this->ace = new \Airavata\API\Error\AiravataClientException();
+            $xfer += $this->ace->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::STRUCT) {
+            $this->ase = new \Airavata\API\Error\AiravataSystemException();
+            $xfer += $this->ase->read($input);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::STRUCT) {
+            $this->ae = new \Airavata\API\Error\AuthorizationException();
+            $xfer += $this->ae->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('Airavata_getIntermediateOutputProcessStatus_result');
+    if ($this->success !== null) {
+      if (!is_object($this->success)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('success', TType::STRUCT, 0);
+      $xfer += $this->success->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ire !== null) {
+      $xfer += $output->writeFieldBegin('ire', TType::STRUCT, 1);
+      $xfer += $this->ire->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->enf !== null) {
+      $xfer += $output->writeFieldBegin('enf', TType::STRUCT, 2);
+      $xfer += $this->enf->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ace !== null) {
+      $xfer += $output->writeFieldBegin('ace', TType::STRUCT, 3);
+      $xfer += $this->ace->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ase !== null) {
+      $xfer += $output->writeFieldBegin('ase', TType::STRUCT, 4);
+      $xfer += $this->ase->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->ae !== null) {
+      $xfer += $output->writeFieldBegin('ae', TType::STRUCT, 5);
+      $xfer += $this->ae->write($output);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class Airavata_getJobStatuses_args {
   static $_TSPEC;
 
@@ -29831,18 +30753,18 @@
         case 0:
           if ($ftype == TType::MAP) {
             $this->success = array();
-            $_size95 = 0;
-            $_ktype96 = 0;
-            $_vtype97 = 0;
-            $xfer += $input->readMapBegin($_ktype96, $_vtype97, $_size95);
-            for ($_i99 = 0; $_i99 < $_size95; ++$_i99)
+            $_size109 = 0;
+            $_ktype110 = 0;
+            $_vtype111 = 0;
+            $xfer += $input->readMapBegin($_ktype110, $_vtype111, $_size109);
+            for ($_i113 = 0; $_i113 < $_size109; ++$_i113)
             {
-              $key100 = '';
-              $val101 = new \Airavata\Model\Status\JobStatus();
-              $xfer += $input->readString($key100);
-              $val101 = new \Airavata\Model\Status\JobStatus();
-              $xfer += $val101->read($input);
-              $this->success[$key100] = $val101;
+              $key114 = '';
+              $val115 = new \Airavata\Model\Status\JobStatus();
+              $xfer += $input->readString($key114);
+              $val115 = new \Airavata\Model\Status\JobStatus();
+              $xfer += $val115->read($input);
+              $this->success[$key114] = $val115;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -29910,10 +30832,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $kiter102 => $viter103)
+          foreach ($this->success as $kiter116 => $viter117)
           {
-            $xfer += $output->writeString($kiter102);
-            $xfer += $viter103->write($output);
+            $xfer += $output->writeString($kiter116);
+            $xfer += $viter117->write($output);
           }
         }
         $output->writeMapEnd();
@@ -30166,15 +31088,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size104 = 0;
-            $_etype107 = 0;
-            $xfer += $input->readListBegin($_etype107, $_size104);
-            for ($_i108 = 0; $_i108 < $_size104; ++$_i108)
+            $_size118 = 0;
+            $_etype121 = 0;
+            $xfer += $input->readListBegin($_etype121, $_size118);
+            for ($_i122 = 0; $_i122 < $_size118; ++$_i122)
             {
-              $elem109 = null;
-              $elem109 = new \Airavata\Model\Job\JobModel();
-              $xfer += $elem109->read($input);
-              $this->success []= $elem109;
+              $elem123 = null;
+              $elem123 = new \Airavata\Model\Job\JobModel();
+              $xfer += $elem123->read($input);
+              $this->success []= $elem123;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -30242,9 +31164,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter110)
+          foreach ($this->success as $iter124)
           {
-            $xfer += $iter110->write($output);
+            $xfer += $iter124->write($output);
           }
         }
         $output->writeListEnd();
@@ -32431,15 +33353,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size111 = 0;
-            $_etype114 = 0;
-            $xfer += $input->readListBegin($_etype114, $_size111);
-            for ($_i115 = 0; $_i115 < $_size111; ++$_i115)
+            $_size125 = 0;
+            $_etype128 = 0;
+            $xfer += $input->readListBegin($_etype128, $_size125);
+            for ($_i129 = 0; $_i129 < $_size125; ++$_i129)
             {
-              $elem116 = null;
-              $elem116 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationModule();
-              $xfer += $elem116->read($input);
-              $this->success []= $elem116;
+              $elem130 = null;
+              $elem130 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationModule();
+              $xfer += $elem130->read($input);
+              $this->success []= $elem130;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -32499,9 +33421,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter117)
+          foreach ($this->success as $iter131)
           {
-            $xfer += $iter117->write($output);
+            $xfer += $iter131->write($output);
           }
         }
         $output->writeListEnd();
@@ -32737,15 +33659,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size118 = 0;
-            $_etype121 = 0;
-            $xfer += $input->readListBegin($_etype121, $_size118);
-            for ($_i122 = 0; $_i122 < $_size118; ++$_i122)
+            $_size132 = 0;
+            $_etype135 = 0;
+            $xfer += $input->readListBegin($_etype135, $_size132);
+            for ($_i136 = 0; $_i136 < $_size132; ++$_i136)
             {
-              $elem123 = null;
-              $elem123 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationModule();
-              $xfer += $elem123->read($input);
-              $this->success []= $elem123;
+              $elem137 = null;
+              $elem137 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationModule();
+              $xfer += $elem137->read($input);
+              $this->success []= $elem137;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -32805,9 +33727,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter124)
+          foreach ($this->success as $iter138)
           {
-            $xfer += $iter124->write($output);
+            $xfer += $iter138->write($output);
           }
         }
         $output->writeListEnd();
@@ -34494,15 +35416,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size125 = 0;
-            $_etype128 = 0;
-            $xfer += $input->readListBegin($_etype128, $_size125);
-            for ($_i129 = 0; $_i129 < $_size125; ++$_i129)
+            $_size139 = 0;
+            $_etype142 = 0;
+            $xfer += $input->readListBegin($_etype142, $_size139);
+            for ($_i143 = 0; $_i143 < $_size139; ++$_i143)
             {
-              $elem130 = null;
-              $elem130 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
-              $xfer += $elem130->read($input);
-              $this->success []= $elem130;
+              $elem144 = null;
+              $elem144 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
+              $xfer += $elem144->read($input);
+              $this->success []= $elem144;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -34562,9 +35484,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter131)
+          foreach ($this->success as $iter145)
           {
-            $xfer += $iter131->write($output);
+            $xfer += $iter145->write($output);
           }
         }
         $output->writeListEnd();
@@ -34823,15 +35745,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size132 = 0;
-            $_etype135 = 0;
-            $xfer += $input->readListBegin($_etype135, $_size132);
-            for ($_i136 = 0; $_i136 < $_size132; ++$_i136)
+            $_size146 = 0;
+            $_etype149 = 0;
+            $xfer += $input->readListBegin($_etype149, $_size146);
+            for ($_i150 = 0; $_i150 < $_size146; ++$_i150)
             {
-              $elem137 = null;
-              $elem137 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
-              $xfer += $elem137->read($input);
-              $this->success []= $elem137;
+              $elem151 = null;
+              $elem151 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
+              $xfer += $elem151->read($input);
+              $this->success []= $elem151;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -34891,9 +35813,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter138)
+          foreach ($this->success as $iter152)
           {
-            $xfer += $iter138->write($output);
+            $xfer += $iter152->write($output);
           }
         }
         $output->writeListEnd();
@@ -35128,14 +36050,14 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size139 = 0;
-            $_etype142 = 0;
-            $xfer += $input->readListBegin($_etype142, $_size139);
-            for ($_i143 = 0; $_i143 < $_size139; ++$_i143)
+            $_size153 = 0;
+            $_etype156 = 0;
+            $xfer += $input->readListBegin($_etype156, $_size153);
+            for ($_i157 = 0; $_i157 < $_size153; ++$_i157)
             {
-              $elem144 = null;
-              $xfer += $input->readString($elem144);
-              $this->success []= $elem144;
+              $elem158 = null;
+              $xfer += $input->readString($elem158);
+              $this->success []= $elem158;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -35195,9 +36117,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->success));
         {
-          foreach ($this->success as $iter145)
+          foreach ($this->success as $iter159)
           {
-            $xfer += $output->writeString($iter145);
+            $xfer += $output->writeString($iter159);
           }
         }
         $output->writeListEnd();
@@ -35456,15 +36378,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size146 = 0;
-            $_etype149 = 0;
-            $xfer += $input->readListBegin($_etype149, $_size146);
-            for ($_i150 = 0; $_i150 < $_size146; ++$_i150)
+            $_size160 = 0;
+            $_etype163 = 0;
+            $xfer += $input->readListBegin($_etype163, $_size160);
+            for ($_i164 = 0; $_i164 < $_size160; ++$_i164)
             {
-              $elem151 = null;
-              $elem151 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
-              $xfer += $elem151->read($input);
-              $this->success []= $elem151;
+              $elem165 = null;
+              $elem165 = new \Airavata\Model\AppCatalog\AppDeployment\ApplicationDeploymentDescription();
+              $xfer += $elem165->read($input);
+              $this->success []= $elem165;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -35524,9 +36446,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter152)
+          foreach ($this->success as $iter166)
           {
-            $xfer += $iter152->write($output);
+            $xfer += $iter166->write($output);
           }
         }
         $output->writeListEnd();
@@ -37262,17 +38184,17 @@
         case 0:
           if ($ftype == TType::MAP) {
             $this->success = array();
-            $_size153 = 0;
-            $_ktype154 = 0;
-            $_vtype155 = 0;
-            $xfer += $input->readMapBegin($_ktype154, $_vtype155, $_size153);
-            for ($_i157 = 0; $_i157 < $_size153; ++$_i157)
+            $_size167 = 0;
+            $_ktype168 = 0;
+            $_vtype169 = 0;
+            $xfer += $input->readMapBegin($_ktype168, $_vtype169, $_size167);
+            for ($_i171 = 0; $_i171 < $_size167; ++$_i171)
             {
-              $key158 = '';
-              $val159 = '';
-              $xfer += $input->readString($key158);
-              $xfer += $input->readString($val159);
-              $this->success[$key158] = $val159;
+              $key172 = '';
+              $val173 = '';
+              $xfer += $input->readString($key172);
+              $xfer += $input->readString($val173);
+              $this->success[$key172] = $val173;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -37332,10 +38254,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::STRING, count($this->success));
         {
-          foreach ($this->success as $kiter160 => $viter161)
+          foreach ($this->success as $kiter174 => $viter175)
           {
-            $xfer += $output->writeString($kiter160);
-            $xfer += $output->writeString($viter161);
+            $xfer += $output->writeString($kiter174);
+            $xfer += $output->writeString($viter175);
           }
         }
         $output->writeMapEnd();
@@ -37571,15 +38493,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size162 = 0;
-            $_etype165 = 0;
-            $xfer += $input->readListBegin($_etype165, $_size162);
-            for ($_i166 = 0; $_i166 < $_size162; ++$_i166)
+            $_size176 = 0;
+            $_etype179 = 0;
+            $xfer += $input->readListBegin($_etype179, $_size176);
+            for ($_i180 = 0; $_i180 < $_size176; ++$_i180)
             {
-              $elem167 = null;
-              $elem167 = new \Airavata\Model\AppCatalog\AppInterface\ApplicationInterfaceDescription();
-              $xfer += $elem167->read($input);
-              $this->success []= $elem167;
+              $elem181 = null;
+              $elem181 = new \Airavata\Model\AppCatalog\AppInterface\ApplicationInterfaceDescription();
+              $xfer += $elem181->read($input);
+              $this->success []= $elem181;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -37639,9 +38561,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter168)
+          foreach ($this->success as $iter182)
           {
-            $xfer += $iter168->write($output);
+            $xfer += $iter182->write($output);
           }
         }
         $output->writeListEnd();
@@ -37877,15 +38799,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size169 = 0;
-            $_etype172 = 0;
-            $xfer += $input->readListBegin($_etype172, $_size169);
-            for ($_i173 = 0; $_i173 < $_size169; ++$_i173)
+            $_size183 = 0;
+            $_etype186 = 0;
+            $xfer += $input->readListBegin($_etype186, $_size183);
+            for ($_i187 = 0; $_i187 < $_size183; ++$_i187)
             {
-              $elem174 = null;
-              $elem174 = new \Airavata\Model\Application\Io\InputDataObjectType();
-              $xfer += $elem174->read($input);
-              $this->success []= $elem174;
+              $elem188 = null;
+              $elem188 = new \Airavata\Model\Application\Io\InputDataObjectType();
+              $xfer += $elem188->read($input);
+              $this->success []= $elem188;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -37945,9 +38867,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter175)
+          foreach ($this->success as $iter189)
           {
-            $xfer += $iter175->write($output);
+            $xfer += $iter189->write($output);
           }
         }
         $output->writeListEnd();
@@ -38183,15 +39105,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size176 = 0;
-            $_etype179 = 0;
-            $xfer += $input->readListBegin($_etype179, $_size176);
-            for ($_i180 = 0; $_i180 < $_size176; ++$_i180)
+            $_size190 = 0;
+            $_etype193 = 0;
+            $xfer += $input->readListBegin($_etype193, $_size190);
+            for ($_i194 = 0; $_i194 < $_size190; ++$_i194)
             {
-              $elem181 = null;
-              $elem181 = new \Airavata\Model\Application\Io\OutputDataObjectType();
-              $xfer += $elem181->read($input);
-              $this->success []= $elem181;
+              $elem195 = null;
+              $elem195 = new \Airavata\Model\Application\Io\OutputDataObjectType();
+              $xfer += $elem195->read($input);
+              $this->success []= $elem195;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -38251,9 +39173,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter182)
+          foreach ($this->success as $iter196)
           {
-            $xfer += $iter182->write($output);
+            $xfer += $iter196->write($output);
           }
         }
         $output->writeListEnd();
@@ -38492,17 +39414,17 @@
         case 0:
           if ($ftype == TType::MAP) {
             $this->success = array();
-            $_size183 = 0;
-            $_ktype184 = 0;
-            $_vtype185 = 0;
-            $xfer += $input->readMapBegin($_ktype184, $_vtype185, $_size183);
-            for ($_i187 = 0; $_i187 < $_size183; ++$_i187)
+            $_size197 = 0;
+            $_ktype198 = 0;
+            $_vtype199 = 0;
+            $xfer += $input->readMapBegin($_ktype198, $_vtype199, $_size197);
+            for ($_i201 = 0; $_i201 < $_size197; ++$_i201)
             {
-              $key188 = '';
-              $val189 = '';
-              $xfer += $input->readString($key188);
-              $xfer += $input->readString($val189);
-              $this->success[$key188] = $val189;
+              $key202 = '';
+              $val203 = '';
+              $xfer += $input->readString($key202);
+              $xfer += $input->readString($val203);
+              $this->success[$key202] = $val203;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -38562,10 +39484,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::STRING, count($this->success));
         {
-          foreach ($this->success as $kiter190 => $viter191)
+          foreach ($this->success as $kiter204 => $viter205)
           {
-            $xfer += $output->writeString($kiter190);
-            $xfer += $output->writeString($viter191);
+            $xfer += $output->writeString($kiter204);
+            $xfer += $output->writeString($viter205);
           }
         }
         $output->writeMapEnd();
@@ -39347,17 +40269,17 @@
         case 0:
           if ($ftype == TType::MAP) {
             $this->success = array();
-            $_size192 = 0;
-            $_ktype193 = 0;
-            $_vtype194 = 0;
-            $xfer += $input->readMapBegin($_ktype193, $_vtype194, $_size192);
-            for ($_i196 = 0; $_i196 < $_size192; ++$_i196)
+            $_size206 = 0;
+            $_ktype207 = 0;
+            $_vtype208 = 0;
+            $xfer += $input->readMapBegin($_ktype207, $_vtype208, $_size206);
+            for ($_i210 = 0; $_i210 < $_size206; ++$_i210)
             {
-              $key197 = '';
-              $val198 = '';
-              $xfer += $input->readString($key197);
-              $xfer += $input->readString($val198);
-              $this->success[$key197] = $val198;
+              $key211 = '';
+              $val212 = '';
+              $xfer += $input->readString($key211);
+              $xfer += $input->readString($val212);
+              $this->success[$key211] = $val212;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -39417,10 +40339,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::STRING, count($this->success));
         {
-          foreach ($this->success as $kiter199 => $viter200)
+          foreach ($this->success as $kiter213 => $viter214)
           {
-            $xfer += $output->writeString($kiter199);
-            $xfer += $output->writeString($viter200);
+            $xfer += $output->writeString($kiter213);
+            $xfer += $output->writeString($viter214);
           }
         }
         $output->writeMapEnd();
@@ -40786,17 +41708,17 @@
         case 0:
           if ($ftype == TType::MAP) {
             $this->success = array();
-            $_size201 = 0;
-            $_ktype202 = 0;
-            $_vtype203 = 0;
-            $xfer += $input->readMapBegin($_ktype202, $_vtype203, $_size201);
-            for ($_i205 = 0; $_i205 < $_size201; ++$_i205)
+            $_size215 = 0;
+            $_ktype216 = 0;
+            $_vtype217 = 0;
+            $xfer += $input->readMapBegin($_ktype216, $_vtype217, $_size215);
+            for ($_i219 = 0; $_i219 < $_size215; ++$_i219)
             {
-              $key206 = '';
-              $val207 = '';
-              $xfer += $input->readString($key206);
-              $xfer += $input->readString($val207);
-              $this->success[$key206] = $val207;
+              $key220 = '';
+              $val221 = '';
+              $xfer += $input->readString($key220);
+              $xfer += $input->readString($val221);
+              $this->success[$key220] = $val221;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -40856,10 +41778,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::STRING, count($this->success));
         {
-          foreach ($this->success as $kiter208 => $viter209)
+          foreach ($this->success as $kiter222 => $viter223)
           {
-            $xfer += $output->writeString($kiter208);
-            $xfer += $output->writeString($viter209);
+            $xfer += $output->writeString($kiter222);
+            $xfer += $output->writeString($viter223);
           }
         }
         $output->writeMapEnd();
@@ -49918,17 +50840,17 @@
         case 2:
           if ($ftype == TType::MAP) {
             $this->jobSubmissionPriorityMap = array();
-            $_size210 = 0;
-            $_ktype211 = 0;
-            $_vtype212 = 0;
-            $xfer += $input->readMapBegin($_ktype211, $_vtype212, $_size210);
-            for ($_i214 = 0; $_i214 < $_size210; ++$_i214)
+            $_size224 = 0;
+            $_ktype225 = 0;
+            $_vtype226 = 0;
+            $xfer += $input->readMapBegin($_ktype225, $_vtype226, $_size224);
+            for ($_i228 = 0; $_i228 < $_size224; ++$_i228)
             {
-              $key215 = '';
-              $val216 = 0;
-              $xfer += $input->readString($key215);
-              $xfer += $input->readI32($val216);
-              $this->jobSubmissionPriorityMap[$key215] = $val216;
+              $key229 = '';
+              $val230 = 0;
+              $xfer += $input->readString($key229);
+              $xfer += $input->readI32($val230);
+              $this->jobSubmissionPriorityMap[$key229] = $val230;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -49964,10 +50886,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->jobSubmissionPriorityMap));
         {
-          foreach ($this->jobSubmissionPriorityMap as $kiter217 => $viter218)
+          foreach ($this->jobSubmissionPriorityMap as $kiter231 => $viter232)
           {
-            $xfer += $output->writeString($kiter217);
-            $xfer += $output->writeI32($viter218);
+            $xfer += $output->writeString($kiter231);
+            $xfer += $output->writeI32($viter232);
           }
         }
         $output->writeMapEnd();
@@ -50230,17 +51152,17 @@
         case 2:
           if ($ftype == TType::MAP) {
             $this->dataMovementPriorityMap = array();
-            $_size219 = 0;
-            $_ktype220 = 0;
-            $_vtype221 = 0;
-            $xfer += $input->readMapBegin($_ktype220, $_vtype221, $_size219);
-            for ($_i223 = 0; $_i223 < $_size219; ++$_i223)
+            $_size233 = 0;
+            $_ktype234 = 0;
+            $_vtype235 = 0;
+            $xfer += $input->readMapBegin($_ktype234, $_vtype235, $_size233);
+            for ($_i237 = 0; $_i237 < $_size233; ++$_i237)
             {
-              $key224 = '';
-              $val225 = 0;
-              $xfer += $input->readString($key224);
-              $xfer += $input->readI32($val225);
-              $this->dataMovementPriorityMap[$key224] = $val225;
+              $key238 = '';
+              $val239 = 0;
+              $xfer += $input->readString($key238);
+              $xfer += $input->readI32($val239);
+              $this->dataMovementPriorityMap[$key238] = $val239;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -50276,10 +51198,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->dataMovementPriorityMap));
         {
-          foreach ($this->dataMovementPriorityMap as $kiter226 => $viter227)
+          foreach ($this->dataMovementPriorityMap as $kiter240 => $viter241)
           {
-            $xfer += $output->writeString($kiter226);
-            $xfer += $output->writeI32($viter227);
+            $xfer += $output->writeString($kiter240);
+            $xfer += $output->writeI32($viter241);
           }
         }
         $output->writeMapEnd();
@@ -55166,15 +56088,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size228 = 0;
-            $_etype231 = 0;
-            $xfer += $input->readListBegin($_etype231, $_size228);
-            for ($_i232 = 0; $_i232 < $_size228; ++$_i232)
+            $_size242 = 0;
+            $_etype245 = 0;
+            $xfer += $input->readListBegin($_etype245, $_size242);
+            for ($_i246 = 0; $_i246 < $_size242; ++$_i246)
             {
-              $elem233 = null;
-              $elem233 = new \Airavata\Model\AppCatalog\GatewayProfile\ComputeResourcePreference();
-              $xfer += $elem233->read($input);
-              $this->success []= $elem233;
+              $elem247 = null;
+              $elem247 = new \Airavata\Model\AppCatalog\GatewayProfile\ComputeResourcePreference();
+              $xfer += $elem247->read($input);
+              $this->success []= $elem247;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -55234,9 +56156,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter234)
+          foreach ($this->success as $iter248)
           {
-            $xfer += $iter234->write($output);
+            $xfer += $iter248->write($output);
           }
         }
         $output->writeListEnd();
@@ -55472,15 +56394,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size235 = 0;
-            $_etype238 = 0;
-            $xfer += $input->readListBegin($_etype238, $_size235);
-            for ($_i239 = 0; $_i239 < $_size235; ++$_i239)
+            $_size249 = 0;
+            $_etype252 = 0;
+            $xfer += $input->readListBegin($_etype252, $_size249);
+            for ($_i253 = 0; $_i253 < $_size249; ++$_i253)
             {
-              $elem240 = null;
-              $elem240 = new \Airavata\Model\AppCatalog\GatewayProfile\StoragePreference();
-              $xfer += $elem240->read($input);
-              $this->success []= $elem240;
+              $elem254 = null;
+              $elem254 = new \Airavata\Model\AppCatalog\GatewayProfile\StoragePreference();
+              $xfer += $elem254->read($input);
+              $this->success []= $elem254;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -55540,9 +56462,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter241)
+          foreach ($this->success as $iter255)
           {
-            $xfer += $iter241->write($output);
+            $xfer += $iter255->write($output);
           }
         }
         $output->writeListEnd();
@@ -55755,15 +56677,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size242 = 0;
-            $_etype245 = 0;
-            $xfer += $input->readListBegin($_etype245, $_size242);
-            for ($_i246 = 0; $_i246 < $_size242; ++$_i246)
+            $_size256 = 0;
+            $_etype259 = 0;
+            $xfer += $input->readListBegin($_etype259, $_size256);
+            for ($_i260 = 0; $_i260 < $_size256; ++$_i260)
             {
-              $elem247 = null;
-              $elem247 = new \Airavata\Model\AppCatalog\GatewayProfile\GatewayResourceProfile();
-              $xfer += $elem247->read($input);
-              $this->success []= $elem247;
+              $elem261 = null;
+              $elem261 = new \Airavata\Model\AppCatalog\GatewayProfile\GatewayResourceProfile();
+              $xfer += $elem261->read($input);
+              $this->success []= $elem261;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -55823,9 +56745,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter248)
+          foreach ($this->success as $iter262)
           {
-            $xfer += $iter248->write($output);
+            $xfer += $iter262->write($output);
           }
         }
         $output->writeListEnd();
@@ -57298,15 +58220,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size249 = 0;
-            $_etype252 = 0;
-            $xfer += $input->readListBegin($_etype252, $_size249);
-            for ($_i253 = 0; $_i253 < $_size249; ++$_i253)
+            $_size263 = 0;
+            $_etype266 = 0;
+            $xfer += $input->readListBegin($_etype266, $_size263);
+            for ($_i267 = 0; $_i267 < $_size263; ++$_i267)
             {
-              $elem254 = null;
-              $elem254 = new \Airavata\Model\AppCatalog\AccountProvisioning\SSHAccountProvisioner();
-              $xfer += $elem254->read($input);
-              $this->success []= $elem254;
+              $elem268 = null;
+              $elem268 = new \Airavata\Model\AppCatalog\AccountProvisioning\SSHAccountProvisioner();
+              $xfer += $elem268->read($input);
+              $this->success []= $elem268;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -57366,9 +58288,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter255)
+          foreach ($this->success as $iter269)
           {
-            $xfer += $iter255->write($output);
+            $xfer += $iter269->write($output);
           }
         }
         $output->writeListEnd();
@@ -61440,15 +62362,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size256 = 0;
-            $_etype259 = 0;
-            $xfer += $input->readListBegin($_etype259, $_size256);
-            for ($_i260 = 0; $_i260 < $_size256; ++$_i260)
+            $_size270 = 0;
+            $_etype273 = 0;
+            $xfer += $input->readListBegin($_etype273, $_size270);
+            for ($_i274 = 0; $_i274 < $_size270; ++$_i274)
             {
-              $elem261 = null;
-              $elem261 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserComputeResourcePreference();
-              $xfer += $elem261->read($input);
-              $this->success []= $elem261;
+              $elem275 = null;
+              $elem275 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserComputeResourcePreference();
+              $xfer += $elem275->read($input);
+              $this->success []= $elem275;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -61508,9 +62430,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter262)
+          foreach ($this->success as $iter276)
           {
-            $xfer += $iter262->write($output);
+            $xfer += $iter276->write($output);
           }
         }
         $output->writeListEnd();
@@ -61769,15 +62691,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size263 = 0;
-            $_etype266 = 0;
-            $xfer += $input->readListBegin($_etype266, $_size263);
-            for ($_i267 = 0; $_i267 < $_size263; ++$_i267)
+            $_size277 = 0;
+            $_etype280 = 0;
+            $xfer += $input->readListBegin($_etype280, $_size277);
+            for ($_i281 = 0; $_i281 < $_size277; ++$_i281)
             {
-              $elem268 = null;
-              $elem268 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserStoragePreference();
-              $xfer += $elem268->read($input);
-              $this->success []= $elem268;
+              $elem282 = null;
+              $elem282 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserStoragePreference();
+              $xfer += $elem282->read($input);
+              $this->success []= $elem282;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -61837,9 +62759,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter269)
+          foreach ($this->success as $iter283)
           {
-            $xfer += $iter269->write($output);
+            $xfer += $iter283->write($output);
           }
         }
         $output->writeListEnd();
@@ -62052,15 +62974,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size270 = 0;
-            $_etype273 = 0;
-            $xfer += $input->readListBegin($_etype273, $_size270);
-            for ($_i274 = 0; $_i274 < $_size270; ++$_i274)
+            $_size284 = 0;
+            $_etype287 = 0;
+            $xfer += $input->readListBegin($_etype287, $_size284);
+            for ($_i288 = 0; $_i288 < $_size284; ++$_i288)
             {
-              $elem275 = null;
-              $elem275 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserResourceProfile();
-              $xfer += $elem275->read($input);
-              $this->success []= $elem275;
+              $elem289 = null;
+              $elem289 = new \Airavata\Model\AppCatalog\UserResourceProfile\UserResourceProfile();
+              $xfer += $elem289->read($input);
+              $this->success []= $elem289;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -62120,9 +63042,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter276)
+          foreach ($this->success as $iter290)
           {
-            $xfer += $iter276->write($output);
+            $xfer += $iter290->write($output);
           }
         }
         $output->writeListEnd();
@@ -63687,15 +64609,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size277 = 0;
-            $_etype280 = 0;
-            $xfer += $input->readListBegin($_etype280, $_size277);
-            for ($_i281 = 0; $_i281 < $_size277; ++$_i281)
+            $_size291 = 0;
+            $_etype294 = 0;
+            $xfer += $input->readListBegin($_etype294, $_size291);
+            for ($_i295 = 0; $_i295 < $_size291; ++$_i295)
             {
-              $elem282 = null;
-              $elem282 = new \Airavata\Model\Status\QueueStatusModel();
-              $xfer += $elem282->read($input);
-              $this->success []= $elem282;
+              $elem296 = null;
+              $elem296 = new \Airavata\Model\Status\QueueStatusModel();
+              $xfer += $elem296->read($input);
+              $this->success []= $elem296;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -63755,9 +64677,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter283)
+          foreach ($this->success as $iter297)
           {
-            $xfer += $iter283->write($output);
+            $xfer += $iter297->write($output);
           }
         }
         $output->writeListEnd();
@@ -65125,15 +66047,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size284 = 0;
-            $_etype287 = 0;
-            $xfer += $input->readListBegin($_etype287, $_size284);
-            for ($_i288 = 0; $_i288 < $_size284; ++$_i288)
+            $_size298 = 0;
+            $_etype301 = 0;
+            $xfer += $input->readListBegin($_etype301, $_size298);
+            for ($_i302 = 0; $_i302 < $_size298; ++$_i302)
             {
-              $elem289 = null;
-              $elem289 = new \Airavata\Model\Data\Replica\DataProductModel();
-              $xfer += $elem289->read($input);
-              $this->success []= $elem289;
+              $elem303 = null;
+              $elem303 = new \Airavata\Model\Data\Replica\DataProductModel();
+              $xfer += $elem303->read($input);
+              $this->success []= $elem303;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -65193,9 +66115,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter290)
+          foreach ($this->success as $iter304)
           {
-            $xfer += $iter290->write($output);
+            $xfer += $iter304->write($output);
           }
         }
         $output->writeListEnd();
@@ -65321,17 +66243,17 @@
         case 4:
           if ($ftype == TType::MAP) {
             $this->userPermissionList = array();
-            $_size291 = 0;
-            $_ktype292 = 0;
-            $_vtype293 = 0;
-            $xfer += $input->readMapBegin($_ktype292, $_vtype293, $_size291);
-            for ($_i295 = 0; $_i295 < $_size291; ++$_i295)
+            $_size305 = 0;
+            $_ktype306 = 0;
+            $_vtype307 = 0;
+            $xfer += $input->readMapBegin($_ktype306, $_vtype307, $_size305);
+            for ($_i309 = 0; $_i309 < $_size305; ++$_i309)
             {
-              $key296 = '';
-              $val297 = 0;
-              $xfer += $input->readString($key296);
-              $xfer += $input->readI32($val297);
-              $this->userPermissionList[$key296] = $val297;
+              $key310 = '';
+              $val311 = 0;
+              $xfer += $input->readString($key310);
+              $xfer += $input->readI32($val311);
+              $this->userPermissionList[$key310] = $val311;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -65372,10 +66294,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->userPermissionList));
         {
-          foreach ($this->userPermissionList as $kiter298 => $viter299)
+          foreach ($this->userPermissionList as $kiter312 => $viter313)
           {
-            $xfer += $output->writeString($kiter298);
-            $xfer += $output->writeI32($viter299);
+            $xfer += $output->writeString($kiter312);
+            $xfer += $output->writeI32($viter313);
           }
         }
         $output->writeMapEnd();
@@ -65656,17 +66578,17 @@
         case 4:
           if ($ftype == TType::MAP) {
             $this->groupPermissionList = array();
-            $_size300 = 0;
-            $_ktype301 = 0;
-            $_vtype302 = 0;
-            $xfer += $input->readMapBegin($_ktype301, $_vtype302, $_size300);
-            for ($_i304 = 0; $_i304 < $_size300; ++$_i304)
+            $_size314 = 0;
+            $_ktype315 = 0;
+            $_vtype316 = 0;
+            $xfer += $input->readMapBegin($_ktype315, $_vtype316, $_size314);
+            for ($_i318 = 0; $_i318 < $_size314; ++$_i318)
             {
-              $key305 = '';
-              $val306 = 0;
-              $xfer += $input->readString($key305);
-              $xfer += $input->readI32($val306);
-              $this->groupPermissionList[$key305] = $val306;
+              $key319 = '';
+              $val320 = 0;
+              $xfer += $input->readString($key319);
+              $xfer += $input->readI32($val320);
+              $this->groupPermissionList[$key319] = $val320;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -65707,10 +66629,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->groupPermissionList));
         {
-          foreach ($this->groupPermissionList as $kiter307 => $viter308)
+          foreach ($this->groupPermissionList as $kiter321 => $viter322)
           {
-            $xfer += $output->writeString($kiter307);
-            $xfer += $output->writeI32($viter308);
+            $xfer += $output->writeString($kiter321);
+            $xfer += $output->writeI32($viter322);
           }
         }
         $output->writeMapEnd();
@@ -65991,17 +66913,17 @@
         case 4:
           if ($ftype == TType::MAP) {
             $this->userPermissionList = array();
-            $_size309 = 0;
-            $_ktype310 = 0;
-            $_vtype311 = 0;
-            $xfer += $input->readMapBegin($_ktype310, $_vtype311, $_size309);
-            for ($_i313 = 0; $_i313 < $_size309; ++$_i313)
+            $_size323 = 0;
+            $_ktype324 = 0;
+            $_vtype325 = 0;
+            $xfer += $input->readMapBegin($_ktype324, $_vtype325, $_size323);
+            for ($_i327 = 0; $_i327 < $_size323; ++$_i327)
             {
-              $key314 = '';
-              $val315 = 0;
-              $xfer += $input->readString($key314);
-              $xfer += $input->readI32($val315);
-              $this->userPermissionList[$key314] = $val315;
+              $key328 = '';
+              $val329 = 0;
+              $xfer += $input->readString($key328);
+              $xfer += $input->readI32($val329);
+              $this->userPermissionList[$key328] = $val329;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -66042,10 +66964,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->userPermissionList));
         {
-          foreach ($this->userPermissionList as $kiter316 => $viter317)
+          foreach ($this->userPermissionList as $kiter330 => $viter331)
           {
-            $xfer += $output->writeString($kiter316);
-            $xfer += $output->writeI32($viter317);
+            $xfer += $output->writeString($kiter330);
+            $xfer += $output->writeI32($viter331);
           }
         }
         $output->writeMapEnd();
@@ -66326,17 +67248,17 @@
         case 4:
           if ($ftype == TType::MAP) {
             $this->groupPermissionList = array();
-            $_size318 = 0;
-            $_ktype319 = 0;
-            $_vtype320 = 0;
-            $xfer += $input->readMapBegin($_ktype319, $_vtype320, $_size318);
-            for ($_i322 = 0; $_i322 < $_size318; ++$_i322)
+            $_size332 = 0;
+            $_ktype333 = 0;
+            $_vtype334 = 0;
+            $xfer += $input->readMapBegin($_ktype333, $_vtype334, $_size332);
+            for ($_i336 = 0; $_i336 < $_size332; ++$_i336)
             {
-              $key323 = '';
-              $val324 = 0;
-              $xfer += $input->readString($key323);
-              $xfer += $input->readI32($val324);
-              $this->groupPermissionList[$key323] = $val324;
+              $key337 = '';
+              $val338 = 0;
+              $xfer += $input->readString($key337);
+              $xfer += $input->readI32($val338);
+              $this->groupPermissionList[$key337] = $val338;
             }
             $xfer += $input->readMapEnd();
           } else {
@@ -66377,10 +67299,10 @@
       {
         $output->writeMapBegin(TType::STRING, TType::I32, count($this->groupPermissionList));
         {
-          foreach ($this->groupPermissionList as $kiter325 => $viter326)
+          foreach ($this->groupPermissionList as $kiter339 => $viter340)
           {
-            $xfer += $output->writeString($kiter325);
-            $xfer += $output->writeI32($viter326);
+            $xfer += $output->writeString($kiter339);
+            $xfer += $output->writeI32($viter340);
           }
         }
         $output->writeMapEnd();
@@ -66793,14 +67715,14 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size327 = 0;
-            $_etype330 = 0;
-            $xfer += $input->readListBegin($_etype330, $_size327);
-            for ($_i331 = 0; $_i331 < $_size327; ++$_i331)
+            $_size341 = 0;
+            $_etype344 = 0;
+            $xfer += $input->readListBegin($_etype344, $_size341);
+            for ($_i345 = 0; $_i345 < $_size341; ++$_i345)
             {
-              $elem332 = null;
-              $xfer += $input->readString($elem332);
-              $this->success []= $elem332;
+              $elem346 = null;
+              $xfer += $input->readString($elem346);
+              $this->success []= $elem346;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -66860,9 +67782,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->success));
         {
-          foreach ($this->success as $iter333)
+          foreach ($this->success as $iter347)
           {
-            $xfer += $output->writeString($iter333);
+            $xfer += $output->writeString($iter347);
           }
         }
         $output->writeListEnd();
@@ -67120,14 +68042,14 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size334 = 0;
-            $_etype337 = 0;
-            $xfer += $input->readListBegin($_etype337, $_size334);
-            for ($_i338 = 0; $_i338 < $_size334; ++$_i338)
+            $_size348 = 0;
+            $_etype351 = 0;
+            $xfer += $input->readListBegin($_etype351, $_size348);
+            for ($_i352 = 0; $_i352 < $_size348; ++$_i352)
             {
-              $elem339 = null;
-              $xfer += $input->readString($elem339);
-              $this->success []= $elem339;
+              $elem353 = null;
+              $xfer += $input->readString($elem353);
+              $this->success []= $elem353;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -67187,9 +68109,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->success));
         {
-          foreach ($this->success as $iter340)
+          foreach ($this->success as $iter354)
           {
-            $xfer += $output->writeString($iter340);
+            $xfer += $output->writeString($iter354);
           }
         }
         $output->writeListEnd();
@@ -67447,14 +68369,14 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size341 = 0;
-            $_etype344 = 0;
-            $xfer += $input->readListBegin($_etype344, $_size341);
-            for ($_i345 = 0; $_i345 < $_size341; ++$_i345)
+            $_size355 = 0;
+            $_etype358 = 0;
+            $xfer += $input->readListBegin($_etype358, $_size355);
+            for ($_i359 = 0; $_i359 < $_size355; ++$_i359)
             {
-              $elem346 = null;
-              $xfer += $input->readString($elem346);
-              $this->success []= $elem346;
+              $elem360 = null;
+              $xfer += $input->readString($elem360);
+              $this->success []= $elem360;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -67514,9 +68436,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->success));
         {
-          foreach ($this->success as $iter347)
+          foreach ($this->success as $iter361)
           {
-            $xfer += $output->writeString($iter347);
+            $xfer += $output->writeString($iter361);
           }
         }
         $output->writeListEnd();
@@ -67774,14 +68696,14 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size348 = 0;
-            $_etype351 = 0;
-            $xfer += $input->readListBegin($_etype351, $_size348);
-            for ($_i352 = 0; $_i352 < $_size348; ++$_i352)
+            $_size362 = 0;
+            $_etype365 = 0;
+            $xfer += $input->readListBegin($_etype365, $_size362);
+            for ($_i366 = 0; $_i366 < $_size362; ++$_i366)
             {
-              $elem353 = null;
-              $xfer += $input->readString($elem353);
-              $this->success []= $elem353;
+              $elem367 = null;
+              $xfer += $input->readString($elem367);
+              $this->success []= $elem367;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -67841,9 +68763,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->success));
         {
-          foreach ($this->success as $iter354)
+          foreach ($this->success as $iter368)
           {
-            $xfer += $output->writeString($iter354);
+            $xfer += $output->writeString($iter368);
           }
         }
         $output->writeListEnd();
@@ -69484,15 +70406,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size355 = 0;
-            $_etype358 = 0;
-            $xfer += $input->readListBegin($_etype358, $_size355);
-            for ($_i359 = 0; $_i359 < $_size355; ++$_i359)
+            $_size369 = 0;
+            $_etype372 = 0;
+            $xfer += $input->readListBegin($_etype372, $_size369);
+            for ($_i373 = 0; $_i373 < $_size369; ++$_i373)
             {
-              $elem360 = null;
-              $elem360 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupResourceProfile();
-              $xfer += $elem360->read($input);
-              $this->success []= $elem360;
+              $elem374 = null;
+              $elem374 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupResourceProfile();
+              $xfer += $elem374->read($input);
+              $this->success []= $elem374;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -69552,9 +70474,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter361)
+          foreach ($this->success as $iter375)
           {
-            $xfer += $iter361->write($output);
+            $xfer += $iter375->write($output);
           }
         }
         $output->writeListEnd();
@@ -71519,15 +72441,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size362 = 0;
-            $_etype365 = 0;
-            $xfer += $input->readListBegin($_etype365, $_size362);
-            for ($_i366 = 0; $_i366 < $_size362; ++$_i366)
+            $_size376 = 0;
+            $_etype379 = 0;
+            $xfer += $input->readListBegin($_etype379, $_size376);
+            for ($_i380 = 0; $_i380 < $_size376; ++$_i380)
             {
-              $elem367 = null;
-              $elem367 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
-              $xfer += $elem367->read($input);
-              $this->success []= $elem367;
+              $elem381 = null;
+              $elem381 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
+              $xfer += $elem381->read($input);
+              $this->success []= $elem381;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -71587,9 +72509,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter368)
+          foreach ($this->success as $iter382)
           {
-            $xfer += $iter368->write($output);
+            $xfer += $iter382->write($output);
           }
         }
         $output->writeListEnd();
@@ -71825,15 +72747,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size369 = 0;
-            $_etype372 = 0;
-            $xfer += $input->readListBegin($_etype372, $_size369);
-            for ($_i373 = 0; $_i373 < $_size369; ++$_i373)
+            $_size383 = 0;
+            $_etype386 = 0;
+            $xfer += $input->readListBegin($_etype386, $_size383);
+            for ($_i387 = 0; $_i387 < $_size383; ++$_i387)
             {
-              $elem374 = null;
-              $elem374 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
-              $xfer += $elem374->read($input);
-              $this->success []= $elem374;
+              $elem388 = null;
+              $elem388 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
+              $xfer += $elem388->read($input);
+              $this->success []= $elem388;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -71893,9 +72815,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter375)
+          foreach ($this->success as $iter389)
           {
-            $xfer += $iter375->write($output);
+            $xfer += $iter389->write($output);
           }
         }
         $output->writeListEnd();
@@ -72131,15 +73053,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size376 = 0;
-            $_etype379 = 0;
-            $xfer += $input->readListBegin($_etype379, $_size376);
-            for ($_i380 = 0; $_i380 < $_size376; ++$_i380)
+            $_size390 = 0;
+            $_etype393 = 0;
+            $xfer += $input->readListBegin($_etype393, $_size390);
+            for ($_i394 = 0; $_i394 < $_size390; ++$_i394)
             {
-              $elem381 = null;
-              $elem381 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
-              $xfer += $elem381->read($input);
-              $this->success []= $elem381;
+              $elem395 = null;
+              $elem395 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
+              $xfer += $elem395->read($input);
+              $this->success []= $elem395;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -72199,9 +73121,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter382)
+          foreach ($this->success as $iter396)
           {
-            $xfer += $iter382->write($output);
+            $xfer += $iter396->write($output);
           }
         }
         $output->writeListEnd();
@@ -73286,15 +74208,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size383 = 0;
-            $_etype386 = 0;
-            $xfer += $input->readListBegin($_etype386, $_size383);
-            for ($_i387 = 0; $_i387 < $_size383; ++$_i387)
+            $_size397 = 0;
+            $_etype400 = 0;
+            $xfer += $input->readListBegin($_etype400, $_size397);
+            for ($_i401 = 0; $_i401 < $_size397; ++$_i401)
             {
-              $elem388 = null;
-              $elem388 = new \Airavata\Model\AppCatalog\Parser\Parser();
-              $xfer += $elem388->read($input);
-              $this->success []= $elem388;
+              $elem402 = null;
+              $elem402 = new \Airavata\Model\AppCatalog\Parser\Parser();
+              $xfer += $elem402->read($input);
+              $this->success []= $elem402;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -73354,9 +74276,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter389)
+          foreach ($this->success as $iter403)
           {
-            $xfer += $iter389->write($output);
+            $xfer += $iter403->write($output);
           }
         }
         $output->writeListEnd();
@@ -74222,15 +75144,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size390 = 0;
-            $_etype393 = 0;
-            $xfer += $input->readListBegin($_etype393, $_size390);
-            for ($_i394 = 0; $_i394 < $_size390; ++$_i394)
+            $_size404 = 0;
+            $_etype407 = 0;
+            $xfer += $input->readListBegin($_etype407, $_size404);
+            for ($_i408 = 0; $_i408 < $_size404; ++$_i408)
             {
-              $elem395 = null;
-              $elem395 = new \Airavata\Model\AppCatalog\Parser\ParsingTemplate();
-              $xfer += $elem395->read($input);
-              $this->success []= $elem395;
+              $elem409 = null;
+              $elem409 = new \Airavata\Model\AppCatalog\Parser\ParsingTemplate();
+              $xfer += $elem409->read($input);
+              $this->success []= $elem409;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -74290,9 +75212,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter396)
+          foreach ($this->success as $iter410)
           {
-            $xfer += $iter396->write($output);
+            $xfer += $iter410->write($output);
           }
         }
         $output->writeListEnd();
@@ -75112,15 +76034,15 @@
         case 0:
           if ($ftype == TType::LST) {
             $this->success = array();
-            $_size397 = 0;
-            $_etype400 = 0;
-            $xfer += $input->readListBegin($_etype400, $_size397);
-            for ($_i401 = 0; $_i401 < $_size397; ++$_i401)
+            $_size411 = 0;
+            $_etype414 = 0;
+            $xfer += $input->readListBegin($_etype414, $_size411);
+            for ($_i415 = 0; $_i415 < $_size411; ++$_i415)
             {
-              $elem402 = null;
-              $elem402 = new \Airavata\Model\AppCatalog\Parser\ParsingTemplate();
-              $xfer += $elem402->read($input);
-              $this->success []= $elem402;
+              $elem416 = null;
+              $elem416 = new \Airavata\Model\AppCatalog\Parser\ParsingTemplate();
+              $xfer += $elem416->read($input);
+              $this->success []= $elem416;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -75180,9 +76102,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->success));
         {
-          foreach ($this->success as $iter403)
+          foreach ($this->success as $iter417)
           {
-            $xfer += $iter403->write($output);
+            $xfer += $iter417->write($output);
           }
         }
         $output->writeListEnd();
diff --git a/app/libraries/Airavata/API/Sharing/SharingRegistryService.php b/app/libraries/Airavata/API/Sharing/SharingRegistryService.php
index 4038013..4b85f3d 100644
--- a/app/libraries/Airavata/API/Sharing/SharingRegistryService.php
+++ b/app/libraries/Airavata/API/Sharing/SharingRegistryService.php
@@ -62,6 +62,7 @@
    * <li>description : A short description for the domain</li>
    * <li>createdTime : Will be set by the system</li>
    * <li>updatedTime : Will be set by the system</li>
+   * <li>initialUserGroupId : New users will automatically be added to this group</li>
    * 
    * 
    * @throws \Airavata\Model\Sharing\SharingRegistryException
diff --git a/app/libraries/Airavata/Model/AppCatalog/ComputeResource/Types.php b/app/libraries/Airavata/Model/AppCatalog/ComputeResource/Types.php
index d42d05f..146c6ee 100644
--- a/app/libraries/Airavata/Model/AppCatalog/ComputeResource/Types.php
+++ b/app/libraries/Airavata/Model/AppCatalog/ComputeResource/Types.php
@@ -44,6 +44,7 @@
   const UGE = 4;
   const CLOUD = 5;
   const AIRAVATA_CUSTOM = 6;
+  const HTCONDOR = 7;
   static public $__names = array(
     0 => 'FORK',
     1 => 'PBS',
@@ -52,6 +53,7 @@
     4 => 'UGE',
     5 => 'CLOUD',
     6 => 'AIRAVATA_CUSTOM',
+    7 => 'HTCONDOR',
   );
 }
 
diff --git a/app/libraries/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php b/app/libraries/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
index 50364a5..34b1077 100644
--- a/app/libraries/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
+++ b/app/libraries/Airavata/Model/AppCatalog/GroupResourceProfile/Types.php
@@ -161,6 +161,199 @@
 
 }
 
+class ComputeResourceReservation {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $reservationId = "DO_NOT_SET_AT_CLIENTS";
+  /**
+   * @var string
+   */
+  public $reservationName = null;
+  /**
+   * @var string[]
+   */
+  public $queueNames = null;
+  /**
+   * @var int
+   */
+  public $startTime = null;
+  /**
+   * @var int
+   */
+  public $endTime = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'reservationId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'reservationName',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'queueNames',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        4 => array(
+          'var' => 'startTime',
+          'type' => TType::I64,
+          ),
+        5 => array(
+          'var' => 'endTime',
+          'type' => TType::I64,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['reservationId'])) {
+        $this->reservationId = $vals['reservationId'];
+      }
+      if (isset($vals['reservationName'])) {
+        $this->reservationName = $vals['reservationName'];
+      }
+      if (isset($vals['queueNames'])) {
+        $this->queueNames = $vals['queueNames'];
+      }
+      if (isset($vals['startTime'])) {
+        $this->startTime = $vals['startTime'];
+      }
+      if (isset($vals['endTime'])) {
+        $this->endTime = $vals['endTime'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'ComputeResourceReservation';
+  }
+
+  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->reservationId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->reservationName);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::LST) {
+            $this->queueNames = array();
+            $_size0 = 0;
+            $_etype3 = 0;
+            $xfer += $input->readListBegin($_etype3, $_size0);
+            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            {
+              $elem5 = null;
+              $xfer += $input->readString($elem5);
+              $this->queueNames []= $elem5;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 4:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->startTime);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 5:
+          if ($ftype == TType::I64) {
+            $xfer += $input->readI64($this->endTime);
+          } 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('ComputeResourceReservation');
+    if ($this->reservationId !== null) {
+      $xfer += $output->writeFieldBegin('reservationId', TType::STRING, 1);
+      $xfer += $output->writeString($this->reservationId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->reservationName !== null) {
+      $xfer += $output->writeFieldBegin('reservationName', TType::STRING, 2);
+      $xfer += $output->writeString($this->reservationName);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->queueNames !== null) {
+      if (!is_array($this->queueNames)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('queueNames', TType::LST, 3);
+      {
+        $output->writeListBegin(TType::STRING, count($this->queueNames));
+        {
+          foreach ($this->queueNames as $iter6)
+          {
+            $xfer += $output->writeString($iter6);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->startTime !== null) {
+      $xfer += $output->writeFieldBegin('startTime', TType::I64, 4);
+      $xfer += $output->writeI64($this->startTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->endTime !== null) {
+      $xfer += $output->writeFieldBegin('endTime', TType::I64, 5);
+      $xfer += $output->writeI64($this->endTime);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class GroupComputeResourcePreference {
   static $_TSPEC;
 
@@ -215,18 +408,6 @@
   /**
    * @var string
    */
-  public $reservation = null;
-  /**
-   * @var int
-   */
-  public $reservationStartTime = null;
-  /**
-   * @var int
-   */
-  public $reservationEndTime = null;
-  /**
-   * @var string
-   */
   public $sshAccountProvisioner = null;
   /**
    * @var \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig[]
@@ -236,6 +417,10 @@
    * @var string
    */
   public $sshAccountProvisionerAdditionalInfo = null;
+  /**
+   * @var \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation[]
+   */
+  public $reservations = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -288,18 +473,6 @@
           'var' => 'qualityOfService',
           'type' => TType::STRING,
           ),
-        13 => array(
-          'var' => 'reservation',
-          'type' => TType::STRING,
-          ),
-        14 => array(
-          'var' => 'reservationStartTime',
-          'type' => TType::I64,
-          ),
-        15 => array(
-          'var' => 'reservationEndTime',
-          'type' => TType::I64,
-          ),
         16 => array(
           'var' => 'sshAccountProvisioner',
           'type' => TType::STRING,
@@ -317,6 +490,15 @@
           'var' => 'sshAccountProvisionerAdditionalInfo',
           'type' => TType::STRING,
           ),
+        19 => array(
+          'var' => 'reservations',
+          'type' => TType::LST,
+          'etype' => TType::STRUCT,
+          'elem' => array(
+            'type' => TType::STRUCT,
+            'class' => '\Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation',
+            ),
+          ),
         );
     }
     if (is_array($vals)) {
@@ -356,15 +538,6 @@
       if (isset($vals['qualityOfService'])) {
         $this->qualityOfService = $vals['qualityOfService'];
       }
-      if (isset($vals['reservation'])) {
-        $this->reservation = $vals['reservation'];
-      }
-      if (isset($vals['reservationStartTime'])) {
-        $this->reservationStartTime = $vals['reservationStartTime'];
-      }
-      if (isset($vals['reservationEndTime'])) {
-        $this->reservationEndTime = $vals['reservationEndTime'];
-      }
       if (isset($vals['sshAccountProvisioner'])) {
         $this->sshAccountProvisioner = $vals['sshAccountProvisioner'];
       }
@@ -374,6 +547,9 @@
       if (isset($vals['sshAccountProvisionerAdditionalInfo'])) {
         $this->sshAccountProvisionerAdditionalInfo = $vals['sshAccountProvisionerAdditionalInfo'];
       }
+      if (isset($vals['reservations'])) {
+        $this->reservations = $vals['reservations'];
+      }
     }
   }
 
@@ -480,27 +656,6 @@
             $xfer += $input->skip($ftype);
           }
           break;
-        case 13:
-          if ($ftype == TType::STRING) {
-            $xfer += $input->readString($this->reservation);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 14:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->reservationStartTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
-        case 15:
-          if ($ftype == TType::I64) {
-            $xfer += $input->readI64($this->reservationEndTime);
-          } else {
-            $xfer += $input->skip($ftype);
-          }
-          break;
         case 16:
           if ($ftype == TType::STRING) {
             $xfer += $input->readString($this->sshAccountProvisioner);
@@ -511,15 +666,15 @@
         case 17:
           if ($ftype == TType::LST) {
             $this->groupSSHAccountProvisionerConfigs = array();
-            $_size0 = 0;
-            $_etype3 = 0;
-            $xfer += $input->readListBegin($_etype3, $_size0);
-            for ($_i4 = 0; $_i4 < $_size0; ++$_i4)
+            $_size7 = 0;
+            $_etype10 = 0;
+            $xfer += $input->readListBegin($_etype10, $_size7);
+            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
             {
-              $elem5 = null;
-              $elem5 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig();
-              $xfer += $elem5->read($input);
-              $this->groupSSHAccountProvisionerConfigs []= $elem5;
+              $elem12 = null;
+              $elem12 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupAccountSSHProvisionerConfig();
+              $xfer += $elem12->read($input);
+              $this->groupSSHAccountProvisionerConfigs []= $elem12;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -533,6 +688,24 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 19:
+          if ($ftype == TType::LST) {
+            $this->reservations = array();
+            $_size13 = 0;
+            $_etype16 = 0;
+            $xfer += $input->readListBegin($_etype16, $_size13);
+            for ($_i17 = 0; $_i17 < $_size13; ++$_i17)
+            {
+              $elem18 = null;
+              $elem18 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourceReservation();
+              $xfer += $elem18->read($input);
+              $this->reservations []= $elem18;
+            }
+            $xfer += $input->readListEnd();
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -606,21 +779,6 @@
       $xfer += $output->writeString($this->qualityOfService);
       $xfer += $output->writeFieldEnd();
     }
-    if ($this->reservation !== null) {
-      $xfer += $output->writeFieldBegin('reservation', TType::STRING, 13);
-      $xfer += $output->writeString($this->reservation);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->reservationStartTime !== null) {
-      $xfer += $output->writeFieldBegin('reservationStartTime', TType::I64, 14);
-      $xfer += $output->writeI64($this->reservationStartTime);
-      $xfer += $output->writeFieldEnd();
-    }
-    if ($this->reservationEndTime !== null) {
-      $xfer += $output->writeFieldBegin('reservationEndTime', TType::I64, 15);
-      $xfer += $output->writeI64($this->reservationEndTime);
-      $xfer += $output->writeFieldEnd();
-    }
     if ($this->sshAccountProvisioner !== null) {
       $xfer += $output->writeFieldBegin('sshAccountProvisioner', TType::STRING, 16);
       $xfer += $output->writeString($this->sshAccountProvisioner);
@@ -634,9 +792,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->groupSSHAccountProvisionerConfigs));
         {
-          foreach ($this->groupSSHAccountProvisionerConfigs as $iter6)
+          foreach ($this->groupSSHAccountProvisionerConfigs as $iter19)
           {
-            $xfer += $iter6->write($output);
+            $xfer += $iter19->write($output);
           }
         }
         $output->writeListEnd();
@@ -648,6 +806,23 @@
       $xfer += $output->writeString($this->sshAccountProvisionerAdditionalInfo);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->reservations !== null) {
+      if (!is_array($this->reservations)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('reservations', TType::LST, 19);
+      {
+        $output->writeListBegin(TType::STRUCT, count($this->reservations));
+        {
+          foreach ($this->reservations as $iter20)
+          {
+            $xfer += $iter20->write($output);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
@@ -759,14 +934,14 @@
         case 4:
           if ($ftype == TType::LST) {
             $this->allowedBatchQueues = array();
-            $_size7 = 0;
-            $_etype10 = 0;
-            $xfer += $input->readListBegin($_etype10, $_size7);
-            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
+            $_size21 = 0;
+            $_etype24 = 0;
+            $xfer += $input->readListBegin($_etype24, $_size21);
+            for ($_i25 = 0; $_i25 < $_size21; ++$_i25)
             {
-              $elem12 = null;
-              $xfer += $input->readString($elem12);
-              $this->allowedBatchQueues []= $elem12;
+              $elem26 = null;
+              $xfer += $input->readString($elem26);
+              $this->allowedBatchQueues []= $elem26;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -809,9 +984,9 @@
       {
         $output->writeListBegin(TType::STRING, count($this->allowedBatchQueues));
         {
-          foreach ($this->allowedBatchQueues as $iter13)
+          foreach ($this->allowedBatchQueues as $iter27)
           {
-            $xfer += $output->writeString($iter13);
+            $xfer += $output->writeString($iter27);
           }
         }
         $output->writeListEnd();
@@ -1229,15 +1404,15 @@
         case 4:
           if ($ftype == TType::LST) {
             $this->computePreferences = array();
-            $_size14 = 0;
-            $_etype17 = 0;
-            $xfer += $input->readListBegin($_etype17, $_size14);
-            for ($_i18 = 0; $_i18 < $_size14; ++$_i18)
+            $_size28 = 0;
+            $_etype31 = 0;
+            $xfer += $input->readListBegin($_etype31, $_size28);
+            for ($_i32 = 0; $_i32 < $_size28; ++$_i32)
             {
-              $elem19 = null;
-              $elem19 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
-              $xfer += $elem19->read($input);
-              $this->computePreferences []= $elem19;
+              $elem33 = null;
+              $elem33 = new \Airavata\Model\AppCatalog\GroupResourceProfile\GroupComputeResourcePreference();
+              $xfer += $elem33->read($input);
+              $this->computePreferences []= $elem33;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1247,15 +1422,15 @@
         case 5:
           if ($ftype == TType::LST) {
             $this->computeResourcePolicies = array();
-            $_size20 = 0;
-            $_etype23 = 0;
-            $xfer += $input->readListBegin($_etype23, $_size20);
-            for ($_i24 = 0; $_i24 < $_size20; ++$_i24)
+            $_size34 = 0;
+            $_etype37 = 0;
+            $xfer += $input->readListBegin($_etype37, $_size34);
+            for ($_i38 = 0; $_i38 < $_size34; ++$_i38)
             {
-              $elem25 = null;
-              $elem25 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
-              $xfer += $elem25->read($input);
-              $this->computeResourcePolicies []= $elem25;
+              $elem39 = null;
+              $elem39 = new \Airavata\Model\AppCatalog\GroupResourceProfile\ComputeResourcePolicy();
+              $xfer += $elem39->read($input);
+              $this->computeResourcePolicies []= $elem39;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1265,15 +1440,15 @@
         case 6:
           if ($ftype == TType::LST) {
             $this->batchQueueResourcePolicies = array();
-            $_size26 = 0;
-            $_etype29 = 0;
-            $xfer += $input->readListBegin($_etype29, $_size26);
-            for ($_i30 = 0; $_i30 < $_size26; ++$_i30)
+            $_size40 = 0;
+            $_etype43 = 0;
+            $xfer += $input->readListBegin($_etype43, $_size40);
+            for ($_i44 = 0; $_i44 < $_size40; ++$_i44)
             {
-              $elem31 = null;
-              $elem31 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
-              $xfer += $elem31->read($input);
-              $this->batchQueueResourcePolicies []= $elem31;
+              $elem45 = null;
+              $elem45 = new \Airavata\Model\AppCatalog\GroupResourceProfile\BatchQueueResourcePolicy();
+              $xfer += $elem45->read($input);
+              $this->batchQueueResourcePolicies []= $elem45;
             }
             $xfer += $input->readListEnd();
           } else {
@@ -1337,9 +1512,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->computePreferences));
         {
-          foreach ($this->computePreferences as $iter32)
+          foreach ($this->computePreferences as $iter46)
           {
-            $xfer += $iter32->write($output);
+            $xfer += $iter46->write($output);
           }
         }
         $output->writeListEnd();
@@ -1354,9 +1529,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->computeResourcePolicies));
         {
-          foreach ($this->computeResourcePolicies as $iter33)
+          foreach ($this->computeResourcePolicies as $iter47)
           {
-            $xfer += $iter33->write($output);
+            $xfer += $iter47->write($output);
           }
         }
         $output->writeListEnd();
@@ -1371,9 +1546,9 @@
       {
         $output->writeListBegin(TType::STRUCT, count($this->batchQueueResourcePolicies));
         {
-          foreach ($this->batchQueueResourcePolicies as $iter34)
+          foreach ($this->batchQueueResourcePolicies as $iter48)
           {
-            $xfer += $iter34->write($output);
+            $xfer += $iter48->write($output);
           }
         }
         $output->writeListEnd();
diff --git a/app/libraries/Airavata/Model/Application/Io/Types.php b/app/libraries/Airavata/Model/Application/Io/Types.php
index fb4977e..9543c61 100644
--- a/app/libraries/Airavata/Model/Application/Io/Types.php
+++ b/app/libraries/Airavata/Model/Application/Io/Types.php
@@ -65,6 +65,8 @@
  * metaData:
  *   Any metadat. This is typically ignore by Airavata and is used by gateways for application configuration.
  * 
+ * overrideFilename:
+ *   Rename input file to given value when staging to compute resource.
  */
 class InputDataObjectType {
   static $_TSPEC;
@@ -121,6 +123,10 @@
    * @var bool
    */
   public $isReadOnly = null;
+  /**
+   * @var string
+   */
+  public $overrideFilename = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -177,6 +183,10 @@
           'var' => 'isReadOnly',
           'type' => TType::BOOL,
           ),
+        14 => array(
+          'var' => 'overrideFilename',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -219,6 +229,9 @@
       if (isset($vals['isReadOnly'])) {
         $this->isReadOnly = $vals['isReadOnly'];
       }
+      if (isset($vals['overrideFilename'])) {
+        $this->overrideFilename = $vals['overrideFilename'];
+      }
     }
   }
 
@@ -332,6 +345,13 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 14:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->overrideFilename);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -410,6 +430,11 @@
       $xfer += $output->writeBool($this->isReadOnly);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->overrideFilename !== null) {
+      $xfer += $output->writeFieldBegin('overrideFilename', TType::STRING, 14);
+      $xfer += $output->writeString($this->overrideFilename);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/app/libraries/Airavata/Model/Group/Types.php b/app/libraries/Airavata/Model/Group/Types.php
index 9e17f8a..f74a97f 100644
--- a/app/libraries/Airavata/Model/Group/Types.php
+++ b/app/libraries/Airavata/Model/Group/Types.php
@@ -40,10 +40,12 @@
   const WRITE = 0;
   const READ = 1;
   const OWNER = 2;
+  const MANAGE_SHARING = 3;
   static public $__names = array(
     0 => 'WRITE',
     1 => 'READ',
     2 => 'OWNER',
+    3 => 'MANAGE_SHARING',
   );
 }
 
diff --git a/app/libraries/Airavata/Model/Messaging/Event/Types.php b/app/libraries/Airavata/Model/Messaging/Event/Types.php
index cb6df57..031bd90 100644
--- a/app/libraries/Airavata/Model/Messaging/Event/Types.php
+++ b/app/libraries/Airavata/Model/Messaging/Event/Types.php
@@ -40,6 +40,7 @@
   const TERMINATEPROCESS = 6;
   const PROCESSOUTPUT = 7;
   const DB_EVENT = 8;
+  const INTERMEDIATE_OUTPUTS = 9;
   static public $__names = array(
     0 => 'EXPERIMENT',
     1 => 'EXPERIMENT_CANCEL',
@@ -50,6 +51,7 @@
     6 => 'TERMINATEPROCESS',
     7 => 'PROCESSOUTPUT',
     8 => 'DB_EVENT',
+    9 => 'INTERMEDIATE_OUTPUTS',
   );
 }
 
@@ -1718,6 +1720,153 @@
 
 }
 
+class ExperimentIntermediateOutputsEvent {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $experimentId = null;
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string[]
+   */
+  public $outputNames = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'experimentId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'outputNames',
+          'type' => TType::LST,
+          'etype' => TType::STRING,
+          'elem' => array(
+            'type' => TType::STRING,
+            ),
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['experimentId'])) {
+        $this->experimentId = $vals['experimentId'];
+      }
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['outputNames'])) {
+        $this->outputNames = $vals['outputNames'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'ExperimentIntermediateOutputsEvent';
+  }
+
+  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->experimentId);
+          } 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::LST) {
+            $this->outputNames = array();
+            $_size7 = 0;
+            $_etype10 = 0;
+            $xfer += $input->readListBegin($_etype10, $_size7);
+            for ($_i11 = 0; $_i11 < $_size7; ++$_i11)
+            {
+              $elem12 = null;
+              $xfer += $input->readString($elem12);
+              $this->outputNames []= $elem12;
+            }
+            $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('ExperimentIntermediateOutputsEvent');
+    if ($this->experimentId !== null) {
+      $xfer += $output->writeFieldBegin('experimentId', TType::STRING, 1);
+      $xfer += $output->writeString($this->experimentId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 2);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->outputNames !== null) {
+      if (!is_array($this->outputNames)) {
+        throw new TProtocolException('Bad type in structure.', TProtocolException::INVALID_DATA);
+      }
+      $xfer += $output->writeFieldBegin('outputNames', TType::LST, 3);
+      {
+        $output->writeListBegin(TType::STRING, count($this->outputNames));
+        {
+          foreach ($this->outputNames as $iter13)
+          {
+            $xfer += $output->writeString($iter13);
+          }
+        }
+        $output->writeListEnd();
+      }
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class Message {
   static $_TSPEC;
 
diff --git a/app/libraries/Airavata/Model/Sharing/Types.php b/app/libraries/Airavata/Model/Sharing/Types.php
index 7a74f6d..d5dd2d3 100644
--- a/app/libraries/Airavata/Model/Sharing/Types.php
+++ b/app/libraries/Airavata/Model/Sharing/Types.php
@@ -144,6 +144,7 @@
  * <li>description : A short description for the domain</li>
  * <li>createdTime : Will be set by the system</li>
  * <li>updatedTime : Will be set by the system</li>
+ * <li>initialUserGroupId : New users will automatically be added to this group</li>
  * 
  */
 class Domain {
@@ -169,6 +170,10 @@
    * @var int
    */
   public $updatedTime = null;
+  /**
+   * @var string
+   */
+  public $initialUserGroupId = null;
 
   public function __construct($vals=null) {
     if (!isset(self::$_TSPEC)) {
@@ -193,6 +198,10 @@
           'var' => 'updatedTime',
           'type' => TType::I64,
           ),
+        6 => array(
+          'var' => 'initialUserGroupId',
+          'type' => TType::STRING,
+          ),
         );
     }
     if (is_array($vals)) {
@@ -211,6 +220,9 @@
       if (isset($vals['updatedTime'])) {
         $this->updatedTime = $vals['updatedTime'];
       }
+      if (isset($vals['initialUserGroupId'])) {
+        $this->initialUserGroupId = $vals['initialUserGroupId'];
+      }
     }
   }
 
@@ -268,6 +280,13 @@
             $xfer += $input->skip($ftype);
           }
           break;
+        case 6:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->initialUserGroupId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
         default:
           $xfer += $input->skip($ftype);
           break;
@@ -306,6 +325,11 @@
       $xfer += $output->writeI64($this->updatedTime);
       $xfer += $output->writeFieldEnd();
     }
+    if ($this->initialUserGroupId !== null) {
+      $xfer += $output->writeFieldBegin('initialUserGroupId', TType::STRING, 6);
+      $xfer += $output->writeString($this->initialUserGroupId);
+      $xfer += $output->writeFieldEnd();
+    }
     $xfer += $output->writeFieldStop();
     $xfer += $output->writeStructEnd();
     return $xfer;
diff --git a/app/libraries/Airavata/Model/Workspace/Types.php b/app/libraries/Airavata/Model/Workspace/Types.php
index 8a2f3cb..8386b39 100644
--- a/app/libraries/Airavata/Model/Workspace/Types.php
+++ b/app/libraries/Airavata/Model/Workspace/Types.php
@@ -1137,6 +1137,127 @@
 
 }
 
+class GatewayUsageReportingCommand {
+  static $_TSPEC;
+
+  /**
+   * @var string
+   */
+  public $gatewayId = null;
+  /**
+   * @var string
+   */
+  public $computeResourceId = null;
+  /**
+   * @var string
+   */
+  public $command = null;
+
+  public function __construct($vals=null) {
+    if (!isset(self::$_TSPEC)) {
+      self::$_TSPEC = array(
+        1 => array(
+          'var' => 'gatewayId',
+          'type' => TType::STRING,
+          ),
+        2 => array(
+          'var' => 'computeResourceId',
+          'type' => TType::STRING,
+          ),
+        3 => array(
+          'var' => 'command',
+          'type' => TType::STRING,
+          ),
+        );
+    }
+    if (is_array($vals)) {
+      if (isset($vals['gatewayId'])) {
+        $this->gatewayId = $vals['gatewayId'];
+      }
+      if (isset($vals['computeResourceId'])) {
+        $this->computeResourceId = $vals['computeResourceId'];
+      }
+      if (isset($vals['command'])) {
+        $this->command = $vals['command'];
+      }
+    }
+  }
+
+  public function getName() {
+    return 'GatewayUsageReportingCommand';
+  }
+
+  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->gatewayId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 2:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->computeResourceId);
+          } else {
+            $xfer += $input->skip($ftype);
+          }
+          break;
+        case 3:
+          if ($ftype == TType::STRING) {
+            $xfer += $input->readString($this->command);
+          } 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('GatewayUsageReportingCommand');
+    if ($this->gatewayId !== null) {
+      $xfer += $output->writeFieldBegin('gatewayId', TType::STRING, 1);
+      $xfer += $output->writeString($this->gatewayId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->computeResourceId !== null) {
+      $xfer += $output->writeFieldBegin('computeResourceId', TType::STRING, 2);
+      $xfer += $output->writeString($this->computeResourceId);
+      $xfer += $output->writeFieldEnd();
+    }
+    if ($this->command !== null) {
+      $xfer += $output->writeFieldBegin('command', TType::STRING, 3);
+      $xfer += $output->writeString($this->command);
+      $xfer += $output->writeFieldEnd();
+    }
+    $xfer += $output->writeFieldStop();
+    $xfer += $output->writeStructEnd();
+    return $xfer;
+  }
+
+}
+
 class Notification {
   static $_TSPEC;
 
