Extracting out storage information from resources
diff --git a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
index 151f868..3841409 100644
--- a/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
+++ b/services/resource-service/server/src/main/java/org/apache/airavata/mft/resource/server/backend/file/FileBasedResourceBackend.java
@@ -19,15 +19,21 @@
 
 import org.apache.airavata.mft.resource.server.backend.ResourceBackend;
 import org.apache.airavata.mft.resource.stubs.azure.resource.*;
+import org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorage;
 import org.apache.airavata.mft.resource.stubs.box.resource.*;
+import org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage;
 import org.apache.airavata.mft.resource.stubs.common.DirectoryResource;
 import org.apache.airavata.mft.resource.stubs.common.FileResource;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.*;
+import org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorage;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.*;
 import org.apache.airavata.mft.resource.stubs.ftp.storage.*;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.*;
+import org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorage;
 import org.apache.airavata.mft.resource.stubs.local.resource.*;
+import org.apache.airavata.mft.resource.stubs.local.storage.LocalStorage;
 import org.apache.airavata.mft.resource.stubs.s3.resource.*;
+import org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage;
 import org.apache.airavata.mft.resource.stubs.scp.resource.*;
 import org.apache.airavata.mft.resource.stubs.scp.storage.*;
 import org.json.simple.JSONArray;
@@ -164,7 +170,14 @@
                     .map(resource -> {
                         JSONObject r = (JSONObject) resource;
 
-                        LocalResource.Builder builder = LocalResource.newBuilder().setResourceId(r.get("resourceId").toString());
+                        LocalStorage storage = LocalStorage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("localStorage")).get("storageId").toString())
+                                .setAgentId(((JSONObject)r.get("localStorage")).get("agentId").toString())
+                                .build();
+
+                        LocalResource.Builder builder = LocalResource.newBuilder()
+                                .setLocalStorage(storage)
+                                .setResourceId(r.get("resourceId").toString());
 
                         switch (r.get("resourceMode").toString()) {
                             case "FILE":
@@ -215,10 +228,15 @@
                     .map(resource -> {
                         JSONObject r = (JSONObject) resource;
 
+                        S3Storage storage = S3Storage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("s3Storage")).get("storageId").toString())
+                                .setRegion(((JSONObject)r.get("s3Storage")).get("region").toString())
+                                .setRegion(((JSONObject)r.get("s3Storage")).get("bucketName").toString())
+                                .build();
+
                         S3Resource.Builder builder = S3Resource.newBuilder()
                                 .setResourceId(r.get("resourceId").toString())
-                                .setBucketName(r.get("bucketName").toString())
-                                .setRegion(r.get("region").toString());
+                                .setS3Storage(storage);
 
                         switch (r.get("resourceMode").toString()) {
                             case "FILE":
@@ -271,7 +289,12 @@
                     .map(resource -> {
                         JSONObject r = (JSONObject) resource;
 
+                        BoxStorage storage = BoxStorage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("boxStorage")).get("storageId").toString())
+                                .build();
+
                         BoxResource.Builder builder = BoxResource.newBuilder()
+                                .setBoxStorage(storage)
                                 .setResourceId(r.get("resourceId").toString());
 
                         switch (r.get("resourceMode").toString()) {
@@ -321,8 +344,13 @@
                     .map(resource -> {
                         JSONObject r = (JSONObject) resource;
 
+                        AzureStorage storage = AzureStorage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("azureStorage")).get("storageId").toString())
+                                .setContainer(((JSONObject)r.get("azureStorage")).get("container").toString())
+                                .build();
+
                         AzureResource.Builder builder = AzureResource.newBuilder()
-                                .setContainer(r.get("container").toString())
+                                .setAzureStorage(storage)
                                 .setResourceId(r.get("resourceId").toString());
 
                         switch (r.get("resourceMode").toString()) {
@@ -372,8 +400,13 @@
                     .map(resource -> {
                         JSONObject r = (JSONObject) resource;
 
+                        GCSStorage storage = GCSStorage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("gcsStorage")).get("storageId").toString())
+                                .setBucketName(((JSONObject)r.get("gcsStorage")).get("bucketName").toString())
+                                .build();
+
                         GCSResource.Builder builder = GCSResource.newBuilder()
-                                .setBucketName(r.get("bucketName").toString())
+                                .setGcsStorage(storage)
                                 .setResourceId(r.get("resourceId").toString());
 
                         switch (r.get("resourceMode").toString()) {
@@ -423,8 +456,14 @@
                         JSONObject r = (JSONObject) resource;
                         String resourcePath = r.get("resourcePath").toString();
                         resourcePath = resourcePath.startsWith("/") ? resourcePath : "/" + resourcePath;
+
+                        DropboxStorage storage = DropboxStorage.newBuilder()
+                                .setStorageId(((JSONObject)r.get("dropboxStorage")).get("storageId").toString())
+                                .build();
+
                         DropboxResource.Builder builder = DropboxResource.newBuilder()
-                                .setResourceId(r.get("resourceId").toString());
+                                .setResourceId(r.get("resourceId").toString())
+                                .setDropboxStorage(storage);
 
                         switch (r.get("resourceMode").toString()) {
                             case "FILE":
diff --git a/services/resource-service/server/src/main/resources/resources.json b/services/resource-service/server/src/main/resources/resources.json
index 9d430db..83e009f 100644
--- a/services/resource-service/server/src/main/resources/resources.json
+++ b/services/resource-service/server/src/main/resources/resources.json
@@ -27,47 +27,69 @@
     "type": "LOCAL",
     "resourceId":  "10mb-file",
     "resourceMode": "FILE",
-    "resourcePath": "/tmp/10mb.txt"
+    "resourcePath": "/tmp/10mb.txt",
+    "localStorage": {
+      "storageId": "local-storage-1",
+      "agentId": "agent-0"
+    }
   },
   {
     "type": "S3",
     "resourceId": "s3-file",
     "resourceMode": "FILE",
     "resourcePath": "10mb-s3.txt",
-    "region": "us-east-2",
-    "bucketName": "airavata-s3"
+    "s3Storage": {
+      "storageId": "s3-storage-1",
+      "region": "us-east-2",
+      "bucketName": "airavata-s3"
+    }
   },
   {
     "type": "BOX",
     "resourceId": "box-file-abcd",
     "resourceMode": "FILE",
-    "resourcePath": "655108198452"
+    "resourcePath": "655108198452",
+    "boxStorage" : {
+      "storageId": "box-storage-1"
+    }
   },
   {
     "type": "BOX",
     "resourceId": "box-file-efgh",
     "resourceMode": "FILE",
-    "resourcePath": "655450661536"
+    "resourcePath": "655450661536",
+    "boxStorage" : {
+      "storageId": "box-storage-1"
+    }
   },
   {
     "type": "AZURE",
     "resourceId": "azure-blob",
-    "container": "sample-container",
     "resourceMode": "FILE",
-    "resourcePath": "sample.blob"
+    "resourcePath": "sample.blob",
+    "azureStorage" : {
+      "storageId": "azure-storage-1",
+      "container": "sample-container"
+    }
   },
   {
     "type": "GCS",
     "resourceId": "gcs-bucket",
     "resourceMode": "FILE",
-    "bucketName": "pika-pika-bucket",
-    "resourcePath": "PikaPikaTest.txt"
+    "resourcePath": "PikaPikaTest.txt",
+    "gcsStorage": {
+      "storageId": "gcs-storage-1",
+      "bucketName": "pika-pika-bucket"
+    }
   },
   {
     "type": "DROPBOX",
     "resourceId": "dropbox-file",
     "resourceMode": "FILE",
-    "resourcePath": "/test.txt"
+    "resourcePath": "/test.txt",
+    "dropboxStorage": {
+      "storageId": "dropbox-storage-1"
+    }
   },
   {
     "type": "FTP",
diff --git a/services/resource-service/stub/src/main/proto/azure/AzureResource.proto b/services/resource-service/stub/src/main/proto/azure/AzureResource.proto
index 084fbc5..3dac3ed 100644
--- a/services/resource-service/stub/src/main/proto/azure/AzureResource.proto
+++ b/services/resource-service/stub/src/main/proto/azure/AzureResource.proto
@@ -21,10 +21,11 @@
 package org.apache.airavata.mft.resource.stubs.azure.resource;
 
 import "common/common.proto";
+import "azure/AzureStorage.proto";
 
 message AzureResource {
     string resourceId = 1;
-    string container = 2;
+    org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorage azureStorage = 2;
     oneof resource {
         org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
         org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
@@ -36,14 +37,20 @@
 }
 
 message AzureResourceCreateRequest {
-    string container = 1;
-    string blobName = 2;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message AzureResourceUpdateRequest {
     string resourceId = 1;
-    string container = 2;
-    string blobName = 3;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message AzureResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/azure/AzureService.proto b/services/resource-service/stub/src/main/proto/azure/AzureService.proto
index b6a19c7..14a9cbc 100644
--- a/services/resource-service/stub/src/main/proto/azure/AzureService.proto
+++ b/services/resource-service/stub/src/main/proto/azure/AzureService.proto
@@ -23,8 +23,39 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "azure/AzureResource.proto";
+import "azure/AzureStorage.proto";
 
 service AzureResourceService {
+    
+    // Storage
+
+    rpc getAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageGetRequest) returns
+    (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/azure/storage"
+        };
+    }
+
+    rpc createAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageCreateRequest) returns
+    (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/azure/storage"
+        };
+    }
+
+    rpc updateAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/azure/storage"
+        };
+    }
+
+    rpc deleteAzureStorage (org.apache.airavata.mft.resource.stubs.azure.storage.AzureStorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/azure/storage"
+        };
+    }
+
+    // Resource
 
     rpc getAzureResource (org.apache.airavata.mft.resource.stubs.azure.resource.AzureResourceGetRequest) returns
                                             (org.apache.airavata.mft.resource.stubs.azure.resource.AzureResource) {
diff --git a/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto b/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto
new file mode 100644
index 0000000..7893c44
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/azure/AzureStorage.proto
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.azure.storage;
+
+message AzureStorage {
+    string storageId = 1;
+    string container = 2;
+}
+
+message AzureStorageGetRequest {
+    string storageId = 1;
+}
+
+message AzureStorageCreateRequest {
+    string container = 1;
+}
+
+message AzureStorageUpdateRequest {
+    string storageId = 1;
+    string container = 2;
+}
+
+message AzureStorageDeleteRequest {
+    string storageId = 1;
+}
\ No newline at end of file
diff --git a/services/resource-service/stub/src/main/proto/box/BoxResource.proto b/services/resource-service/stub/src/main/proto/box/BoxResource.proto
index 7899fdb..94d5da7 100644
--- a/services/resource-service/stub/src/main/proto/box/BoxResource.proto
+++ b/services/resource-service/stub/src/main/proto/box/BoxResource.proto
@@ -21,25 +21,36 @@
 package org.apache.airavata.mft.resource.stubs.box.resource;
 
 import "common/common.proto";
+import "box/BoxStorage.proto";
 
 message BoxResource {
     string resourceId = 1;
+    org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage boxStorage = 2;
     oneof resource {
-        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
-        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
-    }}
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
+}
 
 message BoxResourceGetRequest {
     string resourceId = 1;
 }
 
 message BoxResourceCreateRequest {
-    string boxFileId = 1;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message BoxResourceUpdateRequest {
     string resourceId = 1;
-    string boxFileId = 2;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message BoxResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/box/BoxService.proto b/services/resource-service/stub/src/main/proto/box/BoxService.proto
index def7858..817c19d 100644
--- a/services/resource-service/stub/src/main/proto/box/BoxService.proto
+++ b/services/resource-service/stub/src/main/proto/box/BoxService.proto
@@ -23,8 +23,40 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "box/BoxResource.proto";
+import "box/BoxStorage.proto";
 
 service BoxResourceService {
+
+    // Storage
+
+    rpc getBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageGetRequest) returns
+    (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/box/storage"
+        };
+    }
+
+    rpc createBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageCreateRequest) returns
+    (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/box/storage"
+        };
+    }
+
+    rpc updateBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/box/storage"
+        };
+    }
+
+    rpc deleteBoxStorage (org.apache.airavata.mft.resource.stubs.box.storage.BoxStorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/box/storage"
+        };
+    }
+
+    // Resource
+
     rpc getBoxResource (org.apache.airavata.mft.resource.stubs.box.resource.BoxResourceGetRequest) returns
                                             (org.apache.airavata.mft.resource.stubs.box.resource.BoxResource) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/box/BoxStorage.proto b/services/resource-service/stub/src/main/proto/box/BoxStorage.proto
new file mode 100644
index 0000000..c198706
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/box/BoxStorage.proto
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.box.storage;
+
+message BoxStorage {
+    string storageId = 1;
+}
+
+message BoxStorageGetRequest {
+    string storageId = 1;
+}
+
+message BoxStorageCreateRequest {
+}
+
+message BoxStorageUpdateRequest {
+    string storageId = 1;
+}
+
+message BoxStorageDeleteRequest {
+    string storageId = 1;
+}
+
+
diff --git a/services/resource-service/stub/src/main/proto/dropbox/DropboxResource.proto b/services/resource-service/stub/src/main/proto/dropbox/DropboxResource.proto
index 6ae5af9..8b90aab 100644
--- a/services/resource-service/stub/src/main/proto/dropbox/DropboxResource.proto
+++ b/services/resource-service/stub/src/main/proto/dropbox/DropboxResource.proto
@@ -21,12 +21,14 @@
 package org.apache.airavata.mft.resource.stubs.dropbox.resource;
 
 import "common/common.proto";
+import "dropbox/DropboxStorage.proto";
 
 message DropboxResource {
     string resourceId = 1;
+    org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorage dropboxStorage = 2;
     oneof resource {
-        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
-        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
     }
 }
 
@@ -35,13 +37,20 @@
 }
 
 message DropboxResourceCreateRequest {
-    string resourcePath = 1;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message DropboxResourceUpdateRequest {
     string resourceId = 1;
-    string resourcePath = 2;
-}
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }}
 
 message DropboxResourceDeleteRequest {
     string resourceId = 1;
diff --git a/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto b/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
index 7c56fa5..dab3d4b 100644
--- a/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
+++ b/services/resource-service/stub/src/main/proto/dropbox/DropboxService.proto
@@ -23,8 +23,40 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "dropbox/DropboxResource.proto";
+import "dropbox/DropboxStorage.proto";
 
 service DropboxService {
+
+    // Storage
+
+    rpc getDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageGetRequest) returns
+                                                    (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/dropbox/storage"
+        };
+    }
+
+    rpc createDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageCreateRequest) returns
+                                                    (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/dropbox/storage"
+        };
+    }
+
+    rpc updateDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/dropbox/storage"
+        };
+    }
+
+    rpc deleteDropboxStorage (org.apache.airavata.mft.resource.stubs.dropbox.storage.DropboxStorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/dropbox/storage"
+        };
+    }
+
+    // Resource
+
     rpc getDropboxResource (org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResourceGetRequest) returns
                                             (org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResource) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto b/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto
new file mode 100644
index 0000000..dd8b18f
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/dropbox/DropboxStorage.proto
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.dropbox.storage;
+
+message DropboxStorage {
+    string storageId = 1;
+}
+
+message DropboxStorageGetRequest {
+    string storageId = 1;
+}
+
+message DropboxStorageCreateRequest {
+}
+
+message DropboxStorageUpdateRequest {
+    string storageId = 1;
+}
+
+message DropboxStorageDeleteRequest {
+    string storageId = 1;
+}
+
+
diff --git a/services/resource-service/stub/src/main/proto/ftp/FTPResource.proto b/services/resource-service/stub/src/main/proto/ftp/FTPResource.proto
index 2ba2b9e..6710b77 100644
--- a/services/resource-service/stub/src/main/proto/ftp/FTPResource.proto
+++ b/services/resource-service/stub/src/main/proto/ftp/FTPResource.proto
@@ -37,14 +37,20 @@
 }
 
 message FTPResourceCreateRequest {
-    string ftpStorageId = 1;
-    string resourcePath = 2;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message FTPResourceUpdateRequest {
     string resourceId = 1;
-    string FTPStorageId = 2;
-    string resourcePath = 3;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message FTPResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/ftp/FTPService.proto b/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
index 4bce679..af06362 100644
--- a/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
+++ b/services/resource-service/stub/src/main/proto/ftp/FTPService.proto
@@ -27,7 +27,6 @@
 
 service FTPResourceService {
 
-
     rpc getFTPStorage (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorageGetRequest) returns
                                                         (org.apache.airavata.mft.resource.stubs.ftp.storage.FTPStorage) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto b/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
index 1473af9..51ec2ff 100644
--- a/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
+++ b/services/resource-service/stub/src/main/proto/ftp/FTPStorage.proto
@@ -20,7 +20,6 @@
 option java_multiple_files = true;
 package org.apache.airavata.mft.resource.stubs.ftp.storage;
 
-
 message FTPStorage {
     string storageId = 1;
     string host = 2;
diff --git a/services/resource-service/stub/src/main/proto/gcs/GCSResource.proto b/services/resource-service/stub/src/main/proto/gcs/GCSResource.proto
index 36f3c33..740c732 100644
--- a/services/resource-service/stub/src/main/proto/gcs/GCSResource.proto
+++ b/services/resource-service/stub/src/main/proto/gcs/GCSResource.proto
@@ -21,10 +21,11 @@
 package org.apache.airavata.mft.resource.stubs.gcs.resource;
 
 import "common/common.proto";
+import "gcs/GCSStorage.proto";
 
 message GCSResource {
     string resourceId = 1;
-    string bucketName = 2;
+    org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorage gcsStorage = 2;
     oneof resource {
         org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
         org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
@@ -36,14 +37,20 @@
 }
 
 message GCSResourceCreateRequest {
-    string bucketName = 1;
-    string resourcePath = 2;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message GCSResourceUpdateRequest {
     string resourceId = 1;
-    string bucketName = 2;
-    string resourcePath = 3;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message GCSResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/gcs/GCSService.proto b/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
index addd637..e66aece 100644
--- a/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
+++ b/services/resource-service/stub/src/main/proto/gcs/GCSService.proto
@@ -23,8 +23,37 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "gcs/GCSResource.proto";
+import "gcs/GCSStorage.proto";
 
 service GCSResourceService {
+
+    // Storage
+    rpc getGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageGetRequest) returns
+                                                    (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/gcs/storage"
+        };
+    }
+
+    rpc createGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageCreateRequest) returns
+                                                    (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/gcs/storage"
+        };
+    }
+
+    rpc updateGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/gcs/storage"
+        };
+    }
+
+    rpc deleteGCSStorage (org.apache.airavata.mft.resource.stubs.gcs.storage.GCSStorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/gcs/storage"
+        };
+    }
+    
     rpc getGCSResource (org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResourceGetRequest) returns
                                                     (org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResource) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto b/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto
new file mode 100644
index 0000000..b974245
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/gcs/GCSStorage.proto
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.gcs.storage;
+
+message GCSStorage {
+    string storageId = 1;
+    string bucketName = 2;
+}
+
+message GCSStorageGetRequest {
+    string storageId = 1;
+}
+
+message GCSStorageCreateRequest {
+    string bucketName = 1;
+}
+
+message GCSStorageUpdateRequest {
+    string storageId = 1;
+    string bucketName = 2;
+}
+
+message GCSStorageDeleteRequest {
+    string storageId = 1;
+}
+
+
diff --git a/services/resource-service/stub/src/main/proto/local/LocalResource.proto b/services/resource-service/stub/src/main/proto/local/LocalResource.proto
index 1978b0e..9d069d7 100644
--- a/services/resource-service/stub/src/main/proto/local/LocalResource.proto
+++ b/services/resource-service/stub/src/main/proto/local/LocalResource.proto
@@ -21,10 +21,11 @@
 package org.apache.airavata.mft.resource.stubs.local.resource;
 
 import "common/common.proto";
+import "local/LocalStorage.proto";
 
 message LocalResource {
     string resourceId = 1;
-    string agentId = 2;
+    org.apache.airavata.mft.resource.stubs.local.storage.LocalStorage localStorage = 2;
     oneof resource {
         org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
         org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
@@ -36,14 +37,20 @@
 }
 
 message LocalResourceCreateRequest {
-    string resourcePath = 1;
-    string agentId = 2;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message LocalResourceUpdateRequest {
     string resourceId = 1;
-    string resourcePath = 2;
-    string agentId = 3;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message LocalResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/local/LocalService.proto b/services/resource-service/stub/src/main/proto/local/LocalService.proto
index 672d9d6..850ee9f 100644
--- a/services/resource-service/stub/src/main/proto/local/LocalService.proto
+++ b/services/resource-service/stub/src/main/proto/local/LocalService.proto
@@ -23,9 +23,36 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "local/LocalResource.proto";
+import "local/LocalStorage.proto";
 
 service LocalResourceService {
 
+    // Storage
+    rpc getLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageGetRequest) returns (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/local/storage"
+        };
+    }
+
+    rpc createLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageCreateRequest) returns (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/local/storage"
+        };
+    }
+
+    rpc updateLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/local/storage"
+        };
+    }
+
+    rpc deleteLocalStorage (org.apache.airavata.mft.resource.stubs.local.storage.LocalStorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/local/storage"
+        };
+    }
+
+    // Resource
     rpc getLocalResource (org.apache.airavata.mft.resource.stubs.local.resource.LocalResourceGetRequest) returns
     (org.apache.airavata.mft.resource.stubs.local.resource.LocalResource) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/local/LocalStorage.proto b/services/resource-service/stub/src/main/proto/local/LocalStorage.proto
