Restructuring proto files and the stub client for secret service
diff --git a/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/ResourceServiceClient.java b/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/ResourceServiceClient.java
index a5b023f..f23c014 100644
--- a/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/ResourceServiceClient.java
+++ b/services/resource-service/client/src/main/java/org/apache/airavata/mft/resource/client/ResourceServiceClient.java
@@ -1,3 +1,20 @@
+/*
+ * 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.mft.resource.client;
 
 import io.grpc.ManagedChannel;
diff --git a/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClient.java b/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClient.java
index 47050f2..f7299de 100644
--- a/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClient.java
+++ b/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClient.java
@@ -18,28 +18,56 @@
 package org.apache.airavata.mft.secret.client;
 
 import io.grpc.ManagedChannel;
-import io.grpc.ManagedChannelBuilder;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.azure.AzureSecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.box.BoxSecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.dropbox.DropboxSecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.ftp.FTPSecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.gcs.GCSSecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.s3.S3SecretServiceGrpc;
+import org.apache.airavata.mft.credential.service.scp.SCPSecretServiceGrpc;
 
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.io.Closeable;
+import java.io.IOException;
 
-public class SecretServiceClient {
+public class SecretServiceClient implements Closeable {
 
-    private static Map<String, Map<Integer, SecretServiceGrpc.SecretServiceBlockingStub>> stubCache = new ConcurrentHashMap<>();
+    private ManagedChannel channel;
 
-    public static SecretServiceGrpc.SecretServiceBlockingStub buildClient(String hostName, int port) {
+    SecretServiceClient(ManagedChannel channel) {
+        this.channel = channel;
+    }
 
-        if (stubCache.containsKey(hostName)) {
-            if (stubCache.get(hostName).containsKey(port)) {
-                return stubCache.get(hostName).get(port);
-            }
-        }
+    public SCPSecretServiceGrpc.SCPSecretServiceBlockingStub scp() {
+        return SCPSecretServiceGrpc.newBlockingStub(channel);
+    }
 
-        ManagedChannel channel = ManagedChannelBuilder.forAddress(hostName, port).usePlaintext().build();
-        SecretServiceGrpc.SecretServiceBlockingStub stub = SecretServiceGrpc.newBlockingStub(channel);
-        stubCache.put(hostName, Collections.singletonMap(port, stub));
-        return stub;
+    public S3SecretServiceGrpc.S3SecretServiceBlockingStub s3() {
+        return S3SecretServiceGrpc.newBlockingStub(channel);
+    }
+
+    public FTPSecretServiceGrpc.FTPSecretServiceBlockingStub ftp() {
+        return FTPSecretServiceGrpc.newBlockingStub(channel);
+    }
+
+    public AzureSecretServiceGrpc.AzureSecretServiceBlockingStub azure() {
+        return AzureSecretServiceGrpc.newBlockingStub(channel);
+    }
+
+    public GCSSecretServiceGrpc.GCSSecretServiceBlockingStub gcs() {
+        return GCSSecretServiceGrpc.newBlockingStub(channel);
+    }
+
+    public BoxSecretServiceGrpc.BoxSecretServiceBlockingStub box() {
+        return BoxSecretServiceGrpc.newBlockingStub(channel);
+    }
+
+    public DropboxSecretServiceGrpc.DropboxSecretServiceBlockingStub dropbox() {
+        return DropboxSecretServiceGrpc.newBlockingStub(channel);
+    }
+
+
+    @Override
+    public void close() throws IOException {
+        this.channel.shutdown();
     }
 }
diff --git a/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClientBuilder.java b/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClientBuilder.java
new file mode 100644
index 0000000..79b4973
--- /dev/null
+++ b/services/secret-service/client/src/main/java/org/apache/airavata/mft/secret/client/SecretServiceClientBuilder.java
@@ -0,0 +1,29 @@
+/*
+ * 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.mft.secret.client;
+
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+
+public class SecretServiceClientBuilder {
+
+    public static SecretServiceClient buildClient(String hostName, int port) {
+        ManagedChannel channel = ManagedChannelBuilder.forAddress(hostName, port).usePlaintext().build();
+        return new SecretServiceClient(channel);
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java
index 81319ab..d75d789 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/SecretBackend.java
@@ -17,7 +17,13 @@
 
 package org.apache.airavata.mft.secret.server.backend;
 
-import org.apache.airavata.mft.secret.service.*;
+import org.apache.airavata.mft.credential.stubs.azure.*;
+import org.apache.airavata.mft.credential.stubs.box.*;
+import org.apache.airavata.mft.credential.stubs.dropbox.*;
+import org.apache.airavata.mft.credential.stubs.ftp.*;
+import org.apache.airavata.mft.credential.stubs.gcs.*;
+import org.apache.airavata.mft.credential.stubs.s3.*;
+import org.apache.airavata.mft.credential.stubs.scp.*;
 
 import java.util.Optional;
 
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java
index f2835df..2288293 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/airavata/AiravataSecretBackend.java
@@ -19,8 +19,14 @@
 
 import org.apache.airavata.credential.store.client.CredentialStoreClientFactory;
 import org.apache.airavata.credential.store.cpi.CredentialStoreService;
+import org.apache.airavata.mft.credential.stubs.azure.*;
+import org.apache.airavata.mft.credential.stubs.box.*;
+import org.apache.airavata.mft.credential.stubs.dropbox.*;
+import org.apache.airavata.mft.credential.stubs.ftp.*;
+import org.apache.airavata.mft.credential.stubs.gcs.*;
+import org.apache.airavata.mft.credential.stubs.s3.*;
+import org.apache.airavata.mft.credential.stubs.scp.*;
 import org.apache.airavata.mft.secret.server.backend.SecretBackend;
-import org.apache.airavata.mft.secret.service.*;
 import org.apache.airavata.model.credential.store.SSHCredential;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java
index 4dd23bf..d8bf9bb 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/file/FileBasedSecretBackend.java
@@ -17,20 +17,25 @@
 
 package org.apache.airavata.mft.secret.server.backend.file;
 
+import org.apache.airavata.mft.credential.stubs.azure.*;
+import org.apache.airavata.mft.credential.stubs.box.*;
+import org.apache.airavata.mft.credential.stubs.dropbox.*;
+import org.apache.airavata.mft.credential.stubs.ftp.*;
+import org.apache.airavata.mft.credential.stubs.gcs.*;
+import org.apache.airavata.mft.credential.stubs.s3.*;
+import org.apache.airavata.mft.credential.stubs.scp.*;
 import org.apache.airavata.mft.secret.server.backend.SecretBackend;
-import org.apache.airavata.mft.secret.service.*;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Paths;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.List;
 import java.util.Optional;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 @SuppressWarnings("unchecked")
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
index 23f55f0..8a1ab66 100644
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/backend/sql/SQLSecretBackend.java
@@ -17,12 +17,18 @@
 
 package org.apache.airavata.mft.secret.server.backend.sql;
 
+import org.apache.airavata.mft.credential.stubs.azure.*;
+import org.apache.airavata.mft.credential.stubs.box.*;
+import org.apache.airavata.mft.credential.stubs.dropbox.*;
+import org.apache.airavata.mft.credential.stubs.ftp.*;
+import org.apache.airavata.mft.credential.stubs.gcs.*;
+import org.apache.airavata.mft.credential.stubs.s3.*;
+import org.apache.airavata.mft.credential.stubs.scp.*;
 import org.apache.airavata.mft.secret.server.backend.SecretBackend;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.FTPSecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.entity.SCPSecretEntity;
 import org.apache.airavata.mft.secret.server.backend.sql.repository.FTPSecretRepository;
 import org.apache.airavata.mft.secret.server.backend.sql.repository.SecretRepository;
-import org.apache.airavata.mft.secret.service.*;
 import org.dozer.DozerBeanMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/AzureServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/AzureServiceHandler.java
new file mode 100644
index 0000000..8160587
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/AzureServiceHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.azure.AzureSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.azure.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class AzureServiceHandler extends AzureSecretServiceGrpc.AzureSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(AzureServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getAzureSecret(AzureSecretGetRequest request, StreamObserver<AzureSecret> responseObserver) {
+        try {
+            this.backend.getAzureSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No Azure Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving Azure Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving Azure Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+        super.getAzureSecret(request, responseObserver);
+    }
+
+    @Override
+    public void createAzureSecret(AzureSecretCreateRequest request, StreamObserver<AzureSecret> responseObserver) {
+        try {
+            this.backend.createAzureSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating Azure Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating Azure Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateAzureSecret(AzureSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateAzureSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating Azure Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating Azure Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteAzureSecret(AzureSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteAzureSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting Azure Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting Azure Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/BoxServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/BoxServiceHandler.java
new file mode 100644
index 0000000..48f9f6c
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/BoxServiceHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.box.BoxSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.box.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class BoxServiceHandler extends BoxSecretServiceGrpc.BoxSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(BoxServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getBoxSecret(BoxSecretGetRequest request, StreamObserver<BoxSecret> responseObserver) {
+        try {
+            this.backend.getBoxSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No Box Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving Box Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving Box Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+        super.getBoxSecret(request, responseObserver);
+    }
+
+    @Override
+    public void createBoxSecret(BoxSecretCreateRequest request, StreamObserver<BoxSecret> responseObserver) {
+        try {
+            this.backend.createBoxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating Box Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating Box Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateBoxSecret(BoxSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateBoxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating Box Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating Box Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteBoxSecret(BoxSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteBoxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting Box Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting Box Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/DropboxServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/DropboxServiceHandler.java
new file mode 100644
index 0000000..307e2ee
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/DropboxServiceHandler.java
@@ -0,0 +1,94 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.dropbox.DropboxSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.dropbox.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class DropboxServiceHandler extends DropboxSecretServiceGrpc.DropboxSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(DropboxServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getDropboxSecret(DropboxSecretGetRequest request, StreamObserver<DropboxSecret> responseObserver) {
+        try {
+            this.backend.getDropboxSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No Dropbox Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving Dropbox Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving Dropbox Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createDropboxSecret(DropboxSecretCreateRequest request, StreamObserver<DropboxSecret> responseObserver) {
+        try {
+            this.backend.createDropboxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating Dropbox Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating Dropbox Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateDropboxSecret(DropboxSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateDropboxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating Dropbox Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating Dropbox Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteDropboxSecret(DropboxSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteDropboxSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting Dropbox Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting Dropbox Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/FTPServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/FTPServiceHandler.java
new file mode 100644
index 0000000..520bc1c
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/FTPServiceHandler.java
@@ -0,0 +1,92 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.ftp.FTPSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.ftp.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class FTPServiceHandler extends FTPSecretServiceGrpc.FTPSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(FTPServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getFTPSecret(FTPSecretGetRequest request, StreamObserver<FTPSecret> responseObserver) {
+        try {
+            this.backend.getFTPSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> responseObserver.onError(Status.INTERNAL
+                    .withDescription("No FTP Secret with id " + request.getSecretId())
+                    .asRuntimeException()));
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving FTP Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving FTP Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createFTPSecret(FTPSecretCreateRequest request, StreamObserver<FTPSecret> responseObserver) {
+        try {
+            this.backend.createFTPSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating FTP Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating FTP Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateFTPSecret(FTPSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateFTPSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating FTP Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating FTP Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteFTPSecret(FTPSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteFTPSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting FTP Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting FTP Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/GCSServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/GCSServiceHandler.java
new file mode 100644
index 0000000..982a54f
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/GCSServiceHandler.java
@@ -0,0 +1,94 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.gcs.GCSSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.gcs.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class GCSServiceHandler extends GCSSecretServiceGrpc.GCSSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(SCPServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getGCSSecret(GCSSecretGetRequest request, StreamObserver<GCSSecret> responseObserver) {
+        try {
+            this.backend.getGCSSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No GCS Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving GCS Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving GCS Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createGCSSecret(GCSSecretCreateRequest request, StreamObserver<GCSSecret> responseObserver) {
+        try {
+            this.backend.createGCSSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating GCS Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating GCS Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateGCSSecret(GCSSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateGCSSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating GCS Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating GCS Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteGCSSecret(GCSSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteGCSSecret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting GCS Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting GCS Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java
new file mode 100644
index 0000000..8dc68b5
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/S3ServiceHandler.java
@@ -0,0 +1,94 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.s3.S3SecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.s3.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class S3ServiceHandler extends S3SecretServiceGrpc.S3SecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(S3ServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getS3Secret(S3SecretGetRequest request, StreamObserver<S3Secret> responseObserver) {
+        try {
+            this.backend.getS3Secret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No S3 Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+
+        } catch (Exception e) {
+            logger.error("Error in retrieving S3 Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving S3 Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createS3Secret(S3SecretCreateRequest request, StreamObserver<S3Secret> responseObserver) {
+        try {
+            this.backend.createS3Secret(request);
+        } catch (Exception e) {
+            logger.error("Error in creating S3 Secret", e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in creating S3 Secret")
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateS3Secret(S3SecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.updateS3Secret(request);
+        } catch (Exception e) {
+            logger.error("Error in updating S3 Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in updating S3 Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteS3Secret(S3SecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        try {
+            this.backend.deleteS3Secret(request);
+        } catch (Exception e) {
+            logger.error("Error in deleting S3 Secret with id {}", request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in deleting S3 Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SCPServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SCPServiceHandler.java
new file mode 100644
index 0000000..57fc1f0
--- /dev/null
+++ b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SCPServiceHandler.java
@@ -0,0 +1,82 @@
+/*
+ * 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.mft.secret.server.handler;
+
+import com.google.protobuf.Empty;
+import io.grpc.Status;
+import io.grpc.stub.StreamObserver;
+import org.apache.airavata.mft.credential.service.scp.SCPSecretServiceGrpc;
+import org.apache.airavata.mft.credential.stubs.scp.*;
+import org.apache.airavata.mft.secret.server.backend.SecretBackend;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@GRpcService
+public class SCPServiceHandler extends SCPSecretServiceGrpc.SCPSecretServiceImplBase {
+
+    private static final Logger logger = LoggerFactory.getLogger(SCPServiceHandler.class);
+
+    @Autowired
+    private SecretBackend backend;
+
+    @Override
+    public void getSCPSecret(SCPSecretGetRequest request, StreamObserver<SCPSecret> responseObserver) {
+        try {
+            this.backend.getSCPSecret(request).ifPresentOrElse(secret -> {
+                responseObserver.onNext(secret);
+                responseObserver.onCompleted();
+            }, () -> {
+                responseObserver.onError(Status.INTERNAL
+                        .withDescription("No SCP Secret with id " + request.getSecretId())
+                        .asRuntimeException());
+            });
+        } catch (Exception e) {
+
+            logger.error("Error in retrieving SCP Secret with id " + request.getSecretId(), e);
+            responseObserver.onError(Status.INTERNAL.withCause(e)
+                    .withDescription("Error in retrieving SCP Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+
+    @Override
+    public void createSCPSecret(SCPSecretCreateRequest request, StreamObserver<SCPSecret> responseObserver) {
+        responseObserver.onNext(this.backend.createSCPSecret(request));
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void updateSCPSecret(SCPSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
+        this.backend.updateSCPSecret(request);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void deleteSCPSecret(SCPSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
+        boolean res = this.backend.deleteSCPSecret(request);
+        if (res) {
+            responseObserver.onCompleted();
+        } else {
+            responseObserver.onError(Status.INTERNAL
+                    .withDescription("Failed to delete SCP Secret with id " + request.getSecretId())
+                    .asRuntimeException());
+        }
+    }
+}
diff --git a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java b/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java
deleted file mode 100644
index cac5373..0000000
--- a/services/secret-service/server/src/main/java/org/apache/airavata/mft/secret/server/handler/SecretServiceHandler.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.airavata.mft.secret.server.handler;
-
-import com.google.protobuf.Empty;
-import io.grpc.Status;
-import io.grpc.stub.StreamObserver;
-import org.apache.airavata.mft.secret.server.backend.SecretBackend;
-import org.apache.airavata.mft.secret.service.*;
-import org.lognet.springboot.grpc.GRpcService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-@GRpcService
-public class SecretServiceHandler extends SecretServiceGrpc.SecretServiceImplBase {
-
-    private static final Logger logger = LoggerFactory.getLogger(SecretServiceHandler.class);
-
-    @Autowired
-    private SecretBackend backend;
-
-    @Override
-    public void getSCPSecret(SCPSecretGetRequest request, StreamObserver<SCPSecret> responseObserver) {
-        try {
-            this.backend.getSCPSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No SCP Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-        } catch (Exception e) {
-
-            logger.error("Error in retrieving SCP Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving SCP Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void createSCPSecret(SCPSecretCreateRequest request, StreamObserver<SCPSecret> responseObserver) {
-        responseObserver.onNext(this.backend.createSCPSecret(request));
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void updateSCPSecret(SCPSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        this.backend.updateSCPSecret(request);
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void deleteSCPSecret(SCPSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        boolean res = this.backend.deleteSCPSecret(request);
-        if (res) {
-            responseObserver.onCompleted();
-        } else {
-            responseObserver.onError(Status.INTERNAL
-                    .withDescription("Failed to delete SCP Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void getS3Secret(S3SecretGetRequest request, StreamObserver<S3Secret> responseObserver) {
-        try {
-            this.backend.getS3Secret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No S3 Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving S3 Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving S3 Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void createS3Secret(S3SecretCreateRequest request, StreamObserver<S3Secret> responseObserver) {
-        try {
-            this.backend.createS3Secret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating S3 Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating S3 Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateS3Secret(S3SecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateS3Secret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating S3 Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating S3 Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteS3Secret(S3SecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteS3Secret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting S3 Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting S3 Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void getBoxSecret(BoxSecretGetRequest request, StreamObserver<BoxSecret> responseObserver) {
-        try {
-            this.backend.getBoxSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No Box Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving Box Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving Box Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-        super.getBoxSecret(request, responseObserver);
-    }
-
-    @Override
-    public void createBoxSecret(BoxSecretCreateRequest request, StreamObserver<BoxSecret> responseObserver) {
-        try {
-            this.backend.createBoxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating Box Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating Box Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateBoxSecret(BoxSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateBoxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating Box Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating Box Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteBoxSecret(BoxSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteBoxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting Box Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting Box Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void getAzureSecret(AzureSecretGetRequest request, StreamObserver<AzureSecret> responseObserver) {
-        try {
-            this.backend.getAzureSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No Azure Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving Azure Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving Azure Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-        super.getAzureSecret(request, responseObserver);
-    }
-
-    @Override
-    public void createAzureSecret(AzureSecretCreateRequest request, StreamObserver<AzureSecret> responseObserver) {
-        try {
-            this.backend.createAzureSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating Azure Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating Azure Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateAzureSecret(AzureSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateAzureSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating Azure Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating Azure Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteAzureSecret(AzureSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteAzureSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting Azure Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting Azure Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    // GCS
-
-    @Override
-    public void getGCSSecret(GCSSecretGetRequest request, StreamObserver<GCSSecret> responseObserver) {
-        try {
-            this.backend.getGCSSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No GCS Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving GCS Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving GCS Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void createGCSSecret(GCSSecretCreateRequest request, StreamObserver<GCSSecret> responseObserver) {
-        try {
-            this.backend.createGCSSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating GCS Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating GCS Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateGCSSecret(GCSSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateGCSSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating GCS Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating GCS Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteGCSSecret(GCSSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteGCSSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting GCS Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting GCS Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    // Dropbox
-
-    @Override
-    public void getDropboxSecret(DropboxSecretGetRequest request, StreamObserver<DropboxSecret> responseObserver) {
-        try {
-            this.backend.getDropboxSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> {
-                responseObserver.onError(Status.INTERNAL
-                        .withDescription("No Dropbox Secret with id " + request.getSecretId())
-                        .asRuntimeException());
-            });
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving Dropbox Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving Dropbox Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void createDropboxSecret(DropboxSecretCreateRequest request, StreamObserver<DropboxSecret> responseObserver) {
-        try {
-            this.backend.createDropboxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating Dropbox Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating Dropbox Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateDropboxSecret(DropboxSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateDropboxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating Dropbox Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating Dropbox Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteDropboxSecret(DropboxSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteDropboxSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting Dropbox Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting Dropbox Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void getFTPSecret(FTPSecretGetRequest request, StreamObserver<FTPSecret> responseObserver) {
-        try {
-            this.backend.getFTPSecret(request).ifPresentOrElse(secret -> {
-                responseObserver.onNext(secret);
-                responseObserver.onCompleted();
-            }, () -> responseObserver.onError(Status.INTERNAL
-                    .withDescription("No FTP Secret with id " + request.getSecretId())
-                    .asRuntimeException()));
-
-        } catch (Exception e) {
-            logger.error("Error in retrieving FTP Secret with id " + request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in retrieving FTP Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void createFTPSecret(FTPSecretCreateRequest request, StreamObserver<FTPSecret> responseObserver) {
-        try {
-            this.backend.createFTPSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in creating FTP Secret", e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in creating FTP Secret")
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void updateFTPSecret(FTPSecretUpdateRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.updateFTPSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in updating FTP Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in updating FTP Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-    @Override
-    public void deleteFTPSecret(FTPSecretDeleteRequest request, StreamObserver<Empty> responseObserver) {
-        try {
-            this.backend.deleteFTPSecret(request);
-        } catch (Exception e) {
-            logger.error("Error in deleting FTP Secret with id {}", request.getSecretId(), e);
-            responseObserver.onError(Status.INTERNAL.withCause(e)
-                    .withDescription("Error in deleting FTP Secret with id " + request.getSecretId())
-                    .asRuntimeException());
-        }
-    }
-
-}
diff --git a/services/secret-service/stub/src/main/proto/SecretService.proto b/services/secret-service/stub/src/main/proto/SecretService.proto
deleted file mode 100644
index b933df9..0000000
--- a/services/secret-service/stub/src/main/proto/SecretService.proto
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-syntax = "proto3";
-
-option java_multiple_files = true;
-package org.apache.airavata.mft.secret.service;
-
-import "google/api/annotations.proto";
-import "google/protobuf/empty.proto";
-
-message AuthToken {
-    string token = 1;
-}
-
-message SCPSecret {
-    string secretId = 1;
-    string privateKey = 2;
-    string publicKey = 3;
-    string passphrase = 4;
-}
-
-message SCPSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message SCPSecretCreateRequest {
-    string privateKey = 1;
-    string publicKey = 2;
-    string passphrase = 3;
-    AuthToken authzToken = 5;
-}
-
-message SCPSecretUpdateRequest {
-    string secretId = 1;
-    string privateKey = 2;
-    string publicKey = 3;
-    string passphrase = 4;
-    AuthToken authzToken = 6;
-}
-
-message SCPSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message S3Secret {
-    string secretId = 1;
-    string accessKey = 2;
-    string secretKey = 3;
-}
-
-message S3SecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message S3SecretCreateRequest {
-    string accessKey = 1;
-    string secretKey = 2;
-    AuthToken authzToken = 3;
-}
-
-message S3SecretUpdateRequest {
-    string secretId = 1;
-    string accessKey = 2;
-    string secretKey = 3;
-    AuthToken authzToken = 4;
-}
-
-message S3SecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-// Azure
-
-message AzureSecret {
-    string secretId = 1;
-    string connectionString = 2;
-}
-
-message AzureSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message AzureSecretCreateRequest {
-    string connectionString = 1;
-    AuthToken authzToken = 2;
-}
-
-message AzureSecretUpdateRequest {
-    string secretId = 1;
-    string connectionString = 2;
-    AuthToken authzToken = 3;
-}
-
-message AzureSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-// GCS
-
-message GCSSecret {
-    string secretId = 1;
-    string credentialsJson = 2;
-}
-
-message GCSSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message GCSSecretCreateRequest {
-    string credentialsJson = 1;
-    AuthToken authzToken = 2;
-}
-
-message GCSSecretUpdateRequest {
-    string secretId = 1;
-    string credentialsJson = 2;
-    AuthToken authzToken = 3;
-}
-
-message GCSSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-// Box
-
-message BoxSecret {
-    string secretId = 1;
-    string accessToken = 2;
-}
-
-message BoxSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message BoxSecretCreateRequest {
-    string accessToken = 1;
-    AuthToken authzToken = 2;
-}
-
-message BoxSecretUpdateRequest {
-    string secretId = 1;
-    string accessToken = 2;
-    AuthToken authzToken = 3;
-}
-
-message BoxSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-// DropBox
-
-message DropboxSecret {
-    string secretId = 1;
-    string accessToken = 2;
-}
-
-message DropboxSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message DropboxSecretCreateRequest {
-    string accessToken = 1;
-    AuthToken authzToken = 2;
-}
-
-message DropboxSecretUpdateRequest {
-    string secretId = 1;
-    string accessToken = 2;
-    AuthToken authzToken = 3;
-}
-
-message DropboxSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-// FTP
-message FTPSecret {
-    string secretId = 1;
-    string userId = 2;
-    string password = 3;
-}
-
-message FTPSecretGetRequest {
-    string secretId = 1;
-    AuthToken authzToken = 2;
-}
-
-message FTPSecretCreateRequest {
-    string userId = 1;
-    string password = 2;
-    AuthToken authzToken = 3;
-}
-
-message FTPSecretUpdateRequest {
-    string secretId = 1;
-    string userId = 2;
-    string password = 3;
-    AuthToken authzToken = 4;
-}
-
-message FTPSecretDeleteRequest {
-    string secretId = 1;
-    AuthToken authzToken = 4;
-}
-
-service  SecretService {
-    rpc getSCPSecret (SCPSecretGetRequest) returns (SCPSecret) {
-        option (google.api.http) = {
-           get: "/v1.0/secret/scp"
-        };
-    }
-
-    rpc createSCPSecret (SCPSecretCreateRequest) returns (SCPSecret) {
-        option (google.api.http) = {
-           post: "/v1.0/secret/scp"
-        };
-    }
-
-    rpc updateSCPSecret (SCPSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           put: "/v1.0/secret/scp"
-        };
-    }
-
-    rpc deleteSCPSecret (SCPSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           delete: "/v1.0/secret/scp"
-        };
-    }
-
-    rpc getS3Secret (S3SecretGetRequest) returns (S3Secret) {
-        option (google.api.http) = {
-           get: "/v1.0/secret/s3"
-        };
-    }
-
-    rpc createS3Secret (S3SecretCreateRequest) returns (S3Secret) {
-        option (google.api.http) = {
-           post: "/v1.0/secret/s3"
-        };
-    }
-
-    rpc updateS3Secret (S3SecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           put: "/v1.0/secret/s3"
-        };
-    }
-
-    rpc deleteS3Secret (S3SecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           delete: "/v1.0/secret/s3"
-        };
-    }
-
-    rpc getBoxSecret (BoxSecretGetRequest) returns (BoxSecret) {
-        option (google.api.http) = {
-           get: "/v1.0/secret/box"
-        };
-    }
-
-    rpc createBoxSecret (BoxSecretCreateRequest) returns (BoxSecret) {
-        option (google.api.http) = {
-           post: "/v1.0/secret/box"
-        };
-    }
-
-    rpc updateBoxSecret (BoxSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           put: "/v1.0/secret/box"
-        };
-    }
-
-    rpc deleteBoxSecret (BoxSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           delete: "/v1.0/secret/box"
-        };
-    }
-
-    // Azure
-
-    rpc getAzureSecret (AzureSecretGetRequest) returns (AzureSecret) {
-        option (google.api.http) = {
-           get: "/v1.0/secret/azure"
-        };
-    }
-
-    rpc createAzureSecret (AzureSecretCreateRequest) returns (AzureSecret) {
-        option (google.api.http) = {
-           post: "/v1.0/secret/azure"
-        };
-    }
-
-    rpc updateAzureSecret (AzureSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           put: "/v1.0/secret/azure"
-        };
-    }
-
-    rpc deleteAzureSecret (AzureSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-           delete: "/v1.0/secret/azure"
-        };
-    }
-
-    // GCS
-
-    rpc getGCSSecret (GCSSecretGetRequest) returns (GCSSecret) {
-        option (google.api.http) = {
-            get: "/v1.0/secret/gcs"
-        };
-    }
-
-    rpc createGCSSecret (GCSSecretCreateRequest) returns (GCSSecret) {
-        option (google.api.http) = {
-            post: "/v1.0/secret/gcs"
-        };
-    }
-
-    rpc updateGCSSecret (GCSSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            put: "/v1.0/secret/gcs"
-        };
-    }
-
-    rpc deleteGCSSecret (GCSSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            delete: "/v1.0/secret/gcs"
-        };
-    }
-
-    // Dropbox
-
-    rpc getDropboxSecret (DropboxSecretGetRequest) returns (DropboxSecret) {
-        option (google.api.http) = {
-            get: "/v1.0/secret/dropbox"
-        };
-    }
-
-    rpc createDropboxSecret (DropboxSecretCreateRequest) returns (DropboxSecret) {
-        option (google.api.http) = {
-            post: "/v1.0/secret/dropbox"
-        };
-    }
-
-    rpc updateDropboxSecret (DropboxSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            put: "/v1.0/secret/dropbox"
-        };
-    }
-
-    rpc deleteDropboxSecret (DropboxSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            delete: "/v1.0/secret/dropbox"
-        };
-    }
-
-    // FTP
-
-    rpc getFTPSecret (FTPSecretGetRequest) returns (FTPSecret) {
-        option (google.api.http) = {
-            get: "/v1.0/secret/ftp"
-        };
-    }
-
-    rpc createFTPSecret (FTPSecretCreateRequest) returns (FTPSecret) {
-        option (google.api.http) = {
-            post: "/v1.0/secret/ftp"
-        };
-    }
-
-    rpc updateFTPSecret (FTPSecretUpdateRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            put: "/v1.0/secret/ftp"
-        };
-    }
-
-    rpc deleteFTPSecret (FTPSecretDeleteRequest) returns (google.protobuf.Empty) {
-        option (google.api.http) = {
-            delete: "/v1.0/secret/ftp"
-        };
-    }
-
-}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/azure/AzureCredential.proto b/services/secret-service/stub/src/main/proto/azure/AzureCredential.proto
new file mode 100644
index 0000000..acce240
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/azure/AzureCredential.proto
@@ -0,0 +1,49 @@
+/*
+ * 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.credential.stubs.azure;
+
+import "common/CredCommon.proto";
+
+message AzureSecret {
+    string secretId = 1;
+    string connectionString = 2;
+}
+
+message AzureSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message AzureSecretCreateRequest {
+    string connectionString = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message AzureSecretUpdateRequest {
+    string secretId = 1;
+    string connectionString = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message AzureSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
diff --git a/services/secret-service/stub/src/main/proto/azure/AzureService.proto b/services/secret-service/stub/src/main/proto/azure/AzureService.proto
new file mode 100644
index 0000000..9097936
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/azure/AzureService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.azure;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "azure/AzureCredential.proto";
+
+service AzureSecretService {
+    rpc getAzureSecret (org.apache.airavata.mft.credential.stubs.azure.AzureSecretGetRequest) returns
+                                                        (org.apache.airavata.mft.credential.stubs.azure.AzureSecret) {
+        option (google.api.http) = {
+           get: "/v1.0/secret/azure"
+        };
+    }
+
+    rpc createAzureSecret (org.apache.airavata.mft.credential.stubs.azure.AzureSecretCreateRequest) returns
+                                                        (org.apache.airavata.mft.credential.stubs.azure.AzureSecret) {
+        option (google.api.http) = {
+           post: "/v1.0/secret/azure"
+        };
+    }
+
+    rpc updateAzureSecret (org.apache.airavata.mft.credential.stubs.azure.AzureSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/secret/azure"
+        };
+    }
+
+    rpc deleteAzureSecret (org.apache.airavata.mft.credential.stubs.azure.AzureSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/secret/azure"
+        };
+    }
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/box/BoxCredential.proto b/services/secret-service/stub/src/main/proto/box/BoxCredential.proto
new file mode 100644
index 0000000..f00837a
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/box/BoxCredential.proto
@@ -0,0 +1,49 @@
+/*
+ * 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.credential.stubs.box;
+
+import "common/CredCommon.proto";
+
+message BoxSecret {
+    string secretId = 1;
+    string accessToken = 2;
+}
+
+message BoxSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message BoxSecretCreateRequest {
+    string accessToken = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message BoxSecretUpdateRequest {
+    string secretId = 1;
+    string accessToken = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message BoxSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
diff --git a/services/secret-service/stub/src/main/proto/box/BoxService.proto b/services/secret-service/stub/src/main/proto/box/BoxService.proto
new file mode 100644
index 0000000..94fb54d
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/box/BoxService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.box;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "box/BoxCredential.proto";
+
+service BoxSecretService {
+    rpc getBoxSecret (org.apache.airavata.mft.credential.stubs.box.BoxSecretGetRequest) returns
+                                                            (org.apache.airavata.mft.credential.stubs.box.BoxSecret) {
+        option (google.api.http) = {
+           get: "/v1.0/secret/box"
+        };
+    }
+
+    rpc createBoxSecret (org.apache.airavata.mft.credential.stubs.box.BoxSecretCreateRequest) returns
+                                                            (org.apache.airavata.mft.credential.stubs.box.BoxSecret) {
+        option (google.api.http) = {
+           post: "/v1.0/secret/box"
+        };
+    }
+
+    rpc updateBoxSecret (org.apache.airavata.mft.credential.stubs.box.BoxSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/secret/box"
+        };
+    }
+
+    rpc deleteBoxSecret (org.apache.airavata.mft.credential.stubs.box.BoxSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/secret/box"
+        };
+    }
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/common/CredCommon.proto b/services/secret-service/stub/src/main/proto/common/CredCommon.proto
new file mode 100644
index 0000000..bb6ede9
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/common/CredCommon.proto
@@ -0,0 +1,25 @@
+/*
+ * 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.credential.stubs.common;
+
+message AuthToken {
+    string token = 1;
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/dropbox/DropboxCredential.proto b/services/secret-service/stub/src/main/proto/dropbox/DropboxCredential.proto
new file mode 100644
index 0000000..77a62b6
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/dropbox/DropboxCredential.proto
@@ -0,0 +1,49 @@
+/*
+ * 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.credential.stubs.dropbox;
+
+import "common/CredCommon.proto";
+
+message DropboxSecret {
+    string secretId = 1;
+    string accessToken = 2;
+}
+
+message DropboxSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message DropboxSecretCreateRequest {
+    string accessToken = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message DropboxSecretUpdateRequest {
+    string secretId = 1;
+    string accessToken = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message DropboxSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/dropbox/DropboxService.proto b/services/secret-service/stub/src/main/proto/dropbox/DropboxService.proto
new file mode 100644
index 0000000..c1abeae
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/dropbox/DropboxService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.dropbox;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "dropbox/DropboxCredential.proto";
+
+service DropboxSecretService {
+    rpc getDropboxSecret (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretGetRequest) returns
+                                                    (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret) {
+        option (google.api.http) = {
+            get: "/v1.0/secret/dropbox"
+        };
+    }
+
+    rpc createDropboxSecret (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretCreateRequest) returns
+                                                    (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret) {
+        option (google.api.http) = {
+            post: "/v1.0/secret/dropbox"
+        };
+    }
+
+    rpc updateDropboxSecret (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            put: "/v1.0/secret/dropbox"
+        };
+    }
+
+    rpc deleteDropboxSecret (org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            delete: "/v1.0/secret/dropbox"
+        };
+    }
+}
diff --git a/services/secret-service/stub/src/main/proto/ftp/FTPCredential.proto b/services/secret-service/stub/src/main/proto/ftp/FTPCredential.proto
new file mode 100644
index 0000000..ce8f06f
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/ftp/FTPCredential.proto
@@ -0,0 +1,52 @@
+/*
+ * 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.credential.stubs.ftp;
+
+import "common/CredCommon.proto";
+
+message FTPSecret {
+    string secretId = 1;
+    string userId = 2;
+    string password = 3;
+}
+
+message FTPSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message FTPSecretCreateRequest {
+    string userId = 1;
+    string password = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message FTPSecretUpdateRequest {
+    string secretId = 1;
+    string userId = 2;
+    string password = 3;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 4;
+}
+
+message FTPSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 4;
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/ftp/FTPService.proto b/services/secret-service/stub/src/main/proto/ftp/FTPService.proto
new file mode 100644
index 0000000..9c12b77
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/ftp/FTPService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.ftp;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "ftp/FTPCredential.proto";
+
+service FTPSecretService {
+    rpc getFTPSecret (org.apache.airavata.mft.credential.stubs.ftp.FTPSecretGetRequest) returns
+                                                            (org.apache.airavata.mft.credential.stubs.ftp.FTPSecret) {
+        option (google.api.http) = {
+            get: "/v1.0/secret/ftp"
+        };
+    }
+
+    rpc createFTPSecret (org.apache.airavata.mft.credential.stubs.ftp.FTPSecretCreateRequest) returns
+                                                            (org.apache.airavata.mft.credential.stubs.ftp.FTPSecret) {
+        option (google.api.http) = {
+            post: "/v1.0/secret/ftp"
+        };
+    }
+
+    rpc updateFTPSecret (org.apache.airavata.mft.credential.stubs.ftp.FTPSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            put: "/v1.0/secret/ftp"
+        };
+    }
+
+    rpc deleteFTPSecret (org.apache.airavata.mft.credential.stubs.ftp.FTPSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            delete: "/v1.0/secret/ftp"
+        };
+    }
+}
diff --git a/services/secret-service/stub/src/main/proto/gcs/GCSCredential.proto b/services/secret-service/stub/src/main/proto/gcs/GCSCredential.proto
new file mode 100644
index 0000000..c4f3dcb
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/gcs/GCSCredential.proto
@@ -0,0 +1,49 @@
+/*
+ * 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.credential.stubs.gcs;
+
+import "common/CredCommon.proto";
+
+message GCSSecret {
+    string secretId = 1;
+    string credentialsJson = 2;
+}
+
+message GCSSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message GCSSecretCreateRequest {
+    string credentialsJson = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message GCSSecretUpdateRequest {
+    string secretId = 1;
+    string credentialsJson = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message GCSSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/gcs/GCSService.proto b/services/secret-service/stub/src/main/proto/gcs/GCSService.proto
new file mode 100644
index 0000000..b48f3e4
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/gcs/GCSService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.gcs;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "gcs/GCSCredential.proto";
+
+service GCSSecretService {
+    rpc getGCSSecret (org.apache.airavata.mft.credential.stubs.gcs.GCSSecretGetRequest) returns
+                                                    (org.apache.airavata.mft.credential.stubs.gcs.GCSSecret) {
+        option (google.api.http) = {
+            get: "/v1.0/secret/gcs"
+        };
+    }
+
+    rpc createGCSSecret (org.apache.airavata.mft.credential.stubs.gcs.GCSSecretCreateRequest) returns
+                                                    (org.apache.airavata.mft.credential.stubs.gcs.GCSSecret) {
+        option (google.api.http) = {
+            post: "/v1.0/secret/gcs"
+        };
+    }
+
+    rpc updateGCSSecret (org.apache.airavata.mft.credential.stubs.gcs.GCSSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            put: "/v1.0/secret/gcs"
+        };
+    }
+
+    rpc deleteGCSSecret (org.apache.airavata.mft.credential.stubs.gcs.GCSSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+            delete: "/v1.0/secret/gcs"
+        };
+    }
+}
diff --git a/services/secret-service/stub/src/main/proto/s3/S3Credential.proto b/services/secret-service/stub/src/main/proto/s3/S3Credential.proto
new file mode 100644
index 0000000..ec384a5
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/s3/S3Credential.proto
@@ -0,0 +1,52 @@
+/*
+ * 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.credential.stubs.s3;
+
+import "common/CredCommon.proto";
+
+message S3Secret {
+    string secretId = 1;
+    string accessKey = 2;
+    string secretKey = 3;
+}
+
+message S3SecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message S3SecretCreateRequest {
+    string accessKey = 1;
+    string secretKey = 2;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 3;
+}
+
+message S3SecretUpdateRequest {
+    string secretId = 1;
+    string accessKey = 2;
+    string secretKey = 3;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 4;
+}
+
+message S3SecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/s3/S3Service.proto b/services/secret-service/stub/src/main/proto/s3/S3Service.proto
new file mode 100644
index 0000000..ed5517a
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/s3/S3Service.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.s3;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "s3/S3Credential.proto";
+
+service S3SecretService {
+    rpc getS3Secret (org.apache.airavata.mft.credential.stubs.s3.S3SecretGetRequest) returns
+                                                                (org.apache.airavata.mft.credential.stubs.s3.S3Secret) {
+        option (google.api.http) = {
+           get: "/v1.0/secret/s3"
+        };
+    }
+
+    rpc createS3Secret (org.apache.airavata.mft.credential.stubs.s3.S3SecretCreateRequest) returns
+                                                                (org.apache.airavata.mft.credential.stubs.s3.S3Secret) {
+        option (google.api.http) = {
+           post: "/v1.0/secret/s3"
+        };
+    }
+
+    rpc updateS3Secret (org.apache.airavata.mft.credential.stubs.s3.S3SecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/secret/s3"
+        };
+    }
+
+    rpc deleteS3Secret (org.apache.airavata.mft.credential.stubs.s3.S3SecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/secret/s3"
+        };
+    }
+}
\ No newline at end of file
diff --git a/services/secret-service/stub/src/main/proto/scp/SCPCredential.proto b/services/secret-service/stub/src/main/proto/scp/SCPCredential.proto
new file mode 100644
index 0000000..c638957
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/scp/SCPCredential.proto
@@ -0,0 +1,56 @@
+/*
+ * 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.credential.stubs.scp;
+
+import "common/CredCommon.proto";
+
+message SCPSecret {
+    string secretId = 1;
+    string privateKey = 2;
+    string publicKey = 3;
+    string passphrase = 4;
+}
+
+message SCPSecretGetRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
+message SCPSecretCreateRequest {
+    string privateKey = 1;
+    string publicKey = 2;
+    string passphrase = 3;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 5;
+}
+
+message SCPSecretUpdateRequest {
+    string secretId = 1;
+    string privateKey = 2;
+    string publicKey = 3;
+    string passphrase = 4;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 6;
+}
+
+message SCPSecretDeleteRequest {
+    string secretId = 1;
+    org.apache.airavata.mft.credential.stubs.common.AuthToken authzToken = 2;
+}
+
diff --git a/services/secret-service/stub/src/main/proto/scp/SCPService.proto b/services/secret-service/stub/src/main/proto/scp/SCPService.proto
new file mode 100644
index 0000000..b0f0d35
--- /dev/null
+++ b/services/secret-service/stub/src/main/proto/scp/SCPService.proto
@@ -0,0 +1,53 @@
+/*
+ * 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.credential.service.scp;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "scp/SCPCredential.proto";
+
+service SCPSecretService {
+    rpc getSCPSecret (org.apache.airavata.mft.credential.stubs.scp.SCPSecretGetRequest) returns
+                                                        (org.apache.airavata.mft.credential.stubs.scp.SCPSecret) {
+        option (google.api.http) = {
+           get: "/v1.0/secret/scp"
+        };
+    }
+
+    rpc createSCPSecret (org.apache.airavata.mft.credential.stubs.scp.SCPSecretCreateRequest) returns
+                                                        (org.apache.airavata.mft.credential.stubs.scp.SCPSecret) {
+        option (google.api.http) = {
+           post: "/v1.0/secret/scp"
+        };
+    }
+
+    rpc updateSCPSecret (org.apache.airavata.mft.credential.stubs.scp.SCPSecretUpdateRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           put: "/v1.0/secret/scp"
+        };
+    }
+
+    rpc deleteSCPSecret (org.apache.airavata.mft.credential.stubs.scp.SCPSecretDeleteRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/v1.0/secret/scp"
+        };
+    }
+}
\ No newline at end of file
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 16e081e..0d1c321 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
@@ -24,14 +24,14 @@
 import com.azure.storage.blob.models.BlobProperties;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecret;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResource;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.AzureSecret;
-import org.apache.airavata.mft.secret.service.AzureSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 public class AzureMetadataCollector implements MetadataCollector {
 
@@ -67,8 +67,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         AzureResource azureResource = resourceClient.azure().getAzureResource(AzureResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        AzureSecret azureSecret = secretClient.getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
 
@@ -98,8 +98,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         AzureResource azureResource = resourceClient.azure().getAzureResource(AzureResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        AzureSecret azureSecret = secretClient.getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
         BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
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 8b246a2..6d5a51e 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
@@ -24,14 +24,14 @@
 import com.azure.storage.blob.specialized.BlobInputStream;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecret;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResource;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.AzureSecret;
-import org.apache.airavata.mft.secret.service.AzureSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,8 +52,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.azureResource = resourceClient.azure().getAzureResource(AzureResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        AzureSecret azureSecret = secretClient.getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
         this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
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 245d53e..a2d05dc 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
@@ -23,12 +23,14 @@
 import com.azure.storage.blob.specialized.BlockBlobClient;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecret;
+import org.apache.airavata.mft.credential.stubs.azure.AzureSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResource;
 import org.apache.airavata.mft.resource.stubs.azure.resource.AzureResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.*;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,8 +49,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.azureResource = resourceClient.azure().getAzureResource(AzureResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        AzureSecret azureSecret = secretClient.getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        AzureSecret azureSecret = secretClient.azure().getAzureSecret(AzureSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(azureSecret.getConnectionString()).buildClient();
         this.containerClient = blobServiceClient.getBlobContainerClient(azureResource.getContainer());
diff --git a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
index 6427d2a..06a0c16 100644
--- a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
+++ b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxMetadataCollector.java
@@ -22,15 +22,14 @@
 import com.box.sdk.BoxFile;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecret;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResource;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.BoxSecret;
-import org.apache.airavata.mft.secret.service.BoxSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
-
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 public class BoxMetadataCollector implements MetadataCollector {
 
@@ -63,8 +62,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         BoxResource boxResource = resourceClient.box().getBoxResource(BoxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        BoxSecret boxSecret = secretClient.getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        BoxSecret boxSecret = secretClient.box().getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BoxAPIConnection api = new BoxAPIConnection(boxSecret.getAccessToken());
         BoxFile boxFile = new BoxFile(api, boxResource.getBoxFileId());
@@ -90,8 +89,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         BoxResource boxResource = resourceClient.box().getBoxResource(BoxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        BoxSecret boxSecret = secretClient.getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        BoxSecret boxSecret = secretClient.box().getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BoxAPIConnection api = new BoxAPIConnection(boxSecret.getAccessToken());
         BoxFile boxFile = new BoxFile(api, boxResource.getBoxFileId());
diff --git a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxReceiver.java b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxReceiver.java
index 7774392..20af8f7 100644
--- a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxReceiver.java
+++ b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxReceiver.java
@@ -22,14 +22,14 @@
 import com.box.sdk.BoxFile;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecret;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResource;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.BoxSecret;
-import org.apache.airavata.mft.secret.service.BoxSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,8 +51,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         boxResource = resourceClient.box().getBoxResource(BoxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        boxSecret = secretClient.getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        boxSecret = secretClient.box().getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         boxClient = new BoxAPIConnection(boxSecret.getAccessToken());
     }
diff --git a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxSender.java b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxSender.java
index fd2ac27..528bfc1 100644
--- a/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxSender.java
+++ b/transport/box-transport/src/main/java/org/apache/airavata/mft/transport/box/BoxSender.java
@@ -22,14 +22,14 @@
 import com.box.sdk.BoxFile;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecret;
+import org.apache.airavata.mft.credential.stubs.box.BoxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResource;
 import org.apache.airavata.mft.resource.stubs.box.resource.BoxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.BoxSecret;
-import org.apache.airavata.mft.secret.service.BoxSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,8 +47,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         boxResource = resourceClient.box().getBoxResource(BoxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        boxSecret = secretClient.getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        boxSecret = secretClient.box().getBoxSecret(BoxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         boxClient = new BoxAPIConnection(boxSecret.getAccessToken());
     }
diff --git a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
index 42a22db..5618337 100644
--- a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
+++ b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxMetadataCollector.java
@@ -22,15 +22,14 @@
 import com.dropbox.core.v2.files.FileMetadata;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
-import org.apache.airavata.mft.resource.service.box.BoxResourceServiceGrpc;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResource;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.DropboxSecret;
-import org.apache.airavata.mft.secret.service.DropboxSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 public class DropboxMetadataCollector implements MetadataCollector {
 
@@ -62,8 +61,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         DropboxResource dropboxResource = resourceClient.dropbox().getDropboxResource(DropboxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        DropboxSecret dropboxSecret = secretClient.getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        DropboxSecret dropboxSecret = secretClient.dropbox().getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         DbxRequestConfig config = DbxRequestConfig.newBuilder("mftdropbox/v1").build();
         DbxClientV2 dbxClientV2 = new DbxClientV2(config, dropboxSecret.getAccessToken());
@@ -83,8 +82,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         DropboxResource dropboxResource = resourceClient.dropbox().getDropboxResource(DropboxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        DropboxSecret dropboxSecret = secretClient.getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        DropboxSecret dropboxSecret = secretClient.dropbox().getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         DbxRequestConfig config = DbxRequestConfig.newBuilder("mftdropbox/v1").build();
         DbxClientV2 dbxClientV2 = new DbxClientV2(config, dropboxSecret.getAccessToken());
diff --git a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxReceiver.java b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxReceiver.java
index 4cb084a..d047393 100644
--- a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxReceiver.java
+++ b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxReceiver.java
@@ -21,12 +21,14 @@
 import com.dropbox.core.v2.DbxClientV2;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResource;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.*;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,8 +47,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.dropboxResource = resourceClient.dropbox().getDropboxResource(DropboxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        DropboxSecret dropboxSecret = secretClient.getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        DropboxSecret dropboxSecret = secretClient.dropbox().getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         DbxRequestConfig config = DbxRequestConfig.newBuilder("mftdropbox/v1").build();
         dbxClientV2 = new DbxClientV2(config, dropboxSecret.getAccessToken());
diff --git a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxSender.java b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxSender.java
index 15c957b..b0d16a7 100644
--- a/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxSender.java
+++ b/transport/dropbox-transport/src/main/java/org/apache/airavata/mft/transport/dropbox/DropboxSender.java
@@ -23,12 +23,14 @@
 import com.dropbox.core.v2.files.WriteMode;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecret;
+import org.apache.airavata.mft.credential.stubs.dropbox.DropboxSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResource;
 import org.apache.airavata.mft.resource.stubs.dropbox.resource.DropboxResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.*;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,8 +47,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.dropboxResource = resourceClient.dropbox().getDropboxResource(DropboxResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        DropboxSecret dropboxSecret = secretClient.getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        DropboxSecret dropboxSecret = secretClient.dropbox().getDropboxSecret(DropboxSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         DbxRequestConfig config = DbxRequestConfig.newBuilder("mftdropbox/v1").build();
         dbxClientV2 = new DbxClientV2(config, dropboxSecret.getAccessToken());
diff --git a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
index 9472dcc..1f3ba45 100644
--- a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
+++ b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPMetadataCollector.java
@@ -19,14 +19,14 @@
 
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecret;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResource;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.FTPSecret;
-import org.apache.airavata.mft.secret.service.FTPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.apache.commons.net.ftp.FTPClient;
 import org.apache.commons.net.ftp.FTPFile;
 import org.apache.commons.net.ftp.FTPReply;
@@ -66,8 +66,8 @@
         checkInitialized();
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         FTPResource ftpResource = resourceClient.ftp().getFTPResource(FTPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        FTPSecret ftpSecret = secretClient.getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        FTPSecret ftpSecret = secretClient.ftp().getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         ResourceMetadata resourceMetadata = new ResourceMetadata();
         FTPClient ftpClient = null;
@@ -103,8 +103,8 @@
 
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         FTPResource ftpResource = resourceClient.ftp().getFTPResource(FTPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        FTPSecret ftpSecret = secretClient.getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        FTPSecret ftpSecret = secretClient.ftp().getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         FTPClient ftpClient = null;
         try {
diff --git a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPReceiver.java b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPReceiver.java
index 8753029..6ced168 100644
--- a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPReceiver.java
+++ b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPReceiver.java
@@ -19,14 +19,14 @@
 
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecret;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResource;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.FTPSecret;
-import org.apache.airavata.mft.secret.service.FTPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.apache.commons.net.ftp.FTPClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,8 +49,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.resource = resourceClient.ftp().getFTPResource(FTPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        FTPSecret ftpSecret = secretClient.getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        FTPSecret ftpSecret = secretClient.ftp().getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         this.ftpClient = FTPTransportUtil.getFTPClient(this.resource, ftpSecret);
     }
diff --git a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPSender.java b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPSender.java
index 44f30f9..d9dbf06 100644
--- a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPSender.java
+++ b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPSender.java
@@ -19,14 +19,14 @@
 
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecret;
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResource;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.FTPSecret;
-import org.apache.airavata.mft.secret.service.FTPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.apache.commons.net.ftp.FTPClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,8 +49,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.resource = resourceClient.ftp().getFTPResource(FTPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        FTPSecret ftpSecret = secretClient.getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        FTPSecret ftpSecret = secretClient.ftp().getFTPSecret(FTPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         this.ftpClient = FTPTransportUtil.getFTPClient(this.resource, ftpSecret);
     }
diff --git a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPTransportUtil.java b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPTransportUtil.java
index 2cc8493..7a1e3c8 100644
--- a/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPTransportUtil.java
+++ b/transport/ftp-transport/src/main/java/org/apache/airavata/mft/transport/ftp/FTPTransportUtil.java
@@ -17,8 +17,8 @@
 
 package org.apache.airavata.mft.transport.ftp;
 
+import org.apache.airavata.mft.credential.stubs.ftp.FTPSecret;
 import org.apache.airavata.mft.resource.stubs.ftp.resource.FTPResource;
-import org.apache.airavata.mft.secret.service.FTPSecret;
 import org.apache.commons.net.ftp.FTPClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 c5220ae..d8d0a6b 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
@@ -27,14 +27,14 @@
 import com.google.api.services.storage.model.StorageObject;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecret;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResource;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.GCSSecret;
-import org.apache.airavata.mft.secret.service.GCSSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 import java.io.ByteArrayInputStream;
 import java.math.BigInteger;
@@ -71,8 +71,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         GCSResource gcsResource = resourceClient.gcs().getGCSResource(GCSResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        GCSSecret gcsSecret = secretClient.getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        GCSSecret gcsSecret = secretClient.gcs().getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
         JsonFactory jsonFactory = new JacksonFactory();
@@ -101,8 +101,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         GCSResource gcsResource = resourceClient.gcs().getGCSResource(GCSResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        GCSSecret gcsSecret = secretClient.getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        GCSSecret gcsSecret = secretClient.gcs().getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
         JsonFactory jsonFactory = new JacksonFactory();
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 f229d11..4261e40 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
@@ -26,14 +26,14 @@
 import com.google.api.services.storage.StorageScopes;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecret;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResource;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.GCSSecret;
-import org.apache.airavata.mft.secret.service.GCSSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,8 +56,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.gcsResource = resourceClient.gcs().getGCSResource(GCSResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        GCSSecret gcsSecret = secretClient.getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        GCSSecret gcsSecret = secretClient.gcs().getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
         HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
         JsonFactory jsonFactory = new JacksonFactory();
         String jsonString = gcsSecret.getCredentialsJson();
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 bc2a9f6..79768de 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
@@ -32,14 +32,14 @@
 import com.google.gson.JsonParser;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecret;
+import org.apache.airavata.mft.credential.stubs.gcs.GCSSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResource;
 import org.apache.airavata.mft.resource.stubs.gcs.resource.GCSResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.GCSSecret;
-import org.apache.airavata.mft.secret.service.GCSSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,8 +63,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.gcsResource = resourceClient.gcs().getGCSResource(GCSResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        GCSSecret gcsSecret = secretClient.getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        GCSSecret gcsSecret = secretClient.gcs().getGCSSecret(GCSSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
         JsonFactory jsonFactory = new JacksonFactory();
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 12d5af8..6203306 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
@@ -24,14 +24,14 @@
 import com.amazonaws.services.s3.model.ObjectMetadata;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.s3.S3Secret;
+import org.apache.airavata.mft.credential.stubs.s3.S3SecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3Resource;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3ResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.S3Secret;
-import org.apache.airavata.mft.secret.service.S3SecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 
 public class S3MetadataCollector implements MetadataCollector {
 
@@ -63,8 +63,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         S3Resource s3Resource = resourceClient.s3().getS3Resource(S3ResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        S3Secret s3Secret = secretClient.getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        S3Secret s3Secret = secretClient.s3().getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3Secret.getAccessKey(), s3Secret.getSecretKey());
 
@@ -89,8 +89,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         S3Resource s3Resource = resourceClient.s3().getS3Resource(S3ResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        S3Secret s3Secret = secretClient.getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        S3Secret s3Secret = secretClient.s3().getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3Secret.getAccessKey(), s3Secret.getSecretKey());
 
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 a36f3c5..0ac7191 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
@@ -25,14 +25,14 @@
 import com.amazonaws.services.s3.model.S3ObjectInputStream;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.s3.S3Secret;
+import org.apache.airavata.mft.credential.stubs.s3.S3SecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3Resource;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3ResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.S3Secret;
-import org.apache.airavata.mft.secret.service.S3SecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,8 +52,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.s3Resource = resourceClient.s3().getS3Resource(S3ResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        S3Secret s3Secret = secretClient.getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        S3Secret s3Secret = secretClient.s3().getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
         BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3Secret.getAccessKey(), s3Secret.getSecretKey());
 
         s3Client = AmazonS3ClientBuilder.standard()
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 5291d00..70b32e4 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
@@ -24,14 +24,14 @@
 import com.amazonaws.services.s3.model.ObjectMetadata;
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.s3.S3Secret;
+import org.apache.airavata.mft.credential.stubs.s3.S3SecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3Resource;
 import org.apache.airavata.mft.resource.stubs.s3.resource.S3ResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.S3Secret;
-import org.apache.airavata.mft.secret.service.S3SecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,8 +48,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.s3Resource = resourceClient.s3().getS3Resource(S3ResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        S3Secret s3Secret = secretClient.getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        S3Secret s3Secret = secretClient.s3().getS3Secret(S3SecretGetRequest.newBuilder().setSecretId(credentialToken).build());
         BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3Secret.getAccessKey(), s3Secret.getSecretKey());
 
         s3Client = AmazonS3ClientBuilder.standard()
diff --git a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
index 27f63b6..e167ed6 100644
--- a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
+++ b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPMetadataCollector.java
@@ -29,14 +29,14 @@
 import net.schmizz.sshj.userauth.password.Resource;
 import org.apache.airavata.mft.core.ResourceMetadata;
 import org.apache.airavata.mft.core.api.MetadataCollector;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecret;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResource;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.SCPSecret;
-import org.apache.airavata.mft.secret.service.SCPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,8 +77,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         SCPResource scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        SCPSecret scpSecret = secretClient.getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         try (SSHClient sshClient = getSSHClient(scpResource, scpSecret)) {
 
@@ -125,8 +125,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         SCPResource scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        SCPSecret scpSecret = secretClient.getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         try (SSHClient sshClient = getSSHClient(scpResource, scpSecret)) {
             logger.info("Checking the availability of file {}", scpResource.getResourcePath());
diff --git a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPReceiver.java b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPReceiver.java
index e0dabc8..e867a99 100644
--- a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPReceiver.java
+++ b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPReceiver.java
@@ -22,14 +22,14 @@
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.DoubleStreamingBuffer;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecret;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResource;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.SCPSecret;
-import org.apache.airavata.mft.secret.service.SCPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,8 +52,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        SCPSecret scpSecret = secretClient.getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         this.session = SCPTransportUtil.createSession(
                 scpResource.getScpStorage().getUser(),
diff --git a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPSender.java b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPSender.java
index 4eb55e7..27fcf89 100644
--- a/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPSender.java
+++ b/transport/scp-transport/src/main/java/org/apache/airavata/mft/transport/scp/SCPSender.java
@@ -23,14 +23,14 @@
 import org.apache.airavata.mft.core.ConnectorContext;
 import org.apache.airavata.mft.core.DoubleStreamingBuffer;
 import org.apache.airavata.mft.core.api.Connector;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecret;
+import org.apache.airavata.mft.credential.stubs.scp.SCPSecretGetRequest;
 import org.apache.airavata.mft.resource.client.ResourceServiceClient;
 import org.apache.airavata.mft.resource.client.ResourceServiceClientBuilder;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResource;
 import org.apache.airavata.mft.resource.stubs.scp.resource.SCPResourceGetRequest;
 import org.apache.airavata.mft.secret.client.SecretServiceClient;
-import org.apache.airavata.mft.secret.service.SCPSecret;
-import org.apache.airavata.mft.secret.service.SCPSecretGetRequest;
-import org.apache.airavata.mft.secret.service.SecretServiceGrpc;
+import org.apache.airavata.mft.secret.client.SecretServiceClientBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,8 +53,8 @@
         ResourceServiceClient resourceClient = ResourceServiceClientBuilder.buildClient(resourceServiceHost, resourceServicePort);
         this.scpResource = resourceClient.scp().getSCPResource(SCPResourceGetRequest.newBuilder().setResourceId(resourceId).build());
 
-        SecretServiceGrpc.SecretServiceBlockingStub secretClient = SecretServiceClient.buildClient(secretServiceHost, secretServicePort);
-        SCPSecret scpSecret = secretClient.getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
+        SecretServiceClient secretClient = SecretServiceClientBuilder.buildClient(secretServiceHost, secretServicePort);
+        SCPSecret scpSecret = secretClient.scp().getSCPSecret(SCPSecretGetRequest.newBuilder().setSecretId(credentialToken).build());
 
         logger.info("Creating a ssh session for {}@{}:{}",
                 scpResource.getScpStorage().getUser(), scpResource.getScpStorage().getHost(),