diff --git a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/GatewayUsageReportingCommand.java b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/GatewayUsageReportingCommand.java
index 1b8196d..de9d648 100644
--- a/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/GatewayUsageReportingCommand.java
+++ b/airavata-api/airavata-data-models/src/main/java/org/apache/airavata/model/workspace/GatewayUsageReportingCommand.java
@@ -29,18 +29,21 @@
   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("GatewayUsageReportingCommand");
 
   private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
-  private static final org.apache.thrift.protocol.TField COMMAND_FIELD_DESC = new org.apache.thrift.protocol.TField("command", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceId", org.apache.thrift.protocol.TType.STRING, (short)2);
+  private static final org.apache.thrift.protocol.TField COMMAND_FIELD_DESC = new org.apache.thrift.protocol.TField("command", org.apache.thrift.protocol.TType.STRING, (short)3);
 
   private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new GatewayUsageReportingCommandStandardSchemeFactory();
   private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new GatewayUsageReportingCommandTupleSchemeFactory();
 
   private java.lang.String gatewayId; // required
+  private java.lang.String computeResourceId; // required
   private java.lang.String command; // required
 
   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     GATEWAY_ID((short)1, "gatewayId"),
-    COMMAND((short)2, "command");
+    COMPUTE_RESOURCE_ID((short)2, "computeResourceId"),
+    COMMAND((short)3, "command");
 
     private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -57,7 +60,9 @@
       switch(fieldId) {
         case 1: // GATEWAY_ID
           return GATEWAY_ID;
-        case 2: // COMMAND
+        case 2: // COMPUTE_RESOURCE_ID
+          return COMPUTE_RESOURCE_ID;
+        case 3: // COMMAND
           return COMMAND;
         default:
           return null;
@@ -104,6 +109,8 @@
     java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
     tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.COMPUTE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("computeResourceId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     tmpMap.put(_Fields.COMMAND, new org.apache.thrift.meta_data.FieldMetaData("command", org.apache.thrift.TFieldRequirementType.REQUIRED, 
         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
     metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
@@ -115,10 +122,12 @@
 
   public GatewayUsageReportingCommand(
     java.lang.String gatewayId,
+    java.lang.String computeResourceId,
     java.lang.String command)
   {
     this();
     this.gatewayId = gatewayId;
+    this.computeResourceId = computeResourceId;
     this.command = command;
   }
 
@@ -129,6 +138,9 @@
     if (other.isSetGatewayId()) {
       this.gatewayId = other.gatewayId;
     }
+    if (other.isSetComputeResourceId()) {
+      this.computeResourceId = other.computeResourceId;
+    }
     if (other.isSetCommand()) {
       this.command = other.command;
     }
@@ -141,6 +153,7 @@
   @Override
   public void clear() {
     this.gatewayId = null;
+    this.computeResourceId = null;
     this.command = null;
   }
 
@@ -167,6 +180,29 @@
     }
   }
 
+  public java.lang.String getComputeResourceId() {
+    return this.computeResourceId;
+  }
+
+  public void setComputeResourceId(java.lang.String computeResourceId) {
+    this.computeResourceId = computeResourceId;
+  }
+
+  public void unsetComputeResourceId() {
+    this.computeResourceId = null;
+  }
+
+  /** Returns true if field computeResourceId is set (has been assigned a value) and false otherwise */
+  public boolean isSetComputeResourceId() {
+    return this.computeResourceId != null;
+  }
+
+  public void setComputeResourceIdIsSet(boolean value) {
+    if (!value) {
+      this.computeResourceId = null;
+    }
+  }
+
   public java.lang.String getCommand() {
     return this.command;
   }
@@ -200,6 +236,14 @@
       }
       break;
 
+    case COMPUTE_RESOURCE_ID:
+      if (value == null) {
+        unsetComputeResourceId();
+      } else {
+        setComputeResourceId((java.lang.String)value);
+      }
+      break;
+
     case COMMAND:
       if (value == null) {
         unsetCommand();
@@ -216,6 +260,9 @@
     case GATEWAY_ID:
       return getGatewayId();
 
+    case COMPUTE_RESOURCE_ID:
+      return getComputeResourceId();
+
     case COMMAND:
       return getCommand();
 
@@ -232,6 +279,8 @@
     switch (field) {
     case GATEWAY_ID:
       return isSetGatewayId();
+    case COMPUTE_RESOURCE_ID:
+      return isSetComputeResourceId();
     case COMMAND:
       return isSetCommand();
     }
@@ -262,6 +311,15 @@
         return false;
     }
 
+    boolean this_present_computeResourceId = true && this.isSetComputeResourceId();
+    boolean that_present_computeResourceId = true && that.isSetComputeResourceId();
+    if (this_present_computeResourceId || that_present_computeResourceId) {
+      if (!(this_present_computeResourceId && that_present_computeResourceId))
+        return false;
+      if (!this.computeResourceId.equals(that.computeResourceId))
+        return false;
+    }
+
     boolean this_present_command = true && this.isSetCommand();
     boolean that_present_command = true && that.isSetCommand();
     if (this_present_command || that_present_command) {
@@ -282,6 +340,10 @@
     if (isSetGatewayId())
       hashCode = hashCode * 8191 + gatewayId.hashCode();
 
+    hashCode = hashCode * 8191 + ((isSetComputeResourceId()) ? 131071 : 524287);
+    if (isSetComputeResourceId())
+      hashCode = hashCode * 8191 + computeResourceId.hashCode();
+
     hashCode = hashCode * 8191 + ((isSetCommand()) ? 131071 : 524287);
     if (isSetCommand())
       hashCode = hashCode * 8191 + command.hashCode();
@@ -307,6 +369,16 @@
         return lastComparison;
       }
     }
+    lastComparison = java.lang.Boolean.valueOf(isSetComputeResourceId()).compareTo(other.isSetComputeResourceId());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetComputeResourceId()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceId, other.computeResourceId);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
     lastComparison = java.lang.Boolean.valueOf(isSetCommand()).compareTo(other.isSetCommand());
     if (lastComparison != 0) {
       return lastComparison;
@@ -345,6 +417,14 @@
     }
     first = false;
     if (!first) sb.append(", ");
+    sb.append("computeResourceId:");
+    if (this.computeResourceId == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.computeResourceId);
+    }
+    first = false;
+    if (!first) sb.append(", ");
     sb.append("command:");
     if (this.command == null) {
       sb.append("null");
@@ -362,6 +442,10 @@
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' is unset! Struct:" + toString());
     }
 
+    if (!isSetComputeResourceId()) {
+      throw new org.apache.thrift.protocol.TProtocolException("Required field 'computeResourceId' is unset! Struct:" + toString());
+    }
+
     if (!isSetCommand()) {
       throw new org.apache.thrift.protocol.TProtocolException("Required field 'command' is unset! Struct:" + toString());
     }
@@ -411,7 +495,15 @@
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
             }
             break;
-          case 2: // COMMAND
+          case 2: // COMPUTE_RESOURCE_ID
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.computeResourceId = iprot.readString();
+              struct.setComputeResourceIdIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 3: // COMMAND
             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
               struct.command = iprot.readString();
               struct.setCommandIsSet(true);
@@ -437,6 +529,11 @@
         oprot.writeString(struct.gatewayId);
         oprot.writeFieldEnd();
       }
+      if (struct.computeResourceId != null) {
+        oprot.writeFieldBegin(COMPUTE_RESOURCE_ID_FIELD_DESC);
+        oprot.writeString(struct.computeResourceId);
+        oprot.writeFieldEnd();
+      }
       if (struct.command != null) {
         oprot.writeFieldBegin(COMMAND_FIELD_DESC);
         oprot.writeString(struct.command);
@@ -460,6 +557,7 @@
     public void write(org.apache.thrift.protocol.TProtocol prot, GatewayUsageReportingCommand struct) throws org.apache.thrift.TException {
       org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       oprot.writeString(struct.gatewayId);
+      oprot.writeString(struct.computeResourceId);
       oprot.writeString(struct.command);
     }
 
@@ -468,6 +566,8 @@
       org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
       struct.gatewayId = iprot.readString();
       struct.setGatewayIdIsSet(true);
+      struct.computeResourceId = iprot.readString();
+      struct.setComputeResourceIdIsSet(true);
       struct.command = iprot.readString();
       struct.setCommandIsSet(true);
     }
diff --git a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
index 66eb333..20efe03 100644
--- a/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
+++ b/modules/airavata-helix/helix-spectator/src/main/java/org/apache/airavata/helix/impl/task/submission/DefaultJobSubmissionTask.java
@@ -190,10 +190,13 @@
                 // usage reporting as the last step of job submission task
                 try {
                     mapData.setJobId(jobId);
-                    boolean reportingAvailable = getRegistryServiceClient().isReportingAvailable(getGatewayId());
+                    boolean reportingAvailable = getRegistryServiceClient()
+                                                .isGatewayUsageReportingAvailable(getGatewayId(), taskContext.getComputeResourceId());
 
                     if (reportingAvailable) {
-                        GatewayUsageReportingCommand reportingCommand = getRegistryServiceClient().getGatewayReportingCommand(getGatewayId());
+                        GatewayUsageReportingCommand reportingCommand = getRegistryServiceClient()
+                                                .getGatewayReportingCommand(getGatewayId(), taskContext.getComputeResourceId());
+
                         String parsedCommand = mapData.loadFromString(reportingCommand.getCommand());
                         logger.debug("Parsed usage reporting command {}", parsedCommand);
 
diff --git a/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql b/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql
index 1e561e6..1be66c6 100644
--- a/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql
+++ b/modules/ide-integration/src/main/resources/database_scripts/init/04-expcatalog-migrations.sql
@@ -3,8 +3,9 @@
 ALTER TABLE EXPERIMENT_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
 ALTER TABLE PROCESS_INPUT ADD COLUMN IF NOT EXISTS OVERRIDE_FILENAME VARCHAR(255);
 
-CREATE TABLE IF NOT EXISTS GATEWAY_USAGE_REPORTING_COMMAND (
-    GATEWAY_ID VARCHAR(255) NOT NULL,
-    COMMAND LONGTEXT NOT NULL,
-    PRIMARY KEY (GATEWAY_ID)
+CREATE TABLE GATEWAY_USAGE_REPORTING_COMMAND (
+  GATEWAY_ID VARCHAR(255) NOT NULL,
+  COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
+  COMMAND LONGTEXT NOT NULL,
+  PRIMARY KEY (GATEWAY_ID, COMPUTE_RESOURCE_ID)
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
\ No newline at end of file
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingCommandEntity.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingCommandEntity.java
index 1aec78a..1beeb34 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingCommandEntity.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingCommandEntity.java
@@ -24,6 +24,7 @@
 
 @Entity
 @Table(name = "GATEWAY_USAGE_REPORTING_COMMAND")
+@IdClass(GatewayUsageReportingPK.class)
 public class GatewayUsageReportingCommandEntity implements Serializable {
     private static final long serialVersionUID = 1L;
 
@@ -31,6 +32,10 @@
     @Column(name = "GATEWAY_ID")
     private String gatewayId;
 
+    @Id
+    @Column(name = "COMPUTE_RESOURCE_ID")
+    private String computeResourceId;
+
     @Lob
     @Column(name = "COMMAND")
     private String command;
@@ -50,4 +55,12 @@
     public void setCommand(String command) {
         this.command = command;
     }
+
+    public String getComputeResourceId() {
+        return computeResourceId;
+    }
+
+    public void setComputeResourceId(String computeResourceId) {
+        this.computeResourceId = computeResourceId;
+    }
 }
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingPK.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingPK.java
new file mode 100644
index 0000000..16eb944
--- /dev/null
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/entities/expcatalog/GatewayUsageReportingPK.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ package org.apache.airavata.registry.core.entities.expcatalog;
+
+import java.io.Serializable;
+
+public class GatewayUsageReportingPK implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String gatewayId;
+    private String computeResourceId;
+
+    public GatewayUsageReportingPK() {
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getComputeResourceId() {
+        return computeResourceId;
+    }
+
+    public void setComputeResourceId(String computeResourceId) {
+        this.computeResourceId = computeResourceId;
+    }
+
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (!(other instanceof GatewayUsageReportingPK)) {
+            return false;
+        }
+        GatewayUsageReportingPK castOther = (GatewayUsageReportingPK) other;
+        return
+                this.gatewayId.equals(castOther.gatewayId)
+                        && this.computeResourceId.equals(castOther.computeResourceId);
+    }
+
+    public int hashCode() {
+        final int prime = 31;
+        int hash = 17;
+        hash = hash * prime + this.gatewayId.hashCode();
+        hash = hash * prime + this.computeResourceId.hashCode();
+
+        return hash;
+    }
+}
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
index 5c0ba5f..12130de 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
@@ -21,6 +21,7 @@
 
 import org.apache.airavata.model.workspace.GatewayUsageReportingCommand;
 import org.apache.airavata.registry.core.entities.expcatalog.GatewayUsageReportingCommandEntity;
+import org.apache.airavata.registry.core.entities.expcatalog.GatewayUsageReportingPK;
 import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.dozer.Mapper;
@@ -28,7 +29,7 @@
 import org.slf4j.LoggerFactory;
 
 public class GatewayUsageReportingCommandRepository extends
-                    ExpCatAbstractRepository<GatewayUsageReportingCommand, GatewayUsageReportingCommandEntity, String> {
+                    ExpCatAbstractRepository<GatewayUsageReportingCommand, GatewayUsageReportingCommandEntity, GatewayUsageReportingPK> {
 
     private final static Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
 
@@ -42,17 +43,26 @@
         logger.info("Added gateway usage reporting command for gateway {} to the database", command.getGatewayId());
     }
 
-    public GatewayUsageReportingCommand getGatewayUsageReportingCommand(String gatewayId) {
-        return get(gatewayId);
+    public GatewayUsageReportingCommand getGatewayUsageReportingCommand(String gatewayId, String computeResourceId) {
+        GatewayUsageReportingPK pk = new GatewayUsageReportingPK();
+        pk.setGatewayId(gatewayId);
+        pk.setComputeResourceId(computeResourceId);
+        return get(pk);
     }
 
-    public boolean isGatewayUsageReportingCommandExists(String gatewayId) throws RegistryException {
-        return isExists(gatewayId);
+    public boolean isGatewayUsageReportingCommandExists(String gatewayId, String computeResourceId) throws RegistryException {
+        GatewayUsageReportingPK pk = new GatewayUsageReportingPK();
+        pk.setGatewayId(gatewayId);
+        pk.setComputeResourceId(computeResourceId);
+        return isExists(pk);
     }
 
-    public void removeGatewayUsageReportingCommand(String gatewayId) throws RegistryException {
-        if (isExists(gatewayId)) {
-            delete(gatewayId);
+    public void removeGatewayUsageReportingCommand(String gatewayId, String computeResourceId) throws RegistryException {
+        if (isGatewayUsageReportingCommandExists(gatewayId, computeResourceId)) {
+            GatewayUsageReportingPK pk = new GatewayUsageReportingPK();
+            pk.setGatewayId(gatewayId);
+            pk.setComputeResourceId(computeResourceId);
+            delete(pk);
             logger.info("Deleted gateway usage reporting command for gateway {}", gatewayId);
         }
     }
diff --git a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
index d910f14..9ee940b 100644
--- a/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/appcatalog-mysql.sql
@@ -727,12 +727,6 @@
   PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID)
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
-CREATE TABLE GATEWAY_USAGE_REPORTING_COMMAND (
-  GATEWAY_ID VARCHAR(255) NOT NULL,
-  COMMAND LONGTEXT NOT NULL,
-  PRIMARY KEY (GATEWAY_ID)
-)ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
 CREATE TABLE CONFIGURATION
 (
           CONFIG_KEY VARCHAR(255),
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
index 85f12f1..0c92467 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-derby.sql
@@ -417,3 +417,10 @@
   PRIMARY KEY (PROCESS_ID, WORKFLOW_ID),
   FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 );
+
+CREATE TABLE GATEWAY_USAGE_REPORTING_COMMAND (
+  GATEWAY_ID VARCHAR(255) NOT NULL,
+  COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
+  COMMAND LONGTEXT NOT NULL,
+  PRIMARY KEY (GATEWAY_ID, COMPUTE_RESOURCE_ID)
+)
\ No newline at end of file
diff --git a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
index b093aa3..3560703 100644
--- a/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
+++ b/modules/registry/registry-core/src/main/resources/expcatalog-mysql.sql
@@ -419,3 +419,10 @@
   PRIMARY KEY (PROCESS_ID, WORKFLOW_ID),
   FOREIGN KEY (PROCESS_ID) REFERENCES PROCESS(PROCESS_ID) ON DELETE CASCADE
 )ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE GATEWAY_USAGE_REPORTING_COMMAND (
+  GATEWAY_ID VARCHAR(255) NOT NULL,
+  COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
+  COMMAND LONGTEXT NOT NULL,
+  PRIMARY KEY (GATEWAY_ID, COMPUTE_RESOURCE_ID)
+)ENGINE=InnoDB DEFAULT CHARSET=latin1;
diff --git a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
index 222054f..3ff767d 100644
--- a/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
+++ b/modules/registry/registry-server/registry-api-service/src/main/java/org/apache/airavata/registry/api/service/handler/RegistryServerHandler.java
@@ -5063,33 +5063,12 @@
     }
 
     @Override
-    public boolean isReportingAvailable(String gatewayId) throws RegistryServiceException, TException {
+    public boolean isGatewayUsageReportingAvailable(String gatewayId, String computeResourceId) throws RegistryServiceException, TException {
         try {
-            return usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId);
+            return usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId, computeResourceId);
         } catch (Exception e) {
-            String message = "Failed to check the availability to find the reporting information for the gateway " + gatewayId;
-            logger.error(message, e);
-            RegistryServiceException rse = new RegistryServiceException();
-            rse.setMessage(message + ". More info " + e.getMessage());
-            throw rse;
-        }
-    }
-
-    @Override
-    public GatewayUsageReportingCommand getGatewayReportingCommand(String gatewayId) throws RegistryServiceException, TException {
-        try {
-            if (usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId)) {
-                return usageReportingCommandRepository.getGatewayUsageReportingCommand(gatewayId);
-            } else {
-                String message = "No usage reporting information for the gateway " + gatewayId;
-                logger.error(message);
-                throw new RegistryServiceException(message);
-            }
-        } catch (RegistryServiceException e) {
-            throw e; // re-throw
-
-        } catch (Exception e) {
-            String message = "Failed to check the availability to find the reporting information for the gateway " + gatewayId;
+            String message = "Failed to check the availability to find the reporting information for the gateway "
+                                                        + gatewayId + " and compute resource " + computeResourceId;
             logger.error(message, e);
             RegistryServiceException rse = new RegistryServiceException();
             rse.setMessage(message + ". More info " + e.getMessage());
@@ -5097,11 +5076,34 @@
         }    }
 
     @Override
+    public GatewayUsageReportingCommand getGatewayReportingCommand(String gatewayId, String computeResourceId) throws RegistryServiceException, TException {
+        try {
+            if (usageReportingCommandRepository.isGatewayUsageReportingCommandExists(gatewayId, computeResourceId)) {
+                return usageReportingCommandRepository.getGatewayUsageReportingCommand(gatewayId, computeResourceId);
+            } else {
+                String message = "No usage reporting information for the gateway " + gatewayId + " and compute resource " + computeResourceId;
+                logger.error(message);
+                throw new RegistryServiceException(message);
+            }
+        } catch (RegistryServiceException e) {
+            throw e; // re-throw
+
+        } catch (Exception e) {
+            String message = "Failed to check the availability to find the reporting information for the gateway " +
+                                gatewayId + " and compute resource " + computeResourceId;
+            logger.error(message, e);
+            RegistryServiceException rse = new RegistryServiceException();
+            rse.setMessage(message + ". More info " + e.getMessage());
+            throw rse;
+        }      }
+
+    @Override
     public void addGatewayUsageReportingCommand(GatewayUsageReportingCommand command) throws RegistryServiceException, TException {
         try {
             usageReportingCommandRepository.addGatewayUsageReportingCommand(command);
         } catch (Exception e) {
-            String message = "Failed to add the reporting information for the gateway " + command.getGatewayId();
+            String message = "Failed to add the reporting information for the gateway " + command.getGatewayId()
+                                + " and compute resource " + command.getComputeResourceId();
             logger.error(message, e);
             RegistryServiceException rse = new RegistryServiceException();
             rse.setMessage(message + ". More info " + e.getMessage());
@@ -5110,11 +5112,12 @@
     }
 
     @Override
-    public void removeGatewayUsageReportingCommand(GatewayUsageReportingCommand command) throws RegistryServiceException, TException {
+    public void removeGatewayUsageReportingCommand(String gatewayId, String computeResourceId) throws RegistryServiceException, TException {
         try {
-            usageReportingCommandRepository.removeGatewayUsageReportingCommand(command.getGatewayId());
+            usageReportingCommandRepository.removeGatewayUsageReportingCommand(gatewayId, computeResourceId);
         } catch (Exception e) {
-            String message = "Failed to add the reporting information for the gateway " + command.getGatewayId();
+            String message = "Failed to add the reporting information for the gateway " + gatewayId +
+                                " and compute resource " + computeResourceId;
             logger.error(message, e);
             RegistryServiceException rse = new RegistryServiceException();
             rse.setMessage(message + ". More info " + e.getMessage());
diff --git a/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java b/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
index 5542dea..67b0c32 100644
--- a/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
+++ b/modules/registry/registry-server/registry-api-stubs/src/main/java/org/apache/airavata/registry/api/RegistryService.java
@@ -2610,13 +2610,13 @@
 
     public void removeParsingTemplate(java.lang.String templateId, java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
-    public boolean isReportingAvailable(java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
+    public boolean isGatewayUsageReportingAvailable(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
-    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand getGatewayReportingCommand(java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
+    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand getGatewayReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
     public void addGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
-    public void removeGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
+    public void removeGatewayUsageReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException;
 
   }
 
@@ -3014,13 +3014,13 @@
 
     public void removeParsingTemplate(java.lang.String templateId, java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException;
 
-    public void isReportingAvailable(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
+    public void isGatewayUsageReportingAvailable(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;
 
-    public void getGatewayReportingCommand(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler) throws org.apache.thrift.TException;
+    public void getGatewayReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler) throws org.apache.thrift.TException;
 
     public void addGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException;
 
-    public void removeGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException;
+    public void removeGatewayUsageReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException;
 
   }
 
@@ -8277,42 +8277,44 @@
       return;
     }
 
-    public boolean isReportingAvailable(java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    public boolean isGatewayUsageReportingAvailable(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
     {
-      send_isReportingAvailable(gatewayId);
-      return recv_isReportingAvailable();
+      send_isGatewayUsageReportingAvailable(gatewayId, computeResourceId);
+      return recv_isGatewayUsageReportingAvailable();
     }
 
-    public void send_isReportingAvailable(java.lang.String gatewayId) throws org.apache.thrift.TException
+    public void send_isGatewayUsageReportingAvailable(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.thrift.TException
     {
-      isReportingAvailable_args args = new isReportingAvailable_args();
+      isGatewayUsageReportingAvailable_args args = new isGatewayUsageReportingAvailable_args();
       args.setGatewayId(gatewayId);
-      sendBase("isReportingAvailable", args);
+      args.setComputeResourceId(computeResourceId);
+      sendBase("isGatewayUsageReportingAvailable", args);
     }
 
-    public boolean recv_isReportingAvailable() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    public boolean recv_isGatewayUsageReportingAvailable() throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
     {
-      isReportingAvailable_result result = new isReportingAvailable_result();
-      receiveBase(result, "isReportingAvailable");
+      isGatewayUsageReportingAvailable_result result = new isGatewayUsageReportingAvailable_result();
+      receiveBase(result, "isGatewayUsageReportingAvailable");
       if (result.isSetSuccess()) {
         return result.success;
       }
       if (result.rse != null) {
         throw result.rse;
       }
-      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "isReportingAvailable failed: unknown result");
+      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "isGatewayUsageReportingAvailable failed: unknown result");
     }
 
-    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand getGatewayReportingCommand(java.lang.String gatewayId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand getGatewayReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
     {
-      send_getGatewayReportingCommand(gatewayId);
+      send_getGatewayReportingCommand(gatewayId, computeResourceId);
       return recv_getGatewayReportingCommand();
     }
 
-    public void send_getGatewayReportingCommand(java.lang.String gatewayId) throws org.apache.thrift.TException
+    public void send_getGatewayReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.thrift.TException
     {
       getGatewayReportingCommand_args args = new getGatewayReportingCommand_args();
       args.setGatewayId(gatewayId);
+      args.setComputeResourceId(computeResourceId);
       sendBase("getGatewayReportingCommand", args);
     }
 
@@ -8352,16 +8354,17 @@
       return;
     }
 
-    public void removeGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
+    public void removeGatewayUsageReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.airavata.registry.api.exception.RegistryServiceException, org.apache.thrift.TException
     {
-      send_removeGatewayUsageReportingCommand(command);
+      send_removeGatewayUsageReportingCommand(gatewayId, computeResourceId);
       recv_removeGatewayUsageReportingCommand();
     }
 
-    public void send_removeGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command) throws org.apache.thrift.TException
+    public void send_removeGatewayUsageReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId) throws org.apache.thrift.TException
     {
       removeGatewayUsageReportingCommand_args args = new removeGatewayUsageReportingCommand_args();
-      args.setCommand(command);
+      args.setGatewayId(gatewayId);
+      args.setComputeResourceId(computeResourceId);
       sendBase("removeGatewayUsageReportingCommand", args);
     }
 
@@ -15121,24 +15124,27 @@
       }
     }
 
-    public void isReportingAvailable(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
+    public void isGatewayUsageReportingAvailable(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      isReportingAvailable_call method_call = new isReportingAvailable_call(gatewayId, resultHandler, this, ___protocolFactory, ___transport);
+      isGatewayUsageReportingAvailable_call method_call = new isGatewayUsageReportingAvailable_call(gatewayId, computeResourceId, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
-    public static class isReportingAvailable_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {
+    public static class isGatewayUsageReportingAvailable_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {
       private java.lang.String gatewayId;
-      public isReportingAvailable_call(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String computeResourceId;
+      public isGatewayUsageReportingAvailable_call(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.gatewayId = gatewayId;
+        this.computeResourceId = computeResourceId;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
-        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("isReportingAvailable", org.apache.thrift.protocol.TMessageType.CALL, 0));
-        isReportingAvailable_args args = new isReportingAvailable_args();
+        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("isGatewayUsageReportingAvailable", org.apache.thrift.protocol.TMessageType.CALL, 0));
+        isGatewayUsageReportingAvailable_args args = new isGatewayUsageReportingAvailable_args();
         args.setGatewayId(gatewayId);
+        args.setComputeResourceId(computeResourceId);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -15149,28 +15155,31 @@
         }
         org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());
         org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);
-        return (new Client(prot)).recv_isReportingAvailable();
+        return (new Client(prot)).recv_isGatewayUsageReportingAvailable();
       }
     }
 
-    public void getGatewayReportingCommand(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler) throws org.apache.thrift.TException {
+    public void getGatewayReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      getGatewayReportingCommand_call method_call = new getGatewayReportingCommand_call(gatewayId, resultHandler, this, ___protocolFactory, ___transport);
+      getGatewayReportingCommand_call method_call = new getGatewayReportingCommand_call(gatewayId, computeResourceId, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class getGatewayReportingCommand_call extends org.apache.thrift.async.TAsyncMethodCall<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> {
       private java.lang.String gatewayId;
-      public getGatewayReportingCommand_call(java.lang.String gatewayId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String computeResourceId;
+      public getGatewayReportingCommand_call(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
         this.gatewayId = gatewayId;
+        this.computeResourceId = computeResourceId;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("getGatewayReportingCommand", org.apache.thrift.protocol.TMessageType.CALL, 0));
         getGatewayReportingCommand_args args = new getGatewayReportingCommand_args();
         args.setGatewayId(gatewayId);
+        args.setComputeResourceId(computeResourceId);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -15217,24 +15226,27 @@
       }
     }
 
-    public void removeGatewayUsageReportingCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException {
+    public void removeGatewayUsageReportingCommand(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException {
       checkReady();
-      removeGatewayUsageReportingCommand_call method_call = new removeGatewayUsageReportingCommand_call(command, resultHandler, this, ___protocolFactory, ___transport);
+      removeGatewayUsageReportingCommand_call method_call = new removeGatewayUsageReportingCommand_call(gatewayId, computeResourceId, resultHandler, this, ___protocolFactory, ___transport);
       this.___currentMethod = method_call;
       ___manager.call(method_call);
     }
 
     public static class removeGatewayUsageReportingCommand_call extends org.apache.thrift.async.TAsyncMethodCall<Void> {
-      private org.apache.airavata.model.workspace.GatewayUsageReportingCommand command;
-      public removeGatewayUsageReportingCommand_call(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
+      private java.lang.String gatewayId;
+      private java.lang.String computeResourceId;
+      public removeGatewayUsageReportingCommand_call(java.lang.String gatewayId, java.lang.String computeResourceId, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {
         super(client, protocolFactory, transport, resultHandler, false);
-        this.command = command;
+        this.gatewayId = gatewayId;
+        this.computeResourceId = computeResourceId;
       }
 
       public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {
         prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage("removeGatewayUsageReportingCommand", org.apache.thrift.protocol.TMessageType.CALL, 0));
         removeGatewayUsageReportingCommand_args args = new removeGatewayUsageReportingCommand_args();
-        args.setCommand(command);
+        args.setGatewayId(gatewayId);
+        args.setComputeResourceId(computeResourceId);
         args.write(prot);
         prot.writeMessageEnd();
       }
@@ -15458,7 +15470,7 @@
       processMap.put("saveParsingTemplate", new saveParsingTemplate());
       processMap.put("listAllParsingTemplates", new listAllParsingTemplates());
       processMap.put("removeParsingTemplate", new removeParsingTemplate());
-      processMap.put("isReportingAvailable", new isReportingAvailable());
+      processMap.put("isGatewayUsageReportingAvailable", new isGatewayUsageReportingAvailable());
       processMap.put("getGatewayReportingCommand", new getGatewayReportingCommand());
       processMap.put("addGatewayUsageReportingCommand", new addGatewayUsageReportingCommand());
       processMap.put("removeGatewayUsageReportingCommand", new removeGatewayUsageReportingCommand());
@@ -20257,23 +20269,23 @@
       }
     }
 
-    public static class isReportingAvailable<I extends Iface> extends org.apache.thrift.ProcessFunction<I, isReportingAvailable_args> {
-      public isReportingAvailable() {
-        super("isReportingAvailable");
+    public static class isGatewayUsageReportingAvailable<I extends Iface> extends org.apache.thrift.ProcessFunction<I, isGatewayUsageReportingAvailable_args> {
+      public isGatewayUsageReportingAvailable() {
+        super("isGatewayUsageReportingAvailable");
       }
 
-      public isReportingAvailable_args getEmptyArgsInstance() {
-        return new isReportingAvailable_args();
+      public isGatewayUsageReportingAvailable_args getEmptyArgsInstance() {
+        return new isGatewayUsageReportingAvailable_args();
       }
 
       protected boolean isOneway() {
         return false;
       }
 
-      public isReportingAvailable_result getResult(I iface, isReportingAvailable_args args) throws org.apache.thrift.TException {
-        isReportingAvailable_result result = new isReportingAvailable_result();
+      public isGatewayUsageReportingAvailable_result getResult(I iface, isGatewayUsageReportingAvailable_args args) throws org.apache.thrift.TException {
+        isGatewayUsageReportingAvailable_result result = new isGatewayUsageReportingAvailable_result();
         try {
-          result.success = iface.isReportingAvailable(args.gatewayId);
+          result.success = iface.isGatewayUsageReportingAvailable(args.gatewayId, args.computeResourceId);
           result.setSuccessIsSet(true);
         } catch (org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
           result.rse = rse;
@@ -20298,7 +20310,7 @@
       public getGatewayReportingCommand_result getResult(I iface, getGatewayReportingCommand_args args) throws org.apache.thrift.TException {
         getGatewayReportingCommand_result result = new getGatewayReportingCommand_result();
         try {
-          result.success = iface.getGatewayReportingCommand(args.gatewayId);
+          result.success = iface.getGatewayReportingCommand(args.gatewayId, args.computeResourceId);
         } catch (org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
           result.rse = rse;
         }
@@ -20346,7 +20358,7 @@
       public removeGatewayUsageReportingCommand_result getResult(I iface, removeGatewayUsageReportingCommand_args args) throws org.apache.thrift.TException {
         removeGatewayUsageReportingCommand_result result = new removeGatewayUsageReportingCommand_result();
         try {
-          iface.removeGatewayUsageReportingCommand(args.command);
+          iface.removeGatewayUsageReportingCommand(args.gatewayId, args.computeResourceId);
         } catch (org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
           result.rse = rse;
         }
@@ -20563,7 +20575,7 @@
       processMap.put("saveParsingTemplate", new saveParsingTemplate());
       processMap.put("listAllParsingTemplates", new listAllParsingTemplates());
       processMap.put("removeParsingTemplate", new removeParsingTemplate());
-      processMap.put("isReportingAvailable", new isReportingAvailable());
+      processMap.put("isGatewayUsageReportingAvailable", new isGatewayUsageReportingAvailable());
       processMap.put("getGatewayReportingCommand", new getGatewayReportingCommand());
       processMap.put("addGatewayUsageReportingCommand", new addGatewayUsageReportingCommand());
       processMap.put("removeGatewayUsageReportingCommand", new removeGatewayUsageReportingCommand());
@@ -33408,20 +33420,20 @@
       }
     }
 
-    public static class isReportingAvailable<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, isReportingAvailable_args, java.lang.Boolean> {
-      public isReportingAvailable() {
-        super("isReportingAvailable");
+    public static class isGatewayUsageReportingAvailable<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, isGatewayUsageReportingAvailable_args, java.lang.Boolean> {
+      public isGatewayUsageReportingAvailable() {
+        super("isGatewayUsageReportingAvailable");
       }
 
-      public isReportingAvailable_args getEmptyArgsInstance() {
-        return new isReportingAvailable_args();
+      public isGatewayUsageReportingAvailable_args getEmptyArgsInstance() {
+        return new isGatewayUsageReportingAvailable_args();
       }
 
       public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {
         final org.apache.thrift.AsyncProcessFunction fcall = this;
         return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { 
           public void onComplete(java.lang.Boolean o) {
-            isReportingAvailable_result result = new isReportingAvailable_result();
+            isGatewayUsageReportingAvailable_result result = new isGatewayUsageReportingAvailable_result();
             result.success = o;
             result.setSuccessIsSet(true);
             try {
@@ -33437,7 +33449,7 @@
           public void onError(java.lang.Exception e) {
             byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;
             org.apache.thrift.TSerializable msg;
-            isReportingAvailable_result result = new isReportingAvailable_result();
+            isGatewayUsageReportingAvailable_result result = new isGatewayUsageReportingAvailable_result();
             if (e instanceof org.apache.airavata.registry.api.exception.RegistryServiceException) {
               result.rse = (org.apache.airavata.registry.api.exception.RegistryServiceException) e;
               result.setRseIsSet(true);
@@ -33469,8 +33481,8 @@
         return false;
       }
 
-      public void start(I iface, isReportingAvailable_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
-        iface.isReportingAvailable(args.gatewayId,resultHandler);
+      public void start(I iface, isGatewayUsageReportingAvailable_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {
+        iface.isGatewayUsageReportingAvailable(args.gatewayId, args.computeResourceId,resultHandler);
       }
     }
 
@@ -33535,7 +33547,7 @@
       }
 
       public void start(I iface, getGatewayReportingCommand_args args, org.apache.thrift.async.AsyncMethodCallback<org.apache.airavata.model.workspace.GatewayUsageReportingCommand> resultHandler) throws org.apache.thrift.TException {
-        iface.getGatewayReportingCommand(args.gatewayId,resultHandler);
+        iface.getGatewayReportingCommand(args.gatewayId, args.computeResourceId,resultHandler);
       }
     }
 
@@ -33663,7 +33675,7 @@
       }
 
       public void start(I iface, removeGatewayUsageReportingCommand_args args, org.apache.thrift.async.AsyncMethodCallback<Void> resultHandler) throws org.apache.thrift.TException {
-        iface.removeGatewayUsageReportingCommand(args.command,resultHandler);
+        iface.removeGatewayUsageReportingCommand(args.gatewayId, args.computeResourceId,resultHandler);
       }
     }
 
@@ -213477,19 +213489,22 @@
     }
   }
 
-  public static class isReportingAvailable_args implements org.apache.thrift.TBase<isReportingAvailable_args, isReportingAvailable_args._Fields>, java.io.Serializable, Cloneable, Comparable<isReportingAvailable_args>   {
-    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("isReportingAvailable_args");
+  public static class isGatewayUsageReportingAvailable_args implements org.apache.thrift.TBase<isGatewayUsageReportingAvailable_args, isGatewayUsageReportingAvailable_args._Fields>, java.io.Serializable, Cloneable, Comparable<isGatewayUsageReportingAvailable_args>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("isGatewayUsageReportingAvailable_args");
 
     private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceId", org.apache.thrift.protocol.TType.STRING, (short)2);
 
-    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new isReportingAvailable_argsStandardSchemeFactory();
-    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new isReportingAvailable_argsTupleSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new isGatewayUsageReportingAvailable_argsStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new isGatewayUsageReportingAvailable_argsTupleSchemeFactory();
 
     public java.lang.String gatewayId; // required
+    public java.lang.String computeResourceId; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      GATEWAY_ID((short)1, "gatewayId");
+      GATEWAY_ID((short)1, "gatewayId"),
+      COMPUTE_RESOURCE_ID((short)2, "computeResourceId");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -213506,6 +213521,8 @@
         switch(fieldId) {
           case 1: // GATEWAY_ID
             return GATEWAY_ID;
+          case 2: // COMPUTE_RESOURCE_ID
+            return COMPUTE_RESOURCE_ID;
           default:
             return null;
         }
@@ -213551,43 +213568,51 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.COMPUTE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("computeResourceId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
-      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(isReportingAvailable_args.class, metaDataMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(isGatewayUsageReportingAvailable_args.class, metaDataMap);
     }
 
-    public isReportingAvailable_args() {
+    public isGatewayUsageReportingAvailable_args() {
     }
 
-    public isReportingAvailable_args(
-      java.lang.String gatewayId)
+    public isGatewayUsageReportingAvailable_args(
+      java.lang.String gatewayId,
+      java.lang.String computeResourceId)
     {
       this();
       this.gatewayId = gatewayId;
+      this.computeResourceId = computeResourceId;
     }
 
     /**
      * Performs a deep copy on <i>other</i>.
      */
-    public isReportingAvailable_args(isReportingAvailable_args other) {
+    public isGatewayUsageReportingAvailable_args(isGatewayUsageReportingAvailable_args other) {
       if (other.isSetGatewayId()) {
         this.gatewayId = other.gatewayId;
       }
+      if (other.isSetComputeResourceId()) {
+        this.computeResourceId = other.computeResourceId;
+      }
     }
 
-    public isReportingAvailable_args deepCopy() {
-      return new isReportingAvailable_args(this);
+    public isGatewayUsageReportingAvailable_args deepCopy() {
+      return new isGatewayUsageReportingAvailable_args(this);
     }
 
     @Override
     public void clear() {
       this.gatewayId = null;
+      this.computeResourceId = null;
     }
 
     public java.lang.String getGatewayId() {
       return this.gatewayId;
     }
 
-    public isReportingAvailable_args setGatewayId(java.lang.String gatewayId) {
+    public isGatewayUsageReportingAvailable_args setGatewayId(java.lang.String gatewayId) {
       this.gatewayId = gatewayId;
       return this;
     }
@@ -213607,6 +213632,30 @@
       }
     }
 
+    public java.lang.String getComputeResourceId() {
+      return this.computeResourceId;
+    }
+
+    public isGatewayUsageReportingAvailable_args setComputeResourceId(java.lang.String computeResourceId) {
+      this.computeResourceId = computeResourceId;
+      return this;
+    }
+
+    public void unsetComputeResourceId() {
+      this.computeResourceId = null;
+    }
+
+    /** Returns true if field computeResourceId is set (has been assigned a value) and false otherwise */
+    public boolean isSetComputeResourceId() {
+      return this.computeResourceId != null;
+    }
+
+    public void setComputeResourceIdIsSet(boolean value) {
+      if (!value) {
+        this.computeResourceId = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case GATEWAY_ID:
@@ -213617,6 +213666,14 @@
         }
         break;
 
+      case COMPUTE_RESOURCE_ID:
+        if (value == null) {
+          unsetComputeResourceId();
+        } else {
+          setComputeResourceId((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -213625,6 +213682,9 @@
       case GATEWAY_ID:
         return getGatewayId();
 
+      case COMPUTE_RESOURCE_ID:
+        return getComputeResourceId();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -213638,6 +213698,8 @@
       switch (field) {
       case GATEWAY_ID:
         return isSetGatewayId();
+      case COMPUTE_RESOURCE_ID:
+        return isSetComputeResourceId();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -213646,12 +213708,12 @@
     public boolean equals(java.lang.Object that) {
       if (that == null)
         return false;
-      if (that instanceof isReportingAvailable_args)
-        return this.equals((isReportingAvailable_args)that);
+      if (that instanceof isGatewayUsageReportingAvailable_args)
+        return this.equals((isGatewayUsageReportingAvailable_args)that);
       return false;
     }
 
-    public boolean equals(isReportingAvailable_args that) {
+    public boolean equals(isGatewayUsageReportingAvailable_args that) {
       if (that == null)
         return false;
       if (this == that)
@@ -213666,6 +213728,15 @@
           return false;
       }
 
+      boolean this_present_computeResourceId = true && this.isSetComputeResourceId();
+      boolean that_present_computeResourceId = true && that.isSetComputeResourceId();
+      if (this_present_computeResourceId || that_present_computeResourceId) {
+        if (!(this_present_computeResourceId && that_present_computeResourceId))
+          return false;
+        if (!this.computeResourceId.equals(that.computeResourceId))
+          return false;
+      }
+
       return true;
     }
 
@@ -213677,11 +213748,15 @@
       if (isSetGatewayId())
         hashCode = hashCode * 8191 + gatewayId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetComputeResourceId()) ? 131071 : 524287);
+      if (isSetComputeResourceId())
+        hashCode = hashCode * 8191 + computeResourceId.hashCode();
+
       return hashCode;
     }
 
     @Override
-    public int compareTo(isReportingAvailable_args other) {
+    public int compareTo(isGatewayUsageReportingAvailable_args other) {
       if (!getClass().equals(other.getClass())) {
         return getClass().getName().compareTo(other.getClass().getName());
       }
@@ -213698,6 +213773,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetComputeResourceId()).compareTo(other.isSetComputeResourceId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetComputeResourceId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceId, other.computeResourceId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -213715,7 +213800,7 @@
 
     @Override
     public java.lang.String toString() {
-      java.lang.StringBuilder sb = new java.lang.StringBuilder("isReportingAvailable_args(");
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("isGatewayUsageReportingAvailable_args(");
       boolean first = true;
 
       sb.append("gatewayId:");
@@ -213725,6 +213810,14 @@
         sb.append(this.gatewayId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("computeResourceId:");
+      if (this.computeResourceId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.computeResourceId);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -213734,6 +213827,9 @@
       if (gatewayId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' was not present! Struct: " + toString());
       }
+      if (computeResourceId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'computeResourceId' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -213753,15 +213849,15 @@
       }
     }
 
-    private static class isReportingAvailable_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-      public isReportingAvailable_argsStandardScheme getScheme() {
-        return new isReportingAvailable_argsStandardScheme();
+    private static class isGatewayUsageReportingAvailable_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public isGatewayUsageReportingAvailable_argsStandardScheme getScheme() {
+        return new isGatewayUsageReportingAvailable_argsStandardScheme();
       }
     }
 
-    private static class isReportingAvailable_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<isReportingAvailable_args> {
+    private static class isGatewayUsageReportingAvailable_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<isGatewayUsageReportingAvailable_args> {
 
-      public void read(org.apache.thrift.protocol.TProtocol iprot, isReportingAvailable_args struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol iprot, isGatewayUsageReportingAvailable_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TField schemeField;
         iprot.readStructBegin();
         while (true)
@@ -213779,6 +213875,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // COMPUTE_RESOURCE_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.computeResourceId = iprot.readString();
+                struct.setComputeResourceIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -213790,7 +213894,7 @@
         struct.validate();
       }
 
-      public void write(org.apache.thrift.protocol.TProtocol oprot, isReportingAvailable_args struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol oprot, isGatewayUsageReportingAvailable_args struct) throws org.apache.thrift.TException {
         struct.validate();
 
         oprot.writeStructBegin(STRUCT_DESC);
@@ -213799,31 +213903,39 @@
           oprot.writeString(struct.gatewayId);
           oprot.writeFieldEnd();
         }
+        if (struct.computeResourceId != null) {
+          oprot.writeFieldBegin(COMPUTE_RESOURCE_ID_FIELD_DESC);
+          oprot.writeString(struct.computeResourceId);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
 
     }
 
-    private static class isReportingAvailable_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-      public isReportingAvailable_argsTupleScheme getScheme() {
-        return new isReportingAvailable_argsTupleScheme();
+    private static class isGatewayUsageReportingAvailable_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public isGatewayUsageReportingAvailable_argsTupleScheme getScheme() {
+        return new isGatewayUsageReportingAvailable_argsTupleScheme();
       }
     }
 
-    private static class isReportingAvailable_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<isReportingAvailable_args> {
+    private static class isGatewayUsageReportingAvailable_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<isGatewayUsageReportingAvailable_args> {
 
       @Override
-      public void write(org.apache.thrift.protocol.TProtocol prot, isReportingAvailable_args struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol prot, isGatewayUsageReportingAvailable_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.gatewayId);
+        oprot.writeString(struct.computeResourceId);
       }
 
       @Override
-      public void read(org.apache.thrift.protocol.TProtocol prot, isReportingAvailable_args struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol prot, isGatewayUsageReportingAvailable_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.gatewayId = iprot.readString();
         struct.setGatewayIdIsSet(true);
+        struct.computeResourceId = iprot.readString();
+        struct.setComputeResourceIdIsSet(true);
       }
     }
 
@@ -213832,14 +213944,14 @@
     }
   }
 
-  public static class isReportingAvailable_result implements org.apache.thrift.TBase<isReportingAvailable_result, isReportingAvailable_result._Fields>, java.io.Serializable, Cloneable, Comparable<isReportingAvailable_result>   {
-    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("isReportingAvailable_result");
+  public static class isGatewayUsageReportingAvailable_result implements org.apache.thrift.TBase<isGatewayUsageReportingAvailable_result, isGatewayUsageReportingAvailable_result._Fields>, java.io.Serializable, Cloneable, Comparable<isGatewayUsageReportingAvailable_result>   {
+    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("isGatewayUsageReportingAvailable_result");
 
     private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField("success", org.apache.thrift.protocol.TType.BOOL, (short)0);
     private static final org.apache.thrift.protocol.TField RSE_FIELD_DESC = new org.apache.thrift.protocol.TField("rse", org.apache.thrift.protocol.TType.STRUCT, (short)1);
 
-    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new isReportingAvailable_resultStandardSchemeFactory();
-    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new isReportingAvailable_resultTupleSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new isGatewayUsageReportingAvailable_resultStandardSchemeFactory();
+    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new isGatewayUsageReportingAvailable_resultTupleSchemeFactory();
 
     public boolean success; // required
     public org.apache.airavata.registry.api.exception.RegistryServiceException rse; // required
@@ -213916,13 +214028,13 @@
       tmpMap.put(_Fields.RSE, new org.apache.thrift.meta_data.FieldMetaData("rse", org.apache.thrift.TFieldRequirementType.DEFAULT, 
           new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.registry.api.exception.RegistryServiceException.class)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
-      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(isReportingAvailable_result.class, metaDataMap);
+      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(isGatewayUsageReportingAvailable_result.class, metaDataMap);
     }
 
-    public isReportingAvailable_result() {
+    public isGatewayUsageReportingAvailable_result() {
     }
 
-    public isReportingAvailable_result(
+    public isGatewayUsageReportingAvailable_result(
       boolean success,
       org.apache.airavata.registry.api.exception.RegistryServiceException rse)
     {
@@ -213935,7 +214047,7 @@
     /**
      * Performs a deep copy on <i>other</i>.
      */
-    public isReportingAvailable_result(isReportingAvailable_result other) {
+    public isGatewayUsageReportingAvailable_result(isGatewayUsageReportingAvailable_result other) {
       __isset_bitfield = other.__isset_bitfield;
       this.success = other.success;
       if (other.isSetRse()) {
@@ -213943,8 +214055,8 @@
       }
     }
 
-    public isReportingAvailable_result deepCopy() {
-      return new isReportingAvailable_result(this);
+    public isGatewayUsageReportingAvailable_result deepCopy() {
+      return new isGatewayUsageReportingAvailable_result(this);
     }
 
     @Override
@@ -213958,7 +214070,7 @@
       return this.success;
     }
 
-    public isReportingAvailable_result setSuccess(boolean success) {
+    public isGatewayUsageReportingAvailable_result setSuccess(boolean success) {
       this.success = success;
       setSuccessIsSet(true);
       return this;
@@ -213981,7 +214093,7 @@
       return this.rse;
     }
 
-    public isReportingAvailable_result setRse(org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
+    public isGatewayUsageReportingAvailable_result setRse(org.apache.airavata.registry.api.exception.RegistryServiceException rse) {
       this.rse = rse;
       return this;
     }
@@ -214053,12 +214165,12 @@
     public boolean equals(java.lang.Object that) {
       if (that == null)
         return false;
-      if (that instanceof isReportingAvailable_result)
-        return this.equals((isReportingAvailable_result)that);
+      if (that instanceof isGatewayUsageReportingAvailable_result)
+        return this.equals((isGatewayUsageReportingAvailable_result)that);
       return false;
     }
 
-    public boolean equals(isReportingAvailable_result that) {
+    public boolean equals(isGatewayUsageReportingAvailable_result that) {
       if (that == null)
         return false;
       if (this == that)
@@ -214099,7 +214211,7 @@
     }
 
     @Override
-    public int compareTo(isReportingAvailable_result other) {
+    public int compareTo(isGatewayUsageReportingAvailable_result other) {
       if (!getClass().equals(other.getClass())) {
         return getClass().getName().compareTo(other.getClass().getName());
       }
@@ -214143,7 +214255,7 @@
 
     @Override
     public java.lang.String toString() {
-      java.lang.StringBuilder sb = new java.lang.StringBuilder("isReportingAvailable_result(");
+      java.lang.StringBuilder sb = new java.lang.StringBuilder("isGatewayUsageReportingAvailable_result(");
       boolean first = true;
 
       sb.append("success:");
@@ -214184,15 +214296,15 @@
       }
     }
 
-    private static class isReportingAvailable_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-      public isReportingAvailable_resultStandardScheme getScheme() {
-        return new isReportingAvailable_resultStandardScheme();
+    private static class isGatewayUsageReportingAvailable_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public isGatewayUsageReportingAvailable_resultStandardScheme getScheme() {
+        return new isGatewayUsageReportingAvailable_resultStandardScheme();
       }
     }
 
-    private static class isReportingAvailable_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<isReportingAvailable_result> {
+    private static class isGatewayUsageReportingAvailable_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<isGatewayUsageReportingAvailable_result> {
 
-      public void read(org.apache.thrift.protocol.TProtocol iprot, isReportingAvailable_result struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol iprot, isGatewayUsageReportingAvailable_result struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TField schemeField;
         iprot.readStructBegin();
         while (true)
@@ -214230,7 +214342,7 @@
         struct.validate();
       }
 
-      public void write(org.apache.thrift.protocol.TProtocol oprot, isReportingAvailable_result struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol oprot, isGatewayUsageReportingAvailable_result struct) throws org.apache.thrift.TException {
         struct.validate();
 
         oprot.writeStructBegin(STRUCT_DESC);
@@ -214250,16 +214362,16 @@
 
     }
 
-    private static class isReportingAvailable_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
-      public isReportingAvailable_resultTupleScheme getScheme() {
-        return new isReportingAvailable_resultTupleScheme();
+    private static class isGatewayUsageReportingAvailable_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
+      public isGatewayUsageReportingAvailable_resultTupleScheme getScheme() {
+        return new isGatewayUsageReportingAvailable_resultTupleScheme();
       }
     }
 
-    private static class isReportingAvailable_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<isReportingAvailable_result> {
+    private static class isGatewayUsageReportingAvailable_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<isGatewayUsageReportingAvailable_result> {
 
       @Override
-      public void write(org.apache.thrift.protocol.TProtocol prot, isReportingAvailable_result struct) throws org.apache.thrift.TException {
+      public void write(org.apache.thrift.protocol.TProtocol prot, isGatewayUsageReportingAvailable_result struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         java.util.BitSet optionals = new java.util.BitSet();
         if (struct.isSetSuccess()) {
@@ -214278,7 +214390,7 @@
       }
 
       @Override
-      public void read(org.apache.thrift.protocol.TProtocol prot, isReportingAvailable_result struct) throws org.apache.thrift.TException {
+      public void read(org.apache.thrift.protocol.TProtocol prot, isGatewayUsageReportingAvailable_result struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         java.util.BitSet incoming = iprot.readBitSet(2);
         if (incoming.get(0)) {
@@ -214302,15 +214414,18 @@
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("getGatewayReportingCommand_args");
 
     private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceId", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getGatewayReportingCommand_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getGatewayReportingCommand_argsTupleSchemeFactory();
 
     public java.lang.String gatewayId; // required
+    public java.lang.String computeResourceId; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      GATEWAY_ID((short)1, "gatewayId");
+      GATEWAY_ID((short)1, "gatewayId"),
+      COMPUTE_RESOURCE_ID((short)2, "computeResourceId");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -214327,6 +214442,8 @@
         switch(fieldId) {
           case 1: // GATEWAY_ID
             return GATEWAY_ID;
+          case 2: // COMPUTE_RESOURCE_ID
+            return COMPUTE_RESOURCE_ID;
           default:
             return null;
         }
@@ -214372,6 +214489,8 @@
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
       tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
           new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.COMPUTE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("computeResourceId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getGatewayReportingCommand_args.class, metaDataMap);
     }
@@ -214380,10 +214499,12 @@
     }
 
     public getGatewayReportingCommand_args(
-      java.lang.String gatewayId)
+      java.lang.String gatewayId,
+      java.lang.String computeResourceId)
     {
       this();
       this.gatewayId = gatewayId;
+      this.computeResourceId = computeResourceId;
     }
 
     /**
@@ -214393,6 +214514,9 @@
       if (other.isSetGatewayId()) {
         this.gatewayId = other.gatewayId;
       }
+      if (other.isSetComputeResourceId()) {
+        this.computeResourceId = other.computeResourceId;
+      }
     }
 
     public getGatewayReportingCommand_args deepCopy() {
@@ -214402,6 +214526,7 @@
     @Override
     public void clear() {
       this.gatewayId = null;
+      this.computeResourceId = null;
     }
 
     public java.lang.String getGatewayId() {
@@ -214428,6 +214553,30 @@
       }
     }
 
+    public java.lang.String getComputeResourceId() {
+      return this.computeResourceId;
+    }
+
+    public getGatewayReportingCommand_args setComputeResourceId(java.lang.String computeResourceId) {
+      this.computeResourceId = computeResourceId;
+      return this;
+    }
+
+    public void unsetComputeResourceId() {
+      this.computeResourceId = null;
+    }
+
+    /** Returns true if field computeResourceId is set (has been assigned a value) and false otherwise */
+    public boolean isSetComputeResourceId() {
+      return this.computeResourceId != null;
+    }
+
+    public void setComputeResourceIdIsSet(boolean value) {
+      if (!value) {
+        this.computeResourceId = null;
+      }
+    }
+
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
       case GATEWAY_ID:
@@ -214438,6 +214587,14 @@
         }
         break;
 
+      case COMPUTE_RESOURCE_ID:
+        if (value == null) {
+          unsetComputeResourceId();
+        } else {
+          setComputeResourceId((java.lang.String)value);
+        }
+        break;
+
       }
     }
 
@@ -214446,6 +214603,9 @@
       case GATEWAY_ID:
         return getGatewayId();
 
+      case COMPUTE_RESOURCE_ID:
+        return getComputeResourceId();
+
       }
       throw new java.lang.IllegalStateException();
     }
@@ -214459,6 +214619,8 @@
       switch (field) {
       case GATEWAY_ID:
         return isSetGatewayId();
+      case COMPUTE_RESOURCE_ID:
+        return isSetComputeResourceId();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -214487,6 +214649,15 @@
           return false;
       }
 
+      boolean this_present_computeResourceId = true && this.isSetComputeResourceId();
+      boolean that_present_computeResourceId = true && that.isSetComputeResourceId();
+      if (this_present_computeResourceId || that_present_computeResourceId) {
+        if (!(this_present_computeResourceId && that_present_computeResourceId))
+          return false;
+        if (!this.computeResourceId.equals(that.computeResourceId))
+          return false;
+      }
+
       return true;
     }
 
@@ -214498,6 +214669,10 @@
       if (isSetGatewayId())
         hashCode = hashCode * 8191 + gatewayId.hashCode();
 
+      hashCode = hashCode * 8191 + ((isSetComputeResourceId()) ? 131071 : 524287);
+      if (isSetComputeResourceId())
+        hashCode = hashCode * 8191 + computeResourceId.hashCode();
+
       return hashCode;
     }
 
@@ -214519,6 +214694,16 @@
           return lastComparison;
         }
       }
+      lastComparison = java.lang.Boolean.valueOf(isSetComputeResourceId()).compareTo(other.isSetComputeResourceId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetComputeResourceId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceId, other.computeResourceId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
       return 0;
     }
 
@@ -214546,6 +214731,14 @@
         sb.append(this.gatewayId);
       }
       first = false;
+      if (!first) sb.append(", ");
+      sb.append("computeResourceId:");
+      if (this.computeResourceId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.computeResourceId);
+      }
+      first = false;
       sb.append(")");
       return sb.toString();
     }
@@ -214555,6 +214748,9 @@
       if (gatewayId == null) {
         throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' was not present! Struct: " + toString());
       }
+      if (computeResourceId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'computeResourceId' was not present! Struct: " + toString());
+      }
       // check for sub-struct validity
     }
 
@@ -214600,6 +214796,14 @@
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
               break;
+            case 2: // COMPUTE_RESOURCE_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.computeResourceId = iprot.readString();
+                struct.setComputeResourceIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
             default:
               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
           }
@@ -214620,6 +214824,11 @@
           oprot.writeString(struct.gatewayId);
           oprot.writeFieldEnd();
         }
+        if (struct.computeResourceId != null) {
+          oprot.writeFieldBegin(COMPUTE_RESOURCE_ID_FIELD_DESC);
+          oprot.writeString(struct.computeResourceId);
+          oprot.writeFieldEnd();
+        }
         oprot.writeFieldStop();
         oprot.writeStructEnd();
       }
@@ -214638,6 +214847,7 @@
       public void write(org.apache.thrift.protocol.TProtocol prot, getGatewayReportingCommand_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         oprot.writeString(struct.gatewayId);
+        oprot.writeString(struct.computeResourceId);
       }
 
       @Override
@@ -214645,6 +214855,8 @@
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
         struct.gatewayId = iprot.readString();
         struct.setGatewayIdIsSet(true);
+        struct.computeResourceId = iprot.readString();
+        struct.setComputeResourceIdIsSet(true);
       }
     }
 
@@ -215860,16 +216072,19 @@
   public static class removeGatewayUsageReportingCommand_args implements org.apache.thrift.TBase<removeGatewayUsageReportingCommand_args, removeGatewayUsageReportingCommand_args._Fields>, java.io.Serializable, Cloneable, Comparable<removeGatewayUsageReportingCommand_args>   {
     private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("removeGatewayUsageReportingCommand_args");
 
-    private static final org.apache.thrift.protocol.TField COMMAND_FIELD_DESC = new org.apache.thrift.protocol.TField("command", org.apache.thrift.protocol.TType.STRUCT, (short)1);
+    private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
+    private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceId", org.apache.thrift.protocol.TType.STRING, (short)2);
 
     private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new removeGatewayUsageReportingCommand_argsStandardSchemeFactory();
     private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new removeGatewayUsageReportingCommand_argsTupleSchemeFactory();
 
-    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand command; // required
+    public java.lang.String gatewayId; // required
+    public java.lang.String computeResourceId; // required
 
     /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     public enum _Fields implements org.apache.thrift.TFieldIdEnum {
-      COMMAND((short)1, "command");
+      GATEWAY_ID((short)1, "gatewayId"),
+      COMPUTE_RESOURCE_ID((short)2, "computeResourceId");
 
       private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();
 
@@ -215884,8 +216099,10 @@
        */
       public static _Fields findByThriftId(int fieldId) {
         switch(fieldId) {
-          case 1: // COMMAND
-            return COMMAND;
+          case 1: // GATEWAY_ID
+            return GATEWAY_ID;
+          case 2: // COMPUTE_RESOURCE_ID
+            return COMPUTE_RESOURCE_ID;
           default:
             return null;
         }
@@ -215929,8 +216146,10 @@
     public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
     static {
       java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
-      tmpMap.put(_Fields.COMMAND, new org.apache.thrift.meta_data.FieldMetaData("command", org.apache.thrift.TFieldRequirementType.DEFAULT, 
-          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.workspace.GatewayUsageReportingCommand.class)));
+      tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+      tmpMap.put(_Fields.COMPUTE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("computeResourceId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
+          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
       metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
       org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(removeGatewayUsageReportingCommand_args.class, metaDataMap);
     }
@@ -215939,18 +216158,23 @@
     }
 
     public removeGatewayUsageReportingCommand_args(
-      org.apache.airavata.model.workspace.GatewayUsageReportingCommand command)
+      java.lang.String gatewayId,
+      java.lang.String computeResourceId)
     {
       this();
-      this.command = command;
+      this.gatewayId = gatewayId;
+      this.computeResourceId = computeResourceId;
     }
 
     /**
      * Performs a deep copy on <i>other</i>.
      */
     public removeGatewayUsageReportingCommand_args(removeGatewayUsageReportingCommand_args other) {
-      if (other.isSetCommand()) {
-        this.command = new org.apache.airavata.model.workspace.GatewayUsageReportingCommand(other.command);
+      if (other.isSetGatewayId()) {
+        this.gatewayId = other.gatewayId;
+      }
+      if (other.isSetComputeResourceId()) {
+        this.computeResourceId = other.computeResourceId;
       }
     }
 
@@ -215960,40 +216184,73 @@
 
     @Override
     public void clear() {
-      this.command = null;
+      this.gatewayId = null;
+      this.computeResourceId = null;
     }
 
-    public org.apache.airavata.model.workspace.GatewayUsageReportingCommand getCommand() {
-      return this.command;
+    public java.lang.String getGatewayId() {
+      return this.gatewayId;
     }
 
-    public removeGatewayUsageReportingCommand_args setCommand(org.apache.airavata.model.workspace.GatewayUsageReportingCommand command) {
-      this.command = command;
+    public removeGatewayUsageReportingCommand_args setGatewayId(java.lang.String gatewayId) {
+      this.gatewayId = gatewayId;
       return this;
     }
 
-    public void unsetCommand() {
-      this.command = null;
+    public void unsetGatewayId() {
+      this.gatewayId = null;
     }
 
-    /** Returns true if field command is set (has been assigned a value) and false otherwise */
-    public boolean isSetCommand() {
-      return this.command != null;
+    /** Returns true if field gatewayId is set (has been assigned a value) and false otherwise */
+    public boolean isSetGatewayId() {
+      return this.gatewayId != null;
     }
 
-    public void setCommandIsSet(boolean value) {
+    public void setGatewayIdIsSet(boolean value) {
       if (!value) {
-        this.command = null;
+        this.gatewayId = null;
+      }
+    }
+
+    public java.lang.String getComputeResourceId() {
+      return this.computeResourceId;
+    }
+
+    public removeGatewayUsageReportingCommand_args setComputeResourceId(java.lang.String computeResourceId) {
+      this.computeResourceId = computeResourceId;
+      return this;
+    }
+
+    public void unsetComputeResourceId() {
+      this.computeResourceId = null;
+    }
+
+    /** Returns true if field computeResourceId is set (has been assigned a value) and false otherwise */
+    public boolean isSetComputeResourceId() {
+      return this.computeResourceId != null;
+    }
+
+    public void setComputeResourceIdIsSet(boolean value) {
+      if (!value) {
+        this.computeResourceId = null;
       }
     }
 
     public void setFieldValue(_Fields field, java.lang.Object value) {
       switch (field) {
-      case COMMAND:
+      case GATEWAY_ID:
         if (value == null) {
-          unsetCommand();
+          unsetGatewayId();
         } else {
-          setCommand((org.apache.airavata.model.workspace.GatewayUsageReportingCommand)value);
+          setGatewayId((java.lang.String)value);
+        }
+        break;
+
+      case COMPUTE_RESOURCE_ID:
+        if (value == null) {
+          unsetComputeResourceId();
+        } else {
+          setComputeResourceId((java.lang.String)value);
         }
         break;
 
@@ -216002,8 +216259,11 @@
 
     public java.lang.Object getFieldValue(_Fields field) {
       switch (field) {
-      case COMMAND:
-        return getCommand();
+      case GATEWAY_ID:
+        return getGatewayId();
+
+      case COMPUTE_RESOURCE_ID:
+        return getComputeResourceId();
 
       }
       throw new java.lang.IllegalStateException();
@@ -216016,8 +216276,10 @@
       }
 
       switch (field) {
-      case COMMAND:
-        return isSetCommand();
+      case GATEWAY_ID:
+        return isSetGatewayId();
+      case COMPUTE_RESOURCE_ID:
+        return isSetComputeResourceId();
       }
       throw new java.lang.IllegalStateException();
     }
@@ -216037,12 +216299,21 @@
       if (this == that)
         return true;
 
-      boolean this_present_command = true && this.isSetCommand();
-      boolean that_present_command = true && that.isSetCommand();
-      if (this_present_command || that_present_command) {
-        if (!(this_present_command && that_present_command))
+      boolean this_present_gatewayId = true && this.isSetGatewayId();
+      boolean that_present_gatewayId = true && that.isSetGatewayId();
+      if (this_present_gatewayId || that_present_gatewayId) {
+        if (!(this_present_gatewayId && that_present_gatewayId))
           return false;
-        if (!this.command.equals(that.command))
+        if (!this.gatewayId.equals(that.gatewayId))
+          return false;
+      }
+
+      boolean this_present_computeResourceId = true && this.isSetComputeResourceId();
+      boolean that_present_computeResourceId = true && that.isSetComputeResourceId();
+      if (this_present_computeResourceId || that_present_computeResourceId) {
+        if (!(this_present_computeResourceId && that_present_computeResourceId))
+          return false;
+        if (!this.computeResourceId.equals(that.computeResourceId))
           return false;
       }
 
@@ -216053,9 +216324,13 @@
     public int hashCode() {
       int hashCode = 1;
 
-      hashCode = hashCode * 8191 + ((isSetCommand()) ? 131071 : 524287);
-      if (isSetCommand())
-        hashCode = hashCode * 8191 + command.hashCode();
+      hashCode = hashCode * 8191 + ((isSetGatewayId()) ? 131071 : 524287);
+      if (isSetGatewayId())
+        hashCode = hashCode * 8191 + gatewayId.hashCode();
+
+      hashCode = hashCode * 8191 + ((isSetComputeResourceId()) ? 131071 : 524287);
+      if (isSetComputeResourceId())
+        hashCode = hashCode * 8191 + computeResourceId.hashCode();
 
       return hashCode;
     }
@@ -216068,12 +216343,22 @@
 
       int lastComparison = 0;
 
-      lastComparison = java.lang.Boolean.valueOf(isSetCommand()).compareTo(other.isSetCommand());
+      lastComparison = java.lang.Boolean.valueOf(isSetGatewayId()).compareTo(other.isSetGatewayId());
       if (lastComparison != 0) {
         return lastComparison;
       }
-      if (isSetCommand()) {
-        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.command, other.command);
+      if (isSetGatewayId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayId, other.gatewayId);
+        if (lastComparison != 0) {
+          return lastComparison;
+        }
+      }
+      lastComparison = java.lang.Boolean.valueOf(isSetComputeResourceId()).compareTo(other.isSetComputeResourceId());
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+      if (isSetComputeResourceId()) {
+        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceId, other.computeResourceId);
         if (lastComparison != 0) {
           return lastComparison;
         }
@@ -216098,11 +216383,19 @@
       java.lang.StringBuilder sb = new java.lang.StringBuilder("removeGatewayUsageReportingCommand_args(");
       boolean first = true;
 
-      sb.append("command:");
-      if (this.command == null) {
+      sb.append("gatewayId:");
+      if (this.gatewayId == null) {
         sb.append("null");
       } else {
-        sb.append(this.command);
+        sb.append(this.gatewayId);
+      }
+      first = false;
+      if (!first) sb.append(", ");
+      sb.append("computeResourceId:");
+      if (this.computeResourceId == null) {
+        sb.append("null");
+      } else {
+        sb.append(this.computeResourceId);
       }
       first = false;
       sb.append(")");
@@ -216111,10 +216404,13 @@
 
     public void validate() throws org.apache.thrift.TException {
       // check for required fields
-      // check for sub-struct validity
-      if (command != null) {
-        command.validate();
+      if (gatewayId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' was not present! Struct: " + toString());
       }
+      if (computeResourceId == null) {
+        throw new org.apache.thrift.protocol.TProtocolException("Required field 'computeResourceId' was not present! Struct: " + toString());
+      }
+      // check for sub-struct validity
     }
 
     private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
@@ -216151,11 +216447,18 @@
             break;
           }
           switch (schemeField.id) {
-            case 1: // COMMAND
-              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
-                struct.command = new org.apache.airavata.model.workspace.GatewayUsageReportingCommand();
-                struct.command.read(iprot);
-                struct.setCommandIsSet(true);
+            case 1: // GATEWAY_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.gatewayId = iprot.readString();
+                struct.setGatewayIdIsSet(true);
+              } else { 
+                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+              }
+              break;
+            case 2: // COMPUTE_RESOURCE_ID
+              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+                struct.computeResourceId = iprot.readString();
+                struct.setComputeResourceIdIsSet(true);
               } else { 
                 org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
               }
@@ -216175,9 +216478,14 @@
         struct.validate();
 
         oprot.writeStructBegin(STRUCT_DESC);
-        if (struct.command != null) {
-          oprot.writeFieldBegin(COMMAND_FIELD_DESC);
-          struct.command.write(oprot);
+        if (struct.gatewayId != null) {
+          oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
+          oprot.writeString(struct.gatewayId);
+          oprot.writeFieldEnd();
+        }
+        if (struct.computeResourceId != null) {
+          oprot.writeFieldBegin(COMPUTE_RESOURCE_ID_FIELD_DESC);
+          oprot.writeString(struct.computeResourceId);
           oprot.writeFieldEnd();
         }
         oprot.writeFieldStop();
@@ -216197,25 +216505,17 @@
       @Override
       public void write(org.apache.thrift.protocol.TProtocol prot, removeGatewayUsageReportingCommand_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-        java.util.BitSet optionals = new java.util.BitSet();
-        if (struct.isSetCommand()) {
-          optionals.set(0);
-        }
-        oprot.writeBitSet(optionals, 1);
-        if (struct.isSetCommand()) {
-          struct.command.write(oprot);
-        }
+        oprot.writeString(struct.gatewayId);
+        oprot.writeString(struct.computeResourceId);
       }
 
       @Override
       public void read(org.apache.thrift.protocol.TProtocol prot, removeGatewayUsageReportingCommand_args struct) throws org.apache.thrift.TException {
         org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
-        java.util.BitSet incoming = iprot.readBitSet(1);
-        if (incoming.get(0)) {
-          struct.command = new org.apache.airavata.model.workspace.GatewayUsageReportingCommand();
-          struct.command.read(iprot);
-          struct.setCommandIsSet(true);
-        }
+        struct.gatewayId = iprot.readString();
+        struct.setGatewayIdIsSet(true);
+        struct.computeResourceId = iprot.readString();
+        struct.setComputeResourceIdIsSet(true);
       }
     }
 
diff --git a/thrift-interface-descriptions/component-cpis/registry-api.thrift b/thrift-interface-descriptions/component-cpis/registry-api.thrift
index dc4fac5..1694a1d 100644
--- a/thrift-interface-descriptions/component-cpis/registry-api.thrift
+++ b/thrift-interface-descriptions/component-cpis/registry-api.thrift
@@ -2678,11 +2678,12 @@
     void removeParsingTemplate(1: required string templateId, 2: required string gatewayId)
             throws (1: registry_api_errors.RegistryServiceException rse);
 
-    bool isReportingAvailable(1: required string gatewayId) throws (1: registry_api_errors.RegistryServiceException rse);
-    workspace_model.GatewayUsageReportingCommand getGatewayReportingCommand(1: required string gatewayId)
+    bool isGatewayUsageReportingAvailable(1: required string gatewayId, 2: required string computeResourceId)
+            throws (1: registry_api_errors.RegistryServiceException rse);
+    workspace_model.GatewayUsageReportingCommand getGatewayReportingCommand(1: required string gatewayId, 2: required string computeResourceId)
             throws (1: registry_api_errors.RegistryServiceException rse);
     void addGatewayUsageReportingCommand(1: workspace_model.GatewayUsageReportingCommand command)
             throws (1: registry_api_errors.RegistryServiceException rse);
-    void removeGatewayUsageReportingCommand(1: workspace_model.GatewayUsageReportingCommand command)
+    void removeGatewayUsageReportingCommand(1: required string gatewayId, 2: required string computeResourceId)
             throws (1: registry_api_errors.RegistryServiceException rse);
 }
diff --git a/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift b/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
index 1f202fd..97a3d57 100644
--- a/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
+++ b/thrift-interface-descriptions/data-models/experiment-catalog-models/workspace_model.thrift
@@ -96,7 +96,8 @@
 
 struct GatewayUsageReportingCommand {
     1: required string gatewayId,
-    2: required string command
+    2: required string computeResourceId,
+    3: required string command
 }
 
 enum NotificationPriority {