new file mode 100644
index 0000000..9b9e9b9
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/local/LocalStorage.proto
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.local.storage;
+
+message LocalStorage {
+    string storageId = 1;
+    string agentId = 2;
+}
+
+message LocalStorageGetRequest {
+    string storageId = 1;
+}
+
+message LocalStorageCreateRequest {
+    string agentId = 1;
+}
+
+message LocalStorageUpdateRequest {
+    string storageId = 1;
+    string agentId = 2;
+}
+
+message LocalStorageDeleteRequest {
+    string storageId = 1;
+}
+
+
diff --git a/services/resource-service/stub/src/main/proto/s3/S3Resource.proto b/services/resource-service/stub/src/main/proto/s3/S3Resource.proto
index 9a9404a..c16f29c 100644
--- a/services/resource-service/stub/src/main/proto/s3/S3Resource.proto
+++ b/services/resource-service/stub/src/main/proto/s3/S3Resource.proto
@@ -21,14 +21,14 @@
 package org.apache.airavata.mft.resource.stubs.s3.resource;
 
 import "common/common.proto";
+import "s3/S3Storage.proto";
 
 message S3Resource {
     string resourceId = 1;
-    string bucketName = 2;
-    string region = 3;
+    org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage s3Storage = 2;
     oneof resource {
-        org.apache.airavata.mft.resource.stubs.common.FileResource file = 4;
-        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 5;
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
     }
 }
 
@@ -37,16 +37,20 @@
 }
 
 message S3ResourceCreateRequest {
-    string bucketName = 1;
-    string region = 2;
-    string resourcePath = 3;
+    string storageId = 1;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message S3ResourceUpdateRequest {
     string resourceId = 1;
-    string bucketName = 2;
-    string region = 3;
-    string resourcePath = 4;
+    string storageId = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message S3ResourceDeleteRequest {
diff --git a/services/resource-service/stub/src/main/proto/s3/S3Service.proto b/services/resource-service/stub/src/main/proto/s3/S3Service.proto
index aae50f6..9240a80 100644
--- a/services/resource-service/stub/src/main/proto/s3/S3Service.proto
+++ b/services/resource-service/stub/src/main/proto/s3/S3Service.proto
@@ -23,8 +23,36 @@
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
 import "s3/S3Resource.proto";
+import "s3/S3Storage.proto";
 
 service S3ResourceService {
+
+    // Storage
+    rpc getS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageGetRequest) returns (org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage) {
+        option (google.api.http) = {
+           get: "/v1.0/resource/s3/storage"
+        };
+    }
+
+    rpc createS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageCreateRequest) returns (org.apache.airavata.mft.resource.stubs.s3.storage.S3Storage) {
+        option (google.api.http) = {
+           post: "/v1.0/resource/s3/storage"
+        };
+    }
+
+    rpc updateS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/resource/s3/storage"
+        };
+    }
+
+    rpc deleteS3Storage (org.apache.airavata.mft.resource.stubs.s3.storage.S3StorageDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/resource/s3/storage"
+        };
+    }
+    
+    // Resource
     rpc getS3Resource (org.apache.airavata.mft.resource.stubs.s3.resource.S3ResourceGetRequest) returns
                                                 (org.apache.airavata.mft.resource.stubs.s3.resource.S3Resource) {
         option (google.api.http) = {
diff --git a/services/resource-service/stub/src/main/proto/s3/S3Storage.proto b/services/resource-service/stub/src/main/proto/s3/S3Storage.proto
new file mode 100644
index 0000000..4a51221
--- /dev/null
+++ b/services/resource-service/stub/src/main/proto/s3/S3Storage.proto
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.airavata.mft.resource.stubs.s3.storage;
+
+message S3Storage {
+    string storageId = 1;
+    string bucketName = 2;
+    string region = 3;
+}
+
+message S3StorageGetRequest {
+    string storageId = 1;
+}
+
+message S3StorageCreateRequest {
+    string bucketName = 1;
+    string region = 2;
+}
+
+message S3StorageUpdateRequest {
+    string storageId = 1;
+    string bucketName = 2;
+    string region = 3;
+}
+
+message S3StorageDeleteRequest {
+    string storageId = 1;
+}
+
+
diff --git a/services/resource-service/stub/src/main/proto/scp/SCPResource.proto b/services/resource-service/stub/src/main/proto/scp/SCPResource.proto
index bfa51fb..6d65ad6 100644
--- a/services/resource-service/stub/src/main/proto/scp/SCPResource.proto
+++ b/services/resource-service/stub/src/main/proto/scp/SCPResource.proto
@@ -38,13 +38,19 @@
 
 message SCPResourceCreateRequest {
     string scpStorageId = 1;
-    string resourcePath = 2;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 2;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 3;
+    }
 }
 
 message SCPResourceUpdateRequest {
     string resourceId = 1;
     string scpStorageId = 2;
-    string resourcePath = 3;
+    oneof resource {
+        org.apache.airavata.mft.resource.stubs.common.FileResource file = 3;
+        org.apache.airavata.mft.resource.stubs.common.DirectoryResource directory = 4;
+    }
 }
 
 message SCPResourceDeleteRequest {
diff --git a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
index 1a725cb..8a265c8 100644
--- a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
+++ b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureMetadataCollector.java
@@ -73,7 +73,8 @@
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
 
-        BlobClient blobClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer()).getBlobClient(azureResource.getFile().getResourcePath());
+        BlobClient blobClient = blobServiceClient.getBlobContainerClient(azureResource.getAzureStorage().getContainer())
+                                                .getBlobClient(azureResource.getFile().getResourcePath());
 
         BlobProperties properties = blobClient.getBlockBlobClient().getProperties();
         ResourceMetadata metadata = new ResourceMetadata();
@@ -103,7 +104,7 @@
         AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
-        BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
+        BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(azureResource.getAzureStorage().getContainer());
         boolean containerExists = containerClient.exists();
         if (!containerExists) {
             return false;
diff --git a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureReceiver.java b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureReceiver.java
index 162d31d..a9bfdf7 100644
--- a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureReceiver.java
+++ b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureReceiver.java
@@ -57,7 +57,7 @@
         AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
-        this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
+        this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getAzureStorage().getContainer());
     }
 
     @Override
diff --git a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureSender.java b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureSender.java
index 9642103..7dcff4b 100644
--- a/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureSender.java
+++ b/transport/azure-transport/src/main/java/org/apache/airavata/mft/transport/azure/AzureSender.java
@@ -54,7 +54,7 @@
         AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
-        this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
+        this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getAzureStorage().getContainer());
     }
 
     @Override
diff --git a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
index 0f8e634..bda277b 100644
--- a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
+++ b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSMetadataCollector.java
@@ -87,7 +87,8 @@
         Storage storage = new Storage.Builder(transport, jsonFactory, credential).build();
 
         ResourceMetadata metadata = new ResourceMetadata();
-        StorageObject gcsMetadata = storage.objects().get(gcsResource.getBucketName(), gcsResource.getFile().getResourcePath()).execute();
+        StorageObject gcsMetadata = storage.objects().get(gcsResource.getGcsStorage().getBucketName(),
+                                                            gcsResource.getFile().getResourcePath()).execute();
         metadata.setResourceSize(gcsMetadata.getSize().longValue());
         String md5Sum = String.format("%032x", new BigInteger(1, Base64.getDecoder().decode(gcsMetadata.getMd5Hash())));
         metadata.setMd5sum(md5Sum);
@@ -117,9 +118,11 @@
         Storage storage = new Storage.Builder(transport, jsonFactory, credential).build();
         switch (gcsResource.getResourceCase().name()){
             case ResourceTypes.FILE:
-                return !storage.objects().get(gcsResource.getBucketName(), gcsResource.getFile().getResourcePath()).execute().isEmpty();
+                return !storage.objects().get(gcsResource.getGcsStorage().getBucketName(), gcsResource.getFile().getResourcePath())
+                                            .execute().isEmpty();
             case ResourceTypes.DIRECTORY:
-                return !storage.objects().get(gcsResource.getBucketName(), gcsResource.getDirectory().getResourcePath()).execute().isEmpty();
+                return !storage.objects().get(gcsResource.getGcsStorage().getBucketName(), gcsResource.getDirectory().getResourcePath())
+                                            .execute().isEmpty();
         }
         return false;
     }
diff --git a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSReceiver.java b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSReceiver.java
index 5a1bc63..03fd31c 100644
--- a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSReceiver.java
+++ b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSReceiver.java
@@ -80,7 +80,7 @@
         logger.info("Starting GCS Receiver stream for transfer {}", context.getTransferId());
 
         if (ResourceTypes.FILE.equals(this.gcsResource.getResourceCase().name())) {
-            InputStream inputStream = storage.objects().get(this.gcsResource.getBucketName(),
+            InputStream inputStream = storage.objects().get(this.gcsResource.getGcsStorage().getBucketName(),
                                         this.gcsResource.getFile().getResourcePath()).executeMediaAsInputStream();
             OutputStream os = context.getStreamBuffer().getOutputStream();
             int read;
diff --git a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSSender.java b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSSender.java
index 7326545..368d24d 100644
--- a/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSSender.java
+++ b/transport/gcp-transport/src/main/java/org/apache/airavata/mft/transport/gcp/GCSSender.java
@@ -101,7 +101,7 @@
                     // Set the access control list to publicly read-only
                     .setAcl(Arrays.asList(new ObjectAccessControl().setEntity("user-" + entityUser).setRole("OWNER")));
 
-            Insert insertRequest = storage.objects().insert(this.gcsResource.getBucketName(), objectMetadata, contentStream);
+            Insert insertRequest = storage.objects().insert(this.gcsResource.getGcsStorage().getBucketName(), objectMetadata, contentStream);
 
             insertRequest.execute();
 
diff --git a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
index 56d98f4..5326e11 100644
--- a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
+++ b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3MetadataCollector.java
@@ -71,11 +71,11 @@
 
         AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                 .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
-                .withRegion(s3Resource.getRegion())
+                .withRegion(s3Resource.getS3Storage().getRegion())
                 .build();
 
         ResourceMetadata metadata = new ResourceMetadata();
-        ObjectMetadata s3Metadata = s3Client.getObjectMetadata(s3Resource.getBucketName(), s3Resource.getFile().getResourcePath());
+        ObjectMetadata s3Metadata = s3Client.getObjectMetadata(s3Resource.getS3Storage().getBucketName(), s3Resource.getFile().getResourcePath());
         metadata.setResourceSize(s3Metadata.getContentLength());
         metadata.setMd5sum(s3Metadata.getETag());
         metadata.setUpdateTime(s3Metadata.getLastModified().getTime());
@@ -97,14 +97,14 @@
 
         AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                 .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
-                .withRegion(s3Resource.getRegion())
+                .withRegion(s3Resource.getS3Storage().getRegion())
                 .build();
 
         switch (s3Resource.getResourceCase().name()){
             case ResourceTypes.FILE:
-                return s3Client.doesObjectExist(s3Resource.getBucketName(), s3Resource.getFile().getResourcePath());
+                return s3Client.doesObjectExist(s3Resource.getS3Storage().getBucketName(), s3Resource.getFile().getResourcePath());
             case ResourceTypes.DIRECTORY:
-                return s3Client.doesObjectExist(s3Resource.getBucketName(), s3Resource.getDirectory().getResourcePath());
+                return s3Client.doesObjectExist(s3Resource.getS3Storage().getBucketName(), s3Resource.getDirectory().getResourcePath());
         }
         return false;
     }
diff --git a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Receiver.java b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Receiver.java
index 7e8d42b..ddfd425 100644
--- a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Receiver.java
+++ b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Receiver.java
@@ -59,7 +59,7 @@
 
         s3Client = AmazonS3ClientBuilder.standard()
                 .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
-                .withRegion(s3Resource.getRegion())
+                .withRegion(s3Resource.getS3Storage().getRegion())
                 .build();
     }
 
@@ -74,7 +74,7 @@
         if (ResourceTypes.FILE.equals(this.s3Resource.getResourceCase().name())) {
             logger.info("Starting S3 Receiver stream for transfer {}", context.getTransferId());
 
-            S3Object s3object = s3Client.getObject(s3Resource.getBucketName(), s3Resource.getFile().getResourcePath());
+            S3Object s3object = s3Client.getObject(s3Resource.getS3Storage().getBucketName(), s3Resource.getFile().getResourcePath());
             S3ObjectInputStream inputStream = s3object.getObjectContent();
 
             OutputStream os = context.getStreamBuffer().getOutputStream();
diff --git a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Sender.java b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Sender.java
index f0faeb2..095ed3c 100644
--- a/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Sender.java
+++ b/transport/s3-transport/src/main/java/org/apache/airavata/mft/transport/s3/S3Sender.java
@@ -55,7 +55,7 @@
 
         s3Client = AmazonS3ClientBuilder.standard()
                 .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
-                .withRegion(s3Resource.getRegion())
+                .withRegion(s3Resource.getS3Storage().getRegion())
                 .build();
     }
 
@@ -73,7 +73,7 @@
         metadata.setContentLength(context.getMetadata().getResourceSize());
 
         if (ResourceTypes.FILE.equals(this.s3Resource.getResourceCase().name())) {
-            s3Client.putObject(this.s3Resource.getBucketName(), this.s3Resource.getFile().getResourcePath(),
+            s3Client.putObject(this.s3Resource.getS3Storage().getBucketName(), this.s3Resource.getFile().getResourcePath(),
                                                         context.getStreamBuffer().getInputStream(), metadata);
             logger.info("Completed S3 Sender stream for transfer {}", context.getTransferId());
         } else {