Merge pull request #228 from apache/staging

merge staging branch
diff --git a/custos-client-sdks/custos-java-clients/agent-management-client/src/main/java/org/apache/custos/agent/management/client/AgentManagementClient.java b/custos-client-sdks/custos-java-clients/agent-management-client/src/main/java/org/apache/custos/agent/management/client/AgentManagementClient.java
index e5a996d..31c9819 100644
--- a/custos-client-sdks/custos-java-clients/agent-management-client/src/main/java/org/apache/custos/agent/management/client/AgentManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/agent-management-client/src/main/java/org/apache/custos/agent/management/client/AgentManagementClient.java
@@ -7,6 +7,7 @@
 import org.apache.custos.agent.management.service.AgentManagementServiceGrpc;
 import org.apache.custos.agent.management.service.AgentRegistrationResponse;
 import org.apache.custos.agent.management.service.AgentSearchRequest;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.iam.service.*;
 
@@ -16,9 +17,9 @@
 /**
  * This class contains methods of Agent Management
  */
-public class AgentManagementClient {
+public class AgentManagementClient extends AbstractClient {
 
-    private ManagedChannel managedChannel;
+
 
     private AgentManagementServiceGrpc.AgentManagementServiceBlockingStub blockingStub;
 
@@ -26,13 +27,7 @@
     public AgentManagementClient(String serviceHost, int servicePort, String clientId,
                                  String clientSecret) throws IOException {
 
-        managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
-                .sslContext(GrpcSslContexts
-                        .forClient()
-                        .trustManager(ClientUtils.getServerCertificate(serviceHost, clientId, clientSecret)) // public key
-                        .build())
-                .build();
-
+        super(serviceHost,servicePort,clientId,clientSecret);
         blockingStub = AgentManagementServiceGrpc.newBlockingStub(managedChannel);
         blockingStub = MetadataUtils.attachHeaders(blockingStub, ClientUtils.getAuthorizationHeader(clientId, clientSecret));
     }
diff --git a/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/AbstractClient.java b/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/AbstractClient.java
new file mode 100644
index 0000000..5c55b07
--- /dev/null
+++ b/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/AbstractClient.java
@@ -0,0 +1,54 @@
+/*
+ * 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.custos.clients.core;
+
+import io.grpc.ManagedChannel;
+import io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.NettyChannelBuilder;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * This client will work as an Abstract client for all Java clients
+ */
+public class AbstractClient implements Closeable {
+
+    public ManagedChannel managedChannel;
+
+    public AbstractClient(String serviceHost, int servicePort, String clientId,
+                          String clientSecret) throws IOException {
+        managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
+                .sslContext(GrpcSslContexts
+                        .forClient()
+                        .trustManager(ClientUtils.getServerCertificate(serviceHost, clientId, clientSecret)) // public key
+                        .build())
+                .build();
+    }
+
+    @Override
+    public void close() throws IOException {
+        managedChannel.shutdown();
+    }
+
+    public boolean isShutdown() {
+        return managedChannel.isShutdown();
+    }
+}
diff --git a/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/ClientUtils.java b/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/ClientUtils.java
index 2bd9c6a..afcccf5 100644
--- a/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/ClientUtils.java
+++ b/custos-client-sdks/custos-java-clients/custos-clients-core/src/main/java/org/apache/custos/clients/core/ClientUtils.java
@@ -78,6 +78,13 @@
         return header;
     }
 
+    public static Metadata getAgentEnablingHeader() {
+        Metadata header = new Metadata();
+        Metadata.Key<String> key = Metadata.Key.of(Constants.AUTHENTICATE_AGENT, Metadata.ASCII_STRING_MARSHALLER);
+        header.put(key, "true");
+        return header;
+    }
+
     /**
      * Provides file object
      *
diff --git a/custos-client-sdks/custos-java-clients/group-management-client/src/main/java/org/apache/custos/group/management/client/GroupManagementClient.java b/custos-client-sdks/custos-java-clients/group-management-client/src/main/java/org/apache/custos/group/management/client/GroupManagementClient.java
index eaa0ca9..21fcddf 100644
--- a/custos-client-sdks/custos-java-clients/group-management-client/src/main/java/org/apache/custos/group/management/client/GroupManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/group-management-client/src/main/java/org/apache/custos/group/management/client/GroupManagementClient.java
@@ -4,6 +4,7 @@
 import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.group.management.service.GroupManagementServiceGrpc;
 import org.apache.custos.iam.service.GroupRequest;
@@ -16,16 +17,14 @@
 /**
  * This contains group management related functions
  */
-public class GroupManagementClient {
-
-    private ManagedChannel managedChannel;
+public class GroupManagementClient extends AbstractClient {
 
     private GroupManagementServiceGrpc.GroupManagementServiceBlockingStub blockingStub;
 
 
     public GroupManagementClient(String serviceHost, int servicePort, String clientId,
                                  String clientSecret) throws IOException {
-
+        super(serviceHost,servicePort,clientId,clientSecret);
         managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
                 .sslContext(GrpcSslContexts
                         .forClient()
@@ -45,14 +44,14 @@
      * @param groupRepresentation
      * @return
      */
-    public GroupsResponse createGroup(String clientId, GroupRepresentation[] groupRepresentation) {
+    public GroupsResponse createKeycloakGroup(String clientId, GroupRepresentation[] groupRepresentation) {
 
         GroupsRequest request = GroupsRequest
                 .newBuilder()
                 .addAllGroups(Arrays.asList(groupRepresentation))
                 .setClientId(clientId)
                 .build();
-        return blockingStub.createGroups(request);
+        return blockingStub.createKeycloakGroups(request);
 
     }
 
@@ -64,14 +63,14 @@
      * @param groupRepresentation
      * @return
      */
-    public GroupRepresentation updateGroup(String clientId, GroupRepresentation groupRepresentation) {
+    public GroupRepresentation updateKeycloakGroup(String clientId, GroupRepresentation groupRepresentation) {
 
         GroupRequest request = GroupRequest
                 .newBuilder()
                 .setGroup(groupRepresentation)
                 .setClientId(clientId)
                 .build();
-        return blockingStub.updateGroup(request);
+        return blockingStub.updateKeycloakGroup(request);
     }
 
     /**
@@ -81,14 +80,14 @@
      * @param groupRepresentation
      * @return
      */
-    public OperationStatus deleteGroup(String clientId, GroupRepresentation groupRepresentation) {
+    public OperationStatus deleteKeycloakGroup(String clientId, GroupRepresentation groupRepresentation) {
 
         GroupRequest request = GroupRequest
                 .newBuilder()
                 .setGroup(groupRepresentation)
                 .setClientId(clientId)
                 .build();
-        return blockingStub.deleteGroup(request);
+        return blockingStub.deleteKeycloakGroup(request);
     }
 
 
@@ -100,7 +99,7 @@
      * @param groupId
      * @return
      */
-    public GroupRepresentation findGroup(String clientId, String groupName, String groupId) {
+    public GroupRepresentation findKeycloakGroup(String clientId, String groupName, String groupId) {
 
         GroupRepresentation groupRepresentation =
                 GroupRepresentation.newBuilder().build();
@@ -117,6 +116,138 @@
                 .setGroup(groupRepresentation)
                 .setClientId(clientId)
                 .build();
+        return blockingStub.findKeycloakGroup(request);
+    }
+
+
+    /**
+     * Get all groups
+     *
+     * @param clientId
+     * @return
+     */
+    public GroupsResponse getAllKeycloakGroups(String clientId) {
+        GroupRequest request = GroupRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .build();
+        return blockingStub.getAllKeycloakGroups(request);
+    }
+
+
+    /**
+     * Add user to group
+     *
+     * @param clientId
+     * @param username
+     * @param groupId
+     * @return
+     */
+    public OperationStatus addUserToKeycloakGroup(String clientId, String username, String groupId, String type) {
+        UserGroupMappingRequest request = UserGroupMappingRequest
+                .newBuilder()
+                .setUsername(username)
+                .setClientId(clientId)
+                .setMembershipType(type)
+                .setGroupId(groupId).build();
+        return blockingStub.addUserToKeycloakGroup(request);
+
+    }
+
+    /**
+     * Remove user from group
+     *
+     * @param clientId
+     * @param username
+     * @param groupId
+     * @return
+     */
+    public OperationStatus removeUserFromKeycloakGroup(String clientId, String username, String groupId) {
+
+        UserGroupMappingRequest request = UserGroupMappingRequest
+                .newBuilder()
+                .setUsername(username)
+                .setClientId(clientId)
+                .setGroupId(groupId).build();
+        return blockingStub.removeUserFromKeycloakGroup(request);
+
+    }
+
+
+    public Group createGroup(String clientId, Group group) {
+
+        org.apache.custos.user.profile.service.GroupRequest request =
+                org.apache.custos.user.profile.service.GroupRequest
+                        .newBuilder()
+                        .setGroup(group)
+                        .setClientId(clientId)
+                        .build();
+        return blockingStub.createGroup(request);
+
+    }
+
+
+    /**
+     * update group
+     *
+     * @param clientId
+     * @return
+     */
+    public Group updateGroup(String clientId, Group group) {
+
+        org.apache.custos.user.profile.service.GroupRequest request =
+                org.apache.custos.user.profile.service.GroupRequest
+                        .newBuilder()
+                        .setGroup(group)
+                        .setClientId(clientId)
+                        .build();
+        return blockingStub.updateGroup(request);
+    }
+
+    /**
+     * delete group
+     *
+     * @param clientId
+     * @param groupRepresentation
+     * @return
+     */
+    public Status deleteGroup(String clientId, Group group) {
+
+        org.apache.custos.user.profile.service.GroupRequest request =
+                org.apache.custos.user.profile.service.GroupRequest
+                        .newBuilder()
+                        .setGroup(group)
+                        .setClientId(clientId)
+                        .build();
+        return blockingStub.deleteGroup(request);
+    }
+
+
+    /**
+     * find group
+     *
+     * @param clientId
+     * @param groupName
+     * @param groupId
+     * @return
+     */
+    public Group findGroup(String clientId, String groupName, String groupId) {
+
+        Group group =
+                Group.newBuilder().build();
+        if (groupName != null) {
+            group = group.toBuilder().setName(groupName).build();
+        }
+
+        if (groupId != null) {
+            group = group.toBuilder().setId(groupId).build();
+        }
+
+        org.apache.custos.user.profile.service.GroupRequest request = org.apache.custos.user.profile.service.GroupRequest
+                .newBuilder()
+                .setGroup(group)
+                .setClientId(clientId)
+                .build();
         return blockingStub.findGroup(request);
     }
 
@@ -127,8 +258,8 @@
      * @param clientId
      * @return
      */
-    public GroupsResponse getAllGroups(String clientId) {
-        GroupRequest request = GroupRequest
+    public GetAllGroupsResponse getAllGroups(String clientId) {
+        org.apache.custos.user.profile.service.GroupRequest request = org.apache.custos.user.profile.service.GroupRequest
                 .newBuilder()
                 .setClientId(clientId)
                 .build();
@@ -144,12 +275,12 @@
      * @param groupId
      * @return
      */
-    public OperationStatus addUserToGroup(String clientId, String username, String groupId, String type) {
-        UserGroupMappingRequest request = UserGroupMappingRequest
+    public Status addUserToGroup(String clientId, String username, String groupId, String type) {
+        GroupMembership request = GroupMembership
                 .newBuilder()
                 .setUsername(username)
                 .setClientId(clientId)
-                .setMembershipType(type)
+                .setType(type)
                 .setGroupId(groupId).build();
         return blockingStub.addUserToGroup(request);
 
@@ -163,9 +294,9 @@
      * @param groupId
      * @return
      */
-    public OperationStatus removeUserFromGroup(String clientId, String username, String groupId) {
+    public Status removeUserFromGroup(String clientId, String username, String groupId) {
 
-        UserGroupMappingRequest request = UserGroupMappingRequest
+        GroupMembership request = GroupMembership
                 .newBuilder()
                 .setUsername(username)
                 .setClientId(clientId)
@@ -175,7 +306,7 @@
     }
 
 
-    public OperationStatus addChildGroupToParentGroup(String clientId, String parentId, String childId) {
+    public Status addChildGroupToParentGroup(String clientId, String parentId, String childId) {
         GroupToGroupMembership membership = GroupToGroupMembership
                 .newBuilder()
                 .setChildId(childId)
@@ -187,7 +318,7 @@
     }
 
 
-    public OperationStatus removeChildGroupFromParentGroup(String clientId, String parentId, String childId) {
+    public Status removeChildGroupFromParentGroup(String clientId, String parentId, String childId) {
         GroupToGroupMembership membership = GroupToGroupMembership
                 .newBuilder()
                 .setChildId(childId)
@@ -265,7 +396,7 @@
     }
 
 
-    public OperationStatus changeUserMembershipType(String clientId, String username, String groupId, String type) {
+    public Status changeUserMembershipType(String clientId, String username, String groupId, String type) {
 
         GroupMembership membership = GroupMembership
                 .newBuilder()
@@ -279,7 +410,7 @@
     }
 
 
-    public OperationStatus hasAccess(String clientId, String groupId, String userId, String type) {
+    public Status hasAccess(String clientId, String groupId, String userId, String type) {
         GroupMembership membership = GroupMembership
                 .newBuilder()
                 .setUsername(userId)
diff --git a/custos-client-sdks/custos-java-clients/identity-management-client/src/main/java/org/apache/custos/identity/management/client/IdentityManagementClient.java b/custos-client-sdks/custos-java-clients/identity-management-client/src/main/java/org/apache/custos/identity/management/client/IdentityManagementClient.java
index c8fe1b9..7878e6e 100644
--- a/custos-client-sdks/custos-java-clients/identity-management-client/src/main/java/org/apache/custos/identity/management/client/IdentityManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/identity-management-client/src/main/java/org/apache/custos/identity/management/client/IdentityManagementClient.java
@@ -24,6 +24,7 @@
 import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.credential.store.service.Credentials;
 import org.apache.custos.identity.management.service.GetAgentTokenRequest;
@@ -31,15 +32,13 @@
 import org.apache.custos.identity.management.service.IdentityManagementServiceGrpc;
 import org.apache.custos.identity.service.*;
 
+import java.io.Closeable;
 import java.io.IOException;
 
 /**
  * Java client to connect with the Custos Identity Management Service
  */
-public class IdentityManagementClient {
-
-
-    private ManagedChannel managedChannel;
+public class IdentityManagementClient extends AbstractClient {
 
     private IdentityManagementServiceGrpc.IdentityManagementServiceBlockingStub blockingStub;
 
@@ -48,7 +47,7 @@
 
     public IdentityManagementClient(String serviceHost, int servicePort, String clientId,
                                     String clientSecret) throws IOException {
-
+        super(serviceHost,servicePort,clientId,clientSecret);
         managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
                 .sslContext(GrpcSslContexts
                         .forClient()
@@ -189,5 +188,30 @@
 
     }
 
+    public User getUser(String accessToken) {
+        AuthToken authToken = AuthToken.newBuilder()
+                .setAccessToken(accessToken)
+                .build();
+        return blockingStub.getUser(authToken);
 
+    }
+
+    public boolean isAuthenticated(String accessToken) {
+        try {
+            AuthToken authToken = AuthToken
+                    .newBuilder()
+                    .setAccessToken(accessToken)
+                    .build();
+            IsAuthenticatedResponse authenticatedResponse = blockingStub.isAuthenticated(authToken);
+            return authenticatedResponse.getAuthenticated();
+        } catch (Exception ex) {
+            return false;
+        }
+
+    }
+
+    @Override
+    public void close() throws IOException {
+        this.managedChannel.shutdown();
+    }
 }
diff --git a/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementAgentClient.java b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementAgentClient.java
new file mode 100644
index 0000000..e088168
--- /dev/null
+++ b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementAgentClient.java
@@ -0,0 +1,169 @@
+/*
+ * 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.custos.resource.secret.management.client;
+
+import com.google.protobuf.Struct;
+import io.grpc.ManagedChannel;
+import io.grpc.Metadata;
+import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.ClientUtils;
+import org.apache.custos.resource.secret.management.service.ResourceSecretManagementServiceGrpc;
+import org.apache.custos.resource.secret.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Client for agents or service accounts to manage secrets of Custos
+ */
+public class ResourceSecretManagementAgentClient extends ResourceSecretManagementClient  {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ResourceSecretManagementAgentClient.class);
+
+
+    ManagedChannel managedChannel = null;
+
+    public ResourceSecretManagementAgentClient(String serviceHost, int servicePort,
+                                               String clientId, String clientSecret) throws IOException {
+
+        super(serviceHost, servicePort, clientId, clientSecret);
+        managedChannel = getManagedChannel();
+    }
+
+    public SecretMetadata getSecret(String userToken, String agentToken,
+                                    ResourceOwnerType ownerType, ResourceType resourceType) {
+
+        return super.getSecret(ownerType, resourceType, attachedHeaders(userToken, agentToken));
+    }
+
+
+    public Struct getJWKS(String userToken, String agentToken) {
+        attachedHeaders(userToken, agentToken);
+        return super.getJWKS();
+    }
+
+    public SecretMetadata getResourceCredentialSummary(String userToken, String agentToken, String clientId, String token) {
+        return super.getResourceCredentialSummary(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+
+    public ResourceCredentialSummaries getAllResourceCredentialSummaries(String userToken, String agentToken,
+                                                                         String clientId, List<String> accessibleTokens) {
+        return super.getAllResourceCredentialSummaries(clientId, accessibleTokens, attachedHeaders(userToken, agentToken));
+    }
+
+    public AddResourceCredentialResponse generateSSHCredential(String userToken, String agentToken,
+                                                               String clientId, String description, String ownerId) {
+        return super.generateSSHCredential(clientId, description, ownerId, attachedHeaders(userToken, agentToken));
+    }
+
+    public AddResourceCredentialResponse addSSHCredential(String userToken, String agentToken, String csToken,
+                                                          String passphrase, String privateKey, String publicKey,
+                                                          String clientId, String description, String ownerId) {
+        return super.addSSHCredential(csToken, passphrase, privateKey,
+                publicKey, clientId, description, ownerId, attachedHeaders(userToken, agentToken));
+    }
+
+    public AddResourceCredentialResponse addPasswordCredential(String userToken, String agentToken,
+                                                               String clientId, String description,
+                                                               String ownerId,  String userId,String password) {
+        return super.addPasswordCredential(clientId,
+                description, ownerId, userId, password,attachedHeaders(userToken, agentToken));
+    }
+
+
+    public AddResourceCredentialResponse addPasswordCredential(String userToken, String agentToken,
+                                                               String token, String clientId, String description,
+                                                               String ownerId,  String userId, String password) {
+        return super.addPasswordCredential(token, clientId,
+                description, ownerId, userId,password, attachedHeaders(userToken, agentToken));
+    }
+
+    public SSHCredential getSSHCredential(String userToken, String agentToken, String csToken, boolean useShamirSecret) {
+        return super.getSSHCredential("",
+                csToken, useShamirSecret, attachedHeaders(userToken, agentToken));
+    }
+
+
+    public PasswordCredential getPasswordCredential(String userToken, String agentToken,
+                                                    String clientId, String token) {
+        return super.getPasswordCredential(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+    public ResourceCredentialOperationStatus deleteSSHCredential(String userToken, String agentToken,
+                                                                 String clientId, String token) {
+        return super.deleteSSHCredential(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+    public ResourceCredentialOperationStatus deletePWDCredential(String userToken, String agentToken,
+                                                                 String clientId, String token) {
+        return super.deletePWDCredential(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+    public AddResourceCredentialResponse addCredentialMap(String userToken, String agentToken,
+                                                              String clientId, String description, String ownerId,
+                                                              String token, Map<String, String> credentialMap) {
+        return super.addCredentialMap(clientId, description, ownerId,
+                token, credentialMap, attachedHeaders(userToken, agentToken));
+    }
+
+    public CredentialMap getCredentialMap(String userToken, String agentToken, String clientId, String token) {
+        return super.getCredentialMap(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+    public ResourceCredentialOperationStatus deleteCredentialMap(String userToken,
+                                                                 String agentToken, String clientId, String token) {
+        return super.deleteCredentialMap(clientId, token, attachedHeaders(userToken, agentToken));
+    }
+
+
+    public ResourceCredentialOperationStatus updateCredentialMap(String userToken, String agentToken,
+                                                                 String clientId, String description, String ownerId,
+                                                                 String token, Map<String, String> credentialMap) {
+        return super.updateCredentialMap(clientId, description, ownerId, token, credentialMap,
+                attachedHeaders(userToken, agentToken));
+    }
+
+
+    private ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceBlockingStub
+    attachedHeaders(String userToken, String agentToken) {
+        ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceBlockingStub
+                blockingStub = ResourceSecretManagementServiceGrpc.newBlockingStub(managedChannel);
+
+        Metadata authHeader = ClientUtils.getAuthorizationHeader(agentToken);
+        Metadata tokenHeader = ClientUtils.getUserTokenHeader(userToken);
+        Metadata agentEnablingHeaders = ClientUtils.getAgentEnablingHeader();
+        blockingStub = MetadataUtils.attachHeaders(blockingStub, authHeader);
+        blockingStub = MetadataUtils.attachHeaders(blockingStub, tokenHeader);
+        blockingStub = MetadataUtils.attachHeaders(blockingStub, agentEnablingHeaders);
+        return blockingStub;
+    }
+
+    @Override
+    public void close() throws IOException {
+        super.close();
+        if (this.managedChannel != null) {
+            this.managedChannel.shutdown();
+        }
+    }
+}
diff --git a/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
index a43639a..c676224 100644
--- a/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
@@ -19,39 +19,36 @@
 
 package org.apache.custos.resource.secret.management.client;
 
+import com.google.protobuf.ByteString;
 import com.google.protobuf.Struct;
 import io.grpc.ManagedChannel;
-import io.grpc.netty.GrpcSslContexts;
-import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.identity.service.GetJWKSRequest;
+import org.apache.custos.integration.core.utils.ShamirSecretHandler;
 import org.apache.custos.resource.secret.management.service.ResourceSecretManagementServiceGrpc;
 import org.apache.custos.resource.secret.service.*;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * This class is responsible for managing resource secrets
  */
-public class ResourceSecretManagementClient {
+public class ResourceSecretManagementClient extends AbstractClient {
 
-    private ManagedChannel managedChannel;
 
     private ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceBlockingStub blockingStub;
 
+    private int defaultNumOfShares = 5;
+    private int defaultThreshold = 3;
+
 
     public ResourceSecretManagementClient(String serviceHost, int servicePort, String clientId,
                                           String clientSecret) throws IOException {
-
-        managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
-                .sslContext(GrpcSslContexts
-                        .forClient()
-                        .trustManager(ClientUtils.getServerCertificate(serviceHost, clientId, clientSecret)) // public key
-                        .build())
-                .build();
-
+        super(serviceHost, servicePort, clientId, clientSecret);
         blockingStub = ResourceSecretManagementServiceGrpc.newBlockingStub(managedChannel);
 
         blockingStub = MetadataUtils.attachHeaders(blockingStub,
@@ -84,7 +81,8 @@
      *
      * @return
      */
-    public Struct getJWKS() {
+    public Struct getJWKS(ResourceSecretManagementServiceGrpc.
+                                  ResourceSecretManagementServiceBlockingStub blockingStub) {
         GetJWKSRequest request = GetJWKSRequest.newBuilder().build();
         return blockingStub.getJWKS(request);
     }
@@ -151,6 +149,27 @@
 
     }
 
+    public AddResourceCredentialResponse addSSHCredential(String token, String passphrase, String privateKey,
+                                                          String publicKey, String clientId, String description, String ownerId) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        SSHCredential sshCredential = SSHCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassphrase(passphrase)
+                .setPrivateKey(privateKey)
+                .setPublicKey(publicKey).build();
+
+        return blockingStub.addSSHCredential(sshCredential);
+
+    }
+
+
     /**
      * Save password credentials
      *
@@ -160,7 +179,7 @@
      * @param password
      * @return AddResourceCredentialResponse
      */
-    public AddResourceCredentialResponse addPasswordCredential(String clientId, String description, String ownerId, String password) {
+    public AddResourceCredentialResponse addPasswordCredential(String clientId, String description, String ownerId, String userId, String password) {
         SecretMetadata metadata = SecretMetadata.newBuilder()
                 .setClientId(clientId)
                 .setDescription(description)
@@ -173,6 +192,34 @@
                 .setPassword(password)
                 .build();
 
+        if (userId != null) {
+            sshCredential = sshCredential.toBuilder().setUserId(userId).build();
+        }
+
+        return blockingStub.addPasswordCredential(sshCredential);
+
+    }
+
+    public AddResourceCredentialResponse addPasswordCredential(String token, String clientId,
+                                                               String description, String ownerId, String userId, String password) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token)
+                .build();
+
+
+        PasswordCredential sshCredential = PasswordCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassword(password)
+                .build();
+
+        if (userId != null) {
+            sshCredential = sshCredential.toBuilder().setUserId(userId).build();
+        }
+
         return blockingStub.addPasswordCredential(sshCredential);
 
     }
@@ -185,15 +232,29 @@
      * @param token
      * @return SSHCredential
      */
-    public SSHCredential getSSHCredential(String clientId, String token) {
+    public SSHCredential getSSHCredential(String clientId, String token, boolean useShamirSecret) {
+
         GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
                 .newBuilder()
                 .setClientId(clientId)
                 .setToken(token)
                 .build();
+        if (useShamirSecret) {
+            tokenRequest = tokenRequest.toBuilder()
+                    .setUseShamirsSecretSharingWithEncryption(true)
+                    .setNumOfShares(defaultNumOfShares)
+                    .setThreshold(defaultThreshold)
+                    .build();
+        }
 
+        SSHCredential sshCredential = blockingStub.getSSHCredential(tokenRequest);
 
-        return blockingStub.getSSHCredential(tokenRequest);
+        if (useShamirSecret) {
+            List<ByteString> shares = sshCredential.getPrivateKeySharesList();
+            String secret = ShamirSecretHandler.generateSecret(shares, defaultNumOfShares, defaultThreshold);
+            sshCredential = sshCredential.toBuilder().setPrivateKey(secret).build();
+        }
+        return sshCredential;
 
     }
 
@@ -253,4 +314,438 @@
     }
 
 
+    /**
+     * provides resource secret for given owner type and resource type
+     *
+     * @param ownerType
+     * @param resourceType
+     * @return
+     */
+    public SecretMetadata getSecret(ResourceOwnerType ownerType, ResourceType resourceType, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+
+        SecretMetadata metadata = SecretMetadata
+                .newBuilder()
+                .setOwnerType(ownerType)
+                .setResourceType(resourceType)
+                .build();
+
+        GetSecretRequest request = GetSecretRequest.newBuilder().setMetadata(metadata).build();
+        return blockingStub.getSecret(request);
+    }
+
+    /**
+     * provides JWKS keys for calling tenant
+     *
+     * @return
+     */
+    public Struct getJWKS() {
+        GetJWKSRequest request = GetJWKSRequest.newBuilder().build();
+        return blockingStub.getJWKS(request);
+    }
+
+
+    /**
+     * Provides metadata object of credentials
+     *
+     * @param clientId
+     * @param token
+     * @return SecretMetadata
+     */
+    public SecretMetadata getResourceCredentialSummary(String clientId, String token, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+
+        GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .setToken(token)
+                .build();
+
+        return blockingStub.getResourceCredentialSummary(tokenRequest);
+
+    }
+
+    /**
+     * Provides metadata array of credentials metadata
+     *
+     * @param clientId
+     * @param accessibleTokens
+     * @return SecretMetadata[]
+     */
+    public ResourceCredentialSummaries getAllResourceCredentialSummaries(String clientId, List<String> accessibleTokens, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+        GetResourceCredentialSummariesRequest summariesRequest = GetResourceCredentialSummariesRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .addAllAccessibleTokens(accessibleTokens).build();
+
+
+        return blockingStub.getAllResourceCredentialSummaries(summariesRequest);
+
+    }
+
+    /**
+     * Generate SSH credentials
+     *
+     * @param clientId
+     * @param description
+     * @param ownerId
+     * @return AddResourceCredentialResponse
+     */
+    public AddResourceCredentialResponse generateSSHCredential(String clientId, String description, String ownerId, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId).build();
+
+
+        SSHCredential sshCredential = SSHCredential
+                .newBuilder()
+                .setMetadata(metadata).build();
+
+        return blockingStub.addSSHCredential(sshCredential);
+
+    }
+
+    public AddResourceCredentialResponse addSSHCredential(String token, String passphrase, String privateKey,
+                                                          String publicKey, String clientId, String description, String ownerId,
+                                                          ResourceSecretManagementServiceGrpc.
+                                                                  ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        SSHCredential sshCredential = SSHCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassphrase(passphrase)
+                .setPrivateKey(privateKey)
+                .setPublicKey(publicKey).build();
+
+        return blockingStub.addSSHCredential(sshCredential);
+
+    }
+
+
+    /**
+     * Save password credentials
+     *
+     * @param clientId
+     * @param description
+     * @param ownerId
+     * @param password
+     * @return AddResourceCredentialResponse
+     */
+    public AddResourceCredentialResponse addPasswordCredential(String clientId, String description,
+                                                               String ownerId, String userId, String password,
+                                                               ResourceSecretManagementServiceGrpc.
+                                                                       ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId).build();
+
+        PasswordCredential sshCredential = PasswordCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassword(password)
+                .build();
+        if (userId != null) {
+            sshCredential = sshCredential.toBuilder().setUserId(userId).build();
+        }
+
+        return blockingStub.addPasswordCredential(sshCredential);
+    }
+
+
+    public AddResourceCredentialResponse addPasswordCredential(String token, String clientId,
+                                                               String description, String ownerId,
+                                                               String userId, String password,
+                                                               ResourceSecretManagementServiceGrpc.
+                                                                       ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token)
+                .build();
+
+        PasswordCredential sshCredential = PasswordCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassword(password)
+                .build();
+
+        if (userId != null) {
+            sshCredential = sshCredential.toBuilder().setUserId(userId).build();
+        }
+
+        return blockingStub.addPasswordCredential(sshCredential);
+
+    }
+
+
+    /**
+     * Provides SSHCredential of given token
+     *
+     * @param clientId
+     * @param token
+     * @return SSHCredential
+     */
+    public SSHCredential getSSHCredential(String clientId, String token,
+                                          boolean useShamirSecret,
+                                          ResourceSecretManagementServiceGrpc.
+                                                  ResourceSecretManagementServiceBlockingStub blockingStub) {
+
+        GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .setToken(token)
+                .build();
+        if (useShamirSecret) {
+            tokenRequest = tokenRequest.toBuilder()
+                    .setUseShamirsSecretSharingWithEncryption(true)
+                    .setNumOfShares(defaultNumOfShares)
+                    .setThreshold(defaultThreshold)
+                    .build();
+        }
+
+        SSHCredential sshCredential = blockingStub.getSSHCredential(tokenRequest);
+
+        if (useShamirSecret) {
+            List<ByteString> shares = sshCredential.getPrivateKeySharesList();
+            String secret = ShamirSecretHandler.generateSecret(shares, defaultNumOfShares, defaultThreshold);
+            sshCredential = sshCredential.toBuilder().setPrivateKey(secret).build();
+        }
+        return sshCredential;
+
+
+    }
+
+    /**
+     * provides PasswordCredential of given token
+     *
+     * @param clientId
+     * @param token
+     * @return PasswordCredential
+     */
+    public PasswordCredential getPasswordCredential(String clientId, String token, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+
+        GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .setToken(token)
+                .build();
+
+
+        return blockingStub.getPasswordCredential(tokenRequest);
+    }
+
+
+    /**
+     * Delete SSHCredential of given token
+     *
+     * @param clientId
+     * @param token
+     * @return ResourceCredentialOperationStatus
+     */
+    public ResourceCredentialOperationStatus deleteSSHCredential(String clientId, String token,
+                                                                 ResourceSecretManagementServiceGrpc.
+                                                                         ResourceSecretManagementServiceBlockingStub blockingStub) {
+        GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .setToken(token)
+                .build();
+
+        return blockingStub.deleteSSHCredential(tokenRequest);
+    }
+
+    public AddResourceCredentialResponse addCredentialMap(String clientId, String description, String ownerId,
+                                                          String token, Map<String, String> credentialMap,
+                                                          ResourceSecretManagementServiceGrpc.
+                                                                  ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        CredentialMap creMap = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .putAllCredentialMap(credentialMap)
+                .build();
+
+        return blockingStub.addCredentialMap(creMap);
+    }
+
+    public CredentialMap getCredentialMap(String clientId, String token,
+                                          ResourceSecretManagementServiceGrpc.
+                                                  ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setToken(token).
+                        build();
+
+        CredentialMap tokenRequest = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .build();
+
+        return blockingStub.getCredentialMap(tokenRequest);
+    }
+
+    public ResourceCredentialOperationStatus deleteCredentialMap(String clientId, String token,
+                                                                 ResourceSecretManagementServiceGrpc.
+                                                                         ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setToken(token).
+                        build();
+
+        CredentialMap tokenRequest = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .build();
+
+        return blockingStub.deleteCredentialMap(tokenRequest);
+    }
+
+
+    public ResourceCredentialOperationStatus updateCredentialMap(String clientId, String description, String ownerId,
+                                                                 String token, Map<String, String> credentialMap,
+                                                                 ResourceSecretManagementServiceGrpc.
+                                                                         ResourceSecretManagementServiceBlockingStub blockingStub) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        CredentialMap creMap = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .putAllCredentialMap(credentialMap)
+                .build();
+
+        return blockingStub.updateCredentialMap(creMap);
+    }
+
+
+    public AddResourceCredentialResponse addCredentialMap(String clientId, String description, String ownerId,
+                                                          String token, Map<String, String> credentialMap) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        CredentialMap creMap = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .putAllCredentialMap(credentialMap)
+                .build();
+
+        return blockingStub.addCredentialMap(creMap);
+    }
+
+    public CredentialMap getCredentialMap(String clientId, String token) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setToken(token).
+                        build();
+
+        CredentialMap tokenRequest = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .build();
+
+        return blockingStub.getCredentialMap(tokenRequest);
+    }
+
+    public ResourceCredentialOperationStatus deleteCredentialMap(String clientId, String token) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setToken(token).
+                        build();
+
+        CredentialMap tokenRequest = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .build();
+
+        return blockingStub.deleteCredentialMap(tokenRequest);
+    }
+
+
+    public ResourceCredentialOperationStatus updateCredentialMap(String clientId, String description, String ownerId,
+                                                                 String token, Map<String, String> credentialMap) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        CredentialMap creMap = CredentialMap
+                .newBuilder()
+                .setMetadata(metadata)
+                .putAllCredentialMap(credentialMap)
+                .build();
+
+        return blockingStub.updateCredentialMap(creMap);
+    }
+
+
+    /**
+     * Delete Password Credential of given token
+     *
+     * @param clientId
+     * @param token
+     * @return ResourceCredentialOperationStatus
+     */
+    public ResourceCredentialOperationStatus deletePWDCredential(String clientId, String token, ResourceSecretManagementServiceGrpc.
+            ResourceSecretManagementServiceBlockingStub blockingStub) {
+        GetResourceCredentialByTokenRequest tokenRequest = GetResourceCredentialByTokenRequest
+                .newBuilder()
+                .setClientId(clientId)
+                .setToken(token)
+                .build();
+
+        return blockingStub.deletePWDCredential(tokenRequest);
+    }
+
+    ManagedChannel getManagedChannel() {
+        return managedChannel;
+    }
+
+    void setManagedChannel(ManagedChannel managedChannel) {
+        this.managedChannel = managedChannel;
+    }
+
+    public ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceBlockingStub getBlockingStub() {
+        return blockingStub;
+    }
+
+    public void setBlockingStub(ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceBlockingStub blockingStub) {
+        this.blockingStub = blockingStub;
+    }
+
+
+    @Override
+    public void close() throws IOException {
+        if (this.managedChannel != null) {
+            this.managedChannel.shutdown();
+        }
+    }
 }
diff --git a/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java b/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
index 0d81812..7e51e73 100644
--- a/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/sharing-management-client/src/main/java/org/apache/custos/sharing/management/client/SharingManagementClient.java
@@ -19,10 +19,8 @@
 
 package org.apache.custos.sharing.management.client;
 
-import io.grpc.ManagedChannel;
-import io.grpc.netty.GrpcSslContexts;
-import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.sharing.management.service.SharingManagementServiceGrpc;
 import org.apache.custos.sharing.service.*;
@@ -32,22 +30,15 @@
 /**
  * Java client to connect with SharingManagementClient
  */
-public class SharingManagementClient {
+public class SharingManagementClient extends AbstractClient {
 
-    private ManagedChannel managedChannel;
 
     private SharingManagementServiceGrpc.SharingManagementServiceBlockingStub blockingStub;
 
 
     public SharingManagementClient(String serviceHost, int servicePort, String clientId,
                                    String clientSecret) throws IOException {
-        managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
-                .sslContext(GrpcSslContexts
-                        .forClient()
-                        .trustManager(ClientUtils.getServerCertificate(serviceHost, clientId, clientSecret)) // public key
-                        .build())
-                .build();
-
+        super(serviceHost, servicePort, clientId, clientSecret);
         blockingStub = SharingManagementServiceGrpc.newBlockingStub(managedChannel);
         blockingStub = MetadataUtils.attachHeaders(blockingStub, ClientUtils.getAuthorizationHeader(clientId, clientSecret));
     }
@@ -269,5 +260,13 @@
         return blockingStub.userHasAccess(request);
     }
 
+    public GetAllDirectSharingsResponse getAllDirectSharings(String clientId, SharingRequest request) {
+        request = request.toBuilder().setClientId(clientId).build();
+        return blockingStub.getAllDirectSharings(request);
+    }
+
+    public boolean isShutdown() {
+        return managedChannel.isShutdown();
+    }
 
 }
diff --git a/custos-client-sdks/custos-java-clients/tenant-management-client/src/main/java/org/apache/custos/tenant/manamgement/client/TenantManagementClient.java b/custos-client-sdks/custos-java-clients/tenant-management-client/src/main/java/org/apache/custos/tenant/manamgement/client/TenantManagementClient.java
index 613a87d..3837406 100644
--- a/custos-client-sdks/custos-java-clients/tenant-management-client/src/main/java/org/apache/custos/tenant/manamgement/client/TenantManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/tenant-management-client/src/main/java/org/apache/custos/tenant/manamgement/client/TenantManagementClient.java
@@ -20,9 +20,11 @@
 package org.apache.custos.tenant.manamgement.client;
 
 import io.grpc.ManagedChannel;
+import io.grpc.Metadata;
 import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.iam.service.*;
 import org.apache.custos.tenant.management.service.DeleteTenantRequest;
@@ -31,15 +33,15 @@
 import org.apache.custos.tenant.management.service.*;
 import org.apache.custos.tenant.profile.service.*;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.util.Arrays;
 
 /**
  * This class contains tenant management operations
  */
-public class TenantManagementClient {
+public class TenantManagementClient extends AbstractClient {
 
-    private ManagedChannel managedChannel;
 
     private TenantManagementServiceGrpc.TenantManagementServiceBlockingStub blockingStub;
 
@@ -47,12 +49,7 @@
     public TenantManagementClient(String serviceHost, int servicePort, String clientId,
                                   String clientSecret) throws IOException {
 
-        managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
-                .sslContext(GrpcSslContexts
-                        .forClient()
-                        .trustManager(ClientUtils.getServerCertificate(serviceHost, clientId, clientSecret)) // public key
-                        .build())
-                .build();
+        super(serviceHost,servicePort,clientId,clientSecret);
 
         blockingStub = TenantManagementServiceGrpc.newBlockingStub(managedChannel);
 
@@ -127,7 +124,7 @@
      * @param comment
      * @return
      */
-    public GetTenantResponse updateTenant(String clientId, String client_name, String requester_email, String admin_frist_name,
+    public Tenant updateTenant(String usertoken, String clientId, String client_name, String requester_email, String admin_frist_name,
                                           String admin_last_name, String admin_email, String admin_username,
                                           String admin_password, String[] contacts, String[] redirect_uris,
                                           String client_uri, String scope, String domain, String logo_uri,
@@ -155,17 +152,17 @@
                 .setClientId(clientId)
                 .build();
 
-        return blockingStub.updateTenant(updateTenantRequest);
+        return attachedHeaders(usertoken).updateTenant(updateTenantRequest);
 
     }
 
 
-    public GetTenantResponse getTenant(String clientId) {
+    public Tenant getTenant(String userToken, String clientId) {
         GetTenantRequest tenantRequest = GetTenantRequest
                 .newBuilder()
                 .setClientId(clientId)
                 .build();
-        return blockingStub.getTenant(tenantRequest);
+        return attachedHeaders(userToken).getTenant(tenantRequest);
     }
 
 
@@ -173,9 +170,9 @@
      * delete tenant identified by clientId
      * @param clientId
      */
-    public void deleteTenant(String clientId) {
+    public void deleteTenant(String userToken, String clientId) {
         DeleteTenantRequest tenantRequest = DeleteTenantRequest.newBuilder().setClientId(clientId).build();
-        blockingStub.deleteTenant(tenantRequest);
+        attachedHeaders(userToken).deleteTenant(tenantRequest);
     }
 
 
@@ -251,5 +248,21 @@
         return blockingStub.getAllTenantsForUser(request);
     }
 
+    private TenantManagementServiceGrpc.TenantManagementServiceBlockingStub
+    attachedHeaders(String userToken) {
+        TenantManagementServiceGrpc.TenantManagementServiceBlockingStub
+                blockingStub = TenantManagementServiceGrpc.newBlockingStub(managedChannel);
 
+        Metadata tokenHeader = ClientUtils.getAuthorizationHeader(userToken);
+        blockingStub = MetadataUtils.attachHeaders(blockingStub, tokenHeader);
+        return blockingStub;
+    }
+
+
+    @Override
+    public void close() throws IOException {
+        if (this.managedChannel != null) {
+            this.managedChannel.shutdown();
+        }
+    }
 }
diff --git a/custos-client-sdks/custos-java-clients/user-management-client/src/main/java/org/apache/custos/user/management/client/UserManagementClient.java b/custos-client-sdks/custos-java-clients/user-management-client/src/main/java/org/apache/custos/user/management/client/UserManagementClient.java
index 8394b69..be76e88 100644
--- a/custos-client-sdks/custos-java-clients/user-management-client/src/main/java/org/apache/custos/user/management/client/UserManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/user-management-client/src/main/java/org/apache/custos/user/management/client/UserManagementClient.java
@@ -18,10 +18,10 @@
  */
 
 
-import io.grpc.ManagedChannel;
 import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
 import io.grpc.stub.MetadataUtils;
+import org.apache.custos.clients.core.AbstractClient;
 import org.apache.custos.clients.core.ClientUtils;
 import org.apache.custos.iam.service.*;
 import org.apache.custos.user.management.service.UserManagementServiceGrpc;
@@ -35,20 +35,18 @@
 /**
  * The class containes operations permitted for user management client
  */
-public class UserManagementClient {
-
-    private ManagedChannel managedChannel;
+public class UserManagementClient extends AbstractClient {
 
     private UserManagementServiceGrpc.UserManagementServiceBlockingStub blockingStub;
 
-    private String clientId ;
+    private String clientId;
 
     private String clientSec;
 
 
     public UserManagementClient(String serviceHost, int servicePort, String clientId,
                                 String clientSecret) throws IOException {
-
+        super(serviceHost, servicePort, clientId, clientSecret);
         managedChannel = NettyChannelBuilder.forAddress(serviceHost, servicePort)
                 .sslContext(GrpcSslContexts
                         .forClient()
@@ -365,7 +363,7 @@
                 UserManagementServiceGrpc.newBlockingStub(managedChannel);
         unAuthorizedStub =
                 MetadataUtils.attachHeaders(unAuthorizedStub, ClientUtils.getUserTokenHeader(adminToken));
-        unAuthorizedStub =MetadataUtils.attachHeaders(unAuthorizedStub,
+        unAuthorizedStub = MetadataUtils.attachHeaders(unAuthorizedStub,
                 ClientUtils.getAuthorizationHeader(this.clientId, this.clientSec));
 
         AddUserRolesRequest request = AddUserRolesRequest
@@ -386,7 +384,7 @@
                 UserManagementServiceGrpc.newBlockingStub(managedChannel);
         unAuthorizedStub =
                 MetadataUtils.attachHeaders(unAuthorizedStub, ClientUtils.getUserTokenHeader(adminToken));
-        unAuthorizedStub =MetadataUtils.attachHeaders(unAuthorizedStub,
+        unAuthorizedStub = MetadataUtils.attachHeaders(unAuthorizedStub,
                 ClientUtils.getAuthorizationHeader(this.clientId, this.clientSec));
 
         DeleteUserRolesRequest request = DeleteUserRolesRequest
@@ -521,9 +519,9 @@
 
         UserManagementServiceGrpc.UserManagementServiceBlockingStub stub =
                 UserManagementServiceGrpc.newBlockingStub(managedChannel);
-                stub = MetadataUtils.attachHeaders(stub,
-                        ClientUtils.getAuthorizationHeader(this.clientId, this.clientSec));
-                MetadataUtils.attachHeaders(stub, ClientUtils.getUserTokenHeader(adminToken));
+        stub = MetadataUtils.attachHeaders(stub,
+                ClientUtils.getAuthorizationHeader(this.clientId, this.clientSec));
+        MetadataUtils.attachHeaders(stub, ClientUtils.getUserTokenHeader(adminToken));
 
         UserSearchMetadata metadata = UserSearchMetadata
                 .newBuilder()
diff --git a/custos-client-sdks/custos-java-sdk/src/main/java/org/apache/custos/clients/CustosClientProvider.java b/custos-client-sdks/custos-java-sdk/src/main/java/org/apache/custos/clients/CustosClientProvider.java
index fa3f05a..8a4d134 100644
--- a/custos-client-sdks/custos-java-sdk/src/main/java/org/apache/custos/clients/CustosClientProvider.java
+++ b/custos-client-sdks/custos-java-sdk/src/main/java/org/apache/custos/clients/CustosClientProvider.java
@@ -22,6 +22,7 @@
 import org.apache.custos.agent.management.client.AgentManagementClient;
 import org.apache.custos.group.management.client.GroupManagementClient;
 import org.apache.custos.identity.management.client.IdentityManagementClient;
+import org.apache.custos.resource.secret.management.client.ResourceSecretManagementAgentClient;
 import org.apache.custos.resource.secret.management.client.ResourceSecretManagementClient;
 import org.apache.custos.sharing.management.client.SharingManagementClient;
 import org.apache.custos.tenant.manamgement.client.TenantManagementClient;
@@ -81,6 +82,11 @@
         return new UserManagementClient(this.serverHost, this.serverPort, this.clientId, this.clientSec);
     }
 
+    public ResourceSecretManagementClient getResourceSecretManagementClientForAgents() throws IOException {
+        return new ResourceSecretManagementAgentClient
+                (this.serverHost, this.serverPort, this.clientId, this.clientSec);
+    }
+
 
     public static class Builder {
 
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/agent_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/agent_management_client.py
new file mode 100644
index 0000000..8bd2dca
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/agent_management_client.py
@@ -0,0 +1,294 @@
+#  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.
+#
+
+
+import logging
+import grpc
+
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.AgentManagementService_pb2_grpc import AgentManagementServiceStub
+from custos.server.core.IamAdminService_pb2 import AgentClientMetadata, RegisterUserRequest, \
+    UserRepresentation, UserAttribute, AddUserAttributesRequest, DeleteUserAttributeRequest, AddUserRolesRequest, \
+    DeleteUserRolesRequest, AddProtocolMapperRequest, ClaimJSONTypes, MapperTypes
+from custos.server.integration.AgentManagementService_pb2 import AgentSearchRequest
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class AgentManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.agent_stub = AgentManagementServiceStub(self.channel)
+
+    def enable_agents(self, token):
+        """
+        Enable agent registration for realm
+        :param token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = AgentClientMetadata()
+
+            return self.agent_stub.enableAgents(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while enabling agents")
+            raise
+
+    def configure_agent_client(self, token, access_token_life_time):
+        """
+        Configure agent client
+        :param token:
+        :param access_token_life_time:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AgentClientMetadata(access_token_life_time=access_token_life_time)
+
+            return self.agent_stub.enableAgents(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while configuring agent client")
+            raise
+
+    def register_and_enable_agent(self, token, agent):
+        """
+        Register and enable agent
+        :param agent:
+        :param token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            attributeList = []
+            for atr in agent['attributes']:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+            id = agent['id']
+            realm_roles = agent['realm_roles']
+            user = UserRepresentation(id=id, realm_roles=realm_roles, attributes=attributeList)
+            request = RegisterUserRequest(user=user)
+
+            return self.agent_stub.registerAndEnableAgent(request=request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred while enabling agents")
+            raise
+
+    def get_agent(self, token, id):
+        """
+        Get agent having id
+        :param token:
+        :param id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AgentSearchRequest(id=id)
+            return self.agent_stub.getAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while fetching agent")
+            raise
+
+    def delete_agent(self, token, id):
+        """
+        Delete agent having id
+        :param token:
+        :param id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AgentSearchRequest(id=id)
+            return self.agent_stub.deleteAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while deleting agent")
+            raise
+
+    def disable_agent(self, token, id):
+        """
+        Disable agent having id
+        :param token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AgentSearchRequest(id=id)
+            return self.agent_stub.disableAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while disabling agent")
+            raise
+
+    def enable_agent(self, token, id):
+        """
+        Enable agent having id
+        :param token:
+        :param id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AgentSearchRequest(id=id)
+            return self.agent_stub.enableAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while enabling agent")
+            raise
+
+    def add_agent_attributes(self, token, agents, attributes):
+        """
+        Add attributes to agents
+        :param token:
+        :param agents:
+        :param attributes:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            attributeList = []
+            for atr in attributes:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+
+            request = AddUserAttributesRequest(attributes=attributeList, agents=agents)
+            return self.agent_stub.addAgentAttributes(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while adding agent attributes")
+            raise
+
+    def delete_agent_attributes(self, token, agents, attributes):
+        """
+        Delete agent attributes of agents
+        :param token:
+        :param agents:
+        :param attributes:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            attributeList = []
+            for atr in attributes:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+
+            request = DeleteUserAttributeRequest(attributes=attributeList, agents=agents)
+            return self.agent_stub.deleteAgentAttributes(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while deleting agent attributes")
+            raise
+
+    def add_roles_to_agents(self, token, agents, roles):
+        """
+        Add roles to agents
+        :param token:
+        :param agents:
+        :param roles:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = AddUserRolesRequest(agents=agents, roles=roles)
+            return self.agent_stub.addRolesToAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred whiling adding roles to agents")
+            raise
+
+    def delete_roles_from_agent(self, token, id, roles):
+        """
+        Delete roles from agent
+        :param token:
+        :param id:
+       :param roles:
+       :return:
+       """
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = DeleteUserRolesRequest(id=id, roles=roles)
+            return self.agent_stub.deleteRolesFromAgent(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while enabling agents")
+            raise
+
+    def add_protocol_mapper(self, token, name, attribute_name, claim_name, claim_type, mapper_type,
+                            add_to_id_token, add_to_access_token, add_to_user_info, multi_valued,
+                            aggregate_attribute_values):
+        """
+        Add protocol mapper to agent client
+        :param token:
+        :param name:
+        :param attribute_name:
+        :param claim_name:
+        :param claim_type:
+        :param mapper_type:
+        :param add_to_id_token:
+        :param add_to_access_token:
+        :param add_to_user_info:
+        :param multi_valued:
+        :param aggregate_attribute_values:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            wrapped_json_type = ClaimJSONTypes.Value(claim_type)
+            wrapped_mapper_type = MapperTypes.Value(mapper_type)
+
+            request = AddProtocolMapperRequest(name=name,
+                                               attribute_name=attribute_name,
+                                               claim_name=claim_name,
+                                               claim_type=wrapped_json_type,
+                                               mapper_type=wrapped_mapper_type,
+                                               add_to_id_token=add_to_id_token,
+                                               add_to_access_token=add_to_access_token,
+                                               add_to_user_info=add_to_user_info,
+                                               multi_valued=multi_valued,
+                                               aggregate_attribute_values=aggregate_attribute_values
+                                               )
+
+            return self.agent_stub.addProtocolMapper(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in add_protocol_mapper, probably due to invalid parameters")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/group_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/group_management_client.py
new file mode 100644
index 0000000..b80b051
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/group_management_client.py
@@ -0,0 +1,169 @@
+#  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.
+#
+
+
+import logging
+import grpc
+
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.GroupManagementService_pb2_grpc import GroupManagementServiceStub
+
+from custos.server.core.UserProfileService_pb2 import GroupToGroupMembership, Group, GroupRequest, GroupMembership
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class GroupManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.group_stub = GroupManagementServiceStub(self.channel)
+
+    def create_group(self, token, name, description, owner_id):
+        """
+        Create groups
+        :param owner_id:
+        :param description:
+        :param name:
+        :param token:
+        :return:
+        """
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            rep = Group(name=name, realm_roles=[], client_roles=[],
+                        attributes=[], description=description,
+                        owner_id=owner_id)
+
+            request = GroupRequest(group=rep)
+
+            return self.group_stub.createGroup(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while creating groups")
+            raise
+
+    def delete_group(self, token, id):
+        """
+        delete group using group id
+        :param token:
+        :param id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GroupRequest(id=id)
+            return self.group_stub.deleteGroup(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while deleting group")
+            raise
+
+    def find_group(self, token, group_name, group_id):
+        """
+        find group using group name
+        :param token:
+        :param group_name:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            gr = Group(id=group_id, name=group_name)
+            request = GroupRequest(id=group_id, group=gr)
+            return self.group_stub.findGroup(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred finding group")
+            raise
+
+    def get_all_groups(self, token):
+        """
+        Get all groups of tenant
+        :param token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GroupRequest()
+            return self.group_stub.getAllGroups(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while pulling groups")
+            raise
+
+    def add_user_to_group(self, token, username, group_id, membership_type):
+        """
+        Add user to group
+        :param token:
+        :param username:
+        :param group_id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GroupMembership(username=username, group_id=group_id, type=membership_type)
+            return self.group_stub.addUserToGroup(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while adding user to group")
+            raise
+
+    def remove_user_from_group(self, token, username, group_id):
+        """
+        Remove user from group
+        :param token:
+        :param username:
+        :param group_id:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GroupMembership(username=username, group_id=group_id)
+            return self.group_stub.removeUserFromGroup(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while removing user from group")
+            raise
+
+    def add_child_group(self, token, parent_group_id, child_group_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            grm = GroupToGroupMembership(child_id=child_group_id, parent_id=parent_group_id)
+            return self.group_stub.addChildGroupToParentGroup(request=grm, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while adding child group")
+            raise
+
+    def remove_child_group(self, token, parent_group_id, child_group_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            grm = GroupToGroupMembership(child_id=child_group_id, parent_id=parent_group_id)
+            return self.group_stub.removeChildGroupFromParentGroup(request=grm, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while removing child group from group")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/identity_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/identity_management_client.py
new file mode 100644
index 0000000..c90a1b2
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/identity_management_client.py
@@ -0,0 +1,240 @@
+#  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.
+#
+
+import logging
+
+import grpc
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.IdentityManagementService_pb2_grpc import IdentityManagementServiceStub
+from custos.server.core.IdentityService_pb2 import AuthenticationRequest, AuthToken, Claim, \
+    GetUserManagementSATokenRequest, \
+    GetTokenRequest, GetOIDCConfiguration, EndSessionRequest
+from custos.server.integration.IdentityManagementService_pb2 import AuthorizationRequest, GetCredentialsRequest, \
+    EndSessionRequest as Er, GetAgentTokenRequest
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class IdentityManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.identity_stub = IdentityManagementServiceStub(self.channel)
+
+    def authenticate(self, token, username, password):
+        """
+        Used for local authentication
+        :param token client credentials
+        :param username Users username
+        :param password Users password
+        :return: Access token
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AuthenticationRequest(username=username, password=password)
+
+            return self.identity_stub.authenticate(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in authenticate, probably due to invalid parameters")
+            raise
+
+    def is_authenticated(self, token, user_access_token, username):
+        """
+        Check access token is valid
+        :param token: client credential token
+        :param user_access_token access token of user
+        :param username
+        :return: status (TRUE, FALSE)
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            claim = Claim(key="username", value=username)
+
+            claims = []
+            claims.append(claim)
+
+            request = AuthToken(accessToken=user_access_token, claims=claims)
+
+            return self.identity_stub.isAuthenticated(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in is_authenticated, probably due to invalid parameters")
+            raise
+
+    def get_service_account_access_token(self, token):
+        """
+        Get service account access token
+        :param token: client credentials
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetUserManagementSATokenRequest();
+
+            return self.identity_stub.getUserManagementServiceAccountAccessToken(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in get_service_account_access_token, probably due to invalid parameters")
+            raise
+
+    def authorize(self, client_id, redirect_uri, response_type, scope, state):
+        """
+        return authorize url of keycloak
+        :param redirect_uri: redirect URI of client
+        :param response_type: response type (code)
+        :param scope: (openid email profile)
+        :param state: (random number)
+        :return:
+        """
+        try:
+            request = AuthorizationRequest(client_id=client_id, redirect_uri=redirect_uri, response_type=response_type,
+                                           scope=scope,
+                                           state=state)
+
+            return self.identity_stub.authorize(request)
+        except Exception:
+            logger.exception("Error occurred in authorize, probably due to invalid parameters")
+            raise
+
+    def token(self, token, redirect_uri=None, code=None, username=None, password=None, refresh_token=None,
+              grant_type=None):
+        """
+        provide user access token
+        :param token: client credentials
+        :param redirect_uri: redirect uri
+        :param code: code returned from token
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetTokenRequest(redirect_uri=redirect_uri, code=code,
+                                      username=username, password=password, refresh_token=refresh_token,
+                                      grant_type=grant_type)
+
+            return self.identity_stub.token(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in token, probably due to invalid parameters")
+            raise
+
+    def get_credentials(self, token, client_id):
+        """
+        provides IAM and CILogon credentials
+        :param token
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetCredentialsRequest(client_id=client_id)
+
+            return self.identity_stub.getCredentials(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in get_credentials, probably due to invalid parameters")
+            raise
+
+    def get_oidc_configuration(self, token, client_id):
+        """
+        send the OIDC config
+        :param token client credentials
+        :param client_id
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetOIDCConfiguration(client_id=client_id)
+
+            return self.identity_stub.getOIDCConfiguration(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in get_OIDC_Configuration, probably due to invalid parameters")
+            raise
+
+    def end_user_session(self, token, refresh_token):
+        """
+        End user session
+        :param token:
+        :param refresh_token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            body = EndSessionRequest(refresh_token=refresh_token)
+            request = Er(body=body)
+
+            return self.identity_stub.endUserSession(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while ending user session")
+            raise
+
+    def get_agent_token(self, token, client_id, grant_type, refresh_token=None):
+        """
+        Get agent token
+        :param token: base64Encoded(agentId:agentSec)
+        :param client_id: parent Client Id
+        :param grant_type: client_credentials, refresh_token
+        :param refresh_token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetAgentTokenRequest(client_id=client_id, grant_type=grant_type, refresh_token=refresh_token)
+
+            return self.identity_stub.getAgentToken(request=request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred while fetching agent token")
+            raise
+
+    def end_agent_session(self, token, refresh_token):
+        """
+        End user session
+        :param token: base64Encoded(agentId:agentSec)
+        :param refresh_token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            body = EndSessionRequest(refresh_token=refresh_token)
+            request = Er(body=body)
+
+            return self.identity_stub.endAgentSession(request=request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while ending agent session")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/resource_secret_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/resource_secret_management_client.py
new file mode 100644
index 0000000..1b41dbc
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/resource_secret_management_client.py
@@ -0,0 +1,195 @@
+#  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.
+#
+
+
+import logging
+import grpc
+
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.ResourceSecretManagementService_pb2_grpc import ResourceSecretManagementServiceStub
+from custos.server.core.IdentityService_pb2 import GetJWKSRequest
+from custos.server.core.ResourceSecretService_pb2 import GetSecretRequest, SecretMetadata, ResourceOwnerType, \
+    ResourceSource, KVCredential, ResourceType, SSHCredential, PasswordCredential, GetResourceCredentialByTokenRequest
+from google.protobuf.json_format import MessageToJson
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class ResourceSecretManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.resource_sec_client = ResourceSecretManagementServiceStub(self.channel)
+
+    def get_secret(self, token, owner_type, resource_type, source, name):
+        """
+        Get secret from secret service
+        :param token:
+        :param owner_type:
+        :param resource_type:
+        :param source:
+        :param name:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            owner_type = ResourceOwnerType.Value(owner_type)
+            resource_type = ResourceType.Value(resource_type)
+            source = ResourceSource.Value(source)
+            met = SecretMetadata(owner_type=owner_type,
+                                 resource_type=resource_type, source=source, name=name)
+            request = GetSecretRequest(metadata=met)
+            msg = self.resource_sec_client.getSecret(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while fetching secrets")
+            raise
+
+    def get_JWKS(self, token):
+        """
+        Get JWKS resources
+        :param token:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GetJWKSRequest()
+            msg = self.resource_sec_client.getJWKS(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while fetching JWKS request")
+            raise
+
+    def add_ssh_credential(self, token, client_id, owner_id, description):
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            secret_metadata = SecretMetadata(client_id=client_id, owner_id=owner_id, description=description)
+            ssh_cred = SSHCredential(metadata=secret_metadata)
+
+            return self.resource_sec_client.addSSHCredential(request=ssh_cred, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred while creating ssh key")
+            raise
+
+    def add_password_credential(self, token, client_id, owner_id, description, password):
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            secret_metadata = SecretMetadata(client_id=client_id, owner_id=owner_id, description=description)
+            password_cred = PasswordCredential(metadata=secret_metadata, password=password)
+
+            return self.resource_sec_client.addPasswordCredential(request=password_cred, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred while creating password key")
+            raise
+
+    def get_ssh_credential(self, token, client_id, ssh_credential_token):
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GetResourceCredentialByTokenRequest(client_id=client_id, token=ssh_credential_token)
+
+            msg = self.resource_sec_client.getSSHCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while creating ssh key")
+            raise
+
+    def get_password_credential(self, token, client_id, password_credential_token):
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            request = GetResourceCredentialByTokenRequest(client_id=client_id, token=password_credential_token)
+
+            msg = self.resource_sec_client.getPasswordCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while creating password key")
+            raise
+
+    def set_KV_credential(self, token, user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.addKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while creating KV credential")
+            raise
+
+    def update_KV_credential(self, token,user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.updateKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while updating KV credential")
+            raise
+
+    def delete_KV_credential(self, token, user_token, client_id, key):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.deleteKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while deleting KV credential")
+            raise
+
+    def get_KV_credential(self, token, user_token, client_id, key):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.getKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while get KV credential")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/sharing_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/sharing_management_client.py
new file mode 100644
index 0000000..468c5ca
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/sharing_management_client.py
@@ -0,0 +1,120 @@
+import logging
+import grpc
+
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.SharingManagementService_pb2_grpc import SharingManagementServiceStub
+
+from custos.server.core.SharingService_pb2 import PermissionType, EntityType, Entity, SharingRequest, \
+    PermissionTypeRequest, EntityRequest, EntityTypeRequest
+from google.protobuf.json_format import MessageToJson
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class SharingManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.sharing_mgt_client = SharingManagementServiceStub(self.channel)
+
+    def create_entity_type(self, token, client_id, id, name, description):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            entity_type = EntityType(id=id, name=name, description=description)
+            entity_type_req = EntityTypeRequest(client_id=client_id, entity_type=entity_type)
+            return self.sharing_mgt_client.createEntityType(request=entity_type_req, metadata=metadata);
+        except Exception:
+            logger.exception("Error occurred while creating entity type with Id " + id)
+            raise
+
+    def create_permission_type(self, token, client_id, id, name, description):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            permission_type = PermissionType(id=id, name=name, description=description)
+            permission_type_req = PermissionTypeRequest(client_id=client_id, permission_type=permission_type)
+            return self.sharing_mgt_client.createPermissionType(request=permission_type_req, metadata=metadata);
+        except Exception:
+            logger.exception("Error occurred while creating permission entity type with Id " + id)
+            raise
+
+    def create_entity(self, token, client_id, id, name, description, owner_id, type, parent_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+            entity = Entity(id=id, name=name, description=description, owner_id=owner_id, type=type,
+                            parent_id=parent_id)
+            entity_req = EntityRequest(client_id=client_id, entity=entity)
+            return self.sharing_mgt_client.createEntity(request=entity_req, metadata=metadata);
+        except Exception:
+            logger.exception("Error occurred while creating  entity  with Id " + id)
+            raise
+
+    def share_entity_with_users(self, token, client_id, entity_id, permission_type, user_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            entity = Entity(id=entity_id)
+            permission_type = PermissionType(id=permission_type)
+            owner_ids = []
+            owner_ids.append(user_id)
+            cascade = True
+            sharing_req = SharingRequest(client_id=client_id, entity=entity, permission_type=permission_type,
+                                         owner_id=owner_ids, cascade=cascade)
+            return self.sharing_mgt_client.shareEntityWithUsers(request=sharing_req, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while creating  entity  with Id " + entity_id)
+            raise
+
+    def share_entity_with_groups(self, token, client_id, entity_id, permission_type, group_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            entity = Entity(id=entity_id)
+            permission_type = PermissionType(id=permission_type)
+            owner_ids = []
+            owner_ids.append(group_id)
+            cascade = True
+            sharing_req = SharingRequest(client_id=client_id, entity=entity, permission_type=permission_type,
+                                         owner_id=owner_ids, cascade=cascade)
+            return self.sharing_mgt_client.shareEntityWithGroups(request=sharing_req, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred while creating  entity  with Id " +
+                             entity_id)
+            raise
+
+    def user_has_access(self, token, client_id, entity_id, permission_type, user_id):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            entity = Entity(id=entity_id)
+            permission_type = PermissionType(id=permission_type)
+            owner_ids = []
+            owner_ids.append(user_id)
+            cascade = True
+            sharing_req = SharingRequest(client_id=client_id, entity=entity, permission_type=permission_type,
+                                         owner_id=owner_ids, cascade=cascade)
+            resl = self.sharing_mgt_client.userHasAccess(request=sharing_req, metadata=metadata)
+
+            if resl.status:
+                return True
+            else:
+                return False
+
+        except Exception:
+            logger.exception("Error occurred while checking for permissions ")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/super_tenant_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/super_tenant_management_client.py
new file mode 100644
index 0000000..f7c0463
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/super_tenant_management_client.py
@@ -0,0 +1,80 @@
+#  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.
+#
+
+import logging
+import grpc
+from custos.server.integration.TenantManagementService_pb2_grpc import TenantManagementServiceStub;
+from custos.server.core.TenantProfileService_pb2 import GetTenantsRequest, UpdateStatusRequest
+from custos.transport.settings import CustosServerClientSettings
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class SuperTenantManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings =custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.tenant_stub = TenantManagementServiceStub(self.channel)
+
+    def get_all_tenants(self, token, offset, limit, status, requester_email=None):
+        """
+        Get all tenants
+        :param token admin user token
+        :param offset  omits the initial number of entries
+        :param limit  contains maximum number of entries
+        :param status (ACTIVE, REQUESTED, DENIED, CANCELLED, DEACTIVATED)
+        :return: Tenants
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetTenantsRequest(offset=offset, limit=limit, status=status, requester_email=None)
+
+            return self.tenant_stub.getAllTenants(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in get_all_tenants, probably due to invalid parameters")
+            raise
+
+    def update_tenant_status(self, token, client_id, status):
+        """
+        Update tenant status.
+        :param token admin user token
+        :param client_id  client id of tenant to be updated
+        :param status (ACTIVE, REQUESTED, DENIED, CANCELLED, DEACTIVATED)
+        :return: Operation Status
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = UpdateStatusRequest(client_id=client_id, status=status)
+
+            return self.tenant_stub.updateTenantStatus(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in update_tenant_status, probably due to invalid parameters")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/tenant_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/tenant_management_client.py
new file mode 100644
index 0000000..def5d00
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/tenant_management_client.py
@@ -0,0 +1,269 @@
+#  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.
+#
+
+import logging
+import grpc
+from custos.server.integration.TenantManagementService_pb2_grpc import TenantManagementServiceStub
+from custos.server.core.TenantProfileService_pb2 import Tenant, GetTenantsRequest, GetAllTenantsForUserRequest
+from custos.server.core.IamAdminService_pb2 import AddRolesRequest, RoleRepresentation, AddProtocolMapperRequest, \
+    ClaimJSONTypes, MapperTypes
+from custos.server.integration.TenantManagementService_pb2 import GetTenantRequest, \
+    UpdateTenantRequest, DeleteTenantRequest
+from custos.transport.settings import CustosServerClientSettings
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class TenantManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.tenant_stub = TenantManagementServiceStub(self.channel)
+
+    def create_admin_tenant(self, client_name, requester_email, admin_frist_name,
+                            admin_last_name, admin_email, admin_username, admin_password,
+                            contacts, redirect_uris, client_uri, scope, domain, logo_uri, comment):
+        """
+         Creates admin tenant client. Needs to be approved by
+         Custos Admin
+        :return: Custos Credentials
+        """
+        try:
+            tenant = Tenant(client_name=client_name,
+                            requester_email=requester_email,
+                            admin_first_name=admin_frist_name,
+                            admin_last_name=admin_last_name,
+                            admin_email=admin_email,
+                            admin_username=admin_username,
+                            admin_password=admin_password,
+                            contacts=contacts,
+                            redirect_uris=redirect_uris,
+                            client_uri=client_uri,
+                            scope=scope,
+                            domain=domain,
+                            logo_uri=logo_uri,
+                            comment=comment,
+                            application_type="web")
+            return self.tenant_stub.createTenant(tenant)
+        except Exception:
+            logger.exception("Error occurred in create_admin_tenant, probably due to invalid parameters")
+            raise
+
+    def create_tenant(self, client_token, client_name, requester_email, admin_frist_name,
+                      admin_last_name, admin_email, admin_username, admin_password,
+                      contacts, redirect_uris, client_uri, scope, domain, logo_uri, comment):
+        """
+        Creates child tenant under admin tenant. Automatically activates
+        :return: Custos credentials
+        """
+        try:
+            tenant = Tenant(client_name=client_name,
+                            requester_email=requester_email,
+                            admin_first_name=admin_frist_name,
+                            admin_last_name=admin_last_name,
+                            admin_email=admin_email,
+                            admin_username=admin_username,
+                            admin_password=admin_password,
+                            contacts=contacts,
+                            redirect_uris=redirect_uris,
+                            client_uri=client_uri,
+                            scope=scope,
+                            domain=domain,
+                            logo_uri=logo_uri,
+                            comment=comment,
+                            application_type="web")
+            token = "Bearer " + client_token
+            metadata = (('authorization', token),)
+            return self.tenant_stub.createTenant(tenant, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in create_tenant, probably due to invalid parameters")
+            raise
+
+    def get_tenant(self, client_token, client_id):
+        """
+        Fetch tenant
+        :return: Tenant
+        """
+        try:
+            request = GetTenantRequest(client_id=client_id)
+            token = "Bearer " + client_token
+            metadata = (('authorization', token),)
+            return self.tenant_stub.getTenant(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in get_tenant, probably due to invalid parameters")
+            raise
+
+    def update_tenant(self, client_token, client_id, client_name, requester_email, admin_frist_name,
+                      admin_last_name, admin_email, admin_username, admin_password,
+                      contacts, redirect_uris, client_uri, scope, domain, logo_uri, comment):
+        """
+        Update given tenant by client Id
+        :return: updated tenant
+        """
+        try:
+            tenant = Tenant(client_name=client_name,
+                            requester_email=requester_email,
+                            admin_first_name=admin_frist_name,
+                            admin_last_name=admin_last_name,
+                            admin_email=admin_email,
+                            admin_username=admin_username,
+                            admin_password=admin_password,
+                            contacts=contacts,
+                            redirect_uris=redirect_uris,
+                            client_uri=client_uri,
+                            scope=scope,
+                            domain=domain,
+                            logo_uri=logo_uri,
+                            comment=comment,
+                            application_type="web")
+            token = "Bearer " + client_token
+            metadata = (('authorization', token),)
+
+            request = UpdateTenantRequest(client_id=client_id, body=tenant)
+
+            return self.tenant_stub.updateTenant(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in update_tenant, probably due to invalid parameters")
+            raise
+
+    def delete_tenant(self, token, client_id):
+        """
+        Delete given tenant by client Id
+        :return:  void
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = DeleteTenantRequest(client_id=client_id)
+
+            return self.tenant_stub.deleteTenant(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in delete_tenant, probably due to invalid parameters")
+            raise
+
+    def add_tenant_roles(self, token, roles, is_client_level):
+        """
+        :param token
+        :param: roles include realm or client level roles as array
+        :param is_client_level boolean to indicate to add roles to client
+        :return:  void
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            rolesRepArray = []
+
+            for role in roles:
+                rolesRep = RoleRepresentation(name=role['name'], description=role['description'],
+                                              composite=role['composite'])
+                rolesRepArray.append(rolesRep)
+
+            request = AddRolesRequest(roles=rolesRepArray, client_level=is_client_level)
+
+            return self.tenant_stub.addTenantRoles(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in add_tenant_roles, probably due to invalid parameters")
+            raise
+
+    def add_protocol_mapper(self, token, name, attribute_name, claim_name, claim_type, mapper_type,
+                            add_to_id_token, add_to_access_token, add_to_user_info, multi_valued,
+                            aggregate_attribute_values):
+        """
+        Protocol mapper enables to add user attributes, user realm roles or user client roles to be
+        added to ID token, Access token.
+        :param token
+        :param: roles include realm or client level roles as array
+        :param is_client_level boolean to indicate to add roles to client
+        :return:  void
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            wrapped_json_type = ClaimJSONTypes.Value(claim_type)
+            wrapped_mapper_type = MapperTypes.Value(mapper_type)
+
+            request = AddProtocolMapperRequest(name=name,
+                                               attribute_name=attribute_name,
+                                               claim_name=claim_name,
+                                               claim_type=wrapped_json_type,
+                                               mapper_type=wrapped_mapper_type,
+                                               add_to_id_token=add_to_id_token,
+                                               add_to_access_token=add_to_access_token,
+                                               add_to_user_info=add_to_user_info,
+                                               multi_valued=multi_valued,
+                                               aggregate_attribute_values=aggregate_attribute_values
+                                               )
+
+            return self.tenant_stub.addProtocolMapper(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in add_protocol_mapper, probably due to invalid parameters")
+            raise
+
+    def get_child_tenants(self, token, offset, limit, status):
+        """
+        Get child tenants of the calling tenant
+        :param token
+        :param: offset omit initial number of results equalt to offset
+        :param limit results should contain  maximum number of entries
+        :param status (ACTIVE, REQUESTED, DENIED, CANCELLED, DEACTIVATED)
+        :return:  Tenants
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetTenantsRequest(offset=offset, limit=limit, status=status)
+
+            return self.tenant_stub.getChildTenants(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in get_child_tenants, probably due to invalid parameters")
+            raise
+
+    def get_all_tenants(self, token, email):
+        """
+        Get all tenants requested by given user
+        :param token
+        :param email get all tenants requested by email
+        :return:  Tenants
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = GetAllTenantsForUserRequest(email=email)
+
+            return self.tenant_stub.getAllTenantsForUser(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in get_all_tenants, probably due to invalid parameters")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/user_management_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/user_management_client.py
new file mode 100644
index 0000000..6fd5159
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/user_management_client.py
@@ -0,0 +1,387 @@
+#  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.
+#
+
+import logging
+import grpc
+
+from custos.transport.settings import CustosServerClientSettings
+
+from custos.server.integration.UserManagementService_pb2_grpc import UserManagementServiceStub
+from custos.server.core.IamAdminService_pb2 import RegisterUserRequest, UserRepresentation, RegisterUsersRequest, \
+    UserAttribute, \
+    AddUserAttributesRequest, DeleteUserAttributeRequest, UserSearchMetadata, FindUsersRequest, AddUserRolesRequest, \
+    UserSearchRequest, ResetUserPassword, DeleteUserRolesRequest
+from custos.server.core.UserProfileService_pb2 import UserProfile
+from custos.server.integration.UserManagementService_pb2 import LinkUserProfileRequest, UserProfileRequest
+
+from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
+
+class UserManagementClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        certManager = CertificateFetchingRestClient(custos_server_setting)
+        certManager.load_certificate()
+        with open(self.custos_settings.CUSTOS_CERT_PATH, 'rb') as f:
+            trusted_certs = f.read()
+        self.channel_credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
+        self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
+        self.user_stub = UserManagementServiceStub(self.channel)
+
+    def register_user(self, token, username, first_name, last_name, password, email, is_temp_password):
+        """
+        Register user in given tenant
+        :param token:  client credentials
+        :param username:
+        :param first_name:
+        :param last_name:
+        :param password:
+        :param email:
+        :param is_temp_password:
+        :return: registration status
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserRepresentation(username=username, password=password,
+                                      first_name=first_name, last_name=last_name,
+                                      email=email, temporary_password=is_temp_password)
+
+            request = RegisterUserRequest(user=user)
+
+            return self.user_stub.registerUser(request, metadata=metadata)
+        except Exception:
+            logger.exception("Error occurred in register_user, probably due to invalid parameters")
+            raise
+
+    def register_and_enable_users(self, token, users):
+        """
+        register and enable users
+        :param token: admin access token
+        :param users:
+        :return:
+        """
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            usersList = []
+
+            for user in users:
+                attributeList = []
+                for atr in user['attributes']:
+                    attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                    attributeList.append(attribute)
+                username = user['username']
+                password = user['password']
+                first_name = user['first_name']
+                last_name = user['last_name']
+                email = user['email']
+                temporary_password = user['temporary_password']
+                realm_roles = user['realm_roles']
+                client_roles = user['client_roles']
+                attributes = attributeList
+                user = UserRepresentation(username=username, password=password,
+                                          first_name=first_name, last_name=last_name,
+                                          email=email, temporary_password=temporary_password,
+                                          realm_roles=realm_roles, client_roles=client_roles,
+                                          attributes=attributes)
+
+                usersList.append(user)
+
+            request = RegisterUsersRequest(users=usersList)
+            return self.user_stub.registerAndEnableUsers(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in register_and_enable_users, probably due to invalid parameters")
+            raise
+
+    def add_user_attributes(self, token, attributes, users):
+        """
+        Add user attributes
+        :param token:
+        :param attributes:
+        :param users:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            attributeList = []
+            for atr in attributes:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+
+            request = AddUserAttributesRequest(attributes=attributeList, users=users)
+            return self.user_stub.addUserAttributes(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in add_user_attributes, probably due to invalid parameters")
+            raise
+
+    def delete_user_attributes(self, token, attributes, users):
+        """
+        Delete user attributes
+        :param token: user token
+        :param attributes:
+        :param users:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            attributeList = []
+            for atr in attributes:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+
+            request = DeleteUserAttributeRequest(attributes=attributeList, users=users)
+            return self.user_stub.deleteUserAttributes(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in delete_user_attributes, probably due to invalid parameters")
+            raise
+
+    def enable_user(self, token, username):
+        """
+        Enable user request
+        :param token: client credential
+        :param attributes:
+        :param users:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username)
+            request = UserSearchRequest(user=user)
+            return self.user_stub.enableUser(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in enable_user, probably due to invalid parameters")
+            raise
+
+    def add_roles_to_users(self, token, usernames, roles, is_client_level):
+        """
+        Add roles to users
+        :param token: admin token
+        :param usernames list of usersname
+        :param : roles list of roles
+        :param is_client_level to add client level else realm level
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = AddUserRolesRequest(usernames=usernames, roles=roles, client_level=is_client_level)
+            return self.user_stub.addRolesToUsers(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in add_roles_to_users, probably due to invalid parameters")
+            raise
+
+    def is_user_enabled(self, token, username):
+        """
+        Check the weather user is enabled
+        :param token: client credential
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username)
+            request = UserSearchRequest(user=user)
+            return self.user_stub.isUserEnabled(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in is_user_enabled, probably due to invalid parameters")
+            raise
+
+    def is_username_available(self, token, username):
+        """
+        Check the weather username  is available
+        :param token: client credential
+        :param username
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username)
+            request = UserSearchRequest(user=user)
+            return self.user_stub.isUsernameAvailable(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in is_username_available, probably due to invalid parameters")
+            raise
+
+    def get_user(self, token, username):
+        """
+        Get user
+        :param token: client credential
+        :param username
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username)
+            request = UserSearchRequest(user=user)
+            return self.user_stub.getUser(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in get_user, probably due to invalid parameters")
+            raise
+
+    def find_users(self, token, offset, limit, username=None, firstname=None, lastname=None, email=None, ):
+        """
+        Find users
+        :param token: client credential
+        :param username
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username, first_name=firstname, last_name=lastname, email=email)
+            request = FindUsersRequest(user=user, offset=offset, limit=limit)
+            return self.user_stub.findUsers(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in find_users, probably due to invalid parameters")
+            raise
+
+    def reset_password(self, token, username, password):
+        """
+        Reset user password
+        :param token: client credential
+        :param username
+        :param password
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = ResetUserPassword(username=username, password=password)
+            return self.user_stub.resetPassword(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in reset_password, probably due to invalid parameters")
+            raise
+
+    def delete_user(self, token, username):
+        """
+        Delete user from a given realm
+        :param token: admin credentials
+        :param username:
+        :return:
+        """
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            user = UserSearchMetadata(username=username)
+            request = UserSearchRequest(user=user)
+            return self.user_stub.deleteUser(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in delete_user, probably due to invalid parameters")
+            raise
+
+    def delete_user_roles(self, token, username, client_roles, realm_roles):
+        """
+        Delete user roles
+        :param token: admin access token
+        :param username:
+        :param client_roles:
+        :param realm_roles:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            request = DeleteUserRolesRequest(username=username, client_roles=client_roles, roles=realm_roles)
+            return self.user_stub.deleteUserRoles(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in delete_user_roles, probably due to invalid parameters")
+            raise
+
+    def update_user_profile(self, token, username, email, first_name, last_name):
+        """
+        Update user profile
+        :param token: user token
+        :param username:
+        :param email:
+        :param first_name:
+        :param last_name:
+        :return:
+        """
+
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            profile = UserProfile(username=username, email=email, first_name=first_name, last_name=last_name)
+            request = UserProfileRequest(user_profile=profile)
+            return self.user_stub.updateUserProfile(request=request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in update_user_profile, probably due to invalid parameters")
+            raise
+
+    def link_user_profile(self, token, current_username, previous_username, linking_attributes=None):
+        """
+        Link existing user profile with previous user profile
+        :param previous_username:
+        :param current_username:
+        :param linking_attributes:
+        :return:
+        """
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),)
+
+            attributeList = []
+            for atr in linking_attributes:
+                attribute = UserAttribute(key=atr['key'], values=atr['values'])
+                attributeList.append(attribute)
+
+            request = LinkUserProfileRequest(current_username=current_username, previous_username=previous_username,
+                                             linking_attributes=attributeList)
+            return self.user_stub.linkUserProfile(request, metadata=metadata)
+
+        except Exception:
+            logger.exception("Error occurred in update_user_profile, probably due to invalid parameters")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/certificate_fetching_rest_client.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/certificate_fetching_rest_client.py
new file mode 100644
index 0000000..ec58e8a
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/certificate_fetching_rest_client.py
@@ -0,0 +1,79 @@
+#  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.
+#
+
+import logging
+
+import OpenSSL
+import requests
+import os
+import datetime
+from urllib3.exceptions import InsecureRequestWarning
+import warnings
+
+requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
+
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
+
+class CertificateFetchingRestClient(object):
+
+    def __init__(self, custos_server_setting):
+        self.custos_settings = custos_server_setting
+        self.target = self.custos_settings.CUSTOS_SERVER_HOST + ":" + str(self.custos_settings.CUSTOS_SERVER_PORT)
+        self.url = "https://" + self.target + "/resource-secret-management/v1.0.0/secret"
+        self.ownertype = "CUSTOS"
+        self.resource_type = "SERVER_CERTIFICATE"
+        self.params = {
+            'metadata.owner_type': self.ownertype,
+            'metadata.resource_type': self.resource_type
+        }
+
+        self.rootdir = os.path.abspath(os.curdir)
+        encodedStr = utl.get_token(self.custos_settings)
+        self.header = {'Authorization': 'Bearer {}'.format(encodedStr)}
+
+    def load_certificate(self):
+        if not self.__is_certificate_valid():
+            self.__download_certificate()
+
+    def __download_certificate(self):
+        r = requests.get(url=self.url, params=self.params, headers=self.header, stream=True, timeout=60, verify=False)
+        value = r.json()['value']
+        path = self.custos_settings.CUSTOS_CERT_PATH
+        f = open(path, "w+")
+        f.write(value)
+
+
+    def __is_certificate_valid(self):
+        if os.path.isfile(self.custos_settings.CUSTOS_CERT_PATH):
+            file = open(self.custos_settings.CUSTOS_CERT_PATH)
+            x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,
+                                                   file.read())
+            expires = datetime.datetime.strptime(x509.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ')
+            now = datetime.datetime.now()
+
+            if now > expires:
+                return False
+            else:
+                return True
+        else:
+            return False
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/utilities.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/utilities.py
new file mode 100644
index 0000000..7b42372
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/clients/utils/utilities.py
@@ -0,0 +1,8 @@
+from base64 import b64encode
+
+
+def get_token(custos_settings):
+    tokenStr = custos_settings.CUSTOS_CLIENT_ID + ":" + custos_settings.CUSTOS_CLIENT_SEC
+    tokenByte = tokenStr.encode('utf-8')
+    encodedBytes = b64encode(tokenByte)
+    return encodedBytes.decode('utf-8')
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/agent_management_samples.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/agent_management_samples.py
new file mode 100644
index 0000000..52a0de5
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/agent_management_samples.py
@@ -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.
+#
+import logging
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.clients.agent_management_client import AgentManagementClient
+
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = AgentManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+
+def register_and_enable():
+    agent = {
+        "id": "agent-asdasda-ebnmvf",
+        "realm_roles": [],
+        "attributes": [{
+            "key": "agent_cluster_id",
+            "values": ["123123131"]
+        }]
+    }
+    id_res = id_client.token(token, username="isjarana", password="Custos1234", grant_type="password")
+    response = client.register_and_enable_agent(id_res['access_token'], agent)
+    print(response)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/group_management_samples.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/group_management_samples.py
new file mode 100644
index 0000000..586cce5
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/group_management_samples.py
@@ -0,0 +1,63 @@
+#  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.
+#
+import logging
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.clients.group_management_client import GroupManagementClient
+
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = GroupManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+print(token)
+
+
+def create_group():
+    groups = [
+        {
+            "name": "testll",
+            "realm_roles": [],
+            "client_roles": [],
+            "attributes": [{
+                "key": "phone",
+                "values": ["8123915386"]
+            }],
+            "sub_groups": [{
+                "name": "testlj",
+                "realm_roles": [],
+                "client_roles": [],
+                "attributes": [{
+                    "key": "email",
+                    "values": ["irjanith@gmail.com"]
+                }],
+                "sub_groups": []
+            }]
+        }
+    ]
+    id_res = id_client.token(token, username="isjarana", password="Custos1234", grant_type="password")
+    response = client.create_groups(id_res['access_token'], groups)
+    print(response)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/identity_management_samples.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/identity_management_samples.py
new file mode 100644
index 0000000..eca9053
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/identity_management_samples.py
@@ -0,0 +1,70 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
+import logging
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load IdentityManagementClient with default configuration
+client = IdentityManagementClient(custos_settings)
+
+main_token = utl.get_token(custos_settings)
+
+
+def authenticate():
+    response = client.authenticate(main_token, "isjarana", "Custos1234")
+    print(response)
+
+
+def is_authenticated():
+    access_token = client.authenticate(main_token, "issa", "1234")
+    response = client.is_authenticated(main_token, access_token.accessToken, "issa")
+    print(response)
+
+
+def get_user_management_access_token():
+    response = client.get_service_account_access_token(token)
+    print(response)
+
+
+def authorize():
+    response = client.authorize("custos-xgect9otrwawa8uwztym-10000006", "http://custos.lk", "code",
+                                "openid email profile", "asdadasdewde")
+    print(response)
+
+
+def token():
+    response = client.token(main_token, "http://custos.lk", "asdasdasdadasd")
+    print(response)
+
+
+def get_credentials():
+    response = client.get_credentials(main_token, "custos-xgect9otrwawa8uwztym-10000006")
+    print(response)
+
+
+def get_OIDC_config():
+    response = client.get_oidc_configuration(main_token, "custos-pv3fqfs9z1hps0xily2t-10000000")
+    print(response)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resource_secert_management.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resource_secert_management.py
new file mode 100644
index 0000000..f2568cb
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resource_secert_management.py
@@ -0,0 +1,80 @@
+#  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.
+#
+import logging
+from custos.clients.user_management_client import UserManagementClient
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.clients.super_tenant_management_client import SuperTenantManagementClient
+from custos.clients.resource_secret_management_client import ResourceSecretManagementClient
+from google.protobuf.json_format import MessageToDict
+
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = UserManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+resource_secret_client = ResourceSecretManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+admin_client = SuperTenantManagementClient(custos_settings)
+
+
+def user_login():
+    response = id_client.token(token=
+                               token,
+                               username="USERNAME",
+                               password="PASSWORD",
+                               grant_type="password")
+    dict_obj = MessageToDict(response)
+    return dict_obj['access_token']
+
+
+def setKVCredential():
+    token = user_login()
+    resp = resource_secret_client.set_KV_credential(token=token, user_token=token,
+                                                    client_id='CHANGE_ME', key='Your key',
+                                                    value='Your Value')
+    print(resp)
+
+
+def getKVCredential():
+    token = user_login()
+    resp = resource_secret_client.get_KV_credential(token=token, user_token=token,
+                                                    client_id='CHANGE_ME', key='Your key')
+    print(resp)
+
+
+def updateKVCredential():
+    token = user_login()
+    resp = resource_secret_client.update_KV_credential(token=token, user_token=token,
+                                                       client_id='CHANGE_ME', key='Your key')
+    print(resp)
+
+
+def deleteKVCredential():
+    token = user_login()
+    resp = resource_secret_client.delete_KV_credential(token=token, user_token=token,
+                                                       client_id='CHANGE_ME', key='Your key')
+    print(resp)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/cert.pem b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/cert.pem
new file mode 100644
index 0000000..2f3d403
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/resources/cert.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFXDCCBESgAwIBAgISAz8ERLSlp4ZA5PlMgMxdWnwKMA0GCSqGSIb3DQEBCwUA
+MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
+ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDAzMDMxMDA0MDhaFw0y
+MDA2MDExMDA0MDhaMBwxGjAYBgNVBAMTEWN1c3Rvcy5zY2lnYXAub3JnMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs6UanPIJWXt94Sp6QuYouBttJj7H
+bRBq6pNfWI480lQvtJuQi/3lxoxzoYP2aVRakuvB1oRbCyRvmWKqn3/AT9BQ050J
+XX0EpAlGYhq8hG8Raq2GM53jumdYlZN2//n6YWaNLdGl10WKroh5w2BHSI5eJ1IT
+ydAq10bt6UxmJFzNf4lnqc9bmrgSOnWMr5XD/PQGklVnOSRmGQNCs7X1dK5ZdUcu
+GwrZFzWoRjt+N/Re3mT+wv9zTVBqzIstT24j6DdjadpRlBOEhVosrQGxqr50Pzle
+/5K0R0/CXohiclb5pkiRv9nJTogKsiX4aSkeG65ZqG0Ex++UahKLYf1XxQIDAQAB
+o4ICaDCCAmQwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
+BgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRQ2uEMFX28RLlE2r5iMXX6
+ZzOdWjAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcB
+AQRjMGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlw
+dC5vcmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlw
+dC5vcmcvMBwGA1UdEQQVMBOCEWN1c3Rvcy5zY2lnYXAub3JnMEwGA1UdIARFMEMw
+CAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9j
+cHMubGV0c2VuY3J5cHQub3JnMIIBBgYKKwYBBAHWeQIEAgSB9wSB9ADyAHcA5xLy
+sDd+GmL7jskMYYTx6ns3y1YdESZb8+DzS/JBVG4AAAFwoBE4lgAABAMASDBGAiEA
+8ph79VeXvMg3++LCKlj/KuSDmX0kEqHDytDAaOYywtMCIQC0nqIeWsCyVt/4Fcg5
+fdrATRVaeqCTm9OExbc007++pQB3ALIeBcyLos2KIE6HZvkruYolIGdr2vpw57JJ
+Uy3vi5BeAAABcKAROJYAAAQDAEgwRgIhAIBTEge3DhiyOpVtFcVKRak+xwCQjsId
++Q9Tw+iMcjsAAiEAtOPG66IfExeQZFTbAsl0PBuVbSIWxEFh1pW1G/7F0F4wDQYJ
+KoZIhvcNAQELBQADggEBAIJ924Xkav/zQV8iT46rWN05yXRDopA/Wqhql2aIpO7/
+9pMGS6PuVaNRn8cRQ+9mBGtkdHf5SJqccYraD7mwfJ1v7x7ZVEv/NB5aav1AI89X
+L/o+MtFKU8SGDEXjGyigr/JL52GPIesRqklTTnOQrUM9peUls4lXWRRH5CcfyyNv
+7GWPwh1xqqIUiPiF7afK60Ytu//Ww1YLZPn9HCOV9Pz5BOdZNJGVm6QboM2fW48v
+eC7W929m//adw3oY934lJrYqfYwjMXnU0ZEJe6nUWHQaNDYep2FgZ3PkZb3tuSsf
+7ghMBbvDW94Wb5wx912XzvthJAg23Z0G9bJWgsXh75s=
+-----END CERTIFICATE-----
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/tenant_management_samples.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/tenant_management_samples.py
new file mode 100644
index 0000000..9502b45
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/tenant_management_samples.py
@@ -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.
+#
+import logging
+from custos.clients.tenant_management_client import TenantManagementClient
+from custos.clients.super_tenant_management_client import SuperTenantManagementClient
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = TenantManagementClient(custos_settings)
+admin_client = SuperTenantManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+
+def create_tenant():
+    contacts = ["2345634324"]
+    redirect_uris = ["http://localhost:8080,http://localhost:8080/user/external_ids"]
+    response = client.create_admin_tenant("SAMPLE",
+                                          "XXX@iu.edu", "First Name", "LastName", "email", "admin",
+                                          "1234",
+                                          contacts, redirect_uris, "https://domain.org/",
+                                          "openid profile email org.cilogon.userinfo", "domain.org",
+                                          "https://domain.org/static/favicon.png", "Galaxy Portal")
+    print(response)
+
+
+def get_tenant():
+    client_id = "custos-8p4baddxvbiusmjorjch-10000401"
+    response = client.get_tenant(client_token=token, client_id=client_id)
+    print(response)
+
+
+def update_tenant():
+    client_id = "custos-6nwoqodstpe5mvcq09lh-10000101"
+    contacts = ["8123915386"]
+    redirect_uris = ["https://custos.scigap.org/callback ", "http://127.0.0.1:8000/auth/callback/",
+                     "http://127.0.0.1:8000/"]
+    response = client.update_tenant(token, client_id, "Custos Portal",
+                                    "irjanith@gmail.com", "Isuru", "Ranawaka", "irjanith@gmail.com", "isjarana",
+                                    "Custos1234",
+                                    contacts, redirect_uris, "https://custos.scigap.org/",
+                                    "openid profile email org.cilogon.userinfo", "domain.org",
+                                    "https://custos.scigap.org/", "Custos Portal")
+    print(response)
+
+
+def add_tenant_roles():
+    roles = [{"name": "testing", "composite": False, "description": "testing realm"}]
+    response = client.add_tenant_roles(token, roles, False)
+    print(response)
+
+
+def add_protocol_mapper():
+    response = client.add_protocol_mapper(token, "phone_atr", "phone", "phone", "STRING", "USER_ATTRIBUTE", True, True,
+                                          True, False, False)
+    print(response)
+
+
+def get_child_tenants():
+    response = client.get_child_tenants(token, 0, 5, "ACTIVE")
+    print(response)
+
+
+def get_all_tenants():
+    response = admin_client.get_all_tenants(token, 0, 5, "ACTIVE")
+    print(response)
+
+
+def delete_tenant():
+    response = client.delete_tenant(token, "custos-pv3fqfs9z1hps0xily2t-10000000")
+    print(response)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/user_management_samples.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/user_management_samples.py
new file mode 100644
index 0000000..a7e3c81
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/samples/user_management_samples.py
@@ -0,0 +1,109 @@
+#  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.
+#
+import logging
+from custos.clients.user_management_client import UserManagementClient
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.clients.super_tenant_management_client import SuperTenantManagementClient
+
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = UserManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+admin_client = SuperTenantManagementClient(custos_settings)
+
+
+def register_user():
+    response = client.register_user(token, "TestingUser", "Jhon", "Smith", "12345", "jhon@iu.edu", True)
+    print(response)
+
+
+def register_and_enable_users():
+    response = id_client.authenticate(token, "isjarana", "Custos1234")
+
+    users = [
+        {
+            "username": "test123",
+            "first_name": "user1",
+            "last_name": "last",
+            "password": "1234",
+            "email": "irjanith1@gmail.com",
+            "temporary_password": True,
+            "realm_roles": [
+
+            ],
+            "client_roles": [
+
+            ],
+            "attributes": [
+
+            ]
+        }
+    ]
+
+    response = client.register_and_enable_users(response.accessToken, users)
+    print(response)
+
+
+def add_user_attributes():
+    response = id_client.authenticate(token, "isjarana", "Custos1234")
+    attributes = [
+        {
+            "key": "phone",
+            "values": ["8123915386"]
+        }
+    ]
+    users = ["janith"]
+    response = client.add_user_attributes(response.accessToken, attributes, users)
+    print(response)
+
+
+def delete_user_attributes():
+    response = id_client.authenticate(token, "isjarana", "Custos1234")
+    attributes = [
+        {
+            "key": "phone",
+            "values": ["8123915386"]
+        }
+    ]
+    users = ["janith"]
+    response = client.delete_user_attributes(response.accessToken, attributes, users)
+    print(response)
+
+
+def add_roles_to_user():
+    response = id_client.authenticate(token, "issa", "1234")
+    roles = ["testing"]
+    users = ["janith"]
+    response = client.add_roles_to_users(response.accessToken, users, roles, False)
+    print(response)
+
+
+def find_users():
+    response = client.find_users(token, 0, 3, username="isjarana")
+    print(response)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2.py
new file mode 100644
index 0000000..22b462f
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2.py
@@ -0,0 +1,361 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: AgentProfileService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='AgentProfileService.proto',
+  package='org.apache.custos.agent.profile.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x19\x41gentProfileService.proto\x12\'org.apache.custos.agent.profile.service\"\xff\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x44\n\x06status\x18\x02 \x01(\x0e\x32\x34.org.apache.custos.agent.profile.service.AgentStatus\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x18\n\x10last_modified_at\x18\x04 \x01(\x03\x12\r\n\x05roles\x18\x05 \x03(\t\x12K\n\nattributes\x18\x06 \x03(\x0b\x32\x37.org.apache.custos.agent.profile.service.AgentAttribute\x12\x1a\n\x12\x61gent_client_roles\x18\x08 \x03(\t\"8\n\x0e\x41gentAttribute\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"`\n\x0c\x41gentRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12=\n\x05\x61gent\x18\x02 \x01(\x0b\x32..org.apache.custos.agent.profile.service.Agent\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08*(\n\x0b\x41gentStatus\x12\x0b\n\x07\x45NABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x32\xf4\x03\n\x13\x41gentProfileService\x12t\n\x0b\x63reateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12t\n\x0bupdateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12~\n\x0b\x64\x65leteAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a\x38.org.apache.custos.agent.profile.service.OperationStatus\x12q\n\x08getAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.AgentB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_AGENTSTATUS = _descriptor.EnumDescriptor(
+  name='AgentStatus',
+  full_name='org.apache.custos.agent.profile.service.AgentStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ENABLED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DISABLED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=519,
+  serialized_end=559,
+)
+_sym_db.RegisterEnumDescriptor(_AGENTSTATUS)
+
+AgentStatus = enum_type_wrapper.EnumTypeWrapper(_AGENTSTATUS)
+ENABLED = 0
+DISABLED = 1
+
+
+
+_AGENT = _descriptor.Descriptor(
+  name='Agent',
+  full_name='org.apache.custos.agent.profile.service.Agent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.agent.profile.service.Agent.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.agent.profile.service.Agent.status', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='org.apache.custos.agent.profile.service.Agent.created_at', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_modified_at', full_name='org.apache.custos.agent.profile.service.Agent.last_modified_at', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='org.apache.custos.agent.profile.service.Agent.roles', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.agent.profile.service.Agent.attributes', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agent_client_roles', full_name='org.apache.custos.agent.profile.service.Agent.agent_client_roles', index=6,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=71,
+  serialized_end=326,
+)
+
+
+_AGENTATTRIBUTE = _descriptor.Descriptor(
+  name='AgentAttribute',
+  full_name='org.apache.custos.agent.profile.service.AgentAttribute',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.agent.profile.service.AgentAttribute.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.agent.profile.service.AgentAttribute.key', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.agent.profile.service.AgentAttribute.value', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=328,
+  serialized_end=384,
+)
+
+
+_AGENTREQUEST = _descriptor.Descriptor(
+  name='AgentRequest',
+  full_name='org.apache.custos.agent.profile.service.AgentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.agent.profile.service.AgentRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agent', full_name='org.apache.custos.agent.profile.service.AgentRequest.agent', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=386,
+  serialized_end=482,
+)
+
+
+_OPERATIONSTATUS = _descriptor.Descriptor(
+  name='OperationStatus',
+  full_name='org.apache.custos.agent.profile.service.OperationStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.agent.profile.service.OperationStatus.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=484,
+  serialized_end=517,
+)
+
+_AGENT.fields_by_name['status'].enum_type = _AGENTSTATUS
+_AGENT.fields_by_name['attributes'].message_type = _AGENTATTRIBUTE
+_AGENTREQUEST.fields_by_name['agent'].message_type = _AGENT
+DESCRIPTOR.message_types_by_name['Agent'] = _AGENT
+DESCRIPTOR.message_types_by_name['AgentAttribute'] = _AGENTATTRIBUTE
+DESCRIPTOR.message_types_by_name['AgentRequest'] = _AGENTREQUEST
+DESCRIPTOR.message_types_by_name['OperationStatus'] = _OPERATIONSTATUS
+DESCRIPTOR.enum_types_by_name['AgentStatus'] = _AGENTSTATUS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Agent = _reflection.GeneratedProtocolMessageType('Agent', (_message.Message,), {
+  'DESCRIPTOR' : _AGENT,
+  '__module__' : 'AgentProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.profile.service.Agent)
+  })
+_sym_db.RegisterMessage(Agent)
+
+AgentAttribute = _reflection.GeneratedProtocolMessageType('AgentAttribute', (_message.Message,), {
+  'DESCRIPTOR' : _AGENTATTRIBUTE,
+  '__module__' : 'AgentProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.profile.service.AgentAttribute)
+  })
+_sym_db.RegisterMessage(AgentAttribute)
+
+AgentRequest = _reflection.GeneratedProtocolMessageType('AgentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AGENTREQUEST,
+  '__module__' : 'AgentProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.profile.service.AgentRequest)
+  })
+_sym_db.RegisterMessage(AgentRequest)
+
+OperationStatus = _reflection.GeneratedProtocolMessageType('OperationStatus', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONSTATUS,
+  '__module__' : 'AgentProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.profile.service.OperationStatus)
+  })
+_sym_db.RegisterMessage(OperationStatus)
+
+
+DESCRIPTOR._options = None
+
+_AGENTPROFILESERVICE = _descriptor.ServiceDescriptor(
+  name='AgentProfileService',
+  full_name='org.apache.custos.agent.profile.service.AgentProfileService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=562,
+  serialized_end=1062,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createAgent',
+    full_name='org.apache.custos.agent.profile.service.AgentProfileService.createAgent',
+    index=0,
+    containing_service=None,
+    input_type=_AGENTREQUEST,
+    output_type=_AGENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateAgent',
+    full_name='org.apache.custos.agent.profile.service.AgentProfileService.updateAgent',
+    index=1,
+    containing_service=None,
+    input_type=_AGENTREQUEST,
+    output_type=_AGENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgent',
+    full_name='org.apache.custos.agent.profile.service.AgentProfileService.deleteAgent',
+    index=2,
+    containing_service=None,
+    input_type=_AGENTREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAgent',
+    full_name='org.apache.custos.agent.profile.service.AgentProfileService.getAgent',
+    index=3,
+    containing_service=None,
+    input_type=_AGENTREQUEST,
+    output_type=_AGENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_AGENTPROFILESERVICE)
+
+DESCRIPTOR.services_by_name['AgentProfileService'] = _AGENTPROFILESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2_grpc.py
new file mode 100644
index 0000000..dd0ce30
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/AgentProfileService_pb2_grpc.py
@@ -0,0 +1,182 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.AgentProfileService_pb2 as AgentProfileService__pb2
+
+
+class AgentProfileServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/createAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
+        self.updateAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/updateAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
+        self.deleteAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/deleteAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.OperationStatus.FromString,
+                )
+        self.getAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/getAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
+
+
+class AgentProfileServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_AgentProfileServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.createAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+            'updateAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+            'deleteAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.agent.profile.service.AgentProfileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class AgentProfileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/createAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/updateAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/deleteAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/getAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2.py
new file mode 100644
index 0000000..0b196b2
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ClusterManagementService.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ClusterManagementService.proto',
+  package='org.apache.custos.cluster.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001',
+  serialized_pb=b'\n\x1e\x43lusterManagementService.proto\x12,org.apache.custos.cluster.management.service\"D\n\x1bGetServerCertificateRequest\x12\x12\n\nsecretName\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\"3\n\x1cGetServerCertificateResponse\x12\x13\n\x0b\x63\x65rtificate\x18\x01 \x01(\t2\xd0\x01\n\x18\x43lusterManagementService\x12\xb3\x01\n\x1agetCustosServerCertificate\x12I.org.apache.custos.cluster.management.service.GetServerCertificateRequest\x1aJ.org.apache.custos.cluster.management.service.GetServerCertificateResponseB\x02P\x01\x62\x06proto3'
+)
+
+
+
+
+_GETSERVERCERTIFICATEREQUEST = _descriptor.Descriptor(
+  name='GetServerCertificateRequest',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='secretName', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.secretName', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+    _descriptor.FieldDescriptor(
+      name='namespace', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.namespace', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=80,
+  serialized_end=148,
+)
+
+
+_GETSERVERCERTIFICATERESPONSE = _descriptor.Descriptor(
+  name='GetServerCertificateResponse',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='certificate', full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse.certificate', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=150,
+  serialized_end=201,
+)
+
+DESCRIPTOR.message_types_by_name['GetServerCertificateRequest'] = _GETSERVERCERTIFICATEREQUEST
+DESCRIPTOR.message_types_by_name['GetServerCertificateResponse'] = _GETSERVERCERTIFICATERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetServerCertificateRequest = _reflection.GeneratedProtocolMessageType('GetServerCertificateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATEREQUEST,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateRequest)
+  })
+_sym_db.RegisterMessage(GetServerCertificateRequest)
+
+GetServerCertificateResponse = _reflection.GeneratedProtocolMessageType('GetServerCertificateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATERESPONSE,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateResponse)
+  })
+_sym_db.RegisterMessage(GetServerCertificateResponse)
+
+
+DESCRIPTOR._options = None
+
+_CLUSTERMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='ClusterManagementService',
+  full_name='org.apache.custos.cluster.management.service.ClusterManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  serialized_start=204,
+  serialized_end=412,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getCustosServerCertificate',
+    full_name='org.apache.custos.cluster.management.service.ClusterManagementService.getCustosServerCertificate',
+    index=0,
+    containing_service=None,
+    input_type=_GETSERVERCERTIFICATEREQUEST,
+    output_type=_GETSERVERCERTIFICATERESPONSE,
+    serialized_options=None,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CLUSTERMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['ClusterManagementService'] = _CLUSTERMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2_grpc.py
new file mode 100644
index 0000000..8cf201c
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ClusterManagementService_pb2_grpc.py
@@ -0,0 +1,46 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+import grpc
+
+import custos.server.core.ClusterManagementService_pb2 as ClusterManagementService__pb2
+
+
+class ClusterManagementServiceStub(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def __init__(self, channel):
+    """Constructor.
+
+    Args:
+      channel: A grpc.Channel.
+    """
+    self.getCustosServerCertificate = channel.unary_unary(
+        '/org.apache.custos.cluster.management.service.ClusterManagementService/getCustosServerCertificate',
+        request_serializer=ClusterManagementService__pb2.GetServerCertificateRequest.SerializeToString,
+        response_deserializer=ClusterManagementService__pb2.GetServerCertificateResponse.FromString,
+        )
+
+
+class ClusterManagementServiceServicer(object):
+  # missing associated documentation comment in .proto file
+  pass
+
+  def getCustosServerCertificate(self, request, context):
+    # missing associated documentation comment in .proto file
+    pass
+    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+    context.set_details('Method not implemented!')
+    raise NotImplementedError('Method not implemented!')
+
+
+def add_ClusterManagementServiceServicer_to_server(servicer, server):
+  rpc_method_handlers = {
+      'getCustosServerCertificate': grpc.unary_unary_rpc_method_handler(
+          servicer.getCustosServerCertificate,
+          request_deserializer=ClusterManagementService__pb2.GetServerCertificateRequest.FromString,
+          response_serializer=ClusterManagementService__pb2.GetServerCertificateResponse.SerializeToString,
+      ),
+  }
+  generic_handler = grpc.method_handlers_generic_handler(
+      'org.apache.custos.cluster.management.service.ClusterManagementService', rpc_method_handlers)
+  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2.py
new file mode 100644
index 0000000..257a183
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2.py
@@ -0,0 +1,1056 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: CredentialStoreService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='CredentialStoreService.proto',
+  package='org.apache.custos.credential.store.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1c\x43redentialStoreService.proto\x12*org.apache.custos.credential.store.service\"\x82\x02\n\x12\x43redentialMetadata\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06secret\x18\x03 \x01(\t\x12 \n\x18\x63lient_secret_expired_at\x18\x04 \x01(\x03\x12\x1b\n\x13\x63lient_id_issued_at\x18\x05 \x01(\x03\x12>\n\x04type\x18\x06 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\x12\x14\n\x0csuper_tenant\x18\x07 \x01(\x08\x12\x13\n\x0bsuper_admin\x18\x08 \x01(\x08\x12\x14\n\x0cinternal_sec\x18\x0b \x01(\t\"s\n\x14GetCredentialRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12>\n\x04type\x18\x03 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"+\n\x18GetAllCredentialsRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\"\xaa\x01\n\x19GetAllCredentialsResponse\x12S\n\x0bsecret_list\x18\x01 \x03(\x0b\x32>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x1c\n\x14requester_user_email\x18\x02 \x01(\t\x12\x1a\n\x12requester_username\x18\x03 \x01(\t\" \n\x0fOperationStatus\x12\r\n\x05state\x18\x01 \x01(\x08\"k\n\x17\x44\x65leteCredentialRequest\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12>\n\x04type\x18\x02 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"p\n\x1dGetOperationsMetadataResponse\x12O\n\x08metadata\x18\x01 \x03(\x0b\x32=.org.apache.custos.credential.store.service.OperationMetadata\"G\n\x1dGetNewCustosCredentialRequest\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12\x14\n\x0cperformed_by\x18\x02 \x01(\t\"J\n\x1eGetNewCustosCredentialResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\"7\n\x0cTokenRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x18\n\x10parent_client_id\x18\x02 \x01(\t\"&\n\x12GetOwnerIdResponse\x12\x10\n\x08owner_id\x18\x02 \x01(\x03\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01*U\n\x04Type\x12\n\n\x06\x43USTOS\x10\x00\x12\x07\n\x03IAM\x10\x01\x12\x0b\n\x07\x43ILOGON\x10\x02\x12\x0e\n\nINDIVIDUAL\x10\x03\x12\x10\n\x0c\x41GENT_CLIENT\x10\x04\x12\t\n\x05\x41GENT\x10\x05\x32\xac\x17\n\x16\x43redentialStoreService\x12\x8c\x01\n\rputCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x94\x01\n\x10\x64\x65leteCredential\x12\x43.org.apache.custos.credential.store.service.DeleteCredentialRequest\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x91\x01\n\rgetCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa0\x01\n\x11getAllCredentials\x12\x44.org.apache.custos.credential.store.service.GetAllCredentialsRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xab\x01\n\x14getOperationMetadata\x12H.org.apache.custos.credential.store.service.GetOperationsMetadataRequest\x1aI.org.apache.custos.credential.store.service.GetOperationsMetadataResponse\x12\xa3\x01\n\x16getNewCustosCredential\x12I.org.apache.custos.credential.store.service.GetNewCustosCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x8f\x01\n\x13getOwnerIdFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.GetOwnerIdResponse\x12\x98\x01\n\x1cgetCustosCredentialFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa3\x01\n\x1fgetCustosCredentialFromClientId\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x9d\x01\n\x1agetAllCredentialsFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x14getMasterCredentials\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xa0\x01\n\x1dgetAllCredentialsFromJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x88\x01\n\x13getBasicCredentials\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\x12\x97\x01\n\x15\x63reateAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x96\x01\n\x12getAgentCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x94\x01\n\x15\x64\x65leteAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\xa0\x01\n\x1dgetCredentialByAgentBasicAuth\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x1cgetCredentialByAgentJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x8e\x01\n\x15validateAgentJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a;.org.apache.custos.credential.store.service.OperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_TYPE = _descriptor.EnumDescriptor(
+  name='Type',
+  full_name='org.apache.custos.credential.store.service.Type',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='CUSTOS', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='IAM', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CILOGON', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='INDIVIDUAL', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='AGENT_CLIENT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='AGENT', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1578,
+  serialized_end=1663,
+)
+_sym_db.RegisterEnumDescriptor(_TYPE)
+
+Type = enum_type_wrapper.EnumTypeWrapper(_TYPE)
+CUSTOS = 0
+IAM = 1
+CILOGON = 2
+INDIVIDUAL = 3
+AGENT_CLIENT = 4
+AGENT = 5
+
+
+
+_CREDENTIALMETADATA = _descriptor.Descriptor(
+  name='CredentialMetadata',
+  full_name='org.apache.custos.credential.store.service.CredentialMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.credential.store.service.CredentialMetadata.owner_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.credential.store.service.CredentialMetadata.id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='secret', full_name='org.apache.custos.credential.store.service.CredentialMetadata.secret', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret_expired_at', full_name='org.apache.custos.credential.store.service.CredentialMetadata.client_secret_expired_at', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id_issued_at', full_name='org.apache.custos.credential.store.service.CredentialMetadata.client_id_issued_at', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.credential.store.service.CredentialMetadata.type', index=5,
+      number=6, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='super_tenant', full_name='org.apache.custos.credential.store.service.CredentialMetadata.super_tenant', index=6,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='super_admin', full_name='org.apache.custos.credential.store.service.CredentialMetadata.super_admin', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='internal_sec', full_name='org.apache.custos.credential.store.service.CredentialMetadata.internal_sec', index=8,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=77,
+  serialized_end=335,
+)
+
+
+_GETCREDENTIALREQUEST = _descriptor.Descriptor(
+  name='GetCredentialRequest',
+  full_name='org.apache.custos.credential.store.service.GetCredentialRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='ownerId', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.ownerId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=337,
+  serialized_end=452,
+)
+
+
+_GETALLCREDENTIALSREQUEST = _descriptor.Descriptor(
+  name='GetAllCredentialsRequest',
+  full_name='org.apache.custos.credential.store.service.GetAllCredentialsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='ownerId', full_name='org.apache.custos.credential.store.service.GetAllCredentialsRequest.ownerId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=454,
+  serialized_end=497,
+)
+
+
+_GETALLCREDENTIALSRESPONSE = _descriptor.Descriptor(
+  name='GetAllCredentialsResponse',
+  full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='secret_list', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.secret_list', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_user_email', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requester_user_email', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_username', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requester_username', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=500,
+  serialized_end=670,
+)
+
+
+_OPERATIONSTATUS = _descriptor.Descriptor(
+  name='OperationStatus',
+  full_name='org.apache.custos.credential.store.service.OperationStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='org.apache.custos.credential.store.service.OperationStatus.state', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=672,
+  serialized_end=704,
+)
+
+
+_DELETECREDENTIALREQUEST = _descriptor.Descriptor(
+  name='DeleteCredentialRequest',
+  full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest.owner_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest.type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=706,
+  serialized_end=813,
+)
+
+
+_GETOPERATIONSMETADATAREQUEST = _descriptor.Descriptor(
+  name='GetOperationsMetadataRequest',
+  full_name='org.apache.custos.credential.store.service.GetOperationsMetadataRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='trace_id', full_name='org.apache.custos.credential.store.service.GetOperationsMetadataRequest.trace_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=815,
+  serialized_end=863,
+)
+
+
+_OPERATIONMETADATA = _descriptor.Descriptor(
+  name='OperationMetadata',
+  full_name='org.apache.custos.credential.store.service.OperationMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='org.apache.custos.credential.store.service.OperationMetadata.event', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.credential.store.service.OperationMetadata.status', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='time_stamp', full_name='org.apache.custos.credential.store.service.OperationMetadata.time_stamp', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.credential.store.service.OperationMetadata.performed_by', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=865,
+  serialized_end=957,
+)
+
+
+_GETOPERATIONSMETADATARESPONSE = _descriptor.Descriptor(
+  name='GetOperationsMetadataResponse',
+  full_name='org.apache.custos.credential.store.service.GetOperationsMetadataResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.credential.store.service.GetOperationsMetadataResponse.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=959,
+  serialized_end=1071,
+)
+
+
+_GETNEWCUSTOSCREDENTIALREQUEST = _descriptor.Descriptor(
+  name='GetNewCustosCredentialRequest',
+  full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.owner_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.performed_by', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1073,
+  serialized_end=1144,
+)
+
+
+_GETNEWCUSTOSCREDENTIALRESPONSE = _descriptor.Descriptor(
+  name='GetNewCustosCredentialResponse',
+  full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1146,
+  serialized_end=1220,
+)
+
+
+_TOKENREQUEST = _descriptor.Descriptor(
+  name='TokenRequest',
+  full_name='org.apache.custos.credential.store.service.TokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.credential.store.service.TokenRequest.token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_client_id', full_name='org.apache.custos.credential.store.service.TokenRequest.parent_client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1222,
+  serialized_end=1277,
+)
+
+
+_GETOWNERIDRESPONSE = _descriptor.Descriptor(
+  name='GetOwnerIdResponse',
+  full_name='org.apache.custos.credential.store.service.GetOwnerIdResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.credential.store.service.GetOwnerIdResponse.owner_id', index=0,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1279,
+  serialized_end=1317,
+)
+
+
+_CREDENTIALS = _descriptor.Descriptor(
+  name='Credentials',
+  full_name='org.apache.custos.credential.store.service.Credentials',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.credential.store.service.Credentials.iam_client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.iam_client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_id', full_name='org.apache.custos.credential.store.service.Credentials.ci_logon_client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.ci_logon_client_secret', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_id', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_secret', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_id_issued_at', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_id_issued_at', index=6,
+      number=7, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_secret_expired_at', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_secret_expired_at', index=7,
+      number=8, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1320,
+  serialized_end=1576,
+)
+
+_CREDENTIALMETADATA.fields_by_name['type'].enum_type = _TYPE
+_GETCREDENTIALREQUEST.fields_by_name['type'].enum_type = _TYPE
+_GETALLCREDENTIALSRESPONSE.fields_by_name['secret_list'].message_type = _CREDENTIALMETADATA
+_DELETECREDENTIALREQUEST.fields_by_name['type'].enum_type = _TYPE
+_GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
+DESCRIPTOR.message_types_by_name['CredentialMetadata'] = _CREDENTIALMETADATA
+DESCRIPTOR.message_types_by_name['GetCredentialRequest'] = _GETCREDENTIALREQUEST
+DESCRIPTOR.message_types_by_name['GetAllCredentialsRequest'] = _GETALLCREDENTIALSREQUEST
+DESCRIPTOR.message_types_by_name['GetAllCredentialsResponse'] = _GETALLCREDENTIALSRESPONSE
+DESCRIPTOR.message_types_by_name['OperationStatus'] = _OPERATIONSTATUS
+DESCRIPTOR.message_types_by_name['DeleteCredentialRequest'] = _DELETECREDENTIALREQUEST
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataRequest'] = _GETOPERATIONSMETADATAREQUEST
+DESCRIPTOR.message_types_by_name['OperationMetadata'] = _OPERATIONMETADATA
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataResponse'] = _GETOPERATIONSMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['GetNewCustosCredentialRequest'] = _GETNEWCUSTOSCREDENTIALREQUEST
+DESCRIPTOR.message_types_by_name['GetNewCustosCredentialResponse'] = _GETNEWCUSTOSCREDENTIALRESPONSE
+DESCRIPTOR.message_types_by_name['TokenRequest'] = _TOKENREQUEST
+DESCRIPTOR.message_types_by_name['GetOwnerIdResponse'] = _GETOWNERIDRESPONSE
+DESCRIPTOR.message_types_by_name['Credentials'] = _CREDENTIALS
+DESCRIPTOR.enum_types_by_name['Type'] = _TYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CredentialMetadata = _reflection.GeneratedProtocolMessageType('CredentialMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _CREDENTIALMETADATA,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.CredentialMetadata)
+  })
+_sym_db.RegisterMessage(CredentialMetadata)
+
+GetCredentialRequest = _reflection.GeneratedProtocolMessageType('GetCredentialRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCREDENTIALREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetCredentialRequest)
+  })
+_sym_db.RegisterMessage(GetCredentialRequest)
+
+GetAllCredentialsRequest = _reflection.GeneratedProtocolMessageType('GetAllCredentialsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLCREDENTIALSREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetAllCredentialsRequest)
+  })
+_sym_db.RegisterMessage(GetAllCredentialsRequest)
+
+GetAllCredentialsResponse = _reflection.GeneratedProtocolMessageType('GetAllCredentialsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLCREDENTIALSRESPONSE,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetAllCredentialsResponse)
+  })
+_sym_db.RegisterMessage(GetAllCredentialsResponse)
+
+OperationStatus = _reflection.GeneratedProtocolMessageType('OperationStatus', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONSTATUS,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.OperationStatus)
+  })
+_sym_db.RegisterMessage(OperationStatus)
+
+DeleteCredentialRequest = _reflection.GeneratedProtocolMessageType('DeleteCredentialRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETECREDENTIALREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.DeleteCredentialRequest)
+  })
+_sym_db.RegisterMessage(DeleteCredentialRequest)
+
+GetOperationsMetadataRequest = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATAREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetOperationsMetadataRequest)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataRequest)
+
+OperationMetadata = _reflection.GeneratedProtocolMessageType('OperationMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONMETADATA,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.OperationMetadata)
+  })
+_sym_db.RegisterMessage(OperationMetadata)
+
+GetOperationsMetadataResponse = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATARESPONSE,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetOperationsMetadataResponse)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataResponse)
+
+GetNewCustosCredentialRequest = _reflection.GeneratedProtocolMessageType('GetNewCustosCredentialRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETNEWCUSTOSCREDENTIALREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetNewCustosCredentialRequest)
+  })
+_sym_db.RegisterMessage(GetNewCustosCredentialRequest)
+
+GetNewCustosCredentialResponse = _reflection.GeneratedProtocolMessageType('GetNewCustosCredentialResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETNEWCUSTOSCREDENTIALRESPONSE,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetNewCustosCredentialResponse)
+  })
+_sym_db.RegisterMessage(GetNewCustosCredentialResponse)
+
+TokenRequest = _reflection.GeneratedProtocolMessageType('TokenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TOKENREQUEST,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.TokenRequest)
+  })
+_sym_db.RegisterMessage(TokenRequest)
+
+GetOwnerIdResponse = _reflection.GeneratedProtocolMessageType('GetOwnerIdResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETOWNERIDRESPONSE,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.GetOwnerIdResponse)
+  })
+_sym_db.RegisterMessage(GetOwnerIdResponse)
+
+Credentials = _reflection.GeneratedProtocolMessageType('Credentials', (_message.Message,), {
+  'DESCRIPTOR' : _CREDENTIALS,
+  '__module__' : 'CredentialStoreService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.credential.store.service.Credentials)
+  })
+_sym_db.RegisterMessage(Credentials)
+
+
+DESCRIPTOR._options = None
+
+_CREDENTIALSTORESERVICE = _descriptor.ServiceDescriptor(
+  name='CredentialStoreService',
+  full_name='org.apache.custos.credential.store.service.CredentialStoreService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1666,
+  serialized_end=4654,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='putCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.putCredential',
+    index=0,
+    containing_service=None,
+    input_type=_CREDENTIALMETADATA,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.deleteCredential',
+    index=1,
+    containing_service=None,
+    input_type=_DELETECREDENTIALREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getCredential',
+    index=2,
+    containing_service=None,
+    input_type=_GETCREDENTIALREQUEST,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllCredentials',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getAllCredentials',
+    index=3,
+    containing_service=None,
+    input_type=_GETALLCREDENTIALSREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOperationMetadata',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getOperationMetadata',
+    index=4,
+    containing_service=None,
+    input_type=_GETOPERATIONSMETADATAREQUEST,
+    output_type=_GETOPERATIONSMETADATARESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getNewCustosCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getNewCustosCredential',
+    index=5,
+    containing_service=None,
+    input_type=_GETNEWCUSTOSCREDENTIALREQUEST,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOwnerIdFromToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getOwnerIdFromToken',
+    index=6,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_GETOWNERIDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCustosCredentialFromToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getCustosCredentialFromToken',
+    index=7,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCustosCredentialFromClientId',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getCustosCredentialFromClientId',
+    index=8,
+    containing_service=None,
+    input_type=_GETCREDENTIALREQUEST,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllCredentialsFromToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getAllCredentialsFromToken',
+    index=9,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getMasterCredentials',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getMasterCredentials',
+    index=10,
+    containing_service=None,
+    input_type=_GETCREDENTIALREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllCredentialsFromJWTToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getAllCredentialsFromJWTToken',
+    index=11,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getBasicCredentials',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getBasicCredentials',
+    index=12,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_CREDENTIALS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createAgentCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.createAgentCredential',
+    index=13,
+    containing_service=None,
+    input_type=_CREDENTIALMETADATA,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAgentCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getAgentCredential',
+    index=14,
+    containing_service=None,
+    input_type=_GETCREDENTIALREQUEST,
+    output_type=_CREDENTIALMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgentCredential',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.deleteAgentCredential',
+    index=15,
+    containing_service=None,
+    input_type=_CREDENTIALMETADATA,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialByAgentBasicAuth',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getCredentialByAgentBasicAuth',
+    index=16,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialByAgentJWTToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.getCredentialByAgentJWTToken',
+    index=17,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_GETALLCREDENTIALSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='validateAgentJWTToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.validateAgentJWTToken',
+    index=18,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CREDENTIALSTORESERVICE)
+
+DESCRIPTOR.services_by_name['CredentialStoreService'] = _CREDENTIALSTORESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2_grpc.py
new file mode 100644
index 0000000..cb975e5
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/CredentialStoreService_pb2_grpc.py
@@ -0,0 +1,677 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.CredentialStoreService_pb2 as CredentialStoreService__pb2
+
+
+class CredentialStoreServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.putCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/putCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.deleteCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/deleteCredential',
+                request_serializer=CredentialStoreService__pb2.DeleteCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.getCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredential',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAllCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentials',
+                request_serializer=CredentialStoreService__pb2.GetAllCredentialsRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getOperationMetadata = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getOperationMetadata',
+                request_serializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.FromString,
+                )
+        self.getNewCustosCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getNewCustosCredential',
+                request_serializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getOwnerIdFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getOwnerIdFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetOwnerIdResponse.FromString,
+                )
+        self.getCustosCredentialFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getCustosCredentialFromClientId = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromClientId',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAllCredentialsFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getMasterCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getMasterCredentials',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getAllCredentialsFromJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getBasicCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getBasicCredentials',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
+                )
+        self.createAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/createAgentCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAgentCredential',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.deleteAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/deleteAgentCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.getCredentialByAgentBasicAuth = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentBasicAuth',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getCredentialByAgentJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.validateAgentJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/validateAgentJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+
+
+class CredentialStoreServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def putCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOperationMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getNewCustosCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOwnerIdFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCustosCredentialFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCustosCredentialFromClientId(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllCredentialsFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getMasterCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllCredentialsFromJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getBasicCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentialByAgentBasicAuth(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentialByAgentJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def validateAgentJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_CredentialStoreServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'putCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.putCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredential,
+                    request_deserializer=CredentialStoreService__pb2.DeleteCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAllCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentials,
+                    request_deserializer=CredentialStoreService__pb2.GetAllCredentialsRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOperationMetadata,
+                    request_deserializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.SerializeToString,
+            ),
+            'getNewCustosCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getNewCustosCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getOwnerIdFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOwnerIdFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetOwnerIdResponse.SerializeToString,
+            ),
+            'getCustosCredentialFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosCredentialFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getCustosCredentialFromClientId': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosCredentialFromClientId,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAllCredentialsFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentialsFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getMasterCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getMasterCredentials,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getAllCredentialsFromJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentialsFromJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getBasicCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getBasicCredentials,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
+            ),
+            'createAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.createAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'deleteAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getCredentialByAgentBasicAuth': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialByAgentBasicAuth,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getCredentialByAgentJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialByAgentJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'validateAgentJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.validateAgentJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.credential.store.service.CredentialStoreService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class CredentialStoreService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def putCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/putCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/deleteCredential',
+            CredentialStoreService__pb2.DeleteCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredential',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentials',
+            CredentialStoreService__pb2.GetAllCredentialsRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOperationMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getOperationMetadata',
+            CredentialStoreService__pb2.GetOperationsMetadataRequest.SerializeToString,
+            CredentialStoreService__pb2.GetOperationsMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getNewCustosCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getNewCustosCredential',
+            CredentialStoreService__pb2.GetNewCustosCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOwnerIdFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getOwnerIdFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetOwnerIdResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCustosCredentialFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCustosCredentialFromClientId(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromClientId',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentialsFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getMasterCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getMasterCredentials',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentialsFromJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getBasicCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getBasicCredentials',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.Credentials.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/createAgentCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAgentCredential',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/deleteAgentCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialByAgentBasicAuth(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentBasicAuth',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialByAgentJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def validateAgentJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/validateAgentJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2.py
new file mode 100644
index 0000000..5286ff3
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2.py
@@ -0,0 +1,1007 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: FederatedAuthenticationService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='FederatedAuthenticationService.proto',
+  package='org.apache.custos.federated.authentication.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n$FederatedAuthenticationService.proto\x12\x32org.apache.custos.federated.authentication.service\x1a\x1cgoogle/protobuf/struct.proto\"\xbe\x01\n\x0e\x43lientMetadata\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0btenant_name\x18\x02 \x01(\t\x12\r\n\x05scope\x18\x03 \x03(\t\x12\x12\n\ntenant_uRI\x18\x04 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x05 \x03(\t\x12\x0f\n\x07\x63omment\x18\x06 \x01(\t\x12\x15\n\rredirect_uRIs\x18\x07 \x03(\t\x12\x11\n\tclient_id\x18\x08 \x01(\t\x12\x14\n\x0cperformed_by\x18\t \x01(\t\"\xa2\x01\n\x16RegisterClientResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\x03 \x01(\x03\x12 \n\x18\x63lient_secret_expires_at\x18\x04 \x01(\x03\x12\x1f\n\x17\x63lient_registration_uri\x18\x05 \x01(\t\"8\n\x10GetClientRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\"\xfe\x01\n\x11GetClientResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x15\n\rredirect_uRIs\x18\x03 \x03(\t\x12\x13\n\x0bgrant_types\x18\x04 \x03(\t\x12\r\n\x05scope\x18\x05 \x03(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\x06 \x01(\x03\x12\x0f\n\x07\x63omment\x18\x07 \x01(\t\x12\x15\n\rclient_secret\x18\x08 \x01(\t\x12 \n\x18\x63lient_secret_expires_at\x18\t \x01(\x03\x12\x1f\n\x17\x63lient_registration_uri\x18\n \x01(\t\"Q\n\x13\x44\x65leteClientRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\"\x07\n\x05\x45mpty\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"x\n\x1dGetOperationsMetadataResponse\x12W\n\x08metadata\x18\x01 \x03(\x0b\x32\x45.org.apache.custos.federated.authentication.service.OperationMetadata\"\xb3\x01\n\x18\x43\x61\x63heManipulationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x17\n\x0finstitution_ids\x18\x02 \x03(\t\x12V\n\x04type\x18\x03 \x01(\x0e\x32H.org.apache.custos.federated.authentication.service.InstitutionCacheType\x12\x13\n\x0bperformedBy\x18\x04 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\x1e\n\x1cInstitutionOperationResponse\"a\n\x0bInstitution\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\x19\n\x11organization_name\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\x0e\n\x06rand_s\x18\x04 \x01(\x08\"2\n\x1cGetInstitutionsIdsAsResponse\x12\x12\n\nentity_ids\x18\x01 \x03(\t\"p\n\x17GetInstitutionsResponse\x12U\n\x0cinstitutions\x18\x02 \x03(\x0b\x32?.org.apache.custos.federated.authentication.service.Institution*3\n\x14InstitutionCacheType\x12\r\n\tWHITELIST\x10\x00\x12\x0c\n\x08\x42\x41\x43KLIST\x10\x01\x32\xce\x0b\n\x1e\x46\x65\x64\x65ratedAuthenticationService\x12\x9b\x01\n\taddClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1aJ.org.apache.custos.federated.authentication.service.RegisterClientResponse\x12\x8d\x01\n\x0cupdateClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\x98\x01\n\tgetClient\x12\x44.org.apache.custos.federated.authentication.service.GetClientRequest\x1a\x45.org.apache.custos.federated.authentication.service.GetClientResponse\x12\x92\x01\n\x0c\x64\x65leteClient\x12G.org.apache.custos.federated.authentication.service.DeleteClientRequest\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\xbb\x01\n\x14getOperationMetadata\x12P.org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest\x1aQ.org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse\x12\x96\x01\n\naddToCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\x12\x9b\x01\n\x0fremoveFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\x12\xa9\x01\n\x0cgetFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\x12\xac\x01\n\x0fgetInstitutions\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponseB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
+
+_INSTITUTIONCACHETYPE = _descriptor.EnumDescriptor(
+  name='InstitutionCacheType',
+  full_name='org.apache.custos.federated.authentication.service.InstitutionCacheType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='WHITELIST', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='BACKLIST', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1658,
+  serialized_end=1709,
+)
+_sym_db.RegisterEnumDescriptor(_INSTITUTIONCACHETYPE)
+
+InstitutionCacheType = enum_type_wrapper.EnumTypeWrapper(_INSTITUTIONCACHETYPE)
+WHITELIST = 0
+BACKLIST = 1
+
+
+
+_CLIENTMETADATA = _descriptor.Descriptor(
+  name='ClientMetadata',
+  full_name='org.apache.custos.federated.authentication.service.ClientMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_name', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.scope', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_uRI', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_uRI', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='contacts', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.contacts', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='comment', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.comment', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uRIs', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.redirect_uRIs', index=6,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.client_id', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.performed_by', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=123,
+  serialized_end=313,
+)
+
+
+_REGISTERCLIENTRESPONSE = _descriptor.Descriptor(
+  name='RegisterClientResponse',
+  full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id_issued_at', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_id_issued_at', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret_expires_at', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_secret_expires_at', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_registration_uri', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_registration_uri', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=316,
+  serialized_end=478,
+)
+
+
+_GETCLIENTREQUEST = _descriptor.Descriptor(
+  name='GetClientRequest',
+  full_name='org.apache.custos.federated.authentication.service.GetClientRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=480,
+  serialized_end=536,
+)
+
+
+_GETCLIENTRESPONSE = _descriptor.Descriptor(
+  name='GetClientResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetClientResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_name', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uRIs', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.redirect_uRIs', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='grant_types', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.grant_types', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.scope', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id_issued_at', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_id_issued_at', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='comment', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.comment', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_secret', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret_expires_at', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_secret_expires_at', index=8,
+      number=9, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_registration_uri', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_registration_uri', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=539,
+  serialized_end=793,
+)
+
+
+_DELETECLIENTREQUEST = _descriptor.Descriptor(
+  name='DeleteClientRequest',
+  full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.performed_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=795,
+  serialized_end=876,
+)
+
+
+_EMPTY = _descriptor.Descriptor(
+  name='Empty',
+  full_name='org.apache.custos.federated.authentication.service.Empty',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=878,
+  serialized_end=885,
+)
+
+
+_GETOPERATIONSMETADATAREQUEST = _descriptor.Descriptor(
+  name='GetOperationsMetadataRequest',
+  full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='trace_id', full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest.trace_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=887,
+  serialized_end=935,
+)
+
+
+_OPERATIONMETADATA = _descriptor.Descriptor(
+  name='OperationMetadata',
+  full_name='org.apache.custos.federated.authentication.service.OperationMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.event', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.status', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='time_stamp', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.time_stamp', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.performed_by', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=937,
+  serialized_end=1029,
+)
+
+
+_GETOPERATIONSMETADATARESPONSE = _descriptor.Descriptor(
+  name='GetOperationsMetadataResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1031,
+  serialized_end=1151,
+)
+
+
+_CACHEMANIPULATIONREQUEST = _descriptor.Descriptor(
+  name='CacheManipulationRequest',
+  full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='institution_ids', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.institution_ids', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.performedBy', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1154,
+  serialized_end=1333,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.federated.authentication.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.federated.authentication.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1335,
+  serialized_end=1359,
+)
+
+
+_INSTITUTIONOPERATIONRESPONSE = _descriptor.Descriptor(
+  name='InstitutionOperationResponse',
+  full_name='org.apache.custos.federated.authentication.service.InstitutionOperationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1361,
+  serialized_end=1391,
+)
+
+
+_INSTITUTION = _descriptor.Descriptor(
+  name='Institution',
+  full_name='org.apache.custos.federated.authentication.service.Institution',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity_id', full_name='org.apache.custos.federated.authentication.service.Institution.entity_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_name', full_name='org.apache.custos.federated.authentication.service.Institution.organization_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='org.apache.custos.federated.authentication.service.Institution.display_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='rand_s', full_name='org.apache.custos.federated.authentication.service.Institution.rand_s', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1393,
+  serialized_end=1490,
+)
+
+
+_GETINSTITUTIONSIDSASRESPONSE = _descriptor.Descriptor(
+  name='GetInstitutionsIdsAsResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity_ids', full_name='org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse.entity_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1492,
+  serialized_end=1542,
+)
+
+
+_GETINSTITUTIONSRESPONSE = _descriptor.Descriptor(
+  name='GetInstitutionsResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetInstitutionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='institutions', full_name='org.apache.custos.federated.authentication.service.GetInstitutionsResponse.institutions', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1544,
+  serialized_end=1656,
+)
+
+_GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
+_CACHEMANIPULATIONREQUEST.fields_by_name['type'].enum_type = _INSTITUTIONCACHETYPE
+_GETINSTITUTIONSRESPONSE.fields_by_name['institutions'].message_type = _INSTITUTION
+DESCRIPTOR.message_types_by_name['ClientMetadata'] = _CLIENTMETADATA
+DESCRIPTOR.message_types_by_name['RegisterClientResponse'] = _REGISTERCLIENTRESPONSE
+DESCRIPTOR.message_types_by_name['GetClientRequest'] = _GETCLIENTREQUEST
+DESCRIPTOR.message_types_by_name['GetClientResponse'] = _GETCLIENTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteClientRequest'] = _DELETECLIENTREQUEST
+DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataRequest'] = _GETOPERATIONSMETADATAREQUEST
+DESCRIPTOR.message_types_by_name['OperationMetadata'] = _OPERATIONMETADATA
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataResponse'] = _GETOPERATIONSMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['CacheManipulationRequest'] = _CACHEMANIPULATIONREQUEST
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['InstitutionOperationResponse'] = _INSTITUTIONOPERATIONRESPONSE
+DESCRIPTOR.message_types_by_name['Institution'] = _INSTITUTION
+DESCRIPTOR.message_types_by_name['GetInstitutionsIdsAsResponse'] = _GETINSTITUTIONSIDSASRESPONSE
+DESCRIPTOR.message_types_by_name['GetInstitutionsResponse'] = _GETINSTITUTIONSRESPONSE
+DESCRIPTOR.enum_types_by_name['InstitutionCacheType'] = _INSTITUTIONCACHETYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ClientMetadata = _reflection.GeneratedProtocolMessageType('ClientMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _CLIENTMETADATA,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.ClientMetadata)
+  })
+_sym_db.RegisterMessage(ClientMetadata)
+
+RegisterClientResponse = _reflection.GeneratedProtocolMessageType('RegisterClientResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTERCLIENTRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.RegisterClientResponse)
+  })
+_sym_db.RegisterMessage(RegisterClientResponse)
+
+GetClientRequest = _reflection.GeneratedProtocolMessageType('GetClientRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCLIENTREQUEST,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetClientRequest)
+  })
+_sym_db.RegisterMessage(GetClientRequest)
+
+GetClientResponse = _reflection.GeneratedProtocolMessageType('GetClientResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCLIENTRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetClientResponse)
+  })
+_sym_db.RegisterMessage(GetClientResponse)
+
+DeleteClientRequest = _reflection.GeneratedProtocolMessageType('DeleteClientRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETECLIENTREQUEST,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.DeleteClientRequest)
+  })
+_sym_db.RegisterMessage(DeleteClientRequest)
+
+Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
+  'DESCRIPTOR' : _EMPTY,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.Empty)
+  })
+_sym_db.RegisterMessage(Empty)
+
+GetOperationsMetadataRequest = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATAREQUEST,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataRequest)
+
+OperationMetadata = _reflection.GeneratedProtocolMessageType('OperationMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONMETADATA,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.OperationMetadata)
+  })
+_sym_db.RegisterMessage(OperationMetadata)
+
+GetOperationsMetadataResponse = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATARESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataResponse)
+
+CacheManipulationRequest = _reflection.GeneratedProtocolMessageType('CacheManipulationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CACHEMANIPULATIONREQUEST,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.CacheManipulationRequest)
+  })
+_sym_db.RegisterMessage(CacheManipulationRequest)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+InstitutionOperationResponse = _reflection.GeneratedProtocolMessageType('InstitutionOperationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _INSTITUTIONOPERATIONRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.InstitutionOperationResponse)
+  })
+_sym_db.RegisterMessage(InstitutionOperationResponse)
+
+Institution = _reflection.GeneratedProtocolMessageType('Institution', (_message.Message,), {
+  'DESCRIPTOR' : _INSTITUTION,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.Institution)
+  })
+_sym_db.RegisterMessage(Institution)
+
+GetInstitutionsIdsAsResponse = _reflection.GeneratedProtocolMessageType('GetInstitutionsIdsAsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTITUTIONSIDSASRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse)
+  })
+_sym_db.RegisterMessage(GetInstitutionsIdsAsResponse)
+
+GetInstitutionsResponse = _reflection.GeneratedProtocolMessageType('GetInstitutionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTITUTIONSRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetInstitutionsResponse)
+  })
+_sym_db.RegisterMessage(GetInstitutionsResponse)
+
+
+DESCRIPTOR._options = None
+
+_FEDERATEDAUTHENTICATIONSERVICE = _descriptor.ServiceDescriptor(
+  name='FederatedAuthenticationService',
+  full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1712,
+  serialized_end=3198,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='addClient',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.addClient',
+    index=0,
+    containing_service=None,
+    input_type=_CLIENTMETADATA,
+    output_type=_REGISTERCLIENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateClient',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.updateClient',
+    index=1,
+    containing_service=None,
+    input_type=_CLIENTMETADATA,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getClient',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getClient',
+    index=2,
+    containing_service=None,
+    input_type=_GETCLIENTREQUEST,
+    output_type=_GETCLIENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteClient',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.deleteClient',
+    index=3,
+    containing_service=None,
+    input_type=_DELETECLIENTREQUEST,
+    output_type=_EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOperationMetadata',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getOperationMetadata',
+    index=4,
+    containing_service=None,
+    input_type=_GETOPERATIONSMETADATAREQUEST,
+    output_type=_GETOPERATIONSMETADATARESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addToCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.addToCache',
+    index=5,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeFromCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.removeFromCache',
+    index=6,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getFromCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getFromCache',
+    index=7,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_GETINSTITUTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getInstitutions',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getInstitutions',
+    index=8,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_GETINSTITUTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_FEDERATEDAUTHENTICATIONSERVICE)
+
+DESCRIPTOR.services_by_name['FederatedAuthenticationService'] = _FEDERATEDAUTHENTICATIONSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2_grpc.py
new file mode 100644
index 0000000..09940f5
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/FederatedAuthenticationService_pb2_grpc.py
@@ -0,0 +1,347 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
+
+
+class FederatedAuthenticationServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addClient',
+                request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.RegisterClientResponse.FromString,
+                )
+        self.updateClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/updateClient',
+                request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
+                )
+        self.getClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getClient',
+                request_serializer=FederatedAuthenticationService__pb2.GetClientRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetClientResponse.FromString,
+                )
+        self.deleteClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/deleteClient',
+                request_serializer=FederatedAuthenticationService__pb2.DeleteClientRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
+                )
+        self.getOperationMetadata = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getOperationMetadata',
+                request_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.FromString,
+                )
+        self.addToCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addToCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.removeFromCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/removeFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.getFromCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+        self.getInstitutions = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getInstitutions',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+
+
+class FederatedAuthenticationServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def addClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOperationMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addToCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInstitutions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_FederatedAuthenticationServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'addClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.addClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.RegisterClientResponse.SerializeToString,
+            ),
+            'updateClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
+            ),
+            'getClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.getClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.GetClientRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetClientResponse.SerializeToString,
+            ),
+            'deleteClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.DeleteClientRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
+            ),
+            'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOperationMetadata,
+                    request_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.SerializeToString,
+            ),
+            'addToCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.addToCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'removeFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'getFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.getFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+            'getInstitutions': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInstitutions,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.federated.authentication.service.FederatedAuthenticationService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class FederatedAuthenticationService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addClient',
+            FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+            FederatedAuthenticationService__pb2.RegisterClientResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/updateClient',
+            FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+            FederatedAuthenticationService__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getClient',
+            FederatedAuthenticationService__pb2.GetClientRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetClientResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/deleteClient',
+            FederatedAuthenticationService__pb2.DeleteClientRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOperationMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getOperationMetadata',
+            FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addToCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addToCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/removeFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInstitutions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getInstitutions',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2.py
new file mode 100644
index 0000000..9024a42
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2.py
@@ -0,0 +1,3689 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: IamAdminService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='IamAdminService.proto',
+  package='org.apache.custos.iam.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15IamAdminService.proto\x12\x1dorg.apache.custos.iam.service\x1a\x1bgoogle/protobuf/empty.proto\"\x90\x02\n\x12SetUpTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0btenant_name\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x03 \x01(\t\x12\x17\n\x0f\x61\x64min_firstname\x18\x04 \x01(\t\x12\x16\n\x0e\x61\x64min_lastname\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x06 \x01(\t\x12\x16\n\x0e\x61\x64min_password\x18\x07 \x01(\t\x12\x12\n\ntenant_uRL\x18\x08 \x01(\t\x12\x17\n\x0frequester_email\x18\t \x01(\t\x12\x15\n\rredirect_uRIs\x18\n \x03(\t\x12\x18\n\x10\x63ustos_client_id\x18\x0b \x01(\t\"\xdc\x02\n\x1b\x43onfigureFederateIDPRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.org.apache.custos.iam.service.FederatedIDPs\x12\x11\n\tclient_iD\x18\x03 \x01(\t\x12\x12\n\nclient_sec\x18\x04 \x01(\t\x12]\n\nconfig_map\x18\x05 \x03(\x0b\x32I.org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry\x12\x17\n\x0frequester_email\x18\x06 \x01(\t\x12\x0e\n\x06idp_id\x18\x07 \x01(\t\x12\r\n\x05scope\x18\x08 \x01(\t\x1a\x30\n\x0e\x43onfigMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"%\n\x13\x46\x65\x64\x65rateIDPResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08\"?\n\x13SetUpTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\"X\n\x1aIsUsernameAvailableRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tuser_name\x18\x03 \x01(\t\"$\n\x10\x43heckingResponse\x12\x10\n\x08is_exist\x18\x01 \x01(\x08\"\xc0\x02\n\x12UserRepresentation\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x12\n\nfirst_name\x18\x04 \x01(\t\x12\x11\n\tlast_name\x18\x05 \x01(\t\x12\x10\n\x08password\x18\x06 \x01(\t\x12\r\n\x05\x65mail\x18\x07 \x01(\t\x12\x1a\n\x12temporary_password\x18\x08 \x01(\x08\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\n \x03(\t\x12@\n\nattributes\x18\x0b \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05state\x18\x0c \x01(\t\x12\x15\n\rcreation_time\x18\r \x01(\x01\x12\x15\n\rlast_login_at\x18\x0e \x01(\x01\"\xcc\x02\n\x13GroupRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12@\n\nattributes\x18\x05 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12@\n\x05users\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x46\n\nsub_groups\x18\x07 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x0f\n\x07ownerId\x18\t \x01(\t\"\xbc\x01\n\x13RegisterUserRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tclient_id\x18\x03 \x01(\t\x12\x12\n\nclient_sec\x18\x04 \x01(\t\x12?\n\x04user\x18\x05 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"\xaa\x01\n\x14RegisterUsersRequest\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0cperformed_by\x18\x05 \x01(\t\"-\n\x14RegisterUserResponse\x12\x15\n\ris_registered\x18\x01 \x01(\x08\"\x7f\n\x15RegisterUsersResponse\x12\x1d\n\x15\x61ll_useres_registered\x18\x01 \x01(\x08\x12G\n\x0c\x66\x61iled_users\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"h\n\x12UserSearchMetadata\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x12\n\nfirst_name\x18\x02 \x01(\t\x12\x11\n\tlast_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\n\n\x02id\x18\x05 \x01(\t\"\xc2\x01\n\x10\x46indUsersRequest\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\xba\x01\n\x11UserSearchRequest\x12?\n\x04user\x18\x01 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x12\n\nclient_sec\x18\x05 \x01(\t\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"U\n\x11\x46indUsersResponse\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x87\x01\n\x11ResetUserPassword\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x12\n\nclient_sec\x18\x06 \x01(\t\"\xad\x01\n\x16\x44\x65leteUserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x14\n\x0c\x63lient_roles\x18\x03 \x03(\t\x12\r\n\x05roles\x18\x04 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\n\n\x02id\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41\x64\x64UserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tusernames\x18\x02 \x03(\t\x12\r\n\x05roles\x18\x03 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63lient_level\x18\x06 \x01(\x08\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\x0e\n\x06\x61gents\x18\x08 \x03(\t\"\x84\x01\n\x18UpdateUserProfileRequest\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x1f\n\x0f\x41\x64\x64UserResponse\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"c\n\x1dGetOperationsMetadataResponse\x12\x42\n\x08metadata\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.iam.service.OperationMetadata\"(\n\x13\x44\x65leteTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"\x8f\x01\n\x0f\x41\x64\x64RolesRequest\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\x14\n\x0c\x63lient_level\x18\x02 \x01(\x08\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\"M\n\x0fGetRolesRequest\x12\x14\n\x0c\x63lient_level\x18\x01 \x01(\x08\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t\"V\n\x12RoleRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x11\n\tcomposite\x18\x03 \x01(\x08\x12\n\n\x02id\x18\x04 \x01(\t\"\x90\x01\n\x11\x44\x65leteRoleRequest\x12\x14\n\x0c\x63lient_level\x18\x01 \x01(\x08\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t\x12?\n\x04role\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\"[\n\x08\x41llRoles\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\r\n\x05scope\x18\x02 \x01(\t\"\x88\x03\n\x18\x41\x64\x64ProtocolMapperRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x61ttribute_name\x18\x02 \x01(\t\x12\x12\n\nclaim_name\x18\x03 \x01(\t\x12\x41\n\nclaim_type\x18\x04 \x01(\x0e\x32-.org.apache.custos.iam.service.ClaimJSONTypes\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12\x11\n\tclient_id\x18\x07 \x01(\t\x12?\n\x0bmapper_type\x18\x08 \x01(\x0e\x32*.org.apache.custos.iam.service.MapperTypes\x12\x17\n\x0f\x61\x64\x64_to_id_token\x18\t \x01(\x08\x12\x1b\n\x13\x61\x64\x64_to_access_token\x18\n \x01(\x08\x12\x18\n\x10\x61\x64\x64_to_user_info\x18\x0b \x01(\x08\x12\x14\n\x0cmulti_valued\x18\x0c \x01(\x08\x12\"\n\x1a\x61ggregate_attribute_values\x18\r \x01(\x08\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\xcc\x01\n\x18\x41\x64\x64UserAttributesRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\"\xce\x01\n\x1a\x44\x65leteUserAttributeRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\",\n\rUserAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0e\n\x06values\x18\x02 \x03(\t\"\x8e\x01\n\x17\x45ventPersistenceRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x64min_event\x18\x02 \x01(\x08\x12\r\n\x05\x65vent\x18\x03 \x01(\t\x12\x0e\n\x06\x65nable\x18\x04 \x01(\x08\x12\x18\n\x10persistence_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"\xb4\x01\n\rGroupsRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x42\n\x06groups\x18\x06 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xbe\x01\n\x0cGroupRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\n\n\x02id\x18\x06 \x01(\t\x12\x41\n\x05group\x18\x07 \x01(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"T\n\x0eGroupsResponse\x12\x42\n\x06groups\x18\x01 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xb7\x01\n\x17UserGroupMappingRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\x12\x10\n\x08group_id\x18\x07 \x01(\t\x12\x17\n\x0fmembership_type\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41gentClientMetadata\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x11\n\ttenantURL\x18\x02 \x01(\t\x12\x14\n\x0credirectURIs\x18\x03 \x03(\t\x12\x12\n\nclientName\x18\x04 \x01(\t\x12\x1e\n\x16\x61\x63\x63\x65ss_token_life_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x07 \x01(\t\"\xc4\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0brealm_roles\x18\x02 \x03(\t\x12@\n\nattributes\x18\x03 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\x11\n\tisEnabled\x18\x04 \x01(\x08\x12\x15\n\rcreation_time\x18\x05 \x01(\x01\x12\x18\n\x10last_modified_at\x18\x06 \x01(\x01\x12\x14\n\x0c\x63lient_roles\x18\x07 \x03(\t\"z\n\x0fGetAllResources\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x43\n\rresource_type\x18\x03 \x01(\x0e\x32,.org.apache.custos.iam.service.ResourceTypes\"\x91\x01\n\x17GetAllResourcesResponse\x12\x34\n\x06\x61gents\x18\x01 \x03(\x0b\x32$.org.apache.custos.iam.service.Agent\x12@\n\x05users\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation*b\n\rFederatedIDPs\x12\x0b\n\x07\x43ILOGON\x10\x00\x12\x0c\n\x08\x46\x41\x43\x45\x42OOK\x10\x01\x12\n\n\x06GOOGLE\x10\x02\x12\x0c\n\x08LINKEDIN\x10\x03\x12\x0b\n\x07TWITTER\x10\x04\x12\x0f\n\x0b\x43USTOM_OIDC\x10\x05*L\n\x0bMapperTypes\x12\x12\n\x0eUSER_ATTRIBUTE\x10\x00\x12\x13\n\x0fUSER_REALM_ROLE\x10\x01\x12\x14\n\x10USER_CLIENT_ROLE\x10\x02*J\n\x0e\x43laimJSONTypes\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04LONG\x10\x01\x12\x0b\n\x07INTEGER\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x08\n\x04JSON\x10\x04*$\n\rResourceTypes\x12\x08\n\x04USER\x10\x00\x12\t\n\x05\x41GENT\x10\x01\x32\xf1,\n\x0fIamAdminService\x12t\n\x0bsetUPTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12u\n\x0cupdateTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12Z\n\x0c\x64\x65leteTenant\x12\x32.org.apache.custos.iam.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\x12\x87\x01\n\x15\x63onfigureFederatedIDP\x12:.org.apache.custos.iam.service.ConfigureFederateIDPRequest\x1a\x32.org.apache.custos.iam.service.FederateIDPResponse\x12k\n\x10\x61\x64\x64RolesToTenant\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12|\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x10getRolesOfTenant\x12..org.apache.custos.iam.service.GetRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12n\n\ndeleteRole\x12\x30.org.apache.custos.iam.service.DeleteRoleRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12q\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12r\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12q\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12p\n\x0bisUserExist\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a/.org.apache.custos.iam.service.CheckingResponse\x12n\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12n\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\x12q\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x13grantAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14removeAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x83\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\x12|\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12n\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x13\x64\x65leteRolesFromUser\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x11updateUserProfile\x12\x37.org.apache.custos.iam.service.UpdateUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x91\x01\n\x14getOperationMetadata\x12;.org.apache.custos.iam.service.GetOperationsMetadataRequest\x1a<.org.apache.custos.iam.service.GetOperationsMetadataResponse\x12\x83\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x0c\x63reateGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12n\n\x0bupdateGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0b\x64\x65leteGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12l\n\tfindGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0cgetAllGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12x\n\x0e\x61\x64\x64UserToGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x13removeUserFromGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12{\n\x11\x63reateAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12z\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14isAgentNameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12o\n\x0b\x64\x65leteAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x62\n\x08getAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a$.org.apache.custos.iam.service.Agent\x12p\n\x0c\x64isableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12o\n\x0b\x65nableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x82\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x10\x64\x65leteAgentRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x0fgetAllResources\x12..org.apache.custos.iam.service.GetAllResources\x1a\x36.org.apache.custos.iam.service.GetAllResourcesResponseB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+_FEDERATEDIDPS = _descriptor.EnumDescriptor(
+  name='FederatedIDPs',
+  full_name='org.apache.custos.iam.service.FederatedIDPs',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='CILOGON', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FACEBOOK', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='GOOGLE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LINKEDIN', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='TWITTER', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CUSTOM_OIDC', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=6554,
+  serialized_end=6652,
+)
+_sym_db.RegisterEnumDescriptor(_FEDERATEDIDPS)
+
+FederatedIDPs = enum_type_wrapper.EnumTypeWrapper(_FEDERATEDIDPS)
+_MAPPERTYPES = _descriptor.EnumDescriptor(
+  name='MapperTypes',
+  full_name='org.apache.custos.iam.service.MapperTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='USER_ATTRIBUTE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='USER_REALM_ROLE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='USER_CLIENT_ROLE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=6654,
+  serialized_end=6730,
+)
+_sym_db.RegisterEnumDescriptor(_MAPPERTYPES)
+
+MapperTypes = enum_type_wrapper.EnumTypeWrapper(_MAPPERTYPES)
+_CLAIMJSONTYPES = _descriptor.EnumDescriptor(
+  name='ClaimJSONTypes',
+  full_name='org.apache.custos.iam.service.ClaimJSONTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='STRING', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LONG', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='INTEGER', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='BOOLEAN', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='JSON', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=6732,
+  serialized_end=6806,
+)
+_sym_db.RegisterEnumDescriptor(_CLAIMJSONTYPES)
+
+ClaimJSONTypes = enum_type_wrapper.EnumTypeWrapper(_CLAIMJSONTYPES)
+_RESOURCETYPES = _descriptor.EnumDescriptor(
+  name='ResourceTypes',
+  full_name='org.apache.custos.iam.service.ResourceTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='USER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='AGENT', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=6808,
+  serialized_end=6844,
+)
+_sym_db.RegisterEnumDescriptor(_RESOURCETYPES)
+
+ResourceTypes = enum_type_wrapper.EnumTypeWrapper(_RESOURCETYPES)
+CILOGON = 0
+FACEBOOK = 1
+GOOGLE = 2
+LINKEDIN = 3
+TWITTER = 4
+CUSTOM_OIDC = 5
+USER_ATTRIBUTE = 0
+USER_REALM_ROLE = 1
+USER_CLIENT_ROLE = 2
+STRING = 0
+LONG = 1
+INTEGER = 2
+BOOLEAN = 3
+JSON = 4
+USER = 0
+AGENT = 1
+
+
+
+_SETUPTENANTREQUEST = _descriptor.Descriptor(
+  name='SetUpTenantRequest',
+  full_name='org.apache.custos.iam.service.SetUpTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_name', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_username', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_username', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_firstname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_firstname', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_lastname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_lastname', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_email', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_email', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_password', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_password', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_uRL', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_uRL', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.iam.service.SetUpTenantRequest.requester_email', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uRIs', full_name='org.apache.custos.iam.service.SetUpTenantRequest.redirect_uRIs', index=9,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_id', full_name='org.apache.custos.iam.service.SetUpTenantRequest.custos_client_id', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=86,
+  serialized_end=358,
+)
+
+
+_CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY = _descriptor.Descriptor(
+  name='ConfigMapEntry',
+  full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=661,
+  serialized_end=709,
+)
+
+_CONFIGUREFEDERATEIDPREQUEST = _descriptor.Descriptor(
+  name='ConfigureFederateIDPRequest',
+  full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_iD', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.client_iD', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='config_map', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.config_map', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.requester_email', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='idp_id', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.idp_id', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.scope', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=361,
+  serialized_end=709,
+)
+
+
+_FEDERATEIDPRESPONSE = _descriptor.Descriptor(
+  name='FederateIDPResponse',
+  full_name='org.apache.custos.iam.service.FederateIDPResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.iam.service.FederateIDPResponse.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=711,
+  serialized_end=748,
+)
+
+
+_SETUPTENANTRESPONSE = _descriptor.Descriptor(
+  name='SetUpTenantResponse',
+  full_name='org.apache.custos.iam.service.SetUpTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.SetUpTenantResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.iam.service.SetUpTenantResponse.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=750,
+  serialized_end=813,
+)
+
+
+_ISUSERNAMEAVAILABLEREQUEST = _descriptor.Descriptor(
+  name='IsUsernameAvailableRequest',
+  full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.access_token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_name', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.user_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=815,
+  serialized_end=903,
+)
+
+
+_CHECKINGRESPONSE = _descriptor.Descriptor(
+  name='CheckingResponse',
+  full_name='org.apache.custos.iam.service.CheckingResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='is_exist', full_name='org.apache.custos.iam.service.CheckingResponse.is_exist', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=905,
+  serialized_end=941,
+)
+
+
+_USERREPRESENTATION = _descriptor.Descriptor(
+  name='UserRepresentation',
+  full_name='org.apache.custos.iam.service.UserRepresentation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.UserRepresentation.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.iam.service.UserRepresentation.username', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='first_name', full_name='org.apache.custos.iam.service.UserRepresentation.first_name', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_name', full_name='org.apache.custos.iam.service.UserRepresentation.last_name', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.iam.service.UserRepresentation.password', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='org.apache.custos.iam.service.UserRepresentation.email', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='temporary_password', full_name='org.apache.custos.iam.service.UserRepresentation.temporary_password', index=6,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='realm_roles', full_name='org.apache.custos.iam.service.UserRepresentation.realm_roles', index=7,
+      number=9, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.iam.service.UserRepresentation.client_roles', index=8,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.iam.service.UserRepresentation.attributes', index=9,
+      number=11, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='org.apache.custos.iam.service.UserRepresentation.state', index=10,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='creation_time', full_name='org.apache.custos.iam.service.UserRepresentation.creation_time', index=11,
+      number=13, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_login_at', full_name='org.apache.custos.iam.service.UserRepresentation.last_login_at', index=12,
+      number=14, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=944,
+  serialized_end=1264,
+)
+
+
+_GROUPREPRESENTATION = _descriptor.Descriptor(
+  name='GroupRepresentation',
+  full_name='org.apache.custos.iam.service.GroupRepresentation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.iam.service.GroupRepresentation.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.GroupRepresentation.id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='realm_roles', full_name='org.apache.custos.iam.service.GroupRepresentation.realm_roles', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.iam.service.GroupRepresentation.client_roles', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.iam.service.GroupRepresentation.attributes', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.GroupRepresentation.users', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sub_groups', full_name='org.apache.custos.iam.service.GroupRepresentation.sub_groups', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.iam.service.GroupRepresentation.description', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ownerId', full_name='org.apache.custos.iam.service.GroupRepresentation.ownerId', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1267,
+  serialized_end=1599,
+)
+
+
+_REGISTERUSERREQUEST = _descriptor.Descriptor(
+  name='RegisterUserRequest',
+  full_name='org.apache.custos.iam.service.RegisterUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.RegisterUserRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.RegisterUserRequest.access_token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.RegisterUserRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.iam.service.RegisterUserRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user', full_name='org.apache.custos.iam.service.RegisterUserRequest.user', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.RegisterUserRequest.performed_by', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1602,
+  serialized_end=1790,
+)
+
+
+_REGISTERUSERSREQUEST = _descriptor.Descriptor(
+  name='RegisterUsersRequest',
+  full_name='org.apache.custos.iam.service.RegisterUsersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.RegisterUsersRequest.users', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.RegisterUsersRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.RegisterUsersRequest.access_token', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.RegisterUsersRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.RegisterUsersRequest.performed_by', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1793,
+  serialized_end=1963,
+)
+
+
+_REGISTERUSERRESPONSE = _descriptor.Descriptor(
+  name='RegisterUserResponse',
+  full_name='org.apache.custos.iam.service.RegisterUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='is_registered', full_name='org.apache.custos.iam.service.RegisterUserResponse.is_registered', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1965,
+  serialized_end=2010,
+)
+
+
+_REGISTERUSERSRESPONSE = _descriptor.Descriptor(
+  name='RegisterUsersResponse',
+  full_name='org.apache.custos.iam.service.RegisterUsersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='all_useres_registered', full_name='org.apache.custos.iam.service.RegisterUsersResponse.all_useres_registered', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='failed_users', full_name='org.apache.custos.iam.service.RegisterUsersResponse.failed_users', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2012,
+  serialized_end=2139,
+)
+
+
+_USERSEARCHMETADATA = _descriptor.Descriptor(
+  name='UserSearchMetadata',
+  full_name='org.apache.custos.iam.service.UserSearchMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.iam.service.UserSearchMetadata.username', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='first_name', full_name='org.apache.custos.iam.service.UserSearchMetadata.first_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_name', full_name='org.apache.custos.iam.service.UserSearchMetadata.last_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='org.apache.custos.iam.service.UserSearchMetadata.email', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.UserSearchMetadata.id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2141,
+  serialized_end=2245,
+)
+
+
+_FINDUSERSREQUEST = _descriptor.Descriptor(
+  name='FindUsersRequest',
+  full_name='org.apache.custos.iam.service.FindUsersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='org.apache.custos.iam.service.FindUsersRequest.user', index=0,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.iam.service.FindUsersRequest.offset', index=1,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.iam.service.FindUsersRequest.limit', index=2,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.FindUsersRequest.tenant_id', index=3,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.FindUsersRequest.access_token', index=4,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.FindUsersRequest.client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.iam.service.FindUsersRequest.client_sec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2248,
+  serialized_end=2442,
+)
+
+
+_USERSEARCHREQUEST = _descriptor.Descriptor(
+  name='UserSearchRequest',
+  full_name='org.apache.custos.iam.service.UserSearchRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='org.apache.custos.iam.service.UserSearchRequest.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.UserSearchRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.UserSearchRequest.access_token', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.UserSearchRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.iam.service.UserSearchRequest.client_sec', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.UserSearchRequest.performed_by', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2445,
+  serialized_end=2631,
+)
+
+
+_FINDUSERSRESPONSE = _descriptor.Descriptor(
+  name='FindUsersResponse',
+  full_name='org.apache.custos.iam.service.FindUsersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.FindUsersResponse.users', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2633,
+  serialized_end=2718,
+)
+
+
+_RESETUSERPASSWORD = _descriptor.Descriptor(
+  name='ResetUserPassword',
+  full_name='org.apache.custos.iam.service.ResetUserPassword',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.iam.service.ResetUserPassword.username', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.iam.service.ResetUserPassword.password', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.ResetUserPassword.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.ResetUserPassword.access_token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.ResetUserPassword.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.iam.service.ResetUserPassword.client_sec', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2721,
+  serialized_end=2856,
+)
+
+
+_DELETEUSERROLESREQUEST = _descriptor.Descriptor(
+  name='DeleteUserRolesRequest',
+  full_name='org.apache.custos.iam.service.DeleteUserRolesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.username', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.client_roles', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.roles', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.access_token', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.performed_by', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.DeleteUserRolesRequest.id', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2859,
+  serialized_end=3032,
+)
+
+
+_ADDUSERROLESREQUEST = _descriptor.Descriptor(
+  name='AddUserRolesRequest',
+  full_name='org.apache.custos.iam.service.AddUserRolesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.AddUserRolesRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='usernames', full_name='org.apache.custos.iam.service.AddUserRolesRequest.usernames', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='org.apache.custos.iam.service.AddUserRolesRequest.roles', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.AddUserRolesRequest.access_token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.AddUserRolesRequest.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_level', full_name='org.apache.custos.iam.service.AddUserRolesRequest.client_level', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.AddUserRolesRequest.performed_by', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agents', full_name='org.apache.custos.iam.service.AddUserRolesRequest.agents', index=7,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3035,
+  serialized_end=3210,
+)
+
+
+_UPDATEUSERPROFILEREQUEST = _descriptor.Descriptor(
+  name='UpdateUserProfileRequest',
+  full_name='org.apache.custos.iam.service.UpdateUserProfileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.access_token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.user', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3213,
+  serialized_end=3345,
+)
+
+
+_ADDUSERRESPONSE = _descriptor.Descriptor(
+  name='AddUserResponse',
+  full_name='org.apache.custos.iam.service.AddUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='code', full_name='org.apache.custos.iam.service.AddUserResponse.code', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3347,
+  serialized_end=3378,
+)
+
+
+_GETOPERATIONSMETADATAREQUEST = _descriptor.Descriptor(
+  name='GetOperationsMetadataRequest',
+  full_name='org.apache.custos.iam.service.GetOperationsMetadataRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='trace_id', full_name='org.apache.custos.iam.service.GetOperationsMetadataRequest.trace_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3380,
+  serialized_end=3428,
+)
+
+
+_OPERATIONMETADATA = _descriptor.Descriptor(
+  name='OperationMetadata',
+  full_name='org.apache.custos.iam.service.OperationMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='event', full_name='org.apache.custos.iam.service.OperationMetadata.event', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.iam.service.OperationMetadata.status', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='time_stamp', full_name='org.apache.custos.iam.service.OperationMetadata.time_stamp', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.iam.service.OperationMetadata.performed_by', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3430,
+  serialized_end=3522,
+)
+
+
+_GETOPERATIONSMETADATARESPONSE = _descriptor.Descriptor(
+  name='GetOperationsMetadataResponse',
+  full_name='org.apache.custos.iam.service.GetOperationsMetadataResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.iam.service.GetOperationsMetadataResponse.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3524,
+  serialized_end=3623,
+)
+
+
+_DELETETENANTREQUEST = _descriptor.Descriptor(
+  name='DeleteTenantRequest',
+  full_name='org.apache.custos.iam.service.DeleteTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteTenantRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3625,
+  serialized_end=3665,
+)
+
+
+_ADDROLESREQUEST = _descriptor.Descriptor(
+  name='AddRolesRequest',
+  full_name='org.apache.custos.iam.service.AddRolesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='org.apache.custos.iam.service.AddRolesRequest.roles', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_level', full_name='org.apache.custos.iam.service.AddRolesRequest.client_level', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.AddRolesRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.AddRolesRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3668,
+  serialized_end=3811,
+)
+
+
+_GETROLESREQUEST = _descriptor.Descriptor(
+  name='GetRolesRequest',
+  full_name='org.apache.custos.iam.service.GetRolesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_level', full_name='org.apache.custos.iam.service.GetRolesRequest.client_level', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.GetRolesRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.GetRolesRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3813,
+  serialized_end=3890,
+)
+
+
+_ROLEREPRESENTATION = _descriptor.Descriptor(
+  name='RoleRepresentation',
+  full_name='org.apache.custos.iam.service.RoleRepresentation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.iam.service.RoleRepresentation.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.iam.service.RoleRepresentation.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='composite', full_name='org.apache.custos.iam.service.RoleRepresentation.composite', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.RoleRepresentation.id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3892,
+  serialized_end=3978,
+)
+
+
+_DELETEROLEREQUEST = _descriptor.Descriptor(
+  name='DeleteRoleRequest',
+  full_name='org.apache.custos.iam.service.DeleteRoleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_level', full_name='org.apache.custos.iam.service.DeleteRoleRequest.client_level', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteRoleRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.DeleteRoleRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='org.apache.custos.iam.service.DeleteRoleRequest.role', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3981,
+  serialized_end=4125,
+)
+
+
+_ALLROLES = _descriptor.Descriptor(
+  name='AllRoles',
+  full_name='org.apache.custos.iam.service.AllRoles',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='org.apache.custos.iam.service.AllRoles.roles', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.iam.service.AllRoles.scope', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4127,
+  serialized_end=4218,
+)
+
+
+_ADDPROTOCOLMAPPERREQUEST = _descriptor.Descriptor(
+  name='AddProtocolMapperRequest',
+  full_name='org.apache.custos.iam.service.AddProtocolMapperRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attribute_name', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.attribute_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='claim_name', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.claim_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='claim_type', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.claim_type', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.tenant_id', index=4,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.client_id', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mapper_type', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.mapper_type', index=6,
+      number=8, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='add_to_id_token', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.add_to_id_token', index=7,
+      number=9, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='add_to_access_token', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.add_to_access_token', index=8,
+      number=10, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='add_to_user_info', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.add_to_user_info', index=9,
+      number=11, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='multi_valued', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.multi_valued', index=10,
+      number=12, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='aggregate_attribute_values', full_name='org.apache.custos.iam.service.AddProtocolMapperRequest.aggregate_attribute_values', index=11,
+      number=13, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4221,
+  serialized_end=4613,
+)
+
+
+_OPERATIONSTATUS = _descriptor.Descriptor(
+  name='OperationStatus',
+  full_name='org.apache.custos.iam.service.OperationStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.iam.service.OperationStatus.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4615,
+  serialized_end=4648,
+)
+
+
+_ADDUSERATTRIBUTESREQUEST = _descriptor.Descriptor(
+  name='AddUserAttributesRequest',
+  full_name='org.apache.custos.iam.service.AddUserAttributesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.attributes', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.users', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.access_token', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.performedBy', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agents', full_name='org.apache.custos.iam.service.AddUserAttributesRequest.agents', index=6,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4651,
+  serialized_end=4855,
+)
+
+
+_DELETEUSERATTRIBUTEREQUEST = _descriptor.Descriptor(
+  name='DeleteUserAttributeRequest',
+  full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.attributes', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.users', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.access_token', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.performedBy', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agents', full_name='org.apache.custos.iam.service.DeleteUserAttributeRequest.agents', index=6,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4858,
+  serialized_end=5064,
+)
+
+
+_USERATTRIBUTE = _descriptor.Descriptor(
+  name='UserAttribute',
+  full_name='org.apache.custos.iam.service.UserAttribute',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.iam.service.UserAttribute.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='values', full_name='org.apache.custos.iam.service.UserAttribute.values', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5066,
+  serialized_end=5110,
+)
+
+
+_EVENTPERSISTENCEREQUEST = _descriptor.Descriptor(
+  name='EventPersistenceRequest',
+  full_name='org.apache.custos.iam.service.EventPersistenceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.EventPersistenceRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_event', full_name='org.apache.custos.iam.service.EventPersistenceRequest.admin_event', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event', full_name='org.apache.custos.iam.service.EventPersistenceRequest.event', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='enable', full_name='org.apache.custos.iam.service.EventPersistenceRequest.enable', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='persistence_time', full_name='org.apache.custos.iam.service.EventPersistenceRequest.persistence_time', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.EventPersistenceRequest.performedBy', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5113,
+  serialized_end=5255,
+)
+
+
+_GROUPSREQUEST = _descriptor.Descriptor(
+  name='GroupsRequest',
+  full_name='org.apache.custos.iam.service.GroupsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.GroupsRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='accessToken', full_name='org.apache.custos.iam.service.GroupsRequest.accessToken', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.GroupsRequest.performedBy', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.iam.service.GroupsRequest.clientId', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.iam.service.GroupsRequest.clientSec', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='groups', full_name='org.apache.custos.iam.service.GroupsRequest.groups', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5258,
+  serialized_end=5438,
+)
+
+
+_GROUPREQUEST = _descriptor.Descriptor(
+  name='GroupRequest',
+  full_name='org.apache.custos.iam.service.GroupRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.GroupRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='accessToken', full_name='org.apache.custos.iam.service.GroupRequest.accessToken', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.GroupRequest.performedBy', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.iam.service.GroupRequest.clientId', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.iam.service.GroupRequest.clientSec', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.GroupRequest.id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='group', full_name='org.apache.custos.iam.service.GroupRequest.group', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5441,
+  serialized_end=5631,
+)
+
+
+_GROUPSRESPONSE = _descriptor.Descriptor(
+  name='GroupsResponse',
+  full_name='org.apache.custos.iam.service.GroupsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='groups', full_name='org.apache.custos.iam.service.GroupsResponse.groups', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5633,
+  serialized_end=5717,
+)
+
+
+_USERGROUPMAPPINGREQUEST = _descriptor.Descriptor(
+  name='UserGroupMappingRequest',
+  full_name='org.apache.custos.iam.service.UserGroupMappingRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='accessToken', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.accessToken', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.performedBy', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.clientId', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.clientSec', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.username', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='group_id', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.group_id', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='membership_type', full_name='org.apache.custos.iam.service.UserGroupMappingRequest.membership_type', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5720,
+  serialized_end=5903,
+)
+
+
+_AGENTCLIENTMETADATA = _descriptor.Descriptor(
+  name='AgentClientMetadata',
+  full_name='org.apache.custos.iam.service.AgentClientMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.AgentClientMetadata.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenantURL', full_name='org.apache.custos.iam.service.AgentClientMetadata.tenantURL', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirectURIs', full_name='org.apache.custos.iam.service.AgentClientMetadata.redirectURIs', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientName', full_name='org.apache.custos.iam.service.AgentClientMetadata.clientName', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token_life_time', full_name='org.apache.custos.iam.service.AgentClientMetadata.access_token_life_time', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.iam.service.AgentClientMetadata.performedBy', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.iam.service.AgentClientMetadata.access_token', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5906,
+  serialized_end=6081,
+)
+
+
+_AGENT = _descriptor.Descriptor(
+  name='Agent',
+  full_name='org.apache.custos.iam.service.Agent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.Agent.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='realm_roles', full_name='org.apache.custos.iam.service.Agent.realm_roles', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.iam.service.Agent.attributes', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='isEnabled', full_name='org.apache.custos.iam.service.Agent.isEnabled', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='creation_time', full_name='org.apache.custos.iam.service.Agent.creation_time', index=4,
+      number=5, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_modified_at', full_name='org.apache.custos.iam.service.Agent.last_modified_at', index=5,
+      number=6, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.iam.service.Agent.client_roles', index=6,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=6084,
+  serialized_end=6280,
+)
+
+
+_GETALLRESOURCES = _descriptor.Descriptor(
+  name='GetAllResources',
+  full_name='org.apache.custos.iam.service.GetAllResources',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.iam.service.GetAllResources.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.iam.service.GetAllResources.clientId', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resource_type', full_name='org.apache.custos.iam.service.GetAllResources.resource_type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=6282,
+  serialized_end=6404,
+)
+
+
+_GETALLRESOURCESRESPONSE = _descriptor.Descriptor(
+  name='GetAllResourcesResponse',
+  full_name='org.apache.custos.iam.service.GetAllResourcesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='agents', full_name='org.apache.custos.iam.service.GetAllResourcesResponse.agents', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='users', full_name='org.apache.custos.iam.service.GetAllResourcesResponse.users', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=6407,
+  serialized_end=6552,
+)
+
+_CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY.containing_type = _CONFIGUREFEDERATEIDPREQUEST
+_CONFIGUREFEDERATEIDPREQUEST.fields_by_name['type'].enum_type = _FEDERATEDIDPS
+_CONFIGUREFEDERATEIDPREQUEST.fields_by_name['config_map'].message_type = _CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY
+_USERREPRESENTATION.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_GROUPREPRESENTATION.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_GROUPREPRESENTATION.fields_by_name['users'].message_type = _USERREPRESENTATION
+_GROUPREPRESENTATION.fields_by_name['sub_groups'].message_type = _GROUPREPRESENTATION
+_REGISTERUSERREQUEST.fields_by_name['user'].message_type = _USERREPRESENTATION
+_REGISTERUSERSREQUEST.fields_by_name['users'].message_type = _USERREPRESENTATION
+_REGISTERUSERSRESPONSE.fields_by_name['failed_users'].message_type = _USERREPRESENTATION
+_FINDUSERSREQUEST.fields_by_name['user'].message_type = _USERSEARCHMETADATA
+_USERSEARCHREQUEST.fields_by_name['user'].message_type = _USERSEARCHMETADATA
+_FINDUSERSRESPONSE.fields_by_name['users'].message_type = _USERREPRESENTATION
+_UPDATEUSERPROFILEREQUEST.fields_by_name['user'].message_type = _USERREPRESENTATION
+_GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
+_ADDROLESREQUEST.fields_by_name['roles'].message_type = _ROLEREPRESENTATION
+_DELETEROLEREQUEST.fields_by_name['role'].message_type = _ROLEREPRESENTATION
+_ALLROLES.fields_by_name['roles'].message_type = _ROLEREPRESENTATION
+_ADDPROTOCOLMAPPERREQUEST.fields_by_name['claim_type'].enum_type = _CLAIMJSONTYPES
+_ADDPROTOCOLMAPPERREQUEST.fields_by_name['mapper_type'].enum_type = _MAPPERTYPES
+_ADDUSERATTRIBUTESREQUEST.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_DELETEUSERATTRIBUTEREQUEST.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_GROUPSREQUEST.fields_by_name['groups'].message_type = _GROUPREPRESENTATION
+_GROUPREQUEST.fields_by_name['group'].message_type = _GROUPREPRESENTATION
+_GROUPSRESPONSE.fields_by_name['groups'].message_type = _GROUPREPRESENTATION
+_AGENT.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_GETALLRESOURCES.fields_by_name['resource_type'].enum_type = _RESOURCETYPES
+_GETALLRESOURCESRESPONSE.fields_by_name['agents'].message_type = _AGENT
+_GETALLRESOURCESRESPONSE.fields_by_name['users'].message_type = _USERREPRESENTATION
+DESCRIPTOR.message_types_by_name['SetUpTenantRequest'] = _SETUPTENANTREQUEST
+DESCRIPTOR.message_types_by_name['ConfigureFederateIDPRequest'] = _CONFIGUREFEDERATEIDPREQUEST
+DESCRIPTOR.message_types_by_name['FederateIDPResponse'] = _FEDERATEIDPRESPONSE
+DESCRIPTOR.message_types_by_name['SetUpTenantResponse'] = _SETUPTENANTRESPONSE
+DESCRIPTOR.message_types_by_name['IsUsernameAvailableRequest'] = _ISUSERNAMEAVAILABLEREQUEST
+DESCRIPTOR.message_types_by_name['CheckingResponse'] = _CHECKINGRESPONSE
+DESCRIPTOR.message_types_by_name['UserRepresentation'] = _USERREPRESENTATION
+DESCRIPTOR.message_types_by_name['GroupRepresentation'] = _GROUPREPRESENTATION
+DESCRIPTOR.message_types_by_name['RegisterUserRequest'] = _REGISTERUSERREQUEST
+DESCRIPTOR.message_types_by_name['RegisterUsersRequest'] = _REGISTERUSERSREQUEST
+DESCRIPTOR.message_types_by_name['RegisterUserResponse'] = _REGISTERUSERRESPONSE
+DESCRIPTOR.message_types_by_name['RegisterUsersResponse'] = _REGISTERUSERSRESPONSE
+DESCRIPTOR.message_types_by_name['UserSearchMetadata'] = _USERSEARCHMETADATA
+DESCRIPTOR.message_types_by_name['FindUsersRequest'] = _FINDUSERSREQUEST
+DESCRIPTOR.message_types_by_name['UserSearchRequest'] = _USERSEARCHREQUEST
+DESCRIPTOR.message_types_by_name['FindUsersResponse'] = _FINDUSERSRESPONSE
+DESCRIPTOR.message_types_by_name['ResetUserPassword'] = _RESETUSERPASSWORD
+DESCRIPTOR.message_types_by_name['DeleteUserRolesRequest'] = _DELETEUSERROLESREQUEST
+DESCRIPTOR.message_types_by_name['AddUserRolesRequest'] = _ADDUSERROLESREQUEST
+DESCRIPTOR.message_types_by_name['UpdateUserProfileRequest'] = _UPDATEUSERPROFILEREQUEST
+DESCRIPTOR.message_types_by_name['AddUserResponse'] = _ADDUSERRESPONSE
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataRequest'] = _GETOPERATIONSMETADATAREQUEST
+DESCRIPTOR.message_types_by_name['OperationMetadata'] = _OPERATIONMETADATA
+DESCRIPTOR.message_types_by_name['GetOperationsMetadataResponse'] = _GETOPERATIONSMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['DeleteTenantRequest'] = _DELETETENANTREQUEST
+DESCRIPTOR.message_types_by_name['AddRolesRequest'] = _ADDROLESREQUEST
+DESCRIPTOR.message_types_by_name['GetRolesRequest'] = _GETROLESREQUEST
+DESCRIPTOR.message_types_by_name['RoleRepresentation'] = _ROLEREPRESENTATION
+DESCRIPTOR.message_types_by_name['DeleteRoleRequest'] = _DELETEROLEREQUEST
+DESCRIPTOR.message_types_by_name['AllRoles'] = _ALLROLES
+DESCRIPTOR.message_types_by_name['AddProtocolMapperRequest'] = _ADDPROTOCOLMAPPERREQUEST
+DESCRIPTOR.message_types_by_name['OperationStatus'] = _OPERATIONSTATUS
+DESCRIPTOR.message_types_by_name['AddUserAttributesRequest'] = _ADDUSERATTRIBUTESREQUEST
+DESCRIPTOR.message_types_by_name['DeleteUserAttributeRequest'] = _DELETEUSERATTRIBUTEREQUEST
+DESCRIPTOR.message_types_by_name['UserAttribute'] = _USERATTRIBUTE
+DESCRIPTOR.message_types_by_name['EventPersistenceRequest'] = _EVENTPERSISTENCEREQUEST
+DESCRIPTOR.message_types_by_name['GroupsRequest'] = _GROUPSREQUEST
+DESCRIPTOR.message_types_by_name['GroupRequest'] = _GROUPREQUEST
+DESCRIPTOR.message_types_by_name['GroupsResponse'] = _GROUPSRESPONSE
+DESCRIPTOR.message_types_by_name['UserGroupMappingRequest'] = _USERGROUPMAPPINGREQUEST
+DESCRIPTOR.message_types_by_name['AgentClientMetadata'] = _AGENTCLIENTMETADATA
+DESCRIPTOR.message_types_by_name['Agent'] = _AGENT
+DESCRIPTOR.message_types_by_name['GetAllResources'] = _GETALLRESOURCES
+DESCRIPTOR.message_types_by_name['GetAllResourcesResponse'] = _GETALLRESOURCESRESPONSE
+DESCRIPTOR.enum_types_by_name['FederatedIDPs'] = _FEDERATEDIDPS
+DESCRIPTOR.enum_types_by_name['MapperTypes'] = _MAPPERTYPES
+DESCRIPTOR.enum_types_by_name['ClaimJSONTypes'] = _CLAIMJSONTYPES
+DESCRIPTOR.enum_types_by_name['ResourceTypes'] = _RESOURCETYPES
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+SetUpTenantRequest = _reflection.GeneratedProtocolMessageType('SetUpTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETUPTENANTREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.SetUpTenantRequest)
+  })
+_sym_db.RegisterMessage(SetUpTenantRequest)
+
+ConfigureFederateIDPRequest = _reflection.GeneratedProtocolMessageType('ConfigureFederateIDPRequest', (_message.Message,), {
+
+  'ConfigMapEntry' : _reflection.GeneratedProtocolMessageType('ConfigMapEntry', (_message.Message,), {
+    'DESCRIPTOR' : _CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY,
+    '__module__' : 'IamAdminService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry)
+    })
+  ,
+  'DESCRIPTOR' : _CONFIGUREFEDERATEIDPREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.ConfigureFederateIDPRequest)
+  })
+_sym_db.RegisterMessage(ConfigureFederateIDPRequest)
+_sym_db.RegisterMessage(ConfigureFederateIDPRequest.ConfigMapEntry)
+
+FederateIDPResponse = _reflection.GeneratedProtocolMessageType('FederateIDPResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FEDERATEIDPRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.FederateIDPResponse)
+  })
+_sym_db.RegisterMessage(FederateIDPResponse)
+
+SetUpTenantResponse = _reflection.GeneratedProtocolMessageType('SetUpTenantResponse', (_message.Message,), {
+  'DESCRIPTOR' : _SETUPTENANTRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.SetUpTenantResponse)
+  })
+_sym_db.RegisterMessage(SetUpTenantResponse)
+
+IsUsernameAvailableRequest = _reflection.GeneratedProtocolMessageType('IsUsernameAvailableRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ISUSERNAMEAVAILABLEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.IsUsernameAvailableRequest)
+  })
+_sym_db.RegisterMessage(IsUsernameAvailableRequest)
+
+CheckingResponse = _reflection.GeneratedProtocolMessageType('CheckingResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CHECKINGRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.CheckingResponse)
+  })
+_sym_db.RegisterMessage(CheckingResponse)
+
+UserRepresentation = _reflection.GeneratedProtocolMessageType('UserRepresentation', (_message.Message,), {
+  'DESCRIPTOR' : _USERREPRESENTATION,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UserRepresentation)
+  })
+_sym_db.RegisterMessage(UserRepresentation)
+
+GroupRepresentation = _reflection.GeneratedProtocolMessageType('GroupRepresentation', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPREPRESENTATION,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GroupRepresentation)
+  })
+_sym_db.RegisterMessage(GroupRepresentation)
+
+RegisterUserRequest = _reflection.GeneratedProtocolMessageType('RegisterUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTERUSERREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.RegisterUserRequest)
+  })
+_sym_db.RegisterMessage(RegisterUserRequest)
+
+RegisterUsersRequest = _reflection.GeneratedProtocolMessageType('RegisterUsersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTERUSERSREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.RegisterUsersRequest)
+  })
+_sym_db.RegisterMessage(RegisterUsersRequest)
+
+RegisterUserResponse = _reflection.GeneratedProtocolMessageType('RegisterUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTERUSERRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.RegisterUserResponse)
+  })
+_sym_db.RegisterMessage(RegisterUserResponse)
+
+RegisterUsersResponse = _reflection.GeneratedProtocolMessageType('RegisterUsersResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTERUSERSRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.RegisterUsersResponse)
+  })
+_sym_db.RegisterMessage(RegisterUsersResponse)
+
+UserSearchMetadata = _reflection.GeneratedProtocolMessageType('UserSearchMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _USERSEARCHMETADATA,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UserSearchMetadata)
+  })
+_sym_db.RegisterMessage(UserSearchMetadata)
+
+FindUsersRequest = _reflection.GeneratedProtocolMessageType('FindUsersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDUSERSREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.FindUsersRequest)
+  })
+_sym_db.RegisterMessage(FindUsersRequest)
+
+UserSearchRequest = _reflection.GeneratedProtocolMessageType('UserSearchRequest', (_message.Message,), {
+  'DESCRIPTOR' : _USERSEARCHREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UserSearchRequest)
+  })
+_sym_db.RegisterMessage(UserSearchRequest)
+
+FindUsersResponse = _reflection.GeneratedProtocolMessageType('FindUsersResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDUSERSRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.FindUsersResponse)
+  })
+_sym_db.RegisterMessage(FindUsersResponse)
+
+ResetUserPassword = _reflection.GeneratedProtocolMessageType('ResetUserPassword', (_message.Message,), {
+  'DESCRIPTOR' : _RESETUSERPASSWORD,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.ResetUserPassword)
+  })
+_sym_db.RegisterMessage(ResetUserPassword)
+
+DeleteUserRolesRequest = _reflection.GeneratedProtocolMessageType('DeleteUserRolesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEUSERROLESREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.DeleteUserRolesRequest)
+  })
+_sym_db.RegisterMessage(DeleteUserRolesRequest)
+
+AddUserRolesRequest = _reflection.GeneratedProtocolMessageType('AddUserRolesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ADDUSERROLESREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AddUserRolesRequest)
+  })
+_sym_db.RegisterMessage(AddUserRolesRequest)
+
+UpdateUserProfileRequest = _reflection.GeneratedProtocolMessageType('UpdateUserProfileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEUSERPROFILEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UpdateUserProfileRequest)
+  })
+_sym_db.RegisterMessage(UpdateUserProfileRequest)
+
+AddUserResponse = _reflection.GeneratedProtocolMessageType('AddUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ADDUSERRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AddUserResponse)
+  })
+_sym_db.RegisterMessage(AddUserResponse)
+
+GetOperationsMetadataRequest = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATAREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GetOperationsMetadataRequest)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataRequest)
+
+OperationMetadata = _reflection.GeneratedProtocolMessageType('OperationMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONMETADATA,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.OperationMetadata)
+  })
+_sym_db.RegisterMessage(OperationMetadata)
+
+GetOperationsMetadataResponse = _reflection.GeneratedProtocolMessageType('GetOperationsMetadataResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPERATIONSMETADATARESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GetOperationsMetadataResponse)
+  })
+_sym_db.RegisterMessage(GetOperationsMetadataResponse)
+
+DeleteTenantRequest = _reflection.GeneratedProtocolMessageType('DeleteTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETETENANTREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.DeleteTenantRequest)
+  })
+_sym_db.RegisterMessage(DeleteTenantRequest)
+
+AddRolesRequest = _reflection.GeneratedProtocolMessageType('AddRolesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ADDROLESREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AddRolesRequest)
+  })
+_sym_db.RegisterMessage(AddRolesRequest)
+
+GetRolesRequest = _reflection.GeneratedProtocolMessageType('GetRolesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETROLESREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GetRolesRequest)
+  })
+_sym_db.RegisterMessage(GetRolesRequest)
+
+RoleRepresentation = _reflection.GeneratedProtocolMessageType('RoleRepresentation', (_message.Message,), {
+  'DESCRIPTOR' : _ROLEREPRESENTATION,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.RoleRepresentation)
+  })
+_sym_db.RegisterMessage(RoleRepresentation)
+
+DeleteRoleRequest = _reflection.GeneratedProtocolMessageType('DeleteRoleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEROLEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.DeleteRoleRequest)
+  })
+_sym_db.RegisterMessage(DeleteRoleRequest)
+
+AllRoles = _reflection.GeneratedProtocolMessageType('AllRoles', (_message.Message,), {
+  'DESCRIPTOR' : _ALLROLES,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AllRoles)
+  })
+_sym_db.RegisterMessage(AllRoles)
+
+AddProtocolMapperRequest = _reflection.GeneratedProtocolMessageType('AddProtocolMapperRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ADDPROTOCOLMAPPERREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AddProtocolMapperRequest)
+  })
+_sym_db.RegisterMessage(AddProtocolMapperRequest)
+
+OperationStatus = _reflection.GeneratedProtocolMessageType('OperationStatus', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONSTATUS,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.OperationStatus)
+  })
+_sym_db.RegisterMessage(OperationStatus)
+
+AddUserAttributesRequest = _reflection.GeneratedProtocolMessageType('AddUserAttributesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ADDUSERATTRIBUTESREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AddUserAttributesRequest)
+  })
+_sym_db.RegisterMessage(AddUserAttributesRequest)
+
+DeleteUserAttributeRequest = _reflection.GeneratedProtocolMessageType('DeleteUserAttributeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEUSERATTRIBUTEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.DeleteUserAttributeRequest)
+  })
+_sym_db.RegisterMessage(DeleteUserAttributeRequest)
+
+UserAttribute = _reflection.GeneratedProtocolMessageType('UserAttribute', (_message.Message,), {
+  'DESCRIPTOR' : _USERATTRIBUTE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UserAttribute)
+  })
+_sym_db.RegisterMessage(UserAttribute)
+
+EventPersistenceRequest = _reflection.GeneratedProtocolMessageType('EventPersistenceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTPERSISTENCEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.EventPersistenceRequest)
+  })
+_sym_db.RegisterMessage(EventPersistenceRequest)
+
+GroupsRequest = _reflection.GeneratedProtocolMessageType('GroupsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPSREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GroupsRequest)
+  })
+_sym_db.RegisterMessage(GroupsRequest)
+
+GroupRequest = _reflection.GeneratedProtocolMessageType('GroupRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GroupRequest)
+  })
+_sym_db.RegisterMessage(GroupRequest)
+
+GroupsResponse = _reflection.GeneratedProtocolMessageType('GroupsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPSRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GroupsResponse)
+  })
+_sym_db.RegisterMessage(GroupsResponse)
+
+UserGroupMappingRequest = _reflection.GeneratedProtocolMessageType('UserGroupMappingRequest', (_message.Message,), {
+  'DESCRIPTOR' : _USERGROUPMAPPINGREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.UserGroupMappingRequest)
+  })
+_sym_db.RegisterMessage(UserGroupMappingRequest)
+
+AgentClientMetadata = _reflection.GeneratedProtocolMessageType('AgentClientMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _AGENTCLIENTMETADATA,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.AgentClientMetadata)
+  })
+_sym_db.RegisterMessage(AgentClientMetadata)
+
+Agent = _reflection.GeneratedProtocolMessageType('Agent', (_message.Message,), {
+  'DESCRIPTOR' : _AGENT,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.Agent)
+  })
+_sym_db.RegisterMessage(Agent)
+
+GetAllResources = _reflection.GeneratedProtocolMessageType('GetAllResources', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLRESOURCES,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GetAllResources)
+  })
+_sym_db.RegisterMessage(GetAllResources)
+
+GetAllResourcesResponse = _reflection.GeneratedProtocolMessageType('GetAllResourcesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLRESOURCESRESPONSE,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.GetAllResourcesResponse)
+  })
+_sym_db.RegisterMessage(GetAllResourcesResponse)
+
+
+DESCRIPTOR._options = None
+_CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY._options = None
+
+_IAMADMINSERVICE = _descriptor.ServiceDescriptor(
+  name='IamAdminService',
+  full_name='org.apache.custos.iam.service.IamAdminService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=6847,
+  serialized_end=12592,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='setUPTenant',
+    full_name='org.apache.custos.iam.service.IamAdminService.setUPTenant',
+    index=0,
+    containing_service=None,
+    input_type=_SETUPTENANTREQUEST,
+    output_type=_SETUPTENANTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateTenant',
+    full_name='org.apache.custos.iam.service.IamAdminService.updateTenant',
+    index=1,
+    containing_service=None,
+    input_type=_SETUPTENANTREQUEST,
+    output_type=_SETUPTENANTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteTenant',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteTenant',
+    index=2,
+    containing_service=None,
+    input_type=_DELETETENANTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='configureFederatedIDP',
+    full_name='org.apache.custos.iam.service.IamAdminService.configureFederatedIDP',
+    index=3,
+    containing_service=None,
+    input_type=_CONFIGUREFEDERATEIDPREQUEST,
+    output_type=_FEDERATEIDPRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToTenant',
+    full_name='org.apache.custos.iam.service.IamAdminService.addRolesToTenant',
+    index=4,
+    containing_service=None,
+    input_type=_ADDROLESREQUEST,
+    output_type=_ALLROLES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addProtocolMapper',
+    full_name='org.apache.custos.iam.service.IamAdminService.addProtocolMapper',
+    index=5,
+    containing_service=None,
+    input_type=_ADDPROTOCOLMAPPERREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getRolesOfTenant',
+    full_name='org.apache.custos.iam.service.IamAdminService.getRolesOfTenant',
+    index=6,
+    containing_service=None,
+    input_type=_GETROLESREQUEST,
+    output_type=_ALLROLES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteRole',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteRole',
+    index=7,
+    containing_service=None,
+    input_type=_DELETEROLEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isUsernameAvailable',
+    full_name='org.apache.custos.iam.service.IamAdminService.isUsernameAvailable',
+    index=8,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='registerUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.registerUser',
+    index=9,
+    containing_service=None,
+    input_type=_REGISTERUSERREQUEST,
+    output_type=_REGISTERUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.enableUser',
+    index=10,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_USERREPRESENTATION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='disableUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.disableUser',
+    index=11,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_USERREPRESENTATION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isUserEnabled',
+    full_name='org.apache.custos.iam.service.IamAdminService.isUserEnabled',
+    index=12,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isUserExist',
+    full_name='org.apache.custos.iam.service.IamAdminService.isUserExist',
+    index=13,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_CHECKINGRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.getUser',
+    index=14,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_USERREPRESENTATION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findUsers',
+    full_name='org.apache.custos.iam.service.IamAdminService.findUsers',
+    index=15,
+    containing_service=None,
+    input_type=_FINDUSERSREQUEST,
+    output_type=_FINDUSERSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='resetPassword',
+    full_name='org.apache.custos.iam.service.IamAdminService.resetPassword',
+    index=16,
+    containing_service=None,
+    input_type=_RESETUSERPASSWORD,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='grantAdminPrivilege',
+    full_name='org.apache.custos.iam.service.IamAdminService.grantAdminPrivilege',
+    index=17,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeAdminPrivilege',
+    full_name='org.apache.custos.iam.service.IamAdminService.removeAdminPrivilege',
+    index=18,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='registerAndEnableUsers',
+    full_name='org.apache.custos.iam.service.IamAdminService.registerAndEnableUsers',
+    index=19,
+    containing_service=None,
+    input_type=_REGISTERUSERSREQUEST,
+    output_type=_REGISTERUSERSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserAttributes',
+    full_name='org.apache.custos.iam.service.IamAdminService.addUserAttributes',
+    index=20,
+    containing_service=None,
+    input_type=_ADDUSERATTRIBUTESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUserAttributes',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteUserAttributes',
+    index=21,
+    containing_service=None,
+    input_type=_DELETEUSERATTRIBUTEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToUsers',
+    full_name='org.apache.custos.iam.service.IamAdminService.addRolesToUsers',
+    index=22,
+    containing_service=None,
+    input_type=_ADDUSERROLESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteUser',
+    index=23,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteRolesFromUser',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteRolesFromUser',
+    index=24,
+    containing_service=None,
+    input_type=_DELETEUSERROLESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateUserProfile',
+    full_name='org.apache.custos.iam.service.IamAdminService.updateUserProfile',
+    index=25,
+    containing_service=None,
+    input_type=_UPDATEUSERPROFILEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOperationMetadata',
+    full_name='org.apache.custos.iam.service.IamAdminService.getOperationMetadata',
+    index=26,
+    containing_service=None,
+    input_type=_GETOPERATIONSMETADATAREQUEST,
+    output_type=_GETOPERATIONSMETADATARESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='configureEventPersistence',
+    full_name='org.apache.custos.iam.service.IamAdminService.configureEventPersistence',
+    index=27,
+    containing_service=None,
+    input_type=_EVENTPERSISTENCEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createGroups',
+    full_name='org.apache.custos.iam.service.IamAdminService.createGroups',
+    index=28,
+    containing_service=None,
+    input_type=_GROUPSREQUEST,
+    output_type=_GROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateGroup',
+    full_name='org.apache.custos.iam.service.IamAdminService.updateGroup',
+    index=29,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUPREPRESENTATION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteGroup',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteGroup',
+    index=30,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findGroup',
+    full_name='org.apache.custos.iam.service.IamAdminService.findGroup',
+    index=31,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUPREPRESENTATION,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllGroups',
+    full_name='org.apache.custos.iam.service.IamAdminService.getAllGroups',
+    index=32,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserToGroup',
+    full_name='org.apache.custos.iam.service.IamAdminService.addUserToGroup',
+    index=33,
+    containing_service=None,
+    input_type=_USERGROUPMAPPINGREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserFromGroup',
+    full_name='org.apache.custos.iam.service.IamAdminService.removeUserFromGroup',
+    index=34,
+    containing_service=None,
+    input_type=_USERGROUPMAPPINGREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createAgentClient',
+    full_name='org.apache.custos.iam.service.IamAdminService.createAgentClient',
+    index=35,
+    containing_service=None,
+    input_type=_AGENTCLIENTMETADATA,
+    output_type=_SETUPTENANTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='configureAgentClient',
+    full_name='org.apache.custos.iam.service.IamAdminService.configureAgentClient',
+    index=36,
+    containing_service=None,
+    input_type=_AGENTCLIENTMETADATA,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isAgentNameAvailable',
+    full_name='org.apache.custos.iam.service.IamAdminService.isAgentNameAvailable',
+    index=37,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='registerAndEnableAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.registerAndEnableAgent',
+    index=38,
+    containing_service=None,
+    input_type=_REGISTERUSERREQUEST,
+    output_type=_REGISTERUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteAgent',
+    index=39,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.getAgent',
+    index=40,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_AGENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='disableAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.disableAgent',
+    index=41,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.enableAgent',
+    index=42,
+    containing_service=None,
+    input_type=_USERSEARCHREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addAgentAttributes',
+    full_name='org.apache.custos.iam.service.IamAdminService.addAgentAttributes',
+    index=43,
+    containing_service=None,
+    input_type=_ADDUSERATTRIBUTESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgentAttributes',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteAgentAttributes',
+    index=44,
+    containing_service=None,
+    input_type=_DELETEUSERATTRIBUTEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToAgent',
+    full_name='org.apache.custos.iam.service.IamAdminService.addRolesToAgent',
+    index=45,
+    containing_service=None,
+    input_type=_ADDUSERROLESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgentRoles',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteAgentRoles',
+    index=46,
+    containing_service=None,
+    input_type=_DELETEUSERROLESREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllResources',
+    full_name='org.apache.custos.iam.service.IamAdminService.getAllResources',
+    index=47,
+    containing_service=None,
+    input_type=_GETALLRESOURCES,
+    output_type=_GETALLRESOURCESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_IAMADMINSERVICE)
+
+DESCRIPTOR.services_by_name['IamAdminService'] = _IAMADMINSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2_grpc.py
new file mode 100644
index 0000000..8a23ea4
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IamAdminService_pb2_grpc.py
@@ -0,0 +1,1635 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class IamAdminServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.setUPTenant = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/setUPTenant',
+                request_serializer=IamAdminService__pb2.SetUpTenantRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.SetUpTenantResponse.FromString,
+                )
+        self.updateTenant = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/updateTenant',
+                request_serializer=IamAdminService__pb2.SetUpTenantRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.SetUpTenantResponse.FromString,
+                )
+        self.deleteTenant = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteTenant',
+                request_serializer=IamAdminService__pb2.DeleteTenantRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.configureFederatedIDP = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/configureFederatedIDP',
+                request_serializer=IamAdminService__pb2.ConfigureFederateIDPRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.FederateIDPResponse.FromString,
+                )
+        self.addRolesToTenant = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addRolesToTenant',
+                request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.addProtocolMapper = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addProtocolMapper',
+                request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getRolesOfTenant = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getRolesOfTenant',
+                request_serializer=IamAdminService__pb2.GetRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.deleteRole = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteRole',
+                request_serializer=IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.isUsernameAvailable = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/isUsernameAvailable',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.registerUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/registerUser',
+                request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.RegisterUserResponse.FromString,
+                )
+        self.enableUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/enableUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.disableUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/disableUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.isUserEnabled = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/isUserEnabled',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.isUserExist = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/isUserExist',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.CheckingResponse.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.findUsers = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/findUsers',
+                request_serializer=IamAdminService__pb2.FindUsersRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.FindUsersResponse.FromString,
+                )
+        self.resetPassword = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/resetPassword',
+                request_serializer=IamAdminService__pb2.ResetUserPassword.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.grantAdminPrivilege = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/grantAdminPrivilege',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.removeAdminPrivilege = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/removeAdminPrivilege',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.registerAndEnableUsers = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/registerAndEnableUsers',
+                request_serializer=IamAdminService__pb2.RegisterUsersRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.RegisterUsersResponse.FromString,
+                )
+        self.addUserAttributes = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addUserAttributes',
+                request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteUserAttributes = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteUserAttributes',
+                request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToUsers = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addRolesToUsers',
+                request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteRolesFromUser = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteRolesFromUser',
+                request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.updateUserProfile = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/updateUserProfile',
+                request_serializer=IamAdminService__pb2.UpdateUserProfileRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getOperationMetadata = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getOperationMetadata',
+                request_serializer=IamAdminService__pb2.GetOperationsMetadataRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GetOperationsMetadataResponse.FromString,
+                )
+        self.configureEventPersistence = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/configureEventPersistence',
+                request_serializer=IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.createGroups = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/createGroups',
+                request_serializer=IamAdminService__pb2.GroupsRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
+                )
+        self.updateGroup = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/updateGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
+                )
+        self.deleteGroup = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.findGroup = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/findGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
+                )
+        self.getAllGroups = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getAllGroups',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
+                )
+        self.addUserToGroup = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addUserToGroup',
+                request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.removeUserFromGroup = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/removeUserFromGroup',
+                request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.createAgentClient = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/createAgentClient',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.SetUpTenantResponse.FromString,
+                )
+        self.configureAgentClient = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/configureAgentClient',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.isAgentNameAvailable = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/isAgentNameAvailable',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.registerAndEnableAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/registerAndEnableAgent',
+                request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.RegisterUserResponse.FromString,
+                )
+        self.deleteAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteAgent',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getAgent',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.Agent.FromString,
+                )
+        self.disableAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/disableAgent',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/enableAgent',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addAgentAttributes',
+                request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteAgentAttributes',
+                request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToAgent = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/addRolesToAgent',
+                request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteAgentRoles = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteAgentRoles',
+                request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getAllResources = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/getAllResources',
+                request_serializer=IamAdminService__pb2.GetAllResources.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GetAllResourcesResponse.FromString,
+                )
+
+
+class IamAdminServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def setUPTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def configureFederatedIDP(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addProtocolMapper(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getRolesOfTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isUsernameAvailable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def registerUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enableUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def disableUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isUserEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isUserExist(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def resetPassword(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def grantAdminPrivilege(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeAdminPrivilege(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def registerAndEnableUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUserAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteRolesFromUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOperationMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def configureEventPersistence(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserToGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserFromGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createAgentClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def configureAgentClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isAgentNameAvailable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def registerAndEnableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def disableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgentRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllResources(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_IamAdminServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'setUPTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.setUPTenant,
+                    request_deserializer=IamAdminService__pb2.SetUpTenantRequest.FromString,
+                    response_serializer=IamAdminService__pb2.SetUpTenantResponse.SerializeToString,
+            ),
+            'updateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenant,
+                    request_deserializer=IamAdminService__pb2.SetUpTenantRequest.FromString,
+                    response_serializer=IamAdminService__pb2.SetUpTenantResponse.SerializeToString,
+            ),
+            'deleteTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteTenant,
+                    request_deserializer=IamAdminService__pb2.DeleteTenantRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'configureFederatedIDP': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureFederatedIDP,
+                    request_deserializer=IamAdminService__pb2.ConfigureFederateIDPRequest.FromString,
+                    response_serializer=IamAdminService__pb2.FederateIDPResponse.SerializeToString,
+            ),
+            'addRolesToTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToTenant,
+                    request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
+                    servicer.addProtocolMapper,
+                    request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getRolesOfTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getRolesOfTenant,
+                    request_deserializer=IamAdminService__pb2.GetRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'deleteRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRole,
+                    request_deserializer=IamAdminService__pb2.DeleteRoleRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isUsernameAvailable': grpc.unary_unary_rpc_method_handler(
+                    servicer.isUsernameAvailable,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'registerUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerUser,
+                    request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
+                    response_serializer=IamAdminService__pb2.RegisterUserResponse.SerializeToString,
+            ),
+            'enableUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'disableUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.disableUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'isUserEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isUserEnabled,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isUserExist': grpc.unary_unary_rpc_method_handler(
+                    servicer.isUserExist,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.CheckingResponse.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'findUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.findUsers,
+                    request_deserializer=IamAdminService__pb2.FindUsersRequest.FromString,
+                    response_serializer=IamAdminService__pb2.FindUsersResponse.SerializeToString,
+            ),
+            'resetPassword': grpc.unary_unary_rpc_method_handler(
+                    servicer.resetPassword,
+                    request_deserializer=IamAdminService__pb2.ResetUserPassword.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'grantAdminPrivilege': grpc.unary_unary_rpc_method_handler(
+                    servicer.grantAdminPrivilege,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'removeAdminPrivilege': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeAdminPrivilege,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'registerAndEnableUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerAndEnableUsers,
+                    request_deserializer=IamAdminService__pb2.RegisterUsersRequest.FromString,
+                    response_serializer=IamAdminService__pb2.RegisterUsersResponse.SerializeToString,
+            ),
+            'addUserAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserAttributes,
+                    request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteUserAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUserAttributes,
+                    request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToUsers,
+                    request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteRolesFromUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRolesFromUser,
+                    request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'updateUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateUserProfile,
+                    request_deserializer=IamAdminService__pb2.UpdateUserProfileRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOperationMetadata,
+                    request_deserializer=IamAdminService__pb2.GetOperationsMetadataRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GetOperationsMetadataResponse.SerializeToString,
+            ),
+            'configureEventPersistence': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureEventPersistence,
+                    request_deserializer=IamAdminService__pb2.EventPersistenceRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'createGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.createGroups,
+                    request_deserializer=IamAdminService__pb2.GroupsRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
+            ),
+            'updateGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
+            ),
+            'deleteGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'findGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.findGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
+            ),
+            'getAllGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroups,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
+            ),
+            'addUserToGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToGroup,
+                    request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'removeUserFromGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromGroup,
+                    request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'createAgentClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.createAgentClient,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.SetUpTenantResponse.SerializeToString,
+            ),
+            'configureAgentClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureAgentClient,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isAgentNameAvailable': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAgentNameAvailable,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'registerAndEnableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerAndEnableAgent,
+                    request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
+                    response_serializer=IamAdminService__pb2.RegisterUserResponse.SerializeToString,
+            ),
+            'deleteAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgent,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgent,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.Agent.SerializeToString,
+            ),
+            'disableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.disableAgent,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableAgent,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.addAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToAgent,
+                    request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteAgentRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentRoles,
+                    request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAllResources': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllResources,
+                    request_deserializer=IamAdminService__pb2.GetAllResources.FromString,
+                    response_serializer=IamAdminService__pb2.GetAllResourcesResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.iam.service.IamAdminService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class IamAdminService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def setUPTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/setUPTenant',
+            IamAdminService__pb2.SetUpTenantRequest.SerializeToString,
+            IamAdminService__pb2.SetUpTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/updateTenant',
+            IamAdminService__pb2.SetUpTenantRequest.SerializeToString,
+            IamAdminService__pb2.SetUpTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteTenant',
+            IamAdminService__pb2.DeleteTenantRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureFederatedIDP(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/configureFederatedIDP',
+            IamAdminService__pb2.ConfigureFederateIDPRequest.SerializeToString,
+            IamAdminService__pb2.FederateIDPResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addRolesToTenant',
+            IamAdminService__pb2.AddRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addProtocolMapper(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addProtocolMapper',
+            IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getRolesOfTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getRolesOfTenant',
+            IamAdminService__pb2.GetRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteRole',
+            IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isUsernameAvailable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/isUsernameAvailable',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/registerUser',
+            IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+            IamAdminService__pb2.RegisterUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/enableUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disableUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/disableUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isUserEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/isUserEnabled',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isUserExist(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/isUserExist',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.CheckingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/findUsers',
+            IamAdminService__pb2.FindUsersRequest.SerializeToString,
+            IamAdminService__pb2.FindUsersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def resetPassword(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/resetPassword',
+            IamAdminService__pb2.ResetUserPassword.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def grantAdminPrivilege(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/grantAdminPrivilege',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeAdminPrivilege(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/removeAdminPrivilege',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerAndEnableUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/registerAndEnableUsers',
+            IamAdminService__pb2.RegisterUsersRequest.SerializeToString,
+            IamAdminService__pb2.RegisterUsersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addUserAttributes',
+            IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUserAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteUserAttributes',
+            IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addRolesToUsers',
+            IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRolesFromUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteRolesFromUser',
+            IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/updateUserProfile',
+            IamAdminService__pb2.UpdateUserProfileRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOperationMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getOperationMetadata',
+            IamAdminService__pb2.GetOperationsMetadataRequest.SerializeToString,
+            IamAdminService__pb2.GetOperationsMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureEventPersistence(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/configureEventPersistence',
+            IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/createGroups',
+            IamAdminService__pb2.GroupsRequest.SerializeToString,
+            IamAdminService__pb2.GroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/updateGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/findGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getAllGroups',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserToGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addUserToGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserFromGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/removeUserFromGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createAgentClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/createAgentClient',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.SetUpTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureAgentClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/configureAgentClient',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAgentNameAvailable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/isAgentNameAvailable',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerAndEnableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/registerAndEnableAgent',
+            IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+            IamAdminService__pb2.RegisterUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteAgent',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getAgent',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/disableAgent',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/enableAgent',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addAgentAttributes',
+            IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteAgentAttributes',
+            IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/addRolesToAgent',
+            IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteAgentRoles',
+            IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllResources(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/getAllResources',
+            IamAdminService__pb2.GetAllResources.SerializeToString,
+            IamAdminService__pb2.GetAllResourcesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2.py
new file mode 100644
index 0000000..53e0fa4
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2.py
@@ -0,0 +1,990 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: IdentityService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='IdentityService.proto',
+  package='org.apache.custos.identity.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15IdentityService.proto\x12\"org.apache.custos.identity.service\x1a\x1cgoogle/protobuf/struct.proto\"\\\n\tAuthToken\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x39\n\x06\x63laims\x18\x02 \x03(\x0b\x32).org.apache.custos.identity.service.Claim\"#\n\x05\x43laim\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"v\n\x04User\x12\x0b\n\x03sub\x18\x01 \x01(\t\x12\x11\n\tfull_name\x18\x02 \x01(\t\x12\x12\n\nfirst_name\x18\x03 \x01(\t\x12\x11\n\tlast_name\x18\x04 \x01(\t\x12\x15\n\remail_address\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\"\xc1\x01\n\x0fGetTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x0c\n\x04\x63ode\x18\x06 \x01(\t\x12\x10\n\x08username\x18\x07 \x01(\t\x12\x10\n\x08password\x18\x08 \x01(\t\x12\x15\n\rrefresh_token\x18\t \x01(\t\x12\x12\n\ngrant_type\x18\n \x01(\t\"\xd3\x01\n\rTokenResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x12\n\nexpires_in\x18\x02 \x01(\x01\x12\x1a\n\x12refresh_expires_in\x18\x03 \x01(\x01\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\x12\x12\n\ntoken_type\x18\x05 \x01(\t\x12\x10\n\x08id_token\x18\x06 \x01(\t\x12\x19\n\x11not_before_policy\x18\x07 \x01(\x01\x12\x15\n\rsession_state\x18\x08 \x01(\t\x12\r\n\x05scope\x18\t \x01(\t\"x\n\x15\x41uthenticationRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\"0\n\x17IsAuthenticatedResponse\x12\x15\n\rauthenticated\x18\x01 \x01(\x08\"^\n\x1fGetUserManagementSATokenRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"4\n\x1fGetAuthorizationEndpointRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"7\n\x15\x41uthorizationResponse\x12\x1e\n\x16\x61uthorization_endpoint\x18\x02 \x01(\t\"S\n\x14GetOIDCConfiguration\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"M\n\x0eGetJWKSRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"g\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\x32\x9f\n\n\x0fIdentityService\x12x\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12}\n\x0fisAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\x12\x62\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\x12\xa0\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12X\n\x08getToken\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12\x96\x01\n\x14getAuthorizeEndpoint\x12\x43.org.apache.custos.identity.service.GetAuthorizationEndpointRequest\x1a\x39.org.apache.custos.identity.service.AuthorizationResponse\x12i\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\x12k\n\x1bgetTokenByPasswordGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12o\n\x1fgetTokenByRefreshTokenGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12V\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\x12x\n\nendSession\x12\x35.org.apache.custos.identity.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
+
+
+
+
+_AUTHTOKEN = _descriptor.Descriptor(
+  name='AuthToken',
+  full_name='org.apache.custos.identity.service.AuthToken',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.identity.service.AuthToken.access_token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='claims', full_name='org.apache.custos.identity.service.AuthToken.claims', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=91,
+  serialized_end=183,
+)
+
+
+_CLAIM = _descriptor.Descriptor(
+  name='Claim',
+  full_name='org.apache.custos.identity.service.Claim',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.identity.service.Claim.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.identity.service.Claim.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=185,
+  serialized_end=220,
+)
+
+
+_USER = _descriptor.Descriptor(
+  name='User',
+  full_name='org.apache.custos.identity.service.User',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sub', full_name='org.apache.custos.identity.service.User.sub', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='full_name', full_name='org.apache.custos.identity.service.User.full_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='first_name', full_name='org.apache.custos.identity.service.User.first_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_name', full_name='org.apache.custos.identity.service.User.last_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_address', full_name='org.apache.custos.identity.service.User.email_address', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.identity.service.User.username', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=222,
+  serialized_end=340,
+)
+
+
+_GETTOKENREQUEST = _descriptor.Descriptor(
+  name='GetTokenRequest',
+  full_name='org.apache.custos.identity.service.GetTokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetTokenRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.GetTokenRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.GetTokenRequest.client_secret', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uri', full_name='org.apache.custos.identity.service.GetTokenRequest.redirect_uri', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='code', full_name='org.apache.custos.identity.service.GetTokenRequest.code', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.identity.service.GetTokenRequest.username', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.identity.service.GetTokenRequest.password', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refresh_token', full_name='org.apache.custos.identity.service.GetTokenRequest.refresh_token', index=7,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='grant_type', full_name='org.apache.custos.identity.service.GetTokenRequest.grant_type', index=8,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=343,
+  serialized_end=536,
+)
+
+
+_TOKENRESPONSE = _descriptor.Descriptor(
+  name='TokenResponse',
+  full_name='org.apache.custos.identity.service.TokenResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.identity.service.TokenResponse.access_token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='expires_in', full_name='org.apache.custos.identity.service.TokenResponse.expires_in', index=1,
+      number=2, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refresh_expires_in', full_name='org.apache.custos.identity.service.TokenResponse.refresh_expires_in', index=2,
+      number=3, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refresh_token', full_name='org.apache.custos.identity.service.TokenResponse.refresh_token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token_type', full_name='org.apache.custos.identity.service.TokenResponse.token_type', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id_token', full_name='org.apache.custos.identity.service.TokenResponse.id_token', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='not_before_policy', full_name='org.apache.custos.identity.service.TokenResponse.not_before_policy', index=6,
+      number=7, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='session_state', full_name='org.apache.custos.identity.service.TokenResponse.session_state', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.identity.service.TokenResponse.scope', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=539,
+  serialized_end=750,
+)
+
+
+_AUTHENTICATIONREQUEST = _descriptor.Descriptor(
+  name='AuthenticationRequest',
+  full_name='org.apache.custos.identity.service.AuthenticationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.AuthenticationRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.AuthenticationRequest.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.AuthenticationRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.identity.service.AuthenticationRequest.username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.identity.service.AuthenticationRequest.password', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=752,
+  serialized_end=872,
+)
+
+
+_ISAUTHENTICATEDRESPONSE = _descriptor.Descriptor(
+  name='IsAuthenticatedResponse',
+  full_name='org.apache.custos.identity.service.IsAuthenticatedResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='authenticated', full_name='org.apache.custos.identity.service.IsAuthenticatedResponse.authenticated', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=874,
+  serialized_end=922,
+)
+
+
+_GETUSERMANAGEMENTSATOKENREQUEST = _descriptor.Descriptor(
+  name='GetUserManagementSATokenRequest',
+  full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=924,
+  serialized_end=1018,
+)
+
+
+_GETAUTHORIZATIONENDPOINTREQUEST = _descriptor.Descriptor(
+  name='GetAuthorizationEndpointRequest',
+  full_name='org.apache.custos.identity.service.GetAuthorizationEndpointRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetAuthorizationEndpointRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1020,
+  serialized_end=1072,
+)
+
+
+_AUTHORIZATIONRESPONSE = _descriptor.Descriptor(
+  name='AuthorizationResponse',
+  full_name='org.apache.custos.identity.service.AuthorizationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='authorization_endpoint', full_name='org.apache.custos.identity.service.AuthorizationResponse.authorization_endpoint', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1074,
+  serialized_end=1129,
+)
+
+
+_GETOIDCCONFIGURATION = _descriptor.Descriptor(
+  name='GetOIDCConfiguration',
+  full_name='org.apache.custos.identity.service.GetOIDCConfiguration',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1131,
+  serialized_end=1214,
+)
+
+
+_GETJWKSREQUEST = _descriptor.Descriptor(
+  name='GetJWKSRequest',
+  full_name='org.apache.custos.identity.service.GetJWKSRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.GetJWKSRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.GetJWKSRequest.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetJWKSRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1216,
+  serialized_end=1293,
+)
+
+
+_ENDSESSIONREQUEST = _descriptor.Descriptor(
+  name='EndSessionRequest',
+  full_name='org.apache.custos.identity.service.EndSessionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.service.EndSessionRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.service.EndSessionRequest.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.service.EndSessionRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refresh_token', full_name='org.apache.custos.identity.service.EndSessionRequest.refresh_token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1295,
+  serialized_end=1398,
+)
+
+
+_OPERATIONSTATUS = _descriptor.Descriptor(
+  name='OperationStatus',
+  full_name='org.apache.custos.identity.service.OperationStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.identity.service.OperationStatus.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1400,
+  serialized_end=1433,
+)
+
+_AUTHTOKEN.fields_by_name['claims'].message_type = _CLAIM
+DESCRIPTOR.message_types_by_name['AuthToken'] = _AUTHTOKEN
+DESCRIPTOR.message_types_by_name['Claim'] = _CLAIM
+DESCRIPTOR.message_types_by_name['User'] = _USER
+DESCRIPTOR.message_types_by_name['GetTokenRequest'] = _GETTOKENREQUEST
+DESCRIPTOR.message_types_by_name['TokenResponse'] = _TOKENRESPONSE
+DESCRIPTOR.message_types_by_name['AuthenticationRequest'] = _AUTHENTICATIONREQUEST
+DESCRIPTOR.message_types_by_name['IsAuthenticatedResponse'] = _ISAUTHENTICATEDRESPONSE
+DESCRIPTOR.message_types_by_name['GetUserManagementSATokenRequest'] = _GETUSERMANAGEMENTSATOKENREQUEST
+DESCRIPTOR.message_types_by_name['GetAuthorizationEndpointRequest'] = _GETAUTHORIZATIONENDPOINTREQUEST
+DESCRIPTOR.message_types_by_name['AuthorizationResponse'] = _AUTHORIZATIONRESPONSE
+DESCRIPTOR.message_types_by_name['GetOIDCConfiguration'] = _GETOIDCCONFIGURATION
+DESCRIPTOR.message_types_by_name['GetJWKSRequest'] = _GETJWKSREQUEST
+DESCRIPTOR.message_types_by_name['EndSessionRequest'] = _ENDSESSIONREQUEST
+DESCRIPTOR.message_types_by_name['OperationStatus'] = _OPERATIONSTATUS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+AuthToken = _reflection.GeneratedProtocolMessageType('AuthToken', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHTOKEN,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.AuthToken)
+  })
+_sym_db.RegisterMessage(AuthToken)
+
+Claim = _reflection.GeneratedProtocolMessageType('Claim', (_message.Message,), {
+  'DESCRIPTOR' : _CLAIM,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.Claim)
+  })
+_sym_db.RegisterMessage(Claim)
+
+User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
+  'DESCRIPTOR' : _USER,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.User)
+  })
+_sym_db.RegisterMessage(User)
+
+GetTokenRequest = _reflection.GeneratedProtocolMessageType('GetTokenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTOKENREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.GetTokenRequest)
+  })
+_sym_db.RegisterMessage(GetTokenRequest)
+
+TokenResponse = _reflection.GeneratedProtocolMessageType('TokenResponse', (_message.Message,), {
+  'DESCRIPTOR' : _TOKENRESPONSE,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.TokenResponse)
+  })
+_sym_db.RegisterMessage(TokenResponse)
+
+AuthenticationRequest = _reflection.GeneratedProtocolMessageType('AuthenticationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHENTICATIONREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.AuthenticationRequest)
+  })
+_sym_db.RegisterMessage(AuthenticationRequest)
+
+IsAuthenticatedResponse = _reflection.GeneratedProtocolMessageType('IsAuthenticatedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ISAUTHENTICATEDRESPONSE,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.IsAuthenticatedResponse)
+  })
+_sym_db.RegisterMessage(IsAuthenticatedResponse)
+
+GetUserManagementSATokenRequest = _reflection.GeneratedProtocolMessageType('GetUserManagementSATokenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETUSERMANAGEMENTSATOKENREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.GetUserManagementSATokenRequest)
+  })
+_sym_db.RegisterMessage(GetUserManagementSATokenRequest)
+
+GetAuthorizationEndpointRequest = _reflection.GeneratedProtocolMessageType('GetAuthorizationEndpointRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETAUTHORIZATIONENDPOINTREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.GetAuthorizationEndpointRequest)
+  })
+_sym_db.RegisterMessage(GetAuthorizationEndpointRequest)
+
+AuthorizationResponse = _reflection.GeneratedProtocolMessageType('AuthorizationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHORIZATIONRESPONSE,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.AuthorizationResponse)
+  })
+_sym_db.RegisterMessage(AuthorizationResponse)
+
+GetOIDCConfiguration = _reflection.GeneratedProtocolMessageType('GetOIDCConfiguration', (_message.Message,), {
+  'DESCRIPTOR' : _GETOIDCCONFIGURATION,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.GetOIDCConfiguration)
+  })
+_sym_db.RegisterMessage(GetOIDCConfiguration)
+
+GetJWKSRequest = _reflection.GeneratedProtocolMessageType('GetJWKSRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETJWKSREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.GetJWKSRequest)
+  })
+_sym_db.RegisterMessage(GetJWKSRequest)
+
+EndSessionRequest = _reflection.GeneratedProtocolMessageType('EndSessionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENDSESSIONREQUEST,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.EndSessionRequest)
+  })
+_sym_db.RegisterMessage(EndSessionRequest)
+
+OperationStatus = _reflection.GeneratedProtocolMessageType('OperationStatus', (_message.Message,), {
+  'DESCRIPTOR' : _OPERATIONSTATUS,
+  '__module__' : 'IdentityService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.OperationStatus)
+  })
+_sym_db.RegisterMessage(OperationStatus)
+
+
+DESCRIPTOR._options = None
+
+_IDENTITYSERVICE = _descriptor.ServiceDescriptor(
+  name='IdentityService',
+  full_name='org.apache.custos.identity.service.IdentityService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1436,
+  serialized_end=2747,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='authenticate',
+    full_name='org.apache.custos.identity.service.IdentityService.authenticate',
+    index=0,
+    containing_service=None,
+    input_type=_AUTHENTICATIONREQUEST,
+    output_type=_AUTHTOKEN,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isAuthenticated',
+    full_name='org.apache.custos.identity.service.IdentityService.isAuthenticated',
+    index=1,
+    containing_service=None,
+    input_type=_AUTHTOKEN,
+    output_type=_ISAUTHENTICATEDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUser',
+    full_name='org.apache.custos.identity.service.IdentityService.getUser',
+    index=2,
+    containing_service=None,
+    input_type=_AUTHTOKEN,
+    output_type=_USER,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserManagementServiceAccountAccessToken',
+    full_name='org.apache.custos.identity.service.IdentityService.getUserManagementServiceAccountAccessToken',
+    index=3,
+    containing_service=None,
+    input_type=_GETUSERMANAGEMENTSATOKENREQUEST,
+    output_type=_AUTHTOKEN,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getToken',
+    full_name='org.apache.custos.identity.service.IdentityService.getToken',
+    index=4,
+    containing_service=None,
+    input_type=_GETTOKENREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAuthorizeEndpoint',
+    full_name='org.apache.custos.identity.service.IdentityService.getAuthorizeEndpoint',
+    index=5,
+    containing_service=None,
+    input_type=_GETAUTHORIZATIONENDPOINTREQUEST,
+    output_type=_AUTHORIZATIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOIDCConfiguration',
+    full_name='org.apache.custos.identity.service.IdentityService.getOIDCConfiguration',
+    index=6,
+    containing_service=None,
+    input_type=_GETOIDCCONFIGURATION,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTokenByPasswordGrantType',
+    full_name='org.apache.custos.identity.service.IdentityService.getTokenByPasswordGrantType',
+    index=7,
+    containing_service=None,
+    input_type=_GETTOKENREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTokenByRefreshTokenGrantType',
+    full_name='org.apache.custos.identity.service.IdentityService.getTokenByRefreshTokenGrantType',
+    index=8,
+    containing_service=None,
+    input_type=_GETTOKENREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getJWKS',
+    full_name='org.apache.custos.identity.service.IdentityService.getJWKS',
+    index=9,
+    containing_service=None,
+    input_type=_GETJWKSREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='endSession',
+    full_name='org.apache.custos.identity.service.IdentityService.endSession',
+    index=10,
+    containing_service=None,
+    input_type=_ENDSESSIONREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_IDENTITYSERVICE)
+
+DESCRIPTOR.services_by_name['IdentityService'] = _IDENTITYSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2_grpc.py
new file mode 100644
index 0000000..3555342
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/IdentityService_pb2_grpc.py
@@ -0,0 +1,414 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+class IdentityServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.authenticate = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/authenticate',
+                request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.isAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/isAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getUser',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.User.FromString,
+                )
+        self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getUserManagementServiceAccountAccessToken',
+                request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.getToken = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getToken',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getAuthorizeEndpoint = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getAuthorizeEndpoint',
+                request_serializer=IdentityService__pb2.GetAuthorizationEndpointRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthorizationResponse.FromString,
+                )
+        self.getOIDCConfiguration = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getOIDCConfiguration',
+                request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getTokenByPasswordGrantType = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getTokenByPasswordGrantType',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getTokenByRefreshTokenGrantType = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getTokenByRefreshTokenGrantType',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getJWKS = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getJWKS',
+                request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.endSession = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/endSession',
+                request_serializer=IdentityService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
+
+
+class IdentityServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def authenticate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserManagementServiceAccountAccessToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAuthorizeEndpoint(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOIDCConfiguration(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTokenByPasswordGrantType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTokenByRefreshTokenGrantType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getJWKS(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def endSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_IdentityServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'authenticate': grpc.unary_unary_rpc_method_handler(
+                    servicer.authenticate,
+                    request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'isAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.User.SerializeToString,
+            ),
+            'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserManagementServiceAccountAccessToken,
+                    request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'getToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getToken,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getAuthorizeEndpoint': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAuthorizeEndpoint,
+                    request_deserializer=IdentityService__pb2.GetAuthorizationEndpointRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthorizationResponse.SerializeToString,
+            ),
+            'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOIDCConfiguration,
+                    request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getTokenByPasswordGrantType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTokenByPasswordGrantType,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getTokenByRefreshTokenGrantType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTokenByRefreshTokenGrantType,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getJWKS': grpc.unary_unary_rpc_method_handler(
+                    servicer.getJWKS,
+                    request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'endSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endSession,
+                    request_deserializer=IdentityService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.identity.service.IdentityService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class IdentityService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def authenticate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/authenticate',
+            IdentityService__pb2.AuthenticationRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/isAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getUser',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.User.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserManagementServiceAccountAccessToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getUserManagementServiceAccountAccessToken',
+            IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getToken',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAuthorizeEndpoint(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getAuthorizeEndpoint',
+            IdentityService__pb2.GetAuthorizationEndpointRequest.SerializeToString,
+            IdentityService__pb2.AuthorizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOIDCConfiguration(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getOIDCConfiguration',
+            IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTokenByPasswordGrantType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getTokenByPasswordGrantType',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTokenByRefreshTokenGrantType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getTokenByRefreshTokenGrantType',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getJWKS(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getJWKS',
+            IdentityService__pb2.GetJWKSRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/endSession',
+            IdentityService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2.py
new file mode 100644
index 0000000..6cf3ef4
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2.py
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: LoggingService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='LoggingService.proto',
+  package='org.apache.custos.logging.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x14LoggingService.proto\x12!org.apache.custos.logging.service\x1a\x1bgoogle/protobuf/empty.proto\"\x97\x01\n\x08LogEvent\x12\x14\n\x0c\x63reated_time\x18\x01 \x01(\x03\x12\x14\n\x0cservice_name\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12\x13\n\x0b\x65xternal_ip\x18\x07 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\xcb\x01\n\x0fLogEventRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x12\n\nstart_time\x18\x02 \x01(\x03\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x10\n\x08username\x18\x05 \x01(\t\x12\x11\n\tremote_ip\x18\x06 \x01(\t\x12\x14\n\x0cservice_name\x18\x07 \x01(\t\x12\x12\n\nevent_type\x18\x08 \x01(\t\x12\x0e\n\x06offset\x18\t \x01(\x05\x12\r\n\x05limit\x18\n \x01(\x05\"H\n\tLogEvents\x12;\n\x06\x65vents\x18\x01 \x03(\x0b\x32+.org.apache.custos.logging.service.LogEvent\"C\n\x1bLoggingConfigurationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t2\xd9\x03\n\x0eLoggingService\x12\x65\n\x0b\x61\x64\x64LogEvent\x12+.org.apache.custos.logging.service.LogEvent\x1a).org.apache.custos.logging.service.Status\x12p\n\x0cgetLogEvents\x12\x32.org.apache.custos.logging.service.LogEventRequest\x1a,.org.apache.custos.logging.service.LogEvents\x12y\n\x0cisLogEnabled\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\x12s\n\x06\x65nable\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_LOGEVENT = _descriptor.Descriptor(
+  name='LogEvent',
+  full_name='org.apache.custos.logging.service.LogEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created_time', full_name='org.apache.custos.logging.service.LogEvent.created_time', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.logging.service.LogEvent.service_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.logging.service.LogEvent.event_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.logging.service.LogEvent.username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LogEvent.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LogEvent.tenant_id', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='external_ip', full_name='org.apache.custos.logging.service.LogEvent.external_ip', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=89,
+  serialized_end=240,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.logging.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.logging.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=242,
+  serialized_end=266,
+)
+
+
+_LOGEVENTREQUEST = _descriptor.Descriptor(
+  name='LogEventRequest',
+  full_name='org.apache.custos.logging.service.LogEventRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LogEventRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='start_time', full_name='org.apache.custos.logging.service.LogEventRequest.start_time', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='end_time', full_name='org.apache.custos.logging.service.LogEventRequest.end_time', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LogEventRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.logging.service.LogEventRequest.username', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='remote_ip', full_name='org.apache.custos.logging.service.LogEventRequest.remote_ip', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.logging.service.LogEventRequest.service_name', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.logging.service.LogEventRequest.event_type', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.logging.service.LogEventRequest.offset', index=8,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.logging.service.LogEventRequest.limit', index=9,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=269,
+  serialized_end=472,
+)
+
+
+_LOGEVENTS = _descriptor.Descriptor(
+  name='LogEvents',
+  full_name='org.apache.custos.logging.service.LogEvents',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='events', full_name='org.apache.custos.logging.service.LogEvents.events', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=474,
+  serialized_end=546,
+)
+
+
+_LOGGINGCONFIGURATIONREQUEST = _descriptor.Descriptor(
+  name='LoggingConfigurationRequest',
+  full_name='org.apache.custos.logging.service.LoggingConfigurationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LoggingConfigurationRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LoggingConfigurationRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=548,
+  serialized_end=615,
+)
+
+_LOGEVENTS.fields_by_name['events'].message_type = _LOGEVENT
+DESCRIPTOR.message_types_by_name['LogEvent'] = _LOGEVENT
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['LogEventRequest'] = _LOGEVENTREQUEST
+DESCRIPTOR.message_types_by_name['LogEvents'] = _LOGEVENTS
+DESCRIPTOR.message_types_by_name['LoggingConfigurationRequest'] = _LOGGINGCONFIGURATIONREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+LogEvent = _reflection.GeneratedProtocolMessageType('LogEvent', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENT,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEvent)
+  })
+_sym_db.RegisterMessage(LogEvent)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+LogEventRequest = _reflection.GeneratedProtocolMessageType('LogEventRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENTREQUEST,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEventRequest)
+  })
+_sym_db.RegisterMessage(LogEventRequest)
+
+LogEvents = _reflection.GeneratedProtocolMessageType('LogEvents', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENTS,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEvents)
+  })
+_sym_db.RegisterMessage(LogEvents)
+
+LoggingConfigurationRequest = _reflection.GeneratedProtocolMessageType('LoggingConfigurationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LOGGINGCONFIGURATIONREQUEST,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LoggingConfigurationRequest)
+  })
+_sym_db.RegisterMessage(LoggingConfigurationRequest)
+
+
+DESCRIPTOR._options = None
+
+_LOGGINGSERVICE = _descriptor.ServiceDescriptor(
+  name='LoggingService',
+  full_name='org.apache.custos.logging.service.LoggingService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=618,
+  serialized_end=1091,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='addLogEvent',
+    full_name='org.apache.custos.logging.service.LoggingService.addLogEvent',
+    index=0,
+    containing_service=None,
+    input_type=_LOGEVENT,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getLogEvents',
+    full_name='org.apache.custos.logging.service.LoggingService.getLogEvents',
+    index=1,
+    containing_service=None,
+    input_type=_LOGEVENTREQUEST,
+    output_type=_LOGEVENTS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isLogEnabled',
+    full_name='org.apache.custos.logging.service.LoggingService.isLogEnabled',
+    index=2,
+    containing_service=None,
+    input_type=_LOGGINGCONFIGURATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.logging.service.LoggingService.enable',
+    index=3,
+    containing_service=None,
+    input_type=_LOGGINGCONFIGURATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LOGGINGSERVICE)
+
+DESCRIPTOR.services_by_name['LoggingService'] = _LOGGINGSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2_grpc.py
new file mode 100644
index 0000000..8b44c96
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/LoggingService_pb2_grpc.py
@@ -0,0 +1,165 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+class LoggingServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addLogEvent = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/addLogEvent',
+                request_serializer=LoggingService__pb2.LogEvent.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.getLogEvents = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/getLogEvents',
+                request_serializer=LoggingService__pb2.LogEventRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.LogEvents.FromString,
+                )
+        self.isLogEnabled = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/isLogEnabled',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/enable',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+
+
+class LoggingServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def addLogEvent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getLogEvents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isLogEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_LoggingServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'addLogEvent': grpc.unary_unary_rpc_method_handler(
+                    servicer.addLogEvent,
+                    request_deserializer=LoggingService__pb2.LogEvent.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'getLogEvents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getLogEvents,
+                    request_deserializer=LoggingService__pb2.LogEventRequest.FromString,
+                    response_serializer=LoggingService__pb2.LogEvents.SerializeToString,
+            ),
+            'isLogEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isLogEnabled,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.logging.service.LoggingService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class LoggingService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addLogEvent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/addLogEvent',
+            LoggingService__pb2.LogEvent.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getLogEvents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/getLogEvents',
+            LoggingService__pb2.LogEventRequest.SerializeToString,
+            LoggingService__pb2.LogEvents.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isLogEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/isLogEnabled',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/enable',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2.py
new file mode 100644
index 0000000..3ad188d
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2.py
@@ -0,0 +1,334 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: MessagingService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='MessagingService.proto',
+  package='org.apache.custos.messaging.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x16MessagingService.proto\x12#org.apache.custos.messaging.service\x1a\x1bgoogle/protobuf/empty.proto\"\x9a\x02\n\x07Message\x12\x14\n\x0c\x63reated_time\x18\x01 \x01(\x03\x12\x14\n\x0cservice_name\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12P\n\nproperties\x18\x07 \x03(\x0b\x32<.org.apache.custos.messaging.service.Message.PropertiesEntry\x12\x12\n\nmessage_id\x18\x08 \x01(\t\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\">\n\x16MessageEnablingRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"(\n\x17MessageEnablingResponse\x12\r\n\x05topic\x18\x01 \x01(\t2\xfe\x01\n\x10MessagingService\x12\x64\n\x07publish\x12,.org.apache.custos.messaging.service.Message\x1a+.org.apache.custos.messaging.service.Status\x12\x83\x01\n\x06\x65nable\x12;.org.apache.custos.messaging.service.MessageEnablingRequest\x1a<.org.apache.custos.messaging.service.MessageEnablingResponseB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_MESSAGE_PROPERTIESENTRY = _descriptor.Descriptor(
+  name='PropertiesEntry',
+  full_name='org.apache.custos.messaging.service.Message.PropertiesEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.messaging.service.Message.PropertiesEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.messaging.service.Message.PropertiesEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=326,
+  serialized_end=375,
+)
+
+_MESSAGE = _descriptor.Descriptor(
+  name='Message',
+  full_name='org.apache.custos.messaging.service.Message',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created_time', full_name='org.apache.custos.messaging.service.Message.created_time', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.messaging.service.Message.service_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.messaging.service.Message.event_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.messaging.service.Message.username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.messaging.service.Message.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.messaging.service.Message.tenant_id', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='properties', full_name='org.apache.custos.messaging.service.Message.properties', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='message_id', full_name='org.apache.custos.messaging.service.Message.message_id', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_MESSAGE_PROPERTIESENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=93,
+  serialized_end=375,
+)
+
+
+_MESSAGEENABLINGREQUEST = _descriptor.Descriptor(
+  name='MessageEnablingRequest',
+  full_name='org.apache.custos.messaging.service.MessageEnablingRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.messaging.service.MessageEnablingRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.messaging.service.MessageEnablingRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=377,
+  serialized_end=439,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.messaging.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.messaging.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=441,
+  serialized_end=465,
+)
+
+
+_MESSAGEENABLINGRESPONSE = _descriptor.Descriptor(
+  name='MessageEnablingResponse',
+  full_name='org.apache.custos.messaging.service.MessageEnablingResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topic', full_name='org.apache.custos.messaging.service.MessageEnablingResponse.topic', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=467,
+  serialized_end=507,
+)
+
+_MESSAGE_PROPERTIESENTRY.containing_type = _MESSAGE
+_MESSAGE.fields_by_name['properties'].message_type = _MESSAGE_PROPERTIESENTRY
+DESCRIPTOR.message_types_by_name['Message'] = _MESSAGE
+DESCRIPTOR.message_types_by_name['MessageEnablingRequest'] = _MESSAGEENABLINGREQUEST
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['MessageEnablingResponse'] = _MESSAGEENABLINGRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Message = _reflection.GeneratedProtocolMessageType('Message', (_message.Message,), {
+
+  'PropertiesEntry' : _reflection.GeneratedProtocolMessageType('PropertiesEntry', (_message.Message,), {
+    'DESCRIPTOR' : _MESSAGE_PROPERTIESENTRY,
+    '__module__' : 'MessagingService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Message.PropertiesEntry)
+    })
+  ,
+  'DESCRIPTOR' : _MESSAGE,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Message)
+  })
+_sym_db.RegisterMessage(Message)
+_sym_db.RegisterMessage(Message.PropertiesEntry)
+
+MessageEnablingRequest = _reflection.GeneratedProtocolMessageType('MessageEnablingRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGEENABLINGREQUEST,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.MessageEnablingRequest)
+  })
+_sym_db.RegisterMessage(MessageEnablingRequest)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+MessageEnablingResponse = _reflection.GeneratedProtocolMessageType('MessageEnablingResponse', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGEENABLINGRESPONSE,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.MessageEnablingResponse)
+  })
+_sym_db.RegisterMessage(MessageEnablingResponse)
+
+
+DESCRIPTOR._options = None
+_MESSAGE_PROPERTIESENTRY._options = None
+
+_MESSAGINGSERVICE = _descriptor.ServiceDescriptor(
+  name='MessagingService',
+  full_name='org.apache.custos.messaging.service.MessagingService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=510,
+  serialized_end=764,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='publish',
+    full_name='org.apache.custos.messaging.service.MessagingService.publish',
+    index=0,
+    containing_service=None,
+    input_type=_MESSAGE,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.messaging.service.MessagingService.enable',
+    index=1,
+    containing_service=None,
+    input_type=_MESSAGEENABLINGREQUEST,
+    output_type=_MESSAGEENABLINGRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_MESSAGINGSERVICE)
+
+DESCRIPTOR.services_by_name['MessagingService'] = _MESSAGINGSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2_grpc.py
new file mode 100644
index 0000000..e568312
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/MessagingService_pb2_grpc.py
@@ -0,0 +1,99 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
+
+
+class MessagingServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.publish = channel.unary_unary(
+                '/org.apache.custos.messaging.service.MessagingService/publish',
+                request_serializer=MessagingService__pb2.Message.SerializeToString,
+                response_deserializer=MessagingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.messaging.service.MessagingService/enable',
+                request_serializer=MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+                response_deserializer=MessagingService__pb2.MessageEnablingResponse.FromString,
+                )
+
+
+class MessagingServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def publish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_MessagingServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'publish': grpc.unary_unary_rpc_method_handler(
+                    servicer.publish,
+                    request_deserializer=MessagingService__pb2.Message.FromString,
+                    response_serializer=MessagingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=MessagingService__pb2.MessageEnablingRequest.FromString,
+                    response_serializer=MessagingService__pb2.MessageEnablingResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.messaging.service.MessagingService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class MessagingService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def publish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.messaging.service.MessagingService/publish',
+            MessagingService__pb2.Message.SerializeToString,
+            MessagingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.messaging.service.MessagingService/enable',
+            MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+            MessagingService__pb2.MessageEnablingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2.py
new file mode 100644
index 0000000..06745ec
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2.py
@@ -0,0 +1,1360 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ResourceSecretService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ResourceSecretService.proto',
+  package='org.apache.custos.resource.secret.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1bResourceSecretService.proto\x12)org.apache.custos.resource.secret.service\"\xda\x03\n\x0eSecretMetadata\x12P\n\nowner_type\x18\x01 \x01(\x0e\x32<.org.apache.custos.resource.secret.service.ResourceOwnerType\x12N\n\rresource_type\x18\x02 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12I\n\x06source\x18\x03 \x01(\x0e\x32\x39.org.apache.custos.resource.secret.service.ResourceSource\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12K\n\x04type\x18\x06 \x01(\x0e\x32=.org.apache.custos.resource.secret.service.ResourceSecretType\x12\x10\n\x08tenantId\x18\x07 \x01(\x03\x12\x10\n\x08owner_id\x18\x08 \x01(\t\x12\x16\n\x0epersisted_time\x18\t \x01(\x03\x12\r\n\x05token\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x0b \x01(\t\x12\x11\n\tclient_id\x18\x0c \x01(\t\"\xc0\x02\n\x15\x43\x65rtificateCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x11\n\tx509_cert\x18\x03 \x01(\t\x12\x11\n\tnot_after\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\x12\x11\n\tlife_time\x18\x06 \x01(\x03\x12\x12\n\nnot_before\x18\x07 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x08 \x01(\x08\x12\x15\n\rnum_of_shares\x18\t \x01(\x05\x12\x11\n\tthreshold\x18\n \x01(\x05\x12\x1a\n\x12private_key_shares\x18\x0b \x03(\x0c\"\xf8\x01\n\x12PasswordCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x10\n\x08password\x18\x03 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x04 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x05 \x01(\x05\x12\x11\n\tthreshold\x18\x06 \x01(\x05\x12\x15\n\rsecret_shares\x18\x07 \x03(\x0c\x12\x0e\n\x06userId\x18\x08 \x01(\t\"\x93\x02\n\rSSHCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x12\n\npassphrase\x18\x03 \x01(\t\x12\x12\n\npublic_key\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x06 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x07 \x01(\x05\x12\x11\n\tthreshold\x18\x08 \x01(\x05\x12\x1a\n\x12private_key_shares\x18\t \x03(\x0c\"\xcd\x01\n#GetResourceCredentialByTokenRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\r\n\x05token\x18\x02 \x01(\t\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x05 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x06 \x01(\x05\x12\x11\n\tthreshold\x18\x07 \x01(\x05\"\xd3\x01\n%GetResourceCredentialSummariesRequest\x12\x45\n\x04type\x18\x01 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12\x19\n\x11\x61\x63\x63\x65ssible_tokens\x18\x02 \x03(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x10\n\x08owner_id\x18\x04 \x01(\t\x12\x11\n\tall_types\x18\x05 \x01(\x08\x12\x11\n\tclient_id\x18\x06 \x01(\t\"j\n\x1bResourceCredentialSummaries\x12K\n\x08metadata\x18\x01 \x03(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\".\n\x1d\x41\x64\x64ResourceCredentialResponse\x12\r\n\x05token\x18\x01 \x01(\t\"3\n!ResourceCredentialOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\x86\x01\n\x0cKVCredential\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12K\n\x08metadata\x18\x03 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\r\n\x05token\x18\x04 \x01(\t\"\x99\x01\n\x10GetSecretRequest\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\xf7\x01\n\rCredentialMap\x12\x63\n\x0e\x63redential_map\x18\x01 \x03(\x0b\x32K.org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry\x12K\n\x08metadata\x18\x02 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x1a\x34\n\x12\x43redentialMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*<\n\x11ResourceOwnerType\x12\x0f\n\x0bTENANT_USER\x10\x00\x12\n\n\x06\x43USTOS\x10\x01\x12\n\n\x06TENANT\x10\x02*\xbd\x01\n\x0cResourceType\x12\x16\n\x12SERVER_CERTIFICATE\x10\x00\x12\x1b\n\x17JWT_SIGNING_CERTIFICATE\x10\x01\x12\x14\n\x10VAULT_CREDENTIAL\x10\x02\x12\x06\n\x02VM\x10\x03\x12\x0b\n\x07\x41\x43\x43OUNT\x10\x04\x12\t\n\x05OTHER\x10\x05\x12\x07\n\x03SCP\x10\x06\x12\x06\n\x02S3\x10\x07\x12\x07\n\x03\x42OX\x10\x08\x12\t\n\x05\x41ZURE\x10\t\x12\x07\n\x03GCS\x10\n\x12\x0b\n\x07\x44ROPBOX\x10\x0b\x12\x07\n\x03\x46TP\x10\x0c*D\n\x0eResourceSource\x12\x08\n\x04KUBE\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x0c\n\x08\x45XTERNAL\x10\x02\x12\x0f\n\x0bLETSENCRYPT\x10\x03*k\n\x12ResourceSecretType\x12\x07\n\x03SSH\x10\x00\x12\x0c\n\x08PASSWORD\x10\x01\x12\x14\n\x10X509_CERTIFICATE\x10\x02\x12\x0c\n\x08RAW_DATA\x10\x03\x12\x06\n\x02KV\x10\x04\x12\x12\n\x0e\x43REDENTIAL_MAP\x10\x05\x32\xc8\x18\n\x15ResourceSecretService\x12\x83\x01\n\x0fgetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1a\x37.org.apache.custos.resource.secret.service.KVCredential\x12\x98\x01\n\x0fsetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9b\x01\n\x12updateKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9b\x01\n\x12\x64\x65leteKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x86\x01\n\x10getCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1a\x38.org.apache.custos.resource.secret.service.CredentialMap\x12\x96\x01\n\x10setCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\x9d\x01\n\x13updateCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9d\x01\n\x13\x64\x65leteCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xa9\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\xbd\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\x12\x96\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa0\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa6\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\x9c\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\x12\xa6\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\x12\xac\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\x12\xb3\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xb3\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xbb\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_RESOURCEOWNERTYPE = _descriptor.EnumDescriptor(
+  name='ResourceOwnerType',
+  full_name='org.apache.custos.resource.secret.service.ResourceOwnerType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='TENANT_USER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CUSTOS', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='TENANT', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2577,
+  serialized_end=2637,
+)
+_sym_db.RegisterEnumDescriptor(_RESOURCEOWNERTYPE)
+
+ResourceOwnerType = enum_type_wrapper.EnumTypeWrapper(_RESOURCEOWNERTYPE)
+_RESOURCETYPE = _descriptor.EnumDescriptor(
+  name='ResourceType',
+  full_name='org.apache.custos.resource.secret.service.ResourceType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SERVER_CERTIFICATE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='JWT_SIGNING_CERTIFICATE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='VAULT_CREDENTIAL', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='VM', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACCOUNT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OTHER', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SCP', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='S3', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='BOX', index=8, number=8,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='AZURE', index=9, number=9,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='GCS', index=10, number=10,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DROPBOX', index=11, number=11,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FTP', index=12, number=12,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2640,
+  serialized_end=2829,
+)
+_sym_db.RegisterEnumDescriptor(_RESOURCETYPE)
+
+ResourceType = enum_type_wrapper.EnumTypeWrapper(_RESOURCETYPE)
+_RESOURCESOURCE = _descriptor.EnumDescriptor(
+  name='ResourceSource',
+  full_name='org.apache.custos.resource.secret.service.ResourceSource',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='KUBE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LOCAL', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='EXTERNAL', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LETSENCRYPT', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2831,
+  serialized_end=2899,
+)
+_sym_db.RegisterEnumDescriptor(_RESOURCESOURCE)
+
+ResourceSource = enum_type_wrapper.EnumTypeWrapper(_RESOURCESOURCE)
+_RESOURCESECRETTYPE = _descriptor.EnumDescriptor(
+  name='ResourceSecretType',
+  full_name='org.apache.custos.resource.secret.service.ResourceSecretType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='SSH', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PASSWORD', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='X509_CERTIFICATE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='RAW_DATA', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KV', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CREDENTIAL_MAP', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2901,
+  serialized_end=3008,
+)
+_sym_db.RegisterEnumDescriptor(_RESOURCESECRETTYPE)
+
+ResourceSecretType = enum_type_wrapper.EnumTypeWrapper(_RESOURCESECRETTYPE)
+TENANT_USER = 0
+CUSTOS = 1
+TENANT = 2
+SERVER_CERTIFICATE = 0
+JWT_SIGNING_CERTIFICATE = 1
+VAULT_CREDENTIAL = 2
+VM = 3
+ACCOUNT = 4
+OTHER = 5
+SCP = 6
+S3 = 7
+BOX = 8
+AZURE = 9
+GCS = 10
+DROPBOX = 11
+FTP = 12
+KUBE = 0
+LOCAL = 1
+EXTERNAL = 2
+LETSENCRYPT = 3
+SSH = 0
+PASSWORD = 1
+X509_CERTIFICATE = 2
+RAW_DATA = 3
+KV = 4
+CREDENTIAL_MAP = 5
+
+
+
+_SECRETMETADATA = _descriptor.Descriptor(
+  name='SecretMetadata',
+  full_name='org.apache.custos.resource.secret.service.SecretMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_type', full_name='org.apache.custos.resource.secret.service.SecretMetadata.owner_type', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='resource_type', full_name='org.apache.custos.resource.secret.service.SecretMetadata.resource_type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='source', full_name='org.apache.custos.resource.secret.service.SecretMetadata.source', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.resource.secret.service.SecretMetadata.name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.SecretMetadata.value', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.resource.secret.service.SecretMetadata.type', index=5,
+      number=6, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.resource.secret.service.SecretMetadata.tenantId', index=6,
+      number=7, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.resource.secret.service.SecretMetadata.owner_id', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='persisted_time', full_name='org.apache.custos.resource.secret.service.SecretMetadata.persisted_time', index=8,
+      number=9, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.SecretMetadata.token', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.resource.secret.service.SecretMetadata.description', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.SecretMetadata.client_id', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=75,
+  serialized_end=549,
+)
+
+
+_CERTIFICATECREDENTIAL = _descriptor.Descriptor(
+  name='CertificateCredential',
+  full_name='org.apache.custos.resource.secret.service.CertificateCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.CertificateCredential.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='x509_cert', full_name='org.apache.custos.resource.secret.service.CertificateCredential.x509_cert', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='not_after', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_after', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='life_time', full_name='org.apache.custos.resource.secret.service.CertificateCredential.life_time', index=4,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='not_before', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_before', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.CertificateCredential.use_shamirs_secret_sharing_with_encryption', index=6,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.num_of_shares', index=7,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.CertificateCredential.threshold', index=8,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key_shares', index=9,
+      number=11, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=552,
+  serialized_end=872,
+)
+
+
+_PASSWORDCREDENTIAL = _descriptor.Descriptor(
+  name='PasswordCredential',
+  full_name='org.apache.custos.resource.secret.service.PasswordCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.PasswordCredential.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.resource.secret.service.PasswordCredential.password', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.PasswordCredential.use_shamirs_secret_sharing_with_encryption', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.num_of_shares', index=3,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.PasswordCredential.threshold', index=4,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='secret_shares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.secret_shares', index=5,
+      number=7, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='userId', full_name='org.apache.custos.resource.secret.service.PasswordCredential.userId', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=875,
+  serialized_end=1123,
+)
+
+
+_SSHCREDENTIAL = _descriptor.Descriptor(
+  name='SSHCredential',
+  full_name='org.apache.custos.resource.secret.service.SSHCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.SSHCredential.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='passphrase', full_name='org.apache.custos.resource.secret.service.SSHCredential.passphrase', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='public_key', full_name='org.apache.custos.resource.secret.service.SSHCredential.public_key', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key', full_name='org.apache.custos.resource.secret.service.SSHCredential.private_key', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.SSHCredential.use_shamirs_secret_sharing_with_encryption', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.SSHCredential.num_of_shares', index=5,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.SSHCredential.threshold', index=6,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.SSHCredential.private_key_shares', index=7,
+      number=9, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1126,
+  serialized_end=1401,
+)
+
+
+_GETRESOURCECREDENTIALBYTOKENREQUEST = _descriptor.Descriptor(
+  name='GetResourceCredentialByTokenRequest',
+  full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.performed_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.use_shamirs_secret_sharing_with_encryption', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.num_of_shares', index=5,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.threshold', index=6,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1404,
+  serialized_end=1609,
+)
+
+
+_GETRESOURCECREDENTIALSUMMARIESREQUEST = _descriptor.Descriptor(
+  name='GetResourceCredentialSummariesRequest',
+  full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.type', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='accessible_tokens', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.accessible_tokens', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.tenantId', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.owner_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='all_types', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.all_types', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest.client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1612,
+  serialized_end=1823,
+)
+
+
+_RESOURCECREDENTIALSUMMARIES = _descriptor.Descriptor(
+  name='ResourceCredentialSummaries',
+  full_name='org.apache.custos.resource.secret.service.ResourceCredentialSummaries',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.ResourceCredentialSummaries.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1825,
+  serialized_end=1931,
+)
+
+
+_ADDRESOURCECREDENTIALRESPONSE = _descriptor.Descriptor(
+  name='AddResourceCredentialResponse',
+  full_name='org.apache.custos.resource.secret.service.AddResourceCredentialResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.AddResourceCredentialResponse.token', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1933,
+  serialized_end=1979,
+)
+
+
+_RESOURCECREDENTIALOPERATIONSTATUS = _descriptor.Descriptor(
+  name='ResourceCredentialOperationStatus',
+  full_name='org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1981,
+  serialized_end=2032,
+)
+
+
+_KVCREDENTIAL = _descriptor.Descriptor(
+  name='KVCredential',
+  full_name='org.apache.custos.resource.secret.service.KVCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.resource.secret.service.KVCredential.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.KVCredential.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.KVCredential.metadata', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.KVCredential.token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2035,
+  serialized_end=2169,
+)
+
+
+_GETSECRETREQUEST = _descriptor.Descriptor(
+  name='GetSecretRequest',
+  full_name='org.apache.custos.resource.secret.service.GetSecretRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2172,
+  serialized_end=2325,
+)
+
+
+_CREDENTIALMAP_CREDENTIALMAPENTRY = _descriptor.Descriptor(
+  name='CredentialMapEntry',
+  full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2523,
+  serialized_end=2575,
+)
+
+_CREDENTIALMAP = _descriptor.Descriptor(
+  name='CredentialMap',
+  full_name='org.apache.custos.resource.secret.service.CredentialMap',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='credential_map', full_name='org.apache.custos.resource.secret.service.CredentialMap.credential_map', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.CredentialMap.metadata', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_CREDENTIALMAP_CREDENTIALMAPENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2328,
+  serialized_end=2575,
+)
+
+_SECRETMETADATA.fields_by_name['owner_type'].enum_type = _RESOURCEOWNERTYPE
+_SECRETMETADATA.fields_by_name['resource_type'].enum_type = _RESOURCETYPE
+_SECRETMETADATA.fields_by_name['source'].enum_type = _RESOURCESOURCE
+_SECRETMETADATA.fields_by_name['type'].enum_type = _RESOURCESECRETTYPE
+_CERTIFICATECREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_PASSWORDCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_SSHCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_GETRESOURCECREDENTIALSUMMARIESREQUEST.fields_by_name['type'].enum_type = _RESOURCETYPE
+_RESOURCECREDENTIALSUMMARIES.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_KVCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_GETSECRETREQUEST.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_CREDENTIALMAP_CREDENTIALMAPENTRY.containing_type = _CREDENTIALMAP
+_CREDENTIALMAP.fields_by_name['credential_map'].message_type = _CREDENTIALMAP_CREDENTIALMAPENTRY
+_CREDENTIALMAP.fields_by_name['metadata'].message_type = _SECRETMETADATA
+DESCRIPTOR.message_types_by_name['SecretMetadata'] = _SECRETMETADATA
+DESCRIPTOR.message_types_by_name['CertificateCredential'] = _CERTIFICATECREDENTIAL
+DESCRIPTOR.message_types_by_name['PasswordCredential'] = _PASSWORDCREDENTIAL
+DESCRIPTOR.message_types_by_name['SSHCredential'] = _SSHCREDENTIAL
+DESCRIPTOR.message_types_by_name['GetResourceCredentialByTokenRequest'] = _GETRESOURCECREDENTIALBYTOKENREQUEST
+DESCRIPTOR.message_types_by_name['GetResourceCredentialSummariesRequest'] = _GETRESOURCECREDENTIALSUMMARIESREQUEST
+DESCRIPTOR.message_types_by_name['ResourceCredentialSummaries'] = _RESOURCECREDENTIALSUMMARIES
+DESCRIPTOR.message_types_by_name['AddResourceCredentialResponse'] = _ADDRESOURCECREDENTIALRESPONSE
+DESCRIPTOR.message_types_by_name['ResourceCredentialOperationStatus'] = _RESOURCECREDENTIALOPERATIONSTATUS
+DESCRIPTOR.message_types_by_name['KVCredential'] = _KVCREDENTIAL
+DESCRIPTOR.message_types_by_name['GetSecretRequest'] = _GETSECRETREQUEST
+DESCRIPTOR.message_types_by_name['CredentialMap'] = _CREDENTIALMAP
+DESCRIPTOR.enum_types_by_name['ResourceOwnerType'] = _RESOURCEOWNERTYPE
+DESCRIPTOR.enum_types_by_name['ResourceType'] = _RESOURCETYPE
+DESCRIPTOR.enum_types_by_name['ResourceSource'] = _RESOURCESOURCE
+DESCRIPTOR.enum_types_by_name['ResourceSecretType'] = _RESOURCESECRETTYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+SecretMetadata = _reflection.GeneratedProtocolMessageType('SecretMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _SECRETMETADATA,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.SecretMetadata)
+  })
+_sym_db.RegisterMessage(SecretMetadata)
+
+CertificateCredential = _reflection.GeneratedProtocolMessageType('CertificateCredential', (_message.Message,), {
+  'DESCRIPTOR' : _CERTIFICATECREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.CertificateCredential)
+  })
+_sym_db.RegisterMessage(CertificateCredential)
+
+PasswordCredential = _reflection.GeneratedProtocolMessageType('PasswordCredential', (_message.Message,), {
+  'DESCRIPTOR' : _PASSWORDCREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.PasswordCredential)
+  })
+_sym_db.RegisterMessage(PasswordCredential)
+
+SSHCredential = _reflection.GeneratedProtocolMessageType('SSHCredential', (_message.Message,), {
+  'DESCRIPTOR' : _SSHCREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.SSHCredential)
+  })
+_sym_db.RegisterMessage(SSHCredential)
+
+GetResourceCredentialByTokenRequest = _reflection.GeneratedProtocolMessageType('GetResourceCredentialByTokenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESOURCECREDENTIALBYTOKENREQUEST,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest)
+  })
+_sym_db.RegisterMessage(GetResourceCredentialByTokenRequest)
+
+GetResourceCredentialSummariesRequest = _reflection.GeneratedProtocolMessageType('GetResourceCredentialSummariesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESOURCECREDENTIALSUMMARIESREQUEST,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest)
+  })
+_sym_db.RegisterMessage(GetResourceCredentialSummariesRequest)
+
+ResourceCredentialSummaries = _reflection.GeneratedProtocolMessageType('ResourceCredentialSummaries', (_message.Message,), {
+  'DESCRIPTOR' : _RESOURCECREDENTIALSUMMARIES,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.ResourceCredentialSummaries)
+  })
+_sym_db.RegisterMessage(ResourceCredentialSummaries)
+
+AddResourceCredentialResponse = _reflection.GeneratedProtocolMessageType('AddResourceCredentialResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ADDRESOURCECREDENTIALRESPONSE,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.AddResourceCredentialResponse)
+  })
+_sym_db.RegisterMessage(AddResourceCredentialResponse)
+
+ResourceCredentialOperationStatus = _reflection.GeneratedProtocolMessageType('ResourceCredentialOperationStatus', (_message.Message,), {
+  'DESCRIPTOR' : _RESOURCECREDENTIALOPERATIONSTATUS,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus)
+  })
+_sym_db.RegisterMessage(ResourceCredentialOperationStatus)
+
+KVCredential = _reflection.GeneratedProtocolMessageType('KVCredential', (_message.Message,), {
+  'DESCRIPTOR' : _KVCREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.KVCredential)
+  })
+_sym_db.RegisterMessage(KVCredential)
+
+GetSecretRequest = _reflection.GeneratedProtocolMessageType('GetSecretRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSECRETREQUEST,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetSecretRequest)
+  })
+_sym_db.RegisterMessage(GetSecretRequest)
+
+CredentialMap = _reflection.GeneratedProtocolMessageType('CredentialMap', (_message.Message,), {
+
+  'CredentialMapEntry' : _reflection.GeneratedProtocolMessageType('CredentialMapEntry', (_message.Message,), {
+    'DESCRIPTOR' : _CREDENTIALMAP_CREDENTIALMAPENTRY,
+    '__module__' : 'ResourceSecretService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry)
+    })
+  ,
+  'DESCRIPTOR' : _CREDENTIALMAP,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.CredentialMap)
+  })
+_sym_db.RegisterMessage(CredentialMap)
+_sym_db.RegisterMessage(CredentialMap.CredentialMapEntry)
+
+
+DESCRIPTOR._options = None
+_CREDENTIALMAP_CREDENTIALMAPENTRY._options = None
+
+_RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
+  name='ResourceSecretService',
+  full_name='org.apache.custos.resource.secret.service.ResourceSecretService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=3011,
+  serialized_end=6155,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getKVCredential',
+    index=0,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_KVCREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='setKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.setKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.updateKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getCredentialMap',
+    index=4,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_CREDENTIALMAP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='setCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.setCredentialMap',
+    index=5,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.updateCredentialMap',
+    index=6,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteCredentialMap',
+    index=7,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getResourceCredentialSummary',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getResourceCredentialSummary',
+    index=8,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_SECRETMETADATA,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllResourceCredentialSummaries',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getAllResourceCredentialSummaries',
+    index=9,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALSUMMARIESREQUEST,
+    output_type=_RESOURCECREDENTIALSUMMARIES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addSSHCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addSSHCredential',
+    index=10,
+    containing_service=None,
+    input_type=_SSHCREDENTIAL,
+    output_type=_ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addPasswordCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addPasswordCredential',
+    index=11,
+    containing_service=None,
+    input_type=_PASSWORDCREDENTIAL,
+    output_type=_ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addCertificateCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addCertificateCredential',
+    index=12,
+    containing_service=None,
+    input_type=_CERTIFICATECREDENTIAL,
+    output_type=_ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getSSHCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getSSHCredential',
+    index=13,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_SSHCREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPasswordCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getPasswordCredential',
+    index=14,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_PASSWORDCREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCertificateCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getCertificateCredential',
+    index=15,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_CERTIFICATECREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteSSHCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteSSHCredential',
+    index=16,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deletePWDCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deletePWDCredential',
+    index=17,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCertificateCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteCertificateCredential',
+    index=18,
+    containing_service=None,
+    input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_RESOURCESECRETSERVICE)
+
+DESCRIPTOR.services_by_name['ResourceSecretService'] = _RESOURCESECRETSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2_grpc.py
new file mode 100644
index 0000000..c0ac125
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/ResourceSecretService_pb2_grpc.py
@@ -0,0 +1,660 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.ResourceSecretService_pb2 as ResourceSecretService__pb2
+
+
+class ResourceSecretServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.setKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.getCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                )
+        self.setCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/setCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.updateCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/updateCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.getResourceCredentialSummary = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getResourceCredentialSummary',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
+                )
+        self.getAllResourceCredentialSummaries = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getAllResourceCredentialSummaries',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialSummaries.FromString,
+                )
+        self.addSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/addSSHCredential',
+                request_serializer=ResourceSecretService__pb2.SSHCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.addPasswordCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/addPasswordCredential',
+                request_serializer=ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.addCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/addCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.getSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getSSHCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.SSHCredential.FromString,
+                )
+        self.getPasswordCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getPasswordCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.PasswordCredential.FromString,
+                )
+        self.getCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CertificateCredential.FromString,
+                )
+        self.deleteSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteSSHCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deletePWDCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deletePWDCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+
+
+class ResourceSecretServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getResourceCredentialSummary(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllResourceCredentialSummaries(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addPasswordCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPasswordCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deletePWDCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ResourceSecretServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'setKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.setKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'getCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ),
+            'setCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.setCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'updateCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'getResourceCredentialSummary': grpc.unary_unary_rpc_method_handler(
+                    servicer.getResourceCredentialSummary,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
+            ),
+            'getAllResourceCredentialSummaries': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllResourceCredentialSummaries,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialSummaries.SerializeToString,
+            ),
+            'addSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.SSHCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'addPasswordCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addPasswordCredential,
+                    request_deserializer=ResourceSecretService__pb2.PasswordCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'addCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.CertificateCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'getSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.SSHCredential.SerializeToString,
+            ),
+            'getPasswordCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPasswordCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+            ),
+            'getCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+            ),
+            'deleteSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deletePWDCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deletePWDCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.resource.secret.service.ResourceSecretService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ResourceSecretService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.CredentialMap.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/setCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/updateCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getResourceCredentialSummary(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getResourceCredentialSummary',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.SecretMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllResourceCredentialSummaries(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getAllResourceCredentialSummaries',
+            ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialSummaries.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/addSSHCredential',
+            ResourceSecretService__pb2.SSHCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addPasswordCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/addPasswordCredential',
+            ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/addCertificateCredential',
+            ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getSSHCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.SSHCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPasswordCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getPasswordCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.PasswordCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getCertificateCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.CertificateCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteSSHCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deletePWDCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deletePWDCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCertificateCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2.py
new file mode 100644
index 0000000..4ee6c32
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2.py
@@ -0,0 +1,1552 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: SharingService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='SharingService.proto',
+  package='org.apache.custos.sharing.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x14SharingService.proto\x12!org.apache.custos.sharing.service\"c\n\nEntityType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"g\n\x0ePermissionType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"\xf0\x01\n\x06\x45ntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x11\n\tparent_id\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x13\n\x0b\x62inary_data\x18\x07 \x01(\x0c\x12\x11\n\tfull_text\x18\x08 \x01(\t\x12\x1e\n\x16original_creation_time\x18\t \x01(\x03\x12\x12\n\ncreated_at\x18\n \x01(\x03\x12\x12\n\nupdated_at\x18\x0b \x01(\x03\x12\x14\n\x0cshared_count\x18\x0c \x01(\x05\"\x84\x01\n\rEntityRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x91\x01\n\x11\x45ntityTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x42\n\x0b\x65ntity_type\x18\x03 \x01(\x0b\x32-.org.apache.custos.sharing.service.EntityType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x9d\x01\n\x15PermissionTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12J\n\x0fpermission_type\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\xb2\x01\n\x0eSearchCriteria\x12J\n\x0csearch_field\x18\x01 \x01(\x0e\x32\x34.org.apache.custos.sharing.service.EntitySearchField\x12\r\n\x05value\x18\x02 \x01(\t\x12\x45\n\tcondition\x18\x03 \x01(\x0e\x32\x32.org.apache.custos.sharing.service.SearchCondition\"\xdf\x01\n\rSearchRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12J\n\x0fsearch_criteria\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.SearchCriteria\x12\x12\n\nclient_sec\x18\x07 \x01(\t\x12\x17\n\x0f\x61ssociating_ids\x18\x08 \x03(\t\"\xd4\x01\n\x11PermissionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x05 \x01(\t\"\xf4\x01\n\x0eSharingRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"u\n\x16SharesFilteringRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"K\n\x0b\x45ntityTypes\x12<\n\x05types\x18\x01 \x03(\x0b\x32-.org.apache.custos.sharing.service.EntityType\"S\n\x0fPermissionTypes\x12@\n\x05types\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\"K\n\x08\x45ntities\x12?\n\x0c\x65ntity_array\x18\x01 \x03(\x0b\x32).org.apache.custos.sharing.service.Entity\"!\n\x0cSharedOwners\x12\x11\n\towner_ids\x18\x01 \x03(\t\"g\n\x1cGetAllDirectSharingsResponse\x12G\n\x0bshared_data\x18\x01 \x03(\x0b\x32\x32.org.apache.custos.sharing.service.SharingMetadata\"\xb9\x01\n\x0fSharingMetadata\x12\x39\n\x06\x65ntity\x18\x01 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12\x10\n\x08owner_id\x18\x02 \x01(\t\x12\x12\n\nowner_type\x18\x03 \x01(\t\x12\x45\n\npermission\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType*A\n\x0fSearchCondition\x12\t\n\x05\x45QUAL\x10\x00\x12\x08\n\x04LIKE\x10\x01\x12\x07\n\x03GTE\x10\x02\x12\x07\n\x03LTE\x10\x03\x12\x07\n\x03NOT\x10\x04*\xc6\x01\n\x11\x45ntitySearchField\x12\x08\n\x04NAME\x10\x00\x12\x0f\n\x0b\x44\x45SCRIPTION\x10\x01\x12\x06\n\x02ID\x10\x02\x12\r\n\tFULL_TEXT\x10\x03\x12\x0c\n\x08OWNER_ID\x10\x04\x12\x0e\n\nCREATED_AT\x10\x05\x12\x14\n\x10LAST_MODIFIED_AT\x10\x06\x12\x12\n\x0e\x45NTITY_TYPE_ID\x10\x07\x12\r\n\tPARENT_ID\x10\x08\x12\x10\n\x0cSHARED_COUNT\x10\t\x12\x16\n\x12PERMISSION_TYPE_ID\x10\n2\xca\x18\n\x0eSharingService\x12s\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12t\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\x12r\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\x12{\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12\x80\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\x12z\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\x12k\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12k\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12h\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\x12k\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12o\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\x12z\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x82\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12{\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x83\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x8a\x01\n\x14getAllDirectSharings\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a?.org.apache.custos.sharing.service.GetAllDirectSharingsResponse\x12t\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12u\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12|\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12}\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_SEARCHCONDITION = _descriptor.EnumDescriptor(
+  name='SearchCondition',
+  full_name='org.apache.custos.sharing.service.SearchCondition',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='EQUAL', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LIKE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='GTE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LTE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='NOT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2532,
+  serialized_end=2597,
+)
+_sym_db.RegisterEnumDescriptor(_SEARCHCONDITION)
+
+SearchCondition = enum_type_wrapper.EnumTypeWrapper(_SEARCHCONDITION)
+_ENTITYSEARCHFIELD = _descriptor.EnumDescriptor(
+  name='EntitySearchField',
+  full_name='org.apache.custos.sharing.service.EntitySearchField',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NAME', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DESCRIPTION', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ID', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FULL_TEXT', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OWNER_ID', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CREATED_AT', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='LAST_MODIFIED_AT', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ENTITY_TYPE_ID', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PARENT_ID', index=8, number=8,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SHARED_COUNT', index=9, number=9,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PERMISSION_TYPE_ID', index=10, number=10,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2600,
+  serialized_end=2798,
+)
+_sym_db.RegisterEnumDescriptor(_ENTITYSEARCHFIELD)
+
+EntitySearchField = enum_type_wrapper.EnumTypeWrapper(_ENTITYSEARCHFIELD)
+EQUAL = 0
+LIKE = 1
+GTE = 2
+LTE = 3
+NOT = 4
+NAME = 0
+DESCRIPTION = 1
+ID = 2
+FULL_TEXT = 3
+OWNER_ID = 4
+CREATED_AT = 5
+LAST_MODIFIED_AT = 6
+ENTITY_TYPE_ID = 7
+PARENT_ID = 8
+SHARED_COUNT = 9
+PERMISSION_TYPE_ID = 10
+
+
+
+_ENTITYTYPE = _descriptor.Descriptor(
+  name='EntityType',
+  full_name='org.apache.custos.sharing.service.EntityType',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.sharing.service.EntityType.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.sharing.service.EntityType.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.sharing.service.EntityType.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='org.apache.custos.sharing.service.EntityType.created_at', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.sharing.service.EntityType.updated_at', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=59,
+  serialized_end=158,
+)
+
+
+_PERMISSIONTYPE = _descriptor.Descriptor(
+  name='PermissionType',
+  full_name='org.apache.custos.sharing.service.PermissionType',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.sharing.service.PermissionType.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.sharing.service.PermissionType.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.sharing.service.PermissionType.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='org.apache.custos.sharing.service.PermissionType.created_at', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.sharing.service.PermissionType.updated_at', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=160,
+  serialized_end=263,
+)
+
+
+_ENTITY = _descriptor.Descriptor(
+  name='Entity',
+  full_name='org.apache.custos.sharing.service.Entity',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.sharing.service.Entity.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.sharing.service.Entity.type', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.Entity.owner_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_id', full_name='org.apache.custos.sharing.service.Entity.parent_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.sharing.service.Entity.name', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.sharing.service.Entity.description', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='binary_data', full_name='org.apache.custos.sharing.service.Entity.binary_data', index=6,
+      number=7, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"",
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='full_text', full_name='org.apache.custos.sharing.service.Entity.full_text', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='original_creation_time', full_name='org.apache.custos.sharing.service.Entity.original_creation_time', index=8,
+      number=9, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='org.apache.custos.sharing.service.Entity.created_at', index=9,
+      number=10, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.sharing.service.Entity.updated_at', index=10,
+      number=11, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='shared_count', full_name='org.apache.custos.sharing.service.Entity.shared_count', index=11,
+      number=12, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=266,
+  serialized_end=506,
+)
+
+
+_ENTITYREQUEST = _descriptor.Descriptor(
+  name='EntityRequest',
+  full_name='org.apache.custos.sharing.service.EntityRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.EntityRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.EntityRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='entity', full_name='org.apache.custos.sharing.service.EntityRequest.entity', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.EntityRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=509,
+  serialized_end=641,
+)
+
+
+_ENTITYTYPEREQUEST = _descriptor.Descriptor(
+  name='EntityTypeRequest',
+  full_name='org.apache.custos.sharing.service.EntityTypeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.EntityTypeRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.EntityTypeRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='entity_type', full_name='org.apache.custos.sharing.service.EntityTypeRequest.entity_type', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.EntityTypeRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=644,
+  serialized_end=789,
+)
+
+
+_PERMISSIONTYPEREQUEST = _descriptor.Descriptor(
+  name='PermissionTypeRequest',
+  full_name='org.apache.custos.sharing.service.PermissionTypeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.PermissionTypeRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.PermissionTypeRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permission_type', full_name='org.apache.custos.sharing.service.PermissionTypeRequest.permission_type', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.PermissionTypeRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=792,
+  serialized_end=949,
+)
+
+
+_SEARCHCRITERIA = _descriptor.Descriptor(
+  name='SearchCriteria',
+  full_name='org.apache.custos.sharing.service.SearchCriteria',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='search_field', full_name='org.apache.custos.sharing.service.SearchCriteria.search_field', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.sharing.service.SearchCriteria.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='condition', full_name='org.apache.custos.sharing.service.SearchCriteria.condition', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=952,
+  serialized_end=1130,
+)
+
+
+_SEARCHREQUEST = _descriptor.Descriptor(
+  name='SearchRequest',
+  full_name='org.apache.custos.sharing.service.SearchRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.SearchRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.SearchRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.SearchRequest.owner_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.sharing.service.SearchRequest.offset', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.sharing.service.SearchRequest.limit', index=4,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='search_criteria', full_name='org.apache.custos.sharing.service.SearchRequest.search_criteria', index=5,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.SearchRequest.client_sec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='associating_ids', full_name='org.apache.custos.sharing.service.SearchRequest.associating_ids', index=7,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1133,
+  serialized_end=1356,
+)
+
+
+_PERMISSIONREQUEST = _descriptor.Descriptor(
+  name='PermissionRequest',
+  full_name='org.apache.custos.sharing.service.PermissionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.PermissionRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.PermissionRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='entity', full_name='org.apache.custos.sharing.service.PermissionRequest.entity', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permission_type', full_name='org.apache.custos.sharing.service.PermissionRequest.permission_type', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.PermissionRequest.client_sec', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1359,
+  serialized_end=1571,
+)
+
+
+_SHARINGREQUEST = _descriptor.Descriptor(
+  name='SharingRequest',
+  full_name='org.apache.custos.sharing.service.SharingRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.SharingRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.SharingRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='entity', full_name='org.apache.custos.sharing.service.SharingRequest.entity', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permission_type', full_name='org.apache.custos.sharing.service.SharingRequest.permission_type', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.SharingRequest.owner_id', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='cascade', full_name='org.apache.custos.sharing.service.SharingRequest.cascade', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.SharingRequest.client_sec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1574,
+  serialized_end=1818,
+)
+
+
+_SHARESFILTERINGREQUEST = _descriptor.Descriptor(
+  name='SharesFilteringRequest',
+  full_name='org.apache.custos.sharing.service.SharesFilteringRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.sharing.service.SharesFilteringRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.sharing.service.SharesFilteringRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.SharesFilteringRequest.owner_id', index=2,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='cascade', full_name='org.apache.custos.sharing.service.SharesFilteringRequest.cascade', index=3,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.sharing.service.SharesFilteringRequest.client_sec', index=4,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1820,
+  serialized_end=1937,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.sharing.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.sharing.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1939,
+  serialized_end=1963,
+)
+
+
+_ENTITYTYPES = _descriptor.Descriptor(
+  name='EntityTypes',
+  full_name='org.apache.custos.sharing.service.EntityTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='types', full_name='org.apache.custos.sharing.service.EntityTypes.types', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1965,
+  serialized_end=2040,
+)
+
+
+_PERMISSIONTYPES = _descriptor.Descriptor(
+  name='PermissionTypes',
+  full_name='org.apache.custos.sharing.service.PermissionTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='types', full_name='org.apache.custos.sharing.service.PermissionTypes.types', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2042,
+  serialized_end=2125,
+)
+
+
+_ENTITIES = _descriptor.Descriptor(
+  name='Entities',
+  full_name='org.apache.custos.sharing.service.Entities',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity_array', full_name='org.apache.custos.sharing.service.Entities.entity_array', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2127,
+  serialized_end=2202,
+)
+
+
+_SHAREDOWNERS = _descriptor.Descriptor(
+  name='SharedOwners',
+  full_name='org.apache.custos.sharing.service.SharedOwners',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='owner_ids', full_name='org.apache.custos.sharing.service.SharedOwners.owner_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2204,
+  serialized_end=2237,
+)
+
+
+_GETALLDIRECTSHARINGSRESPONSE = _descriptor.Descriptor(
+  name='GetAllDirectSharingsResponse',
+  full_name='org.apache.custos.sharing.service.GetAllDirectSharingsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='shared_data', full_name='org.apache.custos.sharing.service.GetAllDirectSharingsResponse.shared_data', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2239,
+  serialized_end=2342,
+)
+
+
+_SHARINGMETADATA = _descriptor.Descriptor(
+  name='SharingMetadata',
+  full_name='org.apache.custos.sharing.service.SharingMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity', full_name='org.apache.custos.sharing.service.SharingMetadata.entity', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.SharingMetadata.owner_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_type', full_name='org.apache.custos.sharing.service.SharingMetadata.owner_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permission', full_name='org.apache.custos.sharing.service.SharingMetadata.permission', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2345,
+  serialized_end=2530,
+)
+
+_ENTITYREQUEST.fields_by_name['entity'].message_type = _ENTITY
+_ENTITYTYPEREQUEST.fields_by_name['entity_type'].message_type = _ENTITYTYPE
+_PERMISSIONTYPEREQUEST.fields_by_name['permission_type'].message_type = _PERMISSIONTYPE
+_SEARCHCRITERIA.fields_by_name['search_field'].enum_type = _ENTITYSEARCHFIELD
+_SEARCHCRITERIA.fields_by_name['condition'].enum_type = _SEARCHCONDITION
+_SEARCHREQUEST.fields_by_name['search_criteria'].message_type = _SEARCHCRITERIA
+_PERMISSIONREQUEST.fields_by_name['entity'].message_type = _ENTITY
+_PERMISSIONREQUEST.fields_by_name['permission_type'].message_type = _PERMISSIONTYPE
+_SHARINGREQUEST.fields_by_name['entity'].message_type = _ENTITY
+_SHARINGREQUEST.fields_by_name['permission_type'].message_type = _PERMISSIONTYPE
+_ENTITYTYPES.fields_by_name['types'].message_type = _ENTITYTYPE
+_PERMISSIONTYPES.fields_by_name['types'].message_type = _PERMISSIONTYPE
+_ENTITIES.fields_by_name['entity_array'].message_type = _ENTITY
+_GETALLDIRECTSHARINGSRESPONSE.fields_by_name['shared_data'].message_type = _SHARINGMETADATA
+_SHARINGMETADATA.fields_by_name['entity'].message_type = _ENTITY
+_SHARINGMETADATA.fields_by_name['permission'].message_type = _PERMISSIONTYPE
+DESCRIPTOR.message_types_by_name['EntityType'] = _ENTITYTYPE
+DESCRIPTOR.message_types_by_name['PermissionType'] = _PERMISSIONTYPE
+DESCRIPTOR.message_types_by_name['Entity'] = _ENTITY
+DESCRIPTOR.message_types_by_name['EntityRequest'] = _ENTITYREQUEST
+DESCRIPTOR.message_types_by_name['EntityTypeRequest'] = _ENTITYTYPEREQUEST
+DESCRIPTOR.message_types_by_name['PermissionTypeRequest'] = _PERMISSIONTYPEREQUEST
+DESCRIPTOR.message_types_by_name['SearchCriteria'] = _SEARCHCRITERIA
+DESCRIPTOR.message_types_by_name['SearchRequest'] = _SEARCHREQUEST
+DESCRIPTOR.message_types_by_name['PermissionRequest'] = _PERMISSIONREQUEST
+DESCRIPTOR.message_types_by_name['SharingRequest'] = _SHARINGREQUEST
+DESCRIPTOR.message_types_by_name['SharesFilteringRequest'] = _SHARESFILTERINGREQUEST
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['EntityTypes'] = _ENTITYTYPES
+DESCRIPTOR.message_types_by_name['PermissionTypes'] = _PERMISSIONTYPES
+DESCRIPTOR.message_types_by_name['Entities'] = _ENTITIES
+DESCRIPTOR.message_types_by_name['SharedOwners'] = _SHAREDOWNERS
+DESCRIPTOR.message_types_by_name['GetAllDirectSharingsResponse'] = _GETALLDIRECTSHARINGSRESPONSE
+DESCRIPTOR.message_types_by_name['SharingMetadata'] = _SHARINGMETADATA
+DESCRIPTOR.enum_types_by_name['SearchCondition'] = _SEARCHCONDITION
+DESCRIPTOR.enum_types_by_name['EntitySearchField'] = _ENTITYSEARCHFIELD
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+EntityType = _reflection.GeneratedProtocolMessageType('EntityType', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITYTYPE,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.EntityType)
+  })
+_sym_db.RegisterMessage(EntityType)
+
+PermissionType = _reflection.GeneratedProtocolMessageType('PermissionType', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONTYPE,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.PermissionType)
+  })
+_sym_db.RegisterMessage(PermissionType)
+
+Entity = _reflection.GeneratedProtocolMessageType('Entity', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITY,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.Entity)
+  })
+_sym_db.RegisterMessage(Entity)
+
+EntityRequest = _reflection.GeneratedProtocolMessageType('EntityRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITYREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.EntityRequest)
+  })
+_sym_db.RegisterMessage(EntityRequest)
+
+EntityTypeRequest = _reflection.GeneratedProtocolMessageType('EntityTypeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITYTYPEREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.EntityTypeRequest)
+  })
+_sym_db.RegisterMessage(EntityTypeRequest)
+
+PermissionTypeRequest = _reflection.GeneratedProtocolMessageType('PermissionTypeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONTYPEREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.PermissionTypeRequest)
+  })
+_sym_db.RegisterMessage(PermissionTypeRequest)
+
+SearchCriteria = _reflection.GeneratedProtocolMessageType('SearchCriteria', (_message.Message,), {
+  'DESCRIPTOR' : _SEARCHCRITERIA,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SearchCriteria)
+  })
+_sym_db.RegisterMessage(SearchCriteria)
+
+SearchRequest = _reflection.GeneratedProtocolMessageType('SearchRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SEARCHREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SearchRequest)
+  })
+_sym_db.RegisterMessage(SearchRequest)
+
+PermissionRequest = _reflection.GeneratedProtocolMessageType('PermissionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.PermissionRequest)
+  })
+_sym_db.RegisterMessage(PermissionRequest)
+
+SharingRequest = _reflection.GeneratedProtocolMessageType('SharingRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SHARINGREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SharingRequest)
+  })
+_sym_db.RegisterMessage(SharingRequest)
+
+SharesFilteringRequest = _reflection.GeneratedProtocolMessageType('SharesFilteringRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SHARESFILTERINGREQUEST,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SharesFilteringRequest)
+  })
+_sym_db.RegisterMessage(SharesFilteringRequest)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+EntityTypes = _reflection.GeneratedProtocolMessageType('EntityTypes', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITYTYPES,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.EntityTypes)
+  })
+_sym_db.RegisterMessage(EntityTypes)
+
+PermissionTypes = _reflection.GeneratedProtocolMessageType('PermissionTypes', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONTYPES,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.PermissionTypes)
+  })
+_sym_db.RegisterMessage(PermissionTypes)
+
+Entities = _reflection.GeneratedProtocolMessageType('Entities', (_message.Message,), {
+  'DESCRIPTOR' : _ENTITIES,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.Entities)
+  })
+_sym_db.RegisterMessage(Entities)
+
+SharedOwners = _reflection.GeneratedProtocolMessageType('SharedOwners', (_message.Message,), {
+  'DESCRIPTOR' : _SHAREDOWNERS,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SharedOwners)
+  })
+_sym_db.RegisterMessage(SharedOwners)
+
+GetAllDirectSharingsResponse = _reflection.GeneratedProtocolMessageType('GetAllDirectSharingsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLDIRECTSHARINGSRESPONSE,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.GetAllDirectSharingsResponse)
+  })
+_sym_db.RegisterMessage(GetAllDirectSharingsResponse)
+
+SharingMetadata = _reflection.GeneratedProtocolMessageType('SharingMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _SHARINGMETADATA,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SharingMetadata)
+  })
+_sym_db.RegisterMessage(SharingMetadata)
+
+
+DESCRIPTOR._options = None
+
+_SHARINGSERVICE = _descriptor.ServiceDescriptor(
+  name='SharingService',
+  full_name='org.apache.custos.sharing.service.SharingService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2801,
+  serialized_end=5947,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createEntityType',
+    full_name='org.apache.custos.sharing.service.SharingService.createEntityType',
+    index=0,
+    containing_service=None,
+    input_type=_ENTITYTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateEntityType',
+    full_name='org.apache.custos.sharing.service.SharingService.updateEntityType',
+    index=1,
+    containing_service=None,
+    input_type=_ENTITYTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteEntityType',
+    full_name='org.apache.custos.sharing.service.SharingService.deleteEntityType',
+    index=2,
+    containing_service=None,
+    input_type=_ENTITYTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntityType',
+    full_name='org.apache.custos.sharing.service.SharingService.getEntityType',
+    index=3,
+    containing_service=None,
+    input_type=_ENTITYTYPEREQUEST,
+    output_type=_ENTITYTYPE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntityTypes',
+    full_name='org.apache.custos.sharing.service.SharingService.getEntityTypes',
+    index=4,
+    containing_service=None,
+    input_type=_SEARCHREQUEST,
+    output_type=_ENTITYTYPES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createPermissionType',
+    full_name='org.apache.custos.sharing.service.SharingService.createPermissionType',
+    index=5,
+    containing_service=None,
+    input_type=_PERMISSIONTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updatePermissionType',
+    full_name='org.apache.custos.sharing.service.SharingService.updatePermissionType',
+    index=6,
+    containing_service=None,
+    input_type=_PERMISSIONTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deletePermissionType',
+    full_name='org.apache.custos.sharing.service.SharingService.deletePermissionType',
+    index=7,
+    containing_service=None,
+    input_type=_PERMISSIONTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPermissionType',
+    full_name='org.apache.custos.sharing.service.SharingService.getPermissionType',
+    index=8,
+    containing_service=None,
+    input_type=_PERMISSIONTYPEREQUEST,
+    output_type=_PERMISSIONTYPE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPermissionTypes',
+    full_name='org.apache.custos.sharing.service.SharingService.getPermissionTypes',
+    index=9,
+    containing_service=None,
+    input_type=_SEARCHREQUEST,
+    output_type=_PERMISSIONTYPES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createEntity',
+    full_name='org.apache.custos.sharing.service.SharingService.createEntity',
+    index=10,
+    containing_service=None,
+    input_type=_ENTITYREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateEntity',
+    full_name='org.apache.custos.sharing.service.SharingService.updateEntity',
+    index=11,
+    containing_service=None,
+    input_type=_ENTITYREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isEntityExists',
+    full_name='org.apache.custos.sharing.service.SharingService.isEntityExists',
+    index=12,
+    containing_service=None,
+    input_type=_ENTITYREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntity',
+    full_name='org.apache.custos.sharing.service.SharingService.getEntity',
+    index=13,
+    containing_service=None,
+    input_type=_ENTITYREQUEST,
+    output_type=_ENTITY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteEntity',
+    full_name='org.apache.custos.sharing.service.SharingService.deleteEntity',
+    index=14,
+    containing_service=None,
+    input_type=_ENTITYREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='searchEntities',
+    full_name='org.apache.custos.sharing.service.SharingService.searchEntities',
+    index=15,
+    containing_service=None,
+    input_type=_SEARCHREQUEST,
+    output_type=_ENTITIES,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfSharedUsers',
+    full_name='org.apache.custos.sharing.service.SharingService.getListOfSharedUsers',
+    index=16,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_SHAREDOWNERS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfDirectlySharedUsers',
+    full_name='org.apache.custos.sharing.service.SharingService.getListOfDirectlySharedUsers',
+    index=17,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_SHAREDOWNERS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfSharedGroups',
+    full_name='org.apache.custos.sharing.service.SharingService.getListOfSharedGroups',
+    index=18,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_SHAREDOWNERS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfDirectlySharedGroups',
+    full_name='org.apache.custos.sharing.service.SharingService.getListOfDirectlySharedGroups',
+    index=19,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_SHAREDOWNERS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllDirectSharings',
+    full_name='org.apache.custos.sharing.service.SharingService.getAllDirectSharings',
+    index=20,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_GETALLDIRECTSHARINGSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='shareEntityWithUsers',
+    full_name='org.apache.custos.sharing.service.SharingService.shareEntityWithUsers',
+    index=21,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='shareEntityWithGroups',
+    full_name='org.apache.custos.sharing.service.SharingService.shareEntityWithGroups',
+    index=22,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='revokeEntitySharingFromUsers',
+    full_name='org.apache.custos.sharing.service.SharingService.revokeEntitySharingFromUsers',
+    index=23,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='revokeEntitySharingFromGroups',
+    full_name='org.apache.custos.sharing.service.SharingService.revokeEntitySharingFromGroups',
+    index=24,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='userHasAccess',
+    full_name='org.apache.custos.sharing.service.SharingService.userHasAccess',
+    index=25,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_SHARINGSERVICE)
+
+DESCRIPTOR.services_by_name['SharingService'] = _SHARINGSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2_grpc.py
new file mode 100644
index 0000000..5edb0bb
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/SharingService_pb2_grpc.py
@@ -0,0 +1,891 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.SharingService_pb2 as SharingService__pb2
+
+
+class SharingServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/createEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updateEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/updateEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.deleteEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/deleteEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.EntityType.FromString,
+                )
+        self.getEntityTypes = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getEntityTypes',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.EntityTypes.FromString,
+                )
+        self.createPermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/createPermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updatePermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/updatePermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.deletePermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/deletePermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getPermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getPermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.PermissionType.FromString,
+                )
+        self.getPermissionTypes = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getPermissionTypes',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.PermissionTypes.FromString,
+                )
+        self.createEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/createEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updateEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/updateEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.isEntityExists = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/isEntityExists',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Entity.FromString,
+                )
+        self.deleteEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/deleteEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.searchEntities = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/searchEntities',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Entities.FromString,
+                )
+        self.getListOfSharedUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getListOfSharedUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfDirectlySharedUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getListOfDirectlySharedUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfSharedGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getListOfSharedGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfDirectlySharedGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getListOfDirectlySharedGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getAllDirectSharings = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getAllDirectSharings',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+                )
+        self.shareEntityWithUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/shareEntityWithUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.shareEntityWithGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/shareEntityWithGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.revokeEntitySharingFromUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/revokeEntitySharingFromUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.revokeEntitySharingFromGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/revokeEntitySharingFromGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.userHasAccess = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/userHasAccess',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+
+
+class SharingServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntityTypes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createPermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updatePermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deletePermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPermissionTypes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isEntityExists(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def searchEntities(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfSharedUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfDirectlySharedUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfSharedGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfDirectlySharedGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllDirectSharings(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def shareEntityWithUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def shareEntityWithGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def revokeEntitySharingFromUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def revokeEntitySharingFromGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def userHasAccess(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_SharingServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.createEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updateEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'deleteEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.EntityType.SerializeToString,
+            ),
+            'getEntityTypes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntityTypes,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.EntityTypes.SerializeToString,
+            ),
+            'createPermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.createPermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updatePermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.updatePermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'deletePermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.deletePermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getPermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.PermissionType.SerializeToString,
+            ),
+            'getPermissionTypes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPermissionTypes,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.PermissionTypes.SerializeToString,
+            ),
+            'createEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.createEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updateEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'isEntityExists': grpc.unary_unary_rpc_method_handler(
+                    servicer.isEntityExists,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Entity.SerializeToString,
+            ),
+            'deleteEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'searchEntities': grpc.unary_unary_rpc_method_handler(
+                    servicer.searchEntities,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.Entities.SerializeToString,
+            ),
+            'getListOfSharedUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfSharedUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfDirectlySharedUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfDirectlySharedUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfSharedGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfSharedGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfDirectlySharedGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfDirectlySharedGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getAllDirectSharings': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllDirectSharings,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.GetAllDirectSharingsResponse.SerializeToString,
+            ),
+            'shareEntityWithUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.shareEntityWithUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'shareEntityWithGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.shareEntityWithGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'revokeEntitySharingFromUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.revokeEntitySharingFromUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'revokeEntitySharingFromGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.revokeEntitySharingFromGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'userHasAccess': grpc.unary_unary_rpc_method_handler(
+                    servicer.userHasAccess,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.sharing.service.SharingService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class SharingService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/createEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/updateEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/deleteEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.EntityType.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntityTypes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getEntityTypes',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.EntityTypes.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createPermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/createPermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updatePermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/updatePermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deletePermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/deletePermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getPermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.PermissionType.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPermissionTypes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getPermissionTypes',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.PermissionTypes.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/createEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/updateEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isEntityExists(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/isEntityExists',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Entity.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/deleteEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def searchEntities(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/searchEntities',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.Entities.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfSharedUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getListOfSharedUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfDirectlySharedUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getListOfDirectlySharedUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfSharedGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getListOfSharedGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfDirectlySharedGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getListOfDirectlySharedGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllDirectSharings(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getAllDirectSharings',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def shareEntityWithUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/shareEntityWithUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def shareEntityWithGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/shareEntityWithGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def revokeEntitySharingFromUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/revokeEntitySharingFromUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def revokeEntitySharingFromGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/revokeEntitySharingFromGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def userHasAccess(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/userHasAccess',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2.py
new file mode 100644
index 0000000..5a9c123
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2.py
@@ -0,0 +1,1329 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: TenantProfileService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='TenantProfileService.proto',
+  package='org.apache.custos.tenant.profile.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1aTenantProfileService.proto\x12(org.apache.custos.tenant.profile.service\"\xb5\x06\n\x06Tenant\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x04 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x05 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x06 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x07 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x08 \x01(\t\x12\x16\n\x0e\x61\x64min_password\x18\t \x01(\t\x12M\n\rtenant_status\x18\n \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x10\n\x08\x63ontacts\x18\x0b \x03(\t\x12\x15\n\rredirect_uris\x18\x0c \x03(\t\x12\x12\n\nclient_uri\x18\r \x01(\t\x12\r\n\x05scope\x18\x0e \x01(\t\x12\x0e\n\x06\x64omain\x18\x0f \x01(\t\x12\x0f\n\x07\x63omment\x18\x10 \x01(\t\x12\x10\n\x08logo_uri\x18\x11 \x01(\t\x12\x18\n\x10parent_tenant_id\x18\x12 \x01(\x03\x12\x18\n\x10\x61pplication_type\x18\x13 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x14 \x01(\t\x12\x10\n\x08jwks_uri\x18\x15 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x16 \x01(\t\x12\x0f\n\x07tos_uri\x18\x17 \x01(\t\x12\x12\n\npolicy_uri\x18\x18 \x01(\t\x12H\n\x04jwks\x18\x19 \x03(\x0b\x32:.org.apache.custos.tenant.profile.service.Tenant.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x1a \x01(\t\x12\x18\n\x10software_version\x18\x1b \x01(\t\x12\x1d\n\x15refesh_token_lifetime\x18\x1c \x01(\x03\x12\x11\n\tclient_id\x18\x1d \x01(\t\x12\x18\n\x10parent_client_id\x18\x1e \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x82\x01\n\x1dTenantAttributeUpdateMetadata\x12\x19\n\x11updated_attribute\x18\x01 \x01(\t\x12\x1e\n\x16updated_attributeValue\x18\x02 \x01(\t\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x12\n\nupdated_at\x18\x04 \x01(\t\"\x94\x01\n\x1aTenantStatusUpdateMetadata\x12N\n\x0eupdated_status\x18\x01 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x12\n\nupdated_by\x18\x02 \x01(\t\x12\x12\n\nupdated_at\x18\x03 \x01(\t\"&\n\x11\x41\x64\x64TenantResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"X\n\x14UpdateTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"%\n\x10GetTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"U\n\x11GetTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"w\n\x15GetAllTenantsResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\x12\x1c\n\x14total_num_of_tenants\x18\x02 \x01(\x05\")\n\x14IsTenantExistRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\")\n\x15IsTenantExistResponse\x12\x10\n\x08is_exist\x18\x01 \x01(\x08\"6\n\x1bGetAllTenantsForUserRequest\x12\x17\n\x0frequester_email\x18\x01 \x01(\t\"`\n\x1cGetAllTenantsForUserResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xc3\x01\n\x13UpdateStatusRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x11\n\ttenant_id\x18\x04 \x01(\x03\x12\x14\n\x0csuper_tenant\x18\x05 \x01(\x08\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x06 \x01(\t\"q\n\x14UpdateStatusResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\")\n\x14GetAuditTrailRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"{\n!GetStatusUpdateAuditTrailResponse\x12V\n\x08metadata\x18\x01 \x03(\x0b\x32\x44.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata\"\x81\x01\n$GetAttributeUpdateAuditTrailResponse\x12Y\n\x08metadata\x18\x02 \x03(\x0b\x32G.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata\"\x84\x02\n\x11GetTenantsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x11\n\tparent_id\x18\x03 \x01(\x03\x12\x46\n\x06status\x18\x04 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x17\n\x0frequester_email\x18\x05 \x01(\t\x12\x18\n\x10parent_client_id\x18\x06 \x01(\t\x12\x42\n\x04type\x18\x07 \x01(\x0e\x32\x34.org.apache.custos.tenant.profile.service.TenantType*p\n\x0cTenantStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tREQUESTED\x10\x01\x12\x0c\n\x08\x41PPROVED\x10\x02\x12\n\n\x06\x44\x45NIED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\n\n\x06\x41\x43TIVE\x10\x05\x12\x0f\n\x0b\x44\x45\x41\x43TIVATED\x10\x06*(\n\nTenantType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\t\n\x05\x41\x44MIN\x10\x01\x32\xcb\n\n\x14TenantProfileService\x12o\n\taddTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12r\n\x0cupdateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12\x84\x01\n\tgetTenant\x12:.org.apache.custos.tenant.profile.service.GetTenantRequest\x1a;.org.apache.custos.tenant.profile.service.GetTenantResponse\x12\x93\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\x12\x8d\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\x12\x90\x01\n\risTenantExist\x12>.org.apache.custos.tenant.profile.service.IsTenantExistRequest\x1a?.org.apache.custos.tenant.profile.service.IsTenantExistResponse\x12\xa5\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\x12\xae\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\x12\xb4\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponseB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_TENANTSTATUS = _descriptor.EnumDescriptor(
+  name='TenantStatus',
+  full_name='org.apache.custos.tenant.profile.service.TenantStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='REQUESTED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='APPROVED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DENIED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CANCELLED', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACTIVE', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEACTIVATED', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2673,
+  serialized_end=2785,
+)
+_sym_db.RegisterEnumDescriptor(_TENANTSTATUS)
+
+TenantStatus = enum_type_wrapper.EnumTypeWrapper(_TENANTSTATUS)
+_TENANTTYPE = _descriptor.EnumDescriptor(
+  name='TenantType',
+  full_name='org.apache.custos.tenant.profile.service.TenantType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ADMIN', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2787,
+  serialized_end=2827,
+)
+_sym_db.RegisterEnumDescriptor(_TENANTTYPE)
+
+TenantType = enum_type_wrapper.EnumTypeWrapper(_TENANTTYPE)
+UNKNOWN = 0
+REQUESTED = 1
+APPROVED = 2
+DENIED = 3
+CANCELLED = 4
+ACTIVE = 5
+DEACTIVATED = 6
+UNSPECIFIED = 0
+ADMIN = 1
+
+
+
+_TENANT_JWKSENTRY = _descriptor.Descriptor(
+  name='JwksEntry',
+  full_name='org.apache.custos.tenant.profile.service.Tenant.JwksEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.tenant.profile.service.Tenant.JwksEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.tenant.profile.service.Tenant.JwksEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=851,
+  serialized_end=894,
+)
+
+_TENANT = _descriptor.Descriptor(
+  name='Tenant',
+  full_name='org.apache.custos.tenant.profile.service.Tenant',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.Tenant.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_name', full_name='org.apache.custos.tenant.profile.service.Tenant.client_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.tenant.profile.service.Tenant.requester_email', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_first_name', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_first_name', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_last_name', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_last_name', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_email', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_email', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_username', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_username', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_password', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_password', index=7,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_status', full_name='org.apache.custos.tenant.profile.service.Tenant.tenant_status', index=8,
+      number=10, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='contacts', full_name='org.apache.custos.tenant.profile.service.Tenant.contacts', index=9,
+      number=11, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uris', full_name='org.apache.custos.tenant.profile.service.Tenant.redirect_uris', index=10,
+      number=12, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.client_uri', index=11,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.tenant.profile.service.Tenant.scope', index=12,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='domain', full_name='org.apache.custos.tenant.profile.service.Tenant.domain', index=13,
+      number=15, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='comment', full_name='org.apache.custos.tenant.profile.service.Tenant.comment', index=14,
+      number=16, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.logo_uri', index=15,
+      number=17, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_tenant_id', full_name='org.apache.custos.tenant.profile.service.Tenant.parent_tenant_id', index=16,
+      number=18, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='application_type', full_name='org.apache.custos.tenant.profile.service.Tenant.application_type', index=17,
+      number=19, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token_endpoint_auth_method', full_name='org.apache.custos.tenant.profile.service.Tenant.token_endpoint_auth_method', index=18,
+      number=20, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='jwks_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.jwks_uri', index=19,
+      number=21, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='example_extension_parameter', full_name='org.apache.custos.tenant.profile.service.Tenant.example_extension_parameter', index=20,
+      number=22, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tos_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.tos_uri', index=21,
+      number=23, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='policy_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.policy_uri', index=22,
+      number=24, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='jwks', full_name='org.apache.custos.tenant.profile.service.Tenant.jwks', index=23,
+      number=25, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='software_id', full_name='org.apache.custos.tenant.profile.service.Tenant.software_id', index=24,
+      number=26, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='software_version', full_name='org.apache.custos.tenant.profile.service.Tenant.software_version', index=25,
+      number=27, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refesh_token_lifetime', full_name='org.apache.custos.tenant.profile.service.Tenant.refesh_token_lifetime', index=26,
+      number=28, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.profile.service.Tenant.client_id', index=27,
+      number=29, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_client_id', full_name='org.apache.custos.tenant.profile.service.Tenant.parent_client_id', index=28,
+      number=30, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_TENANT_JWKSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=73,
+  serialized_end=894,
+)
+
+
+_TENANTATTRIBUTEUPDATEMETADATA = _descriptor.Descriptor(
+  name='TenantAttributeUpdateMetadata',
+  full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='updated_attribute', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_attribute', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_attributeValue', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_attributeValue', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_at', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=897,
+  serialized_end=1027,
+)
+
+
+_TENANTSTATUSUPDATEMETADATA = _descriptor.Descriptor(
+  name='TenantStatusUpdateMetadata',
+  full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='updated_status', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_by', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_at', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1030,
+  serialized_end=1178,
+)
+
+
+_ADDTENANTRESPONSE = _descriptor.Descriptor(
+  name='AddTenantResponse',
+  full_name='org.apache.custos.tenant.profile.service.AddTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.AddTenantResponse.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1180,
+  serialized_end=1218,
+)
+
+
+_UPDATETENANTRESPONSE = _descriptor.Descriptor(
+  name='UpdateTenantResponse',
+  full_name='org.apache.custos.tenant.profile.service.UpdateTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant', full_name='org.apache.custos.tenant.profile.service.UpdateTenantResponse.tenant', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1220,
+  serialized_end=1308,
+)
+
+
+_GETTENANTREQUEST = _descriptor.Descriptor(
+  name='GetTenantRequest',
+  full_name='org.apache.custos.tenant.profile.service.GetTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.GetTenantRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1310,
+  serialized_end=1347,
+)
+
+
+_GETTENANTRESPONSE = _descriptor.Descriptor(
+  name='GetTenantResponse',
+  full_name='org.apache.custos.tenant.profile.service.GetTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant', full_name='org.apache.custos.tenant.profile.service.GetTenantResponse.tenant', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1349,
+  serialized_end=1434,
+)
+
+
+_GETALLTENANTSRESPONSE = _descriptor.Descriptor(
+  name='GetAllTenantsResponse',
+  full_name='org.apache.custos.tenant.profile.service.GetAllTenantsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsResponse.tenant', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total_num_of_tenants', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsResponse.total_num_of_tenants', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1436,
+  serialized_end=1555,
+)
+
+
+_ISTENANTEXISTREQUEST = _descriptor.Descriptor(
+  name='IsTenantExistRequest',
+  full_name='org.apache.custos.tenant.profile.service.IsTenantExistRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.IsTenantExistRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1557,
+  serialized_end=1598,
+)
+
+
+_ISTENANTEXISTRESPONSE = _descriptor.Descriptor(
+  name='IsTenantExistResponse',
+  full_name='org.apache.custos.tenant.profile.service.IsTenantExistResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='is_exist', full_name='org.apache.custos.tenant.profile.service.IsTenantExistResponse.is_exist', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1600,
+  serialized_end=1641,
+)
+
+
+_GETALLTENANTSFORUSERREQUEST = _descriptor.Descriptor(
+  name='GetAllTenantsForUserRequest',
+  full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.requester_email', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1643,
+  serialized_end=1697,
+)
+
+
+_GETALLTENANTSFORUSERRESPONSE = _descriptor.Descriptor(
+  name='GetAllTenantsForUserResponse',
+  full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.tenant', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1699,
+  serialized_end=1795,
+)
+
+
+_UPDATESTATUSREQUEST = _descriptor.Descriptor(
+  name='UpdateStatusRequest',
+  full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.status', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.updated_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.tenant_id', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='super_tenant', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.super_tenant', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.access_token', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1798,
+  serialized_end=1993,
+)
+
+
+_UPDATESTATUSRESPONSE = _descriptor.Descriptor(
+  name='UpdateStatusResponse',
+  full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse.status', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1995,
+  serialized_end=2108,
+)
+
+
+_GETAUDITTRAILREQUEST = _descriptor.Descriptor(
+  name='GetAuditTrailRequest',
+  full_name='org.apache.custos.tenant.profile.service.GetAuditTrailRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.GetAuditTrailRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2110,
+  serialized_end=2151,
+)
+
+
+_GETSTATUSUPDATEAUDITTRAILRESPONSE = _descriptor.Descriptor(
+  name='GetStatusUpdateAuditTrailResponse',
+  full_name='org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2153,
+  serialized_end=2276,
+)
+
+
+_GETATTRIBUTEUPDATEAUDITTRAILRESPONSE = _descriptor.Descriptor(
+  name='GetAttributeUpdateAuditTrailResponse',
+  full_name='org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.metadata', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2279,
+  serialized_end=2408,
+)
+
+
+_GETTENANTSREQUEST = _descriptor.Descriptor(
+  name='GetTenantsRequest',
+  full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.offset', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.limit', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_id', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.parent_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.status', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.requester_email', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_client_id', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.parent_client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.type', index=6,
+      number=7, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2411,
+  serialized_end=2671,
+)
+
+_TENANT_JWKSENTRY.containing_type = _TENANT
+_TENANT.fields_by_name['tenant_status'].enum_type = _TENANTSTATUS
+_TENANT.fields_by_name['jwks'].message_type = _TENANT_JWKSENTRY
+_TENANTSTATUSUPDATEMETADATA.fields_by_name['updated_status'].enum_type = _TENANTSTATUS
+_UPDATETENANTRESPONSE.fields_by_name['tenant'].message_type = _TENANT
+_GETTENANTRESPONSE.fields_by_name['tenant'].message_type = _TENANT
+_GETALLTENANTSRESPONSE.fields_by_name['tenant'].message_type = _TENANT
+_GETALLTENANTSFORUSERRESPONSE.fields_by_name['tenant'].message_type = _TENANT
+_UPDATESTATUSREQUEST.fields_by_name['status'].enum_type = _TENANTSTATUS
+_UPDATESTATUSRESPONSE.fields_by_name['status'].enum_type = _TENANTSTATUS
+_GETSTATUSUPDATEAUDITTRAILRESPONSE.fields_by_name['metadata'].message_type = _TENANTSTATUSUPDATEMETADATA
+_GETATTRIBUTEUPDATEAUDITTRAILRESPONSE.fields_by_name['metadata'].message_type = _TENANTATTRIBUTEUPDATEMETADATA
+_GETTENANTSREQUEST.fields_by_name['status'].enum_type = _TENANTSTATUS
+_GETTENANTSREQUEST.fields_by_name['type'].enum_type = _TENANTTYPE
+DESCRIPTOR.message_types_by_name['Tenant'] = _TENANT
+DESCRIPTOR.message_types_by_name['TenantAttributeUpdateMetadata'] = _TENANTATTRIBUTEUPDATEMETADATA
+DESCRIPTOR.message_types_by_name['TenantStatusUpdateMetadata'] = _TENANTSTATUSUPDATEMETADATA
+DESCRIPTOR.message_types_by_name['AddTenantResponse'] = _ADDTENANTRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateTenantResponse'] = _UPDATETENANTRESPONSE
+DESCRIPTOR.message_types_by_name['GetTenantRequest'] = _GETTENANTREQUEST
+DESCRIPTOR.message_types_by_name['GetTenantResponse'] = _GETTENANTRESPONSE
+DESCRIPTOR.message_types_by_name['GetAllTenantsResponse'] = _GETALLTENANTSRESPONSE
+DESCRIPTOR.message_types_by_name['IsTenantExistRequest'] = _ISTENANTEXISTREQUEST
+DESCRIPTOR.message_types_by_name['IsTenantExistResponse'] = _ISTENANTEXISTRESPONSE
+DESCRIPTOR.message_types_by_name['GetAllTenantsForUserRequest'] = _GETALLTENANTSFORUSERREQUEST
+DESCRIPTOR.message_types_by_name['GetAllTenantsForUserResponse'] = _GETALLTENANTSFORUSERRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateStatusRequest'] = _UPDATESTATUSREQUEST
+DESCRIPTOR.message_types_by_name['UpdateStatusResponse'] = _UPDATESTATUSRESPONSE
+DESCRIPTOR.message_types_by_name['GetAuditTrailRequest'] = _GETAUDITTRAILREQUEST
+DESCRIPTOR.message_types_by_name['GetStatusUpdateAuditTrailResponse'] = _GETSTATUSUPDATEAUDITTRAILRESPONSE
+DESCRIPTOR.message_types_by_name['GetAttributeUpdateAuditTrailResponse'] = _GETATTRIBUTEUPDATEAUDITTRAILRESPONSE
+DESCRIPTOR.message_types_by_name['GetTenantsRequest'] = _GETTENANTSREQUEST
+DESCRIPTOR.enum_types_by_name['TenantStatus'] = _TENANTSTATUS
+DESCRIPTOR.enum_types_by_name['TenantType'] = _TENANTTYPE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Tenant = _reflection.GeneratedProtocolMessageType('Tenant', (_message.Message,), {
+
+  'JwksEntry' : _reflection.GeneratedProtocolMessageType('JwksEntry', (_message.Message,), {
+    'DESCRIPTOR' : _TENANT_JWKSENTRY,
+    '__module__' : 'TenantProfileService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.Tenant.JwksEntry)
+    })
+  ,
+  'DESCRIPTOR' : _TENANT,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.Tenant)
+  })
+_sym_db.RegisterMessage(Tenant)
+_sym_db.RegisterMessage(Tenant.JwksEntry)
+
+TenantAttributeUpdateMetadata = _reflection.GeneratedProtocolMessageType('TenantAttributeUpdateMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _TENANTATTRIBUTEUPDATEMETADATA,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata)
+  })
+_sym_db.RegisterMessage(TenantAttributeUpdateMetadata)
+
+TenantStatusUpdateMetadata = _reflection.GeneratedProtocolMessageType('TenantStatusUpdateMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _TENANTSTATUSUPDATEMETADATA,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata)
+  })
+_sym_db.RegisterMessage(TenantStatusUpdateMetadata)
+
+AddTenantResponse = _reflection.GeneratedProtocolMessageType('AddTenantResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ADDTENANTRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.AddTenantResponse)
+  })
+_sym_db.RegisterMessage(AddTenantResponse)
+
+UpdateTenantResponse = _reflection.GeneratedProtocolMessageType('UpdateTenantResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATETENANTRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.UpdateTenantResponse)
+  })
+_sym_db.RegisterMessage(UpdateTenantResponse)
+
+GetTenantRequest = _reflection.GeneratedProtocolMessageType('GetTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTENANTREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetTenantRequest)
+  })
+_sym_db.RegisterMessage(GetTenantRequest)
+
+GetTenantResponse = _reflection.GeneratedProtocolMessageType('GetTenantResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETTENANTRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetTenantResponse)
+  })
+_sym_db.RegisterMessage(GetTenantResponse)
+
+GetAllTenantsResponse = _reflection.GeneratedProtocolMessageType('GetAllTenantsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLTENANTSRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetAllTenantsResponse)
+  })
+_sym_db.RegisterMessage(GetAllTenantsResponse)
+
+IsTenantExistRequest = _reflection.GeneratedProtocolMessageType('IsTenantExistRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ISTENANTEXISTREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.IsTenantExistRequest)
+  })
+_sym_db.RegisterMessage(IsTenantExistRequest)
+
+IsTenantExistResponse = _reflection.GeneratedProtocolMessageType('IsTenantExistResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ISTENANTEXISTRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.IsTenantExistResponse)
+  })
+_sym_db.RegisterMessage(IsTenantExistResponse)
+
+GetAllTenantsForUserRequest = _reflection.GeneratedProtocolMessageType('GetAllTenantsForUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLTENANTSFORUSERREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest)
+  })
+_sym_db.RegisterMessage(GetAllTenantsForUserRequest)
+
+GetAllTenantsForUserResponse = _reflection.GeneratedProtocolMessageType('GetAllTenantsForUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLTENANTSFORUSERRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse)
+  })
+_sym_db.RegisterMessage(GetAllTenantsForUserResponse)
+
+UpdateStatusRequest = _reflection.GeneratedProtocolMessageType('UpdateStatusRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESTATUSREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.UpdateStatusRequest)
+  })
+_sym_db.RegisterMessage(UpdateStatusRequest)
+
+UpdateStatusResponse = _reflection.GeneratedProtocolMessageType('UpdateStatusResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESTATUSRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.UpdateStatusResponse)
+  })
+_sym_db.RegisterMessage(UpdateStatusResponse)
+
+GetAuditTrailRequest = _reflection.GeneratedProtocolMessageType('GetAuditTrailRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETAUDITTRAILREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetAuditTrailRequest)
+  })
+_sym_db.RegisterMessage(GetAuditTrailRequest)
+
+GetStatusUpdateAuditTrailResponse = _reflection.GeneratedProtocolMessageType('GetStatusUpdateAuditTrailResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSTATUSUPDATEAUDITTRAILRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse)
+  })
+_sym_db.RegisterMessage(GetStatusUpdateAuditTrailResponse)
+
+GetAttributeUpdateAuditTrailResponse = _reflection.GeneratedProtocolMessageType('GetAttributeUpdateAuditTrailResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETATTRIBUTEUPDATEAUDITTRAILRESPONSE,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse)
+  })
+_sym_db.RegisterMessage(GetAttributeUpdateAuditTrailResponse)
+
+GetTenantsRequest = _reflection.GeneratedProtocolMessageType('GetTenantsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTENANTSREQUEST,
+  '__module__' : 'TenantProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.profile.service.GetTenantsRequest)
+  })
+_sym_db.RegisterMessage(GetTenantsRequest)
+
+
+DESCRIPTOR._options = None
+_TENANT_JWKSENTRY._options = None
+
+_TENANTPROFILESERVICE = _descriptor.ServiceDescriptor(
+  name='TenantProfileService',
+  full_name='org.apache.custos.tenant.profile.service.TenantProfileService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2830,
+  serialized_end=4185,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='addTenant',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.addTenant',
+    index=0,
+    containing_service=None,
+    input_type=_TENANT,
+    output_type=_TENANT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateTenant',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.updateTenant',
+    index=1,
+    containing_service=None,
+    input_type=_TENANT,
+    output_type=_TENANT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenant',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.getTenant',
+    index=2,
+    containing_service=None,
+    input_type=_GETTENANTREQUEST,
+    output_type=_GETTENANTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateTenantStatus',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.updateTenantStatus',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATESTATUSREQUEST,
+    output_type=_UPDATESTATUSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllTenants',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.getAllTenants',
+    index=4,
+    containing_service=None,
+    input_type=_GETTENANTSREQUEST,
+    output_type=_GETALLTENANTSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isTenantExist',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.isTenantExist',
+    index=5,
+    containing_service=None,
+    input_type=_ISTENANTEXISTREQUEST,
+    output_type=_ISTENANTEXISTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllTenantsForUser',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.getAllTenantsForUser',
+    index=6,
+    containing_service=None,
+    input_type=_GETALLTENANTSFORUSERREQUEST,
+    output_type=_GETALLTENANTSFORUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantStatusUpdateAuditTrail',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.getTenantStatusUpdateAuditTrail',
+    index=7,
+    containing_service=None,
+    input_type=_GETAUDITTRAILREQUEST,
+    output_type=_GETSTATUSUPDATEAUDITTRAILRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantAttributeUpdateAuditTrail',
+    full_name='org.apache.custos.tenant.profile.service.TenantProfileService.getTenantAttributeUpdateAuditTrail',
+    index=8,
+    containing_service=None,
+    input_type=_GETAUDITTRAILREQUEST,
+    output_type=_GETATTRIBUTEUPDATEAUDITTRAILRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_TENANTPROFILESERVICE)
+
+DESCRIPTOR.services_by_name['TenantProfileService'] = _TENANTPROFILESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2_grpc.py
new file mode 100644
index 0000000..3206689
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/TenantProfileService_pb2_grpc.py
@@ -0,0 +1,330 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.TenantProfileService_pb2 as TenantProfileService__pb2
+
+
+class TenantProfileServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/addTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.updateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.getTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenant',
+                request_serializer=TenantProfileService__pb2.GetTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetTenantResponse.FromString,
+                )
+        self.updateTenantStatus = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenantStatus',
+                request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
+                )
+        self.getAllTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.isTenantExist = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/isTenantExist',
+                request_serializer=TenantProfileService__pb2.IsTenantExistRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.IsTenantExistResponse.FromString,
+                )
+        self.getAllTenantsForUser = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenantsForUser',
+                request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+                )
+        self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantStatusUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+                )
+        self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantAttributeUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+                )
+
+
+class TenantProfileServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def addTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateTenantStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isTenantExist(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllTenantsForUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantStatusUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantAttributeUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_TenantProfileServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'addTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.addTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'updateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'getTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenant,
+                    request_deserializer=TenantProfileService__pb2.GetTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetTenantResponse.SerializeToString,
+            ),
+            'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenantStatus,
+                    request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
+            ),
+            'getAllTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'isTenantExist': grpc.unary_unary_rpc_method_handler(
+                    servicer.isTenantExist,
+                    request_deserializer=TenantProfileService__pb2.IsTenantExistRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.IsTenantExistResponse.SerializeToString,
+            ),
+            'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenantsForUser,
+                    request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
+            ),
+            'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantStatusUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantAttributeUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.tenant.profile.service.TenantProfileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class TenantProfileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/addTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenant',
+            TenantProfileService__pb2.GetTenantRequest.SerializeToString,
+            TenantProfileService__pb2.GetTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenantStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenantStatus',
+            TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+            TenantProfileService__pb2.UpdateStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isTenantExist(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/isTenantExist',
+            TenantProfileService__pb2.IsTenantExistRequest.SerializeToString,
+            TenantProfileService__pb2.IsTenantExistResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenantsForUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenantsForUser',
+            TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantStatusUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantStatusUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantAttributeUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantAttributeUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2.py
new file mode 100644
index 0000000..5beb760
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2.py
@@ -0,0 +1,1454 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: UserProfileService.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='UserProfileService.proto',
+  package='org.apache.custos.user.profile.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x18UserProfileService.proto\x12&org.apache.custos.user.profile.service\"\x97\x03\n\x0bUserProfile\x12\x10\n\x08username\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x12\n\nfirst_name\x18\x03 \x01(\t\x12\x11\n\tlast_name\x18\x04 \x01(\t\x12\x12\n\ncreated_at\x18\x05 \x01(\x03\x12\x42\n\x06status\x18\x06 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12I\n\nattributes\x18\x07 \x03(\x0b\x32\x35.org.apache.custos.user.profile.service.UserAttribute\x12\x14\n\x0c\x63lient_roles\x18\x08 \x03(\t\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x18\n\x10last_modified_at\x18\n \x01(\x03\x12?\n\x04type\x18\x0b \x01(\x0e\x32\x31.org.apache.custos.user.profile.service.UserTypes\x12\x17\n\x0fmembership_type\x18\x0c \x01(\t\"\x95\x01\n\x12UserProfileRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x44\n\x07profile\x18\x02 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"7\n\rUserAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"c\n\x1aGetAllUserProfilesResponse\x12\x45\n\x08profiles\x18\x01 \x03(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\"@\n\x1aGetUpdateAuditTrailRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\"\x88\x01\n\"UserProfileAttributeUpdateMetadata\x12\x19\n\x11updated_attribute\x18\x01 \x01(\t\x12\x1f\n\x17updated_attribute_value\x18\x02 \x01(\t\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x12\n\nupdated_at\x18\x04 \x01(\t\"\x95\x01\n\x1fUserProfileStatusUpdateMetadata\x12J\n\x0eupdated_status\x18\x01 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12\x12\n\nupdated_by\x18\x02 \x01(\t\x12\x12\n\nupdated_at\x18\x03 \x01(\t\"\xe1\x01\n\x1bGetUpdateAuditTrailResponse\x12\x63\n\x0f\x61ttribute_audit\x18\x01 \x03(\x0b\x32J.org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata\x12]\n\x0cstatus_audit\x18\x02 \x03(\x0b\x32G.org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata\"\xc1\x01\n\x0cGroupRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12<\n\x05group\x18\x02 \x01(\x0b\x32-.org.apache.custos.user.profile.service.Group\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x17\n\x0fmembership_type\x18\x05 \x01(\t\x12\n\n\x02id\x18\x06 \x01(\t\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"U\n\x14GetAllGroupsResponse\x12=\n\x06groups\x18\x01 \x03(\x0b\x32-.org.apache.custos.user.profile.service.Group\"\x84\x02\n\x05Group\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12\x11\n\tparent_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63reated_time\x18\x06 \x01(\x03\x12\x1a\n\x12last_modified_time\x18\x07 \x01(\x03\x12J\n\nattributes\x18\x08 \x03(\x0b\x32\x36.org.apache.custos.user.profile.service.GroupAttribute\x12\x13\n\x0b\x64\x65scription\x18\t \x01(\t\x12\x10\n\x08owner_id\x18\n \x01(\t\"8\n\x0eGroupAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"{\n\x0fGroupMembership\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x10\n\x08\x63lientId\x18\x05 \x01(\t\x12\x11\n\tclientSec\x18\x06 \x01(\t\"c\n\x16GroupToGroupMembership\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tparent_id\x18\x02 \x01(\t\x12\x10\n\x08\x63hild_id\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"T\n\x1eUserGroupMembershipTypeRequest\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t*\xe3\x01\n\nUserStatus\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\x0c\n\x08\x41PPROVED\x10\x02\x12\x0b\n\x07\x44\x45LETED\x10\x03\x12\r\n\tDUPLICATE\x10\x04\x12\x10\n\x0cGRACE_PERIOD\x10\x05\x12\x0b\n\x07INVITED\x10\x06\x12\n\n\x06\x44\x45NIED\x10\x07\x12\x0b\n\x07PENDING\x10\x08\x12\x14\n\x10PENDING_APPROVAL\x10\t\x12\x18\n\x14PENDING_CONFIRMATION\x10\n\x12\r\n\tSUSPENDED\x10\x0b\x12\x0c\n\x08\x44\x45\x43LINED\x10\x0c\x12\x0b\n\x07\x45XPIRED\x10\r*?\n\x1b\x44\x65\x66\x61ultGroupMembershipTypes\x12\t\n\x05OWNER\x10\x00\x12\t\n\x05\x41\x44MIN\x10\x01\x12\n\n\x06MEMBER\x10\x02*(\n\tUserTypes\x12\x0c\n\x08\x45ND_USER\x10\x00\x12\r\n\tCOMMUNITY\x10\x01\x32\xed\x19\n\x12UserProfileService\x12\x84\x01\n\x11\x63reateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11updateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x81\x01\n\x0egetUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11\x64\x65leteUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x9c\x01\n\x1agetAllUserProfilesInTenant\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x9e\x01\n\x1c\x66indUserProfilesByAttributes\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12r\n\x0b\x63reateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0bupdateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0b\x64\x65leteGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12o\n\x08getGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12\x82\x01\n\x0cgetAllGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\xa4\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\x12y\n\x0e\x61\x64\x64UserToGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12~\n\x13removeUserFromGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x91\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8e\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x8f\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x94\x01\n\x1a\x61\x64\x64UserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x97\x01\n\x1dremoveUserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x87\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x83\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12t\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+_USERSTATUS = _descriptor.EnumDescriptor(
+  name='UserStatus',
+  full_name='org.apache.custos.user.profile.service.UserStatus',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ACTIVE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CONFIRMED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='APPROVED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DELETED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DUPLICATE', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='GRACE_PERIOD', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='INVITED', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DENIED', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING', index=8, number=8,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING_APPROVAL', index=9, number=9,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING_CONFIRMATION', index=10, number=10,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SUSPENDED', index=11, number=11,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DECLINED', index=12, number=12,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='EXPIRED', index=13, number=13,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2316,
+  serialized_end=2543,
+)
+_sym_db.RegisterEnumDescriptor(_USERSTATUS)
+
+UserStatus = enum_type_wrapper.EnumTypeWrapper(_USERSTATUS)
+_DEFAULTGROUPMEMBERSHIPTYPES = _descriptor.EnumDescriptor(
+  name='DefaultGroupMembershipTypes',
+  full_name='org.apache.custos.user.profile.service.DefaultGroupMembershipTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='OWNER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ADMIN', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MEMBER', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2545,
+  serialized_end=2608,
+)
+_sym_db.RegisterEnumDescriptor(_DEFAULTGROUPMEMBERSHIPTYPES)
+
+DefaultGroupMembershipTypes = enum_type_wrapper.EnumTypeWrapper(_DEFAULTGROUPMEMBERSHIPTYPES)
+_USERTYPES = _descriptor.EnumDescriptor(
+  name='UserTypes',
+  full_name='org.apache.custos.user.profile.service.UserTypes',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='END_USER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='COMMUNITY', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2610,
+  serialized_end=2650,
+)
+_sym_db.RegisterEnumDescriptor(_USERTYPES)
+
+UserTypes = enum_type_wrapper.EnumTypeWrapper(_USERTYPES)
+ACTIVE = 0
+CONFIRMED = 1
+APPROVED = 2
+DELETED = 3
+DUPLICATE = 4
+GRACE_PERIOD = 5
+INVITED = 6
+DENIED = 7
+PENDING = 8
+PENDING_APPROVAL = 9
+PENDING_CONFIRMATION = 10
+SUSPENDED = 11
+DECLINED = 12
+EXPIRED = 13
+OWNER = 0
+ADMIN = 1
+MEMBER = 2
+END_USER = 0
+COMMUNITY = 1
+
+
+
+_USERPROFILE = _descriptor.Descriptor(
+  name='UserProfile',
+  full_name='org.apache.custos.user.profile.service.UserProfile',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.profile.service.UserProfile.username', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='org.apache.custos.user.profile.service.UserProfile.email', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='first_name', full_name='org.apache.custos.user.profile.service.UserProfile.first_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_name', full_name='org.apache.custos.user.profile.service.UserProfile.last_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='org.apache.custos.user.profile.service.UserProfile.created_at', index=4,
+      number=5, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.user.profile.service.UserProfile.status', index=5,
+      number=6, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.user.profile.service.UserProfile.attributes', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.user.profile.service.UserProfile.client_roles', index=7,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='realm_roles', full_name='org.apache.custos.user.profile.service.UserProfile.realm_roles', index=8,
+      number=9, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_modified_at', full_name='org.apache.custos.user.profile.service.UserProfile.last_modified_at', index=9,
+      number=10, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.user.profile.service.UserProfile.type', index=10,
+      number=11, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='membership_type', full_name='org.apache.custos.user.profile.service.UserProfile.membership_type', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=69,
+  serialized_end=476,
+)
+
+
+_USERPROFILEREQUEST = _descriptor.Descriptor(
+  name='UserProfileRequest',
+  full_name='org.apache.custos.user.profile.service.UserProfileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.user.profile.service.UserProfileRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='profile', full_name='org.apache.custos.user.profile.service.UserProfileRequest.profile', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.user.profile.service.UserProfileRequest.performed_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.profile.service.UserProfileRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=479,
+  serialized_end=628,
+)
+
+
+_USERATTRIBUTE = _descriptor.Descriptor(
+  name='UserAttribute',
+  full_name='org.apache.custos.user.profile.service.UserAttribute',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.user.profile.service.UserAttribute.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.user.profile.service.UserAttribute.key', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.user.profile.service.UserAttribute.value', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=630,
+  serialized_end=685,
+)
+
+
+_GETALLUSERPROFILESRESPONSE = _descriptor.Descriptor(
+  name='GetAllUserProfilesResponse',
+  full_name='org.apache.custos.user.profile.service.GetAllUserProfilesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='profiles', full_name='org.apache.custos.user.profile.service.GetAllUserProfilesResponse.profiles', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=687,
+  serialized_end=786,
+)
+
+
+_GETUPDATEAUDITTRAILREQUEST = _descriptor.Descriptor(
+  name='GetUpdateAuditTrailRequest',
+  full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest.tenantId', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest.username', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=788,
+  serialized_end=852,
+)
+
+
+_USERPROFILEATTRIBUTEUPDATEMETADATA = _descriptor.Descriptor(
+  name='UserProfileAttributeUpdateMetadata',
+  full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='updated_attribute', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_attribute', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_attribute_value', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_attribute_value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_by', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_at', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=855,
+  serialized_end=991,
+)
+
+
+_USERPROFILESTATUSUPDATEMETADATA = _descriptor.Descriptor(
+  name='UserProfileStatusUpdateMetadata',
+  full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='updated_status', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_status', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_by', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_by', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_at', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=994,
+  serialized_end=1143,
+)
+
+
+_GETUPDATEAUDITTRAILRESPONSE = _descriptor.Descriptor(
+  name='GetUpdateAuditTrailResponse',
+  full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='attribute_audit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.attribute_audit', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status_audit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.status_audit', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1146,
+  serialized_end=1371,
+)
+
+
+_GROUPREQUEST = _descriptor.Descriptor(
+  name='GroupRequest',
+  full_name='org.apache.custos.user.profile.service.GroupRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='group', full_name='org.apache.custos.user.profile.service.GroupRequest.group', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.user.profile.service.GroupRequest.performed_by', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.profile.service.GroupRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='membership_type', full_name='org.apache.custos.user.profile.service.GroupRequest.membership_type', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.user.profile.service.GroupRequest.id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.user.profile.service.GroupRequest.client_sec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1374,
+  serialized_end=1567,
+)
+
+
+_GETALLGROUPSRESPONSE = _descriptor.Descriptor(
+  name='GetAllGroupsResponse',
+  full_name='org.apache.custos.user.profile.service.GetAllGroupsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='groups', full_name='org.apache.custos.user.profile.service.GetAllGroupsResponse.groups', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1569,
+  serialized_end=1654,
+)
+
+
+_GROUP = _descriptor.Descriptor(
+  name='Group',
+  full_name='org.apache.custos.user.profile.service.Group',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.user.profile.service.Group.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='org.apache.custos.user.profile.service.Group.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='realm_roles', full_name='org.apache.custos.user.profile.service.Group.realm_roles', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_roles', full_name='org.apache.custos.user.profile.service.Group.client_roles', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_id', full_name='org.apache.custos.user.profile.service.Group.parent_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_time', full_name='org.apache.custos.user.profile.service.Group.created_time', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='last_modified_time', full_name='org.apache.custos.user.profile.service.Group.last_modified_time', index=6,
+      number=7, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='attributes', full_name='org.apache.custos.user.profile.service.Group.attributes', index=7,
+      number=8, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='org.apache.custos.user.profile.service.Group.description', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.user.profile.service.Group.owner_id', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1657,
+  serialized_end=1917,
+)
+
+
+_GROUPATTRIBUTE = _descriptor.Descriptor(
+  name='GroupAttribute',
+  full_name='org.apache.custos.user.profile.service.GroupAttribute',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.user.profile.service.GroupAttribute.id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.user.profile.service.GroupAttribute.key', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.user.profile.service.GroupAttribute.value', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1919,
+  serialized_end=1975,
+)
+
+
+_GROUPMEMBERSHIP = _descriptor.Descriptor(
+  name='GroupMembership',
+  full_name='org.apache.custos.user.profile.service.GroupMembership',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupMembership.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='group_id', full_name='org.apache.custos.user.profile.service.GroupMembership.group_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.profile.service.GroupMembership.username', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.user.profile.service.GroupMembership.type', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.user.profile.service.GroupMembership.clientId', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.user.profile.service.GroupMembership.clientSec', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1977,
+  serialized_end=2100,
+)
+
+
+_GROUPTOGROUPMEMBERSHIP = _descriptor.Descriptor(
+  name='GroupToGroupMembership',
+  full_name='org.apache.custos.user.profile.service.GroupToGroupMembership',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_id', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.parent_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='child_id', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.child_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2102,
+  serialized_end=2201,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.user.profile.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.user.profile.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2203,
+  serialized_end=2227,
+)
+
+
+_USERGROUPMEMBERSHIPTYPEREQUEST = _descriptor.Descriptor(
+  name='UserGroupMembershipTypeRequest',
+  full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest.type', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2229,
+  serialized_end=2313,
+)
+
+_USERPROFILE.fields_by_name['status'].enum_type = _USERSTATUS
+_USERPROFILE.fields_by_name['attributes'].message_type = _USERATTRIBUTE
+_USERPROFILE.fields_by_name['type'].enum_type = _USERTYPES
+_USERPROFILEREQUEST.fields_by_name['profile'].message_type = _USERPROFILE
+_GETALLUSERPROFILESRESPONSE.fields_by_name['profiles'].message_type = _USERPROFILE
+_USERPROFILESTATUSUPDATEMETADATA.fields_by_name['updated_status'].enum_type = _USERSTATUS
+_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['attribute_audit'].message_type = _USERPROFILEATTRIBUTEUPDATEMETADATA
+_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['status_audit'].message_type = _USERPROFILESTATUSUPDATEMETADATA
+_GROUPREQUEST.fields_by_name['group'].message_type = _GROUP
+_GETALLGROUPSRESPONSE.fields_by_name['groups'].message_type = _GROUP
+_GROUP.fields_by_name['attributes'].message_type = _GROUPATTRIBUTE
+DESCRIPTOR.message_types_by_name['UserProfile'] = _USERPROFILE
+DESCRIPTOR.message_types_by_name['UserProfileRequest'] = _USERPROFILEREQUEST
+DESCRIPTOR.message_types_by_name['UserAttribute'] = _USERATTRIBUTE
+DESCRIPTOR.message_types_by_name['GetAllUserProfilesResponse'] = _GETALLUSERPROFILESRESPONSE
+DESCRIPTOR.message_types_by_name['GetUpdateAuditTrailRequest'] = _GETUPDATEAUDITTRAILREQUEST
+DESCRIPTOR.message_types_by_name['UserProfileAttributeUpdateMetadata'] = _USERPROFILEATTRIBUTEUPDATEMETADATA
+DESCRIPTOR.message_types_by_name['UserProfileStatusUpdateMetadata'] = _USERPROFILESTATUSUPDATEMETADATA
+DESCRIPTOR.message_types_by_name['GetUpdateAuditTrailResponse'] = _GETUPDATEAUDITTRAILRESPONSE
+DESCRIPTOR.message_types_by_name['GroupRequest'] = _GROUPREQUEST
+DESCRIPTOR.message_types_by_name['GetAllGroupsResponse'] = _GETALLGROUPSRESPONSE
+DESCRIPTOR.message_types_by_name['Group'] = _GROUP
+DESCRIPTOR.message_types_by_name['GroupAttribute'] = _GROUPATTRIBUTE
+DESCRIPTOR.message_types_by_name['GroupMembership'] = _GROUPMEMBERSHIP
+DESCRIPTOR.message_types_by_name['GroupToGroupMembership'] = _GROUPTOGROUPMEMBERSHIP
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['UserGroupMembershipTypeRequest'] = _USERGROUPMEMBERSHIPTYPEREQUEST
+DESCRIPTOR.enum_types_by_name['UserStatus'] = _USERSTATUS
+DESCRIPTOR.enum_types_by_name['DefaultGroupMembershipTypes'] = _DEFAULTGROUPMEMBERSHIPTYPES
+DESCRIPTOR.enum_types_by_name['UserTypes'] = _USERTYPES
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+UserProfile = _reflection.GeneratedProtocolMessageType('UserProfile', (_message.Message,), {
+  'DESCRIPTOR' : _USERPROFILE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserProfile)
+  })
+_sym_db.RegisterMessage(UserProfile)
+
+UserProfileRequest = _reflection.GeneratedProtocolMessageType('UserProfileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _USERPROFILEREQUEST,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserProfileRequest)
+  })
+_sym_db.RegisterMessage(UserProfileRequest)
+
+UserAttribute = _reflection.GeneratedProtocolMessageType('UserAttribute', (_message.Message,), {
+  'DESCRIPTOR' : _USERATTRIBUTE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserAttribute)
+  })
+_sym_db.RegisterMessage(UserAttribute)
+
+GetAllUserProfilesResponse = _reflection.GeneratedProtocolMessageType('GetAllUserProfilesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLUSERPROFILESRESPONSE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GetAllUserProfilesResponse)
+  })
+_sym_db.RegisterMessage(GetAllUserProfilesResponse)
+
+GetUpdateAuditTrailRequest = _reflection.GeneratedProtocolMessageType('GetUpdateAuditTrailRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETUPDATEAUDITTRAILREQUEST,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest)
+  })
+_sym_db.RegisterMessage(GetUpdateAuditTrailRequest)
+
+UserProfileAttributeUpdateMetadata = _reflection.GeneratedProtocolMessageType('UserProfileAttributeUpdateMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _USERPROFILEATTRIBUTEUPDATEMETADATA,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata)
+  })
+_sym_db.RegisterMessage(UserProfileAttributeUpdateMetadata)
+
+UserProfileStatusUpdateMetadata = _reflection.GeneratedProtocolMessageType('UserProfileStatusUpdateMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _USERPROFILESTATUSUPDATEMETADATA,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata)
+  })
+_sym_db.RegisterMessage(UserProfileStatusUpdateMetadata)
+
+GetUpdateAuditTrailResponse = _reflection.GeneratedProtocolMessageType('GetUpdateAuditTrailResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETUPDATEAUDITTRAILRESPONSE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse)
+  })
+_sym_db.RegisterMessage(GetUpdateAuditTrailResponse)
+
+GroupRequest = _reflection.GeneratedProtocolMessageType('GroupRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPREQUEST,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GroupRequest)
+  })
+_sym_db.RegisterMessage(GroupRequest)
+
+GetAllGroupsResponse = _reflection.GeneratedProtocolMessageType('GetAllGroupsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLGROUPSRESPONSE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GetAllGroupsResponse)
+  })
+_sym_db.RegisterMessage(GetAllGroupsResponse)
+
+Group = _reflection.GeneratedProtocolMessageType('Group', (_message.Message,), {
+  'DESCRIPTOR' : _GROUP,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.Group)
+  })
+_sym_db.RegisterMessage(Group)
+
+GroupAttribute = _reflection.GeneratedProtocolMessageType('GroupAttribute', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPATTRIBUTE,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GroupAttribute)
+  })
+_sym_db.RegisterMessage(GroupAttribute)
+
+GroupMembership = _reflection.GeneratedProtocolMessageType('GroupMembership', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPMEMBERSHIP,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GroupMembership)
+  })
+_sym_db.RegisterMessage(GroupMembership)
+
+GroupToGroupMembership = _reflection.GeneratedProtocolMessageType('GroupToGroupMembership', (_message.Message,), {
+  'DESCRIPTOR' : _GROUPTOGROUPMEMBERSHIP,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.GroupToGroupMembership)
+  })
+_sym_db.RegisterMessage(GroupToGroupMembership)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+UserGroupMembershipTypeRequest = _reflection.GeneratedProtocolMessageType('UserGroupMembershipTypeRequest', (_message.Message,), {
+  'DESCRIPTOR' : _USERGROUPMEMBERSHIPTYPEREQUEST,
+  '__module__' : 'UserProfileService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest)
+  })
+_sym_db.RegisterMessage(UserGroupMembershipTypeRequest)
+
+
+DESCRIPTOR._options = None
+
+_USERPROFILESERVICE = _descriptor.ServiceDescriptor(
+  name='UserProfileService',
+  full_name='org.apache.custos.user.profile.service.UserProfileService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2653,
+  serialized_end=5962,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createUserProfile',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.createUserProfile',
+    index=0,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_USERPROFILE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateUserProfile',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.updateUserProfile',
+    index=1,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_USERPROFILE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserProfile',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getUserProfile',
+    index=2,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_USERPROFILE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUserProfile',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.deleteUserProfile',
+    index=3,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_USERPROFILE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllUserProfilesInTenant',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllUserProfilesInTenant',
+    index=4,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_GETALLUSERPROFILESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findUserProfilesByAttributes',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.findUserProfilesByAttributes',
+    index=5,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_GETALLUSERPROFILESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.createGroup',
+    index=6,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.updateGroup',
+    index=7,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.deleteGroup',
+    index=8,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getGroup',
+    index=9,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GROUP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllGroups',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllGroups',
+    index=10,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GETALLGROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserProfileAuditTrails',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getUserProfileAuditTrails',
+    index=11,
+    containing_service=None,
+    input_type=_GETUPDATEAUDITTRAILREQUEST,
+    output_type=_GETUPDATEAUDITTRAILRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserToGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.addUserToGroup',
+    index=12,
+    containing_service=None,
+    input_type=_GROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserFromGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.removeUserFromGroup',
+    index=13,
+    containing_service=None,
+    input_type=_GROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addChildGroupToParentGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.addChildGroupToParentGroup',
+    index=14,
+    containing_service=None,
+    input_type=_GROUPTOGROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeChildGroupFromParentGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.removeChildGroupFromParentGroup',
+    index=15,
+    containing_service=None,
+    input_type=_GROUPTOGROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllGroupsOfUser',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllGroupsOfUser',
+    index=16,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=_GETALLGROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllParentGroupsOfGroup',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllParentGroupsOfGroup',
+    index=17,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GETALLGROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserGroupMembershipType',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.addUserGroupMembershipType',
+    index=18,
+    containing_service=None,
+    input_type=_USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserGroupMembershipType',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.removeUserGroupMembershipType',
+    index=19,
+    containing_service=None,
+    input_type=_USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllChildUsers',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllChildUsers',
+    index=20,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GETALLUSERPROFILESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllChildGroups',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.getAllChildGroups',
+    index=21,
+    containing_service=None,
+    input_type=_GROUPREQUEST,
+    output_type=_GETALLGROUPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='changeUserMembershipType',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.changeUserMembershipType',
+    index=22,
+    containing_service=None,
+    input_type=_GROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='hasAccess',
+    full_name='org.apache.custos.user.profile.service.UserProfileService.hasAccess',
+    index=23,
+    containing_service=None,
+    input_type=_GROUPMEMBERSHIP,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_USERPROFILESERVICE)
+
+DESCRIPTOR.services_by_name['UserProfileService'] = _USERPROFILESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2_grpc.py
new file mode 100644
index 0000000..e27d123
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/UserProfileService_pb2_grpc.py
@@ -0,0 +1,825 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
+
+
+class UserProfileServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/createUserProfile',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.updateUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/updateUserProfile',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.getUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getUserProfile',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.deleteUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/deleteUserProfile',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.getAllUserProfilesInTenant = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllUserProfilesInTenant',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+                )
+        self.findUserProfilesByAttributes = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/findUserProfilesByAttributes',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+                )
+        self.createGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/createGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.updateGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/updateGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.deleteGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/deleteGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.getGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.getAllGroups = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllGroups',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.getUserProfileAuditTrails = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getUserProfileAuditTrails',
+                request_serializer=UserProfileService__pb2.GetUpdateAuditTrailRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetUpdateAuditTrailResponse.FromString,
+                )
+        self.addUserToGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/addUserToGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserFromGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/removeUserFromGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.addChildGroupToParentGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/addChildGroupToParentGroup',
+                request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeChildGroupFromParentGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/removeChildGroupFromParentGroup',
+                request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.getAllGroupsOfUser = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllGroupsOfUser',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.getAllParentGroupsOfGroup = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllParentGroupsOfGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.addUserGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/addUserGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/removeUserGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.getAllChildUsers = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllChildUsers',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+                )
+        self.getAllChildGroups = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/getAllChildGroups',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.changeUserMembershipType = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/changeUserMembershipType',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.hasAccess = channel.unary_unary(
+                '/org.apache.custos.user.profile.service.UserProfileService/hasAccess',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+
+
+class UserProfileServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllUserProfilesInTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findUserProfilesByAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserProfileAuditTrails(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserToGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserFromGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addChildGroupToParentGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeChildGroupFromParentGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllGroupsOfUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllParentGroupsOfGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllChildUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllChildGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def changeUserMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def hasAccess(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_UserProfileServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.createUserProfile,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'updateUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateUserProfile,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'getUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserProfile,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'deleteUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUserProfile,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'getAllUserProfilesInTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllUserProfilesInTenant,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllUserProfilesResponse.SerializeToString,
+            ),
+            'findUserProfilesByAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.findUserProfilesByAttributes,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllUserProfilesResponse.SerializeToString,
+            ),
+            'createGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.createGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'updateGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'deleteGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'getGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'getAllGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroups,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'getUserProfileAuditTrails': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserProfileAuditTrails,
+                    request_deserializer=UserProfileService__pb2.GetUpdateAuditTrailRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'addUserToGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserFromGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'addChildGroupToParentGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addChildGroupToParentGroup,
+                    request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeChildGroupFromParentGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeChildGroupFromParentGroup,
+                    request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'getAllGroupsOfUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroupsOfUser,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'getAllParentGroupsOfGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllParentGroupsOfGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'addUserGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'getAllChildUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllChildUsers,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllUserProfilesResponse.SerializeToString,
+            ),
+            'getAllChildGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllChildGroups,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'changeUserMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.changeUserMembershipType,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'hasAccess': grpc.unary_unary_rpc_method_handler(
+                    servicer.hasAccess,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.user.profile.service.UserProfileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class UserProfileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/createUserProfile',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/updateUserProfile',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getUserProfile',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/deleteUserProfile',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllUserProfilesInTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllUserProfilesInTenant',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findUserProfilesByAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/findUserProfilesByAttributes',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/createGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/updateGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/deleteGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllGroups',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserProfileAuditTrails(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getUserProfileAuditTrails',
+            UserProfileService__pb2.GetUpdateAuditTrailRequest.SerializeToString,
+            UserProfileService__pb2.GetUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserToGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/addUserToGroup',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserFromGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/removeUserFromGroup',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addChildGroupToParentGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/addChildGroupToParentGroup',
+            UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeChildGroupFromParentGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/removeChildGroupFromParentGroup',
+            UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllGroupsOfUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllGroupsOfUser',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllParentGroupsOfGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllParentGroupsOfGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/addUserGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/removeUserGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllChildUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllChildUsers',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllChildGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/getAllChildGroups',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def changeUserMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/changeUserMembershipType',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def hasAccess(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.profile.service.UserProfileService/hasAccess',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/core/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2.py
new file mode 100644
index 0000000..85892cc
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2.py
@@ -0,0 +1,389 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: AgentManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from google.rpc import error_details_pb2 as google_dot_rpc_dot_error__details__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='AgentManagementService.proto',
+  package='org.apache.custos.agent.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1c\x41gentManagementService.proto\x12*org.apache.custos.agent.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\"\x81\x01\n\x12\x41gentSearchRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\t\"7\n\x19\x41gentRegistrationResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06secret\x18\x02 \x01(\t\"?\n\x19SynchronizeAgentDBRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t2\xdc\x14\n\x16\x41gentManagementService\x12\x9b\x01\n\x0c\x65nableAgents\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"\'\x82\xd3\xe4\x93\x02!\"\x1f/agent-management/v1.0.0/enable\x12\xb0\x01\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"4\x82\xd3\xe4\x93\x02.\",/agent-management/v1.0.0/token/configuration\x12\x9a\x01\n\x10\x61\x64\x64RolesToClient\x12..org.apache.custos.iam.service.AddRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"&\x82\xd3\xe4\x93\x02 \"\x1e/agent-management/v1.0.0/roles\x12\xc1\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x45.org.apache.custos.agent.management.service.AgentRegistrationResponse\",\x82\xd3\xe4\x93\x02&\"\x1e/agent-management/v1.0.0/agent:\x04user\x12\x9d\x01\n\x08getAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a$.org.apache.custos.iam.service.Agent\"+\x82\xd3\xe4\x93\x02%\x12#/agent-management/v1.0.0/agent/{id}\x12\xaa\x01\n\x0b\x64\x65leteAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%*#/agent-management/v1.0.0/agent/{id}\x12\xb8\x01\n\x0c\x64isableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"8\x82\xd3\xe4\x93\x02\x32\"0/agent-management/v1.0.0/agent/deactivation/{id}\x12\xb5\x01\n\x0b\x65nableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\"./agent-management/v1.0.0/agent/activation/{id}\x12\xb0\x01\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/agent-management/v1.0.0/agent/attributes\x12\xb5\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+*)/agent-management/v1.0.0/agent/attributes\x12\xa3\x01\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&\"$/agent-management/v1.0.0/agent/roles\x12\xab\x01\n\x14\x64\x65leteRolesFromAgent\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&*$/agent-management/v1.0.0/agent/roles\x12\xae\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"(/agent-management/v1.0.0/protocol/mapper\x12\x9f\x01\n\x0cgetAllAgents\x12..org.apache.custos.iam.service.GetAllResources\x1a\x36.org.apache.custos.iam.service.GetAllResourcesResponse\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/agent-management/v1.0.0/agents\x12\xbd\x01\n\x13synchronizeAgentDBs\x12\x45.org.apache.custos.agent.management.service.SynchronizeAgentDBRequest\x1a..org.apache.custos.iam.service.OperationStatus\"/\x82\xd3\xe4\x93\x02)\"\'/agent-management/v1.0.0/db/synchronizeB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_rpc_dot_error__details__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
+
+
+
+
+_AGENTSEARCHREQUEST = _descriptor.Descriptor(
+  name='AgentSearchRequest',
+  full_name='org.apache.custos.agent.management.service.AgentSearchRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.tenantId', index=0,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='accessToken', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.accessToken', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.clientId', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.clientSec', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.performedBy', index=4,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.id', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=191,
+  serialized_end=320,
+)
+
+
+_AGENTREGISTRATIONRESPONSE = _descriptor.Descriptor(
+  name='AgentRegistrationResponse',
+  full_name='org.apache.custos.agent.management.service.AgentRegistrationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.agent.management.service.AgentRegistrationResponse.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='secret', full_name='org.apache.custos.agent.management.service.AgentRegistrationResponse.secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=322,
+  serialized_end=377,
+)
+
+
+_SYNCHRONIZEAGENTDBREQUEST = _descriptor.Descriptor(
+  name='SynchronizeAgentDBRequest',
+  full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest.tenantId', index=0,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest.clientId', index=1,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=379,
+  serialized_end=442,
+)
+
+DESCRIPTOR.message_types_by_name['AgentSearchRequest'] = _AGENTSEARCHREQUEST
+DESCRIPTOR.message_types_by_name['AgentRegistrationResponse'] = _AGENTREGISTRATIONRESPONSE
+DESCRIPTOR.message_types_by_name['SynchronizeAgentDBRequest'] = _SYNCHRONIZEAGENTDBREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+AgentSearchRequest = _reflection.GeneratedProtocolMessageType('AgentSearchRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AGENTSEARCHREQUEST,
+  '__module__' : 'AgentManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.management.service.AgentSearchRequest)
+  })
+_sym_db.RegisterMessage(AgentSearchRequest)
+
+AgentRegistrationResponse = _reflection.GeneratedProtocolMessageType('AgentRegistrationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AGENTREGISTRATIONRESPONSE,
+  '__module__' : 'AgentManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.management.service.AgentRegistrationResponse)
+  })
+_sym_db.RegisterMessage(AgentRegistrationResponse)
+
+SynchronizeAgentDBRequest = _reflection.GeneratedProtocolMessageType('SynchronizeAgentDBRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SYNCHRONIZEAGENTDBREQUEST,
+  '__module__' : 'AgentManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.management.service.SynchronizeAgentDBRequest)
+  })
+_sym_db.RegisterMessage(SynchronizeAgentDBRequest)
+
+
+DESCRIPTOR._options = None
+
+_AGENTMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='AgentManagementService',
+  full_name='org.apache.custos.agent.management.service.AgentManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=445,
+  serialized_end=3097,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='enableAgents',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.enableAgents',
+    index=0,
+    containing_service=None,
+    input_type=IamAdminService__pb2._AGENTCLIENTMETADATA,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002!\"\037/agent-management/v1.0.0/enable',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='configureAgentClient',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.configureAgentClient',
+    index=1,
+    containing_service=None,
+    input_type=IamAdminService__pb2._AGENTCLIENTMETADATA,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\",/agent-management/v1.0.0/token/configuration',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToClient',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.addRolesToClient',
+    index=2,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002 \"\036/agent-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='registerAndEnableAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.registerAndEnableAgent',
+    index=3,
+    containing_service=None,
+    input_type=IamAdminService__pb2._REGISTERUSERREQUEST,
+    output_type=_AGENTREGISTRATIONRESPONSE,
+    serialized_options=b'\202\323\344\223\002&\"\036/agent-management/v1.0.0/agent:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.getAgent',
+    index=4,
+    containing_service=None,
+    input_type=_AGENTSEARCHREQUEST,
+    output_type=IamAdminService__pb2._AGENT,
+    serialized_options=b'\202\323\344\223\002%\022#/agent-management/v1.0.0/agent/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteAgent',
+    index=5,
+    containing_service=None,
+    input_type=_AGENTSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002%*#/agent-management/v1.0.0/agent/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='disableAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.disableAgent',
+    index=6,
+    containing_service=None,
+    input_type=_AGENTSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0022\"0/agent-management/v1.0.0/agent/deactivation/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.enableAgent',
+    index=7,
+    containing_service=None,
+    input_type=_AGENTSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0020\"./agent-management/v1.0.0/agent/activation/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addAgentAttributes',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.addAgentAttributes',
+    index=8,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDUSERATTRIBUTESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002+\")/agent-management/v1.0.0/agent/attributes',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteAgentAttributes',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteAgentAttributes',
+    index=9,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEUSERATTRIBUTEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002+*)/agent-management/v1.0.0/agent/attributes',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.addRolesToAgent',
+    index=10,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDUSERROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002&\"$/agent-management/v1.0.0/agent/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteRolesFromAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteRolesFromAgent',
+    index=11,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEUSERROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002&*$/agent-management/v1.0.0/agent/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addProtocolMapper',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.addProtocolMapper',
+    index=12,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDPROTOCOLMAPPERREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002*\"(/agent-management/v1.0.0/protocol/mapper',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllAgents',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.getAllAgents',
+    index=13,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GETALLRESOURCES,
+    output_type=IamAdminService__pb2._GETALLRESOURCESRESPONSE,
+    serialized_options=b'\202\323\344\223\002!\022\037/agent-management/v1.0.0/agents',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='synchronizeAgentDBs',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.synchronizeAgentDBs',
+    index=14,
+    containing_service=None,
+    input_type=_SYNCHRONIZEAGENTDBREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002)\"\'/agent-management/v1.0.0/db/synchronize',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_AGENTMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['AgentManagementService'] = _AGENTMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2_grpc.py
new file mode 100644
index 0000000..b96cff3
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/AgentManagementService_pb2_grpc.py
@@ -0,0 +1,546 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.integration.AgentManagementService_pb2 as AgentManagementService__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+
+
+class AgentManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.enableAgents = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/enableAgents',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.configureAgentClient = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/configureAgentClient',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToClient = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToClient',
+                request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.registerAndEnableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/registerAndEnableAgent',
+                request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+                response_deserializer=AgentManagementService__pb2.AgentRegistrationResponse.FromString,
+                )
+        self.getAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/getAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.Agent.FromString,
+                )
+        self.deleteAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.disableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/disableAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/enableAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addAgentAttributes',
+                request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgentAttributes',
+                request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToAgent',
+                request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteRolesFromAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteRolesFromAgent',
+                request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addProtocolMapper = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addProtocolMapper',
+                request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getAllAgents = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/getAllAgents',
+                request_serializer=IamAdminService__pb2.GetAllResources.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GetAllResourcesResponse.FromString,
+                )
+        self.synchronizeAgentDBs = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/synchronizeAgentDBs',
+                request_serializer=AgentManagementService__pb2.SynchronizeAgentDBRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+
+
+class AgentManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def enableAgents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def configureAgentClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def registerAndEnableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def disableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteRolesFromAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addProtocolMapper(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllAgents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def synchronizeAgentDBs(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_AgentManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'enableAgents': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableAgents,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'configureAgentClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureAgentClient,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToClient,
+                    request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'registerAndEnableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerAndEnableAgent,
+                    request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
+                    response_serializer=AgentManagementService__pb2.AgentRegistrationResponse.SerializeToString,
+            ),
+            'getAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.Agent.SerializeToString,
+            ),
+            'deleteAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'disableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.disableAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.addAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToAgent,
+                    request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteRolesFromAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRolesFromAgent,
+                    request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
+                    servicer.addProtocolMapper,
+                    request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAllAgents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllAgents,
+                    request_deserializer=IamAdminService__pb2.GetAllResources.FromString,
+                    response_serializer=IamAdminService__pb2.GetAllResourcesResponse.SerializeToString,
+            ),
+            'synchronizeAgentDBs': grpc.unary_unary_rpc_method_handler(
+                    servicer.synchronizeAgentDBs,
+                    request_deserializer=AgentManagementService__pb2.SynchronizeAgentDBRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.agent.management.service.AgentManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class AgentManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def enableAgents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/enableAgents',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureAgentClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/configureAgentClient',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToClient',
+            IamAdminService__pb2.AddRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerAndEnableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/registerAndEnableAgent',
+            IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+            AgentManagementService__pb2.AgentRegistrationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/getAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/disableAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/enableAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addAgentAttributes',
+            IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgentAttributes',
+            IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToAgent',
+            IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRolesFromAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteRolesFromAgent',
+            IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addProtocolMapper(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addProtocolMapper',
+            IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllAgents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/getAllAgents',
+            IamAdminService__pb2.GetAllResources.SerializeToString,
+            IamAdminService__pb2.GetAllResourcesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def synchronizeAgentDBs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/synchronizeAgentDBs',
+            AgentManagementService__pb2.SynchronizeAgentDBRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2.py
new file mode 100644
index 0000000..4102d87
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2.py
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ClusterManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ClusterManagementService.proto',
+  package='org.apache.custos.cluster.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1e\x43lusterManagementService.proto\x12,org.apache.custos.cluster.management.service\"D\n\x1bGetServerCertificateRequest\x12\x12\n\nsecretName\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\"3\n\x1cGetServerCertificateResponse\x12\x13\n\x0b\x63\x65rtificate\x18\x01 \x01(\t2\xd0\x01\n\x18\x43lusterManagementService\x12\xb3\x01\n\x1agetCustosServerCertificate\x12I.org.apache.custos.cluster.management.service.GetServerCertificateRequest\x1aJ.org.apache.custos.cluster.management.service.GetServerCertificateResponseB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+
+
+
+_GETSERVERCERTIFICATEREQUEST = _descriptor.Descriptor(
+  name='GetServerCertificateRequest',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='secretName', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.secretName', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='namespace', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.namespace', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=80,
+  serialized_end=148,
+)
+
+
+_GETSERVERCERTIFICATERESPONSE = _descriptor.Descriptor(
+  name='GetServerCertificateResponse',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='certificate', full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse.certificate', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=150,
+  serialized_end=201,
+)
+
+DESCRIPTOR.message_types_by_name['GetServerCertificateRequest'] = _GETSERVERCERTIFICATEREQUEST
+DESCRIPTOR.message_types_by_name['GetServerCertificateResponse'] = _GETSERVERCERTIFICATERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetServerCertificateRequest = _reflection.GeneratedProtocolMessageType('GetServerCertificateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATEREQUEST,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateRequest)
+  })
+_sym_db.RegisterMessage(GetServerCertificateRequest)
+
+GetServerCertificateResponse = _reflection.GeneratedProtocolMessageType('GetServerCertificateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATERESPONSE,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateResponse)
+  })
+_sym_db.RegisterMessage(GetServerCertificateResponse)
+
+
+DESCRIPTOR._options = None
+
+_CLUSTERMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='ClusterManagementService',
+  full_name='org.apache.custos.cluster.management.service.ClusterManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=204,
+  serialized_end=412,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getCustosServerCertificate',
+    full_name='org.apache.custos.cluster.management.service.ClusterManagementService.getCustosServerCertificate',
+    index=0,
+    containing_service=None,
+    input_type=_GETSERVERCERTIFICATEREQUEST,
+    output_type=_GETSERVERCERTIFICATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CLUSTERMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['ClusterManagementService'] = _CLUSTERMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2_grpc.py
new file mode 100644
index 0000000..8eb469e
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ClusterManagementService_pb2_grpc.py
@@ -0,0 +1,83 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.integration.ClusterManagementService_pb2 as ClusterManagementService__pb2
+
+
+class ClusterManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getCustosServerCertificate = channel.unary_unary(
+                '/org.apache.custos.cluster.management.service.ClusterManagementService/getCustosServerCertificate',
+                request_serializer=ClusterManagementService__pb2.GetServerCertificateRequest.SerializeToString,
+                response_deserializer=ClusterManagementService__pb2.GetServerCertificateResponse.FromString,
+                )
+
+
+class ClusterManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getCustosServerCertificate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ClusterManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getCustosServerCertificate': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosServerCertificate,
+                    request_deserializer=ClusterManagementService__pb2.GetServerCertificateRequest.FromString,
+                    response_serializer=ClusterManagementService__pb2.GetServerCertificateResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.cluster.management.service.ClusterManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ClusterManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getCustosServerCertificate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.cluster.management.service.ClusterManagementService/getCustosServerCertificate',
+            ClusterManagementService__pb2.GetServerCertificateRequest.SerializeToString,
+            ClusterManagementService__pb2.GetServerCertificateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2.py
new file mode 100644
index 0000000..ad7c291
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2.py
@@ -0,0 +1,309 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: GroupManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='GroupManagementService.proto',
+  package='org.apache.custos.group.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1cGroupManagementService.proto\x12*org.apache.custos.group.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto2\xcb\"\n\x16GroupManagementService\x12\xa5\x01\n\x14\x63reateKeycloakGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"0\x82\xd3\xe4\x93\x02*\"(/group-management/v1.0.0/keycloak/groups\x12\xac\x01\n\x13updateKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"4\x82\xd3\xe4\x93\x02.\x1a,/group-management/v1.0.0/keycloak/group/{id}\x12\xa8\x01\n\x13\x64\x65leteKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\"4\x82\xd3\xe4\x93\x02.*,/group-management/v1.0.0/keycloak/group/{id}\x12\xa5\x01\n\x11\x66indKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"/\x82\xd3\xe4\x93\x02)\x12\'/group-management/v1.0.0/keycloak/group\x12\xa4\x01\n\x14getAllKeycloakGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"0\x82\xd3\xe4\x93\x02*\x12(/group-management/v1.0.0/keycloak/groups\x12\xc1\x01\n\x16\x61\x64\x64UserToKeycloakGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"?\x82\xd3\xe4\x93\x02\x39\"7/group-management/v1.0.0/keycloak/user/group/membership\x12\xc6\x01\n\x1bremoveUserFromKeycloakGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"?\x82\xd3\xe4\x93\x02\x39*7/group-management/v1.0.0/keycloak/user/group/membership\x12\x9a\x01\n\x0b\x63reateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"&\x82\xd3\xe4\x93\x02 \"\x1e/group-management/v1.0.0/group\x12\x9f\x01\n\x0bupdateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"+\x82\xd3\xe4\x93\x02%\x1a#/group-management/v1.0.0/group/{id}\x12\xa0\x01\n\x0b\x64\x65leteGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a..org.apache.custos.user.profile.service.Status\"+\x82\xd3\xe4\x93\x02%*#/group-management/v1.0.0/group/{id}\x12\x98\x01\n\tfindGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"&\x82\xd3\xe4\x93\x02 \x12\x1e/group-management/v1.0.0/group\x12\xab\x01\n\x0cgetAllGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/group-management/v1.0.0/groups\x12\xb1\x01\n\x0e\x61\x64\x64UserToGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30\"./group-management/v1.0.0/user/group/membership\x12\xb6\x01\n\x13removeUserFromGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30*./group-management/v1.0.0/user/group/membership\x12\xbf\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\"1\x82\xd3\xe4\x93\x02+\")/group-management/v1.0.0/group/membership\x12\xc4\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\"1\x82\xd3\xe4\x93\x02+*)/group-management/v1.0.0/group/membership\x12\xc7\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//group-management/v1.0.0/user/group/memberships\x12\xc4\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"3\x82\xd3\xe4\x93\x02-\x12+/group-management/v1.0.0/groups/memberships\x12\xcb\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/group-management/v1.0.0/user/group/memberships/child\x12\xc2\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/group-management/v1.0.0/groups/memberships/child\x12\xbb\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30\x1a./group-management/v1.0.0/user/group/membership\x12\xa8\x01\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"2\x82\xd3\xe4\x93\x02,\x12*/group-management/v1.0.0/user/group/access\x12\xcd\x01\n\x16\x61\x64\x64GroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\";\x82\xd3\xe4\x93\x02\x35\"3/group-management/v1.0.0/user/group/membership/type\x12\xd4\x01\n\x1dremoveUserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\";\x82\xd3\xe4\x93\x02\x35*3/group-management/v1.0.0/user/group/membership/typeB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,UserProfileService__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+
+_GROUPMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='GroupManagementService',
+  full_name='org.apache.custos.group.management.service.GroupManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=156,
+  serialized_end=4583,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createKeycloakGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.createKeycloakGroups',
+    index=0,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPSREQUEST,
+    output_type=IamAdminService__pb2._GROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\002*\"(/group-management/v1.0.0/keycloak/groups',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.updateKeycloakGroup',
+    index=1,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002.\032,/group-management/v1.0.0/keycloak/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.deleteKeycloakGroup',
+    index=2,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.*,/group-management/v1.0.0/keycloak/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.findKeycloakGroup',
+    index=3,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002)\022\'/group-management/v1.0.0/keycloak/group',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllKeycloakGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllKeycloakGroups',
+    index=4,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\002*\022(/group-management/v1.0.0/keycloak/groups',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserToKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addUserToKeycloakGroup',
+    index=5,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0029\"7/group-management/v1.0.0/keycloak/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserFromKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserFromKeycloakGroup',
+    index=6,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0029*7/group-management/v1.0.0/keycloak/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.createGroup',
+    index=7,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
+    serialized_options=b'\202\323\344\223\002 \"\036/group-management/v1.0.0/group',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.updateGroup',
+    index=8,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
+    serialized_options=b'\202\323\344\223\002%\032#/group-management/v1.0.0/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.deleteGroup',
+    index=9,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002%*#/group-management/v1.0.0/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.findGroup',
+    index=10,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
+    serialized_options=b'\202\323\344\223\002 \022\036/group-management/v1.0.0/group',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllGroups',
+    index=11,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\002!\022\037/group-management/v1.0.0/groups',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserToGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addUserToGroup',
+    index=12,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0020\"./group-management/v1.0.0/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserFromGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserFromGroup',
+    index=13,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0020*./group-management/v1.0.0/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addChildGroupToParentGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addChildGroupToParentGroup',
+    index=14,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPTOGROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002+\")/group-management/v1.0.0/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeChildGroupFromParentGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeChildGroupFromParentGroup',
+    index=15,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPTOGROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002+*)/group-management/v1.0.0/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllGroupsOfUser',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllGroupsOfUser',
+    index=16,
+    containing_service=None,
+    input_type=UserProfileService__pb2._USERPROFILEREQUEST,
+    output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\0021\022//group-management/v1.0.0/user/group/memberships',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllParentGroupsOfGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllParentGroupsOfGroup',
+    index=17,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\002-\022+/group-management/v1.0.0/groups/memberships',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllChildUsers',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllChildUsers',
+    index=18,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GETALLUSERPROFILESRESPONSE,
+    serialized_options=b'\202\323\344\223\0027\0225/group-management/v1.0.0/user/group/memberships/child',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllChildGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllChildGroups',
+    index=19,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\0023\0221/group-management/v1.0.0/groups/memberships/child',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='changeUserMembershipType',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.changeUserMembershipType',
+    index=20,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0020\032./group-management/v1.0.0/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='hasAccess',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.hasAccess',
+    index=21,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002,\022*/group-management/v1.0.0/user/group/access',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addGroupMembershipType',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addGroupMembershipType',
+    index=22,
+    containing_service=None,
+    input_type=UserProfileService__pb2._USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0025\"3/group-management/v1.0.0/user/group/membership/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserGroupMembershipType',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserGroupMembershipType',
+    index=23,
+    containing_service=None,
+    input_type=UserProfileService__pb2._USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0025*3/group-management/v1.0.0/user/group/membership/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_GROUPMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['GroupManagementService'] = _GROUPMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2_grpc.py
new file mode 100644
index 0000000..f3b7ead
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/GroupManagementService_pb2_grpc.py
@@ -0,0 +1,843 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
+
+
+class GroupManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createKeycloakGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/createKeycloakGroups',
+                request_serializer=IamAdminService__pb2.GroupsRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
+                )
+        self.updateKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/updateKeycloakGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
+                )
+        self.deleteKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/deleteKeycloakGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.findKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/findKeycloakGroup',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
+                )
+        self.getAllKeycloakGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllKeycloakGroups',
+                request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
+                )
+        self.addUserToKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addUserToKeycloakGroup',
+                request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.removeUserFromKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromKeycloakGroup',
+                request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.createGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/createGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.updateGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/updateGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.deleteGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/deleteGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.findGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/findGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.getAllGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllGroups',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.addUserToGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addUserToGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserFromGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.addChildGroupToParentGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addChildGroupToParentGroup',
+                request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeChildGroupFromParentGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeChildGroupFromParentGroup',
+                request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.getAllGroupsOfUser = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllGroupsOfUser',
+                request_serializer=UserProfileService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.getAllParentGroupsOfGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllParentGroupsOfGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.getAllChildUsers = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllChildUsers',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+                )
+        self.getAllChildGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllChildGroups',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.changeUserMembershipType = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/changeUserMembershipType',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.hasAccess = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/hasAccess',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.addGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+
+
+class GroupManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createKeycloakGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllKeycloakGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserToKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserFromKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserToGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserFromGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addChildGroupToParentGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeChildGroupFromParentGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllGroupsOfUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllParentGroupsOfGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllChildUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllChildGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def changeUserMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def hasAccess(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_GroupManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createKeycloakGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.createKeycloakGroups,
+                    request_deserializer=IamAdminService__pb2.GroupsRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
+            ),
+            'updateKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKeycloakGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
+            ),
+            'deleteKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKeycloakGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'findKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.findKeycloakGroup,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
+            ),
+            'getAllKeycloakGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllKeycloakGroups,
+                    request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
+                    response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
+            ),
+            'addUserToKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToKeycloakGroup,
+                    request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'removeUserFromKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromKeycloakGroup,
+                    request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'createGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.createGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'updateGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'deleteGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'findGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.findGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'getAllGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroups,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'addUserToGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserFromGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'addChildGroupToParentGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addChildGroupToParentGroup,
+                    request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeChildGroupFromParentGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeChildGroupFromParentGroup,
+                    request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'getAllGroupsOfUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroupsOfUser,
+                    request_deserializer=UserProfileService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'getAllParentGroupsOfGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllParentGroupsOfGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'getAllChildUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllChildUsers,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllUserProfilesResponse.SerializeToString,
+            ),
+            'getAllChildGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllChildGroups,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'changeUserMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.changeUserMembershipType,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'hasAccess': grpc.unary_unary_rpc_method_handler(
+                    servicer.hasAccess,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'addGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.addGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.group.management.service.GroupManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class GroupManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createKeycloakGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/createKeycloakGroups',
+            IamAdminService__pb2.GroupsRequest.SerializeToString,
+            IamAdminService__pb2.GroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/updateKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/deleteKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/findKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllKeycloakGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllKeycloakGroups',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserToKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addUserToKeycloakGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserFromKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromKeycloakGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/createGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/updateGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/deleteGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/findGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllGroups',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserToGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addUserToGroup',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserFromGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromGroup',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addChildGroupToParentGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addChildGroupToParentGroup',
+            UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeChildGroupFromParentGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeChildGroupFromParentGroup',
+            UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllGroupsOfUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllGroupsOfUser',
+            UserProfileService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllParentGroupsOfGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllParentGroupsOfGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllChildUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllChildUsers',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllChildGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllChildGroups',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def changeUserMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/changeUserMembershipType',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def hasAccess(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/hasAccess',
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2.py
new file mode 100644
index 0000000..c7104dc
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2.py
@@ -0,0 +1,498 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: IdentityManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
+import custos.server.core.CredentialStoreService_pb2 as CredentialStoreService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='IdentityManagementService.proto',
+  package='org.apache.custos.identity.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1fIdentityManagementService.proto\x12-org.apache.custos.identity.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x15IdentityService.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x19google/protobuf/any.proto\x1a\x1c\x43redentialStoreService.proto\"\x9e\x01\n\x14\x41uthorizationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x15\n\rresponse_type\x18\x05 \x01(\t\x12\r\n\x05scope\x18\x06 \x01(\t\x12\r\n\x05state\x18\x07 \x01(\t\")\n\x15\x41uthorizationResponse\x12\x10\n\x08loginURI\x18\x01 \x01(\t\"x\n\x15GetCredentialsRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12L\n\x0b\x63redentials\x18\x02 \x01(\x0b\x32\x37.org.apache.custos.credential.store.service.Credentials\"\xc5\x01\n\x14GetAgentTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x17\n\x0f\x61gent_client_id\x18\x02 \x01(\t\x12\x1b\n\x13\x61gent_client_secret\x18\x03 \x01(\t\x12\x0f\n\x07\x61gentId\x18\x04 \x01(\t\x12\x15\n\ragentPassword\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\ngrant_type\x18\x07 \x01(\t\x12\x15\n\rrefresh_token\x18\x08 \x01(\t\"k\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x43\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x35.org.apache.custos.identity.service.EndSessionRequest2\xaf\x11\n\x19IdentityManagementService\x12\xaa\x01\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\"0\x82\xd3\xe4\x93\x02*\"(/identity-management/v1.0.0/authenticate\x12\xb6\x01\n\x0fisAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//identity-management/v1.0.0/authenticate/status\x12\x8c\x01\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\"(\x82\xd3\xe4\x93\x02\"\x12 /identity-management/v1.0.0/user\x12\xd3\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\"1\x82\xd3\xe4\x93\x02+\x12)/identity-management/v1.0.0/account/token\x12\xbe\x01\n\x0e\x65ndUserSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"5\x82\xd3\xe4\x93\x02/\"\'/identity-management/v1.0.0/user/logout:\x04\x62ody\x12\xc5\x01\n\tauthorize\x12\x43.org.apache.custos.identity.management.service.AuthorizationRequest\x1a\x44.org.apache.custos.identity.management.service.AuthorizationResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/identity-management/v1.0.0/authorize\x12\x80\x01\n\x05token\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\")\x82\xd3\xe4\x93\x02#\"!/identity-management/v1.0.0/token\x12\xc0\x01\n\x0egetCredentials\x12\x44.org.apache.custos.identity.management.service.GetCredentialsRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\"/\x82\xd3\xe4\x93\x02)\x12\'/identity-management/v1.0.0/credentials\x12\xaf\x01\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\"D\x82\xd3\xe4\x93\x02>\x12</identity-management/v1.0.0/.well-known/openid-configuration\x12\xaa\x01\n\rgetAgentToken\x12\x43.org.apache.custos.identity.management.service.GetAgentTokenRequest\x1a\x17.google.protobuf.Struct\";\x82\xd3\xe4\x93\x02\x35\"3/identity-management/v1.0.0/agent/token/{client_id}\x12\xcc\x01\n\x0f\x65ndAgentSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"B\x82\xd3\xe4\x93\x02<\"4/identity-management/v1.0.0/agent/logout/{client_id}:\x04\x62ody\x12\xc9\x01\n\x14isAgentAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\"E\x82\xd3\xe4\x93\x02?\"7/identity-management/v1.0.0/agent/authentication/status:\x04\x62odyB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,IdentityService__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_any__pb2.DESCRIPTOR,CredentialStoreService__pb2.DESCRIPTOR,])
+
+
+
+
+_AUTHORIZATIONREQUEST = _descriptor.Descriptor(
+  name='AuthorizationRequest',
+  full_name='org.apache.custos.identity.management.service.AuthorizationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.client_secret', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uri', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.redirect_uri', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='response_type', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.response_type', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.scope', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.state', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=223,
+  serialized_end=381,
+)
+
+
+_AUTHORIZATIONRESPONSE = _descriptor.Descriptor(
+  name='AuthorizationResponse',
+  full_name='org.apache.custos.identity.management.service.AuthorizationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='loginURI', full_name='org.apache.custos.identity.management.service.AuthorizationResponse.loginURI', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=383,
+  serialized_end=424,
+)
+
+
+_GETCREDENTIALSREQUEST = _descriptor.Descriptor(
+  name='GetCredentialsRequest',
+  full_name='org.apache.custos.identity.management.service.GetCredentialsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.management.service.GetCredentialsRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='credentials', full_name='org.apache.custos.identity.management.service.GetCredentialsRequest.credentials', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=426,
+  serialized_end=546,
+)
+
+
+_GETAGENTTOKENREQUEST = _descriptor.Descriptor(
+  name='GetAgentTokenRequest',
+  full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agent_client_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agent_client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agent_client_secret', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agent_client_secret', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agentId', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agentId', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agentPassword', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agentPassword', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='grant_type', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.grant_type', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refresh_token', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.refresh_token', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=549,
+  serialized_end=746,
+)
+
+
+_ENDSESSIONREQUEST = _descriptor.Descriptor(
+  name='EndSessionRequest',
+  full_name='org.apache.custos.identity.management.service.EndSessionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.identity.management.service.EndSessionRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='body', full_name='org.apache.custos.identity.management.service.EndSessionRequest.body', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=748,
+  serialized_end=855,
+)
+
+_GETCREDENTIALSREQUEST.fields_by_name['credentials'].message_type = CredentialStoreService__pb2._CREDENTIALS
+_ENDSESSIONREQUEST.fields_by_name['body'].message_type = IdentityService__pb2._ENDSESSIONREQUEST
+DESCRIPTOR.message_types_by_name['AuthorizationRequest'] = _AUTHORIZATIONREQUEST
+DESCRIPTOR.message_types_by_name['AuthorizationResponse'] = _AUTHORIZATIONRESPONSE
+DESCRIPTOR.message_types_by_name['GetCredentialsRequest'] = _GETCREDENTIALSREQUEST
+DESCRIPTOR.message_types_by_name['GetAgentTokenRequest'] = _GETAGENTTOKENREQUEST
+DESCRIPTOR.message_types_by_name['EndSessionRequest'] = _ENDSESSIONREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+AuthorizationRequest = _reflection.GeneratedProtocolMessageType('AuthorizationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHORIZATIONREQUEST,
+  '__module__' : 'IdentityManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.management.service.AuthorizationRequest)
+  })
+_sym_db.RegisterMessage(AuthorizationRequest)
+
+AuthorizationResponse = _reflection.GeneratedProtocolMessageType('AuthorizationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHORIZATIONRESPONSE,
+  '__module__' : 'IdentityManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.management.service.AuthorizationResponse)
+  })
+_sym_db.RegisterMessage(AuthorizationResponse)
+
+GetCredentialsRequest = _reflection.GeneratedProtocolMessageType('GetCredentialsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCREDENTIALSREQUEST,
+  '__module__' : 'IdentityManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.management.service.GetCredentialsRequest)
+  })
+_sym_db.RegisterMessage(GetCredentialsRequest)
+
+GetAgentTokenRequest = _reflection.GeneratedProtocolMessageType('GetAgentTokenRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETAGENTTOKENREQUEST,
+  '__module__' : 'IdentityManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.management.service.GetAgentTokenRequest)
+  })
+_sym_db.RegisterMessage(GetAgentTokenRequest)
+
+EndSessionRequest = _reflection.GeneratedProtocolMessageType('EndSessionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENDSESSIONREQUEST,
+  '__module__' : 'IdentityManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.management.service.EndSessionRequest)
+  })
+_sym_db.RegisterMessage(EndSessionRequest)
+
+
+DESCRIPTOR._options = None
+
+_IDENTITYMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='IdentityManagementService',
+  full_name='org.apache.custos.identity.management.service.IdentityManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=858,
+  serialized_end=3081,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='authenticate',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.authenticate',
+    index=0,
+    containing_service=None,
+    input_type=IdentityService__pb2._AUTHENTICATIONREQUEST,
+    output_type=IdentityService__pb2._AUTHTOKEN,
+    serialized_options=b'\202\323\344\223\002*\"(/identity-management/v1.0.0/authenticate',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isAuthenticated',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.isAuthenticated',
+    index=1,
+    containing_service=None,
+    input_type=IdentityService__pb2._AUTHTOKEN,
+    output_type=IdentityService__pb2._ISAUTHENTICATEDRESPONSE,
+    serialized_options=b'\202\323\344\223\0021\022//identity-management/v1.0.0/authenticate/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUser',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.getUser',
+    index=2,
+    containing_service=None,
+    input_type=IdentityService__pb2._AUTHTOKEN,
+    output_type=IdentityService__pb2._USER,
+    serialized_options=b'\202\323\344\223\002\"\022 /identity-management/v1.0.0/user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserManagementServiceAccountAccessToken',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.getUserManagementServiceAccountAccessToken',
+    index=3,
+    containing_service=None,
+    input_type=IdentityService__pb2._GETUSERMANAGEMENTSATOKENREQUEST,
+    output_type=IdentityService__pb2._AUTHTOKEN,
+    serialized_options=b'\202\323\344\223\002+\022)/identity-management/v1.0.0/account/token',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='endUserSession',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.endUserSession',
+    index=4,
+    containing_service=None,
+    input_type=_ENDSESSIONREQUEST,
+    output_type=IdentityService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/\"\'/identity-management/v1.0.0/user/logout:\004body',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='authorize',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.authorize',
+    index=5,
+    containing_service=None,
+    input_type=_AUTHORIZATIONREQUEST,
+    output_type=_AUTHORIZATIONRESPONSE,
+    serialized_options=b'\202\323\344\223\002\'\022%/identity-management/v1.0.0/authorize',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='token',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.token',
+    index=6,
+    containing_service=None,
+    input_type=IdentityService__pb2._GETTOKENREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=b'\202\323\344\223\002#\"!/identity-management/v1.0.0/token',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentials',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.getCredentials',
+    index=7,
+    containing_service=None,
+    input_type=_GETCREDENTIALSREQUEST,
+    output_type=CredentialStoreService__pb2._CREDENTIALS,
+    serialized_options=b'\202\323\344\223\002)\022\'/identity-management/v1.0.0/credentials',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getOIDCConfiguration',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.getOIDCConfiguration',
+    index=8,
+    containing_service=None,
+    input_type=IdentityService__pb2._GETOIDCCONFIGURATION,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=b'\202\323\344\223\002>\022</identity-management/v1.0.0/.well-known/openid-configuration',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAgentToken',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.getAgentToken',
+    index=9,
+    containing_service=None,
+    input_type=_GETAGENTTOKENREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=b'\202\323\344\223\0025\"3/identity-management/v1.0.0/agent/token/{client_id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='endAgentSession',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.endAgentSession',
+    index=10,
+    containing_service=None,
+    input_type=_ENDSESSIONREQUEST,
+    output_type=IdentityService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002<\"4/identity-management/v1.0.0/agent/logout/{client_id}:\004body',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isAgentAuthenticated',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.isAgentAuthenticated',
+    index=11,
+    containing_service=None,
+    input_type=IdentityService__pb2._AUTHTOKEN,
+    output_type=IdentityService__pb2._ISAUTHENTICATEDRESPONSE,
+    serialized_options=b'\202\323\344\223\002?\"7/identity-management/v1.0.0/agent/authentication/status:\004body',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_IDENTITYMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['IdentityManagementService'] = _IDENTITYMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2_grpc.py
new file mode 100644
index 0000000..d570a3d
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/IdentityManagementService_pb2_grpc.py
@@ -0,0 +1,449 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.CredentialStoreService_pb2 as CredentialStoreService__pb2
+import custos.server.integration.IdentityManagementService_pb2 as IdentityManagementService__pb2
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+class IdentityManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.authenticate = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/authenticate',
+                request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.isAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/isAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getUser',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.User.FromString,
+                )
+        self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getUserManagementServiceAccountAccessToken',
+                request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.endUserSession = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/endUserSession',
+                request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
+        self.authorize = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/authorize',
+                request_serializer=IdentityManagementService__pb2.AuthorizationRequest.SerializeToString,
+                response_deserializer=IdentityManagementService__pb2.AuthorizationResponse.FromString,
+                )
+        self.token = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/token',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getCredentials = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getCredentials',
+                request_serializer=IdentityManagementService__pb2.GetCredentialsRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
+                )
+        self.getOIDCConfiguration = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getOIDCConfiguration',
+                request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getAgentToken = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getAgentToken',
+                request_serializer=IdentityManagementService__pb2.GetAgentTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.endAgentSession = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/endAgentSession',
+                request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
+        self.isAgentAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/isAgentAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
+
+
+class IdentityManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def authenticate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserManagementServiceAccountAccessToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def endUserSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def authorize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def token(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOIDCConfiguration(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAgentToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def endAgentSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isAgentAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_IdentityManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'authenticate': grpc.unary_unary_rpc_method_handler(
+                    servicer.authenticate,
+                    request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'isAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.User.SerializeToString,
+            ),
+            'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserManagementServiceAccountAccessToken,
+                    request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'endUserSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endUserSession,
+                    request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+            'authorize': grpc.unary_unary_rpc_method_handler(
+                    servicer.authorize,
+                    request_deserializer=IdentityManagementService__pb2.AuthorizationRequest.FromString,
+                    response_serializer=IdentityManagementService__pb2.AuthorizationResponse.SerializeToString,
+            ),
+            'token': grpc.unary_unary_rpc_method_handler(
+                    servicer.token,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentials,
+                    request_deserializer=IdentityManagementService__pb2.GetCredentialsRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
+            ),
+            'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOIDCConfiguration,
+                    request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getAgentToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgentToken,
+                    request_deserializer=IdentityManagementService__pb2.GetAgentTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'endAgentSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endAgentSession,
+                    request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isAgentAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAgentAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.identity.management.service.IdentityManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class IdentityManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def authenticate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/authenticate',
+            IdentityService__pb2.AuthenticationRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/isAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getUser',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.User.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserManagementServiceAccountAccessToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getUserManagementServiceAccountAccessToken',
+            IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endUserSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/endUserSession',
+            IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def authorize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/authorize',
+            IdentityManagementService__pb2.AuthorizationRequest.SerializeToString,
+            IdentityManagementService__pb2.AuthorizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def token(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/token',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getCredentials',
+            IdentityManagementService__pb2.GetCredentialsRequest.SerializeToString,
+            CredentialStoreService__pb2.Credentials.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOIDCConfiguration(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getOIDCConfiguration',
+            IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgentToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getAgentToken',
+            IdentityManagementService__pb2.GetAgentTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endAgentSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/endAgentSession',
+            IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAgentAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/isAgentAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2.py
new file mode 100644
index 0000000..bb02df8
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: LogManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='LogManagementService.proto',
+  package='org.apache.custos.log.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1aLogManagementService.proto\x12(org.apache.custos.log.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x14LoggingService.proto2\xee\x03\n\x14LogManagementService\x12\x95\x01\n\x0cgetLogEvents\x12\x32.org.apache.custos.logging.service.LogEventRequest\x1a,.org.apache.custos.logging.service.LogEvents\"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/log-management/v1.0.0/logs\x12\xa0\x01\n\x0cisLogEnabled\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/log-management/v1.0.0/status\x12\x9a\x01\n\x06\x65nable\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/log-management/v1.0.0/statusB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,LoggingService__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+
+_LOGMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='LogManagementService',
+  full_name='org.apache.custos.log.management.service.LogManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=184,
+  serialized_end=678,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getLogEvents',
+    full_name='org.apache.custos.log.management.service.LogManagementService.getLogEvents',
+    index=0,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGEVENTREQUEST,
+    output_type=LoggingService__pb2._LOGEVENTS,
+    serialized_options=b'\202\323\344\223\002\035\022\033/log-management/v1.0.0/logs',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isLogEnabled',
+    full_name='org.apache.custos.log.management.service.LogManagementService.isLogEnabled',
+    index=1,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGGINGCONFIGURATIONREQUEST,
+    output_type=LoggingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002\037\022\035/log-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.log.management.service.LogManagementService.enable',
+    index=2,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGGINGCONFIGURATIONREQUEST,
+    output_type=LoggingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002\037\"\035/log-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LOGMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['LogManagementService'] = _LOGMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2_grpc.py
new file mode 100644
index 0000000..640d355
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/LogManagementService_pb2_grpc.py
@@ -0,0 +1,149 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+class LogManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getLogEvents = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/getLogEvents',
+                request_serializer=LoggingService__pb2.LogEventRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.LogEvents.FromString,
+                )
+        self.isLogEnabled = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/isLogEnabled',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/enable',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+
+
+class LogManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getLogEvents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isLogEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_LogManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getLogEvents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getLogEvents,
+                    request_deserializer=LoggingService__pb2.LogEventRequest.FromString,
+                    response_serializer=LoggingService__pb2.LogEvents.SerializeToString,
+            ),
+            'isLogEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isLogEnabled,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.log.management.service.LogManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class LogManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getLogEvents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/getLogEvents',
+            LoggingService__pb2.LogEventRequest.SerializeToString,
+            LoggingService__pb2.LogEvents.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isLogEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/isLogEnabled',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/enable',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2.py
new file mode 100644
index 0000000..728174c
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2.py
@@ -0,0 +1,281 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ResourceSecretManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+import custos.server.core.ResourceSecretService_pb2 as ResourceSecretService__pb2
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ResourceSecretManagementService.proto',
+  package='org.apache.custos.resource.secret.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n%ResourceSecretManagementService.proto\x12\x34org.apache.custos.resource.secret.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1bResourceSecretService.proto\x1a\x15IdentityService.proto2\xe7#\n\x1fResourceSecretManagementService\x12\xb6\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"1\x82\xd3\xe4\x93\x02+\x12)/resource-secret-management/v1.0.0/secret\x12\xb9\x01\n\x0fgetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1a\x37.org.apache.custos.resource.secret.service.KVCredential\"4\x82\xd3\xe4\x93\x02.\x12,/resource-secret-management/v1.0.0/secret/kv\x12\xce\x01\n\x0f\x61\x64\x64KVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.\",/resource-secret-management/v1.0.0/secret/kv\x12\xd1\x01\n\x12updateKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.\x1a,/resource-secret-management/v1.0.0/secret/kv\x12\xd1\x01\n\x12\x64\x65leteKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.*,/resource-secret-management/v1.0.0/secret/kv\x12\x97\x01\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\"?\x82\xd3\xe4\x93\x02\x39\x12\x37/resource-secret-management/v1.0.0/openid-connect/certs\x12\xe4\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/resource-secret-management/v1.0.0/secret/summary\x12\xfa\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\";\x82\xd3\xe4\x93\x02\x35\x12\x33/resource-secret-management/v1.0.0/secret/summaries\x12\xcd\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"5\x82\xd3\xe4\x93\x02/\"-/resource-secret-management/v1.0.0/secret/ssh\x12\xdc\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\":\x82\xd3\xe4\x93\x02\x34\"2/resource-secret-management/v1.0.0/secret/password\x12\xe5\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"=\x82\xd3\xe4\x93\x02\x37\"5/resource-secret-management/v1.0.0/secret/certificate\x12\xd3\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\"5\x82\xd3\xe4\x93\x02/\x12-/resource-secret-management/v1.0.0/secret/ssh\x12\xe2\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\":\x82\xd3\xe4\x93\x02\x34\x12\x32/resource-secret-management/v1.0.0/secret/password\x12\xeb\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/resource-secret-management/v1.0.0/secret/certificate\x12\xea\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/*-/resource-secret-management/v1.0.0/secret/ssh\x12\xef\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\":\x82\xd3\xe4\x93\x02\x34*2/resource-secret-management/v1.0.0/secret/password\x12\xfa\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"=\x82\xd3\xe4\x93\x02\x37*5/resource-secret-management/v1.0.0/secret/certificate\x12\xbd\x01\n\x10getCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1a\x38.org.apache.custos.resource.secret.service.CredentialMap\"5\x82\xd3\xe4\x93\x02/\x12-/resource-secret-management/v1.0.0/secret/map\x12\xcd\x01\n\x10\x61\x64\x64\x43redentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"5\x82\xd3\xe4\x93\x02/\"-/resource-secret-management/v1.0.0/secret/map\x12\xd4\x01\n\x13updateCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/\x1a-/resource-secret-management/v1.0.0/secret/map\x12\xd4\x01\n\x13\x64\x65leteCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/*-/resource-secret-management/v1.0.0/secret/mapB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,ResourceSecretService__pb2.DESCRIPTOR,IdentityService__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+
+_RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='ResourceSecretManagementService',
+  full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=237,
+  serialized_end=4820,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getSecret',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getSecret',
+    index=0,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETSECRETREQUEST,
+    output_type=ResourceSecretService__pb2._SECRETMETADATA,
+    serialized_options=b'\202\323\344\223\002+\022)/resource-secret-management/v1.0.0/secret',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    serialized_options=b'\202\323\344\223\002.\022,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\",/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.updateKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\032,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteKVCredential',
+    index=4,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.*,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getJWKS',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getJWKS',
+    index=5,
+    containing_service=None,
+    input_type=IdentityService__pb2._GETJWKSREQUEST,
+    output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
+    serialized_options=b'\202\323\344\223\0029\0227/resource-secret-management/v1.0.0/openid-connect/certs',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getResourceCredentialSummary',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getResourceCredentialSummary',
+    index=6,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._SECRETMETADATA,
+    serialized_options=b'\202\323\344\223\0023\0221/resource-secret-management/v1.0.0/secret/summary',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllResourceCredentialSummaries',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getAllResourceCredentialSummaries',
+    index=7,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALSUMMARIESREQUEST,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALSUMMARIES,
+    serialized_options=b'\202\323\344\223\0025\0223/resource-secret-management/v1.0.0/secret/summaries',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addSSHCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addSSHCredential',
+    index=8,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._SSHCREDENTIAL,
+    output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=b'\202\323\344\223\002/\"-/resource-secret-management/v1.0.0/secret/ssh',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addPasswordCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addPasswordCredential',
+    index=9,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
+    output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=b'\202\323\344\223\0024\"2/resource-secret-management/v1.0.0/secret/password',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addCertificateCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addCertificateCredential',
+    index=10,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
+    output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=b'\202\323\344\223\0027\"5/resource-secret-management/v1.0.0/secret/certificate',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getSSHCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getSSHCredential',
+    index=11,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._SSHCREDENTIAL,
+    serialized_options=b'\202\323\344\223\002/\022-/resource-secret-management/v1.0.0/secret/ssh',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPasswordCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getPasswordCredential',
+    index=12,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
+    serialized_options=b'\202\323\344\223\0024\0222/resource-secret-management/v1.0.0/secret/password',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCertificateCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getCertificateCredential',
+    index=13,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
+    serialized_options=b'\202\323\344\223\0027\0225/resource-secret-management/v1.0.0/secret/certificate',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteSSHCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteSSHCredential',
+    index=14,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/*-/resource-secret-management/v1.0.0/secret/ssh',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deletePWDCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deletePWDCredential',
+    index=15,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0024*2/resource-secret-management/v1.0.0/secret/password',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCertificateCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteCertificateCredential',
+    index=16,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0027*5/resource-secret-management/v1.0.0/secret/certificate',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getCredentialMap',
+    index=17,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    serialized_options=b'\202\323\344\223\002/\022-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addCredentialMap',
+    index=18,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=b'\202\323\344\223\002/\"-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.updateCredentialMap',
+    index=19,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/\032-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteCredentialMap',
+    index=20,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/*-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_RESOURCESECRETMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['ResourceSecretManagementService'] = _RESOURCESECRETMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
new file mode 100644
index 0000000..984bf4c
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
@@ -0,0 +1,745 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
+import custos.server.core.ResourceSecretService_pb2 as ResourceSecretService__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+class ResourceSecretManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getSecret = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getSecret',
+                request_serializer=ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
+                )
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.addKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.getJWKS = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getJWKS',
+                request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getResourceCredentialSummary = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getResourceCredentialSummary',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
+                )
+        self.getAllResourceCredentialSummaries = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getAllResourceCredentialSummaries',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialSummaries.FromString,
+                )
+        self.addSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addSSHCredential',
+                request_serializer=ResourceSecretService__pb2.SSHCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.addPasswordCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addPasswordCredential',
+                request_serializer=ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.addCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.getSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getSSHCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.SSHCredential.FromString,
+                )
+        self.getPasswordCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getPasswordCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.PasswordCredential.FromString,
+                )
+        self.getCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CertificateCredential.FromString,
+                )
+        self.deleteSSHCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteSSHCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deletePWDCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deletePWDCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCertificateCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCertificateCredential',
+                request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.getCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                )
+        self.addCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.updateCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+
+
+class ResourceSecretManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getSecret(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getJWKS(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getResourceCredentialSummary(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllResourceCredentialSummaries(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addPasswordCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPasswordCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteSSHCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deletePWDCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCertificateCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ResourceSecretManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getSecret': grpc.unary_unary_rpc_method_handler(
+                    servicer.getSecret,
+                    request_deserializer=ResourceSecretService__pb2.GetSecretRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
+            ),
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'addKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'getJWKS': grpc.unary_unary_rpc_method_handler(
+                    servicer.getJWKS,
+                    request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getResourceCredentialSummary': grpc.unary_unary_rpc_method_handler(
+                    servicer.getResourceCredentialSummary,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
+            ),
+            'getAllResourceCredentialSummaries': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllResourceCredentialSummaries,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialSummaries.SerializeToString,
+            ),
+            'addSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.SSHCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'addPasswordCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addPasswordCredential,
+                    request_deserializer=ResourceSecretService__pb2.PasswordCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'addCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.CertificateCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'getSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.SSHCredential.SerializeToString,
+            ),
+            'getPasswordCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPasswordCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+            ),
+            'getCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+            ),
+            'deleteSSHCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteSSHCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deletePWDCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deletePWDCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCertificateCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCertificateCredential,
+                    request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'getCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ),
+            'addCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.addCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'updateCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.resource.secret.management.service.ResourceSecretManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ResourceSecretManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getSecret(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getSecret',
+            ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
+            ResourceSecretService__pb2.SecretMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getJWKS(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getJWKS',
+            IdentityService__pb2.GetJWKSRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getResourceCredentialSummary(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getResourceCredentialSummary',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.SecretMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllResourceCredentialSummaries(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getAllResourceCredentialSummaries',
+            ResourceSecretService__pb2.GetResourceCredentialSummariesRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialSummaries.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addSSHCredential',
+            ResourceSecretService__pb2.SSHCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addPasswordCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addPasswordCredential',
+            ResourceSecretService__pb2.PasswordCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCertificateCredential',
+            ResourceSecretService__pb2.CertificateCredential.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getSSHCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.SSHCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPasswordCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getPasswordCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.PasswordCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCertificateCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.CertificateCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteSSHCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteSSHCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deletePWDCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deletePWDCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCertificateCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCertificateCredential',
+            ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.CredentialMap.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2.py
new file mode 100644
index 0000000..d5dc1f9
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2.py
@@ -0,0 +1,328 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: SharingManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+import custos.server.core.SharingService_pb2 as SharingService__pb2
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='SharingManagementService.proto',
+  package='org.apache.custos.sharing.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1eSharingManagementService.proto\x12,org.apache.custos.sharing.management.service\x1a\x14SharingService.proto\x1a\x1cgoogle/api/annotations.proto2\xe8\"\n\x18SharingManagementService\x12\xa3\x01\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\x1a&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/entity/type\x12\xa4\x01\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/entity/types\x12\xaf\x01\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\"*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\x1a*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,**/sharing-management/v1.0.0/permission/type\x12\xb4\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\"2\x82\xd3\xe4\x93\x02,\x12*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/permission/types\x12\x96\x01\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\"!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\x1a!/sharing-management/v1.0.0/entity\x12\xa2\x01\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/entity/existence\x12\x93\x01\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\")\x82\xd3\xe4\x93\x02#\x12!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#*!/sharing-management/v1.0.0/entity\x12\x9c\x01\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\"+\x82\xd3\xe4\x93\x02%\"#/sharing-management/v1.0.0/entities\x12\xaa\x01\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/users/share\x12\xb9\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/users/share/direct\x12\xac\x01\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/groups/share\x12\xbb\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"6\x82\xd3\xe4\x93\x02\x30\x12./sharing-management/v1.0.0/groups/share/direct\x12\xbb\x01\n\x14getAllDirectSharings\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a?.org.apache.custos.sharing.service.GetAllDirectSharingsResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/share/direct\x12\xa4\x01\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/users/share\x12\xa6\x01\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)\"\'/sharing-management/v1.0.0/groups/share\x12\xac\x01\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/users/share\x12\xae\x01\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)*\'/sharing-management/v1.0.0/groups/share\x12\xa4\x01\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/entity/user/accessB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[SharingService__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+
+_SHARINGMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='SharingManagementService',
+  full_name='org.apache.custos.sharing.management.service.SharingManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=133,
+  serialized_end=4589,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createEntityType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.createEntityType',
+    index=0,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002(\"&/sharing-management/v1.0.0/entity/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateEntityType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.updateEntityType',
+    index=1,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002(\032&/sharing-management/v1.0.0/entity/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteEntityType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.deleteEntityType',
+    index=2,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002(*&/sharing-management/v1.0.0/entity/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntityType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getEntityType',
+    index=3,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYTYPEREQUEST,
+    output_type=SharingService__pb2._ENTITYTYPE,
+    serialized_options=b'\202\323\344\223\002(\022&/sharing-management/v1.0.0/entity/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntityTypes',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getEntityTypes',
+    index=4,
+    containing_service=None,
+    input_type=SharingService__pb2._SEARCHREQUEST,
+    output_type=SharingService__pb2._ENTITYTYPES,
+    serialized_options=b'\202\323\344\223\002)\022\'/sharing-management/v1.0.0/entity/types',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createPermissionType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.createPermissionType',
+    index=5,
+    containing_service=None,
+    input_type=SharingService__pb2._PERMISSIONTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002,\"*/sharing-management/v1.0.0/permission/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updatePermissionType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.updatePermissionType',
+    index=6,
+    containing_service=None,
+    input_type=SharingService__pb2._PERMISSIONTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002,\032*/sharing-management/v1.0.0/permission/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deletePermissionType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.deletePermissionType',
+    index=7,
+    containing_service=None,
+    input_type=SharingService__pb2._PERMISSIONTYPEREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002,**/sharing-management/v1.0.0/permission/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPermissionType',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getPermissionType',
+    index=8,
+    containing_service=None,
+    input_type=SharingService__pb2._PERMISSIONTYPEREQUEST,
+    output_type=SharingService__pb2._PERMISSIONTYPE,
+    serialized_options=b'\202\323\344\223\002,\022*/sharing-management/v1.0.0/permission/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getPermissionTypes',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getPermissionTypes',
+    index=9,
+    containing_service=None,
+    input_type=SharingService__pb2._SEARCHREQUEST,
+    output_type=SharingService__pb2._PERMISSIONTYPES,
+    serialized_options=b'\202\323\344\223\002-\022+/sharing-management/v1.0.0/permission/types',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createEntity',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.createEntity',
+    index=10,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002#\"!/sharing-management/v1.0.0/entity',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateEntity',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.updateEntity',
+    index=11,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002#\032!/sharing-management/v1.0.0/entity',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isEntityExists',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.isEntityExists',
+    index=12,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002-\022+/sharing-management/v1.0.0/entity/existence',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getEntity',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getEntity',
+    index=13,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYREQUEST,
+    output_type=SharingService__pb2._ENTITY,
+    serialized_options=b'\202\323\344\223\002#\022!/sharing-management/v1.0.0/entity',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteEntity',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.deleteEntity',
+    index=14,
+    containing_service=None,
+    input_type=SharingService__pb2._ENTITYREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002#*!/sharing-management/v1.0.0/entity',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='searchEntities',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.searchEntities',
+    index=15,
+    containing_service=None,
+    input_type=SharingService__pb2._SEARCHREQUEST,
+    output_type=SharingService__pb2._ENTITIES,
+    serialized_options=b'\202\323\344\223\002%\"#/sharing-management/v1.0.0/entities',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfSharedUsers',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getListOfSharedUsers',
+    index=16,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._SHAREDOWNERS,
+    serialized_options=b'\202\323\344\223\002(\022&/sharing-management/v1.0.0/users/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfDirectlySharedUsers',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getListOfDirectlySharedUsers',
+    index=17,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._SHAREDOWNERS,
+    serialized_options=b'\202\323\344\223\002/\022-/sharing-management/v1.0.0/users/share/direct',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfSharedGroups',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getListOfSharedGroups',
+    index=18,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._SHAREDOWNERS,
+    serialized_options=b'\202\323\344\223\002)\022\'/sharing-management/v1.0.0/groups/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getListOfDirectlySharedGroups',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getListOfDirectlySharedGroups',
+    index=19,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._SHAREDOWNERS,
+    serialized_options=b'\202\323\344\223\0020\022./sharing-management/v1.0.0/groups/share/direct',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllDirectSharings',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getAllDirectSharings',
+    index=20,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._GETALLDIRECTSHARINGSRESPONSE,
+    serialized_options=b'\202\323\344\223\002)\022\'/sharing-management/v1.0.0/share/direct',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='shareEntityWithUsers',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.shareEntityWithUsers',
+    index=21,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002(\"&/sharing-management/v1.0.0/users/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='shareEntityWithGroups',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.shareEntityWithGroups',
+    index=22,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002)\"\'/sharing-management/v1.0.0/groups/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='revokeEntitySharingFromUsers',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.revokeEntitySharingFromUsers',
+    index=23,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002(*&/sharing-management/v1.0.0/users/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='revokeEntitySharingFromGroups',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.revokeEntitySharingFromGroups',
+    index=24,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002)*\'/sharing-management/v1.0.0/groups/share',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='userHasAccess',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.userHasAccess',
+    index=25,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002/\022-/sharing-management/v1.0.0/entity/user/access',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_SHARINGMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['SharingManagementService'] = _SHARINGMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2_grpc.py
new file mode 100644
index 0000000..12c9167
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/SharingManagementService_pb2_grpc.py
@@ -0,0 +1,908 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.SharingService_pb2 as SharingService__pb2
+
+
+class SharingManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/createEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updateEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/updateEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.deleteEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/deleteEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getEntityType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getEntityType',
+                request_serializer=SharingService__pb2.EntityTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.EntityType.FromString,
+                )
+        self.getEntityTypes = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getEntityTypes',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.EntityTypes.FromString,
+                )
+        self.createPermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/createPermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updatePermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/updatePermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.deletePermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/deletePermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getPermissionType = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getPermissionType',
+                request_serializer=SharingService__pb2.PermissionTypeRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.PermissionType.FromString,
+                )
+        self.getPermissionTypes = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getPermissionTypes',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.PermissionTypes.FromString,
+                )
+        self.createEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/createEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.updateEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/updateEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.isEntityExists = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/isEntityExists',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.getEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Entity.FromString,
+                )
+        self.deleteEntity = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/deleteEntity',
+                request_serializer=SharingService__pb2.EntityRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.searchEntities = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/searchEntities',
+                request_serializer=SharingService__pb2.SearchRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Entities.FromString,
+                )
+        self.getListOfSharedUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfSharedUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfDirectlySharedUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfDirectlySharedUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfSharedGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfSharedGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getListOfDirectlySharedGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfDirectlySharedGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.SharedOwners.FromString,
+                )
+        self.getAllDirectSharings = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getAllDirectSharings',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+                )
+        self.shareEntityWithUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/shareEntityWithUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.shareEntityWithGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/shareEntityWithGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.revokeEntitySharingFromUsers = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/revokeEntitySharingFromUsers',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.revokeEntitySharingFromGroups = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/revokeEntitySharingFromGroups',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+        self.userHasAccess = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/userHasAccess',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.Status.FromString,
+                )
+
+
+class SharingManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntityType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntityTypes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createPermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updatePermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deletePermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPermissionType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getPermissionTypes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isEntityExists(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteEntity(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def searchEntities(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfSharedUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfDirectlySharedUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfSharedGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getListOfDirectlySharedGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllDirectSharings(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def shareEntityWithUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def shareEntityWithGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def revokeEntitySharingFromUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def revokeEntitySharingFromGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def userHasAccess(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_SharingManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.createEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updateEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'deleteEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getEntityType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntityType,
+                    request_deserializer=SharingService__pb2.EntityTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.EntityType.SerializeToString,
+            ),
+            'getEntityTypes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntityTypes,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.EntityTypes.SerializeToString,
+            ),
+            'createPermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.createPermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updatePermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.updatePermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'deletePermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.deletePermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getPermissionType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPermissionType,
+                    request_deserializer=SharingService__pb2.PermissionTypeRequest.FromString,
+                    response_serializer=SharingService__pb2.PermissionType.SerializeToString,
+            ),
+            'getPermissionTypes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getPermissionTypes,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.PermissionTypes.SerializeToString,
+            ),
+            'createEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.createEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'updateEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'isEntityExists': grpc.unary_unary_rpc_method_handler(
+                    servicer.isEntityExists,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'getEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Entity.SerializeToString,
+            ),
+            'deleteEntity': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteEntity,
+                    request_deserializer=SharingService__pb2.EntityRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'searchEntities': grpc.unary_unary_rpc_method_handler(
+                    servicer.searchEntities,
+                    request_deserializer=SharingService__pb2.SearchRequest.FromString,
+                    response_serializer=SharingService__pb2.Entities.SerializeToString,
+            ),
+            'getListOfSharedUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfSharedUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfDirectlySharedUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfDirectlySharedUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfSharedGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfSharedGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getListOfDirectlySharedGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getListOfDirectlySharedGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
+            ),
+            'getAllDirectSharings': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllDirectSharings,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.GetAllDirectSharingsResponse.SerializeToString,
+            ),
+            'shareEntityWithUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.shareEntityWithUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'shareEntityWithGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.shareEntityWithGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'revokeEntitySharingFromUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.revokeEntitySharingFromUsers,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'revokeEntitySharingFromGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.revokeEntitySharingFromGroups,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+            'userHasAccess': grpc.unary_unary_rpc_method_handler(
+                    servicer.userHasAccess,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.sharing.management.service.SharingManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class SharingManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/createEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/updateEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/deleteEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntityType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getEntityType',
+            SharingService__pb2.EntityTypeRequest.SerializeToString,
+            SharingService__pb2.EntityType.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntityTypes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getEntityTypes',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.EntityTypes.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createPermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/createPermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updatePermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/updatePermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deletePermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/deletePermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPermissionType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getPermissionType',
+            SharingService__pb2.PermissionTypeRequest.SerializeToString,
+            SharingService__pb2.PermissionType.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getPermissionTypes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getPermissionTypes',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.PermissionTypes.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/createEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/updateEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isEntityExists(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/isEntityExists',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Entity.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteEntity(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/deleteEntity',
+            SharingService__pb2.EntityRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def searchEntities(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/searchEntities',
+            SharingService__pb2.SearchRequest.SerializeToString,
+            SharingService__pb2.Entities.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfSharedUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfSharedUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfDirectlySharedUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfDirectlySharedUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfSharedGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfSharedGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getListOfDirectlySharedGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getListOfDirectlySharedGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.SharedOwners.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllDirectSharings(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getAllDirectSharings',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def shareEntityWithUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/shareEntityWithUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def shareEntityWithGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/shareEntityWithGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def revokeEntitySharingFromUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/revokeEntitySharingFromUsers',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def revokeEntitySharingFromGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/revokeEntitySharingFromGroups',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def userHasAccess(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/userHasAccess',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2.py
new file mode 100644
index 0000000..398ff4e
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2.py
@@ -0,0 +1,1048 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: TenantManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+import custos.server.core.TenantProfileService_pb2 as TenantProfileService__pb2
+from google.rpc import error_details_pb2 as google_dot_rpc_dot_error__details__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='TenantManagementService.proto',
+  package='org.apache.custos.tenant.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1dTenantManagementService.proto\x12+org.apache.custos.tenant.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1aTenantProfileService.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\x1a$FederatedAuthenticationService.proto\x1a\x16MessagingService.proto\"\xe7\x01\n\x14\x43reateTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x14\n\x0cis_activated\x18\x03 \x01(\x08\x12\x1b\n\x13\x63lient_id_issued_at\x18\x04 \x01(\x01\x12 \n\x18\x63lient_secret_expires_at\x18\x05 \x01(\x01\x12\x1f\n\x17registration_client_uri\x18\x06 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x11 \x01(\t\x12\x0b\n\x03msg\x18\x07 \x01(\t\"\x8f\x05\n\x11GetTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x03 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x04 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x06 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x07 \x03(\t\x12\x15\n\rredirect_uris\x18\x08 \x03(\t\x12\x13\n\x0bgrant_types\x18\t \x03(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\n \x01(\x01\x12\x12\n\nclient_uri\x18\x0b \x01(\t\x12\r\n\x05scope\x18\x0c \x01(\t\x12\x0e\n\x06\x64omain\x18\r \x01(\t\x12\x0f\n\x07\x63omment\x18\x0e \x01(\t\x12\x10\n\x08logo_uri\x18\x0f \x01(\t\x12\x18\n\x10\x61pplication_type\x18\x10 \x01(\t\x12\x10\n\x08jwks_uri\x18\x11 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x12 \x01(\t\x12\x0f\n\x07tos_uri\x18\x13 \x01(\t\x12\x12\n\npolicy_uri\x18\x14 \x01(\t\x12V\n\x04jwks\x18\x15 \x03(\x0b\x32H.org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x16 \x01(\t\x12\x18\n\x10software_version\x18\x17 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x18 \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc9\x01\n\x10GetTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12@\n\x06tenant\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\x12M\n\x0b\x63redentials\x18\x05 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01\"\xca\x01\n\x13UpdateTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xca\x01\n\x13\x44\x65leteTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"*\n\x15GetCredentialsRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"\x86\x01\n\x16GetCredentialsResponse\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\"@\n\x17TenantValidationRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x12\n\nclient_sec\x18\x02 \x01(\t2\x87 \n\x17TenantManagementService\x12\xb4\x01\n\x0c\x63reateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x41.org.apache.custos.tenant.management.service.CreateTenantResponse\"/\x82\xd3\xe4\x93\x02)\"\'/tenant-management/v1.0.0/oauth2/tenant\x12\xad\x01\n\tgetTenant\x12=.org.apache.custos.tenant.management.service.GetTenantRequest\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/oauth2/tenant\x12\xb9\x01\n\x0cupdateTenant\x12@.org.apache.custos.tenant.management.service.UpdateTenantRequest\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\"5\x82\xd3\xe4\x93\x02/\x1a\'/tenant-management/v1.0.0/oauth2/tenant:\x04\x62ody\x12\x99\x01\n\x0c\x64\x65leteTenant\x12@.org.apache.custos.tenant.management.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\"/\x82\xd3\xe4\x93\x02)*\'/tenant-management/v1.0.0/oauth2/tenant\x12\xc3\x01\n\x0evalidateTenant\x12\x44.org.apache.custos.tenant.management.service.TenantValidationRequest\x1a..org.apache.custos.iam.service.OperationStatus\";\x82\xd3\xe4\x93\x02\x35\"3/tenant-management/v1.0.0/tenant/credentials/status\x12\x92\x01\n\x0e\x61\x64\x64TenantRoles\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\"\'\x82\xd3\xe4\x93\x02!\"\x1f/tenant-management/v1.0.0/roles\x12\x92\x01\n\x0egetTenantRoles\x12..org.apache.custos.iam.service.GetRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/tenant-management/v1.0.0/roles\x12\x96\x01\n\ndeleteRole\x12\x30.org.apache.custos.iam.service.DeleteRoleRequest\x1a..org.apache.custos.iam.service.OperationStatus\"&\x82\xd3\xe4\x93\x02 *\x1e/tenant-management/v1.0.0/role\x12\xaf\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/tenant-management/v1.0.0/protocol/mapper\x12\xad\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/events\x12\xb9\x01\n\x0f\x65nableMessaging\x12;.org.apache.custos.messaging.service.MessageEnablingRequest\x1a<.org.apache.custos.messaging.service.MessageEnablingResponse\"+\x82\xd3\xe4\x93\x02%\"#/tenant-management/v1.0.0/messaging\x12\xbd\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/status\x12\xb8\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\")\x82\xd3\xe4\x93\x02#\x12!/tenant-management/v1.0.0/tenants\x12\xc0\x01\n\x0fgetChildTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/child/tenants\x12\xe1\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\":\x82\xd3\xe4\x93\x02\x34\x12\x32/tenant-management/v1.0.0/tenants/{requesterEmail}\x12\xe9\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/tenant-management/v1.0.0/audit/status/{tenantId}\x12\xf3\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/tenant-management/v1.0.0/audit/attributes/{tenantId}\x12\xd4\x01\n\naddToCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\"<\x82\xd3\xe4\x93\x02\x36\"4/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xd9\x01\n\x0fremoveFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\"<\x82\xd3\xe4\x93\x02\x36*4/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xe7\x01\n\x0cgetFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\"<\x82\xd3\xe4\x93\x02\x36\x12\x34/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xe4\x01\n\x0fgetInstitutions\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\"6\x82\xd3\xe4\x93\x02\x30\x12./tenant-management/v1.0.0/institutions/CILogonB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,TenantProfileService__pb2.DESCRIPTOR,google_dot_rpc_dot_error__details__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,FederatedAuthenticationService__pb2.DESCRIPTOR,MessagingService__pb2.DESCRIPTOR,])
+
+
+
+
+_CREATETENANTRESPONSE = _descriptor.Descriptor(
+  name='CreateTenantResponse',
+  full_name='org.apache.custos.tenant.management.service.CreateTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='is_activated', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.is_activated', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id_issued_at', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_id_issued_at', index=3,
+      number=4, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret_expires_at', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_secret_expires_at', index=4,
+      number=5, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='registration_client_uri', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.registration_client_uri', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token_endpoint_auth_method', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.token_endpoint_auth_method', index=6,
+      number=17, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='msg', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.msg', index=7,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=283,
+  serialized_end=514,
+)
+
+
+_GETTENANTRESPONSE_JWKSENTRY = _descriptor.Descriptor(
+  name='JwksEntry',
+  full_name='org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1129,
+  serialized_end=1172,
+)
+
+_GETTENANTRESPONSE = _descriptor.Descriptor(
+  name='GetTenantResponse',
+  full_name='org.apache.custos.tenant.management.service.GetTenantResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='requester_email', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.requester_email', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_first_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_first_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_last_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_last_name', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_email', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_email', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='contacts', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.contacts', index=6,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='redirect_uris', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.redirect_uris', index=7,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='grant_types', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.grant_types', index=8,
+      number=9, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id_issued_at', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_id_issued_at', index=9,
+      number=10, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_uri', index=10,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='scope', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.scope', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='domain', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.domain', index=12,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='comment', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.comment', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.logo_uri', index=14,
+      number=15, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='application_type', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.application_type', index=15,
+      number=16, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='jwks_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.jwks_uri', index=16,
+      number=17, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='example_extension_parameter', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.example_extension_parameter', index=17,
+      number=18, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tos_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.tos_uri', index=18,
+      number=19, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='policy_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.policy_uri', index=19,
+      number=20, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='jwks', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.jwks', index=20,
+      number=21, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='software_id', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.software_id', index=21,
+      number=22, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='software_version', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.software_version', index=22,
+      number=23, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_username', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_username', index=23,
+      number=24, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_GETTENANTRESPONSE_JWKSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=517,
+  serialized_end=1172,
+)
+
+
+_GETTENANTREQUEST = _descriptor.Descriptor(
+  name='GetTenantRequest',
+  full_name='org.apache.custos.tenant.management.service.GetTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.tenant', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='credentials', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.credentials', index=3,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1175,
+  serialized_end=1376,
+)
+
+
+_CREDENTIALS = _descriptor.Descriptor(
+  name='Credentials',
+  full_name='org.apache.custos.tenant.management.service.Credentials',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.iam_client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.iam_client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.ci_logon_client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.ci_logon_client_secret', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_secret', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_id_issued_at', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_id_issued_at', index=6,
+      number=7, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='custos_client_secret_expired_at', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_secret_expired_at', index=7,
+      number=8, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1379,
+  serialized_end=1635,
+)
+
+
+_UPDATETENANTREQUEST = _descriptor.Descriptor(
+  name='UpdateTenantRequest',
+  full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='credentials', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.credentials', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='body', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.body', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1638,
+  serialized_end=1840,
+)
+
+
+_DELETETENANTREQUEST = _descriptor.Descriptor(
+  name='DeleteTenantRequest',
+  full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='credentials', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.credentials', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='body', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.body', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1843,
+  serialized_end=2045,
+)
+
+
+_GETCREDENTIALSREQUEST = _descriptor.Descriptor(
+  name='GetCredentialsRequest',
+  full_name='org.apache.custos.tenant.management.service.GetCredentialsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2047,
+  serialized_end=2089,
+)
+
+
+_GETCREDENTIALSRESPONSE = _descriptor.Descriptor(
+  name='GetCredentialsResponse',
+  full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iam_client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iam_client_secret', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ci_logon_client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ci_logon_client_secret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ci_logon_client_secret', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2092,
+  serialized_end=2226,
+)
+
+
+_TENANTVALIDATIONREQUEST = _descriptor.Descriptor(
+  name='TenantValidationRequest',
+  full_name='org.apache.custos.tenant.management.service.TenantValidationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.TenantValidationRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.tenant.management.service.TenantValidationRequest.client_sec', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2228,
+  serialized_end=2292,
+)
+
+_GETTENANTRESPONSE_JWKSENTRY.containing_type = _GETTENANTRESPONSE
+_GETTENANTRESPONSE.fields_by_name['jwks'].message_type = _GETTENANTRESPONSE_JWKSENTRY
+_GETTENANTREQUEST.fields_by_name['tenant'].message_type = TenantProfileService__pb2._TENANT
+_GETTENANTREQUEST.fields_by_name['credentials'].message_type = _CREDENTIALS
+_UPDATETENANTREQUEST.fields_by_name['credentials'].message_type = _CREDENTIALS
+_UPDATETENANTREQUEST.fields_by_name['body'].message_type = TenantProfileService__pb2._TENANT
+_DELETETENANTREQUEST.fields_by_name['credentials'].message_type = _CREDENTIALS
+_DELETETENANTREQUEST.fields_by_name['body'].message_type = TenantProfileService__pb2._TENANT
+DESCRIPTOR.message_types_by_name['CreateTenantResponse'] = _CREATETENANTRESPONSE
+DESCRIPTOR.message_types_by_name['GetTenantResponse'] = _GETTENANTRESPONSE
+DESCRIPTOR.message_types_by_name['GetTenantRequest'] = _GETTENANTREQUEST
+DESCRIPTOR.message_types_by_name['Credentials'] = _CREDENTIALS
+DESCRIPTOR.message_types_by_name['UpdateTenantRequest'] = _UPDATETENANTREQUEST
+DESCRIPTOR.message_types_by_name['DeleteTenantRequest'] = _DELETETENANTREQUEST
+DESCRIPTOR.message_types_by_name['GetCredentialsRequest'] = _GETCREDENTIALSREQUEST
+DESCRIPTOR.message_types_by_name['GetCredentialsResponse'] = _GETCREDENTIALSRESPONSE
+DESCRIPTOR.message_types_by_name['TenantValidationRequest'] = _TENANTVALIDATIONREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CreateTenantResponse = _reflection.GeneratedProtocolMessageType('CreateTenantResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATETENANTRESPONSE,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.CreateTenantResponse)
+  })
+_sym_db.RegisterMessage(CreateTenantResponse)
+
+GetTenantResponse = _reflection.GeneratedProtocolMessageType('GetTenantResponse', (_message.Message,), {
+
+  'JwksEntry' : _reflection.GeneratedProtocolMessageType('JwksEntry', (_message.Message,), {
+    'DESCRIPTOR' : _GETTENANTRESPONSE_JWKSENTRY,
+    '__module__' : 'TenantManagementService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry)
+    })
+  ,
+  'DESCRIPTOR' : _GETTENANTRESPONSE,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.GetTenantResponse)
+  })
+_sym_db.RegisterMessage(GetTenantResponse)
+_sym_db.RegisterMessage(GetTenantResponse.JwksEntry)
+
+GetTenantRequest = _reflection.GeneratedProtocolMessageType('GetTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETTENANTREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.GetTenantRequest)
+  })
+_sym_db.RegisterMessage(GetTenantRequest)
+
+Credentials = _reflection.GeneratedProtocolMessageType('Credentials', (_message.Message,), {
+  'DESCRIPTOR' : _CREDENTIALS,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.Credentials)
+  })
+_sym_db.RegisterMessage(Credentials)
+
+UpdateTenantRequest = _reflection.GeneratedProtocolMessageType('UpdateTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATETENANTREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.UpdateTenantRequest)
+  })
+_sym_db.RegisterMessage(UpdateTenantRequest)
+
+DeleteTenantRequest = _reflection.GeneratedProtocolMessageType('DeleteTenantRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETETENANTREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.DeleteTenantRequest)
+  })
+_sym_db.RegisterMessage(DeleteTenantRequest)
+
+GetCredentialsRequest = _reflection.GeneratedProtocolMessageType('GetCredentialsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCREDENTIALSREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.GetCredentialsRequest)
+  })
+_sym_db.RegisterMessage(GetCredentialsRequest)
+
+GetCredentialsResponse = _reflection.GeneratedProtocolMessageType('GetCredentialsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCREDENTIALSRESPONSE,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.GetCredentialsResponse)
+  })
+_sym_db.RegisterMessage(GetCredentialsResponse)
+
+TenantValidationRequest = _reflection.GeneratedProtocolMessageType('TenantValidationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TENANTVALIDATIONREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.TenantValidationRequest)
+  })
+_sym_db.RegisterMessage(TenantValidationRequest)
+
+
+DESCRIPTOR._options = None
+_GETTENANTRESPONSE_JWKSENTRY._options = None
+
+_TENANTMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='TenantManagementService',
+  full_name='org.apache.custos.tenant.management.service.TenantManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2295,
+  serialized_end=6398,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='createTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.createTenant',
+    index=0,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._TENANT,
+    output_type=_CREATETENANTRESPONSE,
+    serialized_options=b'\202\323\344\223\002)\"\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenant',
+    index=1,
+    containing_service=None,
+    input_type=_GETTENANTREQUEST,
+    output_type=TenantProfileService__pb2._TENANT,
+    serialized_options=b'\202\323\344\223\002)\022\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.updateTenant',
+    index=2,
+    containing_service=None,
+    input_type=_UPDATETENANTREQUEST,
+    output_type=TenantProfileService__pb2._TENANT,
+    serialized_options=b'\202\323\344\223\002/\032\'/tenant-management/v1.0.0/oauth2/tenant:\004body',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.deleteTenant',
+    index=3,
+    containing_service=None,
+    input_type=_DELETETENANTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=b'\202\323\344\223\002)*\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='validateTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.validateTenant',
+    index=4,
+    containing_service=None,
+    input_type=_TENANTVALIDATIONREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0025\"3/tenant-management/v1.0.0/tenant/credentials/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addTenantRoles',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.addTenantRoles',
+    index=5,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDROLESREQUEST,
+    output_type=IamAdminService__pb2._ALLROLES,
+    serialized_options=b'\202\323\344\223\002!\"\037/tenant-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantRoles',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantRoles',
+    index=6,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GETROLESREQUEST,
+    output_type=IamAdminService__pb2._ALLROLES,
+    serialized_options=b'\202\323\344\223\002!\022\037/tenant-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteRole',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.deleteRole',
+    index=7,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEROLEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002 *\036/tenant-management/v1.0.0/role',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addProtocolMapper',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.addProtocolMapper',
+    index=8,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDPROTOCOLMAPPERREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002+\")/tenant-management/v1.0.0/protocol/mapper',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='configureEventPersistence',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.configureEventPersistence',
+    index=9,
+    containing_service=None,
+    input_type=IamAdminService__pb2._EVENTPERSISTENCEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002\"\" /tenant-management/v1.0.0/events',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableMessaging',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.enableMessaging',
+    index=10,
+    containing_service=None,
+    input_type=MessagingService__pb2._MESSAGEENABLINGREQUEST,
+    output_type=MessagingService__pb2._MESSAGEENABLINGRESPONSE,
+    serialized_options=b'\202\323\344\223\002%\"#/tenant-management/v1.0.0/messaging',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateTenantStatus',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.updateTenantStatus',
+    index=11,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._UPDATESTATUSREQUEST,
+    output_type=TenantProfileService__pb2._UPDATESTATUSRESPONSE,
+    serialized_options=b'\202\323\344\223\002\"\" /tenant-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllTenants',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getAllTenants',
+    index=12,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._GETTENANTSREQUEST,
+    output_type=TenantProfileService__pb2._GETALLTENANTSRESPONSE,
+    serialized_options=b'\202\323\344\223\002#\022!/tenant-management/v1.0.0/tenants',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getChildTenants',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getChildTenants',
+    index=13,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._GETTENANTSREQUEST,
+    output_type=TenantProfileService__pb2._GETALLTENANTSRESPONSE,
+    serialized_options=b'\202\323\344\223\002)\022\'/tenant-management/v1.0.0/child/tenants',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllTenantsForUser',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getAllTenantsForUser',
+    index=14,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._GETALLTENANTSFORUSERREQUEST,
+    output_type=TenantProfileService__pb2._GETALLTENANTSFORUSERRESPONSE,
+    serialized_options=b'\202\323\344\223\0024\0222/tenant-management/v1.0.0/tenants/{requesterEmail}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantStatusUpdateAuditTrail',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantStatusUpdateAuditTrail',
+    index=15,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._GETAUDITTRAILREQUEST,
+    output_type=TenantProfileService__pb2._GETSTATUSUPDATEAUDITTRAILRESPONSE,
+    serialized_options=b'\202\323\344\223\0023\0221/tenant-management/v1.0.0/audit/status/{tenantId}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantAttributeUpdateAuditTrail',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantAttributeUpdateAuditTrail',
+    index=16,
+    containing_service=None,
+    input_type=TenantProfileService__pb2._GETAUDITTRAILREQUEST,
+    output_type=TenantProfileService__pb2._GETATTRIBUTEUPDATEAUDITTRAILRESPONSE,
+    serialized_options=b'\202\323\344\223\0027\0225/tenant-management/v1.0.0/audit/attributes/{tenantId}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addToCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.addToCache',
+    index=17,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0026\"4/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeFromCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.removeFromCache',
+    index=18,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0026*4/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getFromCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getFromCache',
+    index=19,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._GETINSTITUTIONSRESPONSE,
+    serialized_options=b'\202\323\344\223\0026\0224/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getInstitutions',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getInstitutions',
+    index=20,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._GETINSTITUTIONSRESPONSE,
+    serialized_options=b'\202\323\344\223\0020\022./tenant-management/v1.0.0/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_TENANTMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['TenantManagementService'] = _TENANTMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2_grpc.py
new file mode 100644
index 0000000..c08ed15
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/TenantManagementService_pb2_grpc.py
@@ -0,0 +1,748 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
+import custos.server.integration.TenantManagementService_pb2 as TenantManagementService__pb2
+import custos.server.core.TenantProfileService_pb2 as TenantProfileService__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class TenantManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/createTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantManagementService__pb2.CreateTenantResponse.FromString,
+                )
+        self.getTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenant',
+                request_serializer=TenantManagementService__pb2.GetTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.updateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenant',
+                request_serializer=TenantManagementService__pb2.UpdateTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.deleteTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/deleteTenant',
+                request_serializer=TenantManagementService__pb2.DeleteTenantRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.validateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/validateTenant',
+                request_serializer=TenantManagementService__pb2.TenantValidationRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addTenantRoles = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addTenantRoles',
+                request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.getTenantRoles = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantRoles',
+                request_serializer=IamAdminService__pb2.GetRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.deleteRole = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/deleteRole',
+                request_serializer=IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addProtocolMapper = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addProtocolMapper',
+                request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.configureEventPersistence = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/configureEventPersistence',
+                request_serializer=IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableMessaging = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/enableMessaging',
+                request_serializer=MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+                response_deserializer=MessagingService__pb2.MessageEnablingResponse.FromString,
+                )
+        self.updateTenantStatus = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenantStatus',
+                request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
+                )
+        self.getAllTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.getChildTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getChildTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.getAllTenantsForUser = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenantsForUser',
+                request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+                )
+        self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantStatusUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+                )
+        self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantAttributeUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+                )
+        self.addToCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addToCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.removeFromCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/removeFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.getFromCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+        self.getInstitutions = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getInstitutions',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+
+
+class TenantManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def createTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def validateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addTenantRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addProtocolMapper(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def configureEventPersistence(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enableMessaging(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateTenantStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getChildTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllTenantsForUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantStatusUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantAttributeUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addToCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInstitutions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_TenantManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'createTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.createTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantManagementService__pb2.CreateTenantResponse.SerializeToString,
+            ),
+            'getTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenant,
+                    request_deserializer=TenantManagementService__pb2.GetTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'updateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenant,
+                    request_deserializer=TenantManagementService__pb2.UpdateTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'deleteTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteTenant,
+                    request_deserializer=TenantManagementService__pb2.DeleteTenantRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'validateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.validateTenant,
+                    request_deserializer=TenantManagementService__pb2.TenantValidationRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addTenantRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.addTenantRoles,
+                    request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'getTenantRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantRoles,
+                    request_deserializer=IamAdminService__pb2.GetRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'deleteRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRole,
+                    request_deserializer=IamAdminService__pb2.DeleteRoleRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
+                    servicer.addProtocolMapper,
+                    request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'configureEventPersistence': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureEventPersistence,
+                    request_deserializer=IamAdminService__pb2.EventPersistenceRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableMessaging': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableMessaging,
+                    request_deserializer=MessagingService__pb2.MessageEnablingRequest.FromString,
+                    response_serializer=MessagingService__pb2.MessageEnablingResponse.SerializeToString,
+            ),
+            'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenantStatus,
+                    request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
+            ),
+            'getAllTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'getChildTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getChildTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenantsForUser,
+                    request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
+            ),
+            'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantStatusUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantAttributeUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'addToCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.addToCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'removeFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'getFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.getFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+            'getInstitutions': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInstitutions,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.tenant.management.service.TenantManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class TenantManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/createTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantManagementService__pb2.CreateTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenant',
+            TenantManagementService__pb2.GetTenantRequest.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenant',
+            TenantManagementService__pb2.UpdateTenantRequest.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/deleteTenant',
+            TenantManagementService__pb2.DeleteTenantRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def validateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/validateTenant',
+            TenantManagementService__pb2.TenantValidationRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addTenantRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addTenantRoles',
+            IamAdminService__pb2.AddRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantRoles',
+            IamAdminService__pb2.GetRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/deleteRole',
+            IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addProtocolMapper(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addProtocolMapper',
+            IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureEventPersistence(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/configureEventPersistence',
+            IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableMessaging(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/enableMessaging',
+            MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+            MessagingService__pb2.MessageEnablingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenantStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenantStatus',
+            TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+            TenantProfileService__pb2.UpdateStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getChildTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getChildTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenantsForUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenantsForUser',
+            TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantStatusUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantStatusUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantAttributeUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantAttributeUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addToCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addToCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/removeFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInstitutions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getInstitutions',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2.py
new file mode 100644
index 0000000..5afdcfd
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2.py
@@ -0,0 +1,764 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: UserManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='UserManagementService.proto',
+  package='org.apache.custos.user.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1bUserManagementService.proto\x12)org.apache.custos.user.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto\"\xc8\x01\n\x12UserProfileRequest\x12I\n\x0cuser_profile\x18\x01 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x15\n\rclient_secret\x18\x05 \x01(\t\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"q\n\x0eGetUserRequest\x12\x10\n\x08username\x18\x01 \x01(\t\x12M\n\x13user_search_request\x18\x02 \x01(\x0b\x32\x30.org.apache.custos.iam.service.UserSearchRequest\"\xa6\x01\n\x0fGetUsersRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x0e\n\x06search\x18\x06 \x01(\t\x12\x15\n\riam_client_id\x18\x07 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x08 \x01(\t\"\x8e\x01\n\rResetPassword\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x15\n\riam_client_id\x18\x05 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x06 \x01(\t\"k\n\x14ResetPasswordRequest\x12S\n\x11password_metadata\x18\x01 \x01(\x0b\x32\x38.org.apache.custos.user.management.service.ResetPassword\"\xd9\x01\n\x16LinkUserProfileRequest\x12\x18\n\x10\x63urrent_username\x18\x01 \x01(\t\x12\x19\n\x11previous_username\x18\x02 \x01(\t\x12\x1a\n\x12linking_attributes\x18\x03 \x03(\t\x12\x10\n\x08tenantId\x18\x04 \x01(\x03\x12\x15\n\riam_client_id\x18\x05 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x06 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x07 \x01(\t\x12\x14\n\x0cperformed_by\x18\x08 \x01(\t\"@\n\x18SynchronizeUserDBRequest\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t2\xeb\x1f\n\x15UserManagementService\x12\xa3\x01\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\"*\x82\xd3\xe4\x93\x02$\"\x1c/user-management/v1.0.0/user:\x04user\x12\xb1\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\",\x82\xd3\xe4\x93\x02&\"\x1d/user-management/v1.0.0/users:\x05users\x12\xa8\x01\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$\"\"/user-management/v1.0.0/attributes\x12\xad\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/attributes\x12\xa8\x01\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"5\x82\xd3\xe4\x93\x02/\"\'/user-management/v1.0.0/user/activation:\x04user\x12\xab\x01\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"7\x82\xd3\xe4\x93\x02\x31\")/user-management/v1.0.0/user/deactivation:\x04user\x12\xaa\x01\n\x14grantAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"\"/user-management/v1.0.0/user/admin:\x04user\x12\xab\x01\n\x15removeAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02**\"/user-management/v1.0.0/user/admin:\x04user\x12\xa2\x01\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%\"#/user-management/v1.0.0/users/roles\x12\xa9\x01\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\x12./user-management/v1.0.0/user/activation/status\x12\xaa\x01\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\x12)/user-management/v1.0.0/user/availability\x12\x94\x01\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/user-management/v1.0.0/user\x12\x95\x01\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/user-management/v1.0.0/users\x12\xa0\x01\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\"-\x82\xd3\xe4\x93\x02\'\x1a%/user-management/v1.0.0/user/password\x12\x9a\x01\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\x1c/user-management/v1.0.0/user:\x04user\x12\xa4\x01\n\x0f\x64\x65leteUserRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/user/roles\x12\xc3\x01\n\x11updateUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\":\x82\xd3\xe4\x93\x02\x34\x1a$/user-management/v1.0.0/user/profile:\x0cuser_profile\x12\xb2\x01\n\x0egetUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&\x12$/user-management/v1.0.0/user/profile\x12\xb5\x01\n\x11\x64\x65leteUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&*$/user-management/v1.0.0/user/profile\x12\xce\x01\n\x1agetAllUserProfilesInTenant\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/user-management/v1.0.0/users/profile\x12\xb9\x01\n\x0flinkUserProfile\x12\x41.org.apache.custos.user.management.service.LinkUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\"3\x82\xd3\xe4\x93\x02-\"+/user-management/v1.0.0/user/profile/mapper\x12\xd8\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\"2\x82\xd3\xe4\x93\x02,\x12*/user-management/v1.0.0/user/profile/audit\x12\xb9\x01\n\x12synchronizeUserDBs\x12\x43.org.apache.custos.user.management.service.SynchronizeUserDBRequest\x1a..org.apache.custos.iam.service.OperationStatus\".\x82\xd3\xe4\x93\x02(\"&/user-management/v1.0.0/db/synchronizeB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,UserProfileService__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
+
+
+
+
+_USERPROFILEREQUEST = _descriptor.Descriptor(
+  name='UserProfileRequest',
+  full_name='org.apache.custos.user.management.service.UserProfileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_profile', full_name='org.apache.custos.user.management.service.UserProfileRequest.user_profile', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.management.service.UserProfileRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.management.service.UserProfileRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.user.management.service.UserProfileRequest.access_token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='org.apache.custos.user.management.service.UserProfileRequest.client_secret', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.user.management.service.UserProfileRequest.performed_by', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=154,
+  serialized_end=354,
+)
+
+
+_GETUSERREQUEST = _descriptor.Descriptor(
+  name='GetUserRequest',
+  full_name='org.apache.custos.user.management.service.GetUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.management.service.GetUserRequest.username', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_search_request', full_name='org.apache.custos.user.management.service.GetUserRequest.user_search_request', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=356,
+  serialized_end=469,
+)
+
+
+_GETUSERSREQUEST = _descriptor.Descriptor(
+  name='GetUsersRequest',
+  full_name='org.apache.custos.user.management.service.GetUsersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.management.service.GetUsersRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='org.apache.custos.user.management.service.GetUsersRequest.email', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.management.service.GetUsersRequest.username', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.user.management.service.GetUsersRequest.offset', index=3,
+      number=4, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.user.management.service.GetUsersRequest.limit', index=4,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='search', full_name='org.apache.custos.user.management.service.GetUsersRequest.search', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.GetUsersRequest.iam_client_id', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.GetUsersRequest.iam_client_secret', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=472,
+  serialized_end=638,
+)
+
+
+_RESETPASSWORD = _descriptor.Descriptor(
+  name='ResetPassword',
+  full_name='org.apache.custos.user.management.service.ResetPassword',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.management.service.ResetPassword.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.user.management.service.ResetPassword.access_token', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.user.management.service.ResetPassword.username', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='password', full_name='org.apache.custos.user.management.service.ResetPassword.password', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.ResetPassword.iam_client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.ResetPassword.iam_client_secret', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=641,
+  serialized_end=783,
+)
+
+
+_RESETPASSWORDREQUEST = _descriptor.Descriptor(
+  name='ResetPasswordRequest',
+  full_name='org.apache.custos.user.management.service.ResetPasswordRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='password_metadata', full_name='org.apache.custos.user.management.service.ResetPasswordRequest.password_metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=785,
+  serialized_end=892,
+)
+
+
+_LINKUSERPROFILEREQUEST = _descriptor.Descriptor(
+  name='LinkUserProfileRequest',
+  full_name='org.apache.custos.user.management.service.LinkUserProfileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='current_username', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.current_username', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='previous_username', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.previous_username', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='linking_attributes', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.linking_attributes', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.tenantId', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iam_client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iam_client_secret', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='access_token', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.access_token', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performed_by', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.performed_by', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=895,
+  serialized_end=1112,
+)
+
+
+_SYNCHRONIZEUSERDBREQUEST = _descriptor.Descriptor(
+  name='SynchronizeUserDBRequest',
+  full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.tenant_id', index=0,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.client_id', index=1,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1114,
+  serialized_end=1178,
+)
+
+_USERPROFILEREQUEST.fields_by_name['user_profile'].message_type = UserProfileService__pb2._USERPROFILE
+_GETUSERREQUEST.fields_by_name['user_search_request'].message_type = IamAdminService__pb2._USERSEARCHREQUEST
+_RESETPASSWORDREQUEST.fields_by_name['password_metadata'].message_type = _RESETPASSWORD
+DESCRIPTOR.message_types_by_name['UserProfileRequest'] = _USERPROFILEREQUEST
+DESCRIPTOR.message_types_by_name['GetUserRequest'] = _GETUSERREQUEST
+DESCRIPTOR.message_types_by_name['GetUsersRequest'] = _GETUSERSREQUEST
+DESCRIPTOR.message_types_by_name['ResetPassword'] = _RESETPASSWORD
+DESCRIPTOR.message_types_by_name['ResetPasswordRequest'] = _RESETPASSWORDREQUEST
+DESCRIPTOR.message_types_by_name['LinkUserProfileRequest'] = _LINKUSERPROFILEREQUEST
+DESCRIPTOR.message_types_by_name['SynchronizeUserDBRequest'] = _SYNCHRONIZEUSERDBREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+UserProfileRequest = _reflection.GeneratedProtocolMessageType('UserProfileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _USERPROFILEREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.UserProfileRequest)
+  })
+_sym_db.RegisterMessage(UserProfileRequest)
+
+GetUserRequest = _reflection.GeneratedProtocolMessageType('GetUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETUSERREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.GetUserRequest)
+  })
+_sym_db.RegisterMessage(GetUserRequest)
+
+GetUsersRequest = _reflection.GeneratedProtocolMessageType('GetUsersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETUSERSREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.GetUsersRequest)
+  })
+_sym_db.RegisterMessage(GetUsersRequest)
+
+ResetPassword = _reflection.GeneratedProtocolMessageType('ResetPassword', (_message.Message,), {
+  'DESCRIPTOR' : _RESETPASSWORD,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.ResetPassword)
+  })
+_sym_db.RegisterMessage(ResetPassword)
+
+ResetPasswordRequest = _reflection.GeneratedProtocolMessageType('ResetPasswordRequest', (_message.Message,), {
+  'DESCRIPTOR' : _RESETPASSWORDREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.ResetPasswordRequest)
+  })
+_sym_db.RegisterMessage(ResetPasswordRequest)
+
+LinkUserProfileRequest = _reflection.GeneratedProtocolMessageType('LinkUserProfileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LINKUSERPROFILEREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.LinkUserProfileRequest)
+  })
+_sym_db.RegisterMessage(LinkUserProfileRequest)
+
+SynchronizeUserDBRequest = _reflection.GeneratedProtocolMessageType('SynchronizeUserDBRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SYNCHRONIZEUSERDBREQUEST,
+  '__module__' : 'UserManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.user.management.service.SynchronizeUserDBRequest)
+  })
+_sym_db.RegisterMessage(SynchronizeUserDBRequest)
+
+
+DESCRIPTOR._options = None
+
+_USERMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='UserManagementService',
+  full_name='org.apache.custos.user.management.service.UserManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1181,
+  serialized_end=5256,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='registerUser',
+    full_name='org.apache.custos.user.management.service.UserManagementService.registerUser',
+    index=0,
+    containing_service=None,
+    input_type=IamAdminService__pb2._REGISTERUSERREQUEST,
+    output_type=IamAdminService__pb2._REGISTERUSERRESPONSE,
+    serialized_options=b'\202\323\344\223\002$\"\034/user-management/v1.0.0/user:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='registerAndEnableUsers',
+    full_name='org.apache.custos.user.management.service.UserManagementService.registerAndEnableUsers',
+    index=1,
+    containing_service=None,
+    input_type=IamAdminService__pb2._REGISTERUSERSREQUEST,
+    output_type=IamAdminService__pb2._REGISTERUSERSRESPONSE,
+    serialized_options=b'\202\323\344\223\002&\"\035/user-management/v1.0.0/users:\005users',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserAttributes',
+    full_name='org.apache.custos.user.management.service.UserManagementService.addUserAttributes',
+    index=2,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDUSERATTRIBUTESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002$\"\"/user-management/v1.0.0/attributes',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUserAttributes',
+    full_name='org.apache.custos.user.management.service.UserManagementService.deleteUserAttributes',
+    index=3,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEUSERATTRIBUTEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002$*\"/user-management/v1.0.0/attributes',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableUser',
+    full_name='org.apache.custos.user.management.service.UserManagementService.enableUser',
+    index=4,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._USERREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002/\"\'/user-management/v1.0.0/user/activation:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='disableUser',
+    full_name='org.apache.custos.user.management.service.UserManagementService.disableUser',
+    index=5,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._USERREPRESENTATION,
+    serialized_options=b'\202\323\344\223\0021\")/user-management/v1.0.0/user/deactivation:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='grantAdminPrivileges',
+    full_name='org.apache.custos.user.management.service.UserManagementService.grantAdminPrivileges',
+    index=6,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002*\"\"/user-management/v1.0.0/user/admin:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeAdminPrivileges',
+    full_name='org.apache.custos.user.management.service.UserManagementService.removeAdminPrivileges',
+    index=7,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002**\"/user-management/v1.0.0/user/admin:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToUsers',
+    full_name='org.apache.custos.user.management.service.UserManagementService.addRolesToUsers',
+    index=8,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDUSERROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002%\"#/user-management/v1.0.0/users/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isUserEnabled',
+    full_name='org.apache.custos.user.management.service.UserManagementService.isUserEnabled',
+    index=9,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0020\022./user-management/v1.0.0/user/activation/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isUsernameAvailable',
+    full_name='org.apache.custos.user.management.service.UserManagementService.isUsernameAvailable',
+    index=10,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002+\022)/user-management/v1.0.0/user/availability',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUser',
+    full_name='org.apache.custos.user.management.service.UserManagementService.getUser',
+    index=11,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._USERREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002\036\022\034/user-management/v1.0.0/user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findUsers',
+    full_name='org.apache.custos.user.management.service.UserManagementService.findUsers',
+    index=12,
+    containing_service=None,
+    input_type=IamAdminService__pb2._FINDUSERSREQUEST,
+    output_type=IamAdminService__pb2._FINDUSERSRESPONSE,
+    serialized_options=b'\202\323\344\223\002\037\022\035/user-management/v1.0.0/users',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='resetPassword',
+    full_name='org.apache.custos.user.management.service.UserManagementService.resetPassword',
+    index=13,
+    containing_service=None,
+    input_type=IamAdminService__pb2._RESETUSERPASSWORD,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002\'\032%/user-management/v1.0.0/user/password',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUser',
+    full_name='org.apache.custos.user.management.service.UserManagementService.deleteUser',
+    index=14,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002$*\034/user-management/v1.0.0/user:\004user',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUserRoles',
+    full_name='org.apache.custos.user.management.service.UserManagementService.deleteUserRoles',
+    index=15,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEUSERROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002$*\"/user-management/v1.0.0/user/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateUserProfile',
+    full_name='org.apache.custos.user.management.service.UserManagementService.updateUserProfile',
+    index=16,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=UserProfileService__pb2._USERPROFILE,
+    serialized_options=b'\202\323\344\223\0024\032$/user-management/v1.0.0/user/profile:\014user_profile',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserProfile',
+    full_name='org.apache.custos.user.management.service.UserManagementService.getUserProfile',
+    index=17,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=UserProfileService__pb2._USERPROFILE,
+    serialized_options=b'\202\323\344\223\002&\022$/user-management/v1.0.0/user/profile',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteUserProfile',
+    full_name='org.apache.custos.user.management.service.UserManagementService.deleteUserProfile',
+    index=18,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=UserProfileService__pb2._USERPROFILE,
+    serialized_options=b'\202\323\344\223\002&*$/user-management/v1.0.0/user/profile',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllUserProfilesInTenant',
+    full_name='org.apache.custos.user.management.service.UserManagementService.getAllUserProfilesInTenant',
+    index=19,
+    containing_service=None,
+    input_type=_USERPROFILEREQUEST,
+    output_type=UserProfileService__pb2._GETALLUSERPROFILESRESPONSE,
+    serialized_options=b'\202\323\344\223\002\'\022%/user-management/v1.0.0/users/profile',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='linkUserProfile',
+    full_name='org.apache.custos.user.management.service.UserManagementService.linkUserProfile',
+    index=20,
+    containing_service=None,
+    input_type=_LINKUSERPROFILEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002-\"+/user-management/v1.0.0/user/profile/mapper',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getUserProfileAuditTrails',
+    full_name='org.apache.custos.user.management.service.UserManagementService.getUserProfileAuditTrails',
+    index=21,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GETUPDATEAUDITTRAILREQUEST,
+    output_type=UserProfileService__pb2._GETUPDATEAUDITTRAILRESPONSE,
+    serialized_options=b'\202\323\344\223\002,\022*/user-management/v1.0.0/user/profile/audit',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='synchronizeUserDBs',
+    full_name='org.apache.custos.user.management.service.UserManagementService.synchronizeUserDBs',
+    index=22,
+    containing_service=None,
+    input_type=_SYNCHRONIZEUSERDBREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002(\"&/user-management/v1.0.0/db/synchronize',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_USERMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['UserManagementService'] = _USERMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2_grpc.py
new file mode 100644
index 0000000..ace57b8
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/UserManagementService_pb2_grpc.py
@@ -0,0 +1,811 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.integration.UserManagementService_pb2 as UserManagementService__pb2
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
+
+
+class UserManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.registerUser = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/registerUser',
+                request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.RegisterUserResponse.FromString,
+                )
+        self.registerAndEnableUsers = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/registerAndEnableUsers',
+                request_serializer=IamAdminService__pb2.RegisterUsersRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.RegisterUsersResponse.FromString,
+                )
+        self.addUserAttributes = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/addUserAttributes',
+                request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteUserAttributes = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/deleteUserAttributes',
+                request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableUser = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/enableUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.disableUser = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/disableUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.grantAdminPrivileges = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/grantAdminPrivileges',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.removeAdminPrivileges = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/removeAdminPrivileges',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToUsers = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/addRolesToUsers',
+                request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.isUserEnabled = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/isUserEnabled',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.isUsernameAvailable = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/isUsernameAvailable',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/getUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.UserRepresentation.FromString,
+                )
+        self.findUsers = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/findUsers',
+                request_serializer=IamAdminService__pb2.FindUsersRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.FindUsersResponse.FromString,
+                )
+        self.resetPassword = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/resetPassword',
+                request_serializer=IamAdminService__pb2.ResetUserPassword.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteUser = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/deleteUser',
+                request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteUserRoles = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/deleteUserRoles',
+                request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.updateUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/updateUserProfile',
+                request_serializer=UserManagementService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.getUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/getUserProfile',
+                request_serializer=UserManagementService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.deleteUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/deleteUserProfile',
+                request_serializer=UserManagementService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.UserProfile.FromString,
+                )
+        self.getAllUserProfilesInTenant = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/getAllUserProfilesInTenant',
+                request_serializer=UserManagementService__pb2.UserProfileRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+                )
+        self.linkUserProfile = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/linkUserProfile',
+                request_serializer=UserManagementService__pb2.LinkUserProfileRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getUserProfileAuditTrails = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/getUserProfileAuditTrails',
+                request_serializer=UserProfileService__pb2.GetUpdateAuditTrailRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetUpdateAuditTrailResponse.FromString,
+                )
+        self.synchronizeUserDBs = channel.unary_unary(
+                '/org.apache.custos.user.management.service.UserManagementService/synchronizeUserDBs',
+                request_serializer=UserManagementService__pb2.SynchronizeUserDBRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+
+
+class UserManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def registerUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def registerAndEnableUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUserAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enableUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def disableUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def grantAdminPrivileges(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeAdminPrivileges(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addRolesToUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isUserEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isUsernameAvailable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findUsers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def resetPassword(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUserRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllUserProfilesInTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def linkUserProfile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getUserProfileAuditTrails(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def synchronizeUserDBs(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_UserManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'registerUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerUser,
+                    request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
+                    response_serializer=IamAdminService__pb2.RegisterUserResponse.SerializeToString,
+            ),
+            'registerAndEnableUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerAndEnableUsers,
+                    request_deserializer=IamAdminService__pb2.RegisterUsersRequest.FromString,
+                    response_serializer=IamAdminService__pb2.RegisterUsersResponse.SerializeToString,
+            ),
+            'addUserAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserAttributes,
+                    request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteUserAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUserAttributes,
+                    request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'disableUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.disableUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'grantAdminPrivileges': grpc.unary_unary_rpc_method_handler(
+                    servicer.grantAdminPrivileges,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'removeAdminPrivileges': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeAdminPrivileges,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToUsers,
+                    request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isUserEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isUserEnabled,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isUsernameAvailable': grpc.unary_unary_rpc_method_handler(
+                    servicer.isUsernameAvailable,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.UserRepresentation.SerializeToString,
+            ),
+            'findUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.findUsers,
+                    request_deserializer=IamAdminService__pb2.FindUsersRequest.FromString,
+                    response_serializer=IamAdminService__pb2.FindUsersResponse.SerializeToString,
+            ),
+            'resetPassword': grpc.unary_unary_rpc_method_handler(
+                    servicer.resetPassword,
+                    request_deserializer=IamAdminService__pb2.ResetUserPassword.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUser,
+                    request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteUserRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUserRoles,
+                    request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'updateUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateUserProfile,
+                    request_deserializer=UserManagementService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'getUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserProfile,
+                    request_deserializer=UserManagementService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'deleteUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteUserProfile,
+                    request_deserializer=UserManagementService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.UserProfile.SerializeToString,
+            ),
+            'getAllUserProfilesInTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllUserProfilesInTenant,
+                    request_deserializer=UserManagementService__pb2.UserProfileRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllUserProfilesResponse.SerializeToString,
+            ),
+            'linkUserProfile': grpc.unary_unary_rpc_method_handler(
+                    servicer.linkUserProfile,
+                    request_deserializer=UserManagementService__pb2.LinkUserProfileRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getUserProfileAuditTrails': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserProfileAuditTrails,
+                    request_deserializer=UserProfileService__pb2.GetUpdateAuditTrailRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'synchronizeUserDBs': grpc.unary_unary_rpc_method_handler(
+                    servicer.synchronizeUserDBs,
+                    request_deserializer=UserManagementService__pb2.SynchronizeUserDBRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.user.management.service.UserManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class UserManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def registerUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/registerUser',
+            IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+            IamAdminService__pb2.RegisterUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerAndEnableUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/registerAndEnableUsers',
+            IamAdminService__pb2.RegisterUsersRequest.SerializeToString,
+            IamAdminService__pb2.RegisterUsersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/addUserAttributes',
+            IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUserAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/deleteUserAttributes',
+            IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/enableUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disableUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/disableUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def grantAdminPrivileges(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/grantAdminPrivileges',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeAdminPrivileges(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/removeAdminPrivileges',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/addRolesToUsers',
+            IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isUserEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/isUserEnabled',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isUsernameAvailable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/isUsernameAvailable',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/getUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.UserRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/findUsers',
+            IamAdminService__pb2.FindUsersRequest.SerializeToString,
+            IamAdminService__pb2.FindUsersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def resetPassword(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/resetPassword',
+            IamAdminService__pb2.ResetUserPassword.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/deleteUser',
+            IamAdminService__pb2.UserSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUserRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/deleteUserRoles',
+            IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/updateUserProfile',
+            UserManagementService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/getUserProfile',
+            UserManagementService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/deleteUserProfile',
+            UserManagementService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.UserProfile.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllUserProfilesInTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/getAllUserProfilesInTenant',
+            UserManagementService__pb2.UserProfileRequest.SerializeToString,
+            UserProfileService__pb2.GetAllUserProfilesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def linkUserProfile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/linkUserProfile',
+            UserManagementService__pb2.LinkUserProfileRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserProfileAuditTrails(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/getUserProfileAuditTrails',
+            UserProfileService__pb2.GetUpdateAuditTrailRequest.SerializeToString,
+            UserProfileService__pb2.GetUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def synchronizeUserDBs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.user.management.service.UserManagementService/synchronizeUserDBs',
+            UserManagementService__pb2.SynchronizeUserDBRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/server/integration/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/__init__.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/__init__.py
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/certificate.pem b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/certificate.pem
new file mode 100644
index 0000000..d100c07
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/certificate.pem
@@ -0,0 +1,58 @@
+-----BEGIN CERTIFICATE-----
+MIIFWzCCBEOgAwIBAgISA6JzYO6nlLujr8KffuM+R1bIMA0GCSqGSIb3DQEBCwUA
+MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
+ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA0MjAxOTExNTBaFw0y
+MDA3MTkxOTExNTBaMBwxGjAYBgNVBAMTEWN1c3Rvcy5zY2lnYXAub3JnMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzez05GzyAp0w5P3PLKSAFUetPdSf
+4UIYt8kVo4gsNHxLCSIvAnFRXTABi8QVlGPCA+yI8mGiIm8Aoushr41YYgqizzda
+VpyK+WmrvTuGmxxNlzQ8qZOSpzFZR/5uwsmrwjoLX09yIBP+aUhSvLLBrR+pvKgW
+ndKqH2MzhEEwqCOYhQApnD0BPkbhJvry8WlqqcIN4LQqMotytY6V0/BuhgSvpFIm
+oABGjhfAN+wZgmRqF4QOg9xVVG2T3g21jkqMjS2aErJ9Hzl8MbMXAU+UWvXvMlm+
+fhU/s0esicMYLvaO8APbEbs4vgKqfdl03gnJnJrfqq/epvUixyHFKcioRQIDAQAB
+o4ICZzCCAmMwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
+BgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRPEWxxAyd3FxCRODo1+FTK
+mtr5wzAfBgNVHSMEGDAWgBSoSmpjBH3duubRObemRWXv86jsoTBvBggrBgEFBQcB
+AQRjMGEwLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3NwLmludC14My5sZXRzZW5jcnlw
+dC5vcmcwLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5sZXRzZW5jcnlw
+dC5vcmcvMBwGA1UdEQQVMBOCEWN1c3Rvcy5zY2lnYXAub3JnMEwGA1UdIARFMEMw
+CAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly9j
+cHMubGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYAsh4F
+zIuizYogTodm+Su5iiUgZ2va+nDnsklTLe+LkF4AAAFxmTfqKwAABAMARzBFAiBy
+fHo+ie26gNq8QImnlDDRmDEddUnW3pC5UPdRGq7negIhAMN/cRVBTbZhtZ5sDQ7t
+/H3etjHgtG65Ns1NdLNiQsbNAHcAb1N2rDHwMRnYmQCkURX/dxUcEdkCwQApBo2y
+CJo32RMAAAFxmTfqYQAABAMASDBGAiEAmYJjetlVIiQPfPjuK7v3+f1E4PQJP9OB
+HO+0GLOlbeoCIQCom/22Rf/YMTk289YU7RSjJi3eD3clmJD+n9iDQiZamDANBgkq
+hkiG9w0BAQsFAAOCAQEAg26fuQ9+As87AYCzAGVW12K7BJ7EScnbABPD6XrMWNuG
+EgRpR9l9cnJNxVFzOwRAsrJmo0NpAsSlIIF5ZwqAVE/wwPDYxyeQfExgzNYzikAR
+buvk7q4lmZAaDkgzRlM6avVwYW5/QGiTVc+bx5qk/Y2Wf0UpdaITzqowOHuzx/OL
+BbhMgxxxZwkx4b1Uwpr2eHbeUF/ohQ1LOHpFNuNnefEQVffu05xIOSfea/2if2aB
+EpLC2oIZpgfPnFe9K8yAt3yXCXu5wgexY2sxnWVo4qkVztp9TUqwdv+EOSkoHYDd
+XLHzDL9sItteNw4Q4a6pl7UcvqucNK5twiidzJLMCQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
+SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
+GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
+q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
+SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
+Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
+a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
+/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
+AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
+CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
+bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
+c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
+VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
+ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
+MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
+Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
+AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
+uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
+wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
+X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
+PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
+KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
+-----END CERTIFICATE-----
diff --git a/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/settings.py b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/settings.py
new file mode 100644
index 0000000..3cea8ba
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/build/lib/custos/transport/settings.py
@@ -0,0 +1,36 @@
+import configparser
+import os
+
+config = configparser.ConfigParser()
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+defaultSettings = os.path.join(BASE_DIR, 'transport', 'settings.ini')
+config.read(defaultSettings)
+cert_path = os.path.join(BASE_DIR, 'transport', 'certificate.pem')
+
+
+class CustosServerClientSettings(object):
+
+    def __init__(self, configuration_file_location=None, custos_host=None,
+                 custos_port=None, custos_client_id=None, custos_client_sec=None):
+        if configuration_file_location is not None:
+            config.read(configuration_file_location)
+        self.CUSTOS_CERT_PATH = cert_path
+
+        if custos_host is not None:
+            self.CUSTOS_SERVER_HOST = custos_host
+        else:
+            self.CUSTOS_SERVER_HOST = config.get('CustosServer', 'SERVER_HOST')
+        if custos_port is not None:
+            self.CUSTOS_SERVER_PORT = custos_port
+        else:
+            self.CUSTOS_SERVER_PORT = config.getint('CustosServer', 'SERVER_SSL_PORT')
+        if custos_client_id is not None:
+            self.CUSTOS_CLIENT_ID = custos_client_id
+        else:
+            self.CUSTOS_CLIENT_ID = config.get('CustosServer', 'CLIENT_ID')
+
+        if custos_client_sec is not None:
+            self.CUSTOS_CLIENT_SEC = custos_client_sec
+        else:
+            self.CUSTOS_CLIENT_SEC = config.get('CustosServer', 'CLIENT_SEC')
diff --git a/custos-client-sdks/custos-python-sdk/custos/clients/agent_management_client.py b/custos-client-sdks/custos-python-sdk/custos/clients/agent_management_client.py
index 3980b49..8bd2dca 100644
--- a/custos-client-sdks/custos-python-sdk/custos/clients/agent_management_client.py
+++ b/custos-client-sdks/custos-python-sdk/custos/clients/agent_management_client.py
@@ -53,8 +53,9 @@
         try:
             token = "Bearer " + token
             metadata = (('authorization', token),)
+            request = AgentClientMetadata()
 
-            return self.agent_stub.enableAgents(metadata=metadata)
+            return self.agent_stub.enableAgents(request, metadata=metadata)
         except Exception:
             logger.exception("Error occurred while enabling agents")
             raise
diff --git a/custos-client-sdks/custos-python-sdk/custos/clients/group_management_client.py b/custos-client-sdks/custos-python-sdk/custos/clients/group_management_client.py
index ae4cf54..b80b051 100644
--- a/custos-client-sdks/custos-python-sdk/custos/clients/group_management_client.py
+++ b/custos-client-sdks/custos-python-sdk/custos/clients/group_management_client.py
@@ -21,10 +21,8 @@
 from custos.transport.settings import CustosServerClientSettings
 
 from custos.server.integration.GroupManagementService_pb2_grpc import GroupManagementServiceStub
-from custos.server.core.IamAdminService_pb2 import GroupRequest, GroupsRequest, UserGroupMappingRequest, \
-    UserAttribute, GroupRepresentation
 
-from custos.server.core.UserProfileService_pb2 import GroupToGroupMembership
+from custos.server.core.UserProfileService_pb2 import GroupToGroupMembership, Group, GroupRequest, GroupMembership
 from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
 
 logger = logging.getLogger(__name__)
@@ -44,7 +42,7 @@
         self.channel = grpc.secure_channel(target=self.target, credentials=self.channel_credentials)
         self.group_stub = GroupManagementServiceStub(self.channel)
 
-    def create_groups(self, token, name, description, owner_id):
+    def create_group(self, token, name, description, owner_id):
         """
         Create groups
         :param owner_id:
@@ -57,14 +55,13 @@
         try:
             token = "Bearer " + token
             metadata = (('authorization', token),)
-            group_list = []
-            rep = GroupRepresentation(name=name, realm_roles=[], client_roles=[],
-                                      sub_groups=[], attributes=[], description=description,
-                                      ownerId=owner_id)
-            group_list.append(rep)
-            request = GroupsRequest(groups=group_list)
+            rep = Group(name=name, realm_roles=[], client_roles=[],
+                        attributes=[], description=description,
+                        owner_id=owner_id)
 
-            return self.group_stub.createGroups(request=request, metadata=metadata)
+            request = GroupRequest(group=rep)
+
+            return self.group_stub.createGroup(request=request, metadata=metadata)
         except Exception:
             logger.exception("Error occurred while creating groups")
             raise
@@ -95,8 +92,7 @@
         try:
             token = "Bearer " + token
             metadata = (('authorization', token),)
-
-            gr = GroupRepresentation(id=group_id, name=group_name)
+            gr = Group(id=group_id, name=group_name)
             request = GroupRequest(id=group_id, group=gr)
             return self.group_stub.findGroup(request=request, metadata=metadata)
         except Exception:
@@ -129,7 +125,7 @@
         try:
             token = "Bearer " + token
             metadata = (('authorization', token),)
-            request = UserGroupMappingRequest(username=username, group_id=group_id, membership_type=membership_type)
+            request = GroupMembership(username=username, group_id=group_id, type=membership_type)
             return self.group_stub.addUserToGroup(request=request, metadata=metadata)
         except Exception:
             logger.exception("Error occurred while adding user to group")
@@ -146,7 +142,7 @@
         try:
             token = "Bearer " + token
             metadata = (('authorization', token),)
-            request = UserGroupMappingRequest(username=username, group_id=group_id)
+            request = GroupMembership(username=username, group_id=group_id)
             return self.group_stub.removeUserFromGroup(request=request, metadata=metadata)
         except Exception:
             logger.exception("Error occurred while removing user from group")
diff --git a/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py b/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
index cf63981..1b41dbc 100644
--- a/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
+++ b/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
@@ -23,8 +23,7 @@
 from custos.server.integration.ResourceSecretManagementService_pb2_grpc import ResourceSecretManagementServiceStub
 from custos.server.core.IdentityService_pb2 import GetJWKSRequest
 from custos.server.core.ResourceSecretService_pb2 import GetSecretRequest, SecretMetadata, ResourceOwnerType, \
-    ResourceSource, \
-    ResourceType, SSHCredential, PasswordCredential, GetResourceCredentialByTokenRequest
+    ResourceSource, KVCredential, ResourceType, SSHCredential, PasswordCredential, GetResourceCredentialByTokenRequest
 from google.protobuf.json_format import MessageToJson
 from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
 
@@ -140,3 +139,57 @@
         except Exception:
             logger.exception("Error occurred while creating password key")
             raise
+
+    def set_KV_credential(self, token, user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.addKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while creating KV credential")
+            raise
+
+    def update_KV_credential(self, token,user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.updateKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while updating KV credential")
+            raise
+
+    def delete_KV_credential(self, token, user_token, client_id, key):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.deleteKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while deleting KV credential")
+            raise
+
+    def get_KV_credential(self, token, user_token, client_id, key):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.getKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while get KV credential")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/custos/clients/utils/certificate_fetching_rest_client.py b/custos-client-sdks/custos-python-sdk/custos/clients/utils/certificate_fetching_rest_client.py
index 247372f..ec58e8a 100644
--- a/custos-client-sdks/custos-python-sdk/custos/clients/utils/certificate_fetching_rest_client.py
+++ b/custos-client-sdks/custos-python-sdk/custos/clients/utils/certificate_fetching_rest_client.py
@@ -29,7 +29,10 @@
 
 logger = logging.getLogger(__name__)
 logger.setLevel(logging.DEBUG)
+import requests
+from requests.packages.urllib3.exceptions import InsecureRequestWarning
 
+requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 
 class CertificateFetchingRestClient(object):
 
@@ -56,15 +59,9 @@
         r = requests.get(url=self.url, params=self.params, headers=self.header, stream=True, timeout=60, verify=False)
         value = r.json()['value']
         path = self.custos_settings.CUSTOS_CERT_PATH
-        f = open(path, "w")
+        f = open(path, "w+")
         f.write(value)
 
-        try:
-            with warnings.catch_warnings():
-                warnings.simplefilter('ignore', InsecureRequestWarning)
-                yield
-        finally:
-            f.close()
 
     def __is_certificate_valid(self):
         if os.path.isfile(self.custos_settings.CUSTOS_CERT_PATH):
diff --git a/custos-client-sdks/custos-python-sdk/custos/samples/resource_secert_management.py b/custos-client-sdks/custos-python-sdk/custos/samples/resource_secert_management.py
new file mode 100644
index 0000000..f2568cb
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/samples/resource_secert_management.py
@@ -0,0 +1,80 @@
+#  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.
+#
+import logging
+from custos.clients.user_management_client import UserManagementClient
+from custos.clients.identity_management_client import IdentityManagementClient
+from custos.clients.super_tenant_management_client import SuperTenantManagementClient
+from custos.clients.resource_secret_management_client import ResourceSecretManagementClient
+from google.protobuf.json_format import MessageToDict
+
+from custos.transport.settings import CustosServerClientSettings
+import custos.clients.utils.utilities as utl
+
+logger = logging.getLogger(__name__)
+
+logger.setLevel(logging.DEBUG)
+# create console handler with a higher log level
+handler = logging.StreamHandler()
+handler.setLevel(logging.DEBUG)
+
+custos_settings = CustosServerClientSettings()
+# load APIServerClient with default configuration
+client = UserManagementClient(custos_settings)
+id_client = IdentityManagementClient(custos_settings)
+resource_secret_client = ResourceSecretManagementClient(custos_settings)
+
+token = utl.get_token(custos_settings)
+
+admin_client = SuperTenantManagementClient(custos_settings)
+
+
+def user_login():
+    response = id_client.token(token=
+                               token,
+                               username="USERNAME",
+                               password="PASSWORD",
+                               grant_type="password")
+    dict_obj = MessageToDict(response)
+    return dict_obj['access_token']
+
+
+def setKVCredential():
+    token = user_login()
+    resp = resource_secret_client.set_KV_credential(token=token, user_token=token,
+                                                    client_id='CHANGE_ME', key='Your key',
+                                                    value='Your Value')
+    print(resp)
+
+
+def getKVCredential():
+    token = user_login()
+    resp = resource_secret_client.get_KV_credential(token=token, user_token=token,
+                                                    client_id='CHANGE_ME', key='Your key')
+    print(resp)
+
+
+def updateKVCredential():
+    token = user_login()
+    resp = resource_secret_client.update_KV_credential(token=token, user_token=token,
+                                                       client_id='CHANGE_ME', key='Your key')
+    print(resp)
+
+
+def deleteKVCredential():
+    token = user_login()
+    resp = resource_secret_client.delete_KV_credential(token=token, user_token=token,
+                                                       client_id='CHANGE_ME', key='Your key')
+    print(resp)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2.py
index 48f05a2..22b462f 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: AgentProfileService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
@@ -18,8 +36,9 @@
   name='AgentProfileService.proto',
   package='org.apache.custos.agent.profile.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x19\x41gentProfileService.proto\x12\'org.apache.custos.agent.profile.service\"\xe3\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x44\n\x06status\x18\x02 \x01(\x0e\x32\x34.org.apache.custos.agent.profile.service.AgentStatus\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x18\n\x10last_modified_at\x18\x04 \x01(\x03\x12\r\n\x05roles\x18\x05 \x03(\t\x12K\n\nattributes\x18\x06 \x03(\x0b\x32\x37.org.apache.custos.agent.profile.service.AgentAttribute\"8\n\x0e\x41gentAttribute\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"_\n\x0c\x41gentRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12=\n\x05\x61gent\x18\x02 \x01(\x0b\x32..org.apache.custos.agent.profile.service.Agent\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08*(\n\x0b\x41gentStatus\x12\x0b\n\x07\x45NABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x32\xf4\x03\n\x13\x41gentProfileService\x12t\n\x0b\x63reateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12t\n\x0bupdateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12~\n\x0b\x64\x65leteAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a\x38.org.apache.custos.agent.profile.service.OperationStatus\x12q\n\x08getAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.AgentB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x19\x41gentProfileService.proto\x12\'org.apache.custos.agent.profile.service\"\xff\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x44\n\x06status\x18\x02 \x01(\x0e\x32\x34.org.apache.custos.agent.profile.service.AgentStatus\x12\x12\n\ncreated_at\x18\x03 \x01(\x03\x12\x18\n\x10last_modified_at\x18\x04 \x01(\x03\x12\r\n\x05roles\x18\x05 \x03(\t\x12K\n\nattributes\x18\x06 \x03(\x0b\x32\x37.org.apache.custos.agent.profile.service.AgentAttribute\x12\x1a\n\x12\x61gent_client_roles\x18\x08 \x03(\t\"8\n\x0e\x41gentAttribute\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"`\n\x0c\x41gentRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12=\n\x05\x61gent\x18\x02 \x01(\x0b\x32..org.apache.custos.agent.profile.service.Agent\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08*(\n\x0b\x41gentStatus\x12\x0b\n\x07\x45NABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x32\xf4\x03\n\x13\x41gentProfileService\x12t\n\x0b\x63reateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12t\n\x0bupdateAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.Agent\x12~\n\x0b\x64\x65leteAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a\x38.org.apache.custos.agent.profile.service.OperationStatus\x12q\n\x08getAgent\x12\x35.org.apache.custos.agent.profile.service.AgentRequest\x1a..org.apache.custos.agent.profile.service.AgentB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _AGENTSTATUS = _descriptor.EnumDescriptor(
@@ -27,20 +46,23 @@
   full_name='org.apache.custos.agent.profile.service.AgentStatus',
   filename=None,
   file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
   values=[
     _descriptor.EnumValueDescriptor(
       name='ENABLED', index=0, number=0,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='DISABLED', index=1, number=1,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=490,
-  serialized_end=530,
+  serialized_start=519,
+  serialized_end=559,
 )
 _sym_db.RegisterEnumDescriptor(_AGENTSTATUS)
 
@@ -56,6 +78,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.agent.profile.service.Agent.id', index=0,
@@ -63,42 +86,49 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.agent.profile.service.Agent.status', index=1,
       number=2, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='created_at', full_name='org.apache.custos.agent.profile.service.Agent.created_at', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='last_modified_at', full_name='org.apache.custos.agent.profile.service.Agent.last_modified_at', index=3,
       number=4, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='roles', full_name='org.apache.custos.agent.profile.service.Agent.roles', index=4,
       number=5, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='attributes', full_name='org.apache.custos.agent.profile.service.Agent.attributes', index=5,
       number=6, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='agent_client_roles', full_name='org.apache.custos.agent.profile.service.Agent.agent_client_roles', index=6,
+      number=8, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -112,7 +142,7 @@
   oneofs=[
   ],
   serialized_start=71,
-  serialized_end=298,
+  serialized_end=326,
 )
 
 
@@ -122,6 +152,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.agent.profile.service.AgentAttribute.id', index=0,
@@ -129,21 +160,21 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='key', full_name='org.apache.custos.agent.profile.service.AgentAttribute.key', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='value', full_name='org.apache.custos.agent.profile.service.AgentAttribute.value', index=2,
       number=3, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -156,8 +187,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=300,
-  serialized_end=356,
+  serialized_start=328,
+  serialized_end=384,
 )
 
 
@@ -167,21 +198,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.agent.profile.service.AgentRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.agent.profile.service.AgentRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='agent', full_name='org.apache.custos.agent.profile.service.AgentRequest.agent', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -194,8 +226,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=358,
-  serialized_end=453,
+  serialized_start=386,
+  serialized_end=482,
 )
 
 
@@ -205,6 +237,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.agent.profile.service.OperationStatus.status', index=0,
@@ -212,7 +245,7 @@
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -225,8 +258,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=455,
-  serialized_end=488,
+  serialized_start=484,
+  serialized_end=517,
 )
 
 _AGENT.fields_by_name['status'].enum_type = _AGENTSTATUS
@@ -276,8 +309,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=533,
-  serialized_end=1033,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=562,
+  serialized_end=1062,
   methods=[
   _descriptor.MethodDescriptor(
     name='createAgent',
@@ -287,6 +321,7 @@
     input_type=_AGENTREQUEST,
     output_type=_AGENT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateAgent',
@@ -296,6 +331,7 @@
     input_type=_AGENTREQUEST,
     output_type=_AGENT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteAgent',
@@ -305,6 +341,7 @@
     input_type=_AGENTREQUEST,
     output_type=_OPERATIONSTATUS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAgent',
@@ -314,6 +351,7 @@
     input_type=_AGENTREQUEST,
     output_type=_AGENT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_AGENTPROFILESERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2_grpc.py
index dbb6e42..dd0ce30 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/AgentProfileService_pb2_grpc.py
@@ -1,97 +1,182 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import AgentProfileService_pb2 as AgentProfileService__pb2
+import custos.server.core.AgentProfileService_pb2 as AgentProfileService__pb2
 
 
 class AgentProfileServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.createAgent = channel.unary_unary(
-        '/org.apache.custos.agent.profile.service.AgentProfileService/createAgent',
-        request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
-        response_deserializer=AgentProfileService__pb2.Agent.FromString,
-        )
-    self.updateAgent = channel.unary_unary(
-        '/org.apache.custos.agent.profile.service.AgentProfileService/updateAgent',
-        request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
-        response_deserializer=AgentProfileService__pb2.Agent.FromString,
-        )
-    self.deleteAgent = channel.unary_unary(
-        '/org.apache.custos.agent.profile.service.AgentProfileService/deleteAgent',
-        request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
-        response_deserializer=AgentProfileService__pb2.OperationStatus.FromString,
-        )
-    self.getAgent = channel.unary_unary(
-        '/org.apache.custos.agent.profile.service.AgentProfileService/getAgent',
-        request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
-        response_deserializer=AgentProfileService__pb2.Agent.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/createAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
+        self.updateAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/updateAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
+        self.deleteAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/deleteAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.OperationStatus.FromString,
+                )
+        self.getAgent = channel.unary_unary(
+                '/org.apache.custos.agent.profile.service.AgentProfileService/getAgent',
+                request_serializer=AgentProfileService__pb2.AgentRequest.SerializeToString,
+                response_deserializer=AgentProfileService__pb2.Agent.FromString,
+                )
 
 
 class AgentProfileServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def createAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def createAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_AgentProfileServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'createAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.createAgent,
-          request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
-          response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
-      ),
-      'updateAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.updateAgent,
-          request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
-          response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
-      ),
-      'deleteAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteAgent,
-          request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
-          response_serializer=AgentProfileService__pb2.OperationStatus.SerializeToString,
-      ),
-      'getAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.getAgent,
-          request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
-          response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.agent.profile.service.AgentProfileService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'createAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.createAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+            'updateAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+            'deleteAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgent,
+                    request_deserializer=AgentProfileService__pb2.AgentRequest.FromString,
+                    response_serializer=AgentProfileService__pb2.Agent.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.agent.profile.service.AgentProfileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class AgentProfileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/createAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/updateAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/deleteAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.profile.service.AgentProfileService/getAgent',
+            AgentProfileService__pb2.AgentRequest.SerializeToString,
+            AgentProfileService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/ClusterManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/ClusterManagementService_pb2_grpc.py
index 820f6be..8cf201c 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/ClusterManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/ClusterManagementService_pb2_grpc.py
@@ -1,7 +1,7 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 import grpc
 
-import ClusterManagementService_pb2 as ClusterManagementService__pb2
+import custos.server.core.ClusterManagementService_pb2 as ClusterManagementService__pb2
 
 
 class ClusterManagementServiceStub(object):
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2.py
index d951299..257a183 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: CredentialStoreService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
@@ -18,8 +36,9 @@
   name='CredentialStoreService.proto',
   package='org.apache.custos.credential.store.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x1c\x43redentialStoreService.proto\x12*org.apache.custos.credential.store.service\"\xfb\x01\n\x12\x43redentialMetadata\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06secret\x18\x03 \x01(\t\x12\x1d\n\x15\x63lientSecretExpiredAt\x18\x04 \x01(\x03\x12\x18\n\x10\x63lientIdIssuedAt\x18\x05 \x01(\x03\x12>\n\x04type\x18\x06 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\x12\x14\n\x0csuper_tenant\x18\x07 \x01(\x08\x12\x13\n\x0bsuper_admin\x18\x08 \x01(\x08\x12\x14\n\x0cinternal_sec\x18\x0b \x01(\t\"s\n\x14GetCredentialRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12>\n\x04type\x18\x03 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"+\n\x18GetAllCredentialsRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\"\xa6\x01\n\x19GetAllCredentialsResponse\x12R\n\nsecretList\x18\x01 \x03(\x0b\x32>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x1a\n\x12requesterUserEmail\x18\x02 \x01(\t\x12\x19\n\x11requesterUsername\x18\x03 \x01(\t\" \n\x0fOperationStatus\x12\r\n\x05state\x18\x01 \x01(\x08\"j\n\x17\x44\x65leteCredentialRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12>\n\x04type\x18\x02 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"/\n\x1cGetOperationsMetadataRequest\x12\x0f\n\x07traceId\x18\x01 \x01(\x03\"Z\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x11\n\ttimeStamp\x18\x03 \x01(\t\x12\x13\n\x0bperformedBy\x18\x04 \x01(\t\"p\n\x1dGetOperationsMetadataResponse\x12O\n\x08metadata\x18\x01 \x03(\x0b\x32=.org.apache.custos.credential.store.service.OperationMetadata\"E\n\x1dGetNewCustosCredentialRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x02 \x01(\t\"H\n\x1eGetNewCustosCredentialResponse\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x02 \x01(\t\"5\n\x0cTokenRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x16\n\x0eparentClientId\x18\x02 \x01(\t\"%\n\x12GetOwnerIdResponse\x12\x0f\n\x07ownerId\x18\x02 \x01(\x03\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01*U\n\x04Type\x12\n\n\x06\x43USTOS\x10\x00\x12\x07\n\x03IAM\x10\x01\x12\x0b\n\x07\x43ILOGON\x10\x02\x12\x0e\n\nINDIVIDUAL\x10\x03\x12\x10\n\x0c\x41GENT_CLIENT\x10\x04\x12\t\n\x05\x41GENT\x10\x05\x32\x9b\x16\n\x16\x43redentialStoreService\x12\x8c\x01\n\rputCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x94\x01\n\x10\x64\x65leteCredential\x12\x43.org.apache.custos.credential.store.service.DeleteCredentialRequest\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x91\x01\n\rgetCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa0\x01\n\x11getAllCredentials\x12\x44.org.apache.custos.credential.store.service.GetAllCredentialsRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xab\x01\n\x14getOperationMetadata\x12H.org.apache.custos.credential.store.service.GetOperationsMetadataRequest\x1aI.org.apache.custos.credential.store.service.GetOperationsMetadataResponse\x12\xa3\x01\n\x16getNewCustosCredential\x12I.org.apache.custos.credential.store.service.GetNewCustosCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x8f\x01\n\x13getOwnerIdFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.GetOwnerIdResponse\x12\x98\x01\n\x1cgetCustosCredentialFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa3\x01\n\x1fgetCustosCredentialFromClientId\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x9d\x01\n\x1agetAllCredentialsFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x14getMasterCredentials\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xa0\x01\n\x1dgetAllCredentialsFromJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x88\x01\n\x13getBasicCredentials\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\x12\x97\x01\n\x15\x63reateAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x96\x01\n\x12getAgentCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x94\x01\n\x15\x64\x65leteAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\xa0\x01\n\x1dgetCredentialByAgentBasicAuth\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x1cgetCredentialByAgentJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponseB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1c\x43redentialStoreService.proto\x12*org.apache.custos.credential.store.service\"\x82\x02\n\x12\x43redentialMetadata\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06secret\x18\x03 \x01(\t\x12 \n\x18\x63lient_secret_expired_at\x18\x04 \x01(\x03\x12\x1b\n\x13\x63lient_id_issued_at\x18\x05 \x01(\x03\x12>\n\x04type\x18\x06 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\x12\x14\n\x0csuper_tenant\x18\x07 \x01(\x08\x12\x13\n\x0bsuper_admin\x18\x08 \x01(\x08\x12\x14\n\x0cinternal_sec\x18\x0b \x01(\t\"s\n\x14GetCredentialRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\x12\n\n\x02id\x18\x02 \x01(\t\x12>\n\x04type\x18\x03 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"+\n\x18GetAllCredentialsRequest\x12\x0f\n\x07ownerId\x18\x01 \x01(\x03\"\xaa\x01\n\x19GetAllCredentialsResponse\x12S\n\x0bsecret_list\x18\x01 \x03(\x0b\x32>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x1c\n\x14requester_user_email\x18\x02 \x01(\t\x12\x1a\n\x12requester_username\x18\x03 \x01(\t\" \n\x0fOperationStatus\x12\r\n\x05state\x18\x01 \x01(\x08\"k\n\x17\x44\x65leteCredentialRequest\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12>\n\x04type\x18\x02 \x01(\x0e\x32\x30.org.apache.custos.credential.store.service.Type\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"p\n\x1dGetOperationsMetadataResponse\x12O\n\x08metadata\x18\x01 \x03(\x0b\x32=.org.apache.custos.credential.store.service.OperationMetadata\"G\n\x1dGetNewCustosCredentialRequest\x12\x10\n\x08owner_id\x18\x01 \x01(\x03\x12\x14\n\x0cperformed_by\x18\x02 \x01(\t\"J\n\x1eGetNewCustosCredentialResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\"7\n\x0cTokenRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x18\n\x10parent_client_id\x18\x02 \x01(\t\"&\n\x12GetOwnerIdResponse\x12\x10\n\x08owner_id\x18\x02 \x01(\x03\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01*U\n\x04Type\x12\n\n\x06\x43USTOS\x10\x00\x12\x07\n\x03IAM\x10\x01\x12\x0b\n\x07\x43ILOGON\x10\x02\x12\x0e\n\nINDIVIDUAL\x10\x03\x12\x10\n\x0c\x41GENT_CLIENT\x10\x04\x12\t\n\x05\x41GENT\x10\x05\x32\xac\x17\n\x16\x43redentialStoreService\x12\x8c\x01\n\rputCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x94\x01\n\x10\x64\x65leteCredential\x12\x43.org.apache.custos.credential.store.service.DeleteCredentialRequest\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\x91\x01\n\rgetCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa0\x01\n\x11getAllCredentials\x12\x44.org.apache.custos.credential.store.service.GetAllCredentialsRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xab\x01\n\x14getOperationMetadata\x12H.org.apache.custos.credential.store.service.GetOperationsMetadataRequest\x1aI.org.apache.custos.credential.store.service.GetOperationsMetadataResponse\x12\xa3\x01\n\x16getNewCustosCredential\x12I.org.apache.custos.credential.store.service.GetNewCustosCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x8f\x01\n\x13getOwnerIdFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.GetOwnerIdResponse\x12\x98\x01\n\x1cgetCustosCredentialFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\xa3\x01\n\x1fgetCustosCredentialFromClientId\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x9d\x01\n\x1agetAllCredentialsFromToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x14getMasterCredentials\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\xa0\x01\n\x1dgetAllCredentialsFromJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x88\x01\n\x13getBasicCredentials\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\x12\x97\x01\n\x15\x63reateAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x96\x01\n\x12getAgentCredential\x12@.org.apache.custos.credential.store.service.GetCredentialRequest\x1a>.org.apache.custos.credential.store.service.CredentialMetadata\x12\x94\x01\n\x15\x64\x65leteAgentCredential\x12>.org.apache.custos.credential.store.service.CredentialMetadata\x1a;.org.apache.custos.credential.store.service.OperationStatus\x12\xa0\x01\n\x1dgetCredentialByAgentBasicAuth\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x9f\x01\n\x1cgetCredentialByAgentJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a\x45.org.apache.custos.credential.store.service.GetAllCredentialsResponse\x12\x8e\x01\n\x15validateAgentJWTToken\x12\x38.org.apache.custos.credential.store.service.TokenRequest\x1a;.org.apache.custos.credential.store.service.OperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _TYPE = _descriptor.EnumDescriptor(
@@ -27,36 +46,43 @@
   full_name='org.apache.custos.credential.store.service.Type',
   filename=None,
   file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
   values=[
     _descriptor.EnumValueDescriptor(
       name='CUSTOS', index=0, number=0,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='IAM', index=1, number=1,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='CILOGON', index=2, number=2,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='INDIVIDUAL', index=3, number=3,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='AGENT_CLIENT', index=4, number=4,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='AGENT', index=5, number=5,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1556,
-  serialized_end=1641,
+  serialized_start=1578,
+  serialized_end=1663,
 )
 _sym_db.RegisterEnumDescriptor(_TYPE)
 
@@ -76,70 +102,71 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='ownerId', full_name='org.apache.custos.credential.store.service.CredentialMetadata.ownerId', index=0,
+      name='owner_id', full_name='org.apache.custos.credential.store.service.CredentialMetadata.owner_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.credential.store.service.CredentialMetadata.id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='secret', full_name='org.apache.custos.credential.store.service.CredentialMetadata.secret', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecretExpiredAt', full_name='org.apache.custos.credential.store.service.CredentialMetadata.clientSecretExpiredAt', index=3,
+      name='client_secret_expired_at', full_name='org.apache.custos.credential.store.service.CredentialMetadata.client_secret_expired_at', index=3,
       number=4, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientIdIssuedAt', full_name='org.apache.custos.credential.store.service.CredentialMetadata.clientIdIssuedAt', index=4,
+      name='client_id_issued_at', full_name='org.apache.custos.credential.store.service.CredentialMetadata.client_id_issued_at', index=4,
       number=5, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='type', full_name='org.apache.custos.credential.store.service.CredentialMetadata.type', index=5,
       number=6, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='super_tenant', full_name='org.apache.custos.credential.store.service.CredentialMetadata.super_tenant', index=6,
       number=7, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='super_admin', full_name='org.apache.custos.credential.store.service.CredentialMetadata.super_admin', index=7,
       number=8, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='internal_sec', full_name='org.apache.custos.credential.store.service.CredentialMetadata.internal_sec', index=8,
       number=11, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -153,7 +180,7 @@
   oneofs=[
   ],
   serialized_start=77,
-  serialized_end=328,
+  serialized_end=335,
 )
 
 
@@ -163,6 +190,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='ownerId', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.ownerId', index=0,
@@ -170,21 +198,21 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='type', full_name='org.apache.custos.credential.store.service.GetCredentialRequest.type', index=2,
       number=3, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -197,8 +225,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=330,
-  serialized_end=445,
+  serialized_start=337,
+  serialized_end=452,
 )
 
 
@@ -208,6 +236,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='ownerId', full_name='org.apache.custos.credential.store.service.GetAllCredentialsRequest.ownerId', index=0,
@@ -215,7 +244,7 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -228,8 +257,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=447,
-  serialized_end=490,
+  serialized_start=454,
+  serialized_end=497,
 )
 
 
@@ -239,28 +268,29 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='secretList', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.secretList', index=0,
+      name='secret_list', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.secret_list', index=0,
       number=1, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='requesterUserEmail', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requesterUserEmail', index=1,
+      name='requester_user_email', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requester_user_email', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='requesterUsername', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requesterUsername', index=2,
+      name='requester_username', full_name='org.apache.custos.credential.store.service.GetAllCredentialsResponse.requester_username', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -273,8 +303,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=493,
-  serialized_end=659,
+  serialized_start=500,
+  serialized_end=670,
 )
 
 
@@ -284,6 +314,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='state', full_name='org.apache.custos.credential.store.service.OperationStatus.state', index=0,
@@ -291,7 +322,7 @@
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -304,8 +335,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=661,
-  serialized_end=693,
+  serialized_start=672,
+  serialized_end=704,
 )
 
 
@@ -315,21 +346,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='ownerId', full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest.ownerId', index=0,
+      name='owner_id', full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest.owner_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='type', full_name='org.apache.custos.credential.store.service.DeleteCredentialRequest.type', index=1,
       number=2, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -342,8 +374,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=695,
-  serialized_end=801,
+  serialized_start=706,
+  serialized_end=813,
 )
 
 
@@ -353,14 +385,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='traceId', full_name='org.apache.custos.credential.store.service.GetOperationsMetadataRequest.traceId', index=0,
+      name='trace_id', full_name='org.apache.custos.credential.store.service.GetOperationsMetadataRequest.trace_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -373,8 +406,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=803,
-  serialized_end=850,
+  serialized_start=815,
+  serialized_end=863,
 )
 
 
@@ -384,6 +417,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='event', full_name='org.apache.custos.credential.store.service.OperationMetadata.event', index=0,
@@ -391,28 +425,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.credential.store.service.OperationMetadata.status', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='timeStamp', full_name='org.apache.custos.credential.store.service.OperationMetadata.timeStamp', index=2,
+      name='time_stamp', full_name='org.apache.custos.credential.store.service.OperationMetadata.time_stamp', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.credential.store.service.OperationMetadata.performedBy', index=3,
+      name='performed_by', full_name='org.apache.custos.credential.store.service.OperationMetadata.performed_by', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -425,8 +459,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=852,
-  serialized_end=942,
+  serialized_start=865,
+  serialized_end=957,
 )
 
 
@@ -436,6 +470,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='metadata', full_name='org.apache.custos.credential.store.service.GetOperationsMetadataResponse.metadata', index=0,
@@ -443,7 +478,7 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -456,8 +491,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=944,
-  serialized_end=1056,
+  serialized_start=959,
+  serialized_end=1071,
 )
 
 
@@ -467,21 +502,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='ownerId', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.ownerId', index=0,
+      name='owner_id', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.owner_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.performedBy', index=1,
+      name='performed_by', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialRequest.performed_by', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -494,8 +530,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1058,
-  serialized_end=1127,
+  serialized_start=1073,
+  serialized_end=1144,
 )
 
 
@@ -505,21 +541,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.clientSecret', index=1,
+      name='client_secret', full_name='org.apache.custos.credential.store.service.GetNewCustosCredentialResponse.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -532,8 +569,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1129,
-  serialized_end=1201,
+  serialized_start=1146,
+  serialized_end=1220,
 )
 
 
@@ -543,6 +580,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='token', full_name='org.apache.custos.credential.store.service.TokenRequest.token', index=0,
@@ -550,14 +588,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='parentClientId', full_name='org.apache.custos.credential.store.service.TokenRequest.parentClientId', index=1,
+      name='parent_client_id', full_name='org.apache.custos.credential.store.service.TokenRequest.parent_client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -570,8 +608,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1203,
-  serialized_end=1256,
+  serialized_start=1222,
+  serialized_end=1277,
 )
 
 
@@ -581,14 +619,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='ownerId', full_name='org.apache.custos.credential.store.service.GetOwnerIdResponse.ownerId', index=0,
+      name='owner_id', full_name='org.apache.custos.credential.store.service.GetOwnerIdResponse.owner_id', index=0,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -601,8 +640,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1258,
-  serialized_end=1295,
+  serialized_start=1279,
+  serialized_end=1317,
 )
 
 
@@ -612,6 +651,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='iam_client_id', full_name='org.apache.custos.credential.store.service.Credentials.iam_client_id', index=0,
@@ -619,56 +659,56 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='iam_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.iam_client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='ci_logon_client_id', full_name='org.apache.custos.credential.store.service.Credentials.ci_logon_client_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='ci_logon_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.ci_logon_client_secret', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_id', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_id', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_secret', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_secret', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_id_issued_at', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_id_issued_at', index=6,
       number=7, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_secret_expired_at', full_name='org.apache.custos.credential.store.service.Credentials.custos_client_secret_expired_at', index=7,
       number=8, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -681,13 +721,13 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1298,
-  serialized_end=1554,
+  serialized_start=1320,
+  serialized_end=1576,
 )
 
 _CREDENTIALMETADATA.fields_by_name['type'].enum_type = _TYPE
 _GETCREDENTIALREQUEST.fields_by_name['type'].enum_type = _TYPE
-_GETALLCREDENTIALSRESPONSE.fields_by_name['secretList'].message_type = _CREDENTIALMETADATA
+_GETALLCREDENTIALSRESPONSE.fields_by_name['secret_list'].message_type = _CREDENTIALMETADATA
 _DELETECREDENTIALREQUEST.fields_by_name['type'].enum_type = _TYPE
 _GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
 DESCRIPTOR.message_types_by_name['CredentialMetadata'] = _CREDENTIALMETADATA
@@ -814,8 +854,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=1644,
-  serialized_end=4487,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1666,
+  serialized_end=4654,
   methods=[
   _descriptor.MethodDescriptor(
     name='putCredential',
@@ -825,6 +866,7 @@
     input_type=_CREDENTIALMETADATA,
     output_type=_OPERATIONSTATUS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteCredential',
@@ -834,6 +876,7 @@
     input_type=_DELETECREDENTIALREQUEST,
     output_type=_OPERATIONSTATUS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCredential',
@@ -843,6 +886,7 @@
     input_type=_GETCREDENTIALREQUEST,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllCredentials',
@@ -852,6 +896,7 @@
     input_type=_GETALLCREDENTIALSREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getOperationMetadata',
@@ -861,6 +906,7 @@
     input_type=_GETOPERATIONSMETADATAREQUEST,
     output_type=_GETOPERATIONSMETADATARESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getNewCustosCredential',
@@ -870,6 +916,7 @@
     input_type=_GETNEWCUSTOSCREDENTIALREQUEST,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getOwnerIdFromToken',
@@ -879,6 +926,7 @@
     input_type=_TOKENREQUEST,
     output_type=_GETOWNERIDRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCustosCredentialFromToken',
@@ -888,6 +936,7 @@
     input_type=_TOKENREQUEST,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCustosCredentialFromClientId',
@@ -897,6 +946,7 @@
     input_type=_GETCREDENTIALREQUEST,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllCredentialsFromToken',
@@ -906,6 +956,7 @@
     input_type=_TOKENREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getMasterCredentials',
@@ -915,6 +966,7 @@
     input_type=_GETCREDENTIALREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllCredentialsFromJWTToken',
@@ -924,6 +976,7 @@
     input_type=_TOKENREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getBasicCredentials',
@@ -933,6 +986,7 @@
     input_type=_TOKENREQUEST,
     output_type=_CREDENTIALS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='createAgentCredential',
@@ -942,6 +996,7 @@
     input_type=_CREDENTIALMETADATA,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAgentCredential',
@@ -951,6 +1006,7 @@
     input_type=_GETCREDENTIALREQUEST,
     output_type=_CREDENTIALMETADATA,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteAgentCredential',
@@ -960,6 +1016,7 @@
     input_type=_CREDENTIALMETADATA,
     output_type=_OPERATIONSTATUS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCredentialByAgentBasicAuth',
@@ -969,6 +1026,7 @@
     input_type=_TOKENREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCredentialByAgentJWTToken',
@@ -978,6 +1036,17 @@
     input_type=_TOKENREQUEST,
     output_type=_GETALLCREDENTIALSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='validateAgentJWTToken',
+    full_name='org.apache.custos.credential.store.service.CredentialStoreService.validateAgentJWTToken',
+    index=18,
+    containing_service=None,
+    input_type=_TOKENREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_CREDENTIALSTORESERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2_grpc.py
index a1d644d..cb975e5 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/CredentialStoreService_pb2_grpc.py
@@ -1,335 +1,677 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import CredentialStoreService_pb2 as CredentialStoreService__pb2
+import custos.server.core.CredentialStoreService_pb2 as CredentialStoreService__pb2
 
 
 class CredentialStoreServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.putCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/putCredential',
-        request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
-        )
-    self.deleteCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/deleteCredential',
-        request_serializer=CredentialStoreService__pb2.DeleteCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
-        )
-    self.getCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getCredential',
-        request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.getAllCredentials = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentials',
-        request_serializer=CredentialStoreService__pb2.GetAllCredentialsRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
-    self.getOperationMetadata = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getOperationMetadata',
-        request_serializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.FromString,
-        )
-    self.getNewCustosCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getNewCustosCredential',
-        request_serializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.getOwnerIdFromToken = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getOwnerIdFromToken',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetOwnerIdResponse.FromString,
-        )
-    self.getCustosCredentialFromToken = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromToken',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.getCustosCredentialFromClientId = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromClientId',
-        request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.getAllCredentialsFromToken = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromToken',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
-    self.getMasterCredentials = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getMasterCredentials',
-        request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
-    self.getAllCredentialsFromJWTToken = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromJWTToken',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
-    self.getBasicCredentials = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getBasicCredentials',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
-        )
-    self.createAgentCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/createAgentCredential',
-        request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.getAgentCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getAgentCredential',
-        request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-        )
-    self.deleteAgentCredential = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/deleteAgentCredential',
-        request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
-        )
-    self.getCredentialByAgentBasicAuth = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentBasicAuth',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
-    self.getCredentialByAgentJWTToken = channel.unary_unary(
-        '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentJWTToken',
-        request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.putCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/putCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.deleteCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/deleteCredential',
+                request_serializer=CredentialStoreService__pb2.DeleteCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.getCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredential',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAllCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentials',
+                request_serializer=CredentialStoreService__pb2.GetAllCredentialsRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getOperationMetadata = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getOperationMetadata',
+                request_serializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.FromString,
+                )
+        self.getNewCustosCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getNewCustosCredential',
+                request_serializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getOwnerIdFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getOwnerIdFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetOwnerIdResponse.FromString,
+                )
+        self.getCustosCredentialFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getCustosCredentialFromClientId = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromClientId',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAllCredentialsFromToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getMasterCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getMasterCredentials',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getAllCredentialsFromJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getBasicCredentials = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getBasicCredentials',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
+                )
+        self.createAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/createAgentCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.getAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getAgentCredential',
+                request_serializer=CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                )
+        self.deleteAgentCredential = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/deleteAgentCredential',
+                request_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
+        self.getCredentialByAgentBasicAuth = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentBasicAuth',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.getCredentialByAgentJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+                )
+        self.validateAgentJWTToken = channel.unary_unary(
+                '/org.apache.custos.credential.store.service.CredentialStoreService/validateAgentJWTToken',
+                request_serializer=CredentialStoreService__pb2.TokenRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.OperationStatus.FromString,
+                )
 
 
 class CredentialStoreServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def putCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def putCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllCredentials(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getOperationMetadata(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getOperationMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getNewCustosCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getNewCustosCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getOwnerIdFromToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getOwnerIdFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCustosCredentialFromToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCustosCredentialFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCustosCredentialFromClientId(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCustosCredentialFromClientId(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllCredentialsFromToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllCredentialsFromToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getMasterCredentials(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getMasterCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllCredentialsFromJWTToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllCredentialsFromJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getBasicCredentials(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getBasicCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def createAgentCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def createAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAgentCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteAgentCredential(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteAgentCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCredentialByAgentBasicAuth(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCredentialByAgentBasicAuth(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCredentialByAgentJWTToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCredentialByAgentJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def validateAgentJWTToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_CredentialStoreServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'putCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.putCredential,
-          request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-          response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
-      ),
-      'deleteCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteCredential,
-          request_deserializer=CredentialStoreService__pb2.DeleteCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
-      ),
-      'getCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.getCredential,
-          request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'getAllCredentials': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllCredentials,
-          request_deserializer=CredentialStoreService__pb2.GetAllCredentialsRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-      'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
-          servicer.getOperationMetadata,
-          request_deserializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.SerializeToString,
-      ),
-      'getNewCustosCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.getNewCustosCredential,
-          request_deserializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'getOwnerIdFromToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getOwnerIdFromToken,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetOwnerIdResponse.SerializeToString,
-      ),
-      'getCustosCredentialFromToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getCustosCredentialFromToken,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'getCustosCredentialFromClientId': grpc.unary_unary_rpc_method_handler(
-          servicer.getCustosCredentialFromClientId,
-          request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'getAllCredentialsFromToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllCredentialsFromToken,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-      'getMasterCredentials': grpc.unary_unary_rpc_method_handler(
-          servicer.getMasterCredentials,
-          request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-      'getAllCredentialsFromJWTToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllCredentialsFromJWTToken,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-      'getBasicCredentials': grpc.unary_unary_rpc_method_handler(
-          servicer.getBasicCredentials,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
-      ),
-      'createAgentCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.createAgentCredential,
-          request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'getAgentCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.getAgentCredential,
-          request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
-      ),
-      'deleteAgentCredential': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteAgentCredential,
-          request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
-          response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
-      ),
-      'getCredentialByAgentBasicAuth': grpc.unary_unary_rpc_method_handler(
-          servicer.getCredentialByAgentBasicAuth,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-      'getCredentialByAgentJWTToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getCredentialByAgentJWTToken,
-          request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.credential.store.service.CredentialStoreService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'putCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.putCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredential,
+                    request_deserializer=CredentialStoreService__pb2.DeleteCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAllCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentials,
+                    request_deserializer=CredentialStoreService__pb2.GetAllCredentialsRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOperationMetadata,
+                    request_deserializer=CredentialStoreService__pb2.GetOperationsMetadataRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetOperationsMetadataResponse.SerializeToString,
+            ),
+            'getNewCustosCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getNewCustosCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetNewCustosCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getOwnerIdFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOwnerIdFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetOwnerIdResponse.SerializeToString,
+            ),
+            'getCustosCredentialFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosCredentialFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getCustosCredentialFromClientId': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosCredentialFromClientId,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAllCredentialsFromToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentialsFromToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getMasterCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getMasterCredentials,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getAllCredentialsFromJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllCredentialsFromJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getBasicCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getBasicCredentials,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
+            ),
+            'createAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.createAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'getAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.GetCredentialRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            ),
+            'deleteAgentCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentCredential,
+                    request_deserializer=CredentialStoreService__pb2.CredentialMetadata.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getCredentialByAgentBasicAuth': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialByAgentBasicAuth,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'getCredentialByAgentJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialByAgentJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.GetAllCredentialsResponse.SerializeToString,
+            ),
+            'validateAgentJWTToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.validateAgentJWTToken,
+                    request_deserializer=CredentialStoreService__pb2.TokenRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.credential.store.service.CredentialStoreService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class CredentialStoreService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def putCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/putCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/deleteCredential',
+            CredentialStoreService__pb2.DeleteCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredential',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentials',
+            CredentialStoreService__pb2.GetAllCredentialsRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOperationMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getOperationMetadata',
+            CredentialStoreService__pb2.GetOperationsMetadataRequest.SerializeToString,
+            CredentialStoreService__pb2.GetOperationsMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getNewCustosCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getNewCustosCredential',
+            CredentialStoreService__pb2.GetNewCustosCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOwnerIdFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getOwnerIdFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetOwnerIdResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCustosCredentialFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCustosCredentialFromClientId(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCustosCredentialFromClientId',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentialsFromToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getMasterCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getMasterCredentials',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllCredentialsFromJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAllCredentialsFromJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getBasicCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getBasicCredentials',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.Credentials.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/createAgentCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getAgentCredential',
+            CredentialStoreService__pb2.GetCredentialRequest.SerializeToString,
+            CredentialStoreService__pb2.CredentialMetadata.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/deleteAgentCredential',
+            CredentialStoreService__pb2.CredentialMetadata.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialByAgentBasicAuth(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentBasicAuth',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialByAgentJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/getCredentialByAgentJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.GetAllCredentialsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def validateAgentJWTToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.credential.store.service.CredentialStoreService/validateAgentJWTToken',
+            CredentialStoreService__pb2.TokenRequest.SerializeToString,
+            CredentialStoreService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2.py
index b54d60b..5286ff3 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2.py
@@ -1,7 +1,26 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: FederatedAuthenticationService.proto
-
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -11,16 +30,47 @@
 _sym_db = _symbol_database.Default()
 
 
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='FederatedAuthenticationService.proto',
   package='org.apache.custos.federated.authentication.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n$FederatedAuthenticationService.proto\x12\x32org.apache.custos.federated.authentication.service\"\xb8\x01\n\x0e\x43lientMetadata\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x12\n\ntenantName\x18\x02 \x01(\t\x12\r\n\x05scope\x18\x03 \x03(\t\x12\x11\n\ttenantURI\x18\x04 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x05 \x03(\t\x12\x0f\n\x07\x63omment\x18\x06 \x01(\t\x12\x14\n\x0credirectURIs\x18\x07 \x03(\t\x12\x10\n\x08\x63lientId\x18\x08 \x01(\t\x12\x13\n\x0bperformedBy\x18\t \x01(\t\"\x98\x01\n\x16RegisterClientResponse\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x02 \x01(\t\x12\x18\n\x10\x63lientIdIssuedAt\x18\x03 \x01(\x03\x12\x1d\n\x15\x63lientSecretExpiresAt\x18\x04 \x01(\x03\x12\x1d\n\x15\x63lientRegistrationUri\x18\x05 \x01(\t\"6\n\x10GetClientRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\"\xf1\x01\n\x11GetClientResponse\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x12\n\nclientName\x18\x02 \x01(\t\x12\x14\n\x0credirectURIs\x18\x03 \x03(\t\x12\x12\n\ngrantTypes\x18\x04 \x03(\t\x12\r\n\x05scope\x18\x05 \x03(\t\x12\x18\n\x10\x63lientIdIssuedAt\x18\x06 \x01(\x03\x12\x0f\n\x07\x63omment\x18\x07 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x08 \x01(\t\x12\x1d\n\x15\x63lientSecretExpiresAt\x18\t \x01(\x03\x12\x1d\n\x15\x63lientRegistrationUri\x18\n \x01(\t\"N\n\x13\x44\x65leteClientRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\"\x07\n\x05\x45mpty\"/\n\x1cGetOperationsMetadataRequest\x12\x0f\n\x07traceId\x18\x01 \x01(\x03\"Z\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x11\n\ttimeStamp\x18\x03 \x01(\t\x12\x13\n\x0bperformedBy\x18\x04 \x01(\t\"x\n\x1dGetOperationsMetadataResponse\x12W\n\x08metadata\x18\x01 \x03(\x0b\x32\x45.org.apache.custos.federated.authentication.service.OperationMetadata2\xbc\x06\n\x1e\x46\x65\x64\x65ratedAuthenticationService\x12\x9b\x01\n\taddClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1aJ.org.apache.custos.federated.authentication.service.RegisterClientResponse\x12\x8d\x01\n\x0cupdateClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\x98\x01\n\tgetClient\x12\x44.org.apache.custos.federated.authentication.service.GetClientRequest\x1a\x45.org.apache.custos.federated.authentication.service.GetClientResponse\x12\x92\x01\n\x0c\x64\x65leteClient\x12G.org.apache.custos.federated.authentication.service.DeleteClientRequest\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\xbb\x01\n\x14getOperationMetadata\x12P.org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest\x1aQ.org.apache.custos.federated.authentication.service.GetOperationsMetadataResponseB\x02P\x01\x62\x06proto3'
-)
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n$FederatedAuthenticationService.proto\x12\x32org.apache.custos.federated.authentication.service\x1a\x1cgoogle/protobuf/struct.proto\"\xbe\x01\n\x0e\x43lientMetadata\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0btenant_name\x18\x02 \x01(\t\x12\r\n\x05scope\x18\x03 \x03(\t\x12\x12\n\ntenant_uRI\x18\x04 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x05 \x03(\t\x12\x0f\n\x07\x63omment\x18\x06 \x01(\t\x12\x15\n\rredirect_uRIs\x18\x07 \x03(\t\x12\x11\n\tclient_id\x18\x08 \x01(\t\x12\x14\n\x0cperformed_by\x18\t \x01(\t\"\xa2\x01\n\x16RegisterClientResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\x03 \x01(\x03\x12 \n\x18\x63lient_secret_expires_at\x18\x04 \x01(\x03\x12\x1f\n\x17\x63lient_registration_uri\x18\x05 \x01(\t\"8\n\x10GetClientRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\"\xfe\x01\n\x11GetClientResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x15\n\rredirect_uRIs\x18\x03 \x03(\t\x12\x13\n\x0bgrant_types\x18\x04 \x03(\t\x12\r\n\x05scope\x18\x05 \x03(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\x06 \x01(\x03\x12\x0f\n\x07\x63omment\x18\x07 \x01(\t\x12\x15\n\rclient_secret\x18\x08 \x01(\t\x12 \n\x18\x63lient_secret_expires_at\x18\t \x01(\x03\x12\x1f\n\x17\x63lient_registration_uri\x18\n \x01(\t\"Q\n\x13\x44\x65leteClientRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\"\x07\n\x05\x45mpty\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"x\n\x1dGetOperationsMetadataResponse\x12W\n\x08metadata\x18\x01 \x03(\x0b\x32\x45.org.apache.custos.federated.authentication.service.OperationMetadata\"\xb3\x01\n\x18\x43\x61\x63heManipulationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x17\n\x0finstitution_ids\x18\x02 \x03(\t\x12V\n\x04type\x18\x03 \x01(\x0e\x32H.org.apache.custos.federated.authentication.service.InstitutionCacheType\x12\x13\n\x0bperformedBy\x18\x04 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\x1e\n\x1cInstitutionOperationResponse\"a\n\x0bInstitution\x12\x11\n\tentity_id\x18\x01 \x01(\t\x12\x19\n\x11organization_name\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\x0e\n\x06rand_s\x18\x04 \x01(\x08\"2\n\x1cGetInstitutionsIdsAsResponse\x12\x12\n\nentity_ids\x18\x01 \x03(\t\"p\n\x17GetInstitutionsResponse\x12U\n\x0cinstitutions\x18\x02 \x03(\x0b\x32?.org.apache.custos.federated.authentication.service.Institution*3\n\x14InstitutionCacheType\x12\r\n\tWHITELIST\x10\x00\x12\x0c\n\x08\x42\x41\x43KLIST\x10\x01\x32\xce\x0b\n\x1e\x46\x65\x64\x65ratedAuthenticationService\x12\x9b\x01\n\taddClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1aJ.org.apache.custos.federated.authentication.service.RegisterClientResponse\x12\x8d\x01\n\x0cupdateClient\x12\x42.org.apache.custos.federated.authentication.service.ClientMetadata\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\x98\x01\n\tgetClient\x12\x44.org.apache.custos.federated.authentication.service.GetClientRequest\x1a\x45.org.apache.custos.federated.authentication.service.GetClientResponse\x12\x92\x01\n\x0c\x64\x65leteClient\x12G.org.apache.custos.federated.authentication.service.DeleteClientRequest\x1a\x39.org.apache.custos.federated.authentication.service.Empty\x12\xbb\x01\n\x14getOperationMetadata\x12P.org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest\x1aQ.org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse\x12\x96\x01\n\naddToCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\x12\x9b\x01\n\x0fremoveFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\x12\xa9\x01\n\x0cgetFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\x12\xac\x01\n\x0fgetInstitutions\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponseB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
+_INSTITUTIONCACHETYPE = _descriptor.EnumDescriptor(
+  name='InstitutionCacheType',
+  full_name='org.apache.custos.federated.authentication.service.InstitutionCacheType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='WHITELIST', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='BACKLIST', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1658,
+  serialized_end=1709,
+)
+_sym_db.RegisterEnumDescriptor(_INSTITUTIONCACHETYPE)
+
+InstitutionCacheType = enum_type_wrapper.EnumTypeWrapper(_INSTITUTIONCACHETYPE)
+WHITELIST = 0
+BACKLIST = 1
 
 
 
@@ -30,70 +80,71 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantName', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenantName', index=1,
+      name='tenant_name', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.scope', index=2,
       number=3, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantURI', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenantURI', index=3,
+      name='tenant_uRI', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.tenant_uRI', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='contacts', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.contacts', index=4,
       number=5, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='comment', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.comment', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='redirectURIs', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.redirectURIs', index=6,
+      name='redirect_uRIs', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.redirect_uRIs', index=6,
       number=7, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.clientId', index=7,
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.client_id', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.performedBy', index=8,
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.ClientMetadata.performed_by', index=8,
       number=9, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -106,8 +157,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=93,
-  serialized_end=277,
+  serialized_start=123,
+  serialized_end=313,
 )
 
 
@@ -117,42 +168,43 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.clientSecret', index=1,
+      name='client_secret', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientIdIssuedAt', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.clientIdIssuedAt', index=2,
+      name='client_id_issued_at', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_id_issued_at', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecretExpiresAt', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.clientSecretExpiresAt', index=3,
+      name='client_secret_expires_at', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_secret_expires_at', index=3,
       number=4, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientRegistrationUri', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.clientRegistrationUri', index=4,
+      name='client_registration_uri', full_name='org.apache.custos.federated.authentication.service.RegisterClientResponse.client_registration_uri', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -165,8 +217,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=280,
-  serialized_end=432,
+  serialized_start=316,
+  serialized_end=478,
 )
 
 
@@ -176,21 +228,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.clientId', index=1,
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.GetClientRequest.client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -203,8 +256,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=434,
-  serialized_end=488,
+  serialized_start=480,
+  serialized_end=536,
 )
 
 
@@ -214,77 +267,78 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientName', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientName', index=1,
+      name='client_name', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='redirectURIs', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.redirectURIs', index=2,
+      name='redirect_uRIs', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.redirect_uRIs', index=2,
       number=3, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='grantTypes', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.grantTypes', index=3,
+      name='grant_types', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.grant_types', index=3,
       number=4, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.scope', index=4,
       number=5, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientIdIssuedAt', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientIdIssuedAt', index=5,
+      name='client_id_issued_at', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_id_issued_at', index=5,
       number=6, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='comment', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.comment', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientSecret', index=7,
+      name='client_secret', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_secret', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecretExpiresAt', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientSecretExpiresAt', index=8,
+      name='client_secret_expires_at', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_secret_expires_at', index=8,
       number=9, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientRegistrationUri', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.clientRegistrationUri', index=9,
+      name='client_registration_uri', full_name='org.apache.custos.federated.authentication.service.GetClientResponse.client_registration_uri', index=9,
       number=10, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -297,8 +351,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=491,
-  serialized_end=732,
+  serialized_start=539,
+  serialized_end=793,
 )
 
 
@@ -308,28 +362,29 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.clientId', index=1,
+      name='client_id', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.performedBy', index=2,
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.DeleteClientRequest.performed_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -342,8 +397,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=734,
-  serialized_end=812,
+  serialized_start=795,
+  serialized_end=876,
 )
 
 
@@ -353,6 +408,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
   ],
   extensions=[
@@ -366,8 +422,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=814,
-  serialized_end=821,
+  serialized_start=878,
+  serialized_end=885,
 )
 
 
@@ -377,14 +433,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='traceId', full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest.traceId', index=0,
+      name='trace_id', full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataRequest.trace_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -397,8 +454,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=823,
-  serialized_end=870,
+  serialized_start=887,
+  serialized_end=935,
 )
 
 
@@ -408,6 +465,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='event', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.event', index=0,
@@ -415,28 +473,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.status', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='timeStamp', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.timeStamp', index=2,
+      name='time_stamp', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.time_stamp', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.performedBy', index=3,
+      name='performed_by', full_name='org.apache.custos.federated.authentication.service.OperationMetadata.performed_by', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -449,8 +507,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=872,
-  serialized_end=962,
+  serialized_start=937,
+  serialized_end=1029,
 )
 
 
@@ -460,6 +518,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='metadata', full_name='org.apache.custos.federated.authentication.service.GetOperationsMetadataResponse.metadata', index=0,
@@ -467,7 +526,7 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -480,11 +539,240 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=964,
-  serialized_end=1084,
+  serialized_start=1031,
+  serialized_end=1151,
+)
+
+
+_CACHEMANIPULATIONREQUEST = _descriptor.Descriptor(
+  name='CacheManipulationRequest',
+  full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='institution_ids', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.institution_ids', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='performedBy', full_name='org.apache.custos.federated.authentication.service.CacheManipulationRequest.performedBy', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1154,
+  serialized_end=1333,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.federated.authentication.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.federated.authentication.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1335,
+  serialized_end=1359,
+)
+
+
+_INSTITUTIONOPERATIONRESPONSE = _descriptor.Descriptor(
+  name='InstitutionOperationResponse',
+  full_name='org.apache.custos.federated.authentication.service.InstitutionOperationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1361,
+  serialized_end=1391,
+)
+
+
+_INSTITUTION = _descriptor.Descriptor(
+  name='Institution',
+  full_name='org.apache.custos.federated.authentication.service.Institution',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity_id', full_name='org.apache.custos.federated.authentication.service.Institution.entity_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_name', full_name='org.apache.custos.federated.authentication.service.Institution.organization_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='org.apache.custos.federated.authentication.service.Institution.display_name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='rand_s', full_name='org.apache.custos.federated.authentication.service.Institution.rand_s', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1393,
+  serialized_end=1490,
+)
+
+
+_GETINSTITUTIONSIDSASRESPONSE = _descriptor.Descriptor(
+  name='GetInstitutionsIdsAsResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity_ids', full_name='org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse.entity_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1492,
+  serialized_end=1542,
+)
+
+
+_GETINSTITUTIONSRESPONSE = _descriptor.Descriptor(
+  name='GetInstitutionsResponse',
+  full_name='org.apache.custos.federated.authentication.service.GetInstitutionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='institutions', full_name='org.apache.custos.federated.authentication.service.GetInstitutionsResponse.institutions', index=0,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1544,
+  serialized_end=1656,
 )
 
 _GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
+_CACHEMANIPULATIONREQUEST.fields_by_name['type'].enum_type = _INSTITUTIONCACHETYPE
+_GETINSTITUTIONSRESPONSE.fields_by_name['institutions'].message_type = _INSTITUTION
 DESCRIPTOR.message_types_by_name['ClientMetadata'] = _CLIENTMETADATA
 DESCRIPTOR.message_types_by_name['RegisterClientResponse'] = _REGISTERCLIENTRESPONSE
 DESCRIPTOR.message_types_by_name['GetClientRequest'] = _GETCLIENTREQUEST
@@ -494,6 +782,13 @@
 DESCRIPTOR.message_types_by_name['GetOperationsMetadataRequest'] = _GETOPERATIONSMETADATAREQUEST
 DESCRIPTOR.message_types_by_name['OperationMetadata'] = _OPERATIONMETADATA
 DESCRIPTOR.message_types_by_name['GetOperationsMetadataResponse'] = _GETOPERATIONSMETADATARESPONSE
+DESCRIPTOR.message_types_by_name['CacheManipulationRequest'] = _CACHEMANIPULATIONREQUEST
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['InstitutionOperationResponse'] = _INSTITUTIONOPERATIONRESPONSE
+DESCRIPTOR.message_types_by_name['Institution'] = _INSTITUTION
+DESCRIPTOR.message_types_by_name['GetInstitutionsIdsAsResponse'] = _GETINSTITUTIONSIDSASRESPONSE
+DESCRIPTOR.message_types_by_name['GetInstitutionsResponse'] = _GETINSTITUTIONSRESPONSE
+DESCRIPTOR.enum_types_by_name['InstitutionCacheType'] = _INSTITUTIONCACHETYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 ClientMetadata = _reflection.GeneratedProtocolMessageType('ClientMetadata', (_message.Message,), {
@@ -559,6 +854,48 @@
   })
 _sym_db.RegisterMessage(GetOperationsMetadataResponse)
 
+CacheManipulationRequest = _reflection.GeneratedProtocolMessageType('CacheManipulationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CACHEMANIPULATIONREQUEST,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.CacheManipulationRequest)
+  })
+_sym_db.RegisterMessage(CacheManipulationRequest)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+InstitutionOperationResponse = _reflection.GeneratedProtocolMessageType('InstitutionOperationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _INSTITUTIONOPERATIONRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.InstitutionOperationResponse)
+  })
+_sym_db.RegisterMessage(InstitutionOperationResponse)
+
+Institution = _reflection.GeneratedProtocolMessageType('Institution', (_message.Message,), {
+  'DESCRIPTOR' : _INSTITUTION,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.Institution)
+  })
+_sym_db.RegisterMessage(Institution)
+
+GetInstitutionsIdsAsResponse = _reflection.GeneratedProtocolMessageType('GetInstitutionsIdsAsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTITUTIONSIDSASRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse)
+  })
+_sym_db.RegisterMessage(GetInstitutionsIdsAsResponse)
+
+GetInstitutionsResponse = _reflection.GeneratedProtocolMessageType('GetInstitutionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETINSTITUTIONSRESPONSE,
+  '__module__' : 'FederatedAuthenticationService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.federated.authentication.service.GetInstitutionsResponse)
+  })
+_sym_db.RegisterMessage(GetInstitutionsResponse)
+
 
 DESCRIPTOR._options = None
 
@@ -568,8 +905,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=1087,
-  serialized_end=1915,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1712,
+  serialized_end=3198,
   methods=[
   _descriptor.MethodDescriptor(
     name='addClient',
@@ -579,6 +917,7 @@
     input_type=_CLIENTMETADATA,
     output_type=_REGISTERCLIENTRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateClient',
@@ -588,6 +927,7 @@
     input_type=_CLIENTMETADATA,
     output_type=_EMPTY,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getClient',
@@ -597,6 +937,7 @@
     input_type=_GETCLIENTREQUEST,
     output_type=_GETCLIENTRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteClient',
@@ -606,6 +947,7 @@
     input_type=_DELETECLIENTREQUEST,
     output_type=_EMPTY,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getOperationMetadata',
@@ -615,6 +957,47 @@
     input_type=_GETOPERATIONSMETADATAREQUEST,
     output_type=_GETOPERATIONSMETADATARESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addToCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.addToCache',
+    index=5,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeFromCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.removeFromCache',
+    index=6,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getFromCache',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getFromCache',
+    index=7,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_GETINSTITUTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getInstitutions',
+    full_name='org.apache.custos.federated.authentication.service.FederatedAuthenticationService.getInstitutions',
+    index=8,
+    containing_service=None,
+    input_type=_CACHEMANIPULATIONREQUEST,
+    output_type=_GETINSTITUTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_FEDERATEDAUTHENTICATIONSERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2_grpc.py
index 5abc3aa..09940f5 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/FederatedAuthenticationService_pb2_grpc.py
@@ -1,114 +1,347 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
 
 
 class FederatedAuthenticationServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.addClient = channel.unary_unary(
-        '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addClient',
-        request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
-        response_deserializer=FederatedAuthenticationService__pb2.RegisterClientResponse.FromString,
-        )
-    self.updateClient = channel.unary_unary(
-        '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/updateClient',
-        request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
-        response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
-        )
-    self.getClient = channel.unary_unary(
-        '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getClient',
-        request_serializer=FederatedAuthenticationService__pb2.GetClientRequest.SerializeToString,
-        response_deserializer=FederatedAuthenticationService__pb2.GetClientResponse.FromString,
-        )
-    self.deleteClient = channel.unary_unary(
-        '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/deleteClient',
-        request_serializer=FederatedAuthenticationService__pb2.DeleteClientRequest.SerializeToString,
-        response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
-        )
-    self.getOperationMetadata = channel.unary_unary(
-        '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getOperationMetadata',
-        request_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.SerializeToString,
-        response_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addClient',
+                request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.RegisterClientResponse.FromString,
+                )
+        self.updateClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/updateClient',
+                request_serializer=FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
+                )
+        self.getClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getClient',
+                request_serializer=FederatedAuthenticationService__pb2.GetClientRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetClientResponse.FromString,
+                )
+        self.deleteClient = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/deleteClient',
+                request_serializer=FederatedAuthenticationService__pb2.DeleteClientRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Empty.FromString,
+                )
+        self.getOperationMetadata = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getOperationMetadata',
+                request_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.FromString,
+                )
+        self.addToCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addToCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.removeFromCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/removeFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.getFromCache = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+        self.getInstitutions = channel.unary_unary(
+                '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getInstitutions',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
 
 
 class FederatedAuthenticationServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def addClient(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateClient(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getClient(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteClient(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getOperationMetadata(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getOperationMetadata(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addToCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInstitutions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_FederatedAuthenticationServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'addClient': grpc.unary_unary_rpc_method_handler(
-          servicer.addClient,
-          request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
-          response_serializer=FederatedAuthenticationService__pb2.RegisterClientResponse.SerializeToString,
-      ),
-      'updateClient': grpc.unary_unary_rpc_method_handler(
-          servicer.updateClient,
-          request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
-          response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
-      ),
-      'getClient': grpc.unary_unary_rpc_method_handler(
-          servicer.getClient,
-          request_deserializer=FederatedAuthenticationService__pb2.GetClientRequest.FromString,
-          response_serializer=FederatedAuthenticationService__pb2.GetClientResponse.SerializeToString,
-      ),
-      'deleteClient': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteClient,
-          request_deserializer=FederatedAuthenticationService__pb2.DeleteClientRequest.FromString,
-          response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
-      ),
-      'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
-          servicer.getOperationMetadata,
-          request_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.FromString,
-          response_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.federated.authentication.service.FederatedAuthenticationService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'addClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.addClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.RegisterClientResponse.SerializeToString,
+            ),
+            'updateClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.ClientMetadata.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
+            ),
+            'getClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.getClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.GetClientRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetClientResponse.SerializeToString,
+            ),
+            'deleteClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteClient,
+                    request_deserializer=FederatedAuthenticationService__pb2.DeleteClientRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Empty.SerializeToString,
+            ),
+            'getOperationMetadata': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOperationMetadata,
+                    request_deserializer=FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.SerializeToString,
+            ),
+            'addToCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.addToCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'removeFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'getFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.getFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+            'getInstitutions': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInstitutions,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.federated.authentication.service.FederatedAuthenticationService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class FederatedAuthenticationService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addClient',
+            FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+            FederatedAuthenticationService__pb2.RegisterClientResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/updateClient',
+            FederatedAuthenticationService__pb2.ClientMetadata.SerializeToString,
+            FederatedAuthenticationService__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getClient',
+            FederatedAuthenticationService__pb2.GetClientRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetClientResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/deleteClient',
+            FederatedAuthenticationService__pb2.DeleteClientRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOperationMetadata(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getOperationMetadata',
+            FederatedAuthenticationService__pb2.GetOperationsMetadataRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetOperationsMetadataResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addToCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/addToCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/removeFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInstitutions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.federated.authentication.service.FederatedAuthenticationService/getInstitutions',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2.py
index a7e7c0e..9024a42 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2.py
@@ -1,4 +1,22 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: IamAdminService.proto
 """Generated protocol buffer code."""
@@ -19,9 +37,9 @@
   name='IamAdminService.proto',
   package='org.apache.custos.iam.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x15IamAdminService.proto\x12\x1dorg.apache.custos.iam.service\x1a\x1bgoogle/protobuf/empty.proto\"\x84\x02\n\x12SetUpTenantRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x12\n\ntenantName\x18\x02 \x01(\t\x12\x15\n\radminUsername\x18\x03 \x01(\t\x12\x16\n\x0e\x61\x64minFirstname\x18\x04 \x01(\t\x12\x15\n\radminLastname\x18\x05 \x01(\t\x12\x12\n\nadminEmail\x18\x06 \x01(\t\x12\x15\n\radminPassword\x18\x07 \x01(\t\x12\x11\n\ttenantURL\x18\x08 \x01(\t\x12\x16\n\x0erequesterEmail\x18\t \x01(\t\x12\x14\n\x0credirectURIs\x18\n \x03(\t\x12\x16\n\x0e\x63ustosClientId\x18\x0b \x01(\t\"\xd6\x02\n\x1b\x43onfigureFederateIDPRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.org.apache.custos.iam.service.FederatedIDPs\x12\x10\n\x08\x63lientID\x18\x03 \x01(\t\x12\x11\n\tclientSec\x18\x04 \x01(\t\x12\\\n\tconfigMap\x18\x05 \x03(\x0b\x32I.org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry\x12\x16\n\x0erequesterEmail\x18\x06 \x01(\t\x12\r\n\x05idpId\x18\x07 \x01(\t\x12\r\n\x05scope\x18\x08 \x01(\t\x1a\x30\n\x0e\x43onfigMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"%\n\x13\x46\x65\x64\x65rateIDPResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08\"=\n\x13SetUpTenantResponse\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x02 \x01(\t\"U\n\x1aIsUsernameAvailableRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x10\n\x08userName\x18\x03 \x01(\t\"$\n\x10\x43heckingResponse\x12\x10\n\x08is_exist\x18\x01 \x01(\x08\"\xc0\x02\n\x12UserRepresentation\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x12\n\nfirst_name\x18\x04 \x01(\t\x12\x11\n\tlast_name\x18\x05 \x01(\t\x12\x10\n\x08password\x18\x06 \x01(\t\x12\r\n\x05\x65mail\x18\x07 \x01(\t\x12\x1a\n\x12temporary_password\x18\x08 \x01(\x08\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\n \x03(\t\x12@\n\nattributes\x18\x0b \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05state\x18\x0c \x01(\t\x12\x15\n\rcreation_time\x18\r \x01(\x01\x12\x15\n\rlast_login_at\x18\x0e \x01(\x01\"\xcc\x02\n\x13GroupRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12@\n\nattributes\x18\x05 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12@\n\x05users\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x46\n\nsub_groups\x18\x07 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x0f\n\x07ownerId\x18\t \x01(\t\"\xb7\x01\n\x13RegisterUserRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x10\n\x08\x63lientId\x18\x03 \x01(\t\x12\x11\n\tclientSec\x18\x04 \x01(\t\x12?\n\x04user\x18\x05 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"\xa6\x01\n\x14RegisterUsersRequest\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x13\n\x0bperformedBy\x18\x05 \x01(\t\"-\n\x14RegisterUserResponse\x12\x15\n\ris_registered\x18\x01 \x01(\x08\"|\n\x15RegisterUsersResponse\x12\x1b\n\x13\x61llUseresRegistered\x18\x01 \x01(\x08\x12\x46\n\x0b\x66\x61iledUsers\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"h\n\x12UserSearchMetadata\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x12\n\nfirst_name\x18\x02 \x01(\t\x12\x11\n\tlast_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\n\n\x02id\x18\x05 \x01(\t\"\xc0\x01\n\x10\x46indUsersRequest\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\xb7\x01\n\x11UserSearchRequest\x12?\n\x04user\x18\x01 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x12\n\nclient_sec\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"U\n\x11\x46indUsersResponse\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x83\x01\n\x11ResetUserPassword\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x04 \x01(\t\x12\x10\n\x08\x63lientId\x18\x05 \x01(\t\x12\x11\n\tclientSec\x18\x06 \x01(\t\"\xad\x01\n\x16\x44\x65leteUserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x14\n\x0c\x63lient_roles\x18\x03 \x03(\t\x12\r\n\x05roles\x18\x04 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\n\n\x02id\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41\x64\x64UserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tusernames\x18\x02 \x03(\t\x12\r\n\x05roles\x18\x03 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63lient_level\x18\x06 \x01(\x08\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\x0e\n\x06\x61gents\x18\x08 \x03(\t\"\x82\x01\n\x18UpdateUserProfileRequest\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x01 \x01(\t\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x1f\n\x0f\x41\x64\x64UserResponse\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\"/\n\x1cGetOperationsMetadataRequest\x12\x0f\n\x07traceId\x18\x01 \x01(\x03\"Z\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x11\n\ttimeStamp\x18\x03 \x01(\t\x12\x13\n\x0bperformedBy\x18\x04 \x01(\t\"c\n\x1dGetOperationsMetadataResponse\x12\x42\n\x08metadata\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.iam.service.OperationMetadata\"\'\n\x13\x44\x65leteTenantRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"\x8f\x01\n\x0f\x41\x64\x64RolesRequest\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\x14\n\x0c\x63lient_level\x18\x02 \x01(\x08\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\"M\n\x0fGetRolesRequest\x12\x14\n\x0c\x63lient_level\x18\x01 \x01(\x08\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t\"J\n\x12RoleRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x11\n\tcomposite\x18\x03 \x01(\x08\"[\n\x08\x41llRoles\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\r\n\x05scope\x18\x02 \x01(\t\"\x88\x03\n\x18\x41\x64\x64ProtocolMapperRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x61ttribute_name\x18\x02 \x01(\t\x12\x12\n\nclaim_name\x18\x03 \x01(\t\x12\x41\n\nclaim_type\x18\x04 \x01(\x0e\x32-.org.apache.custos.iam.service.ClaimJSONTypes\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12\x11\n\tclient_id\x18\x07 \x01(\t\x12?\n\x0bmapper_type\x18\x08 \x01(\x0e\x32*.org.apache.custos.iam.service.MapperTypes\x12\x17\n\x0f\x61\x64\x64_to_id_token\x18\t \x01(\x08\x12\x1b\n\x13\x61\x64\x64_to_access_token\x18\n \x01(\x08\x12\x18\n\x10\x61\x64\x64_to_user_info\x18\x0b \x01(\x08\x12\x14\n\x0cmulti_valued\x18\x0c \x01(\x08\x12\"\n\x1a\x61ggregate_attribute_values\x18\r \x01(\x08\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\xcc\x01\n\x18\x41\x64\x64UserAttributesRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\"\xce\x01\n\x1a\x44\x65leteUserAttributeRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\",\n\rUserAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0e\n\x06values\x18\x02 \x03(\t\"\x8e\x01\n\x17\x45ventPersistenceRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x64min_event\x18\x02 \x01(\x08\x12\r\n\x05\x65vent\x18\x03 \x01(\t\x12\x0e\n\x06\x65nable\x18\x04 \x01(\x08\x12\x18\n\x10persistence_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"\xb4\x01\n\rGroupsRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x42\n\x06groups\x18\x06 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xbe\x01\n\x0cGroupRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\n\n\x02id\x18\x06 \x01(\t\x12\x41\n\x05group\x18\x07 \x01(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"T\n\x0eGroupsResponse\x12\x42\n\x06groups\x18\x01 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xb7\x01\n\x17UserGroupMappingRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\x12\x10\n\x08group_id\x18\x07 \x01(\t\x12\x17\n\x0fmembership_type\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41gentClientMetadata\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x11\n\ttenantURL\x18\x02 \x01(\t\x12\x14\n\x0credirectURIs\x18\x03 \x03(\t\x12\x12\n\nclientName\x18\x04 \x01(\t\x12\x1e\n\x16\x61\x63\x63\x65ss_token_life_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x07 \x01(\t\"\xc4\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0brealm_roles\x18\x02 \x03(\t\x12@\n\nattributes\x18\x03 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\x11\n\tisEnabled\x18\x04 \x01(\x08\x12\x15\n\rcreation_time\x18\x05 \x01(\x01\x12\x18\n\x10last_modified_at\x18\x06 \x01(\x01\x12\x14\n\x0c\x63lient_roles\x18\x07 \x03(\t\"z\n\x0fGetAllResources\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x43\n\rresource_type\x18\x03 \x01(\x0e\x32,.org.apache.custos.iam.service.ResourceTypes\"\x91\x01\n\x17GetAllResourcesResponse\x12\x34\n\x06\x61gents\x18\x01 \x03(\x0b\x32$.org.apache.custos.iam.service.Agent\x12@\n\x05users\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation*b\n\rFederatedIDPs\x12\x0b\n\x07\x43ILOGON\x10\x00\x12\x0c\n\x08\x46\x41\x43\x45\x42OOK\x10\x01\x12\n\n\x06GOOGLE\x10\x02\x12\x0c\n\x08LINKEDIN\x10\x03\x12\x0b\n\x07TWITTER\x10\x04\x12\x0f\n\x0b\x43USTOM_OIDC\x10\x05*L\n\x0bMapperTypes\x12\x12\n\x0eUSER_ATTRIBUTE\x10\x00\x12\x13\n\x0fUSER_REALM_ROLE\x10\x01\x12\x14\n\x10USER_CLIENT_ROLE\x10\x02*J\n\x0e\x43laimJSONTypes\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04LONG\x10\x01\x12\x0b\n\x07INTEGER\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x08\n\x04JSON\x10\x04*$\n\rResourceTypes\x12\x08\n\x04USER\x10\x00\x12\t\n\x05\x41GENT\x10\x01\x32\x81,\n\x0fIamAdminService\x12t\n\x0bsetUPTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12u\n\x0cupdateTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12Z\n\x0c\x64\x65leteTenant\x12\x32.org.apache.custos.iam.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\x12\x87\x01\n\x15\x63onfigureFederatedIDP\x12:.org.apache.custos.iam.service.ConfigureFederateIDPRequest\x1a\x32.org.apache.custos.iam.service.FederateIDPResponse\x12k\n\x10\x61\x64\x64RolesToTenant\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12|\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x10getRolesOfTenant\x12..org.apache.custos.iam.service.GetRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12w\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12q\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12r\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12q\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12p\n\x0bisUserExist\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a/.org.apache.custos.iam.service.CheckingResponse\x12n\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12n\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\x12q\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x13grantAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14removeAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x83\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\x12|\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12n\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x13\x64\x65leteRolesFromUser\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x11updateUserProfile\x12\x37.org.apache.custos.iam.service.UpdateUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x91\x01\n\x14getOperationMetadata\x12;.org.apache.custos.iam.service.GetOperationsMetadataRequest\x1a<.org.apache.custos.iam.service.GetOperationsMetadataResponse\x12\x83\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x0c\x63reateGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12n\n\x0bupdateGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0b\x64\x65leteGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12l\n\tfindGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0cgetAllGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12x\n\x0e\x61\x64\x64UserToGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x13removeUserFromGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12{\n\x11\x63reateAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12z\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14isAgentNameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12o\n\x0b\x64\x65leteAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x62\n\x08getAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a$.org.apache.custos.iam.service.Agent\x12p\n\x0c\x64isableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12o\n\x0b\x65nableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x82\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x10\x64\x65leteAgentRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x0fgetAllResources\x12..org.apache.custos.iam.service.GetAllResources\x1a\x36.org.apache.custos.iam.service.GetAllResourcesResponseB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x15IamAdminService.proto\x12\x1dorg.apache.custos.iam.service\x1a\x1bgoogle/protobuf/empty.proto\"\x90\x02\n\x12SetUpTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0btenant_name\x18\x02 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x03 \x01(\t\x12\x17\n\x0f\x61\x64min_firstname\x18\x04 \x01(\t\x12\x16\n\x0e\x61\x64min_lastname\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x06 \x01(\t\x12\x16\n\x0e\x61\x64min_password\x18\x07 \x01(\t\x12\x12\n\ntenant_uRL\x18\x08 \x01(\t\x12\x17\n\x0frequester_email\x18\t \x01(\t\x12\x15\n\rredirect_uRIs\x18\n \x03(\t\x12\x18\n\x10\x63ustos_client_id\x18\x0b \x01(\t\"\xdc\x02\n\x1b\x43onfigureFederateIDPRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.org.apache.custos.iam.service.FederatedIDPs\x12\x11\n\tclient_iD\x18\x03 \x01(\t\x12\x12\n\nclient_sec\x18\x04 \x01(\t\x12]\n\nconfig_map\x18\x05 \x03(\x0b\x32I.org.apache.custos.iam.service.ConfigureFederateIDPRequest.ConfigMapEntry\x12\x17\n\x0frequester_email\x18\x06 \x01(\t\x12\x0e\n\x06idp_id\x18\x07 \x01(\t\x12\r\n\x05scope\x18\x08 \x01(\t\x1a\x30\n\x0e\x43onfigMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"%\n\x13\x46\x65\x64\x65rateIDPResponse\x12\x0e\n\x06status\x18\x01 \x01(\x08\"?\n\x13SetUpTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\"X\n\x1aIsUsernameAvailableRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tuser_name\x18\x03 \x01(\t\"$\n\x10\x43heckingResponse\x12\x10\n\x08is_exist\x18\x01 \x01(\x08\"\xc0\x02\n\x12UserRepresentation\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x12\n\nfirst_name\x18\x04 \x01(\t\x12\x11\n\tlast_name\x18\x05 \x01(\t\x12\x10\n\x08password\x18\x06 \x01(\t\x12\r\n\x05\x65mail\x18\x07 \x01(\t\x12\x1a\n\x12temporary_password\x18\x08 \x01(\x08\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\n \x03(\t\x12@\n\nattributes\x18\x0b \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05state\x18\x0c \x01(\t\x12\x15\n\rcreation_time\x18\r \x01(\x01\x12\x15\n\rlast_login_at\x18\x0e \x01(\x01\"\xcc\x02\n\x13GroupRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12@\n\nattributes\x18\x05 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12@\n\x05users\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x46\n\nsub_groups\x18\x07 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x0f\n\x07ownerId\x18\t \x01(\t\"\xbc\x01\n\x13RegisterUserRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tclient_id\x18\x03 \x01(\t\x12\x12\n\nclient_sec\x18\x04 \x01(\t\x12?\n\x04user\x18\x05 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"\xaa\x01\n\x14RegisterUsersRequest\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0cperformed_by\x18\x05 \x01(\t\"-\n\x14RegisterUserResponse\x12\x15\n\ris_registered\x18\x01 \x01(\x08\"\x7f\n\x15RegisterUsersResponse\x12\x1d\n\x15\x61ll_useres_registered\x18\x01 \x01(\x08\x12G\n\x0c\x66\x61iled_users\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"h\n\x12UserSearchMetadata\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x12\n\nfirst_name\x18\x02 \x01(\t\x12\x11\n\tlast_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\n\n\x02id\x18\x05 \x01(\t\"\xc2\x01\n\x10\x46indUsersRequest\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\xba\x01\n\x11UserSearchRequest\x12?\n\x04user\x18\x01 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserSearchMetadata\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x12\n\nclient_sec\x18\x05 \x01(\t\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"U\n\x11\x46indUsersResponse\x12@\n\x05users\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x87\x01\n\x11ResetUserPassword\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x12\n\nclient_sec\x18\x06 \x01(\t\"\xad\x01\n\x16\x44\x65leteUserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x14\n\x0c\x63lient_roles\x18\x03 \x03(\t\x12\r\n\x05roles\x18\x04 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\n\n\x02id\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41\x64\x64UserRolesRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tusernames\x18\x02 \x03(\t\x12\r\n\x05roles\x18\x03 \x03(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63lient_level\x18\x06 \x01(\x08\x12\x14\n\x0cperformed_by\x18\x07 \x01(\t\x12\x0e\n\x06\x61gents\x18\x08 \x03(\t\"\x84\x01\n\x18UpdateUserProfileRequest\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12?\n\x04user\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation\"\x1f\n\x0f\x41\x64\x64UserResponse\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\"0\n\x1cGetOperationsMetadataRequest\x12\x10\n\x08trace_id\x18\x01 \x01(\x03\"\\\n\x11OperationMetadata\x12\r\n\x05\x65vent\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\x12\n\ntime_stamp\x18\x03 \x01(\t\x12\x14\n\x0cperformed_by\x18\x04 \x01(\t\"c\n\x1dGetOperationsMetadataResponse\x12\x42\n\x08metadata\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.iam.service.OperationMetadata\"(\n\x13\x44\x65leteTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"\x8f\x01\n\x0f\x41\x64\x64RolesRequest\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\x14\n\x0c\x63lient_level\x18\x02 \x01(\x08\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\"M\n\x0fGetRolesRequest\x12\x14\n\x0c\x63lient_level\x18\x01 \x01(\x08\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t\"V\n\x12RoleRepresentation\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x11\n\tcomposite\x18\x03 \x01(\x08\x12\n\n\x02id\x18\x04 \x01(\t\"\x90\x01\n\x11\x44\x65leteRoleRequest\x12\x14\n\x0c\x63lient_level\x18\x01 \x01(\x08\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t\x12?\n\x04role\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\"[\n\x08\x41llRoles\x12@\n\x05roles\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.iam.service.RoleRepresentation\x12\r\n\x05scope\x18\x02 \x01(\t\"\x88\x03\n\x18\x41\x64\x64ProtocolMapperRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x16\n\x0e\x61ttribute_name\x18\x02 \x01(\t\x12\x12\n\nclaim_name\x18\x03 \x01(\t\x12\x41\n\nclaim_type\x18\x04 \x01(\x0e\x32-.org.apache.custos.iam.service.ClaimJSONTypes\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12\x11\n\tclient_id\x18\x07 \x01(\t\x12?\n\x0bmapper_type\x18\x08 \x01(\x0e\x32*.org.apache.custos.iam.service.MapperTypes\x12\x17\n\x0f\x61\x64\x64_to_id_token\x18\t \x01(\x08\x12\x1b\n\x13\x61\x64\x64_to_access_token\x18\n \x01(\x08\x12\x18\n\x10\x61\x64\x64_to_user_info\x18\x0b \x01(\x08\x12\x14\n\x0cmulti_valued\x18\x0c \x01(\x08\x12\"\n\x1a\x61ggregate_attribute_values\x18\r \x01(\x08\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\xcc\x01\n\x18\x41\x64\x64UserAttributesRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\"\xce\x01\n\x1a\x44\x65leteUserAttributeRequest\x12@\n\nattributes\x18\x01 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\r\n\x05users\x18\x02 \x03(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x0e\n\x06\x61gents\x18\x07 \x03(\t\",\n\rUserAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0e\n\x06values\x18\x02 \x03(\t\"\x8e\x01\n\x17\x45ventPersistenceRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x64min_event\x18\x02 \x01(\x08\x12\r\n\x05\x65vent\x18\x03 \x01(\t\x12\x0e\n\x06\x65nable\x18\x04 \x01(\x08\x12\x18\n\x10persistence_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"\xb4\x01\n\rGroupsRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x42\n\x06groups\x18\x06 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xbe\x01\n\x0cGroupRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\n\n\x02id\x18\x06 \x01(\t\x12\x41\n\x05group\x18\x07 \x01(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"T\n\x0eGroupsResponse\x12\x42\n\x06groups\x18\x01 \x03(\x0b\x32\x32.org.apache.custos.iam.service.GroupRepresentation\"\xb7\x01\n\x17UserGroupMappingRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\x12\x10\n\x08group_id\x18\x07 \x01(\t\x12\x17\n\x0fmembership_type\x18\x08 \x01(\t\"\xaf\x01\n\x13\x41gentClientMetadata\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x11\n\ttenantURL\x18\x02 \x01(\t\x12\x14\n\x0credirectURIs\x18\x03 \x03(\t\x12\x12\n\nclientName\x18\x04 \x01(\t\x12\x1e\n\x16\x61\x63\x63\x65ss_token_life_time\x18\x05 \x01(\x03\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x07 \x01(\t\"\xc4\x01\n\x05\x41gent\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0brealm_roles\x18\x02 \x03(\t\x12@\n\nattributes\x18\x03 \x03(\x0b\x32,.org.apache.custos.iam.service.UserAttribute\x12\x11\n\tisEnabled\x18\x04 \x01(\x08\x12\x15\n\rcreation_time\x18\x05 \x01(\x01\x12\x18\n\x10last_modified_at\x18\x06 \x01(\x01\x12\x14\n\x0c\x63lient_roles\x18\x07 \x03(\t\"z\n\x0fGetAllResources\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x43\n\rresource_type\x18\x03 \x01(\x0e\x32,.org.apache.custos.iam.service.ResourceTypes\"\x91\x01\n\x17GetAllResourcesResponse\x12\x34\n\x06\x61gents\x18\x01 \x03(\x0b\x32$.org.apache.custos.iam.service.Agent\x12@\n\x05users\x18\x02 \x03(\x0b\x32\x31.org.apache.custos.iam.service.UserRepresentation*b\n\rFederatedIDPs\x12\x0b\n\x07\x43ILOGON\x10\x00\x12\x0c\n\x08\x46\x41\x43\x45\x42OOK\x10\x01\x12\n\n\x06GOOGLE\x10\x02\x12\x0c\n\x08LINKEDIN\x10\x03\x12\x0b\n\x07TWITTER\x10\x04\x12\x0f\n\x0b\x43USTOM_OIDC\x10\x05*L\n\x0bMapperTypes\x12\x12\n\x0eUSER_ATTRIBUTE\x10\x00\x12\x13\n\x0fUSER_REALM_ROLE\x10\x01\x12\x14\n\x10USER_CLIENT_ROLE\x10\x02*J\n\x0e\x43laimJSONTypes\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04LONG\x10\x01\x12\x0b\n\x07INTEGER\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x08\n\x04JSON\x10\x04*$\n\rResourceTypes\x12\x08\n\x04USER\x10\x00\x12\t\n\x05\x41GENT\x10\x01\x32\xf1,\n\x0fIamAdminService\x12t\n\x0bsetUPTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12u\n\x0cupdateTenant\x12\x31.org.apache.custos.iam.service.SetUpTenantRequest\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12Z\n\x0c\x64\x65leteTenant\x12\x32.org.apache.custos.iam.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\x12\x87\x01\n\x15\x63onfigureFederatedIDP\x12:.org.apache.custos.iam.service.ConfigureFederateIDPRequest\x1a\x32.org.apache.custos.iam.service.FederateIDPResponse\x12k\n\x10\x61\x64\x64RolesToTenant\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12|\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x10getRolesOfTenant\x12..org.apache.custos.iam.service.GetRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\x12n\n\ndeleteRole\x12\x30.org.apache.custos.iam.service.DeleteRoleRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12q\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12r\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12q\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12p\n\x0bisUserExist\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a/.org.apache.custos.iam.service.CheckingResponse\x12n\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\x12n\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\x12q\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\x12w\n\x13grantAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14removeAdminPrivilege\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x83\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\x12|\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12n\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x13\x64\x65leteRolesFromUser\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12|\n\x11updateUserProfile\x12\x37.org.apache.custos.iam.service.UpdateUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x91\x01\n\x14getOperationMetadata\x12;.org.apache.custos.iam.service.GetOperationsMetadataRequest\x1a<.org.apache.custos.iam.service.GetOperationsMetadataResponse\x12\x83\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12k\n\x0c\x63reateGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12n\n\x0bupdateGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0b\x64\x65leteGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12l\n\tfindGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\x12j\n\x0cgetAllGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\x12x\n\x0e\x61\x64\x64UserToGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x13removeUserFromGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12{\n\x11\x63reateAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a\x32.org.apache.custos.iam.service.SetUpTenantResponse\x12z\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\x12x\n\x14isAgentNameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x81\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\x12o\n\x0b\x64\x65leteAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x62\n\x08getAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a$.org.apache.custos.iam.service.Agent\x12p\n\x0c\x64isableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12o\n\x0b\x65nableAgent\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12}\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12\x82\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12u\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x10\x64\x65leteAgentRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\x12y\n\x0fgetAllResources\x12..org.apache.custos.iam.service.GetAllResources\x1a\x36.org.apache.custos.iam.service.GetAllResourcesResponseB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
@@ -65,8 +83,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6345,
-  serialized_end=6443,
+  serialized_start=6554,
+  serialized_end=6652,
 )
 _sym_db.RegisterEnumDescriptor(_FEDERATEDIDPS)
 
@@ -96,8 +114,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6445,
-  serialized_end=6521,
+  serialized_start=6654,
+  serialized_end=6730,
 )
 _sym_db.RegisterEnumDescriptor(_MAPPERTYPES)
 
@@ -137,8 +155,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6523,
-  serialized_end=6597,
+  serialized_start=6732,
+  serialized_end=6806,
 )
 _sym_db.RegisterEnumDescriptor(_CLAIMJSONTYPES)
 
@@ -163,8 +181,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=6599,
-  serialized_end=6635,
+  serialized_start=6808,
+  serialized_end=6844,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCETYPES)
 
@@ -197,77 +215,77 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantName', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenantName', index=1,
+      name='tenant_name', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='adminUsername', full_name='org.apache.custos.iam.service.SetUpTenantRequest.adminUsername', index=2,
+      name='admin_username', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_username', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='adminFirstname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.adminFirstname', index=3,
+      name='admin_firstname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_firstname', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='adminLastname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.adminLastname', index=4,
+      name='admin_lastname', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_lastname', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='adminEmail', full_name='org.apache.custos.iam.service.SetUpTenantRequest.adminEmail', index=5,
+      name='admin_email', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_email', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='adminPassword', full_name='org.apache.custos.iam.service.SetUpTenantRequest.adminPassword', index=6,
+      name='admin_password', full_name='org.apache.custos.iam.service.SetUpTenantRequest.admin_password', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantURL', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenantURL', index=7,
+      name='tenant_uRL', full_name='org.apache.custos.iam.service.SetUpTenantRequest.tenant_uRL', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='requesterEmail', full_name='org.apache.custos.iam.service.SetUpTenantRequest.requesterEmail', index=8,
+      name='requester_email', full_name='org.apache.custos.iam.service.SetUpTenantRequest.requester_email', index=8,
       number=9, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='redirectURIs', full_name='org.apache.custos.iam.service.SetUpTenantRequest.redirectURIs', index=9,
+      name='redirect_uRIs', full_name='org.apache.custos.iam.service.SetUpTenantRequest.redirect_uRIs', index=9,
       number=10, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='custosClientId', full_name='org.apache.custos.iam.service.SetUpTenantRequest.custosClientId', index=10,
+      name='custos_client_id', full_name='org.apache.custos.iam.service.SetUpTenantRequest.custos_client_id', index=10,
       number=11, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -286,7 +304,7 @@
   oneofs=[
   ],
   serialized_start=86,
-  serialized_end=346,
+  serialized_end=358,
 )
 
 
@@ -324,8 +342,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=643,
-  serialized_end=691,
+  serialized_start=661,
+  serialized_end=709,
 )
 
 _CONFIGUREFEDERATEIDPREQUEST = _descriptor.Descriptor(
@@ -337,7 +355,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -351,35 +369,35 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientID', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.clientID', index=2,
+      name='client_iD', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.client_iD', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSec', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.clientSec', index=3,
+      name='client_sec', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.client_sec', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='configMap', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.configMap', index=4,
+      name='config_map', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.config_map', index=4,
       number=5, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='requesterEmail', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.requesterEmail', index=5,
+      name='requester_email', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.requester_email', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='idpId', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.idpId', index=6,
+      name='idp_id', full_name='org.apache.custos.iam.service.ConfigureFederateIDPRequest.idp_id', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -404,8 +422,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=349,
-  serialized_end=691,
+  serialized_start=361,
+  serialized_end=709,
 )
 
 
@@ -436,8 +454,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=693,
-  serialized_end=730,
+  serialized_start=711,
+  serialized_end=748,
 )
 
 
@@ -450,14 +468,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.iam.service.SetUpTenantResponse.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.iam.service.SetUpTenantResponse.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.iam.service.SetUpTenantResponse.clientSecret', index=1,
+      name='client_secret', full_name='org.apache.custos.iam.service.SetUpTenantResponse.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -475,8 +493,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=732,
-  serialized_end=793,
+  serialized_start=750,
+  serialized_end=813,
 )
 
 
@@ -489,21 +507,21 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.accessToken', index=1,
+      name='access_token', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.access_token', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='userName', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.userName', index=2,
+      name='user_name', full_name='org.apache.custos.iam.service.IsUsernameAvailableRequest.user_name', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -521,8 +539,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=795,
-  serialized_end=880,
+  serialized_start=815,
+  serialized_end=903,
 )
 
 
@@ -553,8 +571,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=882,
-  serialized_end=918,
+  serialized_start=905,
+  serialized_end=941,
 )
 
 
@@ -669,8 +687,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=921,
-  serialized_end=1241,
+  serialized_start=944,
+  serialized_end=1264,
 )
 
 
@@ -757,8 +775,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1244,
-  serialized_end=1576,
+  serialized_start=1267,
+  serialized_end=1599,
 )
 
 
@@ -771,28 +789,28 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.RegisterUserRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.iam.service.RegisterUserRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.RegisterUserRequest.accessToken', index=1,
+      name='access_token', full_name='org.apache.custos.iam.service.RegisterUserRequest.access_token', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.iam.service.RegisterUserRequest.clientId', index=2,
+      name='client_id', full_name='org.apache.custos.iam.service.RegisterUserRequest.client_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSec', full_name='org.apache.custos.iam.service.RegisterUserRequest.clientSec', index=3,
+      name='client_sec', full_name='org.apache.custos.iam.service.RegisterUserRequest.client_sec', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -806,7 +824,7 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.iam.service.RegisterUserRequest.performedBy', index=5,
+      name='performed_by', full_name='org.apache.custos.iam.service.RegisterUserRequest.performed_by', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -824,8 +842,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1579,
-  serialized_end=1762,
+  serialized_start=1602,
+  serialized_end=1790,
 )
 
 
@@ -845,28 +863,28 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.RegisterUsersRequest.tenantId', index=1,
+      name='tenant_id', full_name='org.apache.custos.iam.service.RegisterUsersRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.RegisterUsersRequest.accessToken', index=2,
+      name='access_token', full_name='org.apache.custos.iam.service.RegisterUsersRequest.access_token', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.iam.service.RegisterUsersRequest.clientId', index=3,
+      name='client_id', full_name='org.apache.custos.iam.service.RegisterUsersRequest.client_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.iam.service.RegisterUsersRequest.performedBy', index=4,
+      name='performed_by', full_name='org.apache.custos.iam.service.RegisterUsersRequest.performed_by', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -884,8 +902,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1765,
-  serialized_end=1931,
+  serialized_start=1793,
+  serialized_end=1963,
 )
 
 
@@ -916,8 +934,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1933,
-  serialized_end=1978,
+  serialized_start=1965,
+  serialized_end=2010,
 )
 
 
@@ -930,14 +948,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='allUseresRegistered', full_name='org.apache.custos.iam.service.RegisterUsersResponse.allUseresRegistered', index=0,
+      name='all_useres_registered', full_name='org.apache.custos.iam.service.RegisterUsersResponse.all_useres_registered', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='failedUsers', full_name='org.apache.custos.iam.service.RegisterUsersResponse.failedUsers', index=1,
+      name='failed_users', full_name='org.apache.custos.iam.service.RegisterUsersResponse.failed_users', index=1,
       number=2, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -955,8 +973,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1980,
-  serialized_end=2104,
+  serialized_start=2012,
+  serialized_end=2139,
 )
 
 
@@ -1015,8 +1033,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2106,
-  serialized_end=2210,
+  serialized_start=2141,
+  serialized_end=2245,
 )
 
 
@@ -1050,14 +1068,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.FindUsersRequest.tenantId', index=3,
+      name='tenant_id', full_name='org.apache.custos.iam.service.FindUsersRequest.tenant_id', index=3,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.FindUsersRequest.accessToken', index=4,
+      name='access_token', full_name='org.apache.custos.iam.service.FindUsersRequest.access_token', index=4,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -1089,8 +1107,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2213,
-  serialized_end=2405,
+  serialized_start=2248,
+  serialized_end=2442,
 )
 
 
@@ -1110,14 +1128,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.UserSearchRequest.tenantId', index=1,
+      name='tenant_id', full_name='org.apache.custos.iam.service.UserSearchRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.UserSearchRequest.accessToken', index=2,
+      name='access_token', full_name='org.apache.custos.iam.service.UserSearchRequest.access_token', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -1138,7 +1156,7 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.iam.service.UserSearchRequest.performedBy', index=5,
+      name='performed_by', full_name='org.apache.custos.iam.service.UserSearchRequest.performed_by', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -1156,8 +1174,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2408,
-  serialized_end=2591,
+  serialized_start=2445,
+  serialized_end=2631,
 )
 
 
@@ -1188,8 +1206,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2593,
-  serialized_end=2678,
+  serialized_start=2633,
+  serialized_end=2718,
 )
 
 
@@ -1216,28 +1234,28 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.ResetUserPassword.tenantId', index=2,
+      name='tenant_id', full_name='org.apache.custos.iam.service.ResetUserPassword.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.ResetUserPassword.accessToken', index=3,
+      name='access_token', full_name='org.apache.custos.iam.service.ResetUserPassword.access_token', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.iam.service.ResetUserPassword.clientId', index=4,
+      name='client_id', full_name='org.apache.custos.iam.service.ResetUserPassword.client_id', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSec', full_name='org.apache.custos.iam.service.ResetUserPassword.clientSec', index=5,
+      name='client_sec', full_name='org.apache.custos.iam.service.ResetUserPassword.client_sec', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -1255,8 +1273,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2681,
-  serialized_end=2812,
+  serialized_start=2721,
+  serialized_end=2856,
 )
 
 
@@ -1336,8 +1354,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2815,
-  serialized_end=2988,
+  serialized_start=2859,
+  serialized_end=3032,
 )
 
 
@@ -1417,8 +1435,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2991,
-  serialized_end=3166,
+  serialized_start=3035,
+  serialized_end=3210,
 )
 
 
@@ -1431,14 +1449,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.accessToken', index=0,
+      name='access_token', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.access_token', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.tenantId', index=1,
+      name='tenant_id', full_name='org.apache.custos.iam.service.UpdateUserProfileRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -1463,8 +1481,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3169,
-  serialized_end=3299,
+  serialized_start=3213,
+  serialized_end=3345,
 )
 
 
@@ -1495,8 +1513,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3301,
-  serialized_end=3332,
+  serialized_start=3347,
+  serialized_end=3378,
 )
 
 
@@ -1509,7 +1527,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='traceId', full_name='org.apache.custos.iam.service.GetOperationsMetadataRequest.traceId', index=0,
+      name='trace_id', full_name='org.apache.custos.iam.service.GetOperationsMetadataRequest.trace_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -1527,8 +1545,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3334,
-  serialized_end=3381,
+  serialized_start=3380,
+  serialized_end=3428,
 )
 
 
@@ -1555,14 +1573,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='timeStamp', full_name='org.apache.custos.iam.service.OperationMetadata.timeStamp', index=2,
+      name='time_stamp', full_name='org.apache.custos.iam.service.OperationMetadata.time_stamp', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.iam.service.OperationMetadata.performedBy', index=3,
+      name='performed_by', full_name='org.apache.custos.iam.service.OperationMetadata.performed_by', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -1580,8 +1598,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3383,
-  serialized_end=3473,
+  serialized_start=3430,
+  serialized_end=3522,
 )
 
 
@@ -1612,8 +1630,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3475,
-  serialized_end=3574,
+  serialized_start=3524,
+  serialized_end=3623,
 )
 
 
@@ -1626,7 +1644,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.iam.service.DeleteTenantRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteTenantRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -1644,8 +1662,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3576,
-  serialized_end=3615,
+  serialized_start=3625,
+  serialized_end=3665,
 )
 
 
@@ -1697,8 +1715,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3618,
-  serialized_end=3761,
+  serialized_start=3668,
+  serialized_end=3811,
 )
 
 
@@ -1743,8 +1761,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3763,
-  serialized_end=3840,
+  serialized_start=3813,
+  serialized_end=3890,
 )
 
 
@@ -1777,6 +1795,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.iam.service.RoleRepresentation.id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -1789,8 +1814,61 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3842,
-  serialized_end=3916,
+  serialized_start=3892,
+  serialized_end=3978,
+)
+
+
+_DELETEROLEREQUEST = _descriptor.Descriptor(
+  name='DeleteRoleRequest',
+  full_name='org.apache.custos.iam.service.DeleteRoleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_level', full_name='org.apache.custos.iam.service.DeleteRoleRequest.client_level', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.iam.service.DeleteRoleRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.iam.service.DeleteRoleRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='org.apache.custos.iam.service.DeleteRoleRequest.role', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3981,
+  serialized_end=4125,
 )
 
 
@@ -1828,8 +1906,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3918,
-  serialized_end=4009,
+  serialized_start=4127,
+  serialized_end=4218,
 )
 
 
@@ -1937,8 +2015,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4012,
-  serialized_end=4404,
+  serialized_start=4221,
+  serialized_end=4613,
 )
 
 
@@ -1969,8 +2047,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4406,
-  serialized_end=4439,
+  serialized_start=4615,
+  serialized_end=4648,
 )
 
 
@@ -2043,8 +2121,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4442,
-  serialized_end=4646,
+  serialized_start=4651,
+  serialized_end=4855,
 )
 
 
@@ -2117,8 +2195,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4649,
-  serialized_end=4855,
+  serialized_start=4858,
+  serialized_end=5064,
 )
 
 
@@ -2156,8 +2234,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4857,
-  serialized_end=4901,
+  serialized_start=5066,
+  serialized_end=5110,
 )
 
 
@@ -2223,8 +2301,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=4904,
-  serialized_end=5046,
+  serialized_start=5113,
+  serialized_end=5255,
 )
 
 
@@ -2290,8 +2368,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5049,
-  serialized_end=5229,
+  serialized_start=5258,
+  serialized_end=5438,
 )
 
 
@@ -2364,8 +2442,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5232,
-  serialized_end=5422,
+  serialized_start=5441,
+  serialized_end=5631,
 )
 
 
@@ -2396,8 +2474,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5424,
-  serialized_end=5508,
+  serialized_start=5633,
+  serialized_end=5717,
 )
 
 
@@ -2477,8 +2555,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5511,
-  serialized_end=5694,
+  serialized_start=5720,
+  serialized_end=5903,
 )
 
 
@@ -2551,8 +2629,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5697,
-  serialized_end=5872,
+  serialized_start=5906,
+  serialized_end=6081,
 )
 
 
@@ -2625,8 +2703,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=5875,
-  serialized_end=6071,
+  serialized_start=6084,
+  serialized_end=6280,
 )
 
 
@@ -2671,8 +2749,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6073,
-  serialized_end=6195,
+  serialized_start=6282,
+  serialized_end=6404,
 )
 
 
@@ -2710,26 +2788,27 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=6198,
-  serialized_end=6343,
+  serialized_start=6407,
+  serialized_end=6552,
 )
 
 _CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY.containing_type = _CONFIGUREFEDERATEIDPREQUEST
 _CONFIGUREFEDERATEIDPREQUEST.fields_by_name['type'].enum_type = _FEDERATEDIDPS
-_CONFIGUREFEDERATEIDPREQUEST.fields_by_name['configMap'].message_type = _CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY
+_CONFIGUREFEDERATEIDPREQUEST.fields_by_name['config_map'].message_type = _CONFIGUREFEDERATEIDPREQUEST_CONFIGMAPENTRY
 _USERREPRESENTATION.fields_by_name['attributes'].message_type = _USERATTRIBUTE
 _GROUPREPRESENTATION.fields_by_name['attributes'].message_type = _USERATTRIBUTE
 _GROUPREPRESENTATION.fields_by_name['users'].message_type = _USERREPRESENTATION
 _GROUPREPRESENTATION.fields_by_name['sub_groups'].message_type = _GROUPREPRESENTATION
 _REGISTERUSERREQUEST.fields_by_name['user'].message_type = _USERREPRESENTATION
 _REGISTERUSERSREQUEST.fields_by_name['users'].message_type = _USERREPRESENTATION
-_REGISTERUSERSRESPONSE.fields_by_name['failedUsers'].message_type = _USERREPRESENTATION
+_REGISTERUSERSRESPONSE.fields_by_name['failed_users'].message_type = _USERREPRESENTATION
 _FINDUSERSREQUEST.fields_by_name['user'].message_type = _USERSEARCHMETADATA
 _USERSEARCHREQUEST.fields_by_name['user'].message_type = _USERSEARCHMETADATA
 _FINDUSERSRESPONSE.fields_by_name['users'].message_type = _USERREPRESENTATION
 _UPDATEUSERPROFILEREQUEST.fields_by_name['user'].message_type = _USERREPRESENTATION
 _GETOPERATIONSMETADATARESPONSE.fields_by_name['metadata'].message_type = _OPERATIONMETADATA
 _ADDROLESREQUEST.fields_by_name['roles'].message_type = _ROLEREPRESENTATION
+_DELETEROLEREQUEST.fields_by_name['role'].message_type = _ROLEREPRESENTATION
 _ALLROLES.fields_by_name['roles'].message_type = _ROLEREPRESENTATION
 _ADDPROTOCOLMAPPERREQUEST.fields_by_name['claim_type'].enum_type = _CLAIMJSONTYPES
 _ADDPROTOCOLMAPPERREQUEST.fields_by_name['mapper_type'].enum_type = _MAPPERTYPES
@@ -2770,6 +2849,7 @@
 DESCRIPTOR.message_types_by_name['AddRolesRequest'] = _ADDROLESREQUEST
 DESCRIPTOR.message_types_by_name['GetRolesRequest'] = _GETROLESREQUEST
 DESCRIPTOR.message_types_by_name['RoleRepresentation'] = _ROLEREPRESENTATION
+DESCRIPTOR.message_types_by_name['DeleteRoleRequest'] = _DELETEROLEREQUEST
 DESCRIPTOR.message_types_by_name['AllRoles'] = _ALLROLES
 DESCRIPTOR.message_types_by_name['AddProtocolMapperRequest'] = _ADDPROTOCOLMAPPERREQUEST
 DESCRIPTOR.message_types_by_name['OperationStatus'] = _OPERATIONSTATUS
@@ -2995,6 +3075,13 @@
   })
 _sym_db.RegisterMessage(RoleRepresentation)
 
+DeleteRoleRequest = _reflection.GeneratedProtocolMessageType('DeleteRoleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEROLEREQUEST,
+  '__module__' : 'IamAdminService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.iam.service.DeleteRoleRequest)
+  })
+_sym_db.RegisterMessage(DeleteRoleRequest)
+
 AllRoles = _reflection.GeneratedProtocolMessageType('AllRoles', (_message.Message,), {
   'DESCRIPTOR' : _ALLROLES,
   '__module__' : 'IamAdminService_pb2'
@@ -3111,8 +3198,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=6638,
-  serialized_end=12271,
+  serialized_start=6847,
+  serialized_end=12592,
   methods=[
   _descriptor.MethodDescriptor(
     name='setUPTenant',
@@ -3185,9 +3272,19 @@
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
+    name='deleteRole',
+    full_name='org.apache.custos.iam.service.IamAdminService.deleteRole',
+    index=7,
+    containing_service=None,
+    input_type=_DELETEROLEREQUEST,
+    output_type=_OPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
     name='isUsernameAvailable',
     full_name='org.apache.custos.iam.service.IamAdminService.isUsernameAvailable',
-    index=7,
+    index=8,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3197,7 +3294,7 @@
   _descriptor.MethodDescriptor(
     name='registerUser',
     full_name='org.apache.custos.iam.service.IamAdminService.registerUser',
-    index=8,
+    index=9,
     containing_service=None,
     input_type=_REGISTERUSERREQUEST,
     output_type=_REGISTERUSERRESPONSE,
@@ -3207,7 +3304,7 @@
   _descriptor.MethodDescriptor(
     name='enableUser',
     full_name='org.apache.custos.iam.service.IamAdminService.enableUser',
-    index=9,
+    index=10,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_USERREPRESENTATION,
@@ -3217,7 +3314,7 @@
   _descriptor.MethodDescriptor(
     name='disableUser',
     full_name='org.apache.custos.iam.service.IamAdminService.disableUser',
-    index=10,
+    index=11,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_USERREPRESENTATION,
@@ -3227,7 +3324,7 @@
   _descriptor.MethodDescriptor(
     name='isUserEnabled',
     full_name='org.apache.custos.iam.service.IamAdminService.isUserEnabled',
-    index=11,
+    index=12,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3237,7 +3334,7 @@
   _descriptor.MethodDescriptor(
     name='isUserExist',
     full_name='org.apache.custos.iam.service.IamAdminService.isUserExist',
-    index=12,
+    index=13,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_CHECKINGRESPONSE,
@@ -3247,7 +3344,7 @@
   _descriptor.MethodDescriptor(
     name='getUser',
     full_name='org.apache.custos.iam.service.IamAdminService.getUser',
-    index=13,
+    index=14,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_USERREPRESENTATION,
@@ -3257,7 +3354,7 @@
   _descriptor.MethodDescriptor(
     name='findUsers',
     full_name='org.apache.custos.iam.service.IamAdminService.findUsers',
-    index=14,
+    index=15,
     containing_service=None,
     input_type=_FINDUSERSREQUEST,
     output_type=_FINDUSERSRESPONSE,
@@ -3267,7 +3364,7 @@
   _descriptor.MethodDescriptor(
     name='resetPassword',
     full_name='org.apache.custos.iam.service.IamAdminService.resetPassword',
-    index=15,
+    index=16,
     containing_service=None,
     input_type=_RESETUSERPASSWORD,
     output_type=_OPERATIONSTATUS,
@@ -3277,7 +3374,7 @@
   _descriptor.MethodDescriptor(
     name='grantAdminPrivilege',
     full_name='org.apache.custos.iam.service.IamAdminService.grantAdminPrivilege',
-    index=16,
+    index=17,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3287,7 +3384,7 @@
   _descriptor.MethodDescriptor(
     name='removeAdminPrivilege',
     full_name='org.apache.custos.iam.service.IamAdminService.removeAdminPrivilege',
-    index=17,
+    index=18,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3297,7 +3394,7 @@
   _descriptor.MethodDescriptor(
     name='registerAndEnableUsers',
     full_name='org.apache.custos.iam.service.IamAdminService.registerAndEnableUsers',
-    index=18,
+    index=19,
     containing_service=None,
     input_type=_REGISTERUSERSREQUEST,
     output_type=_REGISTERUSERSRESPONSE,
@@ -3307,7 +3404,7 @@
   _descriptor.MethodDescriptor(
     name='addUserAttributes',
     full_name='org.apache.custos.iam.service.IamAdminService.addUserAttributes',
-    index=19,
+    index=20,
     containing_service=None,
     input_type=_ADDUSERATTRIBUTESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3317,7 +3414,7 @@
   _descriptor.MethodDescriptor(
     name='deleteUserAttributes',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteUserAttributes',
-    index=20,
+    index=21,
     containing_service=None,
     input_type=_DELETEUSERATTRIBUTEREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3327,7 +3424,7 @@
   _descriptor.MethodDescriptor(
     name='addRolesToUsers',
     full_name='org.apache.custos.iam.service.IamAdminService.addRolesToUsers',
-    index=21,
+    index=22,
     containing_service=None,
     input_type=_ADDUSERROLESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3337,7 +3434,7 @@
   _descriptor.MethodDescriptor(
     name='deleteUser',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteUser',
-    index=22,
+    index=23,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3347,7 +3444,7 @@
   _descriptor.MethodDescriptor(
     name='deleteRolesFromUser',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteRolesFromUser',
-    index=23,
+    index=24,
     containing_service=None,
     input_type=_DELETEUSERROLESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3357,7 +3454,7 @@
   _descriptor.MethodDescriptor(
     name='updateUserProfile',
     full_name='org.apache.custos.iam.service.IamAdminService.updateUserProfile',
-    index=24,
+    index=25,
     containing_service=None,
     input_type=_UPDATEUSERPROFILEREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3367,7 +3464,7 @@
   _descriptor.MethodDescriptor(
     name='getOperationMetadata',
     full_name='org.apache.custos.iam.service.IamAdminService.getOperationMetadata',
-    index=25,
+    index=26,
     containing_service=None,
     input_type=_GETOPERATIONSMETADATAREQUEST,
     output_type=_GETOPERATIONSMETADATARESPONSE,
@@ -3377,7 +3474,7 @@
   _descriptor.MethodDescriptor(
     name='configureEventPersistence',
     full_name='org.apache.custos.iam.service.IamAdminService.configureEventPersistence',
-    index=26,
+    index=27,
     containing_service=None,
     input_type=_EVENTPERSISTENCEREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3387,7 +3484,7 @@
   _descriptor.MethodDescriptor(
     name='createGroups',
     full_name='org.apache.custos.iam.service.IamAdminService.createGroups',
-    index=27,
+    index=28,
     containing_service=None,
     input_type=_GROUPSREQUEST,
     output_type=_GROUPSRESPONSE,
@@ -3397,7 +3494,7 @@
   _descriptor.MethodDescriptor(
     name='updateGroup',
     full_name='org.apache.custos.iam.service.IamAdminService.updateGroup',
-    index=28,
+    index=29,
     containing_service=None,
     input_type=_GROUPREQUEST,
     output_type=_GROUPREPRESENTATION,
@@ -3407,7 +3504,7 @@
   _descriptor.MethodDescriptor(
     name='deleteGroup',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteGroup',
-    index=29,
+    index=30,
     containing_service=None,
     input_type=_GROUPREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3417,7 +3514,7 @@
   _descriptor.MethodDescriptor(
     name='findGroup',
     full_name='org.apache.custos.iam.service.IamAdminService.findGroup',
-    index=30,
+    index=31,
     containing_service=None,
     input_type=_GROUPREQUEST,
     output_type=_GROUPREPRESENTATION,
@@ -3427,7 +3524,7 @@
   _descriptor.MethodDescriptor(
     name='getAllGroups',
     full_name='org.apache.custos.iam.service.IamAdminService.getAllGroups',
-    index=31,
+    index=32,
     containing_service=None,
     input_type=_GROUPREQUEST,
     output_type=_GROUPSRESPONSE,
@@ -3437,7 +3534,7 @@
   _descriptor.MethodDescriptor(
     name='addUserToGroup',
     full_name='org.apache.custos.iam.service.IamAdminService.addUserToGroup',
-    index=32,
+    index=33,
     containing_service=None,
     input_type=_USERGROUPMAPPINGREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3447,7 +3544,7 @@
   _descriptor.MethodDescriptor(
     name='removeUserFromGroup',
     full_name='org.apache.custos.iam.service.IamAdminService.removeUserFromGroup',
-    index=33,
+    index=34,
     containing_service=None,
     input_type=_USERGROUPMAPPINGREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3457,7 +3554,7 @@
   _descriptor.MethodDescriptor(
     name='createAgentClient',
     full_name='org.apache.custos.iam.service.IamAdminService.createAgentClient',
-    index=34,
+    index=35,
     containing_service=None,
     input_type=_AGENTCLIENTMETADATA,
     output_type=_SETUPTENANTRESPONSE,
@@ -3467,7 +3564,7 @@
   _descriptor.MethodDescriptor(
     name='configureAgentClient',
     full_name='org.apache.custos.iam.service.IamAdminService.configureAgentClient',
-    index=35,
+    index=36,
     containing_service=None,
     input_type=_AGENTCLIENTMETADATA,
     output_type=_OPERATIONSTATUS,
@@ -3477,7 +3574,7 @@
   _descriptor.MethodDescriptor(
     name='isAgentNameAvailable',
     full_name='org.apache.custos.iam.service.IamAdminService.isAgentNameAvailable',
-    index=36,
+    index=37,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3487,7 +3584,7 @@
   _descriptor.MethodDescriptor(
     name='registerAndEnableAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.registerAndEnableAgent',
-    index=37,
+    index=38,
     containing_service=None,
     input_type=_REGISTERUSERREQUEST,
     output_type=_REGISTERUSERRESPONSE,
@@ -3497,7 +3594,7 @@
   _descriptor.MethodDescriptor(
     name='deleteAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteAgent',
-    index=38,
+    index=39,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3507,7 +3604,7 @@
   _descriptor.MethodDescriptor(
     name='getAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.getAgent',
-    index=39,
+    index=40,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_AGENT,
@@ -3517,7 +3614,7 @@
   _descriptor.MethodDescriptor(
     name='disableAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.disableAgent',
-    index=40,
+    index=41,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3527,7 +3624,7 @@
   _descriptor.MethodDescriptor(
     name='enableAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.enableAgent',
-    index=41,
+    index=42,
     containing_service=None,
     input_type=_USERSEARCHREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3537,7 +3634,7 @@
   _descriptor.MethodDescriptor(
     name='addAgentAttributes',
     full_name='org.apache.custos.iam.service.IamAdminService.addAgentAttributes',
-    index=42,
+    index=43,
     containing_service=None,
     input_type=_ADDUSERATTRIBUTESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3547,7 +3644,7 @@
   _descriptor.MethodDescriptor(
     name='deleteAgentAttributes',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteAgentAttributes',
-    index=43,
+    index=44,
     containing_service=None,
     input_type=_DELETEUSERATTRIBUTEREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3557,7 +3654,7 @@
   _descriptor.MethodDescriptor(
     name='addRolesToAgent',
     full_name='org.apache.custos.iam.service.IamAdminService.addRolesToAgent',
-    index=44,
+    index=45,
     containing_service=None,
     input_type=_ADDUSERROLESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3567,7 +3664,7 @@
   _descriptor.MethodDescriptor(
     name='deleteAgentRoles',
     full_name='org.apache.custos.iam.service.IamAdminService.deleteAgentRoles',
-    index=45,
+    index=46,
     containing_service=None,
     input_type=_DELETEUSERROLESREQUEST,
     output_type=_OPERATIONSTATUS,
@@ -3577,7 +3674,7 @@
   _descriptor.MethodDescriptor(
     name='getAllResources',
     full_name='org.apache.custos.iam.service.IamAdminService.getAllResources',
-    index=46,
+    index=47,
     containing_service=None,
     input_type=_GETALLRESOURCES,
     output_type=_GETALLRESOURCESRESPONSE,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2_grpc.py
index 36e8812..8a23ea4 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/IamAdminService_pb2_grpc.py
@@ -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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
@@ -50,6 +67,11 @@
                 request_serializer=IamAdminService__pb2.GetRolesRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.AllRoles.FromString,
                 )
+        self.deleteRole = channel.unary_unary(
+                '/org.apache.custos.iam.service.IamAdminService/deleteRole',
+                request_serializer=IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
         self.isUsernameAvailable = channel.unary_unary(
                 '/org.apache.custos.iam.service.IamAdminService/isUsernameAvailable',
                 request_serializer=IamAdminService__pb2.UserSearchRequest.SerializeToString,
@@ -297,6 +319,12 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def deleteRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def isUsernameAvailable(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -575,6 +603,11 @@
                     request_deserializer=IamAdminService__pb2.GetRolesRequest.FromString,
                     response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
             ),
+            'deleteRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRole,
+                    request_deserializer=IamAdminService__pb2.DeleteRoleRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
             'isUsernameAvailable': grpc.unary_unary_rpc_method_handler(
                     servicer.isUsernameAvailable,
                     request_deserializer=IamAdminService__pb2.UserSearchRequest.FromString,
@@ -905,6 +938,23 @@
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def deleteRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.iam.service.IamAdminService/deleteRole',
+            IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def isUsernameAvailable(request,
             target,
             options=(),
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2.py
index fced1b5..53e0fa4 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: IdentityService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -18,8 +36,9 @@
   name='IdentityService.proto',
   package='org.apache.custos.identity.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x15IdentityService.proto\x12\"org.apache.custos.identity.service\x1a\x1cgoogle/protobuf/struct.proto\"[\n\tAuthToken\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x01 \x01(\t\x12\x39\n\x06\x63laims\x18\x02 \x03(\x0b\x32).org.apache.custos.identity.service.Claim\"#\n\x05\x43laim\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"r\n\x04User\x12\x0b\n\x03sub\x18\x01 \x01(\t\x12\x10\n\x08\x66ullName\x18\x02 \x01(\t\x12\x11\n\tfirstName\x18\x03 \x01(\t\x12\x10\n\x08lastName\x18\x04 \x01(\t\x12\x14\n\x0c\x65mailAddress\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\"\xc1\x01\n\x0fGetTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x0c\n\x04\x63ode\x18\x06 \x01(\t\x12\x10\n\x08username\x18\x07 \x01(\t\x12\x10\n\x08password\x18\x08 \x01(\t\x12\x15\n\rrefresh_token\x18\t \x01(\t\x12\x12\n\ngrant_type\x18\n \x01(\t\"\xd3\x01\n\rTokenResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x12\n\nexpires_in\x18\x02 \x01(\x01\x12\x1a\n\x12refresh_expires_in\x18\x03 \x01(\x01\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\x12\x12\n\ntoken_type\x18\x05 \x01(\t\x12\x10\n\x08id_token\x18\x06 \x01(\t\x12\x19\n\x11not_before_policy\x18\x07 \x01(\x01\x12\x15\n\rsession_state\x18\x08 \x01(\t\x12\r\n\x05scope\x18\t \x01(\t\"u\n\x15\x41uthenticationRequest\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x02 \x01(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\"/\n\x16IsAuthenticateResponse\x12\x15\n\rauthenticated\x18\x01 \x01(\x08\"[\n\x1fGetUserManagementSATokenRequest\x12\x10\n\x08\x63lientId\x18\x01 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x02 \x01(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\"3\n\x1fGetAuthorizationEndpointRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"6\n\x15\x41uthorizationResponse\x12\x1d\n\x15\x61uthorizationEndpoint\x18\x02 \x01(\t\"S\n\x14GetOIDCConfiguration\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"M\n\x0eGetJWKSRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"g\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\x32\x9d\n\n\x0fIdentityService\x12x\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12{\n\x0eisAuthenticate\x12-.org.apache.custos.identity.service.AuthToken\x1a:.org.apache.custos.identity.service.IsAuthenticateResponse\x12\x62\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\x12\xa0\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12X\n\x08getToken\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12\x96\x01\n\x14getAuthorizeEndpoint\x12\x43.org.apache.custos.identity.service.GetAuthorizationEndpointRequest\x1a\x39.org.apache.custos.identity.service.AuthorizationResponse\x12i\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\x12k\n\x1bgetTokenByPasswordGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12o\n\x1fgetTokenByRefreshTokenGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12V\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\x12x\n\nendSession\x12\x35.org.apache.custos.identity.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatusB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15IdentityService.proto\x12\"org.apache.custos.identity.service\x1a\x1cgoogle/protobuf/struct.proto\"\\\n\tAuthToken\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x39\n\x06\x63laims\x18\x02 \x03(\x0b\x32).org.apache.custos.identity.service.Claim\"#\n\x05\x43laim\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"v\n\x04User\x12\x0b\n\x03sub\x18\x01 \x01(\t\x12\x11\n\tfull_name\x18\x02 \x01(\t\x12\x12\n\nfirst_name\x18\x03 \x01(\t\x12\x11\n\tlast_name\x18\x04 \x01(\t\x12\x15\n\remail_address\x18\x05 \x01(\t\x12\x10\n\x08username\x18\x06 \x01(\t\"\xc1\x01\n\x0fGetTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x0c\n\x04\x63ode\x18\x06 \x01(\t\x12\x10\n\x08username\x18\x07 \x01(\t\x12\x10\n\x08password\x18\x08 \x01(\t\x12\x15\n\rrefresh_token\x18\t \x01(\t\x12\x12\n\ngrant_type\x18\n \x01(\t\"\xd3\x01\n\rTokenResponse\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x12\n\nexpires_in\x18\x02 \x01(\x01\x12\x1a\n\x12refresh_expires_in\x18\x03 \x01(\x01\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\x12\x12\n\ntoken_type\x18\x05 \x01(\t\x12\x10\n\x08id_token\x18\x06 \x01(\t\x12\x19\n\x11not_before_policy\x18\x07 \x01(\x01\x12\x15\n\rsession_state\x18\x08 \x01(\t\x12\r\n\x05scope\x18\t \x01(\t\"x\n\x15\x41uthenticationRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\"0\n\x17IsAuthenticatedResponse\x12\x15\n\rauthenticated\x18\x01 \x01(\x08\"^\n\x1fGetUserManagementSATokenRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"4\n\x1fGetAuthorizationEndpointRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"7\n\x15\x41uthorizationResponse\x12\x1e\n\x16\x61uthorization_endpoint\x18\x02 \x01(\t\"S\n\x14GetOIDCConfiguration\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"M\n\x0eGetJWKSRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\"g\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x15\n\rrefresh_token\x18\x04 \x01(\t\"!\n\x0fOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\x32\x9f\n\n\x0fIdentityService\x12x\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12}\n\x0fisAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\x12\x62\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\x12\xa0\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\x12X\n\x08getToken\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12\x96\x01\n\x14getAuthorizeEndpoint\x12\x43.org.apache.custos.identity.service.GetAuthorizationEndpointRequest\x1a\x39.org.apache.custos.identity.service.AuthorizationResponse\x12i\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\x12k\n\x1bgetTokenByPasswordGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12o\n\x1fgetTokenByRefreshTokenGrantType\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\x12V\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\x12x\n\nendSession\x12\x35.org.apache.custos.identity.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
@@ -32,21 +51,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.identity.service.AuthToken.accessToken', index=0,
+      name='access_token', full_name='org.apache.custos.identity.service.AuthToken.access_token', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='claims', full_name='org.apache.custos.identity.service.AuthToken.claims', index=1,
       number=2, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -60,7 +80,7 @@
   oneofs=[
   ],
   serialized_start=91,
-  serialized_end=182,
+  serialized_end=183,
 )
 
 
@@ -70,6 +90,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='key', full_name='org.apache.custos.identity.service.Claim.key', index=0,
@@ -77,14 +98,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='value', full_name='org.apache.custos.identity.service.Claim.value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -97,8 +118,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=184,
-  serialized_end=219,
+  serialized_start=185,
+  serialized_end=220,
 )
 
 
@@ -108,6 +129,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='sub', full_name='org.apache.custos.identity.service.User.sub', index=0,
@@ -115,42 +137,42 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='fullName', full_name='org.apache.custos.identity.service.User.fullName', index=1,
+      name='full_name', full_name='org.apache.custos.identity.service.User.full_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='firstName', full_name='org.apache.custos.identity.service.User.firstName', index=2,
+      name='first_name', full_name='org.apache.custos.identity.service.User.first_name', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='lastName', full_name='org.apache.custos.identity.service.User.lastName', index=3,
+      name='last_name', full_name='org.apache.custos.identity.service.User.last_name', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='emailAddress', full_name='org.apache.custos.identity.service.User.emailAddress', index=4,
+      name='email_address', full_name='org.apache.custos.identity.service.User.email_address', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='username', full_name='org.apache.custos.identity.service.User.username', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -163,8 +185,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=221,
-  serialized_end=335,
+  serialized_start=222,
+  serialized_end=340,
 )
 
 
@@ -174,6 +196,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.service.GetTokenRequest.tenant_id', index=0,
@@ -181,63 +204,63 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.service.GetTokenRequest.client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.identity.service.GetTokenRequest.client_secret', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='redirect_uri', full_name='org.apache.custos.identity.service.GetTokenRequest.redirect_uri', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='code', full_name='org.apache.custos.identity.service.GetTokenRequest.code', index=4,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='username', full_name='org.apache.custos.identity.service.GetTokenRequest.username', index=5,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='password', full_name='org.apache.custos.identity.service.GetTokenRequest.password', index=6,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refresh_token', full_name='org.apache.custos.identity.service.GetTokenRequest.refresh_token', index=7,
       number=9, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='grant_type', full_name='org.apache.custos.identity.service.GetTokenRequest.grant_type', index=8,
       number=10, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -250,8 +273,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=338,
-  serialized_end=531,
+  serialized_start=343,
+  serialized_end=536,
 )
 
 
@@ -261,6 +284,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='access_token', full_name='org.apache.custos.identity.service.TokenResponse.access_token', index=0,
@@ -268,63 +292,63 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='expires_in', full_name='org.apache.custos.identity.service.TokenResponse.expires_in', index=1,
       number=2, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refresh_expires_in', full_name='org.apache.custos.identity.service.TokenResponse.refresh_expires_in', index=2,
       number=3, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refresh_token', full_name='org.apache.custos.identity.service.TokenResponse.refresh_token', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='token_type', full_name='org.apache.custos.identity.service.TokenResponse.token_type', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='id_token', full_name='org.apache.custos.identity.service.TokenResponse.id_token', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='not_before_policy', full_name='org.apache.custos.identity.service.TokenResponse.not_before_policy', index=6,
       number=7, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='session_state', full_name='org.apache.custos.identity.service.TokenResponse.session_state', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.identity.service.TokenResponse.scope', index=8,
       number=9, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -337,8 +361,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=534,
-  serialized_end=745,
+  serialized_start=539,
+  serialized_end=750,
 )
 
 
@@ -348,42 +372,43 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.identity.service.AuthenticationRequest.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.identity.service.AuthenticationRequest.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.identity.service.AuthenticationRequest.clientSecret', index=1,
+      name='client_secret', full_name='org.apache.custos.identity.service.AuthenticationRequest.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.identity.service.AuthenticationRequest.tenantId', index=2,
+      name='tenant_id', full_name='org.apache.custos.identity.service.AuthenticationRequest.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='username', full_name='org.apache.custos.identity.service.AuthenticationRequest.username', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='password', full_name='org.apache.custos.identity.service.AuthenticationRequest.password', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -396,25 +421,26 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=747,
-  serialized_end=864,
+  serialized_start=752,
+  serialized_end=872,
 )
 
 
-_ISAUTHENTICATERESPONSE = _descriptor.Descriptor(
-  name='IsAuthenticateResponse',
-  full_name='org.apache.custos.identity.service.IsAuthenticateResponse',
+_ISAUTHENTICATEDRESPONSE = _descriptor.Descriptor(
+  name='IsAuthenticatedResponse',
+  full_name='org.apache.custos.identity.service.IsAuthenticatedResponse',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='authenticated', full_name='org.apache.custos.identity.service.IsAuthenticateResponse.authenticated', index=0,
+      name='authenticated', full_name='org.apache.custos.identity.service.IsAuthenticatedResponse.authenticated', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -427,8 +453,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=866,
-  serialized_end=913,
+  serialized_start=874,
+  serialized_end=922,
 )
 
 
@@ -438,28 +464,29 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.clientId', index=0,
+      name='client_id', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.clientSecret', index=1,
+      name='client_secret', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.tenantId', index=2,
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetUserManagementSATokenRequest.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -472,8 +499,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=915,
-  serialized_end=1006,
+  serialized_start=924,
+  serialized_end=1018,
 )
 
 
@@ -483,14 +510,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.identity.service.GetAuthorizationEndpointRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.identity.service.GetAuthorizationEndpointRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -503,8 +531,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1008,
-  serialized_end=1059,
+  serialized_start=1020,
+  serialized_end=1072,
 )
 
 
@@ -514,14 +542,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='authorizationEndpoint', full_name='org.apache.custos.identity.service.AuthorizationResponse.authorizationEndpoint', index=0,
+      name='authorization_endpoint', full_name='org.apache.custos.identity.service.AuthorizationResponse.authorization_endpoint', index=0,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -534,8 +563,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1061,
-  serialized_end=1115,
+  serialized_start=1074,
+  serialized_end=1129,
 )
 
 
@@ -545,6 +574,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.client_id', index=0,
@@ -552,21 +582,21 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.service.GetOIDCConfiguration.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -579,8 +609,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1117,
-  serialized_end=1200,
+  serialized_start=1131,
+  serialized_end=1214,
 )
 
 
@@ -590,6 +620,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.service.GetJWKSRequest.client_id', index=0,
@@ -597,21 +628,21 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.identity.service.GetJWKSRequest.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.service.GetJWKSRequest.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -624,8 +655,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1202,
-  serialized_end=1279,
+  serialized_start=1216,
+  serialized_end=1293,
 )
 
 
@@ -635,6 +666,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.service.EndSessionRequest.client_id', index=0,
@@ -642,28 +674,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.identity.service.EndSessionRequest.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.service.EndSessionRequest.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refresh_token', full_name='org.apache.custos.identity.service.EndSessionRequest.refresh_token', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -676,8 +708,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1281,
-  serialized_end=1384,
+  serialized_start=1295,
+  serialized_end=1398,
 )
 
 
@@ -687,6 +719,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.identity.service.OperationStatus.status', index=0,
@@ -694,7 +727,7 @@
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -707,8 +740,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1386,
-  serialized_end=1419,
+  serialized_start=1400,
+  serialized_end=1433,
 )
 
 _AUTHTOKEN.fields_by_name['claims'].message_type = _CLAIM
@@ -718,7 +751,7 @@
 DESCRIPTOR.message_types_by_name['GetTokenRequest'] = _GETTOKENREQUEST
 DESCRIPTOR.message_types_by_name['TokenResponse'] = _TOKENRESPONSE
 DESCRIPTOR.message_types_by_name['AuthenticationRequest'] = _AUTHENTICATIONREQUEST
-DESCRIPTOR.message_types_by_name['IsAuthenticateResponse'] = _ISAUTHENTICATERESPONSE
+DESCRIPTOR.message_types_by_name['IsAuthenticatedResponse'] = _ISAUTHENTICATEDRESPONSE
 DESCRIPTOR.message_types_by_name['GetUserManagementSATokenRequest'] = _GETUSERMANAGEMENTSATOKENREQUEST
 DESCRIPTOR.message_types_by_name['GetAuthorizationEndpointRequest'] = _GETAUTHORIZATIONENDPOINTREQUEST
 DESCRIPTOR.message_types_by_name['AuthorizationResponse'] = _AUTHORIZATIONRESPONSE
@@ -770,12 +803,12 @@
   })
 _sym_db.RegisterMessage(AuthenticationRequest)
 
-IsAuthenticateResponse = _reflection.GeneratedProtocolMessageType('IsAuthenticateResponse', (_message.Message,), {
-  'DESCRIPTOR' : _ISAUTHENTICATERESPONSE,
+IsAuthenticatedResponse = _reflection.GeneratedProtocolMessageType('IsAuthenticatedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ISAUTHENTICATEDRESPONSE,
   '__module__' : 'IdentityService_pb2'
-  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.IsAuthenticateResponse)
+  # @@protoc_insertion_point(class_scope:org.apache.custos.identity.service.IsAuthenticatedResponse)
   })
-_sym_db.RegisterMessage(IsAuthenticateResponse)
+_sym_db.RegisterMessage(IsAuthenticatedResponse)
 
 GetUserManagementSATokenRequest = _reflection.GeneratedProtocolMessageType('GetUserManagementSATokenRequest', (_message.Message,), {
   'DESCRIPTOR' : _GETUSERMANAGEMENTSATOKENREQUEST,
@@ -835,8 +868,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=1422,
-  serialized_end=2731,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1436,
+  serialized_end=2747,
   methods=[
   _descriptor.MethodDescriptor(
     name='authenticate',
@@ -846,15 +880,17 @@
     input_type=_AUTHENTICATIONREQUEST,
     output_type=_AUTHTOKEN,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
-    name='isAuthenticate',
-    full_name='org.apache.custos.identity.service.IdentityService.isAuthenticate',
+    name='isAuthenticated',
+    full_name='org.apache.custos.identity.service.IdentityService.isAuthenticated',
     index=1,
     containing_service=None,
     input_type=_AUTHTOKEN,
-    output_type=_ISAUTHENTICATERESPONSE,
+    output_type=_ISAUTHENTICATEDRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getUser',
@@ -864,6 +900,7 @@
     input_type=_AUTHTOKEN,
     output_type=_USER,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getUserManagementServiceAccountAccessToken',
@@ -873,6 +910,7 @@
     input_type=_GETUSERMANAGEMENTSATOKENREQUEST,
     output_type=_AUTHTOKEN,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getToken',
@@ -882,6 +920,7 @@
     input_type=_GETTOKENREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAuthorizeEndpoint',
@@ -891,6 +930,7 @@
     input_type=_GETAUTHORIZATIONENDPOINTREQUEST,
     output_type=_AUTHORIZATIONRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getOIDCConfiguration',
@@ -900,6 +940,7 @@
     input_type=_GETOIDCCONFIGURATION,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTokenByPasswordGrantType',
@@ -909,6 +950,7 @@
     input_type=_GETTOKENREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTokenByRefreshTokenGrantType',
@@ -918,6 +960,7 @@
     input_type=_GETTOKENREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getJWKS',
@@ -927,6 +970,7 @@
     input_type=_GETJWKSREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='endSession',
@@ -936,6 +980,7 @@
     input_type=_ENDSESSIONREQUEST,
     output_type=_OPERATIONSTATUS,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_IDENTITYSERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2_grpc.py
index 7fb16ae..3555342 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/IdentityService_pb2_grpc.py
@@ -1,217 +1,414 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import IdentityService_pb2 as IdentityService__pb2
+import custos.server.core.IdentityService_pb2 as IdentityService__pb2
 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
 
 
 class IdentityServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.authenticate = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/authenticate',
-        request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.AuthToken.FromString,
-        )
-    self.isAuthenticate = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/isAuthenticate',
-        request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-        response_deserializer=IdentityService__pb2.IsAuthenticateResponse.FromString,
-        )
-    self.getUser = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getUser',
-        request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-        response_deserializer=IdentityService__pb2.User.FromString,
-        )
-    self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getUserManagementServiceAccountAccessToken',
-        request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.AuthToken.FromString,
-        )
-    self.getToken = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getToken',
-        request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getAuthorizeEndpoint = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getAuthorizeEndpoint',
-        request_serializer=IdentityService__pb2.GetAuthorizationEndpointRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.AuthorizationResponse.FromString,
-        )
-    self.getOIDCConfiguration = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getOIDCConfiguration',
-        request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getTokenByPasswordGrantType = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getTokenByPasswordGrantType',
-        request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getTokenByRefreshTokenGrantType = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getTokenByRefreshTokenGrantType',
-        request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getJWKS = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/getJWKS',
-        request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.endSession = channel.unary_unary(
-        '/org.apache.custos.identity.service.IdentityService/endSession',
-        request_serializer=IdentityService__pb2.EndSessionRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.OperationStatus.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.authenticate = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/authenticate',
+                request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.isAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/isAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getUser',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.User.FromString,
+                )
+        self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getUserManagementServiceAccountAccessToken',
+                request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.getToken = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getToken',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getAuthorizeEndpoint = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getAuthorizeEndpoint',
+                request_serializer=IdentityService__pb2.GetAuthorizationEndpointRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthorizationResponse.FromString,
+                )
+        self.getOIDCConfiguration = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getOIDCConfiguration',
+                request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getTokenByPasswordGrantType = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getTokenByPasswordGrantType',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getTokenByRefreshTokenGrantType = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getTokenByRefreshTokenGrantType',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getJWKS = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/getJWKS',
+                request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.endSession = channel.unary_unary(
+                '/org.apache.custos.identity.service.IdentityService/endSession',
+                request_serializer=IdentityService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
 
 
 class IdentityServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def authenticate(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def authenticate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def isAuthenticate(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def isAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getUser(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getUserManagementServiceAccountAccessToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getUserManagementServiceAccountAccessToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAuthorizeEndpoint(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAuthorizeEndpoint(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getOIDCConfiguration(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getOIDCConfiguration(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTokenByPasswordGrantType(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTokenByPasswordGrantType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTokenByRefreshTokenGrantType(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTokenByRefreshTokenGrantType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getJWKS(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getJWKS(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def endSession(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def endSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_IdentityServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'authenticate': grpc.unary_unary_rpc_method_handler(
-          servicer.authenticate,
-          request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
-          response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-      ),
-      'isAuthenticate': grpc.unary_unary_rpc_method_handler(
-          servicer.isAuthenticate,
-          request_deserializer=IdentityService__pb2.AuthToken.FromString,
-          response_serializer=IdentityService__pb2.IsAuthenticateResponse.SerializeToString,
-      ),
-      'getUser': grpc.unary_unary_rpc_method_handler(
-          servicer.getUser,
-          request_deserializer=IdentityService__pb2.AuthToken.FromString,
-          response_serializer=IdentityService__pb2.User.SerializeToString,
-      ),
-      'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getUserManagementServiceAccountAccessToken,
-          request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
-          response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-      ),
-      'getToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getToken,
-          request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getAuthorizeEndpoint': grpc.unary_unary_rpc_method_handler(
-          servicer.getAuthorizeEndpoint,
-          request_deserializer=IdentityService__pb2.GetAuthorizationEndpointRequest.FromString,
-          response_serializer=IdentityService__pb2.AuthorizationResponse.SerializeToString,
-      ),
-      'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
-          servicer.getOIDCConfiguration,
-          request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getTokenByPasswordGrantType': grpc.unary_unary_rpc_method_handler(
-          servicer.getTokenByPasswordGrantType,
-          request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getTokenByRefreshTokenGrantType': grpc.unary_unary_rpc_method_handler(
-          servicer.getTokenByRefreshTokenGrantType,
-          request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getJWKS': grpc.unary_unary_rpc_method_handler(
-          servicer.getJWKS,
-          request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'endSession': grpc.unary_unary_rpc_method_handler(
-          servicer.endSession,
-          request_deserializer=IdentityService__pb2.EndSessionRequest.FromString,
-          response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.identity.service.IdentityService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'authenticate': grpc.unary_unary_rpc_method_handler(
+                    servicer.authenticate,
+                    request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'isAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.User.SerializeToString,
+            ),
+            'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserManagementServiceAccountAccessToken,
+                    request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'getToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getToken,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getAuthorizeEndpoint': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAuthorizeEndpoint,
+                    request_deserializer=IdentityService__pb2.GetAuthorizationEndpointRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthorizationResponse.SerializeToString,
+            ),
+            'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOIDCConfiguration,
+                    request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getTokenByPasswordGrantType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTokenByPasswordGrantType,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getTokenByRefreshTokenGrantType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTokenByRefreshTokenGrantType,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getJWKS': grpc.unary_unary_rpc_method_handler(
+                    servicer.getJWKS,
+                    request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'endSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endSession,
+                    request_deserializer=IdentityService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.identity.service.IdentityService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class IdentityService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def authenticate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/authenticate',
+            IdentityService__pb2.AuthenticationRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/isAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getUser',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.User.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserManagementServiceAccountAccessToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getUserManagementServiceAccountAccessToken',
+            IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getToken',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAuthorizeEndpoint(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getAuthorizeEndpoint',
+            IdentityService__pb2.GetAuthorizationEndpointRequest.SerializeToString,
+            IdentityService__pb2.AuthorizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOIDCConfiguration(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getOIDCConfiguration',
+            IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTokenByPasswordGrantType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getTokenByPasswordGrantType',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTokenByRefreshTokenGrantType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getTokenByRefreshTokenGrantType',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getJWKS(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/getJWKS',
+            IdentityService__pb2.GetJWKSRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.service.IdentityService/endSession',
+            IdentityService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2.py
new file mode 100644
index 0000000..6cf3ef4
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2.py
@@ -0,0 +1,402 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: LoggingService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='LoggingService.proto',
+  package='org.apache.custos.logging.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x14LoggingService.proto\x12!org.apache.custos.logging.service\x1a\x1bgoogle/protobuf/empty.proto\"\x97\x01\n\x08LogEvent\x12\x14\n\x0c\x63reated_time\x18\x01 \x01(\x03\x12\x14\n\x0cservice_name\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12\x13\n\x0b\x65xternal_ip\x18\x07 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\xcb\x01\n\x0fLogEventRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x12\n\nstart_time\x18\x02 \x01(\x03\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x10\n\x08username\x18\x05 \x01(\t\x12\x11\n\tremote_ip\x18\x06 \x01(\t\x12\x14\n\x0cservice_name\x18\x07 \x01(\t\x12\x12\n\nevent_type\x18\x08 \x01(\t\x12\x0e\n\x06offset\x18\t \x01(\x05\x12\r\n\x05limit\x18\n \x01(\x05\"H\n\tLogEvents\x12;\n\x06\x65vents\x18\x01 \x03(\x0b\x32+.org.apache.custos.logging.service.LogEvent\"C\n\x1bLoggingConfigurationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t2\xd9\x03\n\x0eLoggingService\x12\x65\n\x0b\x61\x64\x64LogEvent\x12+.org.apache.custos.logging.service.LogEvent\x1a).org.apache.custos.logging.service.Status\x12p\n\x0cgetLogEvents\x12\x32.org.apache.custos.logging.service.LogEventRequest\x1a,.org.apache.custos.logging.service.LogEvents\x12y\n\x0cisLogEnabled\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\x12s\n\x06\x65nable\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_LOGEVENT = _descriptor.Descriptor(
+  name='LogEvent',
+  full_name='org.apache.custos.logging.service.LogEvent',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created_time', full_name='org.apache.custos.logging.service.LogEvent.created_time', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.logging.service.LogEvent.service_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.logging.service.LogEvent.event_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.logging.service.LogEvent.username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LogEvent.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LogEvent.tenant_id', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='external_ip', full_name='org.apache.custos.logging.service.LogEvent.external_ip', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=89,
+  serialized_end=240,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.logging.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.logging.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=242,
+  serialized_end=266,
+)
+
+
+_LOGEVENTREQUEST = _descriptor.Descriptor(
+  name='LogEventRequest',
+  full_name='org.apache.custos.logging.service.LogEventRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LogEventRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='start_time', full_name='org.apache.custos.logging.service.LogEventRequest.start_time', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='end_time', full_name='org.apache.custos.logging.service.LogEventRequest.end_time', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LogEventRequest.client_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.logging.service.LogEventRequest.username', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='remote_ip', full_name='org.apache.custos.logging.service.LogEventRequest.remote_ip', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.logging.service.LogEventRequest.service_name', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.logging.service.LogEventRequest.event_type', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='offset', full_name='org.apache.custos.logging.service.LogEventRequest.offset', index=8,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='limit', full_name='org.apache.custos.logging.service.LogEventRequest.limit', index=9,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=269,
+  serialized_end=472,
+)
+
+
+_LOGEVENTS = _descriptor.Descriptor(
+  name='LogEvents',
+  full_name='org.apache.custos.logging.service.LogEvents',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='events', full_name='org.apache.custos.logging.service.LogEvents.events', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=474,
+  serialized_end=546,
+)
+
+
+_LOGGINGCONFIGURATIONREQUEST = _descriptor.Descriptor(
+  name='LoggingConfigurationRequest',
+  full_name='org.apache.custos.logging.service.LoggingConfigurationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.logging.service.LoggingConfigurationRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.logging.service.LoggingConfigurationRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=548,
+  serialized_end=615,
+)
+
+_LOGEVENTS.fields_by_name['events'].message_type = _LOGEVENT
+DESCRIPTOR.message_types_by_name['LogEvent'] = _LOGEVENT
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['LogEventRequest'] = _LOGEVENTREQUEST
+DESCRIPTOR.message_types_by_name['LogEvents'] = _LOGEVENTS
+DESCRIPTOR.message_types_by_name['LoggingConfigurationRequest'] = _LOGGINGCONFIGURATIONREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+LogEvent = _reflection.GeneratedProtocolMessageType('LogEvent', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENT,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEvent)
+  })
+_sym_db.RegisterMessage(LogEvent)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+LogEventRequest = _reflection.GeneratedProtocolMessageType('LogEventRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENTREQUEST,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEventRequest)
+  })
+_sym_db.RegisterMessage(LogEventRequest)
+
+LogEvents = _reflection.GeneratedProtocolMessageType('LogEvents', (_message.Message,), {
+  'DESCRIPTOR' : _LOGEVENTS,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LogEvents)
+  })
+_sym_db.RegisterMessage(LogEvents)
+
+LoggingConfigurationRequest = _reflection.GeneratedProtocolMessageType('LoggingConfigurationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LOGGINGCONFIGURATIONREQUEST,
+  '__module__' : 'LoggingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.logging.service.LoggingConfigurationRequest)
+  })
+_sym_db.RegisterMessage(LoggingConfigurationRequest)
+
+
+DESCRIPTOR._options = None
+
+_LOGGINGSERVICE = _descriptor.ServiceDescriptor(
+  name='LoggingService',
+  full_name='org.apache.custos.logging.service.LoggingService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=618,
+  serialized_end=1091,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='addLogEvent',
+    full_name='org.apache.custos.logging.service.LoggingService.addLogEvent',
+    index=0,
+    containing_service=None,
+    input_type=_LOGEVENT,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getLogEvents',
+    full_name='org.apache.custos.logging.service.LoggingService.getLogEvents',
+    index=1,
+    containing_service=None,
+    input_type=_LOGEVENTREQUEST,
+    output_type=_LOGEVENTS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isLogEnabled',
+    full_name='org.apache.custos.logging.service.LoggingService.isLogEnabled',
+    index=2,
+    containing_service=None,
+    input_type=_LOGGINGCONFIGURATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.logging.service.LoggingService.enable',
+    index=3,
+    containing_service=None,
+    input_type=_LOGGINGCONFIGURATIONREQUEST,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LOGGINGSERVICE)
+
+DESCRIPTOR.services_by_name['LoggingService'] = _LOGGINGSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2_grpc.py
new file mode 100644
index 0000000..8b44c96
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/LoggingService_pb2_grpc.py
@@ -0,0 +1,165 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+class LoggingServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addLogEvent = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/addLogEvent',
+                request_serializer=LoggingService__pb2.LogEvent.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.getLogEvents = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/getLogEvents',
+                request_serializer=LoggingService__pb2.LogEventRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.LogEvents.FromString,
+                )
+        self.isLogEnabled = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/isLogEnabled',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.logging.service.LoggingService/enable',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+
+
+class LoggingServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def addLogEvent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getLogEvents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isLogEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_LoggingServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'addLogEvent': grpc.unary_unary_rpc_method_handler(
+                    servicer.addLogEvent,
+                    request_deserializer=LoggingService__pb2.LogEvent.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'getLogEvents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getLogEvents,
+                    request_deserializer=LoggingService__pb2.LogEventRequest.FromString,
+                    response_serializer=LoggingService__pb2.LogEvents.SerializeToString,
+            ),
+            'isLogEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isLogEnabled,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.logging.service.LoggingService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class LoggingService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addLogEvent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/addLogEvent',
+            LoggingService__pb2.LogEvent.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getLogEvents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/getLogEvents',
+            LoggingService__pb2.LogEventRequest.SerializeToString,
+            LoggingService__pb2.LogEvents.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isLogEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/isLogEnabled',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.logging.service.LoggingService/enable',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2.py
new file mode 100644
index 0000000..3ad188d
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2.py
@@ -0,0 +1,334 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: MessagingService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='MessagingService.proto',
+  package='org.apache.custos.messaging.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x16MessagingService.proto\x12#org.apache.custos.messaging.service\x1a\x1bgoogle/protobuf/empty.proto\"\x9a\x02\n\x07Message\x12\x14\n\x0c\x63reated_time\x18\x01 \x01(\x03\x12\x14\n\x0cservice_name\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x11\n\tclient_id\x18\x05 \x01(\t\x12\x11\n\ttenant_id\x18\x06 \x01(\x03\x12P\n\nproperties\x18\x07 \x03(\x0b\x32<.org.apache.custos.messaging.service.Message.PropertiesEntry\x12\x12\n\nmessage_id\x18\x08 \x01(\t\x1a\x31\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\">\n\x16MessageEnablingRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"(\n\x17MessageEnablingResponse\x12\r\n\x05topic\x18\x01 \x01(\t2\xfe\x01\n\x10MessagingService\x12\x64\n\x07publish\x12,.org.apache.custos.messaging.service.Message\x1a+.org.apache.custos.messaging.service.Status\x12\x83\x01\n\x06\x65nable\x12;.org.apache.custos.messaging.service.MessageEnablingRequest\x1a<.org.apache.custos.messaging.service.MessageEnablingResponseB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_MESSAGE_PROPERTIESENTRY = _descriptor.Descriptor(
+  name='PropertiesEntry',
+  full_name='org.apache.custos.messaging.service.Message.PropertiesEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.messaging.service.Message.PropertiesEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.messaging.service.Message.PropertiesEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=326,
+  serialized_end=375,
+)
+
+_MESSAGE = _descriptor.Descriptor(
+  name='Message',
+  full_name='org.apache.custos.messaging.service.Message',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created_time', full_name='org.apache.custos.messaging.service.Message.created_time', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_name', full_name='org.apache.custos.messaging.service.Message.service_name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='event_type', full_name='org.apache.custos.messaging.service.Message.event_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='username', full_name='org.apache.custos.messaging.service.Message.username', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.messaging.service.Message.client_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.messaging.service.Message.tenant_id', index=5,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='properties', full_name='org.apache.custos.messaging.service.Message.properties', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='message_id', full_name='org.apache.custos.messaging.service.Message.message_id', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_MESSAGE_PROPERTIESENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=93,
+  serialized_end=375,
+)
+
+
+_MESSAGEENABLINGREQUEST = _descriptor.Descriptor(
+  name='MessageEnablingRequest',
+  full_name='org.apache.custos.messaging.service.MessageEnablingRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.messaging.service.MessageEnablingRequest.tenant_id', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.messaging.service.MessageEnablingRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=377,
+  serialized_end=439,
+)
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='org.apache.custos.messaging.service.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='status', full_name='org.apache.custos.messaging.service.Status.status', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=441,
+  serialized_end=465,
+)
+
+
+_MESSAGEENABLINGRESPONSE = _descriptor.Descriptor(
+  name='MessageEnablingResponse',
+  full_name='org.apache.custos.messaging.service.MessageEnablingResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='topic', full_name='org.apache.custos.messaging.service.MessageEnablingResponse.topic', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=467,
+  serialized_end=507,
+)
+
+_MESSAGE_PROPERTIESENTRY.containing_type = _MESSAGE
+_MESSAGE.fields_by_name['properties'].message_type = _MESSAGE_PROPERTIESENTRY
+DESCRIPTOR.message_types_by_name['Message'] = _MESSAGE
+DESCRIPTOR.message_types_by_name['MessageEnablingRequest'] = _MESSAGEENABLINGREQUEST
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+DESCRIPTOR.message_types_by_name['MessageEnablingResponse'] = _MESSAGEENABLINGRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Message = _reflection.GeneratedProtocolMessageType('Message', (_message.Message,), {
+
+  'PropertiesEntry' : _reflection.GeneratedProtocolMessageType('PropertiesEntry', (_message.Message,), {
+    'DESCRIPTOR' : _MESSAGE_PROPERTIESENTRY,
+    '__module__' : 'MessagingService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Message.PropertiesEntry)
+    })
+  ,
+  'DESCRIPTOR' : _MESSAGE,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Message)
+  })
+_sym_db.RegisterMessage(Message)
+_sym_db.RegisterMessage(Message.PropertiesEntry)
+
+MessageEnablingRequest = _reflection.GeneratedProtocolMessageType('MessageEnablingRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGEENABLINGREQUEST,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.MessageEnablingRequest)
+  })
+_sym_db.RegisterMessage(MessageEnablingRequest)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+MessageEnablingResponse = _reflection.GeneratedProtocolMessageType('MessageEnablingResponse', (_message.Message,), {
+  'DESCRIPTOR' : _MESSAGEENABLINGRESPONSE,
+  '__module__' : 'MessagingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.messaging.service.MessageEnablingResponse)
+  })
+_sym_db.RegisterMessage(MessageEnablingResponse)
+
+
+DESCRIPTOR._options = None
+_MESSAGE_PROPERTIESENTRY._options = None
+
+_MESSAGINGSERVICE = _descriptor.ServiceDescriptor(
+  name='MessagingService',
+  full_name='org.apache.custos.messaging.service.MessagingService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=510,
+  serialized_end=764,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='publish',
+    full_name='org.apache.custos.messaging.service.MessagingService.publish',
+    index=0,
+    containing_service=None,
+    input_type=_MESSAGE,
+    output_type=_STATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.messaging.service.MessagingService.enable',
+    index=1,
+    containing_service=None,
+    input_type=_MESSAGEENABLINGREQUEST,
+    output_type=_MESSAGEENABLINGRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_MESSAGINGSERVICE)
+
+DESCRIPTOR.services_by_name['MessagingService'] = _MESSAGINGSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2_grpc.py
new file mode 100644
index 0000000..e568312
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/MessagingService_pb2_grpc.py
@@ -0,0 +1,99 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
+
+
+class MessagingServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.publish = channel.unary_unary(
+                '/org.apache.custos.messaging.service.MessagingService/publish',
+                request_serializer=MessagingService__pb2.Message.SerializeToString,
+                response_deserializer=MessagingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.messaging.service.MessagingService/enable',
+                request_serializer=MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+                response_deserializer=MessagingService__pb2.MessageEnablingResponse.FromString,
+                )
+
+
+class MessagingServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def publish(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_MessagingServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'publish': grpc.unary_unary_rpc_method_handler(
+                    servicer.publish,
+                    request_deserializer=MessagingService__pb2.Message.FromString,
+                    response_serializer=MessagingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=MessagingService__pb2.MessageEnablingRequest.FromString,
+                    response_serializer=MessagingService__pb2.MessageEnablingResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.messaging.service.MessagingService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class MessagingService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def publish(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.messaging.service.MessagingService/publish',
+            MessagingService__pb2.Message.SerializeToString,
+            MessagingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.messaging.service.MessagingService/enable',
+            MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+            MessagingService__pb2.MessageEnablingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
index ab90d68..06745ec 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
@@ -18,9 +18,9 @@
   name='ResourceSecretService.proto',
   package='org.apache.custos.resource.secret.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1bResourceSecretService.proto\x12)org.apache.custos.resource.secret.service\"\xda\x03\n\x0eSecretMetadata\x12P\n\nowner_type\x18\x01 \x01(\x0e\x32<.org.apache.custos.resource.secret.service.ResourceOwnerType\x12N\n\rresource_type\x18\x02 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12I\n\x06source\x18\x03 \x01(\x0e\x32\x39.org.apache.custos.resource.secret.service.ResourceSource\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12K\n\x04type\x18\x06 \x01(\x0e\x32=.org.apache.custos.resource.secret.service.ResourceSecretType\x12\x10\n\x08tenantId\x18\x07 \x01(\x03\x12\x10\n\x08owner_id\x18\x08 \x01(\t\x12\x16\n\x0epersisted_time\x18\t \x01(\x03\x12\r\n\x05token\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x0b \x01(\t\x12\x11\n\tclient_id\x18\x0c \x01(\t\"\xab\x01\n\x10GetSecretRequest\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x03 \x01(\t\x12\x11\n\tclientSec\x18\x04 \x01(\t\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x05 \x01(\t\"\xc6\x01\n\x15\x43\x65rtificateCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x11\n\tx509_cert\x18\x03 \x01(\t\x12\x11\n\tnot_after\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\x12\x11\n\tlife_time\x18\x06 \x01(\x03\x12\x12\n\nnot_before\x18\x07 \x01(\t\"s\n\x12PasswordCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x10\n\x08password\x18\x03 \x01(\t\"\x99\x01\n\rSSHCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x12\n\npassphrase\x18\x03 \x01(\t\x12\x12\n\npublic_key\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\"o\n#GetResourceCredentialByTokenRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\r\n\x05token\x18\x02 \x01(\t\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"\xd3\x01\n%GetResourceCredentialSummariesRequest\x12\x45\n\x04type\x18\x01 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12\x19\n\x11\x61\x63\x63\x65ssible_tokens\x18\x02 \x03(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x10\n\x08owner_id\x18\x04 \x01(\t\x12\x11\n\tall_types\x18\x05 \x01(\x08\x12\x11\n\tclient_id\x18\x06 \x01(\t\"j\n\x1bResourceCredentialSummaries\x12K\n\x08metadata\x18\x01 \x03(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\".\n\x1d\x41\x64\x64ResourceCredentialResponse\x12\r\n\x05token\x18\x01 \x01(\t\"3\n!ResourceCredentialOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08*<\n\x11ResourceOwnerType\x12\x0f\n\x0bTENANT_USER\x10\x00\x12\n\n\x06\x43USTOS\x10\x01\x12\n\n\x06TENANT\x10\x02*Y\n\x0cResourceType\x12\x16\n\x12SERVER_CERTIFICATE\x10\x00\x12\x1b\n\x17JWT_SIGNING_CERTIFICATE\x10\x01\x12\x14\n\x10VAULT_CREDENTIAL\x10\x02*D\n\x0eResourceSource\x12\x08\n\x04KUBE\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x0c\n\x08\x45XTERNAL\x10\x02\x12\x0f\n\x0bLETSENCRYPT\x10\x03*A\n\x12ResourceSecretType\x12\x07\n\x03SSH\x10\x00\x12\x0c\n\x08PASSWORD\x10\x01\x12\x14\n\x10X509_CERTIFICATE\x10\x02\x32\x8f\x10\n\x15ResourceSecretService\x12\x83\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\xa9\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\xbd\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\x12\x96\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa0\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa6\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\x9c\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\x12\xa6\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\x12\xac\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\x12\xb3\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xb3\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xbb\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatusB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x1bResourceSecretService.proto\x12)org.apache.custos.resource.secret.service\"\xda\x03\n\x0eSecretMetadata\x12P\n\nowner_type\x18\x01 \x01(\x0e\x32<.org.apache.custos.resource.secret.service.ResourceOwnerType\x12N\n\rresource_type\x18\x02 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12I\n\x06source\x18\x03 \x01(\x0e\x32\x39.org.apache.custos.resource.secret.service.ResourceSource\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05 \x01(\t\x12K\n\x04type\x18\x06 \x01(\x0e\x32=.org.apache.custos.resource.secret.service.ResourceSecretType\x12\x10\n\x08tenantId\x18\x07 \x01(\x03\x12\x10\n\x08owner_id\x18\x08 \x01(\t\x12\x16\n\x0epersisted_time\x18\t \x01(\x03\x12\r\n\x05token\x18\n \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x0b \x01(\t\x12\x11\n\tclient_id\x18\x0c \x01(\t\"\xc0\x02\n\x15\x43\x65rtificateCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x11\n\tx509_cert\x18\x03 \x01(\t\x12\x11\n\tnot_after\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\x12\x11\n\tlife_time\x18\x06 \x01(\x03\x12\x12\n\nnot_before\x18\x07 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x08 \x01(\x08\x12\x15\n\rnum_of_shares\x18\t \x01(\x05\x12\x11\n\tthreshold\x18\n \x01(\x05\x12\x1a\n\x12private_key_shares\x18\x0b \x03(\x0c\"\xf8\x01\n\x12PasswordCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x10\n\x08password\x18\x03 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x04 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x05 \x01(\x05\x12\x11\n\tthreshold\x18\x06 \x01(\x05\x12\x15\n\rsecret_shares\x18\x07 \x03(\x0c\x12\x0e\n\x06userId\x18\x08 \x01(\t\"\x93\x02\n\rSSHCredential\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x12\n\npassphrase\x18\x03 \x01(\t\x12\x12\n\npublic_key\x18\x04 \x01(\t\x12\x13\n\x0bprivate_key\x18\x05 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x06 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x07 \x01(\x05\x12\x11\n\tthreshold\x18\x08 \x01(\x05\x12\x1a\n\x12private_key_shares\x18\t \x03(\x0c\"\xcd\x01\n#GetResourceCredentialByTokenRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\r\n\x05token\x18\x02 \x01(\t\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x32\n*use_shamirs_secret_sharing_with_encryption\x18\x05 \x01(\x08\x12\x15\n\rnum_of_shares\x18\x06 \x01(\x05\x12\x11\n\tthreshold\x18\x07 \x01(\x05\"\xd3\x01\n%GetResourceCredentialSummariesRequest\x12\x45\n\x04type\x18\x01 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12\x19\n\x11\x61\x63\x63\x65ssible_tokens\x18\x02 \x03(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x10\n\x08owner_id\x18\x04 \x01(\t\x12\x11\n\tall_types\x18\x05 \x01(\x08\x12\x11\n\tclient_id\x18\x06 \x01(\t\"j\n\x1bResourceCredentialSummaries\x12K\n\x08metadata\x18\x01 \x03(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\".\n\x1d\x41\x64\x64ResourceCredentialResponse\x12\r\n\x05token\x18\x01 \x01(\t\"3\n!ResourceCredentialOperationStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\"\x86\x01\n\x0cKVCredential\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\x12K\n\x08metadata\x18\x03 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\r\n\x05token\x18\x04 \x01(\t\"\x99\x01\n\x10GetSecretRequest\x12K\n\x08metadata\x18\x01 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\xf7\x01\n\rCredentialMap\x12\x63\n\x0e\x63redential_map\x18\x01 \x03(\x0b\x32K.org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry\x12K\n\x08metadata\x18\x02 \x01(\x0b\x32\x39.org.apache.custos.resource.secret.service.SecretMetadata\x1a\x34\n\x12\x43redentialMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*<\n\x11ResourceOwnerType\x12\x0f\n\x0bTENANT_USER\x10\x00\x12\n\n\x06\x43USTOS\x10\x01\x12\n\n\x06TENANT\x10\x02*\xbd\x01\n\x0cResourceType\x12\x16\n\x12SERVER_CERTIFICATE\x10\x00\x12\x1b\n\x17JWT_SIGNING_CERTIFICATE\x10\x01\x12\x14\n\x10VAULT_CREDENTIAL\x10\x02\x12\x06\n\x02VM\x10\x03\x12\x0b\n\x07\x41\x43\x43OUNT\x10\x04\x12\t\n\x05OTHER\x10\x05\x12\x07\n\x03SCP\x10\x06\x12\x06\n\x02S3\x10\x07\x12\x07\n\x03\x42OX\x10\x08\x12\t\n\x05\x41ZURE\x10\t\x12\x07\n\x03GCS\x10\n\x12\x0b\n\x07\x44ROPBOX\x10\x0b\x12\x07\n\x03\x46TP\x10\x0c*D\n\x0eResourceSource\x12\x08\n\x04KUBE\x10\x00\x12\t\n\x05LOCAL\x10\x01\x12\x0c\n\x08\x45XTERNAL\x10\x02\x12\x0f\n\x0bLETSENCRYPT\x10\x03*k\n\x12ResourceSecretType\x12\x07\n\x03SSH\x10\x00\x12\x0c\n\x08PASSWORD\x10\x01\x12\x14\n\x10X509_CERTIFICATE\x10\x02\x12\x0c\n\x08RAW_DATA\x10\x03\x12\x06\n\x02KV\x10\x04\x12\x12\n\x0e\x43REDENTIAL_MAP\x10\x05\x32\xc8\x18\n\x15ResourceSecretService\x12\x83\x01\n\x0fgetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1a\x37.org.apache.custos.resource.secret.service.KVCredential\x12\x98\x01\n\x0fsetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9b\x01\n\x12updateKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9b\x01\n\x12\x64\x65leteKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x86\x01\n\x10getCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1a\x38.org.apache.custos.resource.secret.service.CredentialMap\x12\x96\x01\n\x10setCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\x9d\x01\n\x13updateCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\x9d\x01\n\x13\x64\x65leteCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xa9\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\x12\xbd\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\x12\x96\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa0\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\xa6\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\x12\x9c\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\x12\xa6\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\x12\xac\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\x12\xb3\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xb3\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\x12\xbb\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatusB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _RESOURCEOWNERTYPE = _descriptor.EnumDescriptor(
@@ -48,8 +48,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1735,
-  serialized_end=1795,
+  serialized_start=2577,
+  serialized_end=2637,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCEOWNERTYPE)
 
@@ -76,11 +76,61 @@
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='VM', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACCOUNT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OTHER', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SCP', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='S3', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='BOX', index=8, number=8,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='AZURE', index=9, number=9,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='GCS', index=10, number=10,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DROPBOX', index=11, number=11,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FTP', index=12, number=12,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1797,
-  serialized_end=1886,
+  serialized_start=2640,
+  serialized_end=2829,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCETYPE)
 
@@ -115,8 +165,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1888,
-  serialized_end=1956,
+  serialized_start=2831,
+  serialized_end=2899,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCESOURCE)
 
@@ -143,11 +193,26 @@
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='RAW_DATA', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KV', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CREDENTIAL_MAP', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1958,
-  serialized_end=2023,
+  serialized_start=2901,
+  serialized_end=3008,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCESECRETTYPE)
 
@@ -158,6 +223,16 @@
 SERVER_CERTIFICATE = 0
 JWT_SIGNING_CERTIFICATE = 1
 VAULT_CREDENTIAL = 2
+VM = 3
+ACCOUNT = 4
+OTHER = 5
+SCP = 6
+S3 = 7
+BOX = 8
+AZURE = 9
+GCS = 10
+DROPBOX = 11
+FTP = 12
 KUBE = 0
 LOCAL = 1
 EXTERNAL = 2
@@ -165,6 +240,9 @@
 SSH = 0
 PASSWORD = 1
 X509_CERTIFICATE = 2
+RAW_DATA = 3
+KV = 4
+CREDENTIAL_MAP = 5
 
 
 
@@ -277,66 +355,6 @@
 )
 
 
-_GETSECRETREQUEST = _descriptor.Descriptor(
-  name='GetSecretRequest',
-  full_name='org.apache.custos.resource.secret.service.GetSecretRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='metadata', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.metadata', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.tenantId', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.clientId', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='clientSec', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.clientSec', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.accessToken', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=552,
-  serialized_end=723,
-)
-
-
 _CERTIFICATECREDENTIAL = _descriptor.Descriptor(
   name='CertificateCredential',
   full_name='org.apache.custos.resource.secret.service.CertificateCredential',
@@ -387,6 +405,34 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.CertificateCredential.use_shamirs_secret_sharing_with_encryption', index=6,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.num_of_shares', index=7,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.CertificateCredential.threshold', index=8,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key_shares', index=9,
+      number=11, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -399,8 +445,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=726,
-  serialized_end=924,
+  serialized_start=552,
+  serialized_end=872,
 )
 
 
@@ -426,6 +472,41 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.PasswordCredential.use_shamirs_secret_sharing_with_encryption', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.num_of_shares', index=3,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.PasswordCredential.threshold', index=4,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='secret_shares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.secret_shares', index=5,
+      number=7, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='userId', full_name='org.apache.custos.resource.secret.service.PasswordCredential.userId', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -438,8 +519,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=926,
-  serialized_end=1041,
+  serialized_start=875,
+  serialized_end=1123,
 )
 
 
@@ -479,6 +560,34 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.SSHCredential.use_shamirs_secret_sharing_with_encryption', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.SSHCredential.num_of_shares', index=5,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.SSHCredential.threshold', index=6,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.SSHCredential.private_key_shares', index=7,
+      number=9, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -491,8 +600,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1044,
-  serialized_end=1197,
+  serialized_start=1126,
+  serialized_end=1401,
 )
 
 
@@ -532,6 +641,27 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='use_shamirs_secret_sharing_with_encryption', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.use_shamirs_secret_sharing_with_encryption', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='num_of_shares', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.num_of_shares', index=5,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.threshold', index=6,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -544,8 +674,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1199,
-  serialized_end=1310,
+  serialized_start=1404,
+  serialized_end=1609,
 )
 
 
@@ -611,8 +741,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1313,
-  serialized_end=1524,
+  serialized_start=1612,
+  serialized_end=1823,
 )
 
 
@@ -643,8 +773,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1526,
-  serialized_end=1632,
+  serialized_start=1825,
+  serialized_end=1931,
 )
 
 
@@ -675,8 +805,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1634,
-  serialized_end=1680,
+  serialized_start=1933,
+  serialized_end=1979,
 )
 
 
@@ -707,22 +837,208 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1682,
-  serialized_end=1733,
+  serialized_start=1981,
+  serialized_end=2032,
+)
+
+
+_KVCREDENTIAL = _descriptor.Descriptor(
+  name='KVCredential',
+  full_name='org.apache.custos.resource.secret.service.KVCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.resource.secret.service.KVCredential.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.KVCredential.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.KVCredential.metadata', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.KVCredential.token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2035,
+  serialized_end=2169,
+)
+
+
+_GETSECRETREQUEST = _descriptor.Descriptor(
+  name='GetSecretRequest',
+  full_name='org.apache.custos.resource.secret.service.GetSecretRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2172,
+  serialized_end=2325,
+)
+
+
+_CREDENTIALMAP_CREDENTIALMAPENTRY = _descriptor.Descriptor(
+  name='CredentialMapEntry',
+  full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2523,
+  serialized_end=2575,
+)
+
+_CREDENTIALMAP = _descriptor.Descriptor(
+  name='CredentialMap',
+  full_name='org.apache.custos.resource.secret.service.CredentialMap',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='credential_map', full_name='org.apache.custos.resource.secret.service.CredentialMap.credential_map', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.CredentialMap.metadata', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_CREDENTIALMAP_CREDENTIALMAPENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2328,
+  serialized_end=2575,
 )
 
 _SECRETMETADATA.fields_by_name['owner_type'].enum_type = _RESOURCEOWNERTYPE
 _SECRETMETADATA.fields_by_name['resource_type'].enum_type = _RESOURCETYPE
 _SECRETMETADATA.fields_by_name['source'].enum_type = _RESOURCESOURCE
 _SECRETMETADATA.fields_by_name['type'].enum_type = _RESOURCESECRETTYPE
-_GETSECRETREQUEST.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _CERTIFICATECREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _PASSWORDCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _SSHCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _GETRESOURCECREDENTIALSUMMARIESREQUEST.fields_by_name['type'].enum_type = _RESOURCETYPE
 _RESOURCECREDENTIALSUMMARIES.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_KVCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_GETSECRETREQUEST.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_CREDENTIALMAP_CREDENTIALMAPENTRY.containing_type = _CREDENTIALMAP
+_CREDENTIALMAP.fields_by_name['credential_map'].message_type = _CREDENTIALMAP_CREDENTIALMAPENTRY
+_CREDENTIALMAP.fields_by_name['metadata'].message_type = _SECRETMETADATA
 DESCRIPTOR.message_types_by_name['SecretMetadata'] = _SECRETMETADATA
-DESCRIPTOR.message_types_by_name['GetSecretRequest'] = _GETSECRETREQUEST
 DESCRIPTOR.message_types_by_name['CertificateCredential'] = _CERTIFICATECREDENTIAL
 DESCRIPTOR.message_types_by_name['PasswordCredential'] = _PASSWORDCREDENTIAL
 DESCRIPTOR.message_types_by_name['SSHCredential'] = _SSHCREDENTIAL
@@ -731,6 +1047,9 @@
 DESCRIPTOR.message_types_by_name['ResourceCredentialSummaries'] = _RESOURCECREDENTIALSUMMARIES
 DESCRIPTOR.message_types_by_name['AddResourceCredentialResponse'] = _ADDRESOURCECREDENTIALRESPONSE
 DESCRIPTOR.message_types_by_name['ResourceCredentialOperationStatus'] = _RESOURCECREDENTIALOPERATIONSTATUS
+DESCRIPTOR.message_types_by_name['KVCredential'] = _KVCREDENTIAL
+DESCRIPTOR.message_types_by_name['GetSecretRequest'] = _GETSECRETREQUEST
+DESCRIPTOR.message_types_by_name['CredentialMap'] = _CREDENTIALMAP
 DESCRIPTOR.enum_types_by_name['ResourceOwnerType'] = _RESOURCEOWNERTYPE
 DESCRIPTOR.enum_types_by_name['ResourceType'] = _RESOURCETYPE
 DESCRIPTOR.enum_types_by_name['ResourceSource'] = _RESOURCESOURCE
@@ -744,13 +1063,6 @@
   })
 _sym_db.RegisterMessage(SecretMetadata)
 
-GetSecretRequest = _reflection.GeneratedProtocolMessageType('GetSecretRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETSECRETREQUEST,
-  '__module__' : 'ResourceSecretService_pb2'
-  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetSecretRequest)
-  })
-_sym_db.RegisterMessage(GetSecretRequest)
-
 CertificateCredential = _reflection.GeneratedProtocolMessageType('CertificateCredential', (_message.Message,), {
   'DESCRIPTOR' : _CERTIFICATECREDENTIAL,
   '__module__' : 'ResourceSecretService_pb2'
@@ -807,8 +1119,38 @@
   })
 _sym_db.RegisterMessage(ResourceCredentialOperationStatus)
 
+KVCredential = _reflection.GeneratedProtocolMessageType('KVCredential', (_message.Message,), {
+  'DESCRIPTOR' : _KVCREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.KVCredential)
+  })
+_sym_db.RegisterMessage(KVCredential)
+
+GetSecretRequest = _reflection.GeneratedProtocolMessageType('GetSecretRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSECRETREQUEST,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetSecretRequest)
+  })
+_sym_db.RegisterMessage(GetSecretRequest)
+
+CredentialMap = _reflection.GeneratedProtocolMessageType('CredentialMap', (_message.Message,), {
+
+  'CredentialMapEntry' : _reflection.GeneratedProtocolMessageType('CredentialMapEntry', (_message.Message,), {
+    'DESCRIPTOR' : _CREDENTIALMAP_CREDENTIALMAPENTRY,
+    '__module__' : 'ResourceSecretService_pb2'
+    # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.CredentialMap.CredentialMapEntry)
+    })
+  ,
+  'DESCRIPTOR' : _CREDENTIALMAP,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.CredentialMap)
+  })
+_sym_db.RegisterMessage(CredentialMap)
+_sym_db.RegisterMessage(CredentialMap.CredentialMapEntry)
+
 
 DESCRIPTOR._options = None
+_CREDENTIALMAP_CREDENTIALMAPENTRY._options = None
 
 _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   name='ResourceSecretService',
@@ -817,23 +1159,93 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2026,
-  serialized_end=4089,
+  serialized_start=3011,
+  serialized_end=6155,
   methods=[
   _descriptor.MethodDescriptor(
-    name='getSecret',
-    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getSecret',
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getKVCredential',
     index=0,
     containing_service=None,
-    input_type=_GETSECRETREQUEST,
-    output_type=_SECRETMETADATA,
+    input_type=_KVCREDENTIAL,
+    output_type=_KVCREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='setKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.setKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.updateKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getCredentialMap',
+    index=4,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_CREDENTIALMAP,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='setCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.setCredentialMap',
+    index=5,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.updateCredentialMap',
+    index=6,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCredentialMap',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteCredentialMap',
+    index=7,
+    containing_service=None,
+    input_type=_CREDENTIALMAP,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getResourceCredentialSummary',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getResourceCredentialSummary',
-    index=1,
+    index=8,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_SECRETMETADATA,
@@ -843,7 +1255,7 @@
   _descriptor.MethodDescriptor(
     name='getAllResourceCredentialSummaries',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getAllResourceCredentialSummaries',
-    index=2,
+    index=9,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALSUMMARIESREQUEST,
     output_type=_RESOURCECREDENTIALSUMMARIES,
@@ -853,7 +1265,7 @@
   _descriptor.MethodDescriptor(
     name='addSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addSSHCredential',
-    index=3,
+    index=10,
     containing_service=None,
     input_type=_SSHCREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -863,7 +1275,7 @@
   _descriptor.MethodDescriptor(
     name='addPasswordCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addPasswordCredential',
-    index=4,
+    index=11,
     containing_service=None,
     input_type=_PASSWORDCREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -873,7 +1285,7 @@
   _descriptor.MethodDescriptor(
     name='addCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addCertificateCredential',
-    index=5,
+    index=12,
     containing_service=None,
     input_type=_CERTIFICATECREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -883,7 +1295,7 @@
   _descriptor.MethodDescriptor(
     name='getSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getSSHCredential',
-    index=6,
+    index=13,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_SSHCREDENTIAL,
@@ -893,7 +1305,7 @@
   _descriptor.MethodDescriptor(
     name='getPasswordCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getPasswordCredential',
-    index=7,
+    index=14,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_PASSWORDCREDENTIAL,
@@ -903,7 +1315,7 @@
   _descriptor.MethodDescriptor(
     name='getCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getCertificateCredential',
-    index=8,
+    index=15,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_CERTIFICATECREDENTIAL,
@@ -913,7 +1325,7 @@
   _descriptor.MethodDescriptor(
     name='deleteSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteSSHCredential',
-    index=9,
+    index=16,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
@@ -923,7 +1335,7 @@
   _descriptor.MethodDescriptor(
     name='deletePWDCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deletePWDCredential',
-    index=10,
+    index=17,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
@@ -933,7 +1345,7 @@
   _descriptor.MethodDescriptor(
     name='deleteCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteCertificateCredential',
-    index=11,
+    index=18,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
index cb8bef3..c0ac125 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
@@ -2,7 +2,7 @@
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import ResourceSecretService_pb2 as ResourceSecretService__pb2
+import custos.server.core.ResourceSecretService_pb2 as ResourceSecretService__pb2
 
 
 class ResourceSecretServiceStub(object):
@@ -14,10 +14,45 @@
         Args:
             channel: A grpc.Channel.
         """
-        self.getSecret = channel.unary_unary(
-                '/org.apache.custos.resource.secret.service.ResourceSecretService/getSecret',
-                request_serializer=ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
-                response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.setKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.getCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                )
+        self.setCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/setCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.updateCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/updateCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
                 )
         self.getResourceCredentialSummary = channel.unary_unary(
                 '/org.apache.custos.resource.secret.service.ResourceSecretService/getResourceCredentialSummary',
@@ -79,7 +114,49 @@
 class ResourceSecretServiceServicer(object):
     """Missing associated documentation comment in .proto file."""
 
-    def getSecret(self, request, context):
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCredentialMap(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
@@ -154,10 +231,45 @@
 
 def add_ResourceSecretServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
-            'getSecret': grpc.unary_unary_rpc_method_handler(
-                    servicer.getSecret,
-                    request_deserializer=ResourceSecretService__pb2.GetSecretRequest.FromString,
-                    response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'setKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.setKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'getCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ),
+            'setCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.setCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'updateCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
             ),
             'getResourceCredentialSummary': grpc.unary_unary_rpc_method_handler(
                     servicer.getResourceCredentialSummary,
@@ -225,7 +337,7 @@
     """Missing associated documentation comment in .proto file."""
 
     @staticmethod
-    def getSecret(request,
+    def getKVCredential(request,
             target,
             options=(),
             channel_credentials=None,
@@ -235,9 +347,128 @@
             wait_for_ready=None,
             timeout=None,
             metadata=None):
-        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getSecret',
-            ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
-            ResourceSecretService__pb2.SecretMetadata.FromString,
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.CredentialMap.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/setCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/updateCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2.py
index 0b5327c..4ee6c32 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2.py
@@ -18,9 +18,9 @@
   name='SharingService.proto',
   package='org.apache.custos.sharing.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x14SharingService.proto\x12!org.apache.custos.sharing.service\"c\n\nEntityType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"g\n\x0ePermissionType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"\xf0\x01\n\x06\x45ntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x11\n\tparent_id\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x13\n\x0b\x62inary_data\x18\x07 \x01(\x0c\x12\x11\n\tfull_text\x18\x08 \x01(\t\x12\x1e\n\x16original_creation_time\x18\t \x01(\x03\x12\x12\n\ncreated_at\x18\n \x01(\x03\x12\x12\n\nupdated_at\x18\x0b \x01(\x03\x12\x14\n\x0cshared_count\x18\x0c \x01(\x05\"\x84\x01\n\rEntityRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x91\x01\n\x11\x45ntityTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x42\n\x0b\x65ntity_type\x18\x03 \x01(\x0b\x32-.org.apache.custos.sharing.service.EntityType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x9d\x01\n\x15PermissionTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12J\n\x0fpermission_type\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\xb2\x01\n\x0eSearchCriteria\x12J\n\x0csearch_field\x18\x01 \x01(\x0e\x32\x34.org.apache.custos.sharing.service.EntitySearchField\x12\r\n\x05value\x18\x02 \x01(\t\x12\x45\n\tcondition\x18\x03 \x01(\x0e\x32\x32.org.apache.custos.sharing.service.SearchCondition\"\xdf\x01\n\rSearchRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12J\n\x0fsearch_criteria\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.SearchCriteria\x12\x12\n\nclient_sec\x18\x07 \x01(\t\x12\x17\n\x0f\x61ssociating_ids\x18\x08 \x03(\t\"\xd4\x01\n\x11PermissionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x05 \x01(\t\"\xf4\x01\n\x0eSharingRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"u\n\x16SharesFilteringRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"K\n\x0b\x45ntityTypes\x12<\n\x05types\x18\x01 \x03(\x0b\x32-.org.apache.custos.sharing.service.EntityType\"S\n\x0fPermissionTypes\x12@\n\x05types\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\"K\n\x08\x45ntities\x12?\n\x0c\x65ntity_array\x18\x01 \x03(\x0b\x32).org.apache.custos.sharing.service.Entity\"!\n\x0cSharedOwners\x12\x11\n\towner_ids\x18\x01 \x03(\t*A\n\x0fSearchCondition\x12\t\n\x05\x45QUAL\x10\x00\x12\x08\n\x04LIKE\x10\x01\x12\x07\n\x03GTE\x10\x02\x12\x07\n\x03LTE\x10\x03\x12\x07\n\x03NOT\x10\x04*\xc6\x01\n\x11\x45ntitySearchField\x12\x08\n\x04NAME\x10\x00\x12\x0f\n\x0b\x44\x45SCRIPTION\x10\x01\x12\x06\n\x02ID\x10\x02\x12\r\n\tFULL_TEXT\x10\x03\x12\x0c\n\x08OWNER_ID\x10\x04\x12\x0e\n\nCREATED_AT\x10\x05\x12\x14\n\x10LAST_MODIFIED_AT\x10\x06\x12\x12\n\x0e\x45NTITY_TYPE_ID\x10\x07\x12\r\n\tPARENT_ID\x10\x08\x12\x10\n\x0cSHARED_COUNT\x10\t\x12\x16\n\x12PERMISSION_TYPE_ID\x10\n2\xbd\x17\n\x0eSharingService\x12s\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12t\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\x12r\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\x12{\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12\x80\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\x12z\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\x12k\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12k\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12h\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\x12k\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12o\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\x12z\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x82\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12{\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x83\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12t\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12u\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12|\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12}\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.StatusB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x14SharingService.proto\x12!org.apache.custos.sharing.service\"c\n\nEntityType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"g\n\x0ePermissionType\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x12\n\ncreated_at\x18\x04 \x01(\x03\x12\x12\n\nupdated_at\x18\x05 \x01(\x03\"\xf0\x01\n\x06\x45ntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x11\n\tparent_id\x18\x04 \x01(\t\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x13\n\x0b\x62inary_data\x18\x07 \x01(\x0c\x12\x11\n\tfull_text\x18\x08 \x01(\t\x12\x1e\n\x16original_creation_time\x18\t \x01(\x03\x12\x12\n\ncreated_at\x18\n \x01(\x03\x12\x12\n\nupdated_at\x18\x0b \x01(\x03\x12\x14\n\x0cshared_count\x18\x0c \x01(\x05\"\x84\x01\n\rEntityRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x91\x01\n\x11\x45ntityTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x42\n\x0b\x65ntity_type\x18\x03 \x01(\x0b\x32-.org.apache.custos.sharing.service.EntityType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\x9d\x01\n\x15PermissionTypeRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12J\n\x0fpermission_type\x18\x03 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x04 \x01(\t\"\xb2\x01\n\x0eSearchCriteria\x12J\n\x0csearch_field\x18\x01 \x01(\x0e\x32\x34.org.apache.custos.sharing.service.EntitySearchField\x12\r\n\x05value\x18\x02 \x01(\t\x12\x45\n\tcondition\x18\x03 \x01(\x0e\x32\x32.org.apache.custos.sharing.service.SearchCondition\"\xdf\x01\n\rSearchRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12J\n\x0fsearch_criteria\x18\x06 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.SearchCriteria\x12\x12\n\nclient_sec\x18\x07 \x01(\t\x12\x17\n\x0f\x61ssociating_ids\x18\x08 \x03(\t\"\xd4\x01\n\x11PermissionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x12\n\nclient_sec\x18\x05 \x01(\t\"\xf4\x01\n\x0eSharingRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x39\n\x06\x65ntity\x18\x03 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12J\n\x0fpermission_type\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"u\n\x16SharesFilteringRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0f\n\x07\x63\x61scade\x18\x06 \x01(\x08\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"K\n\x0b\x45ntityTypes\x12<\n\x05types\x18\x01 \x03(\x0b\x32-.org.apache.custos.sharing.service.EntityType\"S\n\x0fPermissionTypes\x12@\n\x05types\x18\x01 \x03(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType\"K\n\x08\x45ntities\x12?\n\x0c\x65ntity_array\x18\x01 \x03(\x0b\x32).org.apache.custos.sharing.service.Entity\"!\n\x0cSharedOwners\x12\x11\n\towner_ids\x18\x01 \x03(\t\"g\n\x1cGetAllDirectSharingsResponse\x12G\n\x0bshared_data\x18\x01 \x03(\x0b\x32\x32.org.apache.custos.sharing.service.SharingMetadata\"\xb9\x01\n\x0fSharingMetadata\x12\x39\n\x06\x65ntity\x18\x01 \x01(\x0b\x32).org.apache.custos.sharing.service.Entity\x12\x10\n\x08owner_id\x18\x02 \x01(\t\x12\x12\n\nowner_type\x18\x03 \x01(\t\x12\x45\n\npermission\x18\x04 \x01(\x0b\x32\x31.org.apache.custos.sharing.service.PermissionType*A\n\x0fSearchCondition\x12\t\n\x05\x45QUAL\x10\x00\x12\x08\n\x04LIKE\x10\x01\x12\x07\n\x03GTE\x10\x02\x12\x07\n\x03LTE\x10\x03\x12\x07\n\x03NOT\x10\x04*\xc6\x01\n\x11\x45ntitySearchField\x12\x08\n\x04NAME\x10\x00\x12\x0f\n\x0b\x44\x45SCRIPTION\x10\x01\x12\x06\n\x02ID\x10\x02\x12\r\n\tFULL_TEXT\x10\x03\x12\x0c\n\x08OWNER_ID\x10\x04\x12\x0e\n\nCREATED_AT\x10\x05\x12\x14\n\x10LAST_MODIFIED_AT\x10\x06\x12\x12\n\x0e\x45NTITY_TYPE_ID\x10\x07\x12\r\n\tPARENT_ID\x10\x08\x12\x10\n\x0cSHARED_COUNT\x10\t\x12\x16\n\x12PERMISSION_TYPE_ID\x10\n2\xca\x18\n\x0eSharingService\x12s\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12s\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12t\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\x12r\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\x12{\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12{\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\x12\x80\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\x12z\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\x12k\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12k\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12h\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\x12k\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\x12o\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\x12z\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x82\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12{\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x83\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\x12\x8a\x01\n\x14getAllDirectSharings\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a?.org.apache.custos.sharing.service.GetAllDirectSharingsResponse\x12t\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12u\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12|\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12}\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\x12m\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _SEARCHCONDITION = _descriptor.EnumDescriptor(
@@ -58,8 +58,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2239,
-  serialized_end=2304,
+  serialized_start=2532,
+  serialized_end=2597,
 )
 _sym_db.RegisterEnumDescriptor(_SEARCHCONDITION)
 
@@ -129,8 +129,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2307,
-  serialized_end=2505,
+  serialized_start=2600,
+  serialized_end=2798,
 )
 _sym_db.RegisterEnumDescriptor(_ENTITYSEARCHFIELD)
 
@@ -1022,6 +1022,91 @@
   serialized_end=2237,
 )
 
+
+_GETALLDIRECTSHARINGSRESPONSE = _descriptor.Descriptor(
+  name='GetAllDirectSharingsResponse',
+  full_name='org.apache.custos.sharing.service.GetAllDirectSharingsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='shared_data', full_name='org.apache.custos.sharing.service.GetAllDirectSharingsResponse.shared_data', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2239,
+  serialized_end=2342,
+)
+
+
+_SHARINGMETADATA = _descriptor.Descriptor(
+  name='SharingMetadata',
+  full_name='org.apache.custos.sharing.service.SharingMetadata',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='entity', full_name='org.apache.custos.sharing.service.SharingMetadata.entity', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='org.apache.custos.sharing.service.SharingMetadata.owner_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_type', full_name='org.apache.custos.sharing.service.SharingMetadata.owner_type', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permission', full_name='org.apache.custos.sharing.service.SharingMetadata.permission', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2345,
+  serialized_end=2530,
+)
+
 _ENTITYREQUEST.fields_by_name['entity'].message_type = _ENTITY
 _ENTITYTYPEREQUEST.fields_by_name['entity_type'].message_type = _ENTITYTYPE
 _PERMISSIONTYPEREQUEST.fields_by_name['permission_type'].message_type = _PERMISSIONTYPE
@@ -1035,6 +1120,9 @@
 _ENTITYTYPES.fields_by_name['types'].message_type = _ENTITYTYPE
 _PERMISSIONTYPES.fields_by_name['types'].message_type = _PERMISSIONTYPE
 _ENTITIES.fields_by_name['entity_array'].message_type = _ENTITY
+_GETALLDIRECTSHARINGSRESPONSE.fields_by_name['shared_data'].message_type = _SHARINGMETADATA
+_SHARINGMETADATA.fields_by_name['entity'].message_type = _ENTITY
+_SHARINGMETADATA.fields_by_name['permission'].message_type = _PERMISSIONTYPE
 DESCRIPTOR.message_types_by_name['EntityType'] = _ENTITYTYPE
 DESCRIPTOR.message_types_by_name['PermissionType'] = _PERMISSIONTYPE
 DESCRIPTOR.message_types_by_name['Entity'] = _ENTITY
@@ -1051,6 +1139,8 @@
 DESCRIPTOR.message_types_by_name['PermissionTypes'] = _PERMISSIONTYPES
 DESCRIPTOR.message_types_by_name['Entities'] = _ENTITIES
 DESCRIPTOR.message_types_by_name['SharedOwners'] = _SHAREDOWNERS
+DESCRIPTOR.message_types_by_name['GetAllDirectSharingsResponse'] = _GETALLDIRECTSHARINGSRESPONSE
+DESCRIPTOR.message_types_by_name['SharingMetadata'] = _SHARINGMETADATA
 DESCRIPTOR.enum_types_by_name['SearchCondition'] = _SEARCHCONDITION
 DESCRIPTOR.enum_types_by_name['EntitySearchField'] = _ENTITYSEARCHFIELD
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
@@ -1167,6 +1257,20 @@
   })
 _sym_db.RegisterMessage(SharedOwners)
 
+GetAllDirectSharingsResponse = _reflection.GeneratedProtocolMessageType('GetAllDirectSharingsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETALLDIRECTSHARINGSRESPONSE,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.GetAllDirectSharingsResponse)
+  })
+_sym_db.RegisterMessage(GetAllDirectSharingsResponse)
+
+SharingMetadata = _reflection.GeneratedProtocolMessageType('SharingMetadata', (_message.Message,), {
+  'DESCRIPTOR' : _SHARINGMETADATA,
+  '__module__' : 'SharingService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.sharing.service.SharingMetadata)
+  })
+_sym_db.RegisterMessage(SharingMetadata)
+
 
 DESCRIPTOR._options = None
 
@@ -1177,8 +1281,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2508,
-  serialized_end=5513,
+  serialized_start=2801,
+  serialized_end=5947,
   methods=[
   _descriptor.MethodDescriptor(
     name='createEntityType',
@@ -1381,9 +1485,19 @@
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
+    name='getAllDirectSharings',
+    full_name='org.apache.custos.sharing.service.SharingService.getAllDirectSharings',
+    index=20,
+    containing_service=None,
+    input_type=_SHARINGREQUEST,
+    output_type=_GETALLDIRECTSHARINGSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
     name='shareEntityWithUsers',
     full_name='org.apache.custos.sharing.service.SharingService.shareEntityWithUsers',
-    index=20,
+    index=21,
     containing_service=None,
     input_type=_SHARINGREQUEST,
     output_type=_STATUS,
@@ -1393,7 +1507,7 @@
   _descriptor.MethodDescriptor(
     name='shareEntityWithGroups',
     full_name='org.apache.custos.sharing.service.SharingService.shareEntityWithGroups',
-    index=21,
+    index=22,
     containing_service=None,
     input_type=_SHARINGREQUEST,
     output_type=_STATUS,
@@ -1403,7 +1517,7 @@
   _descriptor.MethodDescriptor(
     name='revokeEntitySharingFromUsers',
     full_name='org.apache.custos.sharing.service.SharingService.revokeEntitySharingFromUsers',
-    index=22,
+    index=23,
     containing_service=None,
     input_type=_SHARINGREQUEST,
     output_type=_STATUS,
@@ -1413,7 +1527,7 @@
   _descriptor.MethodDescriptor(
     name='revokeEntitySharingFromGroups',
     full_name='org.apache.custos.sharing.service.SharingService.revokeEntitySharingFromGroups',
-    index=23,
+    index=24,
     containing_service=None,
     input_type=_SHARINGREQUEST,
     output_type=_STATUS,
@@ -1423,7 +1537,7 @@
   _descriptor.MethodDescriptor(
     name='userHasAccess',
     full_name='org.apache.custos.sharing.service.SharingService.userHasAccess',
-    index=24,
+    index=25,
     containing_service=None,
     input_type=_SHARINGREQUEST,
     output_type=_STATUS,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2_grpc.py
index ff2f596..5edb0bb 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/SharingService_pb2_grpc.py
@@ -2,7 +2,7 @@
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import SharingService_pb2 as SharingService__pb2
+import custos.server.core.SharingService_pb2 as SharingService__pb2
 
 
 class SharingServiceStub(object):
@@ -114,6 +114,11 @@
                 request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
                 response_deserializer=SharingService__pb2.SharedOwners.FromString,
                 )
+        self.getAllDirectSharings = channel.unary_unary(
+                '/org.apache.custos.sharing.service.SharingService/getAllDirectSharings',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+                )
         self.shareEntityWithUsers = channel.unary_unary(
                 '/org.apache.custos.sharing.service.SharingService/shareEntityWithUsers',
                 request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
@@ -264,6 +269,12 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def getAllDirectSharings(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def shareEntityWithUsers(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -397,6 +408,11 @@
                     request_deserializer=SharingService__pb2.SharingRequest.FromString,
                     response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
             ),
+            'getAllDirectSharings': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllDirectSharings,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.GetAllDirectSharingsResponse.SerializeToString,
+            ),
             'shareEntityWithUsers': grpc.unary_unary_rpc_method_handler(
                     servicer.shareEntityWithUsers,
                     request_deserializer=SharingService__pb2.SharingRequest.FromString,
@@ -773,6 +789,23 @@
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def getAllDirectSharings(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.service.SharingService/getAllDirectSharings',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def shareEntityWithUsers(request,
             target,
             options=(),
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2.py
index f26ecb6..5a9c123 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: TenantProfileService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
@@ -18,8 +18,9 @@
   name='TenantProfileService.proto',
   package='org.apache.custos.tenant.profile.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x1aTenantProfileService.proto\x12(org.apache.custos.tenant.profile.service\"\x9b\x06\n\x06Tenant\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x04 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x05 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x06 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x07 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x08 \x01(\t\x12\x16\n\x0e\x61\x64min_password\x18\t \x01(\t\x12M\n\rtenant_status\x18\n \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x10\n\x08\x63ontacts\x18\x0b \x03(\t\x12\x15\n\rredirect_uris\x18\x0c \x03(\t\x12\x12\n\nclient_uri\x18\r \x01(\t\x12\r\n\x05scope\x18\x0e \x01(\t\x12\x0e\n\x06\x64omain\x18\x0f \x01(\t\x12\x0f\n\x07\x63omment\x18\x10 \x01(\t\x12\x10\n\x08logo_uri\x18\x11 \x01(\t\x12\x18\n\x10parent_tenant_id\x18\x12 \x01(\x03\x12\x18\n\x10\x61pplication_type\x18\x13 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x14 \x01(\t\x12\x10\n\x08jwks_uri\x18\x15 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x16 \x01(\t\x12\x0f\n\x07tos_uri\x18\x17 \x01(\t\x12\x12\n\npolicy_uri\x18\x18 \x01(\t\x12H\n\x04jwks\x18\x19 \x03(\x0b\x32:.org.apache.custos.tenant.profile.service.Tenant.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x1a \x01(\t\x12\x18\n\x10software_version\x18\x1b \x01(\t\x12\x1d\n\x15refesh_token_lifetime\x18\x1c \x01(\x03\x12\x11\n\tclient_id\x18\x1d \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"~\n\x1dTenantAttributeUpdateMetadata\x12\x18\n\x10updatedAttribute\x18\x01 \x01(\t\x12\x1d\n\x15updatedAttributeValue\x18\x02 \x01(\t\x12\x11\n\tupdatedBy\x18\x03 \x01(\t\x12\x11\n\tupdatedAt\x18\x04 \x01(\t\"\x91\x01\n\x1aTenantStatusUpdateMetadata\x12M\n\rupdatedStatus\x18\x01 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x11\n\tupdatedBy\x18\x02 \x01(\t\x12\x11\n\tupdatedAt\x18\x03 \x01(\t\"%\n\x11\x41\x64\x64TenantResponse\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"X\n\x14UpdateTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"$\n\x10GetTenantRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"U\n\x11GetTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"Y\n\x15GetAllTenantsResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"(\n\x14IsTenantExistRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"(\n\x15IsTenantExistResponse\x12\x0f\n\x07isExist\x18\x01 \x01(\x08\"5\n\x1bGetAllTenantsForUserRequest\x12\x16\n\x0erequesterEmail\x18\x01 \x01(\t\"`\n\x1cGetAllTenantsForUserResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xc0\x01\n\x13UpdateStatusRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x11\n\tupdatedBy\x18\x03 \x01(\t\x12\x10\n\x08tenantId\x18\x04 \x01(\x03\x12\x14\n\x0csuper_tenant\x18\x05 \x01(\x08\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x06 \x01(\t\"p\n\x14UpdateStatusResponse\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\"(\n\x14GetAuditTrailRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"{\n!GetStatusUpdateAuditTrailResponse\x12V\n\x08metadata\x18\x01 \x03(\x0b\x32\x44.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata\"\x81\x01\n$GetAttributeUpdateAuditTrailResponse\x12Y\n\x08metadata\x18\x02 \x03(\x0b\x32G.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata\"\xa6\x01\n\x11GetTenantsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x11\n\tparent_id\x18\x03 \x01(\x03\x12\x46\n\x06status\x18\x04 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x17\n\x0frequester_email\x18\x05 \x01(\t*c\n\x0cTenantStatus\x12\r\n\tREQUESTED\x10\x00\x12\x0c\n\x08\x41PPROVED\x10\x01\x12\n\n\x06\x44\x45NIED\x10\x02\x12\r\n\tCANCELLED\x10\x03\x12\n\n\x06\x41\x43TIVE\x10\x04\x12\x0f\n\x0b\x44\x45\x41\x43TIVATED\x10\x05\x32\xcb\n\n\x14TenantProfileService\x12o\n\taddTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12r\n\x0cupdateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12\x84\x01\n\tgetTenant\x12:.org.apache.custos.tenant.profile.service.GetTenantRequest\x1a;.org.apache.custos.tenant.profile.service.GetTenantResponse\x12\x93\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\x12\x8d\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\x12\x90\x01\n\risTenantExist\x12>.org.apache.custos.tenant.profile.service.IsTenantExistRequest\x1a?.org.apache.custos.tenant.profile.service.IsTenantExistResponse\x12\xa5\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\x12\xae\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\x12\xb4\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponseB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1aTenantProfileService.proto\x12(org.apache.custos.tenant.profile.service\"\xb5\x06\n\x06Tenant\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x04 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x05 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x06 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x07 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x08 \x01(\t\x12\x16\n\x0e\x61\x64min_password\x18\t \x01(\t\x12M\n\rtenant_status\x18\n \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x10\n\x08\x63ontacts\x18\x0b \x03(\t\x12\x15\n\rredirect_uris\x18\x0c \x03(\t\x12\x12\n\nclient_uri\x18\r \x01(\t\x12\r\n\x05scope\x18\x0e \x01(\t\x12\x0e\n\x06\x64omain\x18\x0f \x01(\t\x12\x0f\n\x07\x63omment\x18\x10 \x01(\t\x12\x10\n\x08logo_uri\x18\x11 \x01(\t\x12\x18\n\x10parent_tenant_id\x18\x12 \x01(\x03\x12\x18\n\x10\x61pplication_type\x18\x13 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x14 \x01(\t\x12\x10\n\x08jwks_uri\x18\x15 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x16 \x01(\t\x12\x0f\n\x07tos_uri\x18\x17 \x01(\t\x12\x12\n\npolicy_uri\x18\x18 \x01(\t\x12H\n\x04jwks\x18\x19 \x03(\x0b\x32:.org.apache.custos.tenant.profile.service.Tenant.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x1a \x01(\t\x12\x18\n\x10software_version\x18\x1b \x01(\t\x12\x1d\n\x15refesh_token_lifetime\x18\x1c \x01(\x03\x12\x11\n\tclient_id\x18\x1d \x01(\t\x12\x18\n\x10parent_client_id\x18\x1e \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x82\x01\n\x1dTenantAttributeUpdateMetadata\x12\x19\n\x11updated_attribute\x18\x01 \x01(\t\x12\x1e\n\x16updated_attributeValue\x18\x02 \x01(\t\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x12\n\nupdated_at\x18\x04 \x01(\t\"\x94\x01\n\x1aTenantStatusUpdateMetadata\x12N\n\x0eupdated_status\x18\x01 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x12\n\nupdated_by\x18\x02 \x01(\t\x12\x12\n\nupdated_at\x18\x03 \x01(\t\"&\n\x11\x41\x64\x64TenantResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"X\n\x14UpdateTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"%\n\x10GetTenantRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"U\n\x11GetTenantResponse\x12@\n\x06tenant\x18\x01 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"w\n\x15GetAllTenantsResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\x12\x1c\n\x14total_num_of_tenants\x18\x02 \x01(\x05\")\n\x14IsTenantExistRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\")\n\x15IsTenantExistResponse\x12\x10\n\x08is_exist\x18\x01 \x01(\x08\"6\n\x1bGetAllTenantsForUserRequest\x12\x17\n\x0frequester_email\x18\x01 \x01(\t\"`\n\x1cGetAllTenantsForUserResponse\x12@\n\x06tenant\x18\x01 \x03(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xc3\x01\n\x13UpdateStatusRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x11\n\ttenant_id\x18\x04 \x01(\x03\x12\x14\n\x0csuper_tenant\x18\x05 \x01(\x08\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x06 \x01(\t\"q\n\x14UpdateStatusResponse\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x46\n\x06status\x18\x02 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\")\n\x14GetAuditTrailRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"{\n!GetStatusUpdateAuditTrailResponse\x12V\n\x08metadata\x18\x01 \x03(\x0b\x32\x44.org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata\"\x81\x01\n$GetAttributeUpdateAuditTrailResponse\x12Y\n\x08metadata\x18\x02 \x03(\x0b\x32G.org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata\"\x84\x02\n\x11GetTenantsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x11\n\tparent_id\x18\x03 \x01(\x03\x12\x46\n\x06status\x18\x04 \x01(\x0e\x32\x36.org.apache.custos.tenant.profile.service.TenantStatus\x12\x17\n\x0frequester_email\x18\x05 \x01(\t\x12\x18\n\x10parent_client_id\x18\x06 \x01(\t\x12\x42\n\x04type\x18\x07 \x01(\x0e\x32\x34.org.apache.custos.tenant.profile.service.TenantType*p\n\x0cTenantStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tREQUESTED\x10\x01\x12\x0c\n\x08\x41PPROVED\x10\x02\x12\n\n\x06\x44\x45NIED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\n\n\x06\x41\x43TIVE\x10\x05\x12\x0f\n\x0b\x44\x45\x41\x43TIVATED\x10\x06*(\n\nTenantType\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\t\n\x05\x41\x44MIN\x10\x01\x32\xcb\n\n\x14TenantProfileService\x12o\n\taddTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12r\n\x0cupdateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\x12\x84\x01\n\tgetTenant\x12:.org.apache.custos.tenant.profile.service.GetTenantRequest\x1a;.org.apache.custos.tenant.profile.service.GetTenantResponse\x12\x93\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\x12\x8d\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\x12\x90\x01\n\risTenantExist\x12>.org.apache.custos.tenant.profile.service.IsTenantExistRequest\x1a?.org.apache.custos.tenant.profile.service.IsTenantExistResponse\x12\xa5\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\x12\xae\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\x12\xb4\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponseB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _TENANTSTATUS = _descriptor.EnumDescriptor(
@@ -27,46 +28,87 @@
   full_name='org.apache.custos.tenant.profile.service.TenantStatus',
   filename=None,
   file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
   values=[
     _descriptor.EnumValueDescriptor(
-      name='REQUESTED', index=0, number=0,
+      name='UNKNOWN', index=0, number=0,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
-      name='APPROVED', index=1, number=1,
+      name='REQUESTED', index=1, number=1,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
-      name='DENIED', index=2, number=2,
+      name='APPROVED', index=2, number=2,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
-      name='CANCELLED', index=3, number=3,
+      name='DENIED', index=3, number=3,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
-      name='ACTIVE', index=4, number=4,
+      name='CANCELLED', index=4, number=4,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
-      name='DEACTIVATED', index=5, number=5,
+      name='ACTIVE', index=5, number=5,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DEACTIVATED', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2505,
-  serialized_end=2604,
+  serialized_start=2673,
+  serialized_end=2785,
 )
 _sym_db.RegisterEnumDescriptor(_TENANTSTATUS)
 
 TenantStatus = enum_type_wrapper.EnumTypeWrapper(_TENANTSTATUS)
-REQUESTED = 0
-APPROVED = 1
-DENIED = 2
-CANCELLED = 3
-ACTIVE = 4
-DEACTIVATED = 5
+_TENANTTYPE = _descriptor.EnumDescriptor(
+  name='TenantType',
+  full_name='org.apache.custos.tenant.profile.service.TenantType',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNSPECIFIED', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ADMIN', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2787,
+  serialized_end=2827,
+)
+_sym_db.RegisterEnumDescriptor(_TENANTTYPE)
+
+TenantType = enum_type_wrapper.EnumTypeWrapper(_TENANTTYPE)
+UNKNOWN = 0
+REQUESTED = 1
+APPROVED = 2
+DENIED = 3
+CANCELLED = 4
+ACTIVE = 5
+DEACTIVATED = 6
+UNSPECIFIED = 0
+ADMIN = 1
 
 
 
@@ -76,6 +118,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='key', full_name='org.apache.custos.tenant.profile.service.Tenant.JwksEntry.key', index=0,
@@ -83,14 +126,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='value', full_name='org.apache.custos.tenant.profile.service.Tenant.JwksEntry.value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -103,8 +146,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=825,
-  serialized_end=868,
+  serialized_start=851,
+  serialized_end=894,
 )
 
 _TENANT = _descriptor.Descriptor(
@@ -113,6 +156,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.tenant.profile.service.Tenant.tenant_id', index=0,
@@ -120,196 +164,203 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_name', full_name='org.apache.custos.tenant.profile.service.Tenant.client_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='requester_email', full_name='org.apache.custos.tenant.profile.service.Tenant.requester_email', index=2,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_first_name', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_first_name', index=3,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_last_name', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_last_name', index=4,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_email', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_email', index=5,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_username', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_username', index=6,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_password', full_name='org.apache.custos.tenant.profile.service.Tenant.admin_password', index=7,
       number=9, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_status', full_name='org.apache.custos.tenant.profile.service.Tenant.tenant_status', index=8,
       number=10, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='contacts', full_name='org.apache.custos.tenant.profile.service.Tenant.contacts', index=9,
       number=11, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='redirect_uris', full_name='org.apache.custos.tenant.profile.service.Tenant.redirect_uris', index=10,
       number=12, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.client_uri', index=11,
       number=13, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.tenant.profile.service.Tenant.scope', index=12,
       number=14, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='domain', full_name='org.apache.custos.tenant.profile.service.Tenant.domain', index=13,
       number=15, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='comment', full_name='org.apache.custos.tenant.profile.service.Tenant.comment', index=14,
       number=16, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='logo_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.logo_uri', index=15,
       number=17, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='parent_tenant_id', full_name='org.apache.custos.tenant.profile.service.Tenant.parent_tenant_id', index=16,
       number=18, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='application_type', full_name='org.apache.custos.tenant.profile.service.Tenant.application_type', index=17,
       number=19, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='token_endpoint_auth_method', full_name='org.apache.custos.tenant.profile.service.Tenant.token_endpoint_auth_method', index=18,
       number=20, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='jwks_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.jwks_uri', index=19,
       number=21, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='example_extension_parameter', full_name='org.apache.custos.tenant.profile.service.Tenant.example_extension_parameter', index=20,
       number=22, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tos_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.tos_uri', index=21,
       number=23, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='policy_uri', full_name='org.apache.custos.tenant.profile.service.Tenant.policy_uri', index=22,
       number=24, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='jwks', full_name='org.apache.custos.tenant.profile.service.Tenant.jwks', index=23,
       number=25, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='software_id', full_name='org.apache.custos.tenant.profile.service.Tenant.software_id', index=24,
       number=26, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='software_version', full_name='org.apache.custos.tenant.profile.service.Tenant.software_version', index=25,
       number=27, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refesh_token_lifetime', full_name='org.apache.custos.tenant.profile.service.Tenant.refesh_token_lifetime', index=26,
       number=28, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.profile.service.Tenant.client_id', index=27,
       number=29, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_client_id', full_name='org.apache.custos.tenant.profile.service.Tenant.parent_client_id', index=28,
+      number=30, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -323,7 +374,7 @@
   oneofs=[
   ],
   serialized_start=73,
-  serialized_end=868,
+  serialized_end=894,
 )
 
 
@@ -333,35 +384,36 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='updatedAttribute', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updatedAttribute', index=0,
+      name='updated_attribute', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_attribute', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAttributeValue', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updatedAttributeValue', index=1,
+      name='updated_attributeValue', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_attributeValue', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedBy', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updatedBy', index=2,
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAt', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updatedAt', index=3,
+      name='updated_at', full_name='org.apache.custos.tenant.profile.service.TenantAttributeUpdateMetadata.updated_at', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -374,8 +426,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=870,
-  serialized_end=996,
+  serialized_start=897,
+  serialized_end=1027,
 )
 
 
@@ -385,28 +437,29 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='updatedStatus', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updatedStatus', index=0,
+      name='updated_status', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_status', index=0,
       number=1, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedBy', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updatedBy', index=1,
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_by', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAt', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updatedAt', index=2,
+      name='updated_at', full_name='org.apache.custos.tenant.profile.service.TenantStatusUpdateMetadata.updated_at', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -419,8 +472,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=999,
-  serialized_end=1144,
+  serialized_start=1030,
+  serialized_end=1178,
 )
 
 
@@ -430,14 +483,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.AddTenantResponse.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.AddTenantResponse.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -450,8 +504,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1146,
-  serialized_end=1183,
+  serialized_start=1180,
+  serialized_end=1218,
 )
 
 
@@ -461,6 +515,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant', full_name='org.apache.custos.tenant.profile.service.UpdateTenantResponse.tenant', index=0,
@@ -468,7 +523,7 @@
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -481,8 +536,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1185,
-  serialized_end=1273,
+  serialized_start=1220,
+  serialized_end=1308,
 )
 
 
@@ -492,14 +547,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.GetTenantRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.GetTenantRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -512,8 +568,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1275,
-  serialized_end=1311,
+  serialized_start=1310,
+  serialized_end=1347,
 )
 
 
@@ -523,6 +579,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant', full_name='org.apache.custos.tenant.profile.service.GetTenantResponse.tenant', index=0,
@@ -530,7 +587,7 @@
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -543,8 +600,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1313,
-  serialized_end=1398,
+  serialized_start=1349,
+  serialized_end=1434,
 )
 
 
@@ -554,6 +611,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsResponse.tenant', index=0,
@@ -561,7 +619,14 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total_num_of_tenants', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsResponse.total_num_of_tenants', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -574,8 +639,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1400,
-  serialized_end=1489,
+  serialized_start=1436,
+  serialized_end=1555,
 )
 
 
@@ -585,14 +650,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.IsTenantExistRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.IsTenantExistRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -605,8 +671,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1491,
-  serialized_end=1531,
+  serialized_start=1557,
+  serialized_end=1598,
 )
 
 
@@ -616,14 +682,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='isExist', full_name='org.apache.custos.tenant.profile.service.IsTenantExistResponse.isExist', index=0,
+      name='is_exist', full_name='org.apache.custos.tenant.profile.service.IsTenantExistResponse.is_exist', index=0,
       number=1, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -636,8 +703,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1533,
-  serialized_end=1573,
+  serialized_start=1600,
+  serialized_end=1641,
 )
 
 
@@ -647,14 +714,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='requesterEmail', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.requesterEmail', index=0,
+      name='requester_email', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest.requester_email', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -667,8 +735,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1575,
-  serialized_end=1628,
+  serialized_start=1643,
+  serialized_end=1697,
 )
 
 
@@ -678,6 +746,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant', full_name='org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse.tenant', index=0,
@@ -685,7 +754,7 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -698,8 +767,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1630,
-  serialized_end=1726,
+  serialized_start=1699,
+  serialized_end=1795,
 )
 
 
@@ -709,6 +778,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.client_id', index=0,
@@ -716,42 +786,42 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.status', index=1,
       number=2, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedBy', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.updatedBy', index=2,
+      name='updated_by', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.updated_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.tenantId', index=3,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.tenant_id', index=3,
       number=4, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='super_tenant', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.super_tenant', index=4,
       number=5, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.accessToken', index=5,
+      name='access_token', full_name='org.apache.custos.tenant.profile.service.UpdateStatusRequest.access_token', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -764,8 +834,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1729,
-  serialized_end=1921,
+  serialized_start=1798,
+  serialized_end=1993,
 )
 
 
@@ -775,21 +845,22 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.tenant.profile.service.UpdateStatusResponse.status', index=1,
       number=2, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -802,8 +873,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1923,
-  serialized_end=2035,
+  serialized_start=1995,
+  serialized_end=2108,
 )
 
 
@@ -813,14 +884,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.profile.service.GetAuditTrailRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.profile.service.GetAuditTrailRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -833,8 +905,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2037,
-  serialized_end=2077,
+  serialized_start=2110,
+  serialized_end=2151,
 )
 
 
@@ -844,6 +916,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='metadata', full_name='org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse.metadata', index=0,
@@ -851,7 +924,7 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -864,8 +937,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2079,
-  serialized_end=2202,
+  serialized_start=2153,
+  serialized_end=2276,
 )
 
 
@@ -875,6 +948,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='metadata', full_name='org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse.metadata', index=0,
@@ -882,7 +956,7 @@
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -895,8 +969,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2205,
-  serialized_end=2334,
+  serialized_start=2279,
+  serialized_end=2408,
 )
 
 
@@ -906,6 +980,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='offset', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.offset', index=0,
@@ -913,35 +988,49 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='limit', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.limit', index=1,
       number=2, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='parent_id', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.parent_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='status', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.status', index=3,
       number=4, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='requester_email', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.requester_email', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parent_client_id', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.parent_client_id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='org.apache.custos.tenant.profile.service.GetTenantsRequest.type', index=6,
+      number=7, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -954,14 +1043,14 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2337,
-  serialized_end=2503,
+  serialized_start=2411,
+  serialized_end=2671,
 )
 
 _TENANT_JWKSENTRY.containing_type = _TENANT
 _TENANT.fields_by_name['tenant_status'].enum_type = _TENANTSTATUS
 _TENANT.fields_by_name['jwks'].message_type = _TENANT_JWKSENTRY
-_TENANTSTATUSUPDATEMETADATA.fields_by_name['updatedStatus'].enum_type = _TENANTSTATUS
+_TENANTSTATUSUPDATEMETADATA.fields_by_name['updated_status'].enum_type = _TENANTSTATUS
 _UPDATETENANTRESPONSE.fields_by_name['tenant'].message_type = _TENANT
 _GETTENANTRESPONSE.fields_by_name['tenant'].message_type = _TENANT
 _GETALLTENANTSRESPONSE.fields_by_name['tenant'].message_type = _TENANT
@@ -971,6 +1060,7 @@
 _GETSTATUSUPDATEAUDITTRAILRESPONSE.fields_by_name['metadata'].message_type = _TENANTSTATUSUPDATEMETADATA
 _GETATTRIBUTEUPDATEAUDITTRAILRESPONSE.fields_by_name['metadata'].message_type = _TENANTATTRIBUTEUPDATEMETADATA
 _GETTENANTSREQUEST.fields_by_name['status'].enum_type = _TENANTSTATUS
+_GETTENANTSREQUEST.fields_by_name['type'].enum_type = _TENANTTYPE
 DESCRIPTOR.message_types_by_name['Tenant'] = _TENANT
 DESCRIPTOR.message_types_by_name['TenantAttributeUpdateMetadata'] = _TENANTATTRIBUTEUPDATEMETADATA
 DESCRIPTOR.message_types_by_name['TenantStatusUpdateMetadata'] = _TENANTSTATUSUPDATEMETADATA
@@ -990,6 +1080,7 @@
 DESCRIPTOR.message_types_by_name['GetAttributeUpdateAuditTrailResponse'] = _GETATTRIBUTEUPDATEAUDITTRAILRESPONSE
 DESCRIPTOR.message_types_by_name['GetTenantsRequest'] = _GETTENANTSREQUEST
 DESCRIPTOR.enum_types_by_name['TenantStatus'] = _TENANTSTATUS
+DESCRIPTOR.enum_types_by_name['TenantType'] = _TENANTTYPE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 Tenant = _reflection.GeneratedProtocolMessageType('Tenant', (_message.Message,), {
@@ -1136,8 +1227,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=2607,
-  serialized_end=3962,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2830,
+  serialized_end=4185,
   methods=[
   _descriptor.MethodDescriptor(
     name='addTenant',
@@ -1147,6 +1239,7 @@
     input_type=_TENANT,
     output_type=_TENANT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateTenant',
@@ -1156,6 +1249,7 @@
     input_type=_TENANT,
     output_type=_TENANT,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenant',
@@ -1165,6 +1259,7 @@
     input_type=_GETTENANTREQUEST,
     output_type=_GETTENANTRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateTenantStatus',
@@ -1174,6 +1269,7 @@
     input_type=_UPDATESTATUSREQUEST,
     output_type=_UPDATESTATUSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllTenants',
@@ -1183,6 +1279,7 @@
     input_type=_GETTENANTSREQUEST,
     output_type=_GETALLTENANTSRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='isTenantExist',
@@ -1192,6 +1289,7 @@
     input_type=_ISTENANTEXISTREQUEST,
     output_type=_ISTENANTEXISTRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllTenantsForUser',
@@ -1201,6 +1299,7 @@
     input_type=_GETALLTENANTSFORUSERREQUEST,
     output_type=_GETALLTENANTSFORUSERRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenantStatusUpdateAuditTrail',
@@ -1210,6 +1309,7 @@
     input_type=_GETAUDITTRAILREQUEST,
     output_type=_GETSTATUSUPDATEAUDITTRAILRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenantAttributeUpdateAuditTrail',
@@ -1219,6 +1319,7 @@
     input_type=_GETAUDITTRAILREQUEST,
     output_type=_GETATTRIBUTEUPDATEAUDITTRAILRESPONSE,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_TENANTPROFILESERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2_grpc.py
index fceff5b..3206689 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/TenantProfileService_pb2_grpc.py
@@ -1,182 +1,330 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import TenantProfileService_pb2 as TenantProfileService__pb2
+import custos.server.core.TenantProfileService_pb2 as TenantProfileService__pb2
 
 
 class TenantProfileServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.addTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/addTenant',
-        request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.Tenant.FromString,
-        )
-    self.updateTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenant',
-        request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.Tenant.FromString,
-        )
-    self.getTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenant',
-        request_serializer=TenantProfileService__pb2.GetTenantRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetTenantResponse.FromString,
-        )
-    self.updateTenantStatus = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenantStatus',
-        request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
-        )
-    self.getAllTenants = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenants',
-        request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
-        )
-    self.isTenantExist = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/isTenantExist',
-        request_serializer=TenantProfileService__pb2.IsTenantExistRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.IsTenantExistResponse.FromString,
-        )
-    self.getAllTenantsForUser = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenantsForUser',
-        request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
-        )
-    self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantStatusUpdateAuditTrail',
-        request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
-        )
-    self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
-        '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantAttributeUpdateAuditTrail',
-        request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.addTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/addTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.updateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.getTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenant',
+                request_serializer=TenantProfileService__pb2.GetTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetTenantResponse.FromString,
+                )
+        self.updateTenantStatus = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenantStatus',
+                request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
+                )
+        self.getAllTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.isTenantExist = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/isTenantExist',
+                request_serializer=TenantProfileService__pb2.IsTenantExistRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.IsTenantExistResponse.FromString,
+                )
+        self.getAllTenantsForUser = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenantsForUser',
+                request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+                )
+        self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantStatusUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+                )
+        self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantAttributeUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+                )
 
 
 class TenantProfileServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def addTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateTenantStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateTenantStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllTenants(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def isTenantExist(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def isTenantExist(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllTenantsForUser(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllTenantsForUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenantStatusUpdateAuditTrail(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTenantStatusUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenantAttributeUpdateAuditTrail(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTenantAttributeUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_TenantProfileServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'addTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.addTenant,
-          request_deserializer=TenantProfileService__pb2.Tenant.FromString,
-          response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
-      ),
-      'updateTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.updateTenant,
-          request_deserializer=TenantProfileService__pb2.Tenant.FromString,
-          response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
-      ),
-      'getTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenant,
-          request_deserializer=TenantProfileService__pb2.GetTenantRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetTenantResponse.SerializeToString,
-      ),
-      'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.updateTenantStatus,
-          request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
-          response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
-      ),
-      'getAllTenants': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllTenants,
-          request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
-      ),
-      'isTenantExist': grpc.unary_unary_rpc_method_handler(
-          servicer.isTenantExist,
-          request_deserializer=TenantProfileService__pb2.IsTenantExistRequest.FromString,
-          response_serializer=TenantProfileService__pb2.IsTenantExistResponse.SerializeToString,
-      ),
-      'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllTenantsForUser,
-          request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
-      ),
-      'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenantStatusUpdateAuditTrail,
-          request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
-      ),
-      'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenantAttributeUpdateAuditTrail,
-          request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.tenant.profile.service.TenantProfileService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'addTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.addTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'updateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'getTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenant,
+                    request_deserializer=TenantProfileService__pb2.GetTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetTenantResponse.SerializeToString,
+            ),
+            'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenantStatus,
+                    request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
+            ),
+            'getAllTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'isTenantExist': grpc.unary_unary_rpc_method_handler(
+                    servicer.isTenantExist,
+                    request_deserializer=TenantProfileService__pb2.IsTenantExistRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.IsTenantExistResponse.SerializeToString,
+            ),
+            'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenantsForUser,
+                    request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
+            ),
+            'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantStatusUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantAttributeUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.tenant.profile.service.TenantProfileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class TenantProfileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def addTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/addTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenant',
+            TenantProfileService__pb2.GetTenantRequest.SerializeToString,
+            TenantProfileService__pb2.GetTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenantStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/updateTenantStatus',
+            TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+            TenantProfileService__pb2.UpdateStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isTenantExist(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/isTenantExist',
+            TenantProfileService__pb2.IsTenantExistRequest.SerializeToString,
+            TenantProfileService__pb2.IsTenantExistResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenantsForUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getAllTenantsForUser',
+            TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantStatusUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantStatusUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantAttributeUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.profile.service.TenantProfileService/getTenantAttributeUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2.py
index 7051840..5beb760 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2.py
@@ -18,9 +18,9 @@
   name='UserProfileService.proto',
   package='org.apache.custos.user.profile.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18UserProfileService.proto\x12&org.apache.custos.user.profile.service\"\xdc\x03\n\x0bUserProfile\x12\x10\n\x08username\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x12\n\nfirst_name\x18\x03 \x01(\t\x12\x11\n\tlast_name\x18\x04 \x01(\t\x12\x12\n\ncreated_at\x18\x05 \x01(\x03\x12\x42\n\x06status\x18\x06 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12I\n\nattributes\x18\x07 \x03(\x0b\x32\x35.org.apache.custos.user.profile.service.UserAttribute\x12\x14\n\x0c\x63lient_roles\x18\x08 \x03(\t\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x18\n\x10last_modified_at\x18\n \x01(\x03\x12?\n\x04type\x18\x0b \x01(\x0e\x32\x31.org.apache.custos.user.profile.service.UserTypes\x12\\\n\x0fmembership_type\x18\x0c \x01(\x0e\x32\x43.org.apache.custos.user.profile.service.DefaultGroupMembershipTypes\"\x93\x01\n\x12UserProfileRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x44\n\x07profile\x18\x02 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\"7\n\rUserAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"c\n\x1aGetAllUserProfilesResponse\x12\x45\n\x08profiles\x18\x01 \x03(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\"@\n\x1aGetUpdateAuditTrailRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\"\x83\x01\n\"UserProfileAttributeUpdateMetadata\x12\x18\n\x10updatedAttribute\x18\x01 \x01(\t\x12\x1d\n\x15updatedAttributeValue\x18\x02 \x01(\t\x12\x11\n\tupdatedBy\x18\x03 \x01(\t\x12\x11\n\tupdatedAt\x18\x04 \x01(\t\"\x92\x01\n\x1fUserProfileStatusUpdateMetadata\x12I\n\rupdatedStatus\x18\x01 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12\x11\n\tupdatedBy\x18\x02 \x01(\t\x12\x11\n\tupdatedAt\x18\x03 \x01(\t\"\xdf\x01\n\x1bGetUpdateAuditTrailResponse\x12\x62\n\x0e\x61ttributeAudit\x18\x01 \x03(\x0b\x32J.org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata\x12\\\n\x0bstatusAudit\x18\x02 \x03(\x0b\x32G.org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata\"\xe3\x01\n\x0cGroupRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12<\n\x05group\x18\x02 \x01(\x0b\x32-.org.apache.custos.user.profile.service.Group\x12\x13\n\x0bperformedBy\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\\\n\x0fmembership_type\x18\x05 \x01(\x0e\x32\x43.org.apache.custos.user.profile.service.DefaultGroupMembershipTypes\"U\n\x14GetAllGroupsResponse\x12=\n\x06groups\x18\x01 \x03(\x0b\x32-.org.apache.custos.user.profile.service.Group\"\x84\x02\n\x05Group\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12\x11\n\tparent_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63reated_time\x18\x06 \x01(\x03\x12\x1a\n\x12last_modified_time\x18\x07 \x01(\x03\x12J\n\nattributes\x18\x08 \x03(\x0b\x32\x36.org.apache.custos.user.profile.service.GroupAttribute\x12\x13\n\x0b\x64\x65scription\x18\t \x01(\t\x12\x10\n\x08owner_id\x18\n \x01(\t\"8\n\x0eGroupAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"g\n\x0fGroupMembership\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x10\n\x08\x63lientId\x18\x05 \x01(\t\"b\n\x16GroupToGroupMembership\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x11\n\tparent_id\x18\x02 \x01(\t\x12\x10\n\x08\x63hild_id\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\".\n\x1eUserGroupMembershipTypeRequest\x12\x0c\n\x04type\x18\x01 \x01(\t*\xe3\x01\n\nUserStatus\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\x0c\n\x08\x41PPROVED\x10\x02\x12\x0b\n\x07\x44\x45LETED\x10\x03\x12\r\n\tDUPLICATE\x10\x04\x12\x10\n\x0cGRACE_PERIOD\x10\x05\x12\x0b\n\x07INVITED\x10\x06\x12\n\n\x06\x44\x45NIED\x10\x07\x12\x0b\n\x07PENDING\x10\x08\x12\x14\n\x10PENDING_APPROVAL\x10\t\x12\x18\n\x14PENDING_CONFIRMATION\x10\n\x12\r\n\tSUSPENDED\x10\x0b\x12\x0c\n\x08\x44\x45\x43LINED\x10\x0c\x12\x0b\n\x07\x45XPIRED\x10\r*?\n\x1b\x44\x65\x66\x61ultGroupMembershipTypes\x12\t\n\x05OWNER\x10\x00\x12\t\n\x05\x41\x44MIN\x10\x01\x12\n\n\x06MEMBER\x10\x02*(\n\tUserTypes\x12\x0c\n\x08\x45ND_USER\x10\x00\x12\r\n\tCOMMUNITY\x10\x01\x32\xed\x19\n\x12UserProfileService\x12\x84\x01\n\x11\x63reateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11updateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x81\x01\n\x0egetUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11\x64\x65leteUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x9c\x01\n\x1agetAllUserProfilesInTenant\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x9e\x01\n\x1c\x66indUserProfilesByAttributes\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12r\n\x0b\x63reateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0bupdateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0b\x64\x65leteGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12o\n\x08getGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12\x82\x01\n\x0cgetAllGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\xa4\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\x12y\n\x0e\x61\x64\x64UserToGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12~\n\x13removeUserFromGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x91\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8e\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x8f\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x94\x01\n\x1a\x61\x64\x64UserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x97\x01\n\x1dremoveUserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x87\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x83\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12t\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.StatusB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x18UserProfileService.proto\x12&org.apache.custos.user.profile.service\"\x97\x03\n\x0bUserProfile\x12\x10\n\x08username\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x12\n\nfirst_name\x18\x03 \x01(\t\x12\x11\n\tlast_name\x18\x04 \x01(\t\x12\x12\n\ncreated_at\x18\x05 \x01(\x03\x12\x42\n\x06status\x18\x06 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12I\n\nattributes\x18\x07 \x03(\x0b\x32\x35.org.apache.custos.user.profile.service.UserAttribute\x12\x14\n\x0c\x63lient_roles\x18\x08 \x03(\t\x12\x13\n\x0brealm_roles\x18\t \x03(\t\x12\x18\n\x10last_modified_at\x18\n \x01(\x03\x12?\n\x04type\x18\x0b \x01(\x0e\x32\x31.org.apache.custos.user.profile.service.UserTypes\x12\x17\n\x0fmembership_type\x18\x0c \x01(\t\"\x95\x01\n\x12UserProfileRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x44\n\x07profile\x18\x02 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"7\n\rUserAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"c\n\x1aGetAllUserProfilesResponse\x12\x45\n\x08profiles\x18\x01 \x03(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\"@\n\x1aGetUpdateAuditTrailRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x10\n\x08username\x18\x02 \x01(\t\"\x88\x01\n\"UserProfileAttributeUpdateMetadata\x12\x19\n\x11updated_attribute\x18\x01 \x01(\t\x12\x1f\n\x17updated_attribute_value\x18\x02 \x01(\t\x12\x12\n\nupdated_by\x18\x03 \x01(\t\x12\x12\n\nupdated_at\x18\x04 \x01(\t\"\x95\x01\n\x1fUserProfileStatusUpdateMetadata\x12J\n\x0eupdated_status\x18\x01 \x01(\x0e\x32\x32.org.apache.custos.user.profile.service.UserStatus\x12\x12\n\nupdated_by\x18\x02 \x01(\t\x12\x12\n\nupdated_at\x18\x03 \x01(\t\"\xe1\x01\n\x1bGetUpdateAuditTrailResponse\x12\x63\n\x0f\x61ttribute_audit\x18\x01 \x03(\x0b\x32J.org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata\x12]\n\x0cstatus_audit\x18\x02 \x03(\x0b\x32G.org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata\"\xc1\x01\n\x0cGroupRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12<\n\x05group\x18\x02 \x01(\x0b\x32-.org.apache.custos.user.profile.service.Group\x12\x14\n\x0cperformed_by\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x17\n\x0fmembership_type\x18\x05 \x01(\t\x12\n\n\x02id\x18\x06 \x01(\t\x12\x12\n\nclient_sec\x18\x07 \x01(\t\"U\n\x14GetAllGroupsResponse\x12=\n\x06groups\x18\x01 \x03(\x0b\x32-.org.apache.custos.user.profile.service.Group\"\x84\x02\n\x05Group\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0brealm_roles\x18\x03 \x03(\t\x12\x14\n\x0c\x63lient_roles\x18\x04 \x03(\t\x12\x11\n\tparent_id\x18\x05 \x01(\t\x12\x14\n\x0c\x63reated_time\x18\x06 \x01(\x03\x12\x1a\n\x12last_modified_time\x18\x07 \x01(\x03\x12J\n\nattributes\x18\x08 \x03(\x0b\x32\x36.org.apache.custos.user.profile.service.GroupAttribute\x12\x13\n\x0b\x64\x65scription\x18\t \x01(\t\x12\x10\n\x08owner_id\x18\n \x01(\t\"8\n\x0eGroupAttribute\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x03(\t\"{\n\x0fGroupMembership\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0c\n\x04type\x18\x04 \x01(\t\x12\x10\n\x08\x63lientId\x18\x05 \x01(\t\x12\x11\n\tclientSec\x18\x06 \x01(\t\"c\n\x16GroupToGroupMembership\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tparent_id\x18\x02 \x01(\t\x12\x10\n\x08\x63hild_id\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\"\x18\n\x06Status\x12\x0e\n\x06status\x18\x01 \x01(\x08\"T\n\x1eUserGroupMembershipTypeRequest\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x03 \x01(\t*\xe3\x01\n\nUserStatus\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\r\n\tCONFIRMED\x10\x01\x12\x0c\n\x08\x41PPROVED\x10\x02\x12\x0b\n\x07\x44\x45LETED\x10\x03\x12\r\n\tDUPLICATE\x10\x04\x12\x10\n\x0cGRACE_PERIOD\x10\x05\x12\x0b\n\x07INVITED\x10\x06\x12\n\n\x06\x44\x45NIED\x10\x07\x12\x0b\n\x07PENDING\x10\x08\x12\x14\n\x10PENDING_APPROVAL\x10\t\x12\x18\n\x14PENDING_CONFIRMATION\x10\n\x12\r\n\tSUSPENDED\x10\x0b\x12\x0c\n\x08\x44\x45\x43LINED\x10\x0c\x12\x0b\n\x07\x45XPIRED\x10\r*?\n\x1b\x44\x65\x66\x61ultGroupMembershipTypes\x12\t\n\x05OWNER\x10\x00\x12\t\n\x05\x41\x44MIN\x10\x01\x12\n\n\x06MEMBER\x10\x02*(\n\tUserTypes\x12\x0c\n\x08\x45ND_USER\x10\x00\x12\r\n\tCOMMUNITY\x10\x01\x32\xed\x19\n\x12UserProfileService\x12\x84\x01\n\x11\x63reateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11updateUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x81\x01\n\x0egetUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x84\x01\n\x11\x64\x65leteUserProfile\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\x12\x9c\x01\n\x1agetAllUserProfilesInTenant\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x9e\x01\n\x1c\x66indUserProfilesByAttributes\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12r\n\x0b\x63reateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0bupdateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12r\n\x0b\x64\x65leteGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12o\n\x08getGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\x12\x82\x01\n\x0cgetAllGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\xa4\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\x12y\n\x0e\x61\x64\x64UserToGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12~\n\x13removeUserFromGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x91\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12\x8e\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x8f\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x94\x01\n\x1a\x61\x64\x64UserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x97\x01\n\x1dremoveUserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\x12\x8c\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\x12\x87\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\x12\x83\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\x12t\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.StatusB\x08P\x01Z\x04./pbb\x06proto3'
 )
 
 _USERSTATUS = _descriptor.EnumDescriptor(
@@ -103,8 +103,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2348,
-  serialized_end=2575,
+  serialized_start=2316,
+  serialized_end=2543,
 )
 _sym_db.RegisterEnumDescriptor(_USERSTATUS)
 
@@ -134,8 +134,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2577,
-  serialized_end=2640,
+  serialized_start=2545,
+  serialized_end=2608,
 )
 _sym_db.RegisterEnumDescriptor(_DEFAULTGROUPMEMBERSHIPTYPES)
 
@@ -160,8 +160,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=2642,
-  serialized_end=2682,
+  serialized_start=2610,
+  serialized_end=2650,
 )
 _sym_db.RegisterEnumDescriptor(_USERTYPES)
 
@@ -275,8 +275,8 @@
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='membership_type', full_name='org.apache.custos.user.profile.service.UserProfile.membership_type', index=11,
-      number=12, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -293,7 +293,7 @@
   oneofs=[
   ],
   serialized_start=69,
-  serialized_end=545,
+  serialized_end=476,
 )
 
 
@@ -320,14 +320,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.user.profile.service.UserProfileRequest.performedBy', index=2,
+      name='performed_by', full_name='org.apache.custos.user.profile.service.UserProfileRequest.performed_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.user.profile.service.UserProfileRequest.clientId', index=3,
+      name='client_id', full_name='org.apache.custos.user.profile.service.UserProfileRequest.client_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -345,8 +345,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=548,
-  serialized_end=695,
+  serialized_start=479,
+  serialized_end=628,
 )
 
 
@@ -391,8 +391,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=697,
-  serialized_end=752,
+  serialized_start=630,
+  serialized_end=685,
 )
 
 
@@ -423,8 +423,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=754,
-  serialized_end=853,
+  serialized_start=687,
+  serialized_end=786,
 )
 
 
@@ -462,8 +462,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=855,
-  serialized_end=919,
+  serialized_start=788,
+  serialized_end=852,
 )
 
 
@@ -476,28 +476,28 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='updatedAttribute', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updatedAttribute', index=0,
+      name='updated_attribute', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_attribute', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAttributeValue', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updatedAttributeValue', index=1,
+      name='updated_attribute_value', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_attribute_value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedBy', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updatedBy', index=2,
+      name='updated_by', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAt', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updatedAt', index=3,
+      name='updated_at', full_name='org.apache.custos.user.profile.service.UserProfileAttributeUpdateMetadata.updated_at', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -515,8 +515,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=922,
-  serialized_end=1053,
+  serialized_start=855,
+  serialized_end=991,
 )
 
 
@@ -529,21 +529,21 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='updatedStatus', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updatedStatus', index=0,
+      name='updated_status', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_status', index=0,
       number=1, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedBy', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updatedBy', index=1,
+      name='updated_by', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_by', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='updatedAt', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updatedAt', index=2,
+      name='updated_at', full_name='org.apache.custos.user.profile.service.UserProfileStatusUpdateMetadata.updated_at', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -561,8 +561,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1056,
-  serialized_end=1202,
+  serialized_start=994,
+  serialized_end=1143,
 )
 
 
@@ -575,14 +575,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='attributeAudit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.attributeAudit', index=0,
+      name='attribute_audit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.attribute_audit', index=0,
       number=1, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='statusAudit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.statusAudit', index=1,
+      name='status_audit', full_name='org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse.status_audit', index=1,
       number=2, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -600,8 +600,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1205,
-  serialized_end=1428,
+  serialized_start=1146,
+  serialized_end=1371,
 )
 
 
@@ -614,7 +614,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.profile.service.GroupRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -628,14 +628,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.user.profile.service.GroupRequest.performedBy', index=2,
+      name='performed_by', full_name='org.apache.custos.user.profile.service.GroupRequest.performed_by', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.user.profile.service.GroupRequest.clientId', index=3,
+      name='client_id', full_name='org.apache.custos.user.profile.service.GroupRequest.client_id', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -643,8 +643,22 @@
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='membership_type', full_name='org.apache.custos.user.profile.service.GroupRequest.membership_type', index=4,
-      number=5, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='org.apache.custos.user.profile.service.GroupRequest.id', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.user.profile.service.GroupRequest.client_sec', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -660,8 +674,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1431,
-  serialized_end=1658,
+  serialized_start=1374,
+  serialized_end=1567,
 )
 
 
@@ -692,8 +706,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1660,
-  serialized_end=1745,
+  serialized_start=1569,
+  serialized_end=1654,
 )
 
 
@@ -787,8 +801,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1748,
-  serialized_end=2008,
+  serialized_start=1657,
+  serialized_end=1917,
 )
 
 
@@ -833,8 +847,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2010,
-  serialized_end=2066,
+  serialized_start=1919,
+  serialized_end=1975,
 )
 
 
@@ -847,7 +861,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.profile.service.GroupMembership.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupMembership.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -881,6 +895,13 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientSec', full_name='org.apache.custos.user.profile.service.GroupMembership.clientSec', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -893,8 +914,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2068,
-  serialized_end=2171,
+  serialized_start=1977,
+  serialized_end=2100,
 )
 
 
@@ -907,7 +928,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.GroupToGroupMembership.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -946,8 +967,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2173,
-  serialized_end=2271,
+  serialized_start=2102,
+  serialized_end=2201,
 )
 
 
@@ -978,8 +999,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2273,
-  serialized_end=2297,
+  serialized_start=2203,
+  serialized_end=2227,
 )
 
 
@@ -998,6 +1019,20 @@
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest.tenant_id', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest.client_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -1010,21 +1045,19 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2299,
-  serialized_end=2345,
+  serialized_start=2229,
+  serialized_end=2313,
 )
 
 _USERPROFILE.fields_by_name['status'].enum_type = _USERSTATUS
 _USERPROFILE.fields_by_name['attributes'].message_type = _USERATTRIBUTE
 _USERPROFILE.fields_by_name['type'].enum_type = _USERTYPES
-_USERPROFILE.fields_by_name['membership_type'].enum_type = _DEFAULTGROUPMEMBERSHIPTYPES
 _USERPROFILEREQUEST.fields_by_name['profile'].message_type = _USERPROFILE
 _GETALLUSERPROFILESRESPONSE.fields_by_name['profiles'].message_type = _USERPROFILE
-_USERPROFILESTATUSUPDATEMETADATA.fields_by_name['updatedStatus'].enum_type = _USERSTATUS
-_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['attributeAudit'].message_type = _USERPROFILEATTRIBUTEUPDATEMETADATA
-_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['statusAudit'].message_type = _USERPROFILESTATUSUPDATEMETADATA
+_USERPROFILESTATUSUPDATEMETADATA.fields_by_name['updated_status'].enum_type = _USERSTATUS
+_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['attribute_audit'].message_type = _USERPROFILEATTRIBUTEUPDATEMETADATA
+_GETUPDATEAUDITTRAILRESPONSE.fields_by_name['status_audit'].message_type = _USERPROFILESTATUSUPDATEMETADATA
 _GROUPREQUEST.fields_by_name['group'].message_type = _GROUP
-_GROUPREQUEST.fields_by_name['membership_type'].enum_type = _DEFAULTGROUPMEMBERSHIPTYPES
 _GETALLGROUPSRESPONSE.fields_by_name['groups'].message_type = _GROUP
 _GROUP.fields_by_name['attributes'].message_type = _GROUPATTRIBUTE
 DESCRIPTOR.message_types_by_name['UserProfile'] = _USERPROFILE
@@ -1170,8 +1203,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2685,
-  serialized_end=5994,
+  serialized_start=2653,
+  serialized_end=5962,
   methods=[
   _descriptor.MethodDescriptor(
     name='createUserProfile',
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2_grpc.py
index 61e0a29..e27d123 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/UserProfileService_pb2_grpc.py
@@ -2,7 +2,7 @@
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import UserProfileService_pb2 as UserProfileService__pb2
+import custos.server.core.UserProfileService_pb2 as UserProfileService__pb2
 
 
 class UserProfileServiceStub(object):
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2.py
index 34b2527..85892cc 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: AgentManagementService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -21,8 +39,9 @@
   name='AgentManagementService.proto',
   package='org.apache.custos.agent.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x1c\x41gentManagementService.proto\x12*org.apache.custos.agent.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\"\x81\x01\n\x12\x41gentSearchRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\t\"7\n\x19\x41gentRegistrationResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06secret\x18\x02 \x01(\t2\xdd\x10\n\x16\x41gentManagementService\x12\x9b\x01\n\x0c\x65nableAgents\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"\'\x82\xd3\xe4\x93\x02!\"\x1f/agent-management/v1.0.0/enable\x12\xb0\x01\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"4\x82\xd3\xe4\x93\x02.\",/agent-management/v1.0.0/token/configuration\x12\xc1\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x45.org.apache.custos.agent.management.service.AgentRegistrationResponse\",\x82\xd3\xe4\x93\x02&\"\x1e/agent-management/v1.0.0/agent:\x04user\x12\x9d\x01\n\x08getAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a$.org.apache.custos.iam.service.Agent\"+\x82\xd3\xe4\x93\x02%\x12#/agent-management/v1.0.0/agent/{id}\x12\xaa\x01\n\x0b\x64\x65leteAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%*#/agent-management/v1.0.0/agent/{id}\x12\xb8\x01\n\x0c\x64isableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"8\x82\xd3\xe4\x93\x02\x32\"0/agent-management/v1.0.0/agent/deactivation/{id}\x12\xb5\x01\n\x0b\x65nableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\"./agent-management/v1.0.0/agent/activation/{id}\x12\xb0\x01\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/agent-management/v1.0.0/agent/attributes\x12\xb5\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+*)/agent-management/v1.0.0/agent/attributes\x12\xa3\x01\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&\"$/agent-management/v1.0.0/agent/roles\x12\xab\x01\n\x14\x64\x65leteRolesFromAgent\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&*$/agent-management/v1.0.0/agent/roles\x12\xae\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"(/agent-management/v1.0.0/protocol/mapperB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1c\x41gentManagementService.proto\x12*org.apache.custos.agent.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\"\x81\x01\n\x12\x41gentSearchRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x03 \x01(\t\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t\x12\x11\n\tclientSec\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\x12\n\n\x02id\x18\x07 \x01(\t\"7\n\x19\x41gentRegistrationResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06secret\x18\x02 \x01(\t\"?\n\x19SynchronizeAgentDBRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t2\xdc\x14\n\x16\x41gentManagementService\x12\x9b\x01\n\x0c\x65nableAgents\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"\'\x82\xd3\xe4\x93\x02!\"\x1f/agent-management/v1.0.0/enable\x12\xb0\x01\n\x14\x63onfigureAgentClient\x12\x32.org.apache.custos.iam.service.AgentClientMetadata\x1a..org.apache.custos.iam.service.OperationStatus\"4\x82\xd3\xe4\x93\x02.\",/agent-management/v1.0.0/token/configuration\x12\x9a\x01\n\x10\x61\x64\x64RolesToClient\x12..org.apache.custos.iam.service.AddRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"&\x82\xd3\xe4\x93\x02 \"\x1e/agent-management/v1.0.0/roles\x12\xc1\x01\n\x16registerAndEnableAgent\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x45.org.apache.custos.agent.management.service.AgentRegistrationResponse\",\x82\xd3\xe4\x93\x02&\"\x1e/agent-management/v1.0.0/agent:\x04user\x12\x9d\x01\n\x08getAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a$.org.apache.custos.iam.service.Agent\"+\x82\xd3\xe4\x93\x02%\x12#/agent-management/v1.0.0/agent/{id}\x12\xaa\x01\n\x0b\x64\x65leteAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%*#/agent-management/v1.0.0/agent/{id}\x12\xb8\x01\n\x0c\x64isableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"8\x82\xd3\xe4\x93\x02\x32\"0/agent-management/v1.0.0/agent/deactivation/{id}\x12\xb5\x01\n\x0b\x65nableAgent\x12>.org.apache.custos.agent.management.service.AgentSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\"./agent-management/v1.0.0/agent/activation/{id}\x12\xb0\x01\n\x12\x61\x64\x64\x41gentAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/agent-management/v1.0.0/agent/attributes\x12\xb5\x01\n\x15\x64\x65leteAgentAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+*)/agent-management/v1.0.0/agent/attributes\x12\xa3\x01\n\x0f\x61\x64\x64RolesToAgent\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&\"$/agent-management/v1.0.0/agent/roles\x12\xab\x01\n\x14\x64\x65leteRolesFromAgent\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\",\x82\xd3\xe4\x93\x02&*$/agent-management/v1.0.0/agent/roles\x12\xae\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"(/agent-management/v1.0.0/protocol/mapper\x12\x9f\x01\n\x0cgetAllAgents\x12..org.apache.custos.iam.service.GetAllResources\x1a\x36.org.apache.custos.iam.service.GetAllResourcesResponse\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/agent-management/v1.0.0/agents\x12\xbd\x01\n\x13synchronizeAgentDBs\x12\x45.org.apache.custos.agent.management.service.SynchronizeAgentDBRequest\x1a..org.apache.custos.iam.service.OperationStatus\"/\x82\xd3\xe4\x93\x02)\"\'/agent-management/v1.0.0/db/synchronizeB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_rpc_dot_error__details__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
 
@@ -35,6 +54,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenantId', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.tenantId', index=0,
@@ -42,42 +62,42 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='accessToken', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.accessToken', index=1,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='clientId', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.clientId', index=2,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='clientSec', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.clientSec', index=3,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='performedBy', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.performedBy', index=4,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.agent.management.service.AgentSearchRequest.id', index=5,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -101,6 +121,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='id', full_name='org.apache.custos.agent.management.service.AgentRegistrationResponse.id', index=0,
@@ -108,14 +129,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='secret', full_name='org.apache.custos.agent.management.service.AgentRegistrationResponse.secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -132,8 +153,48 @@
   serialized_end=377,
 )
 
+
+_SYNCHRONIZEAGENTDBREQUEST = _descriptor.Descriptor(
+  name='SynchronizeAgentDBRequest',
+  full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tenantId', full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest.tenantId', index=0,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='clientId', full_name='org.apache.custos.agent.management.service.SynchronizeAgentDBRequest.clientId', index=1,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=379,
+  serialized_end=442,
+)
+
 DESCRIPTOR.message_types_by_name['AgentSearchRequest'] = _AGENTSEARCHREQUEST
 DESCRIPTOR.message_types_by_name['AgentRegistrationResponse'] = _AGENTREGISTRATIONRESPONSE
+DESCRIPTOR.message_types_by_name['SynchronizeAgentDBRequest'] = _SYNCHRONIZEAGENTDBREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 AgentSearchRequest = _reflection.GeneratedProtocolMessageType('AgentSearchRequest', (_message.Message,), {
@@ -150,6 +211,13 @@
   })
 _sym_db.RegisterMessage(AgentRegistrationResponse)
 
+SynchronizeAgentDBRequest = _reflection.GeneratedProtocolMessageType('SynchronizeAgentDBRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SYNCHRONIZEAGENTDBREQUEST,
+  '__module__' : 'AgentManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.agent.management.service.SynchronizeAgentDBRequest)
+  })
+_sym_db.RegisterMessage(SynchronizeAgentDBRequest)
+
 
 DESCRIPTOR._options = None
 
@@ -159,8 +227,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=380,
-  serialized_end=2521,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=445,
+  serialized_end=3097,
   methods=[
   _descriptor.MethodDescriptor(
     name='enableAgents',
@@ -170,6 +239,7 @@
     input_type=IamAdminService__pb2._AGENTCLIENTMETADATA,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002!\"\037/agent-management/v1.0.0/enable',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='configureAgentClient',
@@ -179,96 +249,137 @@
     input_type=IamAdminService__pb2._AGENTCLIENTMETADATA,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002.\",/agent-management/v1.0.0/token/configuration',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addRolesToClient',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.addRolesToClient',
+    index=2,
+    containing_service=None,
+    input_type=IamAdminService__pb2._ADDROLESREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002 \"\036/agent-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='registerAndEnableAgent',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.registerAndEnableAgent',
-    index=2,
+    index=3,
     containing_service=None,
     input_type=IamAdminService__pb2._REGISTERUSERREQUEST,
     output_type=_AGENTREGISTRATIONRESPONSE,
     serialized_options=b'\202\323\344\223\002&\"\036/agent-management/v1.0.0/agent:\004user',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAgent',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.getAgent',
-    index=3,
+    index=4,
     containing_service=None,
     input_type=_AGENTSEARCHREQUEST,
     output_type=IamAdminService__pb2._AGENT,
     serialized_options=b'\202\323\344\223\002%\022#/agent-management/v1.0.0/agent/{id}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteAgent',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteAgent',
-    index=4,
-    containing_service=None,
-    input_type=_AGENTSEARCHREQUEST,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
-    serialized_options=b'\202\323\344\223\002%*#/agent-management/v1.0.0/agent/{id}',
-  ),
-  _descriptor.MethodDescriptor(
-    name='disableAgent',
-    full_name='org.apache.custos.agent.management.service.AgentManagementService.disableAgent',
     index=5,
     containing_service=None,
     input_type=_AGENTSEARCHREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
-    serialized_options=b'\202\323\344\223\0022\"0/agent-management/v1.0.0/agent/deactivation/{id}',
+    serialized_options=b'\202\323\344\223\002%*#/agent-management/v1.0.0/agent/{id}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
-    name='enableAgent',
-    full_name='org.apache.custos.agent.management.service.AgentManagementService.enableAgent',
+    name='disableAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.disableAgent',
     index=6,
     containing_service=None,
     input_type=_AGENTSEARCHREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0022\"0/agent-management/v1.0.0/agent/deactivation/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableAgent',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.enableAgent',
+    index=7,
+    containing_service=None,
+    input_type=_AGENTSEARCHREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\0020\"./agent-management/v1.0.0/agent/activation/{id}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addAgentAttributes',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.addAgentAttributes',
-    index=7,
+    index=8,
     containing_service=None,
     input_type=IamAdminService__pb2._ADDUSERATTRIBUTESREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002+\")/agent-management/v1.0.0/agent/attributes',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteAgentAttributes',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteAgentAttributes',
-    index=8,
+    index=9,
     containing_service=None,
     input_type=IamAdminService__pb2._DELETEUSERATTRIBUTEREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002+*)/agent-management/v1.0.0/agent/attributes',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addRolesToAgent',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.addRolesToAgent',
-    index=9,
+    index=10,
     containing_service=None,
     input_type=IamAdminService__pb2._ADDUSERROLESREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002&\"$/agent-management/v1.0.0/agent/roles',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteRolesFromAgent',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.deleteRolesFromAgent',
-    index=10,
+    index=11,
     containing_service=None,
     input_type=IamAdminService__pb2._DELETEUSERROLESREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002&*$/agent-management/v1.0.0/agent/roles',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addProtocolMapper',
     full_name='org.apache.custos.agent.management.service.AgentManagementService.addProtocolMapper',
-    index=11,
+    index=12,
     containing_service=None,
     input_type=IamAdminService__pb2._ADDPROTOCOLMAPPERREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002*\"(/agent-management/v1.0.0/protocol/mapper',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllAgents',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.getAllAgents',
+    index=13,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GETALLRESOURCES,
+    output_type=IamAdminService__pb2._GETALLRESOURCESRESPONSE,
+    serialized_options=b'\202\323\344\223\002!\022\037/agent-management/v1.0.0/agents',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='synchronizeAgentDBs',
+    full_name='org.apache.custos.agent.management.service.AgentManagementService.synchronizeAgentDBs',
+    index=14,
+    containing_service=None,
+    input_type=_SYNCHRONIZEAGENTDBREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002)\"\'/agent-management/v1.0.0/db/synchronize',
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_AGENTMANAGEMENTSERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2_grpc.py
index bd64d48..b96cff3 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/AgentManagementService_pb2_grpc.py
@@ -1,4 +1,22 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 import custos.server.integration.AgentManagementService_pb2 as AgentManagementService__pb2
@@ -6,229 +24,523 @@
 
 
 class AgentManagementServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.enableAgents = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/enableAgents',
-        request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.configureAgentClient = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/configureAgentClient',
-        request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.registerAndEnableAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/registerAndEnableAgent',
-        request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
-        response_deserializer=AgentManagementService__pb2.AgentRegistrationResponse.FromString,
-        )
-    self.getAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/getAgent',
-        request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.Agent.FromString,
-        )
-    self.deleteAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgent',
-        request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.disableAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/disableAgent',
-        request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.enableAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/enableAgent',
-        request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.addAgentAttributes = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/addAgentAttributes',
-        request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.deleteAgentAttributes = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgentAttributes',
-        request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.addRolesToAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToAgent',
-        request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.deleteRolesFromAgent = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/deleteRolesFromAgent',
-        request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.addProtocolMapper = channel.unary_unary(
-        '/org.apache.custos.agent.management.service.AgentManagementService/addProtocolMapper',
-        request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.enableAgents = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/enableAgents',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.configureAgentClient = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/configureAgentClient',
+                request_serializer=IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToClient = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToClient',
+                request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.registerAndEnableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/registerAndEnableAgent',
+                request_serializer=IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+                response_deserializer=AgentManagementService__pb2.AgentRegistrationResponse.FromString,
+                )
+        self.getAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/getAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.Agent.FromString,
+                )
+        self.deleteAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.disableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/disableAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/enableAgent',
+                request_serializer=AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addAgentAttributes',
+                request_serializer=IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteAgentAttributes = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgentAttributes',
+                request_serializer=IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addRolesToAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToAgent',
+                request_serializer=IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.deleteRolesFromAgent = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/deleteRolesFromAgent',
+                request_serializer=IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addProtocolMapper = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/addProtocolMapper',
+                request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.getAllAgents = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/getAllAgents',
+                request_serializer=IamAdminService__pb2.GetAllResources.SerializeToString,
+                response_deserializer=IamAdminService__pb2.GetAllResourcesResponse.FromString,
+                )
+        self.synchronizeAgentDBs = channel.unary_unary(
+                '/org.apache.custos.agent.management.service.AgentManagementService/synchronizeAgentDBs',
+                request_serializer=AgentManagementService__pb2.SynchronizeAgentDBRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
 
 
 class AgentManagementServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def enableAgents(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def enableAgents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def configureAgentClient(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def configureAgentClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def registerAndEnableAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addRolesToClient(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def registerAndEnableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def disableAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def enableAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def disableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def addAgentAttributes(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def enableAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteAgentAttributes(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def addRolesToAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteAgentAttributes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteRolesFromAgent(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addRolesToAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def addProtocolMapper(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteRolesFromAgent(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addProtocolMapper(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllAgents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def synchronizeAgentDBs(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_AgentManagementServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'enableAgents': grpc.unary_unary_rpc_method_handler(
-          servicer.enableAgents,
-          request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'configureAgentClient': grpc.unary_unary_rpc_method_handler(
-          servicer.configureAgentClient,
-          request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'registerAndEnableAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.registerAndEnableAgent,
-          request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
-          response_serializer=AgentManagementService__pb2.AgentRegistrationResponse.SerializeToString,
-      ),
-      'getAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.getAgent,
-          request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
-          response_serializer=IamAdminService__pb2.Agent.SerializeToString,
-      ),
-      'deleteAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteAgent,
-          request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'disableAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.disableAgent,
-          request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'enableAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.enableAgent,
-          request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'addAgentAttributes': grpc.unary_unary_rpc_method_handler(
-          servicer.addAgentAttributes,
-          request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'deleteAgentAttributes': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteAgentAttributes,
-          request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'addRolesToAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.addRolesToAgent,
-          request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'deleteRolesFromAgent': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteRolesFromAgent,
-          request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
-          servicer.addProtocolMapper,
-          request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.agent.management.service.AgentManagementService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'enableAgents': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableAgents,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'configureAgentClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureAgentClient,
+                    request_deserializer=IamAdminService__pb2.AgentClientMetadata.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToClient': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToClient,
+                    request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'registerAndEnableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.registerAndEnableAgent,
+                    request_deserializer=IamAdminService__pb2.RegisterUserRequest.FromString,
+                    response_serializer=AgentManagementService__pb2.AgentRegistrationResponse.SerializeToString,
+            ),
+            'getAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.Agent.SerializeToString,
+            ),
+            'deleteAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'disableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.disableAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableAgent,
+                    request_deserializer=AgentManagementService__pb2.AgentSearchRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.addAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.AddUserAttributesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteAgentAttributes': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteAgentAttributes,
+                    request_deserializer=IamAdminService__pb2.DeleteUserAttributeRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addRolesToAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.addRolesToAgent,
+                    request_deserializer=IamAdminService__pb2.AddUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'deleteRolesFromAgent': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRolesFromAgent,
+                    request_deserializer=IamAdminService__pb2.DeleteUserRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
+                    servicer.addProtocolMapper,
+                    request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'getAllAgents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllAgents,
+                    request_deserializer=IamAdminService__pb2.GetAllResources.FromString,
+                    response_serializer=IamAdminService__pb2.GetAllResourcesResponse.SerializeToString,
+            ),
+            'synchronizeAgentDBs': grpc.unary_unary_rpc_method_handler(
+                    servicer.synchronizeAgentDBs,
+                    request_deserializer=AgentManagementService__pb2.SynchronizeAgentDBRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.agent.management.service.AgentManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class AgentManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def enableAgents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/enableAgents',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureAgentClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/configureAgentClient',
+            IamAdminService__pb2.AgentClientMetadata.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToClient(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToClient',
+            IamAdminService__pb2.AddRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def registerAndEnableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/registerAndEnableAgent',
+            IamAdminService__pb2.RegisterUserRequest.SerializeToString,
+            AgentManagementService__pb2.AgentRegistrationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/getAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.Agent.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def disableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/disableAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/enableAgent',
+            AgentManagementService__pb2.AgentSearchRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addAgentAttributes',
+            IamAdminService__pb2.AddUserAttributesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteAgentAttributes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteAgentAttributes',
+            IamAdminService__pb2.DeleteUserAttributeRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addRolesToAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addRolesToAgent',
+            IamAdminService__pb2.AddUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRolesFromAgent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/deleteRolesFromAgent',
+            IamAdminService__pb2.DeleteUserRolesRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addProtocolMapper(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/addProtocolMapper',
+            IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllAgents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/getAllAgents',
+            IamAdminService__pb2.GetAllResources.SerializeToString,
+            IamAdminService__pb2.GetAllResourcesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def synchronizeAgentDBs(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.agent.management.service.AgentManagementService/synchronizeAgentDBs',
+            AgentManagementService__pb2.SynchronizeAgentDBRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2.py
new file mode 100644
index 0000000..4102d87
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2.py
@@ -0,0 +1,162 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: ClusterManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='ClusterManagementService.proto',
+  package='org.apache.custos.cluster.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1e\x43lusterManagementService.proto\x12,org.apache.custos.cluster.management.service\"D\n\x1bGetServerCertificateRequest\x12\x12\n\nsecretName\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\"3\n\x1cGetServerCertificateResponse\x12\x13\n\x0b\x63\x65rtificate\x18\x01 \x01(\t2\xd0\x01\n\x18\x43lusterManagementService\x12\xb3\x01\n\x1agetCustosServerCertificate\x12I.org.apache.custos.cluster.management.service.GetServerCertificateRequest\x1aJ.org.apache.custos.cluster.management.service.GetServerCertificateResponseB\x08P\x01Z\x04./pbb\x06proto3'
+)
+
+
+
+
+_GETSERVERCERTIFICATEREQUEST = _descriptor.Descriptor(
+  name='GetServerCertificateRequest',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='secretName', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.secretName', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='namespace', full_name='org.apache.custos.cluster.management.service.GetServerCertificateRequest.namespace', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=80,
+  serialized_end=148,
+)
+
+
+_GETSERVERCERTIFICATERESPONSE = _descriptor.Descriptor(
+  name='GetServerCertificateResponse',
+  full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='certificate', full_name='org.apache.custos.cluster.management.service.GetServerCertificateResponse.certificate', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=150,
+  serialized_end=201,
+)
+
+DESCRIPTOR.message_types_by_name['GetServerCertificateRequest'] = _GETSERVERCERTIFICATEREQUEST
+DESCRIPTOR.message_types_by_name['GetServerCertificateResponse'] = _GETSERVERCERTIFICATERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetServerCertificateRequest = _reflection.GeneratedProtocolMessageType('GetServerCertificateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATEREQUEST,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateRequest)
+  })
+_sym_db.RegisterMessage(GetServerCertificateRequest)
+
+GetServerCertificateResponse = _reflection.GeneratedProtocolMessageType('GetServerCertificateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSERVERCERTIFICATERESPONSE,
+  '__module__' : 'ClusterManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.cluster.management.service.GetServerCertificateResponse)
+  })
+_sym_db.RegisterMessage(GetServerCertificateResponse)
+
+
+DESCRIPTOR._options = None
+
+_CLUSTERMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='ClusterManagementService',
+  full_name='org.apache.custos.cluster.management.service.ClusterManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=204,
+  serialized_end=412,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getCustosServerCertificate',
+    full_name='org.apache.custos.cluster.management.service.ClusterManagementService.getCustosServerCertificate',
+    index=0,
+    containing_service=None,
+    input_type=_GETSERVERCERTIFICATEREQUEST,
+    output_type=_GETSERVERCERTIFICATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CLUSTERMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['ClusterManagementService'] = _CLUSTERMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2_grpc.py
new file mode 100644
index 0000000..8eb469e
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ClusterManagementService_pb2_grpc.py
@@ -0,0 +1,83 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.integration.ClusterManagementService_pb2 as ClusterManagementService__pb2
+
+
+class ClusterManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getCustosServerCertificate = channel.unary_unary(
+                '/org.apache.custos.cluster.management.service.ClusterManagementService/getCustosServerCertificate',
+                request_serializer=ClusterManagementService__pb2.GetServerCertificateRequest.SerializeToString,
+                response_deserializer=ClusterManagementService__pb2.GetServerCertificateResponse.FromString,
+                )
+
+
+class ClusterManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getCustosServerCertificate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ClusterManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getCustosServerCertificate': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCustosServerCertificate,
+                    request_deserializer=ClusterManagementService__pb2.GetServerCertificateRequest.FromString,
+                    response_serializer=ClusterManagementService__pb2.GetServerCertificateResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.cluster.management.service.ClusterManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ClusterManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getCustosServerCertificate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.cluster.management.service.ClusterManagementService/getCustosServerCertificate',
+            ClusterManagementService__pb2.GetServerCertificateRequest.SerializeToString,
+            ClusterManagementService__pb2.GetServerCertificateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2.py
index f12516c..ad7c291 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2.py
@@ -1,4 +1,22 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: GroupManagementService.proto
 """Generated protocol buffer code."""
@@ -20,9 +38,9 @@
   name='GroupManagementService.proto',
   package='org.apache.custos.group.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1cGroupManagementService.proto\x12*org.apache.custos.group.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto2\x95\x15\n\x16GroupManagementService\x12\x94\x01\n\x0c\x63reateGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"\'\x82\xd3\xe4\x93\x02!\"\x1f/group-management/v1.0.0/groups\x12\x9b\x01\n\x0bupdateGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"+\x82\xd3\xe4\x93\x02%\x1a#/group-management/v1.0.0/group/{id}\x12\x97\x01\n\x0b\x64\x65leteGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%*#/group-management/v1.0.0/group/{id}\x12\x94\x01\n\tfindGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"&\x82\xd3\xe4\x93\x02 \x12\x1e/group-management/v1.0.0/group\x12\x93\x01\n\x0cgetAllGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/group-management/v1.0.0/groups\x12\xb0\x01\n\x0e\x61\x64\x64UserToGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\"./group-management/v1.0.0/user/group/membership\x12\xb5\x01\n\x13removeUserFromGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30*./group-management/v1.0.0/user/group/membership\x12\xbf\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/group-management/v1.0.0/group/membership\x12\xc4\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+*)/group-management/v1.0.0/group/membership\x12\xc7\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//group-management/v1.0.0/user/group/memberships\x12\xc4\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"3\x82\xd3\xe4\x93\x02-\x12+/group-management/v1.0.0/groups/memberships\x12\xcb\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/group-management/v1.0.0/user/group/memberships/child\x12\xc2\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/group-management/v1.0.0/groups/memberships/child\x12\xbb\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\x1a./group-management/v1.0.0/user/group/membership\x12\xa8\x01\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.iam.service.OperationStatus\"2\x82\xd3\xe4\x93\x02,\x12*/group-management/v1.0.0/user/group/accessB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x1cGroupManagementService.proto\x12*org.apache.custos.group.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto2\xcb\"\n\x16GroupManagementService\x12\xa5\x01\n\x14\x63reateKeycloakGroups\x12,.org.apache.custos.iam.service.GroupsRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"0\x82\xd3\xe4\x93\x02*\"(/group-management/v1.0.0/keycloak/groups\x12\xac\x01\n\x13updateKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"4\x82\xd3\xe4\x93\x02.\x1a,/group-management/v1.0.0/keycloak/group/{id}\x12\xa8\x01\n\x13\x64\x65leteKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a..org.apache.custos.iam.service.OperationStatus\"4\x82\xd3\xe4\x93\x02.*,/group-management/v1.0.0/keycloak/group/{id}\x12\xa5\x01\n\x11\x66indKeycloakGroup\x12+.org.apache.custos.iam.service.GroupRequest\x1a\x32.org.apache.custos.iam.service.GroupRepresentation\"/\x82\xd3\xe4\x93\x02)\x12\'/group-management/v1.0.0/keycloak/group\x12\xa4\x01\n\x14getAllKeycloakGroups\x12+.org.apache.custos.iam.service.GroupRequest\x1a-.org.apache.custos.iam.service.GroupsResponse\"0\x82\xd3\xe4\x93\x02*\x12(/group-management/v1.0.0/keycloak/groups\x12\xc1\x01\n\x16\x61\x64\x64UserToKeycloakGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"?\x82\xd3\xe4\x93\x02\x39\"7/group-management/v1.0.0/keycloak/user/group/membership\x12\xc6\x01\n\x1bremoveUserFromKeycloakGroup\x12\x36.org.apache.custos.iam.service.UserGroupMappingRequest\x1a..org.apache.custos.iam.service.OperationStatus\"?\x82\xd3\xe4\x93\x02\x39*7/group-management/v1.0.0/keycloak/user/group/membership\x12\x9a\x01\n\x0b\x63reateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"&\x82\xd3\xe4\x93\x02 \"\x1e/group-management/v1.0.0/group\x12\x9f\x01\n\x0bupdateGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"+\x82\xd3\xe4\x93\x02%\x1a#/group-management/v1.0.0/group/{id}\x12\xa0\x01\n\x0b\x64\x65leteGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a..org.apache.custos.user.profile.service.Status\"+\x82\xd3\xe4\x93\x02%*#/group-management/v1.0.0/group/{id}\x12\x98\x01\n\tfindGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a-.org.apache.custos.user.profile.service.Group\"&\x82\xd3\xe4\x93\x02 \x12\x1e/group-management/v1.0.0/group\x12\xab\x01\n\x0cgetAllGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/group-management/v1.0.0/groups\x12\xb1\x01\n\x0e\x61\x64\x64UserToGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30\"./group-management/v1.0.0/user/group/membership\x12\xb6\x01\n\x13removeUserFromGroup\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30*./group-management/v1.0.0/user/group/membership\x12\xbf\x01\n\x1a\x61\x64\x64\x43hildGroupToParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\"1\x82\xd3\xe4\x93\x02+\")/group-management/v1.0.0/group/membership\x12\xc4\x01\n\x1fremoveChildGroupFromParentGroup\x12>.org.apache.custos.user.profile.service.GroupToGroupMembership\x1a..org.apache.custos.user.profile.service.Status\"1\x82\xd3\xe4\x93\x02+*)/group-management/v1.0.0/group/membership\x12\xc7\x01\n\x12getAllGroupsOfUser\x12:.org.apache.custos.user.profile.service.UserProfileRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//group-management/v1.0.0/user/group/memberships\x12\xc4\x01\n\x19getAllParentGroupsOfGroup\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"3\x82\xd3\xe4\x93\x02-\x12+/group-management/v1.0.0/groups/memberships\x12\xcb\x01\n\x10getAllChildUsers\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/group-management/v1.0.0/user/group/memberships/child\x12\xc2\x01\n\x11getAllChildGroups\x12\x34.org.apache.custos.user.profile.service.GroupRequest\x1a<.org.apache.custos.user.profile.service.GetAllGroupsResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/group-management/v1.0.0/groups/memberships/child\x12\xbb\x01\n\x18\x63hangeUserMembershipType\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"6\x82\xd3\xe4\x93\x02\x30\x1a./group-management/v1.0.0/user/group/membership\x12\xa8\x01\n\thasAccess\x12\x37.org.apache.custos.user.profile.service.GroupMembership\x1a..org.apache.custos.user.profile.service.Status\"2\x82\xd3\xe4\x93\x02,\x12*/group-management/v1.0.0/user/group/access\x12\xcd\x01\n\x16\x61\x64\x64GroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\";\x82\xd3\xe4\x93\x02\x35\"3/group-management/v1.0.0/user/group/membership/type\x12\xd4\x01\n\x1dremoveUserGroupMembershipType\x12\x46.org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest\x1a..org.apache.custos.user.profile.service.Status\";\x82\xd3\xe4\x93\x02\x35*3/group-management/v1.0.0/user/group/membership/typeB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,UserProfileService__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
 
@@ -41,102 +59,172 @@
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
   serialized_start=156,
-  serialized_end=2865,
+  serialized_end=4583,
   methods=[
   _descriptor.MethodDescriptor(
-    name='createGroups',
-    full_name='org.apache.custos.group.management.service.GroupManagementService.createGroups',
+    name='createKeycloakGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.createKeycloakGroups',
     index=0,
     containing_service=None,
     input_type=IamAdminService__pb2._GROUPSREQUEST,
     output_type=IamAdminService__pb2._GROUPSRESPONSE,
-    serialized_options=b'\202\323\344\223\002!\"\037/group-management/v1.0.0/groups',
+    serialized_options=b'\202\323\344\223\002*\"(/group-management/v1.0.0/keycloak/groups',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.updateKeycloakGroup',
+    index=1,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002.\032,/group-management/v1.0.0/keycloak/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.deleteKeycloakGroup',
+    index=2,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.*,/group-management/v1.0.0/keycloak/group/{id}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='findKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.findKeycloakGroup',
+    index=3,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    serialized_options=b'\202\323\344\223\002)\022\'/group-management/v1.0.0/keycloak/group',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getAllKeycloakGroups',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.getAllKeycloakGroups',
+    index=4,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GROUPREQUEST,
+    output_type=IamAdminService__pb2._GROUPSRESPONSE,
+    serialized_options=b'\202\323\344\223\002*\022(/group-management/v1.0.0/keycloak/groups',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addUserToKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addUserToKeycloakGroup',
+    index=5,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0029\"7/group-management/v1.0.0/keycloak/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserFromKeycloakGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserFromKeycloakGroup',
+    index=6,
+    containing_service=None,
+    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0029*7/group-management/v1.0.0/keycloak/user/group/membership',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='createGroup',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.createGroup',
+    index=7,
+    containing_service=None,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
+    serialized_options=b'\202\323\344\223\002 \"\036/group-management/v1.0.0/group',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.updateGroup',
-    index=1,
+    index=8,
     containing_service=None,
-    input_type=IamAdminService__pb2._GROUPREQUEST,
-    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
     serialized_options=b'\202\323\344\223\002%\032#/group-management/v1.0.0/group/{id}',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.deleteGroup',
-    index=2,
+    index=9,
     containing_service=None,
-    input_type=IamAdminService__pb2._GROUPREQUEST,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\002%*#/group-management/v1.0.0/group/{id}',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='findGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.findGroup',
-    index=3,
+    index=10,
     containing_service=None,
-    input_type=IamAdminService__pb2._GROUPREQUEST,
-    output_type=IamAdminService__pb2._GROUPREPRESENTATION,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GROUP,
     serialized_options=b'\202\323\344\223\002 \022\036/group-management/v1.0.0/group',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllGroups',
     full_name='org.apache.custos.group.management.service.GroupManagementService.getAllGroups',
-    index=4,
+    index=11,
     containing_service=None,
-    input_type=IamAdminService__pb2._GROUPREQUEST,
-    output_type=IamAdminService__pb2._GROUPSRESPONSE,
+    input_type=UserProfileService__pb2._GROUPREQUEST,
+    output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
     serialized_options=b'\202\323\344\223\002!\022\037/group-management/v1.0.0/groups',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addUserToGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.addUserToGroup',
-    index=5,
+    index=12,
     containing_service=None,
-    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\0020\"./group-management/v1.0.0/user/group/membership',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='removeUserFromGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserFromGroup',
-    index=6,
+    index=13,
     containing_service=None,
-    input_type=IamAdminService__pb2._USERGROUPMAPPINGREQUEST,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\0020*./group-management/v1.0.0/user/group/membership',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addChildGroupToParentGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.addChildGroupToParentGroup',
-    index=7,
+    index=14,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPTOGROUPMEMBERSHIP,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\002+\")/group-management/v1.0.0/group/membership',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='removeChildGroupFromParentGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.removeChildGroupFromParentGroup',
-    index=8,
+    index=15,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPTOGROUPMEMBERSHIP,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\002+*)/group-management/v1.0.0/group/membership',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllGroupsOfUser',
     full_name='org.apache.custos.group.management.service.GroupManagementService.getAllGroupsOfUser',
-    index=9,
+    index=16,
     containing_service=None,
     input_type=UserProfileService__pb2._USERPROFILEREQUEST,
     output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
@@ -146,7 +234,7 @@
   _descriptor.MethodDescriptor(
     name='getAllParentGroupsOfGroup',
     full_name='org.apache.custos.group.management.service.GroupManagementService.getAllParentGroupsOfGroup',
-    index=10,
+    index=17,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPREQUEST,
     output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
@@ -156,7 +244,7 @@
   _descriptor.MethodDescriptor(
     name='getAllChildUsers',
     full_name='org.apache.custos.group.management.service.GroupManagementService.getAllChildUsers',
-    index=11,
+    index=18,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPREQUEST,
     output_type=UserProfileService__pb2._GETALLUSERPROFILESRESPONSE,
@@ -166,7 +254,7 @@
   _descriptor.MethodDescriptor(
     name='getAllChildGroups',
     full_name='org.apache.custos.group.management.service.GroupManagementService.getAllChildGroups',
-    index=12,
+    index=19,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPREQUEST,
     output_type=UserProfileService__pb2._GETALLGROUPSRESPONSE,
@@ -176,23 +264,43 @@
   _descriptor.MethodDescriptor(
     name='changeUserMembershipType',
     full_name='org.apache.custos.group.management.service.GroupManagementService.changeUserMembershipType',
-    index=13,
+    index=20,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\0020\032./group-management/v1.0.0/user/group/membership',
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='hasAccess',
     full_name='org.apache.custos.group.management.service.GroupManagementService.hasAccess',
-    index=14,
+    index=21,
     containing_service=None,
     input_type=UserProfileService__pb2._GROUPMEMBERSHIP,
-    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    output_type=UserProfileService__pb2._STATUS,
     serialized_options=b'\202\323\344\223\002,\022*/group-management/v1.0.0/user/group/access',
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='addGroupMembershipType',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.addGroupMembershipType',
+    index=22,
+    containing_service=None,
+    input_type=UserProfileService__pb2._USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0025\"3/group-management/v1.0.0/user/group/membership/type',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeUserGroupMembershipType',
+    full_name='org.apache.custos.group.management.service.GroupManagementService.removeUserGroupMembershipType',
+    index=23,
+    containing_service=None,
+    input_type=UserProfileService__pb2._USERGROUPMEMBERSHIPTYPEREQUEST,
+    output_type=UserProfileService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0025*3/group-management/v1.0.0/user/group/membership/type',
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_GROUPMANAGEMENTSERVICE)
 
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2_grpc.py
index 975983f..f3b7ead 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/GroupManagementService_pb2_grpc.py
@@ -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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
@@ -15,50 +32,85 @@
         Args:
             channel: A grpc.Channel.
         """
-        self.createGroups = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/createGroups',
+        self.createKeycloakGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/createKeycloakGroups',
                 request_serializer=IamAdminService__pb2.GroupsRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
                 )
-        self.updateGroup = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/updateGroup',
+        self.updateKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/updateKeycloakGroup',
                 request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
                 )
-        self.deleteGroup = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/deleteGroup',
+        self.deleteKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/deleteKeycloakGroup',
                 request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
                 )
-        self.findGroup = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/findGroup',
+        self.findKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/findKeycloakGroup',
                 request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.GroupRepresentation.FromString,
                 )
-        self.getAllGroups = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/getAllGroups',
+        self.getAllKeycloakGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllKeycloakGroups',
                 request_serializer=IamAdminService__pb2.GroupRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.GroupsResponse.FromString,
                 )
-        self.addUserToGroup = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/addUserToGroup',
+        self.addUserToKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addUserToKeycloakGroup',
                 request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
                 )
-        self.removeUserFromGroup = channel.unary_unary(
-                '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromGroup',
+        self.removeUserFromKeycloakGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromKeycloakGroup',
                 request_serializer=IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
                 response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
                 )
+        self.createGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/createGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.updateGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/updateGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.deleteGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/deleteGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.findGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/findGroup',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Group.FromString,
+                )
+        self.getAllGroups = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/getAllGroups',
+                request_serializer=UserProfileService__pb2.GroupRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.GetAllGroupsResponse.FromString,
+                )
+        self.addUserToGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addUserToGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserFromGroup = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromGroup',
+                request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
         self.addChildGroupToParentGroup = channel.unary_unary(
                 '/org.apache.custos.group.management.service.GroupManagementService/addChildGroupToParentGroup',
                 request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
-                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
                 )
         self.removeChildGroupFromParentGroup = channel.unary_unary(
                 '/org.apache.custos.group.management.service.GroupManagementService/removeChildGroupFromParentGroup',
                 request_serializer=UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
-                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
                 )
         self.getAllGroupsOfUser = channel.unary_unary(
                 '/org.apache.custos.group.management.service.GroupManagementService/getAllGroupsOfUser',
@@ -83,19 +135,71 @@
         self.changeUserMembershipType = channel.unary_unary(
                 '/org.apache.custos.group.management.service.GroupManagementService/changeUserMembershipType',
                 request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
-                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
                 )
         self.hasAccess = channel.unary_unary(
                 '/org.apache.custos.group.management.service.GroupManagementService/hasAccess',
                 request_serializer=UserProfileService__pb2.GroupMembership.SerializeToString,
-                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.addGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/addGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
+                )
+        self.removeUserGroupMembershipType = channel.unary_unary(
+                '/org.apache.custos.group.management.service.GroupManagementService/removeUserGroupMembershipType',
+                request_serializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+                response_deserializer=UserProfileService__pb2.Status.FromString,
                 )
 
 
 class GroupManagementServiceServicer(object):
     """Missing associated documentation comment in .proto file."""
 
-    def createGroups(self, request, context):
+    def createKeycloakGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def findKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllKeycloakGroups(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addUserToKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserFromKeycloakGroup(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def createGroup(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
@@ -185,53 +289,100 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def addGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeUserGroupMembershipType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_GroupManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
-            'createGroups': grpc.unary_unary_rpc_method_handler(
-                    servicer.createGroups,
+            'createKeycloakGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.createKeycloakGroups,
                     request_deserializer=IamAdminService__pb2.GroupsRequest.FromString,
                     response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
             ),
-            'updateGroup': grpc.unary_unary_rpc_method_handler(
-                    servicer.updateGroup,
+            'updateKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKeycloakGroup,
                     request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
                     response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
             ),
-            'deleteGroup': grpc.unary_unary_rpc_method_handler(
-                    servicer.deleteGroup,
+            'deleteKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKeycloakGroup,
                     request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
                     response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
             ),
-            'findGroup': grpc.unary_unary_rpc_method_handler(
-                    servicer.findGroup,
+            'findKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.findKeycloakGroup,
                     request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
                     response_serializer=IamAdminService__pb2.GroupRepresentation.SerializeToString,
             ),
-            'getAllGroups': grpc.unary_unary_rpc_method_handler(
-                    servicer.getAllGroups,
+            'getAllKeycloakGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllKeycloakGroups,
                     request_deserializer=IamAdminService__pb2.GroupRequest.FromString,
                     response_serializer=IamAdminService__pb2.GroupsResponse.SerializeToString,
             ),
-            'addUserToGroup': grpc.unary_unary_rpc_method_handler(
-                    servicer.addUserToGroup,
+            'addUserToKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToKeycloakGroup,
                     request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
                     response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
             ),
-            'removeUserFromGroup': grpc.unary_unary_rpc_method_handler(
-                    servicer.removeUserFromGroup,
+            'removeUserFromKeycloakGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromKeycloakGroup,
                     request_deserializer=IamAdminService__pb2.UserGroupMappingRequest.FromString,
                     response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
             ),
+            'createGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.createGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'updateGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'deleteGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'findGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.findGroup,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Group.SerializeToString,
+            ),
+            'getAllGroups': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllGroups,
+                    request_deserializer=UserProfileService__pb2.GroupRequest.FromString,
+                    response_serializer=UserProfileService__pb2.GetAllGroupsResponse.SerializeToString,
+            ),
+            'addUserToGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.addUserToGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserFromGroup': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserFromGroup,
+                    request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
             'addChildGroupToParentGroup': grpc.unary_unary_rpc_method_handler(
                     servicer.addChildGroupToParentGroup,
                     request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
-                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
             ),
             'removeChildGroupFromParentGroup': grpc.unary_unary_rpc_method_handler(
                     servicer.removeChildGroupFromParentGroup,
                     request_deserializer=UserProfileService__pb2.GroupToGroupMembership.FromString,
-                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
             ),
             'getAllGroupsOfUser': grpc.unary_unary_rpc_method_handler(
                     servicer.getAllGroupsOfUser,
@@ -256,12 +407,22 @@
             'changeUserMembershipType': grpc.unary_unary_rpc_method_handler(
                     servicer.changeUserMembershipType,
                     request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
-                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
             ),
             'hasAccess': grpc.unary_unary_rpc_method_handler(
                     servicer.hasAccess,
                     request_deserializer=UserProfileService__pb2.GroupMembership.FromString,
-                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'addGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.addGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
+            ),
+            'removeUserGroupMembershipType': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeUserGroupMembershipType,
+                    request_deserializer=UserProfileService__pb2.UserGroupMembershipTypeRequest.FromString,
+                    response_serializer=UserProfileService__pb2.Status.SerializeToString,
             ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
@@ -274,7 +435,7 @@
     """Missing associated documentation comment in .proto file."""
 
     @staticmethod
-    def createGroups(request,
+    def createKeycloakGroups(request,
             target,
             options=(),
             channel_credentials=None,
@@ -284,13 +445,132 @@
             wait_for_ready=None,
             timeout=None,
             metadata=None):
-        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/createGroups',
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/createKeycloakGroups',
             IamAdminService__pb2.GroupsRequest.SerializeToString,
             IamAdminService__pb2.GroupsResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def updateKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/updateKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/deleteKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def findKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/findKeycloakGroup',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupRepresentation.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllKeycloakGroups(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllKeycloakGroups',
+            IamAdminService__pb2.GroupRequest.SerializeToString,
+            IamAdminService__pb2.GroupsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addUserToKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addUserToKeycloakGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserFromKeycloakGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromKeycloakGroup',
+            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def createGroup(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/createGroup',
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def updateGroup(request,
             target,
             options=(),
@@ -302,8 +582,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/updateGroup',
-            IamAdminService__pb2.GroupRequest.SerializeToString,
-            IamAdminService__pb2.GroupRepresentation.FromString,
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -319,8 +599,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/deleteGroup',
-            IamAdminService__pb2.GroupRequest.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -336,8 +616,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/findGroup',
-            IamAdminService__pb2.GroupRequest.SerializeToString,
-            IamAdminService__pb2.GroupRepresentation.FromString,
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.Group.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -353,8 +633,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/getAllGroups',
-            IamAdminService__pb2.GroupRequest.SerializeToString,
-            IamAdminService__pb2.GroupsResponse.FromString,
+            UserProfileService__pb2.GroupRequest.SerializeToString,
+            UserProfileService__pb2.GetAllGroupsResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -370,8 +650,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addUserToGroup',
-            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -387,8 +667,8 @@
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserFromGroup',
-            IamAdminService__pb2.UserGroupMappingRequest.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.GroupMembership.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -405,7 +685,7 @@
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addChildGroupToParentGroup',
             UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -422,7 +702,7 @@
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeChildGroupFromParentGroup',
             UserProfileService__pb2.GroupToGroupMembership.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -507,7 +787,7 @@
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/changeUserMembershipType',
             UserProfileService__pb2.GroupMembership.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -524,6 +804,40 @@
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/hasAccess',
             UserProfileService__pb2.GroupMembership.SerializeToString,
-            IamAdminService__pb2.OperationStatus.FromString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/addGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeUserGroupMembershipType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.group.management.service.GroupManagementService/removeUserGroupMembershipType',
+            UserProfileService__pb2.UserGroupMembershipTypeRequest.SerializeToString,
+            UserProfileService__pb2.Status.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2.py
index 900697f..c7104dc 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: IdentityManagementService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -22,8 +40,9 @@
   name='IdentityManagementService.proto',
   package='org.apache.custos.identity.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x1fIdentityManagementService.proto\x12-org.apache.custos.identity.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x15IdentityService.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x19google/protobuf/any.proto\x1a\x1c\x43redentialStoreService.proto\"\x9e\x01\n\x14\x41uthorizationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x15\n\rresponse_type\x18\x05 \x01(\t\x12\r\n\x05scope\x18\x06 \x01(\t\x12\r\n\x05state\x18\x07 \x01(\t\")\n\x15\x41uthorizationResponse\x12\x10\n\x08loginURI\x18\x01 \x01(\t\"x\n\x15GetCredentialsRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12L\n\x0b\x63redentials\x18\x02 \x01(\x0b\x32\x37.org.apache.custos.credential.store.service.Credentials\"\xc5\x01\n\x14GetAgentTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x17\n\x0f\x61gent_client_id\x18\x02 \x01(\t\x12\x1b\n\x13\x61gent_client_secret\x18\x03 \x01(\t\x12\x0f\n\x07\x61gentId\x18\x04 \x01(\t\x12\x15\n\ragentPassword\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\ngrant_type\x18\x07 \x01(\t\x12\x15\n\rrefresh_token\x18\x08 \x01(\t\"k\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x43\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x35.org.apache.custos.identity.service.EndSessionRequest2\xe2\x0f\n\x19IdentityManagementService\x12\xaa\x01\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\"0\x82\xd3\xe4\x93\x02*\"(/identity-management/v1.0.0/authenticate\x12\xb5\x01\n\x0fisAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a:.org.apache.custos.identity.service.IsAuthenticateResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//identity-management/v1.0.0/authenticate/status\x12\x8c\x01\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\"(\x82\xd3\xe4\x93\x02\"\x12 /identity-management/v1.0.0/user\x12\xd3\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\"1\x82\xd3\xe4\x93\x02+\x12)/identity-management/v1.0.0/account/token\x12\xbe\x01\n\x0e\x65ndUserSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"5\x82\xd3\xe4\x93\x02/\"\'/identity-management/v1.0.0/user/logout:\x04\x62ody\x12\xc5\x01\n\tauthorize\x12\x43.org.apache.custos.identity.management.service.AuthorizationRequest\x1a\x44.org.apache.custos.identity.management.service.AuthorizationResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/identity-management/v1.0.0/authorize\x12\x80\x01\n\x05token\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\")\x82\xd3\xe4\x93\x02#\"!/identity-management/v1.0.0/token\x12\xc0\x01\n\x0egetCredentials\x12\x44.org.apache.custos.identity.management.service.GetCredentialsRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\"/\x82\xd3\xe4\x93\x02)\x12\'/identity-management/v1.0.0/credentials\x12\xaf\x01\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\"D\x82\xd3\xe4\x93\x02>\x12</identity-management/v1.0.0/.well-known/openid-configuration\x12\xaa\x01\n\rgetAgentToken\x12\x43.org.apache.custos.identity.management.service.GetAgentTokenRequest\x1a\x17.google.protobuf.Struct\";\x82\xd3\xe4\x93\x02\x35\"3/identity-management/v1.0.0/agent/token/{client_id}\x12\xcc\x01\n\x0f\x65ndAgentSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"B\x82\xd3\xe4\x93\x02<\"4/identity-management/v1.0.0/agent/logout/{client_id}:\x04\x62odyB\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1fIdentityManagementService.proto\x12-org.apache.custos.identity.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x15IdentityService.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x19google/protobuf/any.proto\x1a\x1c\x43redentialStoreService.proto\"\x9e\x01\n\x14\x41uthorizationRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x15\n\rclient_secret\x18\x03 \x01(\t\x12\x14\n\x0credirect_uri\x18\x04 \x01(\t\x12\x15\n\rresponse_type\x18\x05 \x01(\t\x12\r\n\x05scope\x18\x06 \x01(\t\x12\r\n\x05state\x18\x07 \x01(\t\")\n\x15\x41uthorizationResponse\x12\x10\n\x08loginURI\x18\x01 \x01(\t\"x\n\x15GetCredentialsRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12L\n\x0b\x63redentials\x18\x02 \x01(\x0b\x32\x37.org.apache.custos.credential.store.service.Credentials\"\xc5\x01\n\x14GetAgentTokenRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x17\n\x0f\x61gent_client_id\x18\x02 \x01(\t\x12\x1b\n\x13\x61gent_client_secret\x18\x03 \x01(\t\x12\x0f\n\x07\x61gentId\x18\x04 \x01(\t\x12\x15\n\ragentPassword\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x12\n\ngrant_type\x18\x07 \x01(\t\x12\x15\n\rrefresh_token\x18\x08 \x01(\t\"k\n\x11\x45ndSessionRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x43\n\x04\x62ody\x18\x02 \x01(\x0b\x32\x35.org.apache.custos.identity.service.EndSessionRequest2\xaf\x11\n\x19IdentityManagementService\x12\xaa\x01\n\x0c\x61uthenticate\x12\x39.org.apache.custos.identity.service.AuthenticationRequest\x1a-.org.apache.custos.identity.service.AuthToken\"0\x82\xd3\xe4\x93\x02*\"(/identity-management/v1.0.0/authenticate\x12\xb6\x01\n\x0fisAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\"7\x82\xd3\xe4\x93\x02\x31\x12//identity-management/v1.0.0/authenticate/status\x12\x8c\x01\n\x07getUser\x12-.org.apache.custos.identity.service.AuthToken\x1a(.org.apache.custos.identity.service.User\"(\x82\xd3\xe4\x93\x02\"\x12 /identity-management/v1.0.0/user\x12\xd3\x01\n*getUserManagementServiceAccountAccessToken\x12\x43.org.apache.custos.identity.service.GetUserManagementSATokenRequest\x1a-.org.apache.custos.identity.service.AuthToken\"1\x82\xd3\xe4\x93\x02+\x12)/identity-management/v1.0.0/account/token\x12\xbe\x01\n\x0e\x65ndUserSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"5\x82\xd3\xe4\x93\x02/\"\'/identity-management/v1.0.0/user/logout:\x04\x62ody\x12\xc5\x01\n\tauthorize\x12\x43.org.apache.custos.identity.management.service.AuthorizationRequest\x1a\x44.org.apache.custos.identity.management.service.AuthorizationResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/identity-management/v1.0.0/authorize\x12\x80\x01\n\x05token\x12\x33.org.apache.custos.identity.service.GetTokenRequest\x1a\x17.google.protobuf.Struct\")\x82\xd3\xe4\x93\x02#\"!/identity-management/v1.0.0/token\x12\xc0\x01\n\x0egetCredentials\x12\x44.org.apache.custos.identity.management.service.GetCredentialsRequest\x1a\x37.org.apache.custos.credential.store.service.Credentials\"/\x82\xd3\xe4\x93\x02)\x12\'/identity-management/v1.0.0/credentials\x12\xaf\x01\n\x14getOIDCConfiguration\x12\x38.org.apache.custos.identity.service.GetOIDCConfiguration\x1a\x17.google.protobuf.Struct\"D\x82\xd3\xe4\x93\x02>\x12</identity-management/v1.0.0/.well-known/openid-configuration\x12\xaa\x01\n\rgetAgentToken\x12\x43.org.apache.custos.identity.management.service.GetAgentTokenRequest\x1a\x17.google.protobuf.Struct\";\x82\xd3\xe4\x93\x02\x35\"3/identity-management/v1.0.0/agent/token/{client_id}\x12\xcc\x01\n\x0f\x65ndAgentSession\x12@.org.apache.custos.identity.management.service.EndSessionRequest\x1a\x33.org.apache.custos.identity.service.OperationStatus\"B\x82\xd3\xe4\x93\x02<\"4/identity-management/v1.0.0/agent/logout/{client_id}:\x04\x62ody\x12\xc9\x01\n\x14isAgentAuthenticated\x12-.org.apache.custos.identity.service.AuthToken\x1a;.org.apache.custos.identity.service.IsAuthenticatedResponse\"E\x82\xd3\xe4\x93\x02?\"7/identity-management/v1.0.0/agent/authentication/status:\x04\x62odyB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,IdentityService__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_any__pb2.DESCRIPTOR,CredentialStoreService__pb2.DESCRIPTOR,])
 
@@ -36,6 +55,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.tenant_id', index=0,
@@ -43,49 +63,49 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.client_secret', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='redirect_uri', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.redirect_uri', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='response_type', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.response_type', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.scope', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='state', full_name='org.apache.custos.identity.management.service.AuthorizationRequest.state', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -109,6 +129,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='loginURI', full_name='org.apache.custos.identity.management.service.AuthorizationResponse.loginURI', index=0,
@@ -116,7 +137,7 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -140,6 +161,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.management.service.GetCredentialsRequest.client_id', index=0,
@@ -147,14 +169,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='credentials', full_name='org.apache.custos.identity.management.service.GetCredentialsRequest.credentials', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -178,6 +200,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.tenant_id', index=0,
@@ -185,56 +208,56 @@
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='agent_client_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agent_client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='agent_client_secret', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agent_client_secret', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='agentId', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agentId', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='agentPassword', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.agentPassword', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.client_id', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='grant_type', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.grant_type', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='refresh_token', full_name='org.apache.custos.identity.management.service.GetAgentTokenRequest.refresh_token', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -258,6 +281,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.identity.management.service.EndSessionRequest.client_id', index=0,
@@ -265,14 +289,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='body', full_name='org.apache.custos.identity.management.service.EndSessionRequest.body', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -342,8 +366,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
+  create_key=_descriptor._internal_create_key,
   serialized_start=858,
-  serialized_end=2876,
+  serialized_end=3081,
   methods=[
   _descriptor.MethodDescriptor(
     name='authenticate',
@@ -353,6 +378,7 @@
     input_type=IdentityService__pb2._AUTHENTICATIONREQUEST,
     output_type=IdentityService__pb2._AUTHTOKEN,
     serialized_options=b'\202\323\344\223\002*\"(/identity-management/v1.0.0/authenticate',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='isAuthenticated',
@@ -360,8 +386,9 @@
     index=1,
     containing_service=None,
     input_type=IdentityService__pb2._AUTHTOKEN,
-    output_type=IdentityService__pb2._ISAUTHENTICATERESPONSE,
+    output_type=IdentityService__pb2._ISAUTHENTICATEDRESPONSE,
     serialized_options=b'\202\323\344\223\0021\022//identity-management/v1.0.0/authenticate/status',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getUser',
@@ -371,6 +398,7 @@
     input_type=IdentityService__pb2._AUTHTOKEN,
     output_type=IdentityService__pb2._USER,
     serialized_options=b'\202\323\344\223\002\"\022 /identity-management/v1.0.0/user',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getUserManagementServiceAccountAccessToken',
@@ -380,6 +408,7 @@
     input_type=IdentityService__pb2._GETUSERMANAGEMENTSATOKENREQUEST,
     output_type=IdentityService__pb2._AUTHTOKEN,
     serialized_options=b'\202\323\344\223\002+\022)/identity-management/v1.0.0/account/token',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='endUserSession',
@@ -389,6 +418,7 @@
     input_type=_ENDSESSIONREQUEST,
     output_type=IdentityService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002/\"\'/identity-management/v1.0.0/user/logout:\004body',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='authorize',
@@ -398,6 +428,7 @@
     input_type=_AUTHORIZATIONREQUEST,
     output_type=_AUTHORIZATIONRESPONSE,
     serialized_options=b'\202\323\344\223\002\'\022%/identity-management/v1.0.0/authorize',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='token',
@@ -407,6 +438,7 @@
     input_type=IdentityService__pb2._GETTOKENREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=b'\202\323\344\223\002#\"!/identity-management/v1.0.0/token',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getCredentials',
@@ -416,6 +448,7 @@
     input_type=_GETCREDENTIALSREQUEST,
     output_type=CredentialStoreService__pb2._CREDENTIALS,
     serialized_options=b'\202\323\344\223\002)\022\'/identity-management/v1.0.0/credentials',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getOIDCConfiguration',
@@ -425,6 +458,7 @@
     input_type=IdentityService__pb2._GETOIDCCONFIGURATION,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=b'\202\323\344\223\002>\022</identity-management/v1.0.0/.well-known/openid-configuration',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAgentToken',
@@ -434,6 +468,7 @@
     input_type=_GETAGENTTOKENREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
     serialized_options=b'\202\323\344\223\0025\"3/identity-management/v1.0.0/agent/token/{client_id}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='endAgentSession',
@@ -443,6 +478,17 @@
     input_type=_ENDSESSIONREQUEST,
     output_type=IdentityService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002<\"4/identity-management/v1.0.0/agent/logout/{client_id}:\004body',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isAgentAuthenticated',
+    full_name='org.apache.custos.identity.management.service.IdentityManagementService.isAgentAuthenticated',
+    index=11,
+    containing_service=None,
+    input_type=IdentityService__pb2._AUTHTOKEN,
+    output_type=IdentityService__pb2._ISAUTHENTICATEDRESPONSE,
+    serialized_options=b'\202\323\344\223\002?\"7/identity-management/v1.0.0/agent/authentication/status:\004body',
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_IDENTITYMANAGEMENTSERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2_grpc.py
index eae4ee1..d570a3d 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/IdentityManagementService_pb2_grpc.py
@@ -1,4 +1,22 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 import custos.server.core.CredentialStoreService_pb2 as CredentialStoreService__pb2
@@ -8,212 +26,424 @@
 
 
 class IdentityManagementServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.authenticate = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/authenticate',
-        request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.AuthToken.FromString,
-        )
-    self.isAuthenticated = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/isAuthenticated',
-        request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-        response_deserializer=IdentityService__pb2.IsAuthenticateResponse.FromString,
-        )
-    self.getUser = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/getUser',
-        request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-        response_deserializer=IdentityService__pb2.User.FromString,
-        )
-    self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/getUserManagementServiceAccountAccessToken',
-        request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.AuthToken.FromString,
-        )
-    self.endUserSession = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/endUserSession',
-        request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.OperationStatus.FromString,
-        )
-    self.authorize = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/authorize',
-        request_serializer=IdentityManagementService__pb2.AuthorizationRequest.SerializeToString,
-        response_deserializer=IdentityManagementService__pb2.AuthorizationResponse.FromString,
-        )
-    self.token = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/token',
-        request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getCredentials = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/getCredentials',
-        request_serializer=IdentityManagementService__pb2.GetCredentialsRequest.SerializeToString,
-        response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
-        )
-    self.getOIDCConfiguration = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/getOIDCConfiguration',
-        request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.getAgentToken = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/getAgentToken',
-        request_serializer=IdentityManagementService__pb2.GetAgentTokenRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
-        )
-    self.endAgentSession = channel.unary_unary(
-        '/org.apache.custos.identity.management.service.IdentityManagementService/endAgentSession',
-        request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
-        response_deserializer=IdentityService__pb2.OperationStatus.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.authenticate = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/authenticate',
+                request_serializer=IdentityService__pb2.AuthenticationRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.isAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/isAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
+        self.getUser = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getUser',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.User.FromString,
+                )
+        self.getUserManagementServiceAccountAccessToken = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getUserManagementServiceAccountAccessToken',
+                request_serializer=IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.AuthToken.FromString,
+                )
+        self.endUserSession = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/endUserSession',
+                request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
+        self.authorize = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/authorize',
+                request_serializer=IdentityManagementService__pb2.AuthorizationRequest.SerializeToString,
+                response_deserializer=IdentityManagementService__pb2.AuthorizationResponse.FromString,
+                )
+        self.token = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/token',
+                request_serializer=IdentityService__pb2.GetTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getCredentials = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getCredentials',
+                request_serializer=IdentityManagementService__pb2.GetCredentialsRequest.SerializeToString,
+                response_deserializer=CredentialStoreService__pb2.Credentials.FromString,
+                )
+        self.getOIDCConfiguration = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getOIDCConfiguration',
+                request_serializer=IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.getAgentToken = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/getAgentToken',
+                request_serializer=IdentityManagementService__pb2.GetAgentTokenRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+                )
+        self.endAgentSession = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/endAgentSession',
+                request_serializer=IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+                response_deserializer=IdentityService__pb2.OperationStatus.FromString,
+                )
+        self.isAgentAuthenticated = channel.unary_unary(
+                '/org.apache.custos.identity.management.service.IdentityManagementService/isAgentAuthenticated',
+                request_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+                response_deserializer=IdentityService__pb2.IsAuthenticatedResponse.FromString,
+                )
 
 
 class IdentityManagementServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def authenticate(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def authenticate(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def isAuthenticated(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def isAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getUser(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getUserManagementServiceAccountAccessToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getUserManagementServiceAccountAccessToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def endUserSession(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def endUserSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def authorize(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def authorize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def token(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def token(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getCredentials(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getCredentials(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getOIDCConfiguration(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getOIDCConfiguration(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAgentToken(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAgentToken(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def endAgentSession(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def endAgentSession(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isAgentAuthenticated(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_IdentityManagementServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'authenticate': grpc.unary_unary_rpc_method_handler(
-          servicer.authenticate,
-          request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
-          response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-      ),
-      'isAuthenticated': grpc.unary_unary_rpc_method_handler(
-          servicer.isAuthenticated,
-          request_deserializer=IdentityService__pb2.AuthToken.FromString,
-          response_serializer=IdentityService__pb2.IsAuthenticateResponse.SerializeToString,
-      ),
-      'getUser': grpc.unary_unary_rpc_method_handler(
-          servicer.getUser,
-          request_deserializer=IdentityService__pb2.AuthToken.FromString,
-          response_serializer=IdentityService__pb2.User.SerializeToString,
-      ),
-      'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getUserManagementServiceAccountAccessToken,
-          request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
-          response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
-      ),
-      'endUserSession': grpc.unary_unary_rpc_method_handler(
-          servicer.endUserSession,
-          request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
-          response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
-      ),
-      'authorize': grpc.unary_unary_rpc_method_handler(
-          servicer.authorize,
-          request_deserializer=IdentityManagementService__pb2.AuthorizationRequest.FromString,
-          response_serializer=IdentityManagementService__pb2.AuthorizationResponse.SerializeToString,
-      ),
-      'token': grpc.unary_unary_rpc_method_handler(
-          servicer.token,
-          request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getCredentials': grpc.unary_unary_rpc_method_handler(
-          servicer.getCredentials,
-          request_deserializer=IdentityManagementService__pb2.GetCredentialsRequest.FromString,
-          response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
-      ),
-      'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
-          servicer.getOIDCConfiguration,
-          request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'getAgentToken': grpc.unary_unary_rpc_method_handler(
-          servicer.getAgentToken,
-          request_deserializer=IdentityManagementService__pb2.GetAgentTokenRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
-      ),
-      'endAgentSession': grpc.unary_unary_rpc_method_handler(
-          servicer.endAgentSession,
-          request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
-          response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.identity.management.service.IdentityManagementService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'authenticate': grpc.unary_unary_rpc_method_handler(
+                    servicer.authenticate,
+                    request_deserializer=IdentityService__pb2.AuthenticationRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'isAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+            'getUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUser,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.User.SerializeToString,
+            ),
+            'getUserManagementServiceAccountAccessToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getUserManagementServiceAccountAccessToken,
+                    request_deserializer=IdentityService__pb2.GetUserManagementSATokenRequest.FromString,
+                    response_serializer=IdentityService__pb2.AuthToken.SerializeToString,
+            ),
+            'endUserSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endUserSession,
+                    request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+            'authorize': grpc.unary_unary_rpc_method_handler(
+                    servicer.authorize,
+                    request_deserializer=IdentityManagementService__pb2.AuthorizationRequest.FromString,
+                    response_serializer=IdentityManagementService__pb2.AuthorizationResponse.SerializeToString,
+            ),
+            'token': grpc.unary_unary_rpc_method_handler(
+                    servicer.token,
+                    request_deserializer=IdentityService__pb2.GetTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getCredentials': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentials,
+                    request_deserializer=IdentityManagementService__pb2.GetCredentialsRequest.FromString,
+                    response_serializer=CredentialStoreService__pb2.Credentials.SerializeToString,
+            ),
+            'getOIDCConfiguration': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOIDCConfiguration,
+                    request_deserializer=IdentityService__pb2.GetOIDCConfiguration.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'getAgentToken': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAgentToken,
+                    request_deserializer=IdentityManagementService__pb2.GetAgentTokenRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_struct__pb2.Struct.SerializeToString,
+            ),
+            'endAgentSession': grpc.unary_unary_rpc_method_handler(
+                    servicer.endAgentSession,
+                    request_deserializer=IdentityManagementService__pb2.EndSessionRequest.FromString,
+                    response_serializer=IdentityService__pb2.OperationStatus.SerializeToString,
+            ),
+            'isAgentAuthenticated': grpc.unary_unary_rpc_method_handler(
+                    servicer.isAgentAuthenticated,
+                    request_deserializer=IdentityService__pb2.AuthToken.FromString,
+                    response_serializer=IdentityService__pb2.IsAuthenticatedResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.identity.management.service.IdentityManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class IdentityManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def authenticate(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/authenticate',
+            IdentityService__pb2.AuthenticationRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/isAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getUser',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.User.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getUserManagementServiceAccountAccessToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getUserManagementServiceAccountAccessToken',
+            IdentityService__pb2.GetUserManagementSATokenRequest.SerializeToString,
+            IdentityService__pb2.AuthToken.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endUserSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/endUserSession',
+            IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def authorize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/authorize',
+            IdentityManagementService__pb2.AuthorizationRequest.SerializeToString,
+            IdentityManagementService__pb2.AuthorizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def token(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/token',
+            IdentityService__pb2.GetTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentials(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getCredentials',
+            IdentityManagementService__pb2.GetCredentialsRequest.SerializeToString,
+            CredentialStoreService__pb2.Credentials.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOIDCConfiguration(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getOIDCConfiguration',
+            IdentityService__pb2.GetOIDCConfiguration.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAgentToken(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/getAgentToken',
+            IdentityManagementService__pb2.GetAgentTokenRequest.SerializeToString,
+            google_dot_protobuf_dot_struct__pb2.Struct.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def endAgentSession(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/endAgentSession',
+            IdentityManagementService__pb2.EndSessionRequest.SerializeToString,
+            IdentityService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isAgentAuthenticated(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.identity.management.service.IdentityManagementService/isAgentAuthenticated',
+            IdentityService__pb2.AuthToken.SerializeToString,
+            IdentityService__pb2.IsAuthenticatedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2.py
new file mode 100644
index 0000000..bb02df8
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+
+#  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.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: LogManagementService.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='LogManagementService.proto',
+  package='org.apache.custos.log.management.service',
+  syntax='proto3',
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1aLogManagementService.proto\x12(org.apache.custos.log.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x14LoggingService.proto2\xee\x03\n\x14LogManagementService\x12\x95\x01\n\x0cgetLogEvents\x12\x32.org.apache.custos.logging.service.LogEventRequest\x1a,.org.apache.custos.logging.service.LogEvents\"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/log-management/v1.0.0/logs\x12\xa0\x01\n\x0cisLogEnabled\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/log-management/v1.0.0/status\x12\x9a\x01\n\x06\x65nable\x12>.org.apache.custos.logging.service.LoggingConfigurationRequest\x1a).org.apache.custos.logging.service.Status\"%\x82\xd3\xe4\x93\x02\x1f\"\x1d/log-management/v1.0.0/statusB\x08P\x01Z\x04./pbb\x06proto3'
+  ,
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,LoggingService__pb2.DESCRIPTOR,])
+
+
+
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+
+_LOGMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
+  name='LogManagementService',
+  full_name='org.apache.custos.log.management.service.LogManagementService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=184,
+  serialized_end=678,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='getLogEvents',
+    full_name='org.apache.custos.log.management.service.LogManagementService.getLogEvents',
+    index=0,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGEVENTREQUEST,
+    output_type=LoggingService__pb2._LOGEVENTS,
+    serialized_options=b'\202\323\344\223\002\035\022\033/log-management/v1.0.0/logs',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='isLogEnabled',
+    full_name='org.apache.custos.log.management.service.LogManagementService.isLogEnabled',
+    index=1,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGGINGCONFIGURATIONREQUEST,
+    output_type=LoggingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002\037\022\035/log-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enable',
+    full_name='org.apache.custos.log.management.service.LogManagementService.enable',
+    index=2,
+    containing_service=None,
+    input_type=LoggingService__pb2._LOGGINGCONFIGURATIONREQUEST,
+    output_type=LoggingService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\002\037\"\035/log-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LOGMANAGEMENTSERVICE)
+
+DESCRIPTOR.services_by_name['LogManagementService'] = _LOGMANAGEMENTSERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2_grpc.py
new file mode 100644
index 0000000..640d355
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/LogManagementService_pb2_grpc.py
@@ -0,0 +1,149 @@
+#  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.
+
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+import custos.server.core.LoggingService_pb2 as LoggingService__pb2
+
+
+class LogManagementServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.getLogEvents = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/getLogEvents',
+                request_serializer=LoggingService__pb2.LogEventRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.LogEvents.FromString,
+                )
+        self.isLogEnabled = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/isLogEnabled',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+        self.enable = channel.unary_unary(
+                '/org.apache.custos.log.management.service.LogManagementService/enable',
+                request_serializer=LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+                response_deserializer=LoggingService__pb2.Status.FromString,
+                )
+
+
+class LogManagementServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def getLogEvents(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def isLogEnabled(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def enable(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_LogManagementServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'getLogEvents': grpc.unary_unary_rpc_method_handler(
+                    servicer.getLogEvents,
+                    request_deserializer=LoggingService__pb2.LogEventRequest.FromString,
+                    response_serializer=LoggingService__pb2.LogEvents.SerializeToString,
+            ),
+            'isLogEnabled': grpc.unary_unary_rpc_method_handler(
+                    servicer.isLogEnabled,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+            'enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.enable,
+                    request_deserializer=LoggingService__pb2.LoggingConfigurationRequest.FromString,
+                    response_serializer=LoggingService__pb2.Status.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.log.management.service.LogManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class LogManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def getLogEvents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/getLogEvents',
+            LoggingService__pb2.LogEventRequest.SerializeToString,
+            LoggingService__pb2.LogEvents.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def isLogEnabled(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/isLogEnabled',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enable(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.log.management.service.LogManagementService/enable',
+            LoggingService__pb2.LoggingConfigurationRequest.SerializeToString,
+            LoggingService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
index d2b0f2f..728174c 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
@@ -1,4 +1,22 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: ResourceSecretManagementService.proto
 """Generated protocol buffer code."""
@@ -22,9 +40,9 @@
   name='ResourceSecretManagementService.proto',
   package='org.apache.custos.resource.secret.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%ResourceSecretManagementService.proto\x12\x34org.apache.custos.resource.secret.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1bResourceSecretService.proto\x1a\x15IdentityService.proto2\xf4\x16\n\x1fResourceSecretManagementService\x12\xb6\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"1\x82\xd3\xe4\x93\x02+\x12)/resource-secret-management/v1.0.0/secret\x12\x97\x01\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\"?\x82\xd3\xe4\x93\x02\x39\x12\x37/resource-secret-management/v1.0.0/openid-connect/certs\x12\xe4\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/resource-secret-management/v1.0.0/secret/summary\x12\xfa\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\";\x82\xd3\xe4\x93\x02\x35\x12\x33/resource-secret-management/v1.0.0/secret/summaries\x12\xcd\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"5\x82\xd3\xe4\x93\x02/\"-/resource-secret-management/v1.0.0/secret/ssh\x12\xdc\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\":\x82\xd3\xe4\x93\x02\x34\"2/resource-secret-management/v1.0.0/secret/password\x12\xe5\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"=\x82\xd3\xe4\x93\x02\x37\"5/resource-secret-management/v1.0.0/secret/certificate\x12\xd3\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\"5\x82\xd3\xe4\x93\x02/\x12-/resource-secret-management/v1.0.0/secret/ssh\x12\xe2\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\":\x82\xd3\xe4\x93\x02\x34\x12\x32/resource-secret-management/v1.0.0/secret/password\x12\xeb\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/resource-secret-management/v1.0.0/secret/certificate\x12\xea\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/*-/resource-secret-management/v1.0.0/secret/ssh\x12\xef\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\":\x82\xd3\xe4\x93\x02\x34*2/resource-secret-management/v1.0.0/secret/password\x12\xfa\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"=\x82\xd3\xe4\x93\x02\x37*5/resource-secret-management/v1.0.0/secret/certificateB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n%ResourceSecretManagementService.proto\x12\x34org.apache.custos.resource.secret.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1bResourceSecretService.proto\x1a\x15IdentityService.proto2\xe7#\n\x1fResourceSecretManagementService\x12\xb6\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"1\x82\xd3\xe4\x93\x02+\x12)/resource-secret-management/v1.0.0/secret\x12\xb9\x01\n\x0fgetKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1a\x37.org.apache.custos.resource.secret.service.KVCredential\"4\x82\xd3\xe4\x93\x02.\x12,/resource-secret-management/v1.0.0/secret/kv\x12\xce\x01\n\x0f\x61\x64\x64KVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.\",/resource-secret-management/v1.0.0/secret/kv\x12\xd1\x01\n\x12updateKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.\x1a,/resource-secret-management/v1.0.0/secret/kv\x12\xd1\x01\n\x12\x64\x65leteKVCredential\x12\x37.org.apache.custos.resource.secret.service.KVCredential\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"4\x82\xd3\xe4\x93\x02.*,/resource-secret-management/v1.0.0/secret/kv\x12\x97\x01\n\x07getJWKS\x12\x32.org.apache.custos.identity.service.GetJWKSRequest\x1a\x17.google.protobuf.Struct\"?\x82\xd3\xe4\x93\x02\x39\x12\x37/resource-secret-management/v1.0.0/openid-connect/certs\x12\xe4\x01\n\x1cgetResourceCredentialSummary\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/resource-secret-management/v1.0.0/secret/summary\x12\xfa\x01\n!getAllResourceCredentialSummaries\x12P.org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest\x1a\x46.org.apache.custos.resource.secret.service.ResourceCredentialSummaries\";\x82\xd3\xe4\x93\x02\x35\x12\x33/resource-secret-management/v1.0.0/secret/summaries\x12\xcd\x01\n\x10\x61\x64\x64SSHCredential\x12\x38.org.apache.custos.resource.secret.service.SSHCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"5\x82\xd3\xe4\x93\x02/\"-/resource-secret-management/v1.0.0/secret/ssh\x12\xdc\x01\n\x15\x61\x64\x64PasswordCredential\x12=.org.apache.custos.resource.secret.service.PasswordCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\":\x82\xd3\xe4\x93\x02\x34\"2/resource-secret-management/v1.0.0/secret/password\x12\xe5\x01\n\x18\x61\x64\x64\x43\x65rtificateCredential\x12@.org.apache.custos.resource.secret.service.CertificateCredential\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"=\x82\xd3\xe4\x93\x02\x37\"5/resource-secret-management/v1.0.0/secret/certificate\x12\xd3\x01\n\x10getSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a\x38.org.apache.custos.resource.secret.service.SSHCredential\"5\x82\xd3\xe4\x93\x02/\x12-/resource-secret-management/v1.0.0/secret/ssh\x12\xe2\x01\n\x15getPasswordCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a=.org.apache.custos.resource.secret.service.PasswordCredential\":\x82\xd3\xe4\x93\x02\x34\x12\x32/resource-secret-management/v1.0.0/secret/password\x12\xeb\x01\n\x18getCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1a@.org.apache.custos.resource.secret.service.CertificateCredential\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/resource-secret-management/v1.0.0/secret/certificate\x12\xea\x01\n\x13\x64\x65leteSSHCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/*-/resource-secret-management/v1.0.0/secret/ssh\x12\xef\x01\n\x13\x64\x65letePWDCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\":\x82\xd3\xe4\x93\x02\x34*2/resource-secret-management/v1.0.0/secret/password\x12\xfa\x01\n\x1b\x64\x65leteCertificateCredential\x12N.org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"=\x82\xd3\xe4\x93\x02\x37*5/resource-secret-management/v1.0.0/secret/certificate\x12\xbd\x01\n\x10getCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1a\x38.org.apache.custos.resource.secret.service.CredentialMap\"5\x82\xd3\xe4\x93\x02/\x12-/resource-secret-management/v1.0.0/secret/map\x12\xcd\x01\n\x10\x61\x64\x64\x43redentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aH.org.apache.custos.resource.secret.service.AddResourceCredentialResponse\"5\x82\xd3\xe4\x93\x02/\"-/resource-secret-management/v1.0.0/secret/map\x12\xd4\x01\n\x13updateCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/\x1a-/resource-secret-management/v1.0.0/secret/map\x12\xd4\x01\n\x13\x64\x65leteCredentialMap\x12\x38.org.apache.custos.resource.secret.service.CredentialMap\x1aL.org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus\"5\x82\xd3\xe4\x93\x02/*-/resource-secret-management/v1.0.0/secret/mapB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,ResourceSecretService__pb2.DESCRIPTOR,IdentityService__pb2.DESCRIPTOR,])
 
@@ -43,7 +61,7 @@
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
   serialized_start=237,
-  serialized_end=3169,
+  serialized_end=4820,
   methods=[
   _descriptor.MethodDescriptor(
     name='getSecret',
@@ -56,9 +74,49 @@
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    serialized_options=b'\202\323\344\223\002.\022,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\",/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.updateKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\032,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteKVCredential',
+    index=4,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.*,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
     name='getJWKS',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getJWKS',
-    index=1,
+    index=5,
     containing_service=None,
     input_type=IdentityService__pb2._GETJWKSREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
@@ -68,7 +126,7 @@
   _descriptor.MethodDescriptor(
     name='getResourceCredentialSummary',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getResourceCredentialSummary',
-    index=2,
+    index=6,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._SECRETMETADATA,
@@ -78,7 +136,7 @@
   _descriptor.MethodDescriptor(
     name='getAllResourceCredentialSummaries',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getAllResourceCredentialSummaries',
-    index=3,
+    index=7,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALSUMMARIESREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALSUMMARIES,
@@ -88,7 +146,7 @@
   _descriptor.MethodDescriptor(
     name='addSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addSSHCredential',
-    index=4,
+    index=8,
     containing_service=None,
     input_type=ResourceSecretService__pb2._SSHCREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -98,7 +156,7 @@
   _descriptor.MethodDescriptor(
     name='addPasswordCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addPasswordCredential',
-    index=5,
+    index=9,
     containing_service=None,
     input_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -108,7 +166,7 @@
   _descriptor.MethodDescriptor(
     name='addCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addCertificateCredential',
-    index=6,
+    index=10,
     containing_service=None,
     input_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -118,7 +176,7 @@
   _descriptor.MethodDescriptor(
     name='getSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getSSHCredential',
-    index=7,
+    index=11,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._SSHCREDENTIAL,
@@ -128,7 +186,7 @@
   _descriptor.MethodDescriptor(
     name='getPasswordCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getPasswordCredential',
-    index=8,
+    index=12,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
@@ -138,7 +196,7 @@
   _descriptor.MethodDescriptor(
     name='getCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getCertificateCredential',
-    index=9,
+    index=13,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
@@ -148,7 +206,7 @@
   _descriptor.MethodDescriptor(
     name='deleteSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteSSHCredential',
-    index=10,
+    index=14,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
@@ -158,7 +216,7 @@
   _descriptor.MethodDescriptor(
     name='deletePWDCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deletePWDCredential',
-    index=11,
+    index=15,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
@@ -168,13 +226,53 @@
   _descriptor.MethodDescriptor(
     name='deleteCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteCertificateCredential',
-    index=12,
+    index=16,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\0027*5/resource-secret-management/v1.0.0/secret/certificate',
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='getCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getCredentialMap',
+    index=17,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    serialized_options=b'\202\323\344\223\002/\022-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addCredentialMap',
+    index=18,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
+    serialized_options=b'\202\323\344\223\002/\"-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.updateCredentialMap',
+    index=19,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/\032-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteCredentialMap',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteCredentialMap',
+    index=20,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._CREDENTIALMAP,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002/*-/resource-secret-management/v1.0.0/secret/map',
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_RESOURCESECRETMANAGEMENTSERVICE)
 
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
index 46f4569..984bf4c 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
@@ -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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
@@ -21,6 +38,26 @@
                 request_serializer=ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
                 response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
                 )
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.addKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
         self.getJWKS = channel.unary_unary(
                 '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getJWKS',
                 request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
@@ -81,6 +118,26 @@
                 request_serializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.SerializeToString,
                 response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
                 )
+        self.getCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                )
+        self.addCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+                )
+        self.updateCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteCredentialMap = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCredentialMap',
+                request_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
 
 
 class ResourceSecretManagementServiceServicer(object):
@@ -92,6 +149,30 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def getJWKS(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -164,6 +245,30 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def getCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteCredentialMap(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_ResourceSecretManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -172,6 +277,26 @@
                     request_deserializer=ResourceSecretService__pb2.GetSecretRequest.FromString,
                     response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
             ),
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'addKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
             'getJWKS': grpc.unary_unary_rpc_method_handler(
                     servicer.getJWKS,
                     request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
@@ -232,6 +357,26 @@
                     request_deserializer=ResourceSecretService__pb2.GetResourceCredentialByTokenRequest.FromString,
                     response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
             ),
+            'getCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ),
+            'addCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.addCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.AddResourceCredentialResponse.SerializeToString,
+            ),
+            'updateCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteCredentialMap': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteCredentialMap,
+                    request_deserializer=ResourceSecretService__pb2.CredentialMap.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'org.apache.custos.resource.secret.management.service.ResourceSecretManagementService', rpc_method_handlers)
@@ -260,6 +405,74 @@
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def getKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def getJWKS(request,
             target,
             options=(),
@@ -462,3 +675,71 @@
             ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.CredentialMap.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.AddResourceCredentialResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteCredentialMap(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteCredentialMap',
+            ResourceSecretService__pb2.CredentialMap.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2.py
index 601e34d..d5dc1f9 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2.py
@@ -1,4 +1,22 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: SharingManagementService.proto
 """Generated protocol buffer code."""
@@ -19,9 +37,9 @@
   name='SharingManagementService.proto',
   package='org.apache.custos.sharing.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1eSharingManagementService.proto\x12,org.apache.custos.sharing.management.service\x1a\x14SharingService.proto\x1a\x1cgoogle/api/annotations.proto2\xaa!\n\x18SharingManagementService\x12\xa3\x01\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\x1a&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/entity/type\x12\xa4\x01\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/entity/types\x12\xaf\x01\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\"*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\x1a*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,**/sharing-management/v1.0.0/permission/type\x12\xb4\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\"2\x82\xd3\xe4\x93\x02,\x12*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/permission/types\x12\x96\x01\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\"!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\x1a!/sharing-management/v1.0.0/entity\x12\xa2\x01\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/entity/existence\x12\x93\x01\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\")\x82\xd3\xe4\x93\x02#\x12!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#*!/sharing-management/v1.0.0/entity\x12\x9c\x01\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\"+\x82\xd3\xe4\x93\x02%\"#/sharing-management/v1.0.0/entities\x12\xaa\x01\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/users/share\x12\xb9\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/users/share/direct\x12\xac\x01\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/groups/share\x12\xbb\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"6\x82\xd3\xe4\x93\x02\x30\x12./sharing-management/v1.0.0/groups/share/direct\x12\xa4\x01\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/users/share\x12\xa6\x01\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)\"\'/sharing-management/v1.0.0/groups/share\x12\xac\x01\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/users/share\x12\xae\x01\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)*\'/sharing-management/v1.0.0/groups/share\x12\xa4\x01\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/entity/user/accessB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x1eSharingManagementService.proto\x12,org.apache.custos.sharing.management.service\x1a\x14SharingService.proto\x1a\x1cgoogle/api/annotations.proto2\xe8\"\n\x18SharingManagementService\x12\xa3\x01\n\x10\x63reateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10updateEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\x1a&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x10\x64\x65leteEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/entity/type\x12\xa4\x01\n\rgetEntityType\x12\x34.org.apache.custos.sharing.service.EntityTypeRequest\x1a-.org.apache.custos.sharing.service.EntityType\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/entity/type\x12\xa3\x01\n\x0egetEntityTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a..org.apache.custos.sharing.service.EntityTypes\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/entity/types\x12\xaf\x01\n\x14\x63reatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\"*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14updatePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,\x1a*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x14\x64\x65letePermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a).org.apache.custos.sharing.service.Status\"2\x82\xd3\xe4\x93\x02,**/sharing-management/v1.0.0/permission/type\x12\xb4\x01\n\x11getPermissionType\x12\x38.org.apache.custos.sharing.service.PermissionTypeRequest\x1a\x31.org.apache.custos.sharing.service.PermissionType\"2\x82\xd3\xe4\x93\x02,\x12*/sharing-management/v1.0.0/permission/type\x12\xaf\x01\n\x12getPermissionTypes\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a\x32.org.apache.custos.sharing.service.PermissionTypes\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/permission/types\x12\x96\x01\n\x0c\x63reateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\"!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0cupdateEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#\x1a!/sharing-management/v1.0.0/entity\x12\xa2\x01\n\x0eisEntityExists\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\"3\x82\xd3\xe4\x93\x02-\x12+/sharing-management/v1.0.0/entity/existence\x12\x93\x01\n\tgetEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Entity\")\x82\xd3\xe4\x93\x02#\x12!/sharing-management/v1.0.0/entity\x12\x96\x01\n\x0c\x64\x65leteEntity\x12\x30.org.apache.custos.sharing.service.EntityRequest\x1a).org.apache.custos.sharing.service.Status\")\x82\xd3\xe4\x93\x02#*!/sharing-management/v1.0.0/entity\x12\x9c\x01\n\x0esearchEntities\x12\x30.org.apache.custos.sharing.service.SearchRequest\x1a+.org.apache.custos.sharing.service.Entities\"+\x82\xd3\xe4\x93\x02%\"#/sharing-management/v1.0.0/entities\x12\xaa\x01\n\x14getListOfSharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\".\x82\xd3\xe4\x93\x02(\x12&/sharing-management/v1.0.0/users/share\x12\xb9\x01\n\x1cgetListOfDirectlySharedUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/users/share/direct\x12\xac\x01\n\x15getListOfSharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/groups/share\x12\xbb\x01\n\x1dgetListOfDirectlySharedGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a/.org.apache.custos.sharing.service.SharedOwners\"6\x82\xd3\xe4\x93\x02\x30\x12./sharing-management/v1.0.0/groups/share/direct\x12\xbb\x01\n\x14getAllDirectSharings\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a?.org.apache.custos.sharing.service.GetAllDirectSharingsResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/sharing-management/v1.0.0/share/direct\x12\xa4\x01\n\x14shareEntityWithUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(\"&/sharing-management/v1.0.0/users/share\x12\xa6\x01\n\x15shareEntityWithGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)\"\'/sharing-management/v1.0.0/groups/share\x12\xac\x01\n\x1crevokeEntitySharingFromUsers\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\".\x82\xd3\xe4\x93\x02(*&/sharing-management/v1.0.0/users/share\x12\xae\x01\n\x1drevokeEntitySharingFromGroups\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"/\x82\xd3\xe4\x93\x02)*\'/sharing-management/v1.0.0/groups/share\x12\xa4\x01\n\ruserHasAccess\x12\x31.org.apache.custos.sharing.service.SharingRequest\x1a).org.apache.custos.sharing.service.Status\"5\x82\xd3\xe4\x93\x02/\x12-/sharing-management/v1.0.0/entity/user/accessB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[SharingService__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,])
 
@@ -40,7 +58,7 @@
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
   serialized_start=133,
-  serialized_end=4399,
+  serialized_end=4589,
   methods=[
   _descriptor.MethodDescriptor(
     name='createEntityType',
@@ -243,9 +261,19 @@
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
+    name='getAllDirectSharings',
+    full_name='org.apache.custos.sharing.management.service.SharingManagementService.getAllDirectSharings',
+    index=20,
+    containing_service=None,
+    input_type=SharingService__pb2._SHARINGREQUEST,
+    output_type=SharingService__pb2._GETALLDIRECTSHARINGSRESPONSE,
+    serialized_options=b'\202\323\344\223\002)\022\'/sharing-management/v1.0.0/share/direct',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
     name='shareEntityWithUsers',
     full_name='org.apache.custos.sharing.management.service.SharingManagementService.shareEntityWithUsers',
-    index=20,
+    index=21,
     containing_service=None,
     input_type=SharingService__pb2._SHARINGREQUEST,
     output_type=SharingService__pb2._STATUS,
@@ -255,7 +283,7 @@
   _descriptor.MethodDescriptor(
     name='shareEntityWithGroups',
     full_name='org.apache.custos.sharing.management.service.SharingManagementService.shareEntityWithGroups',
-    index=21,
+    index=22,
     containing_service=None,
     input_type=SharingService__pb2._SHARINGREQUEST,
     output_type=SharingService__pb2._STATUS,
@@ -265,7 +293,7 @@
   _descriptor.MethodDescriptor(
     name='revokeEntitySharingFromUsers',
     full_name='org.apache.custos.sharing.management.service.SharingManagementService.revokeEntitySharingFromUsers',
-    index=22,
+    index=23,
     containing_service=None,
     input_type=SharingService__pb2._SHARINGREQUEST,
     output_type=SharingService__pb2._STATUS,
@@ -275,7 +303,7 @@
   _descriptor.MethodDescriptor(
     name='revokeEntitySharingFromGroups',
     full_name='org.apache.custos.sharing.management.service.SharingManagementService.revokeEntitySharingFromGroups',
-    index=23,
+    index=24,
     containing_service=None,
     input_type=SharingService__pb2._SHARINGREQUEST,
     output_type=SharingService__pb2._STATUS,
@@ -285,7 +313,7 @@
   _descriptor.MethodDescriptor(
     name='userHasAccess',
     full_name='org.apache.custos.sharing.management.service.SharingManagementService.userHasAccess',
-    index=24,
+    index=25,
     containing_service=None,
     input_type=SharingService__pb2._SHARINGREQUEST,
     output_type=SharingService__pb2._STATUS,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2_grpc.py
index ced0625..12c9167 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/SharingManagementService_pb2_grpc.py
@@ -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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
@@ -114,6 +131,11 @@
                 request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
                 response_deserializer=SharingService__pb2.SharedOwners.FromString,
                 )
+        self.getAllDirectSharings = channel.unary_unary(
+                '/org.apache.custos.sharing.management.service.SharingManagementService/getAllDirectSharings',
+                request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
+                response_deserializer=SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+                )
         self.shareEntityWithUsers = channel.unary_unary(
                 '/org.apache.custos.sharing.management.service.SharingManagementService/shareEntityWithUsers',
                 request_serializer=SharingService__pb2.SharingRequest.SerializeToString,
@@ -264,6 +286,12 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def getAllDirectSharings(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def shareEntityWithUsers(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -397,6 +425,11 @@
                     request_deserializer=SharingService__pb2.SharingRequest.FromString,
                     response_serializer=SharingService__pb2.SharedOwners.SerializeToString,
             ),
+            'getAllDirectSharings': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllDirectSharings,
+                    request_deserializer=SharingService__pb2.SharingRequest.FromString,
+                    response_serializer=SharingService__pb2.GetAllDirectSharingsResponse.SerializeToString,
+            ),
             'shareEntityWithUsers': grpc.unary_unary_rpc_method_handler(
                     servicer.shareEntityWithUsers,
                     request_deserializer=SharingService__pb2.SharingRequest.FromString,
@@ -773,6 +806,23 @@
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def getAllDirectSharings(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.sharing.management.service.SharingManagementService/getAllDirectSharings',
+            SharingService__pb2.SharingRequest.SerializeToString,
+            SharingService__pb2.GetAllDirectSharingsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def shareEntityWithUsers(request,
             target,
             options=(),
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2.py
index d7d890a..398ff4e 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2.py
@@ -1,7 +1,25 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: TenantManagementService.proto
-
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
@@ -16,16 +34,19 @@
 from google.rpc import error_details_pb2 as google_dot_rpc_dot_error__details__pb2
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='TenantManagementService.proto',
   package='org.apache.custos.tenant.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
-  serialized_pb=b'\n\x1dTenantManagementService.proto\x12+org.apache.custos.tenant.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1aTenantProfileService.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\"\xe7\x01\n\x14\x43reateTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x14\n\x0cis_activated\x18\x03 \x01(\x08\x12\x1b\n\x13\x63lient_id_issued_at\x18\x04 \x01(\x01\x12 \n\x18\x63lient_secret_expires_at\x18\x05 \x01(\x01\x12\x1f\n\x17registration_client_uri\x18\x06 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x11 \x01(\t\x12\x0b\n\x03msg\x18\x07 \x01(\t\"\xf7\x04\n\x11GetTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x03 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x04 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x06 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x07 \x03(\t\x12\x15\n\rredirect_uris\x18\x08 \x03(\t\x12\x13\n\x0bgrant_types\x18\t \x03(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\n \x01(\x01\x12\x12\n\nclient_uri\x18\x0b \x01(\t\x12\r\n\x05scope\x18\x0c \x01(\t\x12\x0e\n\x06\x64omain\x18\r \x01(\t\x12\x0f\n\x07\x63omment\x18\x0e \x01(\t\x12\x10\n\x08logo_uri\x18\x0f \x01(\t\x12\x18\n\x10\x61pplication_type\x18\x10 \x01(\t\x12\x10\n\x08jwks_uri\x18\x11 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x12 \x01(\t\x12\x0f\n\x07tos_uri\x18\x13 \x01(\t\x12\x12\n\npolicy_uri\x18\x14 \x01(\t\x12V\n\x04jwks\x18\x15 \x03(\x0b\x32H.org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x16 \x01(\t\x12\x18\n\x10software_version\x18\x17 \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc9\x01\n\x10GetTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12@\n\x06tenant\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\x12M\n\x0b\x63redentials\x18\x05 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01\"\xca\x01\n\x13UpdateTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xca\x01\n\x13\x44\x65leteTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\")\n\x15GetCredentialsRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\"|\n\x16GetCredentialsResponse\x12\x13\n\x0biamClientId\x18\x01 \x01(\t\x12\x17\n\x0fiamClientSecret\x18\x02 \x01(\t\x12\x17\n\x0f\x63iLogonClientId\x18\x03 \x01(\t\x12\x1b\n\x13\x63iLogonClientSecret\x18\x04 \x01(\t2\xef\x13\n\x17TenantManagementService\x12\xb4\x01\n\x0c\x63reateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x41.org.apache.custos.tenant.management.service.CreateTenantResponse\"/\x82\xd3\xe4\x93\x02)\"\'/tenant-management/v1.0.0/oauth2/tenant\x12\xbb\x01\n\tgetTenant\x12=.org.apache.custos.tenant.management.service.GetTenantRequest\x1a>.org.apache.custos.tenant.management.service.GetTenantResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/oauth2/tenant\x12\xc7\x01\n\x0cupdateTenant\x12@.org.apache.custos.tenant.management.service.UpdateTenantRequest\x1a>.org.apache.custos.tenant.management.service.GetTenantResponse\"5\x82\xd3\xe4\x93\x02/\x1a\'/tenant-management/v1.0.0/oauth2/tenant:\x04\x62ody\x12\x99\x01\n\x0c\x64\x65leteTenant\x12@.org.apache.custos.tenant.management.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\"/\x82\xd3\xe4\x93\x02)*\'/tenant-management/v1.0.0/oauth2/tenant\x12\x92\x01\n\x0e\x61\x64\x64TenantRoles\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\"\'\x82\xd3\xe4\x93\x02!\"\x1f/tenant-management/v1.0.0/roles\x12\xaf\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/tenant-management/v1.0.0/protocol/mapper\x12\xad\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/events\x12\xbd\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/status\x12\xb8\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\")\x82\xd3\xe4\x93\x02#\x12!/tenant-management/v1.0.0/tenants\x12\xc0\x01\n\x0fgetChildTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/child/tenants\x12\xe1\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\":\x82\xd3\xe4\x93\x02\x34\x12\x32/tenant-management/v1.0.0/tenants/{requesterEmail}\x12\xe9\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/tenant-management/v1.0.0/audit/status/{tenantId}\x12\xf3\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/tenant-management/v1.0.0/audit/attributes/{tenantId}B\x02P\x01\x62\x06proto3'
+  serialized_options=b'P\001Z\004./pb',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1dTenantManagementService.proto\x12+org.apache.custos.tenant.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1aTenantProfileService.proto\x1a\x1egoogle/rpc/error_details.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x15IamAdminService.proto\x1a$FederatedAuthenticationService.proto\x1a\x16MessagingService.proto\"\xe7\x01\n\x14\x43reateTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x15\n\rclient_secret\x18\x02 \x01(\t\x12\x14\n\x0cis_activated\x18\x03 \x01(\x08\x12\x1b\n\x13\x63lient_id_issued_at\x18\x04 \x01(\x01\x12 \n\x18\x63lient_secret_expires_at\x18\x05 \x01(\x01\x12\x1f\n\x17registration_client_uri\x18\x06 \x01(\t\x12\"\n\x1atoken_endpoint_auth_method\x18\x11 \x01(\t\x12\x0b\n\x03msg\x18\x07 \x01(\t\"\x8f\x05\n\x11GetTenantResponse\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x13\n\x0b\x63lient_name\x18\x02 \x01(\t\x12\x17\n\x0frequester_email\x18\x03 \x01(\t\x12\x18\n\x10\x61\x64min_first_name\x18\x04 \x01(\t\x12\x17\n\x0f\x61\x64min_last_name\x18\x05 \x01(\t\x12\x13\n\x0b\x61\x64min_email\x18\x06 \x01(\t\x12\x10\n\x08\x63ontacts\x18\x07 \x03(\t\x12\x15\n\rredirect_uris\x18\x08 \x03(\t\x12\x13\n\x0bgrant_types\x18\t \x03(\t\x12\x1b\n\x13\x63lient_id_issued_at\x18\n \x01(\x01\x12\x12\n\nclient_uri\x18\x0b \x01(\t\x12\r\n\x05scope\x18\x0c \x01(\t\x12\x0e\n\x06\x64omain\x18\r \x01(\t\x12\x0f\n\x07\x63omment\x18\x0e \x01(\t\x12\x10\n\x08logo_uri\x18\x0f \x01(\t\x12\x18\n\x10\x61pplication_type\x18\x10 \x01(\t\x12\x10\n\x08jwks_uri\x18\x11 \x01(\t\x12#\n\x1b\x65xample_extension_parameter\x18\x12 \x01(\t\x12\x0f\n\x07tos_uri\x18\x13 \x01(\t\x12\x12\n\npolicy_uri\x18\x14 \x01(\t\x12V\n\x04jwks\x18\x15 \x03(\x0b\x32H.org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry\x12\x13\n\x0bsoftware_id\x18\x16 \x01(\t\x12\x18\n\x10software_version\x18\x17 \x01(\t\x12\x16\n\x0e\x61\x64min_username\x18\x18 \x01(\t\x1a+\n\tJwksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xc9\x01\n\x10GetTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12@\n\x06tenant\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\x12M\n\x0b\x63redentials\x18\x05 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\"\x80\x02\n\x0b\x43redentials\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\x12\x18\n\x10\x63ustos_client_id\x18\x05 \x01(\t\x12\x1c\n\x14\x63ustos_client_secret\x18\x06 \x01(\t\x12\"\n\x1a\x63ustos_client_id_issued_at\x18\x07 \x01(\x01\x12\'\n\x1f\x63ustos_client_secret_expired_at\x18\x08 \x01(\x01\"\xca\x01\n\x13UpdateTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"\xca\x01\n\x13\x44\x65leteTenantRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12M\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x38.org.apache.custos.tenant.management.service.Credentials\x12>\n\x04\x62ody\x18\x04 \x01(\x0b\x32\x30.org.apache.custos.tenant.profile.service.Tenant\"*\n\x15GetCredentialsRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\"\x86\x01\n\x16GetCredentialsResponse\x12\x15\n\riam_client_id\x18\x01 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x02 \x01(\t\x12\x1a\n\x12\x63i_logon_client_id\x18\x03 \x01(\t\x12\x1e\n\x16\x63i_logon_client_secret\x18\x04 \x01(\t\"@\n\x17TenantValidationRequest\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x12\n\nclient_sec\x18\x02 \x01(\t2\x87 \n\x17TenantManagementService\x12\xb4\x01\n\x0c\x63reateTenant\x12\x30.org.apache.custos.tenant.profile.service.Tenant\x1a\x41.org.apache.custos.tenant.management.service.CreateTenantResponse\"/\x82\xd3\xe4\x93\x02)\"\'/tenant-management/v1.0.0/oauth2/tenant\x12\xad\x01\n\tgetTenant\x12=.org.apache.custos.tenant.management.service.GetTenantRequest\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/oauth2/tenant\x12\xb9\x01\n\x0cupdateTenant\x12@.org.apache.custos.tenant.management.service.UpdateTenantRequest\x1a\x30.org.apache.custos.tenant.profile.service.Tenant\"5\x82\xd3\xe4\x93\x02/\x1a\'/tenant-management/v1.0.0/oauth2/tenant:\x04\x62ody\x12\x99\x01\n\x0c\x64\x65leteTenant\x12@.org.apache.custos.tenant.management.service.DeleteTenantRequest\x1a\x16.google.protobuf.Empty\"/\x82\xd3\xe4\x93\x02)*\'/tenant-management/v1.0.0/oauth2/tenant\x12\xc3\x01\n\x0evalidateTenant\x12\x44.org.apache.custos.tenant.management.service.TenantValidationRequest\x1a..org.apache.custos.iam.service.OperationStatus\";\x82\xd3\xe4\x93\x02\x35\"3/tenant-management/v1.0.0/tenant/credentials/status\x12\x92\x01\n\x0e\x61\x64\x64TenantRoles\x12..org.apache.custos.iam.service.AddRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\"\'\x82\xd3\xe4\x93\x02!\"\x1f/tenant-management/v1.0.0/roles\x12\x92\x01\n\x0egetTenantRoles\x12..org.apache.custos.iam.service.GetRolesRequest\x1a\'.org.apache.custos.iam.service.AllRoles\"\'\x82\xd3\xe4\x93\x02!\x12\x1f/tenant-management/v1.0.0/roles\x12\x96\x01\n\ndeleteRole\x12\x30.org.apache.custos.iam.service.DeleteRoleRequest\x1a..org.apache.custos.iam.service.OperationStatus\"&\x82\xd3\xe4\x93\x02 *\x1e/tenant-management/v1.0.0/role\x12\xaf\x01\n\x11\x61\x64\x64ProtocolMapper\x12\x37.org.apache.custos.iam.service.AddProtocolMapperRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\")/tenant-management/v1.0.0/protocol/mapper\x12\xad\x01\n\x19\x63onfigureEventPersistence\x12\x36.org.apache.custos.iam.service.EventPersistenceRequest\x1a..org.apache.custos.iam.service.OperationStatus\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/events\x12\xb9\x01\n\x0f\x65nableMessaging\x12;.org.apache.custos.messaging.service.MessageEnablingRequest\x1a<.org.apache.custos.messaging.service.MessageEnablingResponse\"+\x82\xd3\xe4\x93\x02%\"#/tenant-management/v1.0.0/messaging\x12\xbd\x01\n\x12updateTenantStatus\x12=.org.apache.custos.tenant.profile.service.UpdateStatusRequest\x1a>.org.apache.custos.tenant.profile.service.UpdateStatusResponse\"(\x82\xd3\xe4\x93\x02\"\" /tenant-management/v1.0.0/status\x12\xb8\x01\n\rgetAllTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\")\x82\xd3\xe4\x93\x02#\x12!/tenant-management/v1.0.0/tenants\x12\xc0\x01\n\x0fgetChildTenants\x12;.org.apache.custos.tenant.profile.service.GetTenantsRequest\x1a?.org.apache.custos.tenant.profile.service.GetAllTenantsResponse\"/\x82\xd3\xe4\x93\x02)\x12\'/tenant-management/v1.0.0/child/tenants\x12\xe1\x01\n\x14getAllTenantsForUser\x12\x45.org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest\x1a\x46.org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse\":\x82\xd3\xe4\x93\x02\x34\x12\x32/tenant-management/v1.0.0/tenants/{requesterEmail}\x12\xe9\x01\n\x1fgetTenantStatusUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aK.org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse\"9\x82\xd3\xe4\x93\x02\x33\x12\x31/tenant-management/v1.0.0/audit/status/{tenantId}\x12\xf3\x01\n\"getTenantAttributeUpdateAuditTrail\x12>.org.apache.custos.tenant.profile.service.GetAuditTrailRequest\x1aN.org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse\"=\x82\xd3\xe4\x93\x02\x37\x12\x35/tenant-management/v1.0.0/audit/attributes/{tenantId}\x12\xd4\x01\n\naddToCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\"<\x82\xd3\xe4\x93\x02\x36\"4/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xd9\x01\n\x0fremoveFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1a:.org.apache.custos.federated.authentication.service.Status\"<\x82\xd3\xe4\x93\x02\x36*4/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xe7\x01\n\x0cgetFromCache\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\"<\x82\xd3\xe4\x93\x02\x36\x12\x34/tenant-management/v1.0.0/cache/institutions/CILogon\x12\xe4\x01\n\x0fgetInstitutions\x12L.org.apache.custos.federated.authentication.service.CacheManipulationRequest\x1aK.org.apache.custos.federated.authentication.service.GetInstitutionsResponse\"6\x82\xd3\xe4\x93\x02\x30\x12./tenant-management/v1.0.0/institutions/CILogonB\x08P\x01Z\x04./pbb\x06proto3'
   ,
-  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,TenantProfileService__pb2.DESCRIPTOR,google_dot_rpc_dot_error__details__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
+  dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,TenantProfileService__pb2.DESCRIPTOR,google_dot_rpc_dot_error__details__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,FederatedAuthenticationService__pb2.DESCRIPTOR,MessagingService__pb2.DESCRIPTOR,])
 
 
 
@@ -36,6 +57,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_id', index=0,
@@ -43,56 +65,56 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='is_activated', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.is_activated', index=2,
       number=3, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id_issued_at', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_id_issued_at', index=3,
       number=4, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_secret_expires_at', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.client_secret_expires_at', index=4,
       number=5, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='registration_client_uri', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.registration_client_uri', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='token_endpoint_auth_method', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.token_endpoint_auth_method', index=6,
       number=17, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='msg', full_name='org.apache.custos.tenant.management.service.CreateTenantResponse.msg', index=7,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -105,8 +127,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=221,
-  serialized_end=452,
+  serialized_start=283,
+  serialized_end=514,
 )
 
 
@@ -116,6 +138,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='key', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry.key', index=0,
@@ -123,14 +146,14 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='value', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.JwksEntry.value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -143,8 +166,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1043,
-  serialized_end=1086,
+  serialized_start=1129,
+  serialized_end=1172,
 )
 
 _GETTENANTRESPONSE = _descriptor.Descriptor(
@@ -153,6 +176,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_id', index=0,
@@ -160,161 +184,168 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_name', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='requester_email', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.requester_email', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_first_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_first_name', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_last_name', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_last_name', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='admin_email', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_email', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='contacts', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.contacts', index=6,
       number=7, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='redirect_uris', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.redirect_uris', index=7,
       number=8, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='grant_types', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.grant_types', index=8,
       number=9, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_id_issued_at', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_id_issued_at', index=9,
       number=10, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='client_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.client_uri', index=10,
       number=11, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='scope', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.scope', index=11,
       number=12, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='domain', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.domain', index=12,
       number=13, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='comment', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.comment', index=13,
       number=14, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='logo_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.logo_uri', index=14,
       number=15, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='application_type', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.application_type', index=15,
       number=16, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='jwks_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.jwks_uri', index=16,
       number=17, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='example_extension_parameter', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.example_extension_parameter', index=17,
       number=18, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tos_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.tos_uri', index=18,
       number=19, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='policy_uri', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.policy_uri', index=19,
       number=20, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='jwks', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.jwks', index=20,
       number=21, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='software_id', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.software_id', index=21,
       number=22, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='software_version', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.software_version', index=22,
       number=23, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='admin_username', full_name='org.apache.custos.tenant.management.service.GetTenantResponse.admin_username', index=23,
+      number=24, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -327,8 +358,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=455,
-  serialized_end=1086,
+  serialized_start=517,
+  serialized_end=1172,
 )
 
 
@@ -338,6 +369,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.client_id', index=0,
@@ -345,28 +377,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.tenant', index=2,
       number=4, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='credentials', full_name='org.apache.custos.tenant.management.service.GetTenantRequest.credentials', index=3,
       number=5, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -379,8 +411,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1089,
-  serialized_end=1290,
+  serialized_start=1175,
+  serialized_end=1376,
 )
 
 
@@ -390,6 +422,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='iam_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.iam_client_id', index=0,
@@ -397,56 +430,56 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='iam_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.iam_client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='ci_logon_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.ci_logon_client_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='ci_logon_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.ci_logon_client_secret', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_id', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_id', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_secret', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_secret', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_id_issued_at', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_id_issued_at', index=6,
       number=7, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='custos_client_secret_expired_at', full_name='org.apache.custos.tenant.management.service.Credentials.custos_client_secret_expired_at', index=7,
       number=8, type=1, cpp_type=5, label=1,
       has_default_value=False, default_value=float(0),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -459,8 +492,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1293,
-  serialized_end=1549,
+  serialized_start=1379,
+  serialized_end=1635,
 )
 
 
@@ -470,6 +503,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.client_id', index=0,
@@ -477,28 +511,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='credentials', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.credentials', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='body', full_name='org.apache.custos.tenant.management.service.UpdateTenantRequest.body', index=3,
       number=4, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -511,8 +545,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1552,
-  serialized_end=1754,
+  serialized_start=1638,
+  serialized_end=1840,
 )
 
 
@@ -522,6 +556,7 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='client_id', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.client_id', index=0,
@@ -529,28 +564,28 @@
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='tenant_id', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.tenant_id', index=1,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='credentials', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.credentials', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='body', full_name='org.apache.custos.tenant.management.service.DeleteTenantRequest.body', index=3,
       number=4, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -563,8 +598,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1757,
-  serialized_end=1959,
+  serialized_start=1843,
+  serialized_end=2045,
 )
 
 
@@ -574,14 +609,15 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.tenant.management.service.GetCredentialsRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -594,8 +630,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1961,
-  serialized_end=2002,
+  serialized_start=2047,
+  serialized_end=2089,
 )
 
 
@@ -605,35 +641,36 @@
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='iamClientId', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iamClientId', index=0,
+      name='iam_client_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iam_client_id', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientSecret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iamClientSecret', index=1,
+      name='iam_client_secret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.iam_client_secret', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='ciLogonClientId', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ciLogonClientId', index=2,
+      name='ci_logon_client_id', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ci_logon_client_id', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='ciLogonClientSecret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ciLogonClientSecret', index=3,
+      name='ci_logon_client_secret', full_name='org.apache.custos.tenant.management.service.GetCredentialsResponse.ci_logon_client_secret', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -646,8 +683,47 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2004,
-  serialized_end=2128,
+  serialized_start=2092,
+  serialized_end=2226,
+)
+
+
+_TENANTVALIDATIONREQUEST = _descriptor.Descriptor(
+  name='TenantValidationRequest',
+  full_name='org.apache.custos.tenant.management.service.TenantValidationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.tenant.management.service.TenantValidationRequest.client_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.tenant.management.service.TenantValidationRequest.client_sec', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2228,
+  serialized_end=2292,
 )
 
 _GETTENANTRESPONSE_JWKSENTRY.containing_type = _GETTENANTRESPONSE
@@ -666,6 +742,7 @@
 DESCRIPTOR.message_types_by_name['DeleteTenantRequest'] = _DELETETENANTREQUEST
 DESCRIPTOR.message_types_by_name['GetCredentialsRequest'] = _GETCREDENTIALSREQUEST
 DESCRIPTOR.message_types_by_name['GetCredentialsResponse'] = _GETCREDENTIALSRESPONSE
+DESCRIPTOR.message_types_by_name['TenantValidationRequest'] = _TENANTVALIDATIONREQUEST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 CreateTenantResponse = _reflection.GeneratedProtocolMessageType('CreateTenantResponse', (_message.Message,), {
@@ -732,6 +809,13 @@
   })
 _sym_db.RegisterMessage(GetCredentialsResponse)
 
+TenantValidationRequest = _reflection.GeneratedProtocolMessageType('TenantValidationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TENANTVALIDATIONREQUEST,
+  '__module__' : 'TenantManagementService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.tenant.management.service.TenantValidationRequest)
+  })
+_sym_db.RegisterMessage(TenantValidationRequest)
+
 
 DESCRIPTOR._options = None
 _GETTENANTRESPONSE_JWKSENTRY._options = None
@@ -742,8 +826,9 @@
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=2131,
-  serialized_end=4674,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2295,
+  serialized_end=6398,
   methods=[
   _descriptor.MethodDescriptor(
     name='createTenant',
@@ -753,6 +838,7 @@
     input_type=TenantProfileService__pb2._TENANT,
     output_type=_CREATETENANTRESPONSE,
     serialized_options=b'\202\323\344\223\002)\"\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenant',
@@ -760,8 +846,9 @@
     index=1,
     containing_service=None,
     input_type=_GETTENANTREQUEST,
-    output_type=_GETTENANTRESPONSE,
+    output_type=TenantProfileService__pb2._TENANT,
     serialized_options=b'\202\323\344\223\002)\022\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateTenant',
@@ -769,8 +856,9 @@
     index=2,
     containing_service=None,
     input_type=_UPDATETENANTREQUEST,
-    output_type=_GETTENANTRESPONSE,
+    output_type=TenantProfileService__pb2._TENANT,
     serialized_options=b'\202\323\344\223\002/\032\'/tenant-management/v1.0.0/oauth2/tenant:\004body',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='deleteTenant',
@@ -780,87 +868,177 @@
     input_type=_DELETETENANTREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
     serialized_options=b'\202\323\344\223\002)*\'/tenant-management/v1.0.0/oauth2/tenant',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='validateTenant',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.validateTenant',
+    index=4,
+    containing_service=None,
+    input_type=_TENANTVALIDATIONREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\0025\"3/tenant-management/v1.0.0/tenant/credentials/status',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addTenantRoles',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.addTenantRoles',
-    index=4,
+    index=5,
     containing_service=None,
     input_type=IamAdminService__pb2._ADDROLESREQUEST,
     output_type=IamAdminService__pb2._ALLROLES,
     serialized_options=b'\202\323\344\223\002!\"\037/tenant-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getTenantRoles',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantRoles',
+    index=6,
+    containing_service=None,
+    input_type=IamAdminService__pb2._GETROLESREQUEST,
+    output_type=IamAdminService__pb2._ALLROLES,
+    serialized_options=b'\202\323\344\223\002!\022\037/tenant-management/v1.0.0/roles',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteRole',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.deleteRole',
+    index=7,
+    containing_service=None,
+    input_type=IamAdminService__pb2._DELETEROLEREQUEST,
+    output_type=IamAdminService__pb2._OPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002 *\036/tenant-management/v1.0.0/role',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='addProtocolMapper',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.addProtocolMapper',
-    index=5,
+    index=8,
     containing_service=None,
     input_type=IamAdminService__pb2._ADDPROTOCOLMAPPERREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002+\")/tenant-management/v1.0.0/protocol/mapper',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='configureEventPersistence',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.configureEventPersistence',
-    index=6,
+    index=9,
     containing_service=None,
     input_type=IamAdminService__pb2._EVENTPERSISTENCEREQUEST,
     output_type=IamAdminService__pb2._OPERATIONSTATUS,
     serialized_options=b'\202\323\344\223\002\"\" /tenant-management/v1.0.0/events',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='enableMessaging',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.enableMessaging',
+    index=10,
+    containing_service=None,
+    input_type=MessagingService__pb2._MESSAGEENABLINGREQUEST,
+    output_type=MessagingService__pb2._MESSAGEENABLINGRESPONSE,
+    serialized_options=b'\202\323\344\223\002%\"#/tenant-management/v1.0.0/messaging',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='updateTenantStatus',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.updateTenantStatus',
-    index=7,
+    index=11,
     containing_service=None,
     input_type=TenantProfileService__pb2._UPDATESTATUSREQUEST,
     output_type=TenantProfileService__pb2._UPDATESTATUSRESPONSE,
     serialized_options=b'\202\323\344\223\002\"\" /tenant-management/v1.0.0/status',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllTenants',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.getAllTenants',
-    index=8,
+    index=12,
     containing_service=None,
     input_type=TenantProfileService__pb2._GETTENANTSREQUEST,
     output_type=TenantProfileService__pb2._GETALLTENANTSRESPONSE,
     serialized_options=b'\202\323\344\223\002#\022!/tenant-management/v1.0.0/tenants',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getChildTenants',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.getChildTenants',
-    index=9,
+    index=13,
     containing_service=None,
     input_type=TenantProfileService__pb2._GETTENANTSREQUEST,
     output_type=TenantProfileService__pb2._GETALLTENANTSRESPONSE,
     serialized_options=b'\202\323\344\223\002)\022\'/tenant-management/v1.0.0/child/tenants',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getAllTenantsForUser',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.getAllTenantsForUser',
-    index=10,
+    index=14,
     containing_service=None,
     input_type=TenantProfileService__pb2._GETALLTENANTSFORUSERREQUEST,
     output_type=TenantProfileService__pb2._GETALLTENANTSFORUSERRESPONSE,
     serialized_options=b'\202\323\344\223\0024\0222/tenant-management/v1.0.0/tenants/{requesterEmail}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenantStatusUpdateAuditTrail',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantStatusUpdateAuditTrail',
-    index=11,
+    index=15,
     containing_service=None,
     input_type=TenantProfileService__pb2._GETAUDITTRAILREQUEST,
     output_type=TenantProfileService__pb2._GETSTATUSUPDATEAUDITTRAILRESPONSE,
     serialized_options=b'\202\323\344\223\0023\0221/tenant-management/v1.0.0/audit/status/{tenantId}',
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getTenantAttributeUpdateAuditTrail',
     full_name='org.apache.custos.tenant.management.service.TenantManagementService.getTenantAttributeUpdateAuditTrail',
-    index=12,
+    index=16,
     containing_service=None,
     input_type=TenantProfileService__pb2._GETAUDITTRAILREQUEST,
     output_type=TenantProfileService__pb2._GETATTRIBUTEUPDATEAUDITTRAILRESPONSE,
     serialized_options=b'\202\323\344\223\0027\0225/tenant-management/v1.0.0/audit/attributes/{tenantId}',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addToCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.addToCache',
+    index=17,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0026\"4/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='removeFromCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.removeFromCache',
+    index=18,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._STATUS,
+    serialized_options=b'\202\323\344\223\0026*4/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getFromCache',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getFromCache',
+    index=19,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._GETINSTITUTIONSRESPONSE,
+    serialized_options=b'\202\323\344\223\0026\0224/tenant-management/v1.0.0/cache/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='getInstitutions',
+    full_name='org.apache.custos.tenant.management.service.TenantManagementService.getInstitutions',
+    index=20,
+    containing_service=None,
+    input_type=FederatedAuthenticationService__pb2._CACHEMANIPULATIONREQUEST,
+    output_type=FederatedAuthenticationService__pb2._GETINSTITUTIONSRESPONSE,
+    serialized_options=b'\202\323\344\223\0020\022./tenant-management/v1.0.0/institutions/CILogon',
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_TENANTMANAGEMENTSERVICE)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2_grpc.py
index 9d85f5a..c08ed15 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/TenantManagementService_pb2_grpc.py
@@ -1,253 +1,748 @@
+#  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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
+import custos.server.core.FederatedAuthenticationService_pb2 as FederatedAuthenticationService__pb2
 import custos.server.core.IamAdminService_pb2 as IamAdminService__pb2
+import custos.server.core.MessagingService_pb2 as MessagingService__pb2
 import custos.server.integration.TenantManagementService_pb2 as TenantManagementService__pb2
 import custos.server.core.TenantProfileService_pb2 as TenantProfileService__pb2
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class TenantManagementServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.createTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/createTenant',
-        request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
-        response_deserializer=TenantManagementService__pb2.CreateTenantResponse.FromString,
-        )
-    self.getTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getTenant',
-        request_serializer=TenantManagementService__pb2.GetTenantRequest.SerializeToString,
-        response_deserializer=TenantManagementService__pb2.GetTenantResponse.FromString,
-        )
-    self.updateTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenant',
-        request_serializer=TenantManagementService__pb2.UpdateTenantRequest.SerializeToString,
-        response_deserializer=TenantManagementService__pb2.GetTenantResponse.FromString,
-        )
-    self.deleteTenant = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/deleteTenant',
-        request_serializer=TenantManagementService__pb2.DeleteTenantRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
-    self.addTenantRoles = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/addTenantRoles',
-        request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.AllRoles.FromString,
-        )
-    self.addProtocolMapper = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/addProtocolMapper',
-        request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.configureEventPersistence = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/configureEventPersistence',
-        request_serializer=IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
-        response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
-        )
-    self.updateTenantStatus = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenantStatus',
-        request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
-        )
-    self.getAllTenants = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenants',
-        request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
-        )
-    self.getChildTenants = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getChildTenants',
-        request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
-        )
-    self.getAllTenantsForUser = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenantsForUser',
-        request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
-        )
-    self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantStatusUpdateAuditTrail',
-        request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
-        )
-    self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
-        '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantAttributeUpdateAuditTrail',
-        request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
-        response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.createTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/createTenant',
+                request_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+                response_deserializer=TenantManagementService__pb2.CreateTenantResponse.FromString,
+                )
+        self.getTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenant',
+                request_serializer=TenantManagementService__pb2.GetTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.updateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenant',
+                request_serializer=TenantManagementService__pb2.UpdateTenantRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                )
+        self.deleteTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/deleteTenant',
+                request_serializer=TenantManagementService__pb2.DeleteTenantRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.validateTenant = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/validateTenant',
+                request_serializer=TenantManagementService__pb2.TenantValidationRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addTenantRoles = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addTenantRoles',
+                request_serializer=IamAdminService__pb2.AddRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.getTenantRoles = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantRoles',
+                request_serializer=IamAdminService__pb2.GetRolesRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.AllRoles.FromString,
+                )
+        self.deleteRole = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/deleteRole',
+                request_serializer=IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.addProtocolMapper = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addProtocolMapper',
+                request_serializer=IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.configureEventPersistence = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/configureEventPersistence',
+                request_serializer=IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+                response_deserializer=IamAdminService__pb2.OperationStatus.FromString,
+                )
+        self.enableMessaging = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/enableMessaging',
+                request_serializer=MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+                response_deserializer=MessagingService__pb2.MessageEnablingResponse.FromString,
+                )
+        self.updateTenantStatus = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenantStatus',
+                request_serializer=TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.UpdateStatusResponse.FromString,
+                )
+        self.getAllTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.getChildTenants = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getChildTenants',
+                request_serializer=TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+                )
+        self.getAllTenantsForUser = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenantsForUser',
+                request_serializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+                )
+        self.getTenantStatusUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantStatusUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+                )
+        self.getTenantAttributeUpdateAuditTrail = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantAttributeUpdateAuditTrail',
+                request_serializer=TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+                response_deserializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+                )
+        self.addToCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/addToCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.removeFromCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/removeFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.Status.FromString,
+                )
+        self.getFromCache = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getFromCache',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
+        self.getInstitutions = channel.unary_unary(
+                '/org.apache.custos.tenant.management.service.TenantManagementService/getInstitutions',
+                request_serializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+                response_deserializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+                )
 
 
 class TenantManagementServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def createTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def createTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def deleteTenant(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def addTenantRoles(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def validateTenant(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def addProtocolMapper(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addTenantRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def configureEventPersistence(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getTenantRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def updateTenantStatus(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def deleteRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllTenants(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def addProtocolMapper(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getChildTenants(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def configureEventPersistence(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getAllTenantsForUser(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def enableMessaging(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenantStatusUpdateAuditTrail(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def updateTenantStatus(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def getTenantAttributeUpdateAuditTrail(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def getAllTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getChildTenants(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getAllTenantsForUser(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantStatusUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTenantAttributeUpdateAuditTrail(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addToCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def removeFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getFromCache(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInstitutions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_TenantManagementServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'createTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.createTenant,
-          request_deserializer=TenantProfileService__pb2.Tenant.FromString,
-          response_serializer=TenantManagementService__pb2.CreateTenantResponse.SerializeToString,
-      ),
-      'getTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenant,
-          request_deserializer=TenantManagementService__pb2.GetTenantRequest.FromString,
-          response_serializer=TenantManagementService__pb2.GetTenantResponse.SerializeToString,
-      ),
-      'updateTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.updateTenant,
-          request_deserializer=TenantManagementService__pb2.UpdateTenantRequest.FromString,
-          response_serializer=TenantManagementService__pb2.GetTenantResponse.SerializeToString,
-      ),
-      'deleteTenant': grpc.unary_unary_rpc_method_handler(
-          servicer.deleteTenant,
-          request_deserializer=TenantManagementService__pb2.DeleteTenantRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-      'addTenantRoles': grpc.unary_unary_rpc_method_handler(
-          servicer.addTenantRoles,
-          request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
-          response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
-      ),
-      'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
-          servicer.addProtocolMapper,
-          request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'configureEventPersistence': grpc.unary_unary_rpc_method_handler(
-          servicer.configureEventPersistence,
-          request_deserializer=IamAdminService__pb2.EventPersistenceRequest.FromString,
-          response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
-      ),
-      'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
-          servicer.updateTenantStatus,
-          request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
-          response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
-      ),
-      'getAllTenants': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllTenants,
-          request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
-      ),
-      'getChildTenants': grpc.unary_unary_rpc_method_handler(
-          servicer.getChildTenants,
-          request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
-      ),
-      'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
-          servicer.getAllTenantsForUser,
-          request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
-      ),
-      'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenantStatusUpdateAuditTrail,
-          request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
-      ),
-      'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
-          servicer.getTenantAttributeUpdateAuditTrail,
-          request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
-          response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'org.apache.custos.tenant.management.service.TenantManagementService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'createTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.createTenant,
+                    request_deserializer=TenantProfileService__pb2.Tenant.FromString,
+                    response_serializer=TenantManagementService__pb2.CreateTenantResponse.SerializeToString,
+            ),
+            'getTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenant,
+                    request_deserializer=TenantManagementService__pb2.GetTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'updateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenant,
+                    request_deserializer=TenantManagementService__pb2.UpdateTenantRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.Tenant.SerializeToString,
+            ),
+            'deleteTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteTenant,
+                    request_deserializer=TenantManagementService__pb2.DeleteTenantRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'validateTenant': grpc.unary_unary_rpc_method_handler(
+                    servicer.validateTenant,
+                    request_deserializer=TenantManagementService__pb2.TenantValidationRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addTenantRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.addTenantRoles,
+                    request_deserializer=IamAdminService__pb2.AddRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'getTenantRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantRoles,
+                    request_deserializer=IamAdminService__pb2.GetRolesRequest.FromString,
+                    response_serializer=IamAdminService__pb2.AllRoles.SerializeToString,
+            ),
+            'deleteRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteRole,
+                    request_deserializer=IamAdminService__pb2.DeleteRoleRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'addProtocolMapper': grpc.unary_unary_rpc_method_handler(
+                    servicer.addProtocolMapper,
+                    request_deserializer=IamAdminService__pb2.AddProtocolMapperRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'configureEventPersistence': grpc.unary_unary_rpc_method_handler(
+                    servicer.configureEventPersistence,
+                    request_deserializer=IamAdminService__pb2.EventPersistenceRequest.FromString,
+                    response_serializer=IamAdminService__pb2.OperationStatus.SerializeToString,
+            ),
+            'enableMessaging': grpc.unary_unary_rpc_method_handler(
+                    servicer.enableMessaging,
+                    request_deserializer=MessagingService__pb2.MessageEnablingRequest.FromString,
+                    response_serializer=MessagingService__pb2.MessageEnablingResponse.SerializeToString,
+            ),
+            'updateTenantStatus': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateTenantStatus,
+                    request_deserializer=TenantProfileService__pb2.UpdateStatusRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.UpdateStatusResponse.SerializeToString,
+            ),
+            'getAllTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'getChildTenants': grpc.unary_unary_rpc_method_handler(
+                    servicer.getChildTenants,
+                    request_deserializer=TenantProfileService__pb2.GetTenantsRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsResponse.SerializeToString,
+            ),
+            'getAllTenantsForUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.getAllTenantsForUser,
+                    request_deserializer=TenantProfileService__pb2.GetAllTenantsForUserRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAllTenantsForUserResponse.SerializeToString,
+            ),
+            'getTenantStatusUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantStatusUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'getTenantAttributeUpdateAuditTrail': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTenantAttributeUpdateAuditTrail,
+                    request_deserializer=TenantProfileService__pb2.GetAuditTrailRequest.FromString,
+                    response_serializer=TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.SerializeToString,
+            ),
+            'addToCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.addToCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'removeFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.removeFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.Status.SerializeToString,
+            ),
+            'getFromCache': grpc.unary_unary_rpc_method_handler(
+                    servicer.getFromCache,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+            'getInstitutions': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInstitutions,
+                    request_deserializer=FederatedAuthenticationService__pb2.CacheManipulationRequest.FromString,
+                    response_serializer=FederatedAuthenticationService__pb2.GetInstitutionsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'org.apache.custos.tenant.management.service.TenantManagementService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class TenantManagementService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def createTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/createTenant',
+            TenantProfileService__pb2.Tenant.SerializeToString,
+            TenantManagementService__pb2.CreateTenantResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenant',
+            TenantManagementService__pb2.GetTenantRequest.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenant',
+            TenantManagementService__pb2.UpdateTenantRequest.SerializeToString,
+            TenantProfileService__pb2.Tenant.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/deleteTenant',
+            TenantManagementService__pb2.DeleteTenantRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def validateTenant(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/validateTenant',
+            TenantManagementService__pb2.TenantValidationRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addTenantRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addTenantRoles',
+            IamAdminService__pb2.AddRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantRoles',
+            IamAdminService__pb2.GetRolesRequest.SerializeToString,
+            IamAdminService__pb2.AllRoles.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/deleteRole',
+            IamAdminService__pb2.DeleteRoleRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addProtocolMapper(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addProtocolMapper',
+            IamAdminService__pb2.AddProtocolMapperRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def configureEventPersistence(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/configureEventPersistence',
+            IamAdminService__pb2.EventPersistenceRequest.SerializeToString,
+            IamAdminService__pb2.OperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def enableMessaging(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/enableMessaging',
+            MessagingService__pb2.MessageEnablingRequest.SerializeToString,
+            MessagingService__pb2.MessageEnablingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateTenantStatus(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/updateTenantStatus',
+            TenantProfileService__pb2.UpdateStatusRequest.SerializeToString,
+            TenantProfileService__pb2.UpdateStatusResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getChildTenants(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getChildTenants',
+            TenantProfileService__pb2.GetTenantsRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getAllTenantsForUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getAllTenantsForUser',
+            TenantProfileService__pb2.GetAllTenantsForUserRequest.SerializeToString,
+            TenantProfileService__pb2.GetAllTenantsForUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantStatusUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantStatusUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetStatusUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTenantAttributeUpdateAuditTrail(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getTenantAttributeUpdateAuditTrail',
+            TenantProfileService__pb2.GetAuditTrailRequest.SerializeToString,
+            TenantProfileService__pb2.GetAttributeUpdateAuditTrailResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addToCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/addToCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def removeFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/removeFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.Status.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getFromCache(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getFromCache',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInstitutions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.tenant.management.service.TenantManagementService/getInstitutions',
+            FederatedAuthenticationService__pb2.CacheManipulationRequest.SerializeToString,
+            FederatedAuthenticationService__pb2.GetInstitutionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2.py
index 9724a49..5afdcfd 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2.py
@@ -1,4 +1,22 @@
 # -*- coding: utf-8 -*-
+
+#  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.
+
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: UserManagementService.proto
 """Generated protocol buffer code."""
@@ -20,9 +38,9 @@
   name='UserManagementService.proto',
   package='org.apache.custos.user.management.service',
   syntax='proto3',
-  serialized_options=b'P\001',
+  serialized_options=b'P\001Z\004./pb',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1bUserManagementService.proto\x12)org.apache.custos.user.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto\"\xc3\x01\n\x12UserProfileRequest\x12I\n\x0cuser_profile\x18\x01 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x10\n\x08\x63lientId\x18\x02 \x01(\t\x12\x10\n\x08tenantId\x18\x03 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x04 \x01(\t\x12\x14\n\x0c\x63lientSecret\x18\x05 \x01(\t\x12\x13\n\x0bperformedBy\x18\x06 \x01(\t\"o\n\x0eGetUserRequest\x12\x10\n\x08username\x18\x01 \x01(\t\x12K\n\x11userSearchRequest\x18\x02 \x01(\x0b\x32\x30.org.apache.custos.iam.service.UserSearchRequest\"\xa1\x01\n\x0fGetUsersRequest\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x0e\n\x06search\x18\x06 \x01(\t\x12\x13\n\x0biamClientId\x18\x07 \x01(\t\x12\x17\n\x0fiamClientSecret\x18\x08 \x01(\t\"\x88\x01\n\rResetPassword\x12\x10\n\x08tenantId\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x13\n\x0biamClientId\x18\x05 \x01(\t\x12\x17\n\x0fiamClientSecret\x18\x06 \x01(\t\"j\n\x14ResetPasswordRequest\x12R\n\x10passwordMetadata\x18\x01 \x01(\x0b\x32\x38.org.apache.custos.user.management.service.ResetPassword\"\xd3\x01\n\x16LinkUserProfileRequest\x12\x18\n\x10\x63urrent_username\x18\x01 \x01(\t\x12\x19\n\x11previous_username\x18\x02 \x01(\t\x12\x1a\n\x12linking_attributes\x18\x03 \x03(\t\x12\x10\n\x08tenantId\x18\x04 \x01(\x03\x12\x13\n\x0biamClientId\x18\x05 \x01(\t\x12\x17\n\x0fiamClientSecret\x18\x06 \x01(\t\x12\x13\n\x0b\x61\x63\x63\x65ssToken\x18\x07 \x01(\t\x12\x13\n\x0bperformedBy\x18\x08 \x01(\t\">\n\x18SynchronizeUserDBRequest\x12\x10\n\x08tenantId\x18\x02 \x01(\x03\x12\x10\n\x08\x63lientId\x18\x04 \x01(\t2\xeb\x1f\n\x15UserManagementService\x12\xa3\x01\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\"*\x82\xd3\xe4\x93\x02$\"\x1c/user-management/v1.0.0/user:\x04user\x12\xb1\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\",\x82\xd3\xe4\x93\x02&\"\x1d/user-management/v1.0.0/users:\x05users\x12\xa8\x01\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$\"\"/user-management/v1.0.0/attributes\x12\xad\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/attributes\x12\xa8\x01\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"5\x82\xd3\xe4\x93\x02/\"\'/user-management/v1.0.0/user/activation:\x04user\x12\xab\x01\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"7\x82\xd3\xe4\x93\x02\x31\")/user-management/v1.0.0/user/deactivation:\x04user\x12\xaa\x01\n\x14grantAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"\"/user-management/v1.0.0/user/admin:\x04user\x12\xab\x01\n\x15removeAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02**\"/user-management/v1.0.0/user/admin:\x04user\x12\xa2\x01\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%\"#/user-management/v1.0.0/users/roles\x12\xa9\x01\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\x12./user-management/v1.0.0/user/activation/status\x12\xaa\x01\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\x12)/user-management/v1.0.0/user/availability\x12\x94\x01\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/user-management/v1.0.0/user\x12\x95\x01\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/user-management/v1.0.0/users\x12\xa0\x01\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\"-\x82\xd3\xe4\x93\x02\'\x1a%/user-management/v1.0.0/user/password\x12\x9a\x01\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\x1c/user-management/v1.0.0/user:\x04user\x12\xa4\x01\n\x0f\x64\x65leteUserRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/user/roles\x12\xc3\x01\n\x11updateUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\":\x82\xd3\xe4\x93\x02\x34\x1a$/user-management/v1.0.0/user/profile:\x0cuser_profile\x12\xb2\x01\n\x0egetUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&\x12$/user-management/v1.0.0/user/profile\x12\xb5\x01\n\x11\x64\x65leteUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&*$/user-management/v1.0.0/user/profile\x12\xce\x01\n\x1agetAllUserProfilesInTenant\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/user-management/v1.0.0/users/profile\x12\xb9\x01\n\x0flinkUserProfile\x12\x41.org.apache.custos.user.management.service.LinkUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\"3\x82\xd3\xe4\x93\x02-\"+/user-management/v1.0.0/user/profile/mapper\x12\xd8\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\"2\x82\xd3\xe4\x93\x02,\x12*/user-management/v1.0.0/user/profile/audit\x12\xb9\x01\n\x12synchronizeUserDBs\x12\x43.org.apache.custos.user.management.service.SynchronizeUserDBRequest\x1a..org.apache.custos.iam.service.OperationStatus\".\x82\xd3\xe4\x93\x02(\"&/user-management/v1.0.0/db/synchronizeB\x02P\x01\x62\x06proto3'
+  serialized_pb=b'\n\x1bUserManagementService.proto\x12)org.apache.custos.user.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x18UserProfileService.proto\x1a\x15IamAdminService.proto\"\xc8\x01\n\x12UserProfileRequest\x12I\n\x0cuser_profile\x18\x01 \x01(\x0b\x32\x33.org.apache.custos.user.profile.service.UserProfile\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x11\n\ttenant_id\x18\x03 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x04 \x01(\t\x12\x15\n\rclient_secret\x18\x05 \x01(\t\x12\x14\n\x0cperformed_by\x18\x06 \x01(\t\"q\n\x0eGetUserRequest\x12\x10\n\x08username\x18\x01 \x01(\t\x12M\n\x13user_search_request\x18\x02 \x01(\x0b\x32\x30.org.apache.custos.iam.service.UserSearchRequest\"\xa6\x01\n\x0fGetUsersRequest\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x0e\n\x06offset\x18\x04 \x01(\x05\x12\r\n\x05limit\x18\x05 \x01(\x05\x12\x0e\n\x06search\x18\x06 \x01(\t\x12\x15\n\riam_client_id\x18\x07 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x08 \x01(\t\"\x8e\x01\n\rResetPassword\x12\x11\n\ttenant_id\x18\x01 \x01(\x03\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x15\n\riam_client_id\x18\x05 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x06 \x01(\t\"k\n\x14ResetPasswordRequest\x12S\n\x11password_metadata\x18\x01 \x01(\x0b\x32\x38.org.apache.custos.user.management.service.ResetPassword\"\xd9\x01\n\x16LinkUserProfileRequest\x12\x18\n\x10\x63urrent_username\x18\x01 \x01(\t\x12\x19\n\x11previous_username\x18\x02 \x01(\t\x12\x1a\n\x12linking_attributes\x18\x03 \x03(\t\x12\x10\n\x08tenantId\x18\x04 \x01(\x03\x12\x15\n\riam_client_id\x18\x05 \x01(\t\x12\x19\n\x11iam_client_secret\x18\x06 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x07 \x01(\t\x12\x14\n\x0cperformed_by\x18\x08 \x01(\t\"@\n\x18SynchronizeUserDBRequest\x12\x11\n\ttenant_id\x18\x02 \x01(\x03\x12\x11\n\tclient_id\x18\x04 \x01(\t2\xeb\x1f\n\x15UserManagementService\x12\xa3\x01\n\x0cregisterUser\x12\x32.org.apache.custos.iam.service.RegisterUserRequest\x1a\x33.org.apache.custos.iam.service.RegisterUserResponse\"*\x82\xd3\xe4\x93\x02$\"\x1c/user-management/v1.0.0/user:\x04user\x12\xb1\x01\n\x16registerAndEnableUsers\x12\x33.org.apache.custos.iam.service.RegisterUsersRequest\x1a\x34.org.apache.custos.iam.service.RegisterUsersResponse\",\x82\xd3\xe4\x93\x02&\"\x1d/user-management/v1.0.0/users:\x05users\x12\xa8\x01\n\x11\x61\x64\x64UserAttributes\x12\x37.org.apache.custos.iam.service.AddUserAttributesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$\"\"/user-management/v1.0.0/attributes\x12\xad\x01\n\x14\x64\x65leteUserAttributes\x12\x39.org.apache.custos.iam.service.DeleteUserAttributeRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/attributes\x12\xa8\x01\n\nenableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"5\x82\xd3\xe4\x93\x02/\"\'/user-management/v1.0.0/user/activation:\x04user\x12\xab\x01\n\x0b\x64isableUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"7\x82\xd3\xe4\x93\x02\x31\")/user-management/v1.0.0/user/deactivation:\x04user\x12\xaa\x01\n\x14grantAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02*\"\"/user-management/v1.0.0/user/admin:\x04user\x12\xab\x01\n\x15removeAdminPrivileges\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"0\x82\xd3\xe4\x93\x02**\"/user-management/v1.0.0/user/admin:\x04user\x12\xa2\x01\n\x0f\x61\x64\x64RolesToUsers\x12\x32.org.apache.custos.iam.service.AddUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"+\x82\xd3\xe4\x93\x02%\"#/user-management/v1.0.0/users/roles\x12\xa9\x01\n\risUserEnabled\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"6\x82\xd3\xe4\x93\x02\x30\x12./user-management/v1.0.0/user/activation/status\x12\xaa\x01\n\x13isUsernameAvailable\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"1\x82\xd3\xe4\x93\x02+\x12)/user-management/v1.0.0/user/availability\x12\x94\x01\n\x07getUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a\x31.org.apache.custos.iam.service.UserRepresentation\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/user-management/v1.0.0/user\x12\x95\x01\n\tfindUsers\x12/.org.apache.custos.iam.service.FindUsersRequest\x1a\x30.org.apache.custos.iam.service.FindUsersResponse\"%\x82\xd3\xe4\x93\x02\x1f\x12\x1d/user-management/v1.0.0/users\x12\xa0\x01\n\rresetPassword\x12\x30.org.apache.custos.iam.service.ResetUserPassword\x1a..org.apache.custos.iam.service.OperationStatus\"-\x82\xd3\xe4\x93\x02\'\x1a%/user-management/v1.0.0/user/password\x12\x9a\x01\n\ndeleteUser\x12\x30.org.apache.custos.iam.service.UserSearchRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\x1c/user-management/v1.0.0/user:\x04user\x12\xa4\x01\n\x0f\x64\x65leteUserRoles\x12\x35.org.apache.custos.iam.service.DeleteUserRolesRequest\x1a..org.apache.custos.iam.service.OperationStatus\"*\x82\xd3\xe4\x93\x02$*\"/user-management/v1.0.0/user/roles\x12\xc3\x01\n\x11updateUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\":\x82\xd3\xe4\x93\x02\x34\x1a$/user-management/v1.0.0/user/profile:\x0cuser_profile\x12\xb2\x01\n\x0egetUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&\x12$/user-management/v1.0.0/user/profile\x12\xb5\x01\n\x11\x64\x65leteUserProfile\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x33.org.apache.custos.user.profile.service.UserProfile\",\x82\xd3\xe4\x93\x02&*$/user-management/v1.0.0/user/profile\x12\xce\x01\n\x1agetAllUserProfilesInTenant\x12=.org.apache.custos.user.management.service.UserProfileRequest\x1a\x42.org.apache.custos.user.profile.service.GetAllUserProfilesResponse\"-\x82\xd3\xe4\x93\x02\'\x12%/user-management/v1.0.0/users/profile\x12\xb9\x01\n\x0flinkUserProfile\x12\x41.org.apache.custos.user.management.service.LinkUserProfileRequest\x1a..org.apache.custos.iam.service.OperationStatus\"3\x82\xd3\xe4\x93\x02-\"+/user-management/v1.0.0/user/profile/mapper\x12\xd8\x01\n\x19getUserProfileAuditTrails\x12\x42.org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest\x1a\x43.org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse\"2\x82\xd3\xe4\x93\x02,\x12*/user-management/v1.0.0/user/profile/audit\x12\xb9\x01\n\x12synchronizeUserDBs\x12\x43.org.apache.custos.user.management.service.SynchronizeUserDBRequest\x1a..org.apache.custos.iam.service.OperationStatus\".\x82\xd3\xe4\x93\x02(\"&/user-management/v1.0.0/db/synchronizeB\x08P\x01Z\x04./pbb\x06proto3'
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,UserProfileService__pb2.DESCRIPTOR,IamAdminService__pb2.DESCRIPTOR,])
 
@@ -45,35 +63,35 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.user.management.service.UserProfileRequest.clientId', index=1,
+      name='client_id', full_name='org.apache.custos.user.management.service.UserProfileRequest.client_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.management.service.UserProfileRequest.tenantId', index=2,
+      name='tenant_id', full_name='org.apache.custos.user.management.service.UserProfileRequest.tenant_id', index=2,
       number=3, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.user.management.service.UserProfileRequest.accessToken', index=3,
+      name='access_token', full_name='org.apache.custos.user.management.service.UserProfileRequest.access_token', index=3,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSecret', full_name='org.apache.custos.user.management.service.UserProfileRequest.clientSecret', index=4,
+      name='client_secret', full_name='org.apache.custos.user.management.service.UserProfileRequest.client_secret', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.user.management.service.UserProfileRequest.performedBy', index=5,
+      name='performed_by', full_name='org.apache.custos.user.management.service.UserProfileRequest.performed_by', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -92,7 +110,7 @@
   oneofs=[
   ],
   serialized_start=154,
-  serialized_end=349,
+  serialized_end=354,
 )
 
 
@@ -112,7 +130,7 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='userSearchRequest', full_name='org.apache.custos.user.management.service.GetUserRequest.userSearchRequest', index=1,
+      name='user_search_request', full_name='org.apache.custos.user.management.service.GetUserRequest.user_search_request', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -130,8 +148,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=351,
-  serialized_end=462,
+  serialized_start=356,
+  serialized_end=469,
 )
 
 
@@ -144,7 +162,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.management.service.GetUsersRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.management.service.GetUsersRequest.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
@@ -186,14 +204,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientId', full_name='org.apache.custos.user.management.service.GetUsersRequest.iamClientId', index=6,
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.GetUsersRequest.iam_client_id', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientSecret', full_name='org.apache.custos.user.management.service.GetUsersRequest.iamClientSecret', index=7,
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.GetUsersRequest.iam_client_secret', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -211,8 +229,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=465,
-  serialized_end=626,
+  serialized_start=472,
+  serialized_end=638,
 )
 
 
@@ -225,14 +243,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.management.service.ResetPassword.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.management.service.ResetPassword.tenant_id', index=0,
       number=1, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.user.management.service.ResetPassword.accessToken', index=1,
+      name='access_token', full_name='org.apache.custos.user.management.service.ResetPassword.access_token', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -253,14 +271,14 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientId', full_name='org.apache.custos.user.management.service.ResetPassword.iamClientId', index=4,
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.ResetPassword.iam_client_id', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientSecret', full_name='org.apache.custos.user.management.service.ResetPassword.iamClientSecret', index=5,
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.ResetPassword.iam_client_secret', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -278,8 +296,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=629,
-  serialized_end=765,
+  serialized_start=641,
+  serialized_end=783,
 )
 
 
@@ -292,7 +310,7 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='passwordMetadata', full_name='org.apache.custos.user.management.service.ResetPasswordRequest.passwordMetadata', index=0,
+      name='password_metadata', full_name='org.apache.custos.user.management.service.ResetPasswordRequest.password_metadata', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
@@ -310,8 +328,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=767,
-  serialized_end=873,
+  serialized_start=785,
+  serialized_end=892,
 )
 
 
@@ -352,28 +370,28 @@
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientId', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iamClientId', index=4,
+      name='iam_client_id', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iam_client_id', index=4,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='iamClientSecret', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iamClientSecret', index=5,
+      name='iam_client_secret', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.iam_client_secret', index=5,
       number=6, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.accessToken', index=6,
+      name='access_token', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.access_token', index=6,
       number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='performedBy', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.performedBy', index=7,
+      name='performed_by', full_name='org.apache.custos.user.management.service.LinkUserProfileRequest.performed_by', index=7,
       number=8, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -391,8 +409,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=876,
-  serialized_end=1087,
+  serialized_start=895,
+  serialized_end=1112,
 )
 
 
@@ -405,14 +423,14 @@
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.tenantId', index=0,
+      name='tenant_id', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.tenant_id', index=0,
       number=2, type=3, cpp_type=2, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.clientId', index=1,
+      name='client_id', full_name='org.apache.custos.user.management.service.SynchronizeUserDBRequest.client_id', index=1,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -430,13 +448,13 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1089,
-  serialized_end=1151,
+  serialized_start=1114,
+  serialized_end=1178,
 )
 
 _USERPROFILEREQUEST.fields_by_name['user_profile'].message_type = UserProfileService__pb2._USERPROFILE
-_GETUSERREQUEST.fields_by_name['userSearchRequest'].message_type = IamAdminService__pb2._USERSEARCHREQUEST
-_RESETPASSWORDREQUEST.fields_by_name['passwordMetadata'].message_type = _RESETPASSWORD
+_GETUSERREQUEST.fields_by_name['user_search_request'].message_type = IamAdminService__pb2._USERSEARCHREQUEST
+_RESETPASSWORDREQUEST.fields_by_name['password_metadata'].message_type = _RESETPASSWORD
 DESCRIPTOR.message_types_by_name['UserProfileRequest'] = _USERPROFILEREQUEST
 DESCRIPTOR.message_types_by_name['GetUserRequest'] = _GETUSERREQUEST
 DESCRIPTOR.message_types_by_name['GetUsersRequest'] = _GETUSERSREQUEST
@@ -505,8 +523,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=1154,
-  serialized_end=5229,
+  serialized_start=1181,
+  serialized_end=5256,
   methods=[
   _descriptor.MethodDescriptor(
     name='registerUser',
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2_grpc.py
index 07d8c70..ace57b8 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/UserManagementService_pb2_grpc.py
@@ -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.
+
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
diff --git a/custos-client-sdks/custos-python-sdk/custos_python_sdk.egg-info/SOURCES.txt b/custos-client-sdks/custos-python-sdk/custos_python_sdk.egg-info/SOURCES.txt
index ae5842d..4eccd14 100644
--- a/custos-client-sdks/custos-python-sdk/custos_python_sdk.egg-info/SOURCES.txt
+++ b/custos-client-sdks/custos-python-sdk/custos_python_sdk.egg-info/SOURCES.txt
@@ -1,3 +1,4 @@
+LICENSE
 README.md
 setup.cfg
 setup.py
@@ -18,6 +19,7 @@
 custos/samples/agent_management_samples.py
 custos/samples/group_management_samples.py
 custos/samples/identity_management_samples.py
+custos/samples/resource_secert_management.py
 custos/samples/tenant_management_samples.py
 custos/samples/user_management_samples.py
 custos/samples/resources/__init__.py
@@ -35,6 +37,10 @@
 custos/server/core/IamAdminService_pb2_grpc.py
 custos/server/core/IdentityService_pb2.py
 custos/server/core/IdentityService_pb2_grpc.py
+custos/server/core/LoggingService_pb2.py
+custos/server/core/LoggingService_pb2_grpc.py
+custos/server/core/MessagingService_pb2.py
+custos/server/core/MessagingService_pb2_grpc.py
 custos/server/core/ResourceSecretService_pb2.py
 custos/server/core/ResourceSecretService_pb2_grpc.py
 custos/server/core/SharingService_pb2.py
@@ -46,10 +52,14 @@
 custos/server/core/__init__.py
 custos/server/integration/AgentManagementService_pb2.py
 custos/server/integration/AgentManagementService_pb2_grpc.py
+custos/server/integration/ClusterManagementService_pb2.py
+custos/server/integration/ClusterManagementService_pb2_grpc.py
 custos/server/integration/GroupManagementService_pb2.py
 custos/server/integration/GroupManagementService_pb2_grpc.py
 custos/server/integration/IdentityManagementService_pb2.py
 custos/server/integration/IdentityManagementService_pb2_grpc.py
+custos/server/integration/LogManagementService_pb2.py
+custos/server/integration/LogManagementService_pb2_grpc.py
 custos/server/integration/ResourceSecretManagementService_pb2.py
 custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
 custos/server/integration/SharingManagementService_pb2.py
diff --git a/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/PKG-INFO b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/PKG-INFO
new file mode 100644
index 0000000..59ef769
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/PKG-INFO
@@ -0,0 +1,13 @@
+Metadata-Version: 2.1
+Name: custos-sdk
+Version: 1.0.7
+Summary: Apache Custos Python  SDK
+Home-page: http://custos.com
+Author: Custos Developers
+Author-email: dev@airavata.apache.org
+License: Apache License 2.0
+Platform: UNKNOWN
+License-File: LICENSE
+
+UNKNOWN
+
diff --git a/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/SOURCES.txt b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/SOURCES.txt
new file mode 100644
index 0000000..98625e9
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/SOURCES.txt
@@ -0,0 +1,77 @@
+LICENSE
+README.md
+setup.cfg
+setup.py
+custos/__init__.py
+custos/clients/__init__.py
+custos/clients/agent_management_client.py
+custos/clients/group_management_client.py
+custos/clients/identity_management_client.py
+custos/clients/resource_secret_management_client.py
+custos/clients/sharing_management_client.py
+custos/clients/super_tenant_management_client.py
+custos/clients/tenant_management_client.py
+custos/clients/user_management_client.py
+custos/clients/utils/__init__.py
+custos/clients/utils/certificate_fetching_rest_client.py
+custos/clients/utils/utilities.py
+custos/samples/__init__.py
+custos/samples/agent_management_samples.py
+custos/samples/group_management_samples.py
+custos/samples/identity_management_samples.py
+custos/samples/resource_secert_management.py
+custos/samples/tenant_management_samples.py
+custos/samples/user_management_samples.py
+custos/samples/resources/__init__.py
+custos/server/__init__.py
+custos/server/core/AgentProfileService_pb2.py
+custos/server/core/AgentProfileService_pb2_grpc.py
+custos/server/core/ClusterManagementService_pb2.py
+custos/server/core/ClusterManagementService_pb2_grpc.py
+custos/server/core/CredentialStoreService_pb2.py
+custos/server/core/CredentialStoreService_pb2_grpc.py
+custos/server/core/FederatedAuthenticationService_pb2.py
+custos/server/core/FederatedAuthenticationService_pb2_grpc.py
+custos/server/core/IamAdminService_pb2.py
+custos/server/core/IamAdminService_pb2_grpc.py
+custos/server/core/IdentityService_pb2.py
+custos/server/core/IdentityService_pb2_grpc.py
+custos/server/core/LoggingService_pb2.py
+custos/server/core/LoggingService_pb2_grpc.py
+custos/server/core/MessagingService_pb2.py
+custos/server/core/MessagingService_pb2_grpc.py
+custos/server/core/ResourceSecretService_pb2.py
+custos/server/core/ResourceSecretService_pb2_grpc.py
+custos/server/core/SharingService_pb2.py
+custos/server/core/SharingService_pb2_grpc.py
+custos/server/core/TenantProfileService_pb2.py
+custos/server/core/TenantProfileService_pb2_grpc.py
+custos/server/core/UserProfileService_pb2.py
+custos/server/core/UserProfileService_pb2_grpc.py
+custos/server/core/__init__.py
+custos/server/integration/AgentManagementService_pb2.py
+custos/server/integration/AgentManagementService_pb2_grpc.py
+custos/server/integration/ClusterManagementService_pb2.py
+custos/server/integration/ClusterManagementService_pb2_grpc.py
+custos/server/integration/GroupManagementService_pb2.py
+custos/server/integration/GroupManagementService_pb2_grpc.py
+custos/server/integration/IdentityManagementService_pb2.py
+custos/server/integration/IdentityManagementService_pb2_grpc.py
+custos/server/integration/LogManagementService_pb2.py
+custos/server/integration/LogManagementService_pb2_grpc.py
+custos/server/integration/ResourceSecretManagementService_pb2.py
+custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
+custos/server/integration/SharingManagementService_pb2.py
+custos/server/integration/SharingManagementService_pb2_grpc.py
+custos/server/integration/TenantManagementService_pb2.py
+custos/server/integration/TenantManagementService_pb2_grpc.py
+custos/server/integration/UserManagementService_pb2.py
+custos/server/integration/UserManagementService_pb2_grpc.py
+custos/server/integration/__init__.py
+custos/transport/__init__.py
+custos/transport/settings.py
+custos_sdk.egg-info/PKG-INFO
+custos_sdk.egg-info/SOURCES.txt
+custos_sdk.egg-info/dependency_links.txt
+custos_sdk.egg-info/requires.txt
+custos_sdk.egg-info/top_level.txt
\ No newline at end of file
diff --git a/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/dependency_links.txt b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/requires.txt b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/requires.txt
new file mode 100644
index 0000000..b1bc61f
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/requires.txt
@@ -0,0 +1,10 @@
+google>=3.0.0
+protobuf>=3.12.2
+google-api-python-client>=1.10.0
+googleapis-common-protos>=1.52.0
+grpcio>=1.30.0
+pyopenssl>=19.1.0
+configparser>=5.0.0
+requests>=2.13.0
+requests-oauthlib>=0.7.0
+urllib3>=1.25.9
diff --git a/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/top_level.txt b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/top_level.txt
new file mode 100644
index 0000000..ee51cd8
--- /dev/null
+++ b/custos-client-sdks/custos-python-sdk/custos_sdk.egg-info/top_level.txt
@@ -0,0 +1 @@
+custos
diff --git a/custos-client-sdks/custos-python-sdk/requirements.txt b/custos-client-sdks/custos-python-sdk/requirements.txt
index a23f06d..10a8ea0 100644
--- a/custos-client-sdks/custos-python-sdk/requirements.txt
+++ b/custos-client-sdks/custos-python-sdk/requirements.txt
@@ -1,10 +1,10 @@
-google==3.0.0
-protobuf==3.12.2
-google-api-python-client==1.10.0
-googleapis-common-protos==1.52.0
-grpcio==1.30.0
-pyopenssl==19.1.0
-configparser==5.0.0
-requests==2.13.0
-requests-oauthlib==0.7.0
-urllib3==1.25.9
\ No newline at end of file
+google>=3.0.0
+protobuf>=3.12.2
+google-api-python-client>=1.10.0
+googleapis-common-protos>=1.52.0
+grpcio>=1.30.0
+pyopenssl>=19.1.0
+configparser>=5.0.0
+requests>=2.13.0
+requests-oauthlib>=0.7.0
+urllib3>=1.25.9
\ No newline at end of file
diff --git a/custos-client-sdks/custos-python-sdk/setup.py b/custos-client-sdks/custos-python-sdk/setup.py
index da03f6e..6d5f0dd 100644
--- a/custos-client-sdks/custos-python-sdk/setup.py
+++ b/custos-client-sdks/custos-python-sdk/setup.py
@@ -9,8 +9,8 @@
 
 
 setup(
-    name='custos-python-sdk',
-    version='1.0.0',
+    name='custos-sdk',
+    version='1.0.7',
     packages=find_packages(),
     package_data={'': ['*.pem']},
     include_package_data=True,
@@ -18,14 +18,14 @@
     license='Apache License 2.0',
     author='Custos Developers',
     author_email='dev@airavata.apache.org',
-    install_requires=['google==3.0.0', 'protobuf==3.12.2',
-                      'google-api-python-client==1.10.0',
-                      'googleapis-common-protos==1.52.0',
-                      'grpcio==1.30.0',
-                      'pyopenssl==19.1.0',
-                      'configparser==5.0.0',
-                      'requests==2.13.0',
-                      'requests-oauthlib==0.7.0',
-                      'urllib3==1.25.9'],
+    install_requires=['google>=3.0.0', 'protobuf>=3.12.2',
+                      'google-api-python-client>=1.10.0',
+                      'googleapis-common-protos>=1.52.0',
+                      'grpcio>=1.30.0',
+                      'pyopenssl>=19.1.0',
+                      'configparser>=5.0.0',
+                      'requests>=2.13.0',
+                      'requests-oauthlib>=0.7.0',
+                      'urllib3>=1.25.9'],
     description='Apache Custos Python  SDK'
 )
diff --git a/custos-core-services-client-stubs/credential-store-core-service-client-stubs/src/main/java/org/apache/custos/credential/store/client/CredentialStoreServiceClient.java b/custos-core-services-client-stubs/credential-store-core-service-client-stubs/src/main/java/org/apache/custos/credential/store/client/CredentialStoreServiceClient.java
index 5deea14..0ef71bf 100644
--- a/custos-core-services-client-stubs/credential-store-core-service-client-stubs/src/main/java/org/apache/custos/credential/store/client/CredentialStoreServiceClient.java
+++ b/custos-core-services-client-stubs/credential-store-core-service-client-stubs/src/main/java/org/apache/custos/credential/store/client/CredentialStoreServiceClient.java
@@ -168,6 +168,13 @@
         return credentialStoreServiceBlockingStub.getCredentialByAgentBasicAuth(request);
     }
 
+    public GetAllCredentialsResponse getCredentialByAgentJWTToken(TokenRequest request) {
+        return credentialStoreServiceBlockingStub.getCredentialByAgentJWTToken(request);
+    }
+
+    public OperationStatus validateAgentJWTToken(TokenRequest request) {
+        return credentialStoreServiceBlockingStub.validateAgentJWTToken(request);
+    }
 
 
     private StreamObserver getObserver(ServiceCallback callback, String failureMsg) {
diff --git a/custos-core-services-client-stubs/iam-admin-core-service-client-stub/src/main/java/org/apache/custos/iam/admin/client/IamAdminServiceClient.java b/custos-core-services-client-stubs/iam-admin-core-service-client-stub/src/main/java/org/apache/custos/iam/admin/client/IamAdminServiceClient.java
index e5a820c..fabee59 100644
--- a/custos-core-services-client-stubs/iam-admin-core-service-client-stub/src/main/java/org/apache/custos/iam/admin/client/IamAdminServiceClient.java
+++ b/custos-core-services-client-stubs/iam-admin-core-service-client-stub/src/main/java/org/apache/custos/iam/admin/client/IamAdminServiceClient.java
@@ -341,6 +341,14 @@
         return iamAdminServiceBlockingStub.getRolesOfTenant(request);
     }
 
+    public OperationStatus deleteRole(DeleteRoleRequest request) {
+        return iamAdminServiceBlockingStub.deleteRole(request);
+    }
+
+    public  OperationStatus deleteExternalIDPLinksOfUsers(DeleteExternalIDPsRequest deleteExternalIDPsRequest) {
+        return iamAdminServiceBlockingStub.deleteExternalIDPLinksOfUsers(deleteExternalIDPsRequest);
+    }
+
     public Agent getAgent(UserSearchRequest request) {
         return iamAdminServiceBlockingStub.getAgent(request);
     }
diff --git a/custos-core-services-client-stubs/identity-core-service-client-stub/src/main/java/org/apache/custos/identity/client/IdentityClient.java b/custos-core-services-client-stubs/identity-core-service-client-stub/src/main/java/org/apache/custos/identity/client/IdentityClient.java
index 4a5f670..0259324 100644
--- a/custos-core-services-client-stubs/identity-core-service-client-stub/src/main/java/org/apache/custos/identity/client/IdentityClient.java
+++ b/custos-core-services-client-stubs/identity-core-service-client-stub/src/main/java/org/apache/custos/identity/client/IdentityClient.java
@@ -63,7 +63,7 @@
 
     public void isAuthenticatedAsync(AuthToken request, final ServiceCallback callback) {
         StreamObserver observer = this.getObserver(callback, "isAuthenticated task failed");
-        identityServiceStub.isAuthenticate(request, observer);
+        identityServiceStub.isAuthenticated(request, observer);
     }
 
 
@@ -83,8 +83,8 @@
     }
 
 
-    public IsAuthenticateResponse isAuthenticated(AuthToken request) {
-        return identityServiceBlockingStub.isAuthenticate(request);
+    public IsAuthenticatedResponse isAuthenticated(AuthToken request) {
+        return identityServiceBlockingStub.isAuthenticated(request);
     }
 
 
diff --git a/custos-core-services-client-stubs/messaging-core-service-client-stub/pom.xml b/custos-core-services-client-stubs/messaging-core-service-client-stub/pom.xml
new file mode 100644
index 0000000..fcc2f89
--- /dev/null
+++ b/custos-core-services-client-stubs/messaging-core-service-client-stub/pom.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>custos-core-services-client-stubs</artifactId>
+        <groupId>org.apache.custos</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>messaging-core-service-client-stub</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>custos-integration-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>5.2.0.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+            </extension>
+        </extensions>
+        <plugins>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>grpc-java</pluginId>
+                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.1:exe:${os.detected.classifier}</pluginArtifact>
+                    <protoSourceRoot>../../custos-core-services/custos-messaging-core-service/src/main/proto</protoSourceRoot>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>compile-python</goal>
+                            <goal>compile-custom</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/custos-core-services-client-stubs/messaging-core-service-client-stub/src/main/java/org/apache/custos/messaging/client/MessagingClient.java b/custos-core-services-client-stubs/messaging-core-service-client-stub/src/main/java/org/apache/custos/messaging/client/MessagingClient.java
new file mode 100644
index 0000000..95515d6
--- /dev/null
+++ b/custos-core-services-client-stubs/messaging-core-service-client-stub/src/main/java/org/apache/custos/messaging/client/MessagingClient.java
@@ -0,0 +1,96 @@
+/*
+ * 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.custos.messaging.client;
+
+import io.grpc.ClientInterceptor;
+import io.grpc.ManagedChannel;
+import io.grpc.ManagedChannelBuilder;
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.email.service.*;
+import org.apache.custos.messaging.service.Status;
+import org.apache.custos.messaging.service.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class MessagingClient {
+
+    private ManagedChannel managedChannel;
+    private MessagingServiceGrpc.MessagingServiceBlockingStub messagingServiceBlockingStub;
+    private MessagingServiceGrpc.MessagingServiceStub messagingServiceFutureStub;
+
+    private List<ClientInterceptor> clientInterceptorList;
+
+
+    private EmailServiceGrpc.EmailServiceBlockingStub emailServiceBlockingStub;
+    private EmailServiceGrpc.EmailServiceStub emailServiceStub;
+
+
+    public MessagingClient(List<ClientInterceptor> clientInterceptorList,
+                           @Value("${messaging.core.service.dns.name}") String serviceHost,
+                           @Value("${messaging.core.service.port}") int servicePort) {
+        this.clientInterceptorList = clientInterceptorList;
+        managedChannel = ManagedChannelBuilder.forAddress(
+                serviceHost, servicePort).usePlaintext(true).intercept(clientInterceptorList).build();
+        messagingServiceBlockingStub = MessagingServiceGrpc.newBlockingStub(managedChannel);
+        messagingServiceFutureStub = MessagingServiceGrpc.newStub(managedChannel);
+        emailServiceStub = EmailServiceGrpc.newStub(managedChannel);
+        emailServiceBlockingStub = EmailServiceGrpc.newBlockingStub(managedChannel);
+    }
+
+
+    public MessageEnablingResponse enableMessaging(MessageEnablingRequest messageEnablingRequest) {
+        return this.messagingServiceBlockingStub.enable(messageEnablingRequest);
+    }
+
+    public Status publish(Message request) {
+        return this.messagingServiceBlockingStub.publish(request);
+    }
+
+    public void sendEmailAsync(EmailMessageSendingRequest request,
+                               StreamObserver<org.apache.custos.messaging.email.service.Status> streamObserver) {
+        this.emailServiceStub.send(request, streamObserver);
+    }
+
+
+    public void publishAsync(Message request, StreamObserver<Status> streamObserver) {
+        this.messagingServiceFutureStub.publish(request, streamObserver);
+    }
+
+    public EmailTemplate enableEmail(EmailEnablingRequest emailEnablingRequest) {
+        return this.emailServiceBlockingStub.enable(emailEnablingRequest);
+    }
+
+    public org.apache.custos.messaging.email.service.Status disableEmail(EmailDisablingRequest emailDisablingRequest) {
+        return this.emailServiceBlockingStub.disable(emailDisablingRequest);
+    }
+
+    public FetchEmailTemplatesResponse getEmailTemplates(FetchEmailTemplatesRequest fetchEmailTemplatesRequest) {
+        return this.emailServiceBlockingStub.getTemplates(fetchEmailTemplatesRequest);
+    }
+
+    public FetchEmailFriendlyEventsResponse fetchEmailFriendlyEvents(FetchEmailFriendlyEvents fetchEmailFriendlyEvents) {
+        return this.emailServiceBlockingStub.getEmailFriendlyEvents(fetchEmailFriendlyEvents);
+    }
+
+
+}
diff --git a/custos-core-services-client-stubs/pom.xml b/custos-core-services-client-stubs/pom.xml
index 4bbecfc..5a59cf6 100644
--- a/custos-core-services-client-stubs/pom.xml
+++ b/custos-core-services-client-stubs/pom.xml
@@ -39,6 +39,7 @@
         <module>resource-secret-core-service-client-stub</module>
         <module>sharing-core-service-client-stub</module>
         <module>custos-logging-client-stub</module>
+        <module>messaging-core-service-client-stub</module>
     </modules>
     <artifactId>custos-core-services-client-stubs</artifactId>
 
diff --git a/custos-core-services-client-stubs/resource-secret-core-service-client-stub/src/main/java/org/apache/custos/resource/secret/client/ResourceSecretClient.java b/custos-core-services-client-stubs/resource-secret-core-service-client-stub/src/main/java/org/apache/custos/resource/secret/client/ResourceSecretClient.java
index 1f789fe..584ab1b 100644
--- a/custos-core-services-client-stubs/resource-secret-core-service-client-stub/src/main/java/org/apache/custos/resource/secret/client/ResourceSecretClient.java
+++ b/custos-core-services-client-stubs/resource-secret-core-service-client-stub/src/main/java/org/apache/custos/resource/secret/client/ResourceSecretClient.java
@@ -18,6 +18,7 @@
  */
 
 package org.apache.custos.resource.secret.client;
+
 import io.grpc.ClientInterceptor;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
@@ -45,12 +46,6 @@
     }
 
 
-    public SecretMetadata getSecretResponse(GetSecretRequest request) {
-        return resourceSecretServiceBlockingStub.getSecret(request);
-
-    }
-
-
     public SecretMetadata getResourceCredentialSummary(GetResourceCredentialByTokenRequest request) {
 
         return resourceSecretServiceBlockingStub.getResourceCredentialSummary(request);
@@ -97,4 +92,40 @@
     }
 
 
+    public KVCredential getKVCredential(KVCredential request) {
+        return resourceSecretServiceBlockingStub.getKVCredential(request);
+    }
+
+    public ResourceCredentialOperationStatus setKVCredential(KVCredential request) {
+        return resourceSecretServiceBlockingStub.setKVCredential(request);
+    }
+
+    public ResourceCredentialOperationStatus updateKVCredential(KVCredential request) {
+        return resourceSecretServiceBlockingStub.updateKVCredential(request);
+    }
+
+    public ResourceCredentialOperationStatus deleteKVCredential(KVCredential request) {
+        return resourceSecretServiceBlockingStub.deleteKVCredential(request);
+    }
+
+    public CredentialMap getCredentialMap(CredentialMap request) {
+        return resourceSecretServiceBlockingStub.getCredentialMap(request);
+    }
+
+    public AddResourceCredentialResponse setCredentialMap(CredentialMap request) {
+        return resourceSecretServiceBlockingStub.setCredentialMap(request);
+    }
+
+    public ResourceCredentialOperationStatus updateCredentialMap(CredentialMap request) {
+        return resourceSecretServiceBlockingStub.updateCredentialMap(request);
+    }
+
+    public ResourceCredentialOperationStatus deleteCredentialMap(CredentialMap request) {
+        return resourceSecretServiceBlockingStub.deleteCredentialMap(request);
+    }
+
+
+    public ResourceCredentialOperationStatus updateCertificate(CertificateCredential request) {
+        return resourceSecretServiceBlockingStub.updateCertificateCredential(request);
+    }
 }
diff --git a/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java b/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
index 7226d82..5d1b084 100644
--- a/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
+++ b/custos-core-services-client-stubs/sharing-core-service-client-stub/src/main/java/org/apache/custos/sharing/client/SharingClient.java
@@ -187,5 +187,14 @@
         return sharingServiceBlockingStub.userHasAccess(request);
     }
 
+    public GetAllDirectSharingsResponse getAllDirectSharings(org.apache.custos.sharing.service.SharingRequest request){
+        return sharingServiceBlockingStub.getAllDirectSharings(request);
+    }
+
+    public GetAllSharingsResponse getAllSharings(org.apache.custos.sharing.service.SharingRequest request){
+        return sharingServiceBlockingStub.getAllSharings(request);
+    }
+
+
 
 }
diff --git a/custos-core-services-client-stubs/user-profile-core-service-client-stub/src/main/java/org/apache/custos/user/profile/client/UserProfileClient.java b/custos-core-services-client-stubs/user-profile-core-service-client-stub/src/main/java/org/apache/custos/user/profile/client/UserProfileClient.java
index 3fa8f88..775a658 100644
--- a/custos-core-services-client-stubs/user-profile-core-service-client-stub/src/main/java/org/apache/custos/user/profile/client/UserProfileClient.java
+++ b/custos-core-services-client-stubs/user-profile-core-service-client-stub/src/main/java/org/apache/custos/user/profile/client/UserProfileClient.java
@@ -202,6 +202,14 @@
         return userProfileServiceBlockingStub.changeUserMembershipType(request);
     }
 
+    public Status addUserMembershipType(UserGroupMembershipTypeRequest request) {
+        return userProfileServiceBlockingStub.addUserGroupMembershipType(request);
+    }
+
+    public Status removeUserMembershipType(UserGroupMembershipTypeRequest request) {
+        return userProfileServiceBlockingStub.removeUserGroupMembershipType(request);
+    }
+
     public Status hasAccess(GroupMembership request) {
         return userProfileServiceBlockingStub.hasAccess(request);
     }
diff --git a/custos-core-services/agent-profile-core-service/Dockerfile b/custos-core-services/agent-profile-core-service/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/agent-profile-core-service/Dockerfile
+++ b/custos-core-services/agent-profile-core-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/agent-profile-core-service/pom.xml b/custos-core-services/agent-profile-core-service/pom.xml
index 6c4ca1f..e0d6f7f 100644
--- a/custos-core-services/agent-profile-core-service/pom.xml
+++ b/custos-core-services/agent-profile-core-service/pom.xml
@@ -116,6 +116,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/agent-profile-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/agent-profile-core-service/src/main/helm/templates/deployment.yaml
index ab67be6..9bde73a 100644
--- a/custos-core-services/agent-profile-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/agent-profile-core-service/src/main/helm/templates/deployment.yaml
@@ -47,9 +47,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/agent-profile-core-service/src/main/proto/AgentProfileService.proto b/custos-core-services/agent-profile-core-service/src/main/proto/AgentProfileService.proto
index 6ded328..7d26877 100644
--- a/custos-core-services/agent-profile-core-service/src/main/proto/AgentProfileService.proto
+++ b/custos-core-services/agent-profile-core-service/src/main/proto/AgentProfileService.proto
@@ -23,6 +23,8 @@
 option java_multiple_files = true;
 package org.apache.custos.agent.profile.service;
 
+option go_package = "./pb";
+
 message Agent {
     string id = 1;
     AgentStatus status = 2;
@@ -46,7 +48,7 @@
 }
 
 message AgentRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     Agent agent = 2;
 }
 
diff --git a/custos-core-services/agent-profile-core-service/src/main/resources/application.properties b/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
index 5fb3e72..34bb882 100644
--- a/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_agent_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_agent_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -37,4 +37,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/cluster-management-core-service/Dockerfile b/custos-core-services/cluster-management-core-service/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/cluster-management-core-service/Dockerfile
+++ b/custos-core-services/cluster-management-core-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/cluster-management-core-service/pom.xml b/custos-core-services/cluster-management-core-service/pom.xml
index eb51471..0f0d6ff 100644
--- a/custos-core-services/cluster-management-core-service/pom.xml
+++ b/custos-core-services/cluster-management-core-service/pom.xml
@@ -117,6 +117,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/cluster-management-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/cluster-management-core-service/src/main/helm/templates/deployment.yaml
index ab67be6..9bde73a 100644
--- a/custos-core-services/cluster-management-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/cluster-management-core-service/src/main/helm/templates/deployment.yaml
@@ -47,9 +47,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/cluster-management-core-service/src/main/java/org/apache/custos/cluster/management/service/ClusterManagementService.java b/custos-core-services/cluster-management-core-service/src/main/java/org/apache/custos/cluster/management/service/ClusterManagementService.java
index 29ac714..890da47 100644
--- a/custos-core-services/cluster-management-core-service/src/main/java/org/apache/custos/cluster/management/service/ClusterManagementService.java
+++ b/custos-core-services/cluster-management-core-service/src/main/java/org/apache/custos/cluster/management/service/ClusterManagementService.java
@@ -63,7 +63,12 @@
             // the CoreV1Api loads default api-client from global configuration.
             CoreV1Api api = new CoreV1Api();
 
-            V1Secret secret = api.readNamespacedSecret(custosServerSecretName, custosNameSpace, null, null, null);
+            String namespace = request.getNamespace();
+            String secretName = request.getSecretName();
+
+
+            V1Secret secret = api.readNamespacedSecret(secretName.isEmpty() ? custosServerSecretName : secretName,
+                    namespace.isEmpty() ? custosNameSpace : namespace, null, null, null);
             Map<String, byte[]> map = secret.getData();
             byte[] cert = map.get("tls.crt");
             if (cert == null || cert.length == 0) {
diff --git a/custos-core-services/cluster-management-core-service/src/main/proto/ClusterManagementService.proto b/custos-core-services/cluster-management-core-service/src/main/proto/ClusterManagementService.proto
index 9739d06..6c58702 100644
--- a/custos-core-services/cluster-management-core-service/src/main/proto/ClusterManagementService.proto
+++ b/custos-core-services/cluster-management-core-service/src/main/proto/ClusterManagementService.proto
@@ -22,7 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.cluster.management.service;
-
+option go_package = "./pb";
 message GetServerCertificateRequest {
     string secretName = 1;
     string namespace = 2;
diff --git a/custos-core-services/cluster-management-core-service/src/main/resources/application.properties b/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
index 3768b33..621b2da 100644
--- a/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
+++ b/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_cluster_manager?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_cluster_manager?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -37,4 +37,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/credential-store-core-service/Dockerfile b/custos-core-services/credential-store-core-service/Dockerfile
index a2b1503..ea0f353 100644
--- a/custos-core-services/credential-store-core-service/Dockerfile
+++ b/custos-core-services/credential-store-core-service/Dockerfile
@@ -1,4 +1,5 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
+COPY src/main/resources/vault-client-truststore.pkcs12 /home/ubuntu/vault-client-truststore.pkcs12
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/credential-store-core-service/pom.xml b/custos-core-services/credential-store-core-service/pom.xml
index 75a354e..8a03262 100644
--- a/custos-core-services/credential-store-core-service/pom.xml
+++ b/custos-core-services/credential-store-core-service/pom.xml
@@ -30,7 +30,6 @@
 
     <artifactId>credential-store-core-service</artifactId>
     <dependencies>
-
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>custos-core-services-commons</artifactId>
@@ -64,7 +63,6 @@
             <groupId>io.zipkin.brave</groupId>
             <artifactId>brave-instrumentation-grpc</artifactId>
         </dependency>
-
         <dependency>
             <groupId>io.grpc</groupId>
             <artifactId>grpc-stub</artifactId>
@@ -77,7 +75,6 @@
             <groupId>io.grpc</groupId>
             <artifactId>grpc-netty</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
@@ -108,6 +105,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/credential-store-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/credential-store-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/credential-store-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/credential-store-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/credential/CredentialManager.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/credential/CredentialManager.java
index c9e7b83..d6c20f5 100644
--- a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/credential/CredentialManager.java
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/credential/CredentialManager.java
@@ -202,6 +202,29 @@
 
     }
 
+    public Credential decodeAgentJWTToken(String token) {
+        try {
+            java.util.Base64.Decoder decoder = java.util.Base64.getUrlDecoder();
+            String[] parts = token.split("\\."); // split out the "parts" (header, payload and signature)
+
+            String headerJson = new String(decoder.decode(parts[0]));
+            String payloadJson = new String(decoder.decode(parts[1]));
+            String signatureJson = new String(decoder.decode(parts[2]));
+
+            ObjectMapper mapper = new ObjectMapper();
+            Map<String, Object> jsonMap = mapper.readValue(payloadJson, new TypeReference<Map<String, Object>>() {
+            });
+
+            Credential credential = new Credential();
+            credential.setId(jsonMap.get("agent-id").toString());
+            credential.setParentId(jsonMap.get("agent-parent-id").toString());
+            return credential;
+        } catch (Exception ex) {
+            throw new CredentialGenerationException
+                    ("Error occurred while decoding token ", ex);
+        }
+    }
+
     //TODO use UUID
     private String generateRandomClientId(int length) {
         StringBuilder returnValue = new StringBuilder(length);
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialGenerationException.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialGenerationException.java
index 56202be..3562551 100644
--- a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialGenerationException.java
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialGenerationException.java
@@ -21,5 +21,6 @@
 
 public class CredentialGenerationException extends RuntimeException {
     public CredentialGenerationException(String s, Exception exception) {
+        super(s,exception);
     }
 }
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialsAuthenticationException.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialsAuthenticationException.java
new file mode 100644
index 0000000..687fcaa
--- /dev/null
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/exceptions/CredentialsAuthenticationException.java
@@ -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.
+ */
+
+package org.apache.custos.credential.store.exceptions;
+
+public class CredentialsAuthenticationException extends RuntimeException{
+    public CredentialsAuthenticationException(String s, Exception exception) {
+    }
+}
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/model/Credential.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/model/Credential.java
index 3cc434c..1538ae6 100644
--- a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/model/Credential.java
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/model/Credential.java
@@ -31,6 +31,7 @@
     private  boolean isAdmin;
     private String username;
     private String password;
+    private String parentId;
 
     public Credential(String id, String secret) {
         this.id = id;
@@ -95,4 +96,13 @@
     public void setPassword(String password) {
         this.password = password;
     }
+
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
 }
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/service/CredentialStoreService.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/service/CredentialStoreService.java
index cebe06b..ee4d32e 100644
--- a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/service/CredentialStoreService.java
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/service/CredentialStoreService.java
@@ -459,7 +459,7 @@
 
 
         } catch (Exception ex) {
-            String msg = " Operation failed failed " + ex;
+            String msg = " Operation failed  " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -529,7 +529,7 @@
 
 
         } catch (Exception ex) {
-            String msg = " Operation failed failed " + ex;
+            String msg = " Operation failed " + ex.getMessage();
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -610,7 +610,7 @@
 
 
         } catch (Exception ex) {
-            String msg = " Operation failed failed " + ex;
+            String msg = " Operation failed " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -640,7 +640,6 @@
             String subPath = BASE_PATH + entity.getOwnerId();
             List<String> paths = vaultTemplate.list(subPath);
 
-
             List<CredentialMetadata> credentialMetadata = new ArrayList<>();
 
             if (paths != null && !paths.isEmpty()) {
@@ -650,9 +649,7 @@
                         VaultResponseSupport<Credential> crRe = vaultTemplate.read(path, Credential.class);
                         CredentialMetadata metadata = convertToCredentialMetadata(crRe.getData(), entity.getOwnerId(), key);
 
-
                         if (key.equals(Type.CUSTOS.name())) {
-
                             metadata = metadata.toBuilder()
                                     .setClientIdIssuedAt(entity.getIssuedAt().getTime())
                                     .setClientSecretExpiredAt(entity.getClientSecretExpiredAt())
@@ -665,7 +662,6 @@
                 }
             }
 
-
             GetAllCredentialsResponse response = GetAllCredentialsResponse.newBuilder()
                     .addAllSecretList(credentialMetadata)
                     .setRequesterUserEmail(credential.getEmail())
@@ -677,9 +673,9 @@
 
 
         } catch (Exception ex) {
-            String msg = " Operation failed  " + ex;
+            String msg = " Operation failed  " + ex.getMessage();
             LOGGER.error(msg);
-            responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
 
@@ -987,8 +983,99 @@
     }
 
 
+    @Override
+    public void getCredentialByAgentJWTToken(TokenRequest request, StreamObserver<GetAllCredentialsResponse> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to getCredentialByAgentJWTToken ");
+
+            String token = request.getToken();
+
+            Credential credential = credentialManager.decodeAgentJWTToken(token);
+
+            if (credential == null || credential.getId() == null || credential.getParentId() == null) {
+                LOGGER.error("Invalid agent access token");
+                responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
+                return;
+            }
+
+            CredentialEntity exEntity = repository.findByClientId(credential.getParentId());
+
+            if (exEntity != null) {
+
+                AgentCredentialEntity entity = agentCredentialRepository.findByClientIdAndOwnerId(credential.getId(),
+                        exEntity.getOwnerId());
+
+                if (entity == null) {
+                    LOGGER.error("Agent not found with Id " + credential.getId());
+                    responseObserver.onError(Status.NOT_FOUND.asRuntimeException());
+                    return;
+                }
+                GetAllCredentialsResponse response = getAllCredentials(exEntity, credential);
+                responseObserver.onNext(response);
+                responseObserver.onCompleted();
+
+            } else {
+                String msg = " Cannot find a valid  tenant for agent " + credential.getId();
+                LOGGER.error(msg);
+                responseObserver.onError(Status.NOT_FOUND.withDescription(msg).asRuntimeException());
+            }
+        } catch (Exception ex) {
+            String msg = " Error occurred  reason:  " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
 
 
+    @Override
+    public void validateAgentJWTToken(TokenRequest request, StreamObserver<OperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to validateAgentJWTToken ");
+
+            String token = request.getToken();
+
+            Credential credential = credentialManager.decodeAgentJWTToken(token);
+
+            if (credential == null || credential.getId() == null || credential.getParentId() == null) {
+                OperationStatus operationStatus = OperationStatus
+                        .newBuilder().setState(false).build();
+                responseObserver.onNext(operationStatus);
+                responseObserver.onCompleted();
+                return;
+            }
+            CredentialEntity exEntity = repository.findByClientId(credential.getParentId());
+
+            if (exEntity == null) {
+                OperationStatus operationStatus = OperationStatus
+                        .newBuilder().setState(false).build();
+                responseObserver.onNext(operationStatus);
+                responseObserver.onCompleted();
+                return;
+
+            }
+
+            AgentCredentialEntity entity = agentCredentialRepository.findByClientIdAndOwnerId(credential.getId(),
+                    exEntity.getOwnerId());
+
+            if (entity == null) {
+                OperationStatus operationStatus = OperationStatus
+                        .newBuilder().setState(false).build();
+                responseObserver.onNext(operationStatus);
+                responseObserver.onCompleted();
+                return;
+            }
+            OperationStatus operationStatus = OperationStatus
+                    .newBuilder().setState(true).build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            OperationStatus operationStatus = OperationStatus
+                    .newBuilder().setState(false).build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+        }
+    }
 
     private OperationMetadata convertFromEntity(StatusEntity entity) {
         return OperationMetadata.newBuilder()
@@ -1018,4 +1105,41 @@
         }
         return false;
     }
+
+
+    private GetAllCredentialsResponse getAllCredentials(CredentialEntity entity, Credential credential) {
+        String subPath = BASE_PATH + entity.getOwnerId();
+        List<String> paths = vaultTemplate.list(subPath);
+
+        List<CredentialMetadata> metadataList = new ArrayList<>();
+
+
+        if (paths != null && !paths.isEmpty()) {
+            for (String key : paths) {
+                String path = subPath + "/" + key;
+                VaultResponseSupport<Credential> crRe = vaultTemplate.read(path, Credential.class);
+
+                if (isMainType(key)) {
+                    CredentialMetadata metadata = convertToCredentialMetadata(crRe.getData(), entity.getOwnerId(), key);
+                    metadataList.add(metadata);
+
+                } else if (key.equals(credential.getId())) {
+                    CredentialMetadata metadata = CredentialMetadata
+                            .newBuilder()
+                            .setType(Type.AGENT)
+                            .setId(credential.getId())
+                            .setSecret(crRe.getData().getSecret())
+                            .setOwnerId(entity.getOwnerId())
+                            .setInternalSec(crRe.getData().getPassword())
+                            .build();
+                    metadataList.add(metadata);
+                }
+            }
+        }
+        GetAllCredentialsResponse response = GetAllCredentialsResponse
+                .newBuilder()
+                .addAllSecretList(metadataList)
+                .build();
+        return response;
+    }
 }
diff --git a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/validator/InputValidator.java b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/validator/InputValidator.java
index cea136f..78fcbd3 100644
--- a/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/validator/InputValidator.java
+++ b/custos-core-services/credential-store-core-service/src/main/java/org/apache/custos/credential/store/validator/InputValidator.java
@@ -59,6 +59,7 @@
             case "getAllCredentialsFromJWTToken":
             case "getAllCredentialsFromToken":
             case "getCustosCredentialFromToken":
+            case "validateAgentJWTToken":
                 validateTokenRequest(obj, methodName);
                 break;
             case "getCredentialFromClientId":
diff --git a/custos-core-services/credential-store-core-service/src/main/proto/CredentialStoreService.proto b/custos-core-services/credential-store-core-service/src/main/proto/CredentialStoreService.proto
index ecb8315..691df79 100644
--- a/custos-core-services/credential-store-core-service/src/main/proto/CredentialStoreService.proto
+++ b/custos-core-services/credential-store-core-service/src/main/proto/CredentialStoreService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.credential.store.service;
+option go_package = "./pb";
 
 enum Type {
     CUSTOS = 0;
@@ -33,11 +34,11 @@
 }
 
 message CredentialMetadata {
-    int64 ownerId = 1;
+    int64 owner_id = 1;
     string id = 2;
     string secret = 3;
-    int64 clientSecretExpiredAt = 4;
-    int64 clientIdIssuedAt = 5;
+    int64 client_secret_expired_at = 4;
+    int64 client_id_issued_at = 5;
     Type type = 6;
     bool super_tenant = 7;
     bool super_admin = 8;
@@ -55,9 +56,9 @@
 }
 
 message GetAllCredentialsResponse {
-    repeated CredentialMetadata secretList = 1;
-    string requesterUserEmail = 2;
-    string requesterUsername = 3;
+    repeated CredentialMetadata secret_list = 1;
+    string requester_user_email = 2;
+    string requester_username = 3;
 }
 
 message OperationStatus {
@@ -65,41 +66,41 @@
 }
 
 message DeleteCredentialRequest {
-    int64 ownerId = 1;
+    int64 owner_id = 1;
     Type type = 2;
 }
 
 message GetOperationsMetadataRequest {
-    int64 traceId = 1;
+    int64 trace_id = 1;
 }
 
 message OperationMetadata {
     string event = 1;
     string status = 2;
-    string timeStamp = 3;
-    string performedBy = 4;
+    string time_stamp = 3;
+    string performed_by = 4;
 }
 message GetOperationsMetadataResponse {
     repeated OperationMetadata metadata = 1;
 }
 
 message GetNewCustosCredentialRequest {
-    int64 ownerId = 1;
-    string performedBy = 2;
+    int64 owner_id = 1;
+    string performed_by = 2;
 }
 
 message GetNewCustosCredentialResponse {
-    string clientId = 1;
-    string clientSecret = 2;
+    string client_id = 1;
+    string client_secret = 2;
 }
 
 message TokenRequest {
     string token = 1;
-    string parentClientId = 2;
+    string parent_client_id = 2;
 }
 
 message GetOwnerIdResponse {
-    int64 ownerId = 2;
+    int64 owner_id = 2;
 }
 
 message Credentials {
@@ -136,6 +137,7 @@
     rpc deleteAgentCredential (CredentialMetadata) returns (OperationStatus);
     rpc getCredentialByAgentBasicAuth (TokenRequest) returns (GetAllCredentialsResponse);
     rpc getCredentialByAgentJWTToken (TokenRequest) returns (GetAllCredentialsResponse);
+    rpc validateAgentJWTToken(TokenRequest) returns (OperationStatus);
 
 
 }
\ No newline at end of file
diff --git a/custos-core-services/credential-store-core-service/src/main/resources/application.properties b/custos-core-services/credential-store-core-service/src/main/resources/application.properties
index a26a7d1..350fc41 100644
--- a/custos-core-services/credential-store-core-service/src/main/resources/application.properties
+++ b/custos-core-services/credential-store-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_credential_store?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_credential_store?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -37,4 +37,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/credential-store-core-service/src/main/resources/bootstrap.properties b/custos-core-services/credential-store-core-service/src/main/resources/bootstrap.properties
index 3d6e403..cb3a49e 100644
--- a/custos-core-services/credential-store-core-service/src/main/resources/bootstrap.properties
+++ b/custos-core-services/credential-store-core-service/src/main/resources/bootstrap.properties
@@ -14,13 +14,13 @@
 # "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.
-#
+#  under the License
 
-spring.cloud.vault.token=vault_token
-spring.cloud.vault.scheme=http
-spring.cloud.vault.host=vault.custos.scigap.org
-spring.cloud.vault.port=30249
-spring.cloud.vault.uri=http://vault.custos.scigap.org:30249
+spring.cloud.vault.token=${vault.token}
+spring.cloud.vault.scheme=${vault.scheme}
+spring.cloud.vault.host=${vault.host}
+spring.cloud.vault.port=${vault.port}
+spring.cloud.vault.uri=${vault.uri}
 spring.cloud.vault.authentication=token
-
+spring.cloud.vault.ssl.trust-store=file:home/ubuntu/vault-client-truststore.pkcs12
+spring.cloud.vault.ssl.trust-store-password=vaultpass
\ No newline at end of file
diff --git a/custos-core-services/credential-store-core-service/src/main/resources/vault-client-truststore.pkcs12 b/custos-core-services/credential-store-core-service/src/main/resources/vault-client-truststore.pkcs12
new file mode 100644
index 0000000..ec1e989
--- /dev/null
+++ b/custos-core-services/credential-store-core-service/src/main/resources/vault-client-truststore.pkcs12
Binary files differ
diff --git a/custos-core-services/custos-core-services-commons/src/main/java/org/apache/custos/core/services/commons/util/Constants.java b/custos-core-services/custos-core-services-commons/src/main/java/org/apache/custos/core/services/commons/util/Constants.java
index 4be0d49..de0daad 100644
--- a/custos-core-services/custos-core-services-commons/src/main/java/org/apache/custos/core/services/commons/util/Constants.java
+++ b/custos-core-services/custos-core-services-commons/src/main/java/org/apache/custos/core/services/commons/util/Constants.java
@@ -26,4 +26,7 @@
     public static final String  OWNER_ID = "custos-ownerId";
     public static final String DESCRIPTION = "custos-description";
 
+    public static final String AGENT_ID ="agent-id";
+    public static final String AGENT_PARENT_ID = "agent-parent-id";
+
 }
diff --git a/custos-core-services/custos-logging/Dockerfile b/custos-core-services/custos-logging/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/custos-logging/Dockerfile
+++ b/custos-core-services/custos-logging/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/custos-logging/pom.xml b/custos-core-services/custos-logging/pom.xml
index 5bf6aff..3d9c9a7 100644
--- a/custos-core-services/custos-logging/pom.xml
+++ b/custos-core-services/custos-logging/pom.xml
@@ -94,6 +94,7 @@
             <groupId>javax.persistence</groupId>
             <artifactId>persistence-api</artifactId>
         </dependency>
+
     </dependencies>
 
 
@@ -113,6 +114,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/custos-logging/src/main/helm/templates/deployment.yaml b/custos-core-services/custos-logging/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/custos-logging/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/custos-logging/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/custos-logging/src/main/proto/LoggingService.proto b/custos-core-services/custos-logging/src/main/proto/LoggingService.proto
index 889ca3d..7ab3fa5 100644
--- a/custos-core-services/custos-logging/src/main/proto/LoggingService.proto
+++ b/custos-core-services/custos-logging/src/main/proto/LoggingService.proto
@@ -25,6 +25,8 @@
 
 import "google/protobuf/empty.proto";
 
+option go_package = "./pb";
+
 
 message LogEvent {
     int64 created_time = 1;
diff --git a/custos-core-services/custos-logging/src/main/resources/application.properties b/custos-core-services/custos-logging/src/main/resources/application.properties
index 2711f34..e432bf1 100644
--- a/custos-core-services/custos-logging/src/main/resources/application.properties
+++ b/custos-core-services/custos-logging/src/main/resources/application.properties
@@ -28,7 +28,7 @@
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_logging?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_logging?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/custos-logging/src/main/resources/bootstrap.properties b/custos-core-services/custos-logging/src/main/resources/bootstrap.properties
index fd0bbe0..5edf063 100644
--- a/custos-core-services/custos-logging/src/main/resources/bootstrap.properties
+++ b/custos-core-services/custos-logging/src/main/resources/bootstrap.properties
@@ -18,4 +18,4 @@
 #
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
-spring.profiles.active:default
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/Dockerfile b/custos-core-services/custos-messaging-core-service/Dockerfile
new file mode 100644
index 0000000..8007b96
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/Dockerfile
@@ -0,0 +1,5 @@
+FROM openjdk:11.0.5-jdk-slim
+VOLUME /tmp
+ARG JAR_FILE
+ADD ${JAR_FILE} app.jar
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/pom.xml b/custos-core-services/custos-messaging-core-service/pom.xml
new file mode 100644
index 0000000..440d302
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/pom.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>custos-core-services</artifactId>
+        <groupId>org.apache.custos</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>custos-messaging-core-service</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>custos-core-services-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-sleuth</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.lognet</groupId>
+            <artifactId>grpc-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.zipkin.brave</groupId>
+            <artifactId>brave-instrumentation-grpc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sf.dozer</groupId>
+            <artifactId>dozer</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.persistence</groupId>
+            <artifactId>persistence-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>user-profile-core-service-client-stub</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+            <version>2.2.0.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>mail</artifactId>
+        </dependency>
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.deviceinsight.helm</groupId>
+                <artifactId>helm-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/.helmignore b/custos-core-services/custos-messaging-core-service/src/main/helm/.helmignore
new file mode 100644
index 0000000..50af031
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/Chart.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/Chart.yaml
new file mode 100644
index 0000000..7bb8dd8
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A helm chart of custos messaging service
+name: ${artifactId}
+version: ${project.version}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/NOTES.txt b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/NOTES.txt
new file mode 100644
index 0000000..b1a316f
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/NOTES.txt
@@ -0,0 +1,21 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "helm.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "helm.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "helm.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "helm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/_helpers.tpl b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/_helpers.tpl
new file mode 100644
index 0000000..86a9288
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/_helpers.tpl
@@ -0,0 +1,56 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "helm.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "helm.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "helm.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "helm.labels" -}}
+app.kubernetes.io/name: {{ include "helm.name" . }}
+helm.sh/chart: {{ include "helm.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "helm.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+    {{ default (include "helm.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/deployment.yaml
new file mode 100644
index 0000000..74401f2
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/deployment.yaml
@@ -0,0 +1,65 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "helm.fullname" . }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "helm.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      annotations:
+        linkerd.io/inject: enabled
+      labels:
+        app.kubernetes.io/name: {{ include "helm.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+    {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
+      serviceAccountName: {{ template "helm.serviceAccountName" . }}
+      securityContext:
+        {{- toYaml .Values.podSecurityContext | nindent 8 }}
+      containers:
+        - name: {{ .Chart.Name }}
+          securityContext:
+            {{- toYaml .Values.securityContext | nindent 12 }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+            - name: grpc
+              containerPort: 7000
+              protocol: TCP
+          readinessProbe:
+            httpGet:
+              path: /actuator/health
+              port: 8080
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+    {{- with .Values.affinity }}
+      affinity:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/ingress.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/ingress.yaml
new file mode 100644
index 0000000..0c7cb5d
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/ingress.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "helm.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+  {{- with .Values.ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+{{- if .Values.ingress.tls }}
+  tls:
+  {{- range .Values.ingress.tls }}
+    - hosts:
+      {{- range .hosts }}
+        - {{ . | quote }}
+      {{- end }}
+      secretName: {{ .secretName }}
+  {{- end }}
+{{- end }}
+  rules:
+  {{- range .Values.ingress.hosts }}
+    - host: {{ .host | quote }}
+      http:
+        paths:
+        {{- range .paths }}
+          - path: {{ . }}
+            backend:
+              serviceName: {{ $fullName }}
+              servicePort: {{ $svcPort }}
+        {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/service.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/service.yaml
new file mode 100644
index 0000000..a8df80d
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/service.yaml
@@ -0,0 +1,20 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "helm.name" . }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+    - port: {{ .Values.service.gRPCPort }}
+      targetPort: grpc
+      protocol: TCP
+      name: grpc
+  selector:
+    app.kubernetes.io/name: {{ include "helm.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/serviceaccount.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/serviceaccount.yaml
new file mode 100644
index 0000000..87c82d5
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/serviceaccount.yaml
@@ -0,0 +1,8 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "helm.serviceAccountName" . }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+{{- end -}}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/templates/tests/test-connection.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/tests/test-connection.yaml
new file mode 100644
index 0000000..eac279f
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "helm.fullname" . }}-test-connection"
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+  annotations:
+    "helm.sh/hook": test-success
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args:  ['{{ include "helm.fullname" . }}:{{ .Values.service.port }}']
+  restartPolicy: Never
diff --git a/custos-core-services/custos-messaging-core-service/src/main/helm/values.yaml b/custos-core-services/custos-messaging-core-service/src/main/helm/values.yaml
new file mode 100644
index 0000000..93eb74d
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/helm/values.yaml
@@ -0,0 +1,78 @@
+# Default values for helm.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 2
+
+image:
+  repository: apachecustos/${artifactId}
+  tag: ${project.version}
+  pullPolicy: Always
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: ${artifactId}
+
+podSecurityContext: {}
+  # fsGroup: 2000
+
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+service:
+  type: ClusterIP
+  port: 8080
+  gRPCPort: 7000
+
+ingress:
+  enabled: false
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-example.local
+      paths: []
+
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  # limits:
+  #   cpu: 100m
+  #   memory: 128Mi
+  # requests:
+  #   cpu: 100m
+  #   memory: 128Mi
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
+
+rollingUpdate:
+  maxSurge: 1
+  maxUnavailable: 25%
+
+readinessProbe:
+  initialDelaySeconds: 5
+  periodSeconds: 1
+  successThreshold: 1
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/MessagingServiceInitializer.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/MessagingServiceInitializer.java
new file mode 100644
index 0000000..bf49cb0
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/MessagingServiceInitializer.java
@@ -0,0 +1,51 @@
+/*
+ * 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.custos.messaging;
+
+import org.apache.custos.messaging.events.publisher.MessageProducer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@SpringBootApplication
+@EnableJpaAuditing
+@EnableJpaRepositories(basePackages = "org.apache.custos")
+@ComponentScan(basePackages = "org.apache.custos")
+@EntityScan(basePackages = "org.apache.custos")
+public class MessagingServiceInitializer {
+
+    public static void main(String[] args) {
+        SpringApplication.run(MessagingServiceInitializer.class, args);
+    }
+
+
+    @Bean
+    public MessageProducer registerMessageProducer(@Value("${core.messaging.service.broker.url}") String borkerURL,
+                                                   @Value("${core.messaging.service.publisher.id}") String publisherId) {
+        return new MessageProducer(borkerURL, publisherId);
+
+    }
+}
+
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/email/EmailSender.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/email/EmailSender.java
new file mode 100644
index 0000000..a1f662a
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/email/EmailSender.java
@@ -0,0 +1,62 @@
+/*
+ * 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.custos.messaging.events.email;
+
+import org.slf4j.LoggerFactory;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import java.util.Properties;
+
+
+public class EmailSender {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(EmailSender.class);
+
+    public static void sendEmail(Properties prop, String senderEmail, String senderPassword, String subject,
+                                 String body, String[] recipient) throws MessagingException {
+
+        Session session = Session.getInstance(prop, new Authenticator() {
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication(senderEmail, senderPassword);
+            }
+        });
+
+//            Session session = Session.getDefaultInstance(prop);
+        Message message = new MimeMessage(session);
+        message.setFrom(new InternetAddress(senderEmail));
+
+        Address[] addresses = new Address[recipient.length];
+
+        for (int i = 0; i < recipient.length; i++) {
+            addresses[i] = new InternetAddress(recipient[i]);
+        }
+        message.setRecipients(
+                Message.RecipientType.TO, addresses);
+        message.setSubject(subject);
+
+        message.setContent(body, "text/html");
+
+        Transport.send(message);
+    }
+
+
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageDeserializer.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageDeserializer.java
new file mode 100644
index 0000000..3974146
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageDeserializer.java
@@ -0,0 +1,57 @@
+/*
+ * 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.custos.messaging.events.model;
+
+import com.google.protobuf.util.JsonFormat;
+import org.apache.custos.messaging.service.Message;
+import org.apache.kafka.common.serialization.Deserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+public class MessageDeserializer implements Deserializer<Message> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MessageDeserializer.class);
+
+    @Override
+    public void configure(Map<String, ?> map, boolean b) {
+
+    }
+
+    @Override
+    public Message deserialize(String topic, byte[] bytes) {
+        try {
+            String deserialized = new String(bytes);
+            final var jsonParser = JsonFormat.parser();
+            Message.Builder messageBuilder = Message.newBuilder();
+            jsonParser.merge(deserialized, messageBuilder);
+            return messageBuilder.build();
+        } catch (Exception ex) {
+            String msg = "Error occurred while processing message " + ex.getMessage();
+            LOGGER.error(msg, ex);
+        }
+        return null;
+    }
+
+    @Override
+    public void close() {
+
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageSerializer.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageSerializer.java
new file mode 100644
index 0000000..9c12478
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/model/MessageSerializer.java
@@ -0,0 +1,57 @@
+/*
+ * 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.custos.messaging.events.model;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.protobuf.util.JsonFormat;
+import org.apache.custos.messaging.service.Message;
+import org.apache.kafka.common.serialization.Serializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+public class MessageSerializer implements Serializer<Message> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MessageSerializer.class);
+
+    @Override
+    public void configure(Map<String, ?> map, boolean b) {
+
+    }
+
+    @Override
+    public byte[] serialize(String s, Message message) {
+        try {
+            final var jsonPrinter = JsonFormat.printer();
+            final var json = jsonPrinter.print(message);
+            LOGGER.info(json);
+            return json.getBytes();
+        } catch (Exception ex) {
+            String msg = "Error occurred while processing message " + ex.getMessage();
+            LOGGER.error(msg, ex);
+        }
+        return new byte[0];
+    }
+
+    @Override
+    public void close() {
+
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/publisher/MessageProducer.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/publisher/MessageProducer.java
new file mode 100644
index 0000000..08010f3
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/events/publisher/MessageProducer.java
@@ -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.
+ */
+
+package org.apache.custos.messaging.events.publisher;
+
+import org.apache.custos.messaging.events.model.MessageSerializer;
+import org.apache.custos.messaging.service.Message;
+
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+
+import org.apache.kafka.clients.producer.*;
+import org.apache.kafka.common.serialization.StringSerializer;
+
+public class MessageProducer {
+
+    private final Producer<String, Message> producer;
+
+    public MessageProducer(String borkerURL, String publisherId) {
+        Properties props = new Properties();
+        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, borkerURL);
+        props.put(ProducerConfig.CLIENT_ID_CONFIG, publisherId);
+        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
+                StringSerializer.class.getName());
+        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, MessageSerializer.class.getName());
+        this.producer = new KafkaProducer<String, Message>(props);
+
+    }
+
+    public void publish(String topic, Message notificationMessage) throws ExecutionException, InterruptedException {
+        try {
+            final ProducerRecord<String, Message> record = new ProducerRecord<>(topic,
+                    notificationMessage.getMessageId(),
+                    notificationMessage);
+            producer.send(record).get();
+        } finally {
+            producer.flush();
+        }
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/EmailMapper.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/EmailMapper.java
new file mode 100644
index 0000000..505b29b
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/EmailMapper.java
@@ -0,0 +1,113 @@
+/*
+ * 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.custos.messaging.mapper;
+
+import org.apache.custos.messaging.email.service.CustosEvent;
+import org.apache.custos.messaging.email.service.EmailEnablingRequest;
+import org.apache.custos.messaging.persistance.model.EmailBodyParams;
+import org.apache.custos.messaging.persistance.model.EmailReceivers;
+import org.apache.custos.messaging.persistance.model.EmailTemplate;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Mapping messages between gRPC and data entity.
+ */
+public class EmailMapper {
+
+    public static EmailTemplate transform(EmailEnablingRequest emailEnablingRequest) {
+        EmailTemplate emailTemplate = new EmailTemplate();
+        emailTemplate.setTenantId(emailEnablingRequest.getTenantId());
+        emailTemplate.setSubject(emailEnablingRequest.getEmailTemplate().getSubject());
+        emailTemplate.setCustosEvent(emailEnablingRequest.getEmailTemplate().getCustosEvent().name());
+        List<String> bodyPrams = emailEnablingRequest.getEmailTemplate().getBodyParamsList();
+        List<String> userEmailReceivers = emailEnablingRequest.getEmailTemplate().getReceivingUsersList();
+        List<String> groupEmailReceivers = emailEnablingRequest.getEmailTemplate().getReceivingGroupsList();
+        Set<EmailBodyParams> paramSet = new HashSet<>();
+        Set<EmailReceivers> emailReceivers = new HashSet<>();
+        bodyPrams.forEach(parm -> {
+            EmailBodyParams emailBodyParams = new EmailBodyParams();
+            emailBodyParams.setValue(parm);
+            emailBodyParams.setEmailTemplate(emailTemplate);
+            paramSet.add(emailBodyParams);
+        });
+        userEmailReceivers.forEach(user -> {
+            EmailReceivers receivers = new EmailReceivers();
+            receivers.setUserId(user);
+            receivers.setUserType("USER");
+            receivers.setEmailTemplate(emailTemplate);
+            emailReceivers.add(receivers);
+        });
+
+        groupEmailReceivers.forEach(grp -> {
+            EmailReceivers receivers = new EmailReceivers();
+            receivers.setUserId(grp);
+            receivers.setUserType("GROUP");
+            receivers.setEmailTemplate(emailTemplate);
+            emailReceivers.add(receivers);
+        });
+
+        emailTemplate.setBodyParams(paramSet);
+        emailTemplate.setEmailReceivers(emailReceivers);
+        emailTemplate.setBody(emailEnablingRequest.getEmailTemplate().getBody());
+        return emailTemplate;
+    }
+
+    public static org.apache.custos.messaging.email.service.EmailTemplate transform(EmailTemplate emailTemplate) {
+
+        Set<EmailReceivers> emailReceivers = emailTemplate.getEmailReceivers();
+        Set<EmailBodyParams> emailBodyParams = emailTemplate.getBodyParams();
+
+        List<String> receivingUsers = new ArrayList<>();
+        List<String> receivingGroups = new ArrayList<>();
+        List<String> bodyParams = new ArrayList<>();
+        emailReceivers.forEach(email -> {
+            if (email.getUserType().equals("USER")) {
+                receivingUsers.add(email.getUserId());
+            } else {
+                receivingGroups.add(email.getUserId());
+            }
+        });
+
+        emailBodyParams.forEach(parm -> {
+            bodyParams.add(parm.getValue());
+
+        });
+
+        org.apache.custos.messaging.email.service.EmailTemplate template = org.apache.custos.messaging.email.service
+                .EmailTemplate
+                .newBuilder()
+                .setTemplateId(emailTemplate.getId())
+                .setCustosEvent(CustosEvent.valueOf(emailTemplate.getCustosEvent()))
+                .setSubject(emailTemplate.getSubject())
+                .addAllReceivingUsers(receivingUsers)
+                .addAllReceivingGroups(receivingGroups)
+                .addAllBodyParams(bodyParams)
+                .setBody(emailTemplate.getBody())
+                .build();
+        return template;
+
+    }
+
+
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/MessagingMapper.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/MessagingMapper.java
new file mode 100644
index 0000000..e6cd94f
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/mapper/MessagingMapper.java
@@ -0,0 +1,51 @@
+/*
+ * 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.custos.messaging.mapper;
+
+
+import org.apache.custos.messaging.persistance.model.MessagingMetadata;
+import org.apache.custos.messaging.service.MessageEnablingRequest;
+
+import java.util.UUID;
+
+/**
+ * Mapping messages between gRPC and data entity
+ */
+public class MessagingMapper {
+
+    public static MessagingMetadata transform(MessageEnablingRequest messageEnablingRequest) {
+
+        long tenantId = messageEnablingRequest.getTenantId();
+        String topic = tenantId + "-" + UUID.randomUUID().toString();
+
+        MessagingMetadata metadata = new MessagingMetadata();
+        metadata.setClientId(messageEnablingRequest.getClientId());
+        metadata.setTenantId(messageEnablingRequest.getTenantId());
+        metadata.setEnabled(true);
+        metadata.setTopic(topic);
+        return metadata;
+    }
+
+
+
+
+
+
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailBodyParams.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailBodyParams.java
new file mode 100644
index 0000000..1cb8d77
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailBodyParams.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied. See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.custos.messaging.persistance.model;
+
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+
+/**
+ * Represents Email Template
+ */
+@Entity
+@Table(name = "email_body_params")
+@EntityListeners(AuditingEntityListener.class)
+public class EmailBodyParams {
+
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @Column(nullable = false)
+    private String value;
+
+    @ManyToOne
+    @JoinColumn(name = "email_template_id")
+    private EmailTemplate emailTemplate;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public EmailTemplate getEmailTemplate() {
+        return emailTemplate;
+    }
+
+    public void setEmailTemplate(EmailTemplate emailTemplate) {
+        this.emailTemplate = emailTemplate;
+    }
+}
+
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailReceivers.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailReceivers.java
new file mode 100644
index 0000000..9d7a1b9
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailReceivers.java
@@ -0,0 +1,77 @@
+/*
+ * 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.custos.messaging.persistance.model;
+
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "email_receivers")
+@EntityListeners(AuditingEntityListener.class)
+public class EmailReceivers {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @Column(nullable = false)
+    private String userId;
+
+    @Column(nullable = false)
+    private String userType;
+
+    @ManyToOne
+    @JoinColumn(name = "email_template_id")
+    private EmailTemplate emailTemplate;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public EmailTemplate getEmailTemplate() {
+        return emailTemplate;
+    }
+
+    public void setEmailTemplate(EmailTemplate emailTemplate) {
+        this.emailTemplate = emailTemplate;
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailTemplate.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailTemplate.java
new file mode 100644
index 0000000..aa5528b
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/EmailTemplate.java
@@ -0,0 +1,155 @@
+/*
+ * 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.custos.messaging.persistance.model;
+
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.Set;
+
+/**
+ * Represents Email Template Body Params
+ */
+@Entity
+@Table(name = "email_template")
+@EntityListeners(AuditingEntityListener.class)
+public class EmailTemplate {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "email_template_id_generator")
+    @SequenceGenerator(name = "email_template_id_generator", sequenceName = "tenant_sequence", initialValue = 1000000000, allocationSize = 100)
+    private Long id;
+
+    @Column(nullable = false)
+    private long tenantId;
+
+    @Column(nullable = false)
+    private String subject;
+
+    @Column(nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    @CreatedDate
+    private Date createdAt;
+
+    @Column(nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    @LastModifiedDate
+    private Date lastModifiedAt;
+
+    @Column(nullable = false)
+    private String custosEvent;
+
+    @Column(nullable = false)
+    private boolean status;
+
+    @Column(nullable = false)
+    private String body;
+
+
+    @OneToMany(fetch = FetchType.EAGER, mappedBy = "emailTemplate", orphanRemoval = true, cascade = CascadeType.ALL)
+    private Set<EmailBodyParams> bodyParams;
+
+
+    @OneToMany(fetch = FetchType.EAGER, mappedBy = "emailTemplate", orphanRemoval = true, cascade = CascadeType.ALL)
+    private Set<EmailReceivers> emailReceivers;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Date createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public Date getLastModifiedAt() {
+        return lastModifiedAt;
+    }
+
+    public void setLastModifiedAt(Date lastModifiedAt) {
+        this.lastModifiedAt = lastModifiedAt;
+    }
+
+    public String getCustosEvent() {
+        return custosEvent;
+    }
+
+    public void setCustosEvent(String custosEvent) {
+        this.custosEvent = custosEvent;
+    }
+
+    public Set<EmailBodyParams> getBodyParams() {
+        return bodyParams;
+    }
+
+    public void setBodyParams(Set<EmailBodyParams> bodyParams) {
+        this.bodyParams = bodyParams;
+    }
+
+    public Set<EmailReceivers> getEmailReceivers() {
+        return emailReceivers;
+    }
+
+    public void setEmailReceivers(Set<EmailReceivers> emailReceivers) {
+        this.emailReceivers = emailReceivers;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/MessagingMetadata.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/MessagingMetadata.java
new file mode 100644
index 0000000..b2aa0f5
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/model/MessagingMetadata.java
@@ -0,0 +1,105 @@
+/*
+ * 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.custos.messaging.persistance.model;
+
+
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * Represents Log event
+ */
+@Entity
+@Table(name = "messaging_metadata")
+@EntityListeners(AuditingEntityListener.class)
+public class MessagingMetadata {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @Column(nullable = false)
+    private long tenantId;
+
+    @Column(nullable = false)
+    private String topic;
+
+    @Column(nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    @CreatedDate
+    private Date createdAt;
+
+    @Column(nullable = false)
+    private String clientId;
+
+    @Column(nullable = false)
+    private boolean enabled;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public long getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(long tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public Date getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(Date createdTime) {
+        this.createdAt = createdTime;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailBodyParamsRepository.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailBodyParamsRepository.java
new file mode 100644
index 0000000..1634d3e
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailBodyParamsRepository.java
@@ -0,0 +1,26 @@
+/*
+ * 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.custos.messaging.persistance.repository;
+
+import org.apache.custos.messaging.persistance.model.EmailBodyParams;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface EmailBodyParamsRepository extends JpaRepository<EmailBodyParams, Long> {
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailReceiversRepository.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailReceiversRepository.java
new file mode 100644
index 0000000..2a2128f
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailReceiversRepository.java
@@ -0,0 +1,26 @@
+/*
+ * 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.custos.messaging.persistance.repository;
+
+import org.apache.custos.messaging.persistance.model.EmailReceivers;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface EmailReceiversRepository extends JpaRepository<EmailReceivers,Long> {
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailTemplateRepository.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailTemplateRepository.java
new file mode 100644
index 0000000..7c8af63
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/EmailTemplateRepository.java
@@ -0,0 +1,35 @@
+/*
+ * 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.custos.messaging.persistance.repository;
+
+import org.apache.custos.messaging.persistance.model.EmailTemplate;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface EmailTemplateRepository extends JpaRepository<EmailTemplate, Long> {
+    public Optional<EmailTemplate> findByTenantIdAndCustosEvent(long tenantId, String custosEvent);
+
+    public List<EmailTemplate> findByTenantId(long tenantId);
+
+}
+
+
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/MessagingMetadataRepository.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/MessagingMetadataRepository.java
new file mode 100644
index 0000000..606a519
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/persistance/repository/MessagingMetadataRepository.java
@@ -0,0 +1,31 @@
+/*
+ * 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.custos.messaging.persistance.repository;
+
+import org.apache.custos.messaging.persistance.model.MessagingMetadata;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface MessagingMetadataRepository extends JpaRepository<MessagingMetadata, Long> {
+
+    public Optional<MessagingMetadata> findByTenantId(long tenantId);
+
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/EmailService.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/EmailService.java
new file mode 100644
index 0000000..a71ab6c
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/EmailService.java
@@ -0,0 +1,283 @@
+/*
+ * 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.custos.messaging.service;
+
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.email.service.Status;
+import org.apache.custos.messaging.email.service.*;
+import org.apache.custos.messaging.events.email.EmailSender;
+import org.apache.custos.messaging.mapper.EmailMapper;
+import org.apache.custos.messaging.persistance.model.EmailBodyParams;
+import org.apache.custos.messaging.persistance.model.EmailReceivers;
+import org.apache.custos.messaging.persistance.repository.EmailBodyParamsRepository;
+import org.apache.custos.messaging.persistance.repository.EmailReceiversRepository;
+import org.apache.custos.messaging.persistance.repository.EmailTemplateRepository;
+import org.apache.custos.user.profile.client.UserProfileClient;
+import org.apache.custos.user.profile.service.*;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.util.*;
+
+@GRpcService
+public class EmailService extends EmailServiceGrpc.EmailServiceImplBase {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(EmailService.class);
+
+    @Autowired
+    private EmailTemplateRepository emailTemplateRepository;
+
+    @Autowired
+    private EmailBodyParamsRepository emailBodyParamsRepository;
+
+    @Autowired
+    private EmailReceiversRepository emailReceiversRepository;
+
+    @Autowired
+    private UserProfileClient userProfileClient;
+
+
+    @Value("${mail.smtp.auth:true}")
+    private String mailSmtpAuth;
+
+    @Value("${mail.smtp.starttls.enable:true}")
+    private String mailSmtpStarttlsEnable;
+
+    @Value("${mail.smtp.host:smtp.gmail.com}")
+    private String mailSmtpHost;
+
+    @Value("${mail.smtp.port:587}")
+    private String mailSmtpPort;
+
+    @Value("${mail.smtp.ssl.trust:smtp.gmail.com}")
+    private String mailSmtpSslTrust;
+
+    @Value("${mail.sender.username:custosemailagent@gmail.com}")
+    private String senderUserName;
+    @Value("${mail.sender.password}")
+    private String senderPassword;
+
+
+    @Override
+    public void send(EmailMessageSendingRequest request, StreamObserver<Status> responseObserver) {
+        try {
+            long tenantId = request.getTenantId();
+            CustosEvent event = request.getMessage().getCustosEvent();
+
+            Optional<org.apache.custos.messaging.persistance.model.EmailTemplate> emailTemplate = emailTemplateRepository
+                    .findByTenantIdAndCustosEvent(tenantId, event.name());
+            if (emailTemplate.isPresent()) {
+                org.apache.custos.messaging.persistance.model.EmailTemplate template = emailTemplate.get();
+
+                String subject = template.getSubject();
+                String body = template.getBody();
+                Set<EmailBodyParams> emailBodyParams = template.getBodyParams();
+                Map<String, String> bodyValues = request.getMessage().getParametersMap();
+                LOGGER.info(body);
+                for (EmailBodyParams val : emailBodyParams) {
+                    if (bodyValues.containsKey(val.getValue())) {
+                        body = body.replace(val.getValue(), bodyValues.get(val.getValue()));
+                    }
+                }
+                LOGGER.info(body);
+
+                Properties properties = new Properties();
+                properties.put("mail.smtp.auth", mailSmtpAuth);
+                properties.put("mail.smtp.starttls.enable", mailSmtpStarttlsEnable);
+                properties.put("mail.smtp.host", mailSmtpHost);
+                properties.put("mail.smtp.port", mailSmtpPort);
+                properties.put("mail.smtp.ssl.trust", mailSmtpSslTrust);
+
+
+                Set<EmailReceivers> emailReceivers = emailTemplate.get().getEmailReceivers();
+
+                List<String> emails = new ArrayList<>();
+
+                emailReceivers.forEach(emailReceiver -> {
+                    if (emailReceiver.getUserType().equals("USER")) {
+                        UserProfile profile = UserProfile.newBuilder()
+                                .setUsername(emailReceiver.getUserId())
+                                .build();
+                        UserProfileRequest userProfileRequest = UserProfileRequest.newBuilder()
+                                .setTenantId(tenantId)
+                                .setProfile(profile).build();
+                        UserProfile userProfile = userProfileClient.getUser(userProfileRequest);
+                        if (userProfile.isInitialized() && !userProfile.getUsername().isEmpty()) {
+                            LOGGER.info("Adding receiver email " + userProfile.getEmail());
+                            emails.add(userProfile.getEmail());
+                        }
+                    } else if (emailReceiver.getUserType().equals("GROUP")) {
+                        Group group = Group.newBuilder().setId(emailReceiver.getUserId()).build();
+                        GroupRequest groupRequest = GroupRequest.newBuilder()
+                                .setTenantId(tenantId)
+                                .setGroup(group)
+                                .build();
+                        GetAllUserProfilesResponse userProfilesResponse = userProfileClient.getAllChildUsers(groupRequest);
+
+                        List<UserProfile> userProfiles = userProfilesResponse.getProfilesList();
+                        userProfiles.forEach(profile -> {
+                            LOGGER.info("Adding receiver email " + profile.getEmail());
+                            emails.add(profile.getEmail());
+                        });
+                    }
+                });
+
+                if (!emails.isEmpty()) {
+                    String[] emailArray = new String[emails.size()];
+                    emails.toArray(emailArray);
+                    EmailSender.sendEmail(properties, senderUserName, senderPassword, subject, body, emailArray);
+                }
+            }
+
+            org.apache.custos.messaging.email.service.Status status = org.apache.custos.messaging.email.service.Status
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while sending email reason : " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void enable(EmailEnablingRequest request, StreamObserver<EmailTemplate> responseObserver) {
+        try {
+
+            org.apache.custos.messaging.persistance.model.EmailTemplate emailTemplate = EmailMapper.transform(request);
+            emailTemplate.setStatus(true);
+
+            if (request.getEmailTemplate().getTemplateId() > 0) {
+                Optional<org.apache.custos.messaging.persistance.model.EmailTemplate> optionalEmailTemplate =
+                        emailTemplateRepository.findById(request.getEmailTemplate().getTemplateId());
+                if (optionalEmailTemplate.isEmpty()) {
+                    String msg = " Cannot find EmailTemplate with id " + optionalEmailTemplate.get().getId();
+                    LOGGER.error(msg);
+                    responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+                    return;
+                }
+
+                org.apache.custos.messaging.persistance.model.EmailTemplate exTemplate = optionalEmailTemplate.get();
+                exTemplate.getBodyParams().forEach(param -> {
+                    emailBodyParamsRepository.delete(param);
+                });
+
+                exTemplate.getEmailReceivers().forEach(param -> {
+                    emailReceiversRepository.delete(param);
+                });
+                emailTemplate.setId(exTemplate.getId());
+                emailTemplate.setCreatedAt(exTemplate.getCreatedAt());
+            }
+
+            org.apache.custos.messaging.persistance.model.EmailTemplate saved = emailTemplateRepository.save(emailTemplate);
+
+            EmailTemplate emailTemp = EmailMapper.transform(saved);
+            responseObserver.onNext(emailTemp);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while creating email template reason : " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+
+    @Override
+    public void getTemplates(FetchEmailTemplatesRequest request, StreamObserver<FetchEmailTemplatesResponse> responseObserver) {
+        try {
+            List<org.apache.custos.messaging.persistance.model.EmailTemplate> emailTemplateList =
+                    emailTemplateRepository.findByTenantId(request.getTenantId());
+            List<EmailTemplate> emailTemplates = new ArrayList<>();
+            if (emailTemplateList != null && !emailTemplateList.isEmpty()) {
+                emailTemplateList.forEach(temp -> {
+                    emailTemplates.add(EmailMapper.transform(temp));
+                });
+            }
+            FetchEmailTemplatesResponse response = FetchEmailTemplatesResponse
+                    .newBuilder()
+                    .addAllTemplates(emailTemplates)
+                    .build();
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while get templates reason : " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void disable(EmailDisablingRequest request, StreamObserver<Status> responseObserver) {
+        try {
+            long templateId = request.getEmailTemplate().getTemplateId();
+            Optional<org.apache.custos.messaging.persistance.model.EmailTemplate> optionalEmailTemplate =
+                    emailTemplateRepository.findById(templateId);
+            if (optionalEmailTemplate.isPresent()) {
+                org.apache.custos.messaging.persistance.model.EmailTemplate emailTemplate = optionalEmailTemplate.get();
+                emailTemplate.setStatus(false);
+                emailTemplateRepository.save(emailTemplate);
+            }
+            responseObserver.onNext(Status.newBuilder().setStatus(true).build());
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while disabling email template reason : " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+
+    @Override
+    public void getEmailFriendlyEvents(FetchEmailFriendlyEvents request, StreamObserver<FetchEmailFriendlyEventsResponse> responseObserver) {
+        try {
+
+
+            CustosEmailEvent custosEmailEvent = CustosEmailEvent.newBuilder()
+                    .setEvent(CustosEvent.NEW_USER_SIGNUP)
+                    .addBodyParams("param:tenant_id")
+                    .addBodyParams("param:tenant_name")
+                    .addBodyParams("param:username")
+                    .addBodyParams("param:first_name")
+                    .addBodyParams("param:last_name")
+                    .addBodyParams("param:email")
+                    .build();
+            FetchEmailFriendlyEventsResponse emailFriendlyEvents = FetchEmailFriendlyEventsResponse
+                    .newBuilder().addEvents(custosEmailEvent).build();
+
+            responseObserver.onNext(emailFriendlyEvents);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while fetching getEmailFriendlyEvents reason : " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/MessagingService.java b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/MessagingService.java
new file mode 100644
index 0000000..62997b7
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/java/org/apache/custos/messaging/service/MessagingService.java
@@ -0,0 +1,89 @@
+/*
+ * 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.custos.messaging.service;
+
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.events.publisher.MessageProducer;
+import org.apache.custos.messaging.mapper.MessagingMapper;
+import org.apache.custos.messaging.persistance.model.MessagingMetadata;
+import org.apache.custos.messaging.persistance.repository.MessagingMetadataRepository;
+import org.lognet.springboot.grpc.GRpcService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Optional;
+
+@GRpcService
+public class MessagingService extends MessagingServiceGrpc.MessagingServiceImplBase {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MessagingService.class);
+
+    @Autowired
+    private MessagingMetadataRepository messagingMetadataRepository;
+
+    @Autowired
+    private MessageProducer messageProducer;
+
+    @Override
+    public void publish(Message request, StreamObserver<Status> responseObserver) {
+        try {
+            Optional<MessagingMetadata> metadata = messagingMetadataRepository.findByTenantId(request.getTenantId());
+            if (metadata.isPresent()) {
+                messageProducer.publish(metadata.get().getTopic(), request);
+            }
+            Status status = Status.newBuilder().setStatus(true).build();
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+        } catch (Exception ex) {
+            String msg = "Error occurred while publishing Messaging service" + ex.getMessage();
+            LOGGER.error(msg, ex);
+        }
+    }
+
+    @Override
+    public void enable(MessageEnablingRequest request, StreamObserver<MessageEnablingResponse> responseObserver) {
+        try {
+            Optional<MessagingMetadata> metadata = messagingMetadataRepository.findByTenantId(request.getTenantId());
+            if (metadata.isEmpty()) {
+                MessagingMetadata meta = MessagingMapper.transform(request);
+                messagingMetadataRepository.save(meta);
+                MessageEnablingResponse response = MessageEnablingResponse
+                        .newBuilder()
+                        .setTopic(meta.getTopic())
+                        .build();
+                responseObserver.onNext(response);
+                responseObserver.onCompleted();
+            } else {
+                MessageEnablingResponse response = MessageEnablingResponse
+                        .newBuilder()
+                        .setTopic(metadata.get().getTopic())
+                        .build();
+                responseObserver.onNext(response);
+                responseObserver.onCompleted();
+            }
+
+        } catch (Exception ex) {
+            String msg = "Enabling messaging for client " + request.getClientId()
+                    + " failed, reason: " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+}
diff --git a/custos-core-services/custos-messaging-core-service/src/main/proto/EmailService.proto b/custos-core-services/custos-messaging-core-service/src/main/proto/EmailService.proto
new file mode 100644
index 0000000..e645eda
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/proto/EmailService.proto
@@ -0,0 +1,112 @@
+/*
+ * 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.custos.messaging.email.service;
+
+import "google/protobuf/empty.proto";
+
+option go_package = "./pb";
+
+enum CustosEvent {
+    UNKNOWN = 0;
+    NEW_USER_SIGNUP = 1;
+    GROUP_MEMBERSHIP_CHANGE = 2;
+}
+
+message Email {
+    string sender_email = 3;
+    repeated string receiver_email = 4;
+    CustosEvent custos_event = 5;
+    map<string, string> parameters = 6;
+}
+
+message EmailTemplate {
+    int64 template_id = 1;
+    CustosEvent custos_event = 2;
+    string subject = 3;
+    repeated string body_params = 4;
+    repeated string receiving_users = 5;
+    repeated string receiving_groups = 6;
+    string body = 7;
+}
+
+message EmailEnablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    EmailTemplate email_template = 3;
+}
+
+message EmailDisablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    EmailTemplate email_template = 3;
+}
+
+message Status {
+    bool status = 1;
+}
+
+
+message EmailMessageSendingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    Email message = 3;
+}
+
+message FetchEmailTemplatesRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+message FetchEmailTemplatesResponse {
+   repeated EmailTemplate templates = 1;
+}
+
+message FetchEmailFriendlyEvents {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+
+message CustosEmailEvent {
+    CustosEvent event = 1;
+    repeated string body_params = 2;
+}
+
+message FetchEmailFriendlyEventsResponse {
+    repeated CustosEmailEvent events = 1;
+}
+
+
+service EmailService {
+
+    rpc send (EmailMessageSendingRequest) returns (Status);
+
+    rpc enable (EmailEnablingRequest) returns (EmailTemplate);
+
+    rpc disable (EmailDisablingRequest) returns (Status);
+
+    rpc getTemplates (FetchEmailTemplatesRequest) returns (FetchEmailTemplatesResponse);
+
+    rpc getEmailFriendlyEvents(FetchEmailFriendlyEvents) returns(FetchEmailFriendlyEventsResponse);
+}
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/src/main/proto/MessagingService.proto b/custos-core-services/custos-messaging-core-service/src/main/proto/MessagingService.proto
new file mode 100644
index 0000000..52c2697
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/proto/MessagingService.proto
@@ -0,0 +1,63 @@
+/*
+ * 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.custos.messaging.service;
+
+import "google/protobuf/empty.proto";
+
+
+option go_package = "./pb";
+
+
+message Message {
+    int64 created_time = 1;
+    string service_name = 2;
+    string event_type = 3;
+    string username = 4;
+    string client_id = 5;
+    int64 tenant_id = 6;
+    map<string, string> properties = 7;
+    string message_id = 8;
+}
+
+message MessageEnablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message MessageEnablingResponse {
+    string topic = 1;
+}
+
+
+service MessagingService {
+
+    rpc publish(Message) returns(Status);
+
+    rpc enable(MessageEnablingRequest) returns(MessageEnablingResponse);
+
+}
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/src/main/resources/application.properties b/custos-core-services/custos-messaging-core-service/src/main/resources/application.properties
new file mode 100644
index 0000000..1deacc7
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/resources/application.properties
@@ -0,0 +1,41 @@
+#
+# 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.
+#
+
+grpc.port=7000
+server.port=8080
+spring.zipkin.baseUrl=http://149.165.169.49:9411/
+spring.application.name=messagingCoreService
+spring.sleuth.sampler.probability=1
+spring.main.allow-bean-definition-overriding=true
+management.security.enabled=false
+management.endpoints.web.exposure.include=*
+management.endpoint.metrics.enabled=true
+
+
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_messaging?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
+spring.datasource.username = root
+spring.datasource.password = root
+
+
+## Hibernate Properties
+# The SQL dialect makes Hibernate generate better SQL for the chosen database
+spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
+
+# Hibernate ddl auto (create, create-drop, validate, update)
+spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
diff --git a/custos-core-services/custos-messaging-core-service/src/main/resources/bootstrap.properties b/custos-core-services/custos-messaging-core-service/src/main/resources/bootstrap.properties
new file mode 100644
index 0000000..fd0bbe0
--- /dev/null
+++ b/custos-core-services/custos-messaging-core-service/src/main/resources/bootstrap.properties
@@ -0,0 +1,21 @@
+#
+# 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.
+#
+
+spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
+spring.profiles.active:default
\ No newline at end of file
diff --git a/custos-core-services/federated-authentication-core-service/Dockerfile b/custos-core-services/federated-authentication-core-service/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/federated-authentication-core-service/Dockerfile
+++ b/custos-core-services/federated-authentication-core-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/federated-authentication-core-service/pom.xml b/custos-core-services/federated-authentication-core-service/pom.xml
index fcfba00..1687fbb 100644
--- a/custos-core-services/federated-authentication-core-service/pom.xml
+++ b/custos-core-services/federated-authentication-core-service/pom.xml
@@ -99,6 +99,7 @@
             <groupId>javax.persistence</groupId>
             <artifactId>persistence-api</artifactId>
         </dependency>
+
     </dependencies>
 
 
@@ -118,6 +119,36 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <target>
+                        <!-- keyfile+passphrase or  password, choose one -->
+                        <!--
+                        <scp localFile="${project.basedir}/target/qos-spark-1.0.jar"
+                          remoteToFile="root@192.168.203.156:/usr/sanss" verbose="true"
+                          keyfile="C:\Users\shengw\.ssh\192.168.203.156\id_rsa"
+                          passphrase="">
+                        </scp>
+                         -->
+                        <scp localFile="${project.basedir}/target/helm/${project.artifactId}-${project.version}.tgz"
+                             remoteToFile="ubuntu@${host}:/home/ubuntu/custos/artifacts"
+                             verbose="true"
+                             keyfile="/Users/isururanawaka/.ssh/custos/id_rsa"
+                             passphrase="isjarana" trust="true">
+                        </scp>
+                    </target>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/federated-authentication-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/federated-authentication-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/federated-authentication-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/federated-authentication-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/federated-authentication-core-service/src/main/proto/FederatedAuthenticationService.proto b/custos-core-services/federated-authentication-core-service/src/main/proto/FederatedAuthenticationService.proto
index ed554f0..7da3d0c 100644
--- a/custos-core-services/federated-authentication-core-service/src/main/proto/FederatedAuthenticationService.proto
+++ b/custos-core-services/federated-authentication-core-service/src/main/proto/FederatedAuthenticationService.proto
@@ -23,6 +23,7 @@
 option java_multiple_files = true;
 package org.apache.custos.federated.authentication.service;
 import "google/protobuf/struct.proto";
+option go_package = "./pb";
 
 enum InstitutionCacheType {
     WHITELIST = 0;
@@ -31,49 +32,49 @@
 
 
 message ClientMetadata {
-    int64 tenantId = 1;
-    string tenantName = 2;
+    int64 tenant_id = 1;
+    string tenant_name = 2;
     repeated string scope = 3;
-    string tenantURI = 4;
+    string tenant_uRI = 4;
     repeated string contacts = 5;
     string comment = 6;
-    repeated string redirectURIs = 7;
-    string clientId = 8;
-    string performedBy = 9;
+    repeated string redirect_uRIs = 7;
+    string client_id = 8;
+    string performed_by = 9;
 }
 
 
 message RegisterClientResponse {
-    string clientId = 1;
-    string clientSecret = 2;
-    int64 clientIdIssuedAt = 3;
-    int64 clientSecretExpiresAt = 4;
-    string clientRegistrationUri = 5;
+    string client_id = 1;
+    string client_secret = 2;
+    int64 client_id_issued_at = 3;
+    int64 client_secret_expires_at = 4;
+    string client_registration_uri = 5;
 }
 
 
 message GetClientRequest {
-    int64 tenantId = 1;
-    string clientId = 2;
+    int64 tenant_id= 1;
+    string client_id = 2;
 }
 
 message GetClientResponse {
-    string clientId = 1;
-    string clientName = 2;
-    repeated string redirectURIs = 3;
-    repeated string grantTypes = 4;
+    string client_id = 1;
+    string client_name = 2;
+    repeated string redirect_uRIs = 3;
+    repeated string grant_types = 4;
     repeated string scope = 5;
-    int64 clientIdIssuedAt = 6;
+    int64 client_id_issued_at = 6;
     string comment = 7;
-    string clientSecret = 8;
-    int64 clientSecretExpiresAt = 9;
-    string clientRegistrationUri = 10;
+    string client_secret = 8;
+    int64 client_secret_expires_at = 9;
+    string client_registration_uri = 10;
 }
 
 message DeleteClientRequest {
-    int64 tenantId = 1;
-    string clientId = 2;
-    string performedBy = 3;
+    int64 tenant_id = 1;
+    string client_id = 2;
+    string performed_by = 3;
 }
 
 message Empty {
@@ -81,14 +82,14 @@
 }
 
 message GetOperationsMetadataRequest {
-    int64 traceId = 1;
+    int64 trace_id = 1;
 }
 
 message OperationMetadata {
     string event = 1;
     string status = 2;
-    string timeStamp = 3;
-    string performedBy = 4;
+    string time_stamp = 3;
+    string performed_by = 4;
 }
 message GetOperationsMetadataResponse {
     repeated OperationMetadata metadata = 1;
diff --git a/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties b/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
index 1904647..496054e 100644
--- a/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
+++ b/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_federated_authentication?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_federated_authentication?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -39,3 +39,4 @@
 
 # Hibernate ddl auto (create, create-drop, validate, update)
 spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/federated-authentication-core-service/src/main/resources/bootstrap.properties b/custos-core-services/federated-authentication-core-service/src/main/resources/bootstrap.properties
index 760bf92..b6f70dc 100644
--- a/custos-core-services/federated-authentication-core-service/src/main/resources/bootstrap.properties
+++ b/custos-core-services/federated-authentication-core-service/src/main/resources/bootstrap.properties
@@ -18,4 +18,4 @@
 #
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
-spring.profiles.active:default
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/iam-admin-core-service/Dockerfile b/custos-core-services/iam-admin-core-service/Dockerfile
index 7271b96..b0c6a03 100644
--- a/custos-core-services/iam-admin-core-service/Dockerfile
+++ b/custos-core-services/iam-admin-core-service/Dockerfile
@@ -1,6 +1,6 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 COPY src/main/resources/keycloak-client-truststore.pkcs12 /home/ubuntu/keystore/keycloak-client-truststore.pkcs12
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
-ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","/app.jar"]
\ No newline at end of file
diff --git a/custos-core-services/iam-admin-core-service/pom.xml b/custos-core-services/iam-admin-core-service/pom.xml
index 5201c4c..2962b31 100644
--- a/custos-core-services/iam-admin-core-service/pom.xml
+++ b/custos-core-services/iam-admin-core-service/pom.xml
@@ -85,9 +85,6 @@
             <groupId>io.micrometer</groupId>
             <artifactId>micrometer-registry-prometheus</artifactId>
         </dependency>
-
-
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
@@ -100,6 +97,7 @@
             <groupId>javax.persistence</groupId>
             <artifactId>persistence-api</artifactId>
         </dependency>
+
     </dependencies>
 
 
@@ -119,6 +117,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/custos-core-services/iam-admin-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/iam-admin-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/iam-admin-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/iam-admin-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/service/IamAdminService.java b/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/service/IamAdminService.java
index d6b4702..68931db 100644
--- a/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/service/IamAdminService.java
+++ b/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/service/IamAdminService.java
@@ -402,7 +402,7 @@
 
 
             boolean status = keycloakClient.isValidEndUser(String.valueOf(request.getTenantId()),
-                    request.getUser().getUsername(), request.getAccessToken());
+                    request.getUser().getUsername());
 
 
             if (!status) {
@@ -413,7 +413,7 @@
 
 
             UserRepresentation representation = keycloakClient.getUser(String.valueOf(request.getTenantId()),
-                    request.getAccessToken(), request.getUser().getUsername());
+                    request.getUser().getUsername());
 
             if (representation != null) {
                 org.apache.custos.iam.service.UserRepresentation user = getUser(representation, request.getClientId());
@@ -538,6 +538,27 @@
 
 
     @Override
+    public void deleteExternalIDPLinksOfUsers(DeleteExternalIDPsRequest request,
+                                              StreamObserver<org.apache.custos.iam.service.OperationStatus> responseObserver) {
+        try {
+            long tenantId = request.getTenantId();
+            boolean status = false;
+            if (request.getUserIdList().isEmpty()) {
+                status = keycloakClient.deleteExternalIDPLinks(String.valueOf(tenantId));
+            } else {
+                status = keycloakClient.deleteExternalIDPLinks(String.valueOf(tenantId), request.getUserIdList());
+            }
+            responseObserver.onNext(org.apache.custos.iam.service.OperationStatus.newBuilder().setStatus(status).build());
+            responseObserver.onCompleted();
+        } catch (Exception ex) {
+            String msg = "Error occurred while deletingExternalIDPLinksOfUsers" + ex;
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+
+    @Override
     public void updateUserProfile(UpdateUserProfileRequest request, StreamObserver<org.apache.custos.iam.service.OperationStatus> responseObserver) {
         String userId = request.getUser().getUsername() + "@" + request.getTenantId();
 
@@ -643,7 +664,7 @@
             LOGGER.debug("Request received to deleteRoleFromUser for " + request.getTenantId());
 
             boolean status = keycloakClient.isValidEndUser(String.valueOf(request.getTenantId()),
-                    request.getUsername(), request.getAccessToken());
+                    request.getUsername());
 
 
             if (!status) {
@@ -863,7 +884,7 @@
 
             for (String username : request.getUsernamesList()) {
                 boolean status = keycloakClient.isValidEndUser(String.valueOf(request.getTenantId()),
-                        username, request.getAccessToken());
+                        username);
 
                 if (status) {
                     validUserNames.add(username);
@@ -932,6 +953,7 @@
                     RoleRepresentation roleRepresentation = RoleRepresentation.
                             newBuilder().setName(role.getName())
                             .setComposite(role.isComposite())
+                            .setId(role.getId())
                             .build();
                     if (role.getDescription() != null) {
                         roleRepresentation = roleRepresentation.toBuilder().setDescription(role.getDescription()).build();
@@ -965,6 +987,24 @@
         }
     }
 
+    @Override
+    public void deleteRole(DeleteRoleRequest request, StreamObserver<org.apache.custos.iam.service.OperationStatus> responseObserver) {
+        try {
+            LOGGER.debug("Request received to add roles to tenant for " + request.getTenantId());
+
+            keycloakClient.deleteRole(request.getRole().getId(), String.valueOf(request.getTenantId()),
+                    request.getClientId(), request.getClientLevel());
+            org.apache.custos.iam.service.OperationStatus operationStatus =
+                    org.apache.custos.iam.service.OperationStatus.newBuilder().setStatus(true).build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+        } catch (Exception ex) {
+            String msg = " Deleting role" + request.getRole().getName() + "   " +
+                    "failed for " + request.getTenantId() + " " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
 
     @Override
     public void getRolesOfTenant(GetRolesRequest request, StreamObserver<AllRoles> responseObserver) {
@@ -981,6 +1021,7 @@
                     RoleRepresentation roleRepresentation = RoleRepresentation.
                             newBuilder().setName(role.getName())
                             .setComposite(role.isComposite())
+                            .setId(role.getId())
                             .build();
                     if (role.getDescription() != null) {
                         roleRepresentation = roleRepresentation.toBuilder().setDescription(role.getDescription()).build();
diff --git a/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/validator/InputValidator.java b/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/validator/InputValidator.java
index c149ae0..4974608 100644
--- a/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/validator/InputValidator.java
+++ b/custos-core-services/iam-admin-core-service/src/main/java/org/apache/custos/iam/validator/InputValidator.java
@@ -138,7 +138,9 @@
             case "getAllResources":
                 validateGetAllResources(obj);
                 break;
-
+            case "deleteExternalIDPLinksOfUsers":
+                validateDeleteExternalIDPsLinks(obj);
+                break;
 
             default:
 
@@ -918,4 +920,17 @@
         return true;
     }
 
+    private boolean validateDeleteExternalIDPsLinks(Object obj) {
+        if (obj instanceof DeleteExternalIDPsRequest) {
+            DeleteExternalIDPsRequest request = (DeleteExternalIDPsRequest) obj;
+
+            if (request.getTenantId() == 0) {
+                throw new MissingParameterException("Tenant Id should not be null", null);
+            }
+
+        } else {
+            throw new RuntimeException("Unexpected input type for method deleteExternalIDPLinks");
+        }
+        return true;
+    }
 }
diff --git a/custos-core-services/iam-admin-core-service/src/main/proto/IamAdminService.proto b/custos-core-services/iam-admin-core-service/src/main/proto/IamAdminService.proto
index 63a77fe..418ba8f 100644
--- a/custos-core-services/iam-admin-core-service/src/main/proto/IamAdminService.proto
+++ b/custos-core-services/iam-admin-core-service/src/main/proto/IamAdminService.proto
@@ -24,7 +24,7 @@
 package org.apache.custos.iam.service;
 
 import "google/protobuf/empty.proto";
-
+option go_package = "./pb";
 
 enum FederatedIDPs {
     CILOGON = 0;
@@ -37,28 +37,28 @@
 
 
 message SetUpTenantRequest {
-    int64 tenantId = 1;
-    string tenantName = 2;
-    string adminUsername = 3;
-    string adminFirstname = 4;
-    string adminLastname = 5;
-    string adminEmail = 6;
-    string adminPassword = 7;
-    string tenantURL = 8;
-    string requesterEmail = 9;
-    repeated string redirectURIs = 10;
-    string custosClientId = 11;
+    int64 tenant_id = 1;
+    string tenant_name = 2;
+    string admin_username = 3;
+    string admin_firstname = 4;
+    string admin_lastname = 5;
+    string admin_email = 6;
+    string admin_password = 7;
+    string tenant_uRL = 8;
+    string requester_email = 9;
+    repeated string redirect_uRIs = 10;
+    string custos_client_id = 11;
 
 }
 
 message ConfigureFederateIDPRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     FederatedIDPs type = 2;
-    string clientID = 3;
-    string clientSec = 4;
-    map<string, string> configMap = 5;
-    string requesterEmail = 6;
-    string idpId = 7;
+    string client_iD = 3;
+    string client_sec = 4;
+    map<string, string> config_map = 5;
+    string requester_email = 6;
+    string idp_id = 7;
     string scope = 8;
 }
 
@@ -68,14 +68,14 @@
 }
 
 message SetUpTenantResponse {
-    string clientId = 1;
-    string clientSecret = 2;
+    string client_id = 1;
+    string client_secret = 2;
 }
 
 message IsUsernameAvailableRequest {
-    int64 tenantId = 1;
-    string accessToken = 2;
-    string userName = 3;
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string user_name = 3;
 
 }
 
@@ -115,21 +115,21 @@
 
 
 message RegisterUserRequest {
-    int64 tenantId = 1;
-    string accessToken = 2;
-    string clientId = 3;
-    string clientSec = 4;
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string client_id = 3;
+    string client_sec = 4;
     UserRepresentation user = 5;
-    string performedBy = 6;
+    string performed_by = 6;
 }
 
 
 message RegisterUsersRequest {
     repeated UserRepresentation users = 1;
-    int64 tenantId = 2;
-    string accessToken = 3;
-    string clientId = 4;
-    string performedBy = 5;
+    int64 tenant_id = 2;
+    string access_token = 3;
+    string client_id = 4;
+    string performed_by = 5;
 }
 
 message RegisterUserResponse {
@@ -137,8 +137,8 @@
 }
 
 message RegisterUsersResponse {
-    bool allUseresRegistered = 1;
-    repeated UserRepresentation failedUsers = 2;
+    bool all_useres_registered = 1;
+    repeated UserRepresentation failed_users = 2;
 }
 
 
@@ -154,8 +154,8 @@
     UserSearchMetadata user = 3;
     int32 offset = 4;
     int32 limit = 5;
-    int64 tenantId = 1;
-    string accessToken = 2;
+    int64 tenant_id = 1;
+    string access_token = 2;
     string client_id = 6;
     string client_sec = 7;
 
@@ -163,11 +163,11 @@
 
 message UserSearchRequest {
     UserSearchMetadata user = 1;
-    int64 tenantId = 2;
-    string accessToken = 3;
+    int64 tenant_id = 2;
+    string access_token = 3;
     string client_id = 4;
     string client_sec = 5;
-    string performedBy = 6;
+    string performed_by = 6;
 }
 
 message FindUsersResponse {
@@ -177,10 +177,10 @@
 message ResetUserPassword {
     string username = 1;
     string password = 2;
-    int64 tenantId = 3;
-    string accessToken = 4;
-    string clientId = 5;
-    string clientSec = 6;
+    int64 tenant_id = 3;
+    string access_token = 4;
+    string client_id = 5;
+    string client_sec = 6;
 }
 
 
@@ -207,8 +207,8 @@
 }
 
 message UpdateUserProfileRequest {
-    string accessToken = 1;
-    int64 tenantId = 2;
+    string access_token = 1;
+    int64 tenant_id = 2;
     UserRepresentation user = 3;
 
 }
@@ -218,21 +218,21 @@
 }
 
 message GetOperationsMetadataRequest {
-    int64 traceId = 1;
+    int64 trace_id = 1;
 }
 
 message OperationMetadata {
     string event = 1;
     string status = 2;
-    string timeStamp = 3;
-    string performedBy = 4;
+    string time_stamp = 3;
+    string performed_by = 4;
 }
 message GetOperationsMetadataResponse {
     repeated OperationMetadata metadata = 1;
 }
 
 message DeleteTenantRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message AddRolesRequest {
@@ -252,8 +252,14 @@
     string name = 1;
     string description = 2;
     bool composite = 3;
+    string id = 4;
+}
 
-
+message DeleteRoleRequest {
+    bool client_level = 1;
+    int64 tenant_id = 2;
+    string client_id = 3;
+    RoleRepresentation role = 4;
 }
 
 message AllRoles {
@@ -400,6 +406,11 @@
     repeated UserRepresentation users = 2;
 }
 
+message DeleteExternalIDPsRequest {
+    int64 tenant_id= 1;
+    string client_id = 2;
+    repeated string user_id=3;
+}
 
 service IamAdminService {
 
@@ -410,6 +421,7 @@
     rpc addRolesToTenant (AddRolesRequest) returns (AllRoles);
     rpc addProtocolMapper (AddProtocolMapperRequest) returns (OperationStatus);
     rpc getRolesOfTenant (GetRolesRequest) returns (AllRoles);
+    rpc deleteRole (DeleteRoleRequest) returns (OperationStatus);
 
     rpc isUsernameAvailable (UserSearchRequest) returns (OperationStatus);
     rpc registerUser (RegisterUserRequest) returns (RegisterUserResponse);
@@ -422,6 +434,7 @@
     rpc resetPassword (ResetUserPassword) returns (OperationStatus);
     rpc grantAdminPrivilege (UserSearchRequest) returns (OperationStatus);
     rpc removeAdminPrivilege (UserSearchRequest) returns (OperationStatus);
+    rpc deleteExternalIDPLinksOfUsers(DeleteExternalIDPsRequest) returns (OperationStatus);
 
     rpc registerAndEnableUsers (RegisterUsersRequest) returns (RegisterUsersResponse);
     rpc addUserAttributes (AddUserAttributesRequest) returns (OperationStatus);
diff --git a/custos-core-services/iam-admin-core-service/src/main/resources/application.properties b/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
index 8453f69..b390e08 100644
--- a/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
+++ b/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_iam?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_iam?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/iam-admin-core-service/src/main/resources/bootstrap.properties b/custos-core-services/iam-admin-core-service/src/main/resources/bootstrap.properties
index 760bf92..b6f70dc 100644
--- a/custos-core-services/iam-admin-core-service/src/main/resources/bootstrap.properties
+++ b/custos-core-services/iam-admin-core-service/src/main/resources/bootstrap.properties
@@ -18,4 +18,4 @@
 #
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
-spring.profiles.active:default
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/iam-admin-core-service/src/main/resources/keycloak-client-truststore.pkcs12 b/custos-core-services/iam-admin-core-service/src/main/resources/keycloak-client-truststore.pkcs12
index 9d74713..169e243 100644
--- a/custos-core-services/iam-admin-core-service/src/main/resources/keycloak-client-truststore.pkcs12
+++ b/custos-core-services/iam-admin-core-service/src/main/resources/keycloak-client-truststore.pkcs12
Binary files differ
diff --git a/custos-core-services/identity-core-service/Dockerfile b/custos-core-services/identity-core-service/Dockerfile
index 7271b96..b0c6a03 100644
--- a/custos-core-services/identity-core-service/Dockerfile
+++ b/custos-core-services/identity-core-service/Dockerfile
@@ -1,6 +1,6 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 COPY src/main/resources/keycloak-client-truststore.pkcs12 /home/ubuntu/keystore/keycloak-client-truststore.pkcs12
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
-ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
\ No newline at end of file
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","/app.jar"]
\ No newline at end of file
diff --git a/custos-core-services/identity-core-service/pom.xml b/custos-core-services/identity-core-service/pom.xml
index 0d9c7ee..16f907e 100644
--- a/custos-core-services/identity-core-service/pom.xml
+++ b/custos-core-services/identity-core-service/pom.xml
@@ -103,6 +103,7 @@
             <groupId>javax.persistence</groupId>
             <artifactId>persistence-api</artifactId>
         </dependency>
+
     </dependencies>
 
 
@@ -122,6 +123,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/identity-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/identity-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/identity-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/identity-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/service/IdentityService.java b/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/service/IdentityService.java
index 3269182..9c38105 100644
--- a/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/service/IdentityService.java
+++ b/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/service/IdentityService.java
@@ -104,12 +104,15 @@
                         StreamObserver<org.apache.custos.identity.service.User> responseObserver) {
         String username = null;
         String tenantId = null;
+        String custosId = null;
         try {
             for (Claim claim : request.getClaimsList()) {
                 if (claim.getKey().equals("username")) {
                     username = claim.getValue();
                 } else if (claim.getKey().equals("tenantId")) {
                     tenantId = claim.getValue();
+                } else if (claim.getKey().equals("clientId")) {
+                    custosId = claim.getValue();
                 }
             }
 
@@ -125,6 +128,7 @@
                             .setFullName(user.getFullName())
                             .setSub(user.getSub())
                             .setUsername(user.getUsername())
+                            .setClientId(custosId != null ? custosId : "")
                             .build();
             responseObserver.onNext(user1);
             responseObserver.onCompleted();
@@ -137,8 +141,8 @@
     }
 
     @Override
-    public void isAuthenticate(AuthToken request,
-                               StreamObserver<IsAuthenticateResponse> responseObserver) {
+    public void isAuthenticated(AuthToken request,
+                                StreamObserver<IsAuthenticatedResponse> responseObserver) {
         String username = null;
         String tenantId = null;
 
@@ -149,8 +153,9 @@
                 tenantId = claim.getValue();
             }
         }
-        LOGGER.debug("Authentication status checking for  " + username
-        );
+        LOGGER.debug("Authentication status checking for  " + username);
+        LOGGER.info("Authentication status checking for  " + username + " token " + request.getAccessToken());
+
         String accessToken = request.getAccessToken();
 
 
@@ -193,7 +198,7 @@
             } else {
                 LOGGER.debug("User" + username + "in gateway" + tenantId + "is not authenticated");
             }
-            IsAuthenticateResponse isAuthenticateResponse = IsAuthenticateResponse
+            IsAuthenticatedResponse isAuthenticateResponse = IsAuthenticatedResponse
                     .newBuilder()
                     .setAuthenticated(isAuthenticated)
                     .build();
@@ -201,7 +206,7 @@
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
-            String msg = "Error occurred while checking authentication for  user " + username + " " + ex.getMessage();
+            String msg = "Error occurred while validating authentication status of  user " + username + " " + ex.getMessage();
             LOGGER.error(msg);
             responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
         }
@@ -414,7 +419,7 @@
                 }
             } catch (Exception ex) {
 
-                LOGGER.error("JWKS format  error",ex);
+                LOGGER.error("JWKS format  error", ex);
                 String error = object.getString("error") + " " + object.getString("error_description");
                 responseObserver.onError(Status.INTERNAL.withDescription(error).asRuntimeException());
                 return;
diff --git a/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/validator/InputValidator.java b/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/validator/InputValidator.java
index 11b355e..840f5c9 100644
--- a/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/validator/InputValidator.java
+++ b/custos-core-services/identity-core-service/src/main/java/org/apache/custos/identity/validator/InputValidator.java
@@ -48,7 +48,7 @@
             case "authenticate":
                 validateAuthenticate(obj);
                 break;
-            case "isAuthenticate":
+            case "isAuthenticated":
             case "getUser":
                 validateAuthzToken(obj);
                 break;
diff --git a/custos-core-services/identity-core-service/src/main/proto/IdentityService.proto b/custos-core-services/identity-core-service/src/main/proto/IdentityService.proto
index c6108d9..a55a3a0 100644
--- a/custos-core-services/identity-core-service/src/main/proto/IdentityService.proto
+++ b/custos-core-services/identity-core-service/src/main/proto/IdentityService.proto
@@ -23,7 +23,7 @@
 option java_multiple_files = true;
 package org.apache.custos.identity.service;
 import "google/protobuf/struct.proto";
-
+option go_package = "./pb";
 
 message AuthToken {
     string access_token = 1;
@@ -38,11 +38,12 @@
 
 message User {
     string sub = 1;
-    string fullName = 2;
-    string firstName = 3;
-    string lastName = 4;
-    string emailAddress = 5;
+    string full_name = 2;
+    string first_name = 3;
+    string last_name = 4;
+    string email_address = 5;
     string username = 6;
+    string client_id = 7;
 }
 
 
@@ -72,29 +73,29 @@
 
 
 message AuthenticationRequest {
-    string clientId = 1;
-    string clientSecret = 2;
-    int64 tenantId = 3;
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
     string username = 4;
     string password = 5;
 }
 
-message IsAuthenticateResponse {
+message IsAuthenticatedResponse {
     bool authenticated = 1;
 }
 
 message GetUserManagementSATokenRequest {
-    string clientId = 1;
-    string clientSecret = 2;
-    int64 tenantId = 3;
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
 }
 
 message GetAuthorizationEndpointRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message AuthorizationResponse {
-    string authorizationEndpoint = 2;
+    string authorization_endpoint = 2;
 }
 
 message GetOIDCConfiguration {
@@ -122,7 +123,7 @@
 
 service IdentityService {
     rpc authenticate (AuthenticationRequest) returns (AuthToken);
-    rpc isAuthenticate (AuthToken) returns (IsAuthenticateResponse);
+    rpc isAuthenticated (AuthToken) returns (IsAuthenticatedResponse);
     rpc getUser (AuthToken) returns (User);
     rpc getUserManagementServiceAccountAccessToken (GetUserManagementSATokenRequest) returns (AuthToken);
     rpc getToken (GetTokenRequest) returns (google.protobuf.Struct);
diff --git a/custos-core-services/identity-core-service/src/main/resources/application.properties b/custos-core-services/identity-core-service/src/main/resources/application.properties
index 27e8f36..02e3249 100644
--- a/custos-core-services/identity-core-service/src/main/resources/application.properties
+++ b/custos-core-services/identity-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_identity?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_identity?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/identity-core-service/src/main/resources/bootstrap.properties b/custos-core-services/identity-core-service/src/main/resources/bootstrap.properties
index 760bf92..b6f70dc 100644
--- a/custos-core-services/identity-core-service/src/main/resources/bootstrap.properties
+++ b/custos-core-services/identity-core-service/src/main/resources/bootstrap.properties
@@ -18,4 +18,4 @@
 #
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
-spring.profiles.active:default
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/identity-core-service/src/main/resources/keycloak-client-truststore.pkcs12 b/custos-core-services/identity-core-service/src/main/resources/keycloak-client-truststore.pkcs12
index 9d74713..169e243 100644
--- a/custos-core-services/identity-core-service/src/main/resources/keycloak-client-truststore.pkcs12
+++ b/custos-core-services/identity-core-service/src/main/resources/keycloak-client-truststore.pkcs12
Binary files differ
diff --git a/custos-core-services/pom.xml b/custos-core-services/pom.xml
index d7f4134..382df5a 100644
--- a/custos-core-services/pom.xml
+++ b/custos-core-services/pom.xml
@@ -46,6 +46,7 @@
         <module>resource-secret-core-service</module>
         <module>sharing-core-service</module>
         <module>custos-logging</module>
+        <module>custos-messaging-core-service</module>
     </modules>
 
 
diff --git a/custos-core-services/resource-secret-core-service/Dockerfile b/custos-core-services/resource-secret-core-service/Dockerfile
index a2b1503..ea0f353 100644
--- a/custos-core-services/resource-secret-core-service/Dockerfile
+++ b/custos-core-services/resource-secret-core-service/Dockerfile
@@ -1,4 +1,5 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
+COPY src/main/resources/vault-client-truststore.pkcs12 /home/ubuntu/vault-client-truststore.pkcs12
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/resource-secret-core-service/pom.xml b/custos-core-services/resource-secret-core-service/pom.xml
index 2d7ccaf..2380ec6 100644
--- a/custos-core-services/resource-secret-core-service/pom.xml
+++ b/custos-core-services/resource-secret-core-service/pom.xml
@@ -98,6 +98,11 @@
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+        </dependency>
+
 
     </dependencies>
 
@@ -118,6 +123,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/resource-secret-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/resource-secret-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/resource-secret-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/resource-secret-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/exceptions/CredentialStoreException.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/exceptions/CredentialStoreException.java
index 645cf15..99fb074 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/exceptions/CredentialStoreException.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/exceptions/CredentialStoreException.java
@@ -21,5 +21,6 @@
 
 public class CredentialStoreException extends RuntimeException {
     public CredentialStoreException(String s, Exception exception) {
+        super(s,exception);
     }
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/CredentialGeneratorFactory.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/CredentialGeneratorFactory.java
index 5d13bee..16967ee 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/CredentialGeneratorFactory.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/CredentialGeneratorFactory.java
@@ -20,13 +20,14 @@
 package org.apache.custos.resource.secret.manager;
 
 import com.google.protobuf.GeneratedMessageV3;
-import org.apache.custos.resource.secret.service.CertificateCredential;
-import org.apache.custos.resource.secret.service.PasswordCredential;
-import org.apache.custos.resource.secret.service.SSHCredential;
+import org.apache.custos.resource.secret.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * This class is responsible for generate secrets
  */
@@ -44,10 +45,15 @@
             return new org.apache.custos.resource.secret.manager.adaptor.outbound.CertificateCredential(message);
         } else if (message instanceof PasswordCredential) {
             return new org.apache.custos.resource.secret.manager.adaptor.outbound.PasswordCredential(message);
+        } else if (message instanceof  KVCredential){
+            return new org.apache.custos.resource.secret.manager.adaptor.outbound.KVCredential(message);
+        }else if (message instanceof CredentialMap){
+            return new org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap(message);
         }
 
         return null;
     }
 
 
+
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/inbound/CredentialReader.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/inbound/CredentialReader.java
index f0eba2c..3eeb184 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/inbound/CredentialReader.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/inbound/CredentialReader.java
@@ -19,14 +19,16 @@
 
 package org.apache.custos.resource.secret.manager.adaptor.inbound;
 
-import org.apache.custos.resource.secret.service.*;
-import org.apache.custos.resource.secret.utils.Constants;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialWriter;
 import org.apache.custos.resource.secret.persistance.local.model.Secret;
 import org.apache.custos.resource.secret.persistance.local.repository.SecretRepository;
 import org.apache.custos.resource.secret.persistance.vault.Certificate;
+import org.apache.custos.resource.secret.persistance.vault.KVSecret;
 import org.apache.custos.resource.secret.persistance.vault.PasswordSecret;
 import org.apache.custos.resource.secret.persistance.vault.SSHCredentialSecrets;
+import org.apache.custos.resource.secret.service.*;
+import org.apache.custos.resource.secret.utils.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
 @Component
@@ -51,6 +54,7 @@
     private VaultTemplate vaultTemplate;
 
 
+
     /**
      * get SSH credentials
      *
@@ -58,38 +62,49 @@
      * @param token
      * @return
      */
-    public SSHCredential getSSHCredential(long tenantId, String token) {
+    public Optional<SSHCredential> getSSHCredential(long tenantId, String token) {
 
-        Optional<Secret> secret = repository.findById(token);
+        Secret secret = null;
 
-
-        if (secret.isEmpty()) {
-            return null;
+        if (token != null && !token.trim().equals("")) {
+            Optional<Secret> exSecret = repository.findById(token);
+            if (exSecret.isPresent()) {
+                secret = exSecret.get();
+            }
+        }
+        if (secret == null) {
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(token, tenantId);
+            if (secrets != null && !secrets.isEmpty()) {
+                secret = secrets.get(0);
+            }
         }
 
-        Secret exSec = secret.get();
+        if (secret == null) {
+            return Optional.empty();
+        }
 
-        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + exSec.getOwnerId() +
-                "/" + Constants.SSH_CREDENTIALS + "/" + token;
-
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + secret.getOwnerId() +
+                "/" + Constants.SSH_CREDENTIALS + "/" + secret.getId();
 
         VaultResponseSupport<SSHCredentialSecrets> response = vaultTemplate.read(vaultPath, SSHCredentialSecrets.class);
 
         if (response == null || response.getData() == null && response.getData().getPrivateKey() == null) {
-            repository.delete(exSec);
-            return null;
+            repository.delete(secret);
+            return Optional.empty();
         }
 
         SSHCredentialSecrets sshCredentialSecrets = response.getData();
 
         SecretMetadata metadata = SecretMetadata.newBuilder()
-                .setOwnerId(exSec.getOwnerId())
+                .setOwnerId(secret.getOwnerId())
                 .setTenantId(tenantId)
-                .setPersistedTime(exSec.getCreatedAt().getTime())
-                .setDescription(exSec.getDiscription())
+                .setPersistedTime(secret.getCreatedAt().getTime())
+                .setDescription(secret.getDiscription())
                 .setResourceType(ResourceType.VAULT_CREDENTIAL)
                 .setSource(ResourceSource.EXTERNAL)
-                .setToken(token)
+                .setToken(
+                        (secret.getExternalId() != null &&
+                                !secret.getExternalId().trim().equals("")) ? secret.getExternalId() : secret.getId())
                 .build();
 
         SSHCredential credential = SSHCredential.newBuilder()
@@ -99,7 +114,7 @@
                 .setMetadata(metadata)
                 .build();
 
-        return credential;
+        return Optional.of(credential);
 
     }
 
@@ -111,46 +126,61 @@
      * @param token
      * @return
      */
-    public org.apache.custos.resource.secret.service.PasswordCredential getPasswordCredential(long tenantId, String token) {
-        Optional<Secret> secret = repository.findById(token);
+    public Optional<org.apache.custos.resource.secret.service.PasswordCredential> getPasswordCredential(long tenantId,
+                                                                                                        String token) {
+        Secret secret = null;
 
-
-        if (secret.isEmpty()) {
-            return null;
+        if (token != null && !token.trim().equals("")) {
+            Optional<Secret> exSecret = repository.findById(token);
+            if (exSecret.isPresent()) {
+                secret = exSecret.get();
+            }
+        }
+        if (secret == null) {
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(token, tenantId);
+            if (secrets != null && !secrets.isEmpty()) {
+                secret = secrets.get(0);
+            }
         }
 
-        Secret exSec = secret.get();
+        if (secret == null) {
+            return Optional.empty();
+        }
 
-        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + exSec.getOwnerId() +
-                "/" + Constants.PASSWORD + "/" + token;
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + secret.getOwnerId() +
+                "/" + Constants.PASSWORD + "/" + secret.getId();
 
 
         VaultResponseSupport<PasswordSecret> response = vaultTemplate.read(vaultPath, PasswordSecret.class);
 
         if (response == null || response.getData() == null && response.getData().getPassword() == null) {
-            repository.delete(exSec);
-            return null;
+            repository.delete(secret);
+            return Optional.empty();
         }
 
         PasswordSecret passwordSecret = response.getData();
 
         SecretMetadata metadata = SecretMetadata.newBuilder()
-                .setOwnerId(exSec.getOwnerId())
+                .setOwnerId(secret.getOwnerId())
                 .setTenantId(tenantId)
-                .setPersistedTime(exSec.getCreatedAt().getTime())
-                .setDescription(exSec.getDiscription())
+                .setPersistedTime(secret.getCreatedAt().getTime())
+                .setDescription(secret.getDiscription())
                 .setResourceType(ResourceType.VAULT_CREDENTIAL)
                 .setSource(ResourceSource.EXTERNAL)
-                .setToken(token)
+                .setType(ResourceSecretType.PASSWORD)
+                .setToken(
+                        (secret.getExternalId() != null ||
+                                !secret.getExternalId().trim().equals("")) ? secret.getExternalId() : secret.getId())
                 .build();
 
         org.apache.custos.resource.secret.service.PasswordCredential credential =
                 org.apache.custos.resource.secret.service.PasswordCredential.newBuilder()
                         .setPassword(passwordSecret.getPassword())
+                        .setUserId(passwordSecret.getUserId() != null? passwordSecret.getUserId() : "")
                         .setMetadata(metadata)
                         .build();
 
-        return credential;
+        return Optional.of(credential);
 
 
     }
@@ -162,35 +192,50 @@
      * @param token
      * @return
      */
-    public CertificateCredential getCertificateCredential(long tenantId, String token) {
-        Optional<Secret> secret = repository.findById(token);
+    public Optional<CertificateCredential> getCertificateCredential(long tenantId, String token) {
+        Secret secret = null;
 
-        if (secret.isEmpty()) {
-            return null;
+        if (token != null && !token.trim().equals("")) {
+            Optional<Secret> exSecret = repository.findById(token);
+            if (exSecret.isPresent()) {
+                secret = exSecret.get();
+            }
+        }
+        if (secret == null) {
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(token, tenantId);
+            if (secrets != null && !secrets.isEmpty()) {
+                secret = secrets.get(0);
+            }
         }
 
-        Secret exSec = secret.get();
+        if (secret == null) {
+            return Optional.empty();
+        }
 
-        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + exSec.getOwnerId() +
-                "/" + Constants.PASSWORD + "/" + token;
+
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + secret.getOwnerId() +
+                "/" + Constants.CERTIFICATES + "/" + secret.getId();
 
         VaultResponseSupport<Certificate> response = vaultTemplate.read(vaultPath, Certificate.class);
 
         if (response == null || response.getData() == null && response.getData().getCertificate() == null) {
-            repository.delete(exSec);
-            return null;
+            repository.delete(secret);
+            return Optional.empty();
         }
 
         Certificate certificate = response.getData();
 
         SecretMetadata metadata = SecretMetadata.newBuilder()
-                .setOwnerId(exSec.getOwnerId())
+                .setOwnerId(secret.getOwnerId())
                 .setTenantId(tenantId)
-                .setPersistedTime(exSec.getCreatedAt().getTime())
-                .setDescription(exSec.getDiscription())
+                .setPersistedTime(secret.getCreatedAt().getTime())
+                .setDescription(secret.getDiscription())
                 .setResourceType(ResourceType.VAULT_CREDENTIAL)
                 .setSource(ResourceSource.EXTERNAL)
-                .setToken(token)
+                .setType(ResourceSecretType.X509_CERTIFICATE)
+                .setToken(
+                        (secret.getExternalId() != null &&
+                                !secret.getExternalId().trim().equals("")) ? secret.getExternalId() : secret.getId())
                 .build();
 
         CertificateCredential certificateCredential = CertificateCredential.newBuilder()
@@ -202,7 +247,7 @@
                 .setMetadata(metadata)
                 .build();
 
-        return certificateCredential;
+        return Optional.of(certificateCredential);
 
     }
 
@@ -213,18 +258,31 @@
      * @param token
      * @return
      */
-    public SecretMetadata getCredentialSummary(long tenantId, String token) {
+    public Optional<SecretMetadata> getCredentialSummary(long tenantId, String token) {
 
-        Optional<Secret> exSec = repository.findById(token);
+        Secret secret = null;
 
-        if (exSec.isEmpty()) {
-            return null;
+        if (token != null && !token.trim().equals("")) {
+            Optional<Secret> exSecret = repository.findById(token);
+            if (exSecret.isPresent()) {
+                secret = exSecret.get();
+            }
+        }
+        if (secret == null) {
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(token, tenantId);
+            if (secrets != null && !secrets.isEmpty()) {
+                secret = secrets.get(0);
+            }
         }
 
-        Secret secret = exSec.get();
+        if (secret == null) {
+            return Optional.empty();
+        }
 
-        return SecretMetadata.newBuilder()
-                .setToken(token)
+        return Optional.of(SecretMetadata.newBuilder()
+                .setToken(
+                        (secret.getExternalId() != null &&
+                                !secret.getExternalId().trim().equals("")) ? secret.getExternalId() : secret.getId())
                 .setTenantId(tenantId)
                 .setDescription(secret.getDiscription())
                 .setPersistedTime(secret.getCreatedAt().getTime())
@@ -232,7 +290,7 @@
                 .setResourceType(ResourceType.VAULT_CREDENTIAL)
                 .setSource(ResourceSource.EXTERNAL)
                 .setOwnerId(secret.getOwnerId())
-                .build();
+                .build());
 
     }
 
@@ -244,16 +302,21 @@
      * @return
      */
     public List<SecretMetadata> getAllCredentialSummaries(long tenantId, List<String> tokens) {
-
-        List<Secret> secrets = repository.findAllById(tokens);
         List<SecretMetadata> metadata = new ArrayList<>();
+        if (tokens == null || tokens.isEmpty()) {
+            return metadata;
+        }
+        List<Secret> secrets = repository.getAllSecretsByIdOrExternalId(tenantId, tokens, tokens);
+
 
         if (secrets != null && !secrets.isEmpty()) {
 
 
             secrets.forEach(secret -> {
                 metadata.add(SecretMetadata.newBuilder()
-                        .setToken(secret.getId())
+                        .setToken(
+                                (secret.getExternalId() != null &&
+                                        !secret.getExternalId().trim().equals("")) ? secret.getExternalId() : secret.getId())
                         .setTenantId(tenantId)
                         .setDescription(secret.getDiscription())
                         .setPersistedTime(secret.getCreatedAt().getTime())
@@ -272,4 +335,131 @@
     }
 
 
+    public Optional<KVCredential> getKVSecretByToken(String token, long tenantId, String ownerId) {
+        Optional<Secret> secret = repository.findById(token);
+
+        if (secret.isEmpty()) {
+            return Optional.empty();
+        }
+
+        Secret exSec = secret.get();
+
+        if (!exSec.getOwnerId().equals(ownerId)) {
+            return Optional.empty();
+        }
+
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + ownerId +
+                "/" + Constants.KV_SECRET + "/" + token;
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(vaultPath, KVSecret.class);
+
+        KVSecret kvSecret = response.getData();
+        if (kvSecret == null || kvSecret.getValue() == null) {
+            repository.delete(exSec);
+            return Optional.empty();
+        }
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setToken(token)
+                .setTenantId(tenantId)
+                .setDescription(exSec.getDiscription())
+                .setPersistedTime(exSec.getCreatedAt().getTime())
+                .setType(ResourceSecretType.valueOf(exSec.getSecretType()))
+                .setResourceType(ResourceType.OTHER)
+                .setSource(ResourceSource.EXTERNAL)
+                .setOwnerId(exSec.getOwnerId())
+                .build();
+
+        KVCredential kvCredential = KVCredential.newBuilder()
+                .setKey(exSec.getExternalId())
+                .setToken(exSec.getId())
+                .setValue(kvSecret.getValue())
+                .setMetadata(metadata).build();
+
+        return Optional.of(kvCredential);
+    }
+
+    public Optional<KVCredential> getKVSecretByKey(String key, long tenantId, String ownerId) {
+
+        List<Secret> secrets = repository.findAllByExternalIdAndOwnerIdAndTenantId(key, ownerId, tenantId);
+
+        if (secrets != null && secrets.isEmpty()) {
+            return Optional.empty();
+        }
+        Secret exSec = secrets.get(0);
+
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + ownerId +
+                "/" + Constants.KV_SECRET + "/" + exSec.getId();
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(vaultPath, KVSecret.class);
+
+        KVSecret kvSecret = response.getData();
+        if (kvSecret == null || kvSecret.getValue() == null) {
+            repository.delete(exSec);
+            return Optional.empty();
+        }
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setToken(exSec.getId())
+                .setTenantId(tenantId)
+                .setDescription(exSec.getDiscription())
+                .setPersistedTime(exSec.getCreatedAt().getTime())
+                .setType(ResourceSecretType.valueOf(exSec.getSecretType()))
+                .setResourceType(ResourceType.OTHER)
+                .setSource(ResourceSource.EXTERNAL)
+                .setOwnerId(exSec.getOwnerId())
+                .build();
+
+        KVCredential kvCredential = KVCredential.newBuilder()
+                .setKey(exSec.getExternalId())
+                .setToken(exSec.getId())
+                .setValue(kvSecret.getValue())
+                .setMetadata(metadata).build();
+
+        return Optional.of(kvCredential);
+    }
+
+    public Optional<CredentialMap> getCredentialMapByToken(String token, long tenantId) throws JsonProcessingException {
+        Optional<Secret> secret = repository.findById(token);
+
+        if (secret.isEmpty()) {
+            return Optional.empty();
+        }
+
+        Secret exSec = secret.get();
+
+        String vaultPath = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + exSec.getOwnerId() +
+                "/" + Constants.SECRET_MAP + "/" + token;
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(vaultPath, KVSecret.class);
+
+        KVSecret kvSecret = response.getData();
+        if (kvSecret == null || kvSecret.getValue() == null) {
+            repository.delete(exSec);
+            return Optional.empty();
+        }
+
+        Map<String, String> valueMap = org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap.
+                getCredentialMapFromString(response.getData().getValue());
+
+
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setToken(token)
+                .setTenantId(tenantId)
+                .setDescription(exSec.getDiscription())
+                .setPersistedTime(exSec.getCreatedAt().getTime())
+                .setType(ResourceSecretType.valueOf(exSec.getSecretType()))
+                .setResourceType(ResourceType.OTHER)
+                .setSource(ResourceSource.EXTERNAL)
+                .setResourceType(ResourceType.valueOf(exSec.getType()))
+                .setOwnerId(exSec.getOwnerId())
+                .build();
+
+        CredentialMap kvCredential = CredentialMap.newBuilder()
+                .putAllCredentialMap(valueMap)
+                .setMetadata(metadata).build();
+
+        return Optional.of(kvCredential);
+    }
 }
+
+
+
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CertificateCredential.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CertificateCredential.java
index d52d677..5407c9f 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CertificateCredential.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CertificateCredential.java
@@ -45,6 +45,7 @@
     private String privateKey;
 
 
+
     public CertificateCredential(GeneratedMessageV3 message) throws CertificateException {
         super(message);
         if (message instanceof org.apache.custos.resource.secret.service.CertificateCredential) {
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialMap.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialMap.java
new file mode 100644
index 0000000..79c422b
--- /dev/null
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialMap.java
@@ -0,0 +1,76 @@
+/*
+ * 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.custos.resource.secret.manager.adaptor.outbound;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.protobuf.GeneratedMessageV3;
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CredentialMap extends ResourceCredential {
+
+    private Map<String, String> credentialMap;
+
+    private JSONObject json;
+
+    private String credentialString;
+
+    public CredentialMap(GeneratedMessageV3 message) {
+        super(message);
+        if (message instanceof org.apache.custos.resource.secret.service.CredentialMap) {
+            this.credentialMap = ((org.apache.custos.resource.secret.service.CredentialMap) message).getCredentialMapMap();
+            if (this.credentialMap != null &&  !this.credentialMap.isEmpty()) {
+                this.json = new JSONObject(this.credentialMap);
+            }
+        }
+    }
+
+    public Map<String, String> getCredentialMap() {
+        return credentialMap;
+    }
+
+    public void setCredentialMap(Map<String, String> credentialMap) {
+        this.credentialMap = credentialMap;
+    }
+
+    public JSONObject getJson() {
+        return json;
+    }
+
+    public void setJson(JSONObject json) {
+        this.json = json;
+    }
+
+    public String getCredentialString() {
+        return this.json != null ? this.json.toString() : null;
+    }
+
+    public static Map<String, String> getCredentialMapFromString(String jsonString) throws JsonProcessingException {
+        Map<String, String> map = new HashMap<String, String>();
+        ObjectMapper mapper = new ObjectMapper();
+        return mapper.readValue(jsonString,
+                new TypeReference<HashMap<String, String>>() {
+                });
+    }
+}
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialWriter.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialWriter.java
index edbb241..e3bf76a 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialWriter.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/CredentialWriter.java
@@ -19,14 +19,15 @@
 
 package org.apache.custos.resource.secret.manager.adaptor.outbound;
 
-import org.apache.custos.resource.secret.utils.Constants;
 import org.apache.custos.resource.secret.exceptions.CredentialStoreException;
 import org.apache.custos.resource.secret.persistance.local.model.Secret;
 import org.apache.custos.resource.secret.persistance.local.repository.SecretRepository;
 import org.apache.custos.resource.secret.persistance.vault.Certificate;
+import org.apache.custos.resource.secret.persistance.vault.KVSecret;
 import org.apache.custos.resource.secret.persistance.vault.PasswordSecret;
 import org.apache.custos.resource.secret.persistance.vault.SSHCredentialSecrets;
 import org.apache.custos.resource.secret.service.ResourceSecretType;
+import org.apache.custos.resource.secret.utils.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +35,7 @@
 import org.springframework.vault.core.VaultTemplate;
 import org.springframework.vault.support.VaultResponseSupport;
 
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -63,13 +65,32 @@
         if (exSecret.isPresent()) {
             String msg = " Credential with token " + credential.getToken() + " already exist";
             LOGGER.error(msg);
-            throw new CredentialStoreException(msg, null);
+            throw new CredentialStoreException("Invalid token", null);
+        }
+
+        if (credential.getExternalId() != null && !credential.getExternalId().trim().equals("")) {
+
+            Optional<Secret> exToSec = repository.findById(credential.getExternalId());
+
+            if (exToSec.isPresent()) {
+                String msg = " Credential with token " + credential.getToken() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(credential.getExternalId(),
+                    credential.getTenantId());
+            if (secrets != null && !secrets.isEmpty()) {
+                String msg = " Credential with externalId " + credential.getExternalId() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
         }
 
         String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credential.getTenantId() + "/" + credential.getOwnerId()
                 + "/" + Constants.SSH_CREDENTIALS + "/" + credential.getToken();
 
-
         SSHCredentialSecrets sshCredentialSecrets = new SSHCredentialSecrets
                 (credential.getPrivateKey(), credential.getPublicKey(), credential.getPassPhrase());
         vaultTemplate.write(path, sshCredentialSecrets);
@@ -90,6 +111,8 @@
         secret.setOwnerType(credential.getResourceOwnerType().name());
         secret.setSecretType(ResourceSecretType.SSH.name());
         secret.setTenantId(credential.getTenantId());
+        secret.setExternalId(credential.getExternalId());
+        secret.setType(credential.getType());
         repository.save(secret);
         return true;
     }
@@ -106,14 +129,33 @@
         if (exSecret.isPresent()) {
             String msg = " Credential with token " + credential.getToken() + " already exist";
             LOGGER.error(msg);
-            throw new CredentialStoreException(msg, null);
+            throw new CredentialStoreException("Invalid token", null);
+        }
+
+        if (credential.getExternalId() != null && !credential.getExternalId().trim().equals("")) {
+            Optional<Secret> exToSec = repository.findById(credential.getExternalId());
+
+            if (exToSec.isPresent()) {
+                String msg = " Credential with token " + credential.getToken() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(credential.getExternalId(),
+                    credential.getTenantId());
+            if (secrets != null && !secrets.isEmpty()) {
+                String msg = " Credential with externalId " + credential.getExternalId() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
         }
 
         String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credential.getTenantId() + "/" + credential.getOwnerId()
                 + "/" + Constants.PASSWORD + "/" + credential.getToken();
 
 
-        PasswordSecret passwordSecret = new PasswordSecret(credential.getPassword());
+        PasswordSecret passwordSecret = new PasswordSecret(credential.getPassword(), credential.getUserId());
         vaultTemplate.write(path, passwordSecret);
 
         VaultResponseSupport<PasswordSecret> response = vaultTemplate.read(path, PasswordSecret.class);
@@ -132,6 +174,8 @@
         secret.setOwnerType(credential.getResourceOwnerType().name());
         secret.setSecretType(ResourceSecretType.PASSWORD.name());
         secret.setTenantId(credential.getTenantId());
+        secret.setExternalId(credential.getExternalId());
+        secret.setType(credential.getType());
         repository.save(secret);
         return true;
     }
@@ -148,11 +192,31 @@
         if (exSecret.isPresent()) {
             String msg = " Credential with token " + credential.getToken() + " already exist";
             LOGGER.error(msg);
-            throw new CredentialStoreException(msg, null);
+            throw new CredentialStoreException("Invalid token", null);
         }
 
+        if (credential.getExternalId() != null && !credential.getExternalId().trim().equals("")) {
+            Optional<Secret> exToSec = repository.findById(credential.getExternalId());
+
+            if (exToSec.isPresent()) {
+                String msg = " Credential with token " + credential.getToken() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(credential.getExternalId(),
+                    credential.getTenantId());
+            if (secrets != null && !secrets.isEmpty()) {
+                String msg = " Credential with externalId " + credential.getExternalId() + " already exist";
+                LOGGER.error(msg);
+                throw new CredentialStoreException("Invalid token", null);
+            }
+
+        }
+
+
         String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credential.getTenantId() + "/" + credential.getOwnerId() +
-                "/" + Constants.SSH_CREDENTIALS + "/" + credential.getToken();
+                "/" + Constants.CERTIFICATES + "/" + credential.getToken();
 
 
         Certificate certificate = new Certificate(credential.getCert(),
@@ -179,6 +243,8 @@
         secret.setOwnerType(credential.getResourceOwnerType().name());
         secret.setSecretType(ResourceSecretType.X509_CERTIFICATE.name());
         secret.setTenantId(credential.getTenantId());
+        secret.setExternalId(credential.getExternalId());
+        secret.setType(credential.getType());
         repository.save(secret);
         return true;
     }
@@ -186,19 +252,26 @@
 
     /**
      * delete existing credential
+     *
      * @param tenantId
      * @param token
      * @return
      */
     public boolean deleteCredential(long tenantId, String token) {
 
+        Secret secret = null;
         Optional<Secret> exSec = repository.findById(token);
 
-        if (exSec.isEmpty()) {
-            return true;
+        if (exSec.isPresent()) {
+            secret = exSec.get();
         }
 
-        Secret secret = exSec.get();
+        if (exSec.isEmpty()) {
+            List<Secret> secrets = repository.findAllByExternalIdAndTenantId(token, tenantId);
+            if (secrets != null && !secrets.isEmpty()) {
+                secret = secrets.get(0);
+            }
+        }
 
         String type = null;
 
@@ -212,7 +285,7 @@
 
 
         String path = Constants.VAULT_RESOURCE_SECRETS_PATH + tenantId + "/" + secret.getOwnerId() +
-                "/" + type + "/" + token;
+                "/" + type + "/" + secret.getId();
 
         vaultTemplate.delete(path);
 
@@ -221,7 +294,283 @@
 
     }
 
+    public boolean saveKVCredential(KVCredential kvCredential) {
+        Optional<Secret> exSecret = repository.findById(kvCredential.getToken());
 
+        if (exSecret.isPresent()) {
+            String msg = " Credential with token " + kvCredential.getToken() + " already exist";
+            LOGGER.error(msg);
+            throw new CredentialStoreException("Invalid token", null);
+        }
+
+        List<Secret> secrets = repository.findAllByExternalIdAndOwnerIdAndTenantId(kvCredential.getKey(), kvCredential.getOwnerId(), kvCredential.getTenantId());
+
+        if (secrets != null && !secrets.isEmpty()) {
+            String msg = " Credential with key " + kvCredential.getKey() + " of user " + kvCredential.getOwnerId()
+                    + " in tenant " + kvCredential.getTenantId() + " is already exists, " +
+                    "please update or delete before setting it";
+            LOGGER.warn(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + kvCredential.getTenantId() + "/" + kvCredential.getOwnerId() +
+                "/" + Constants.KV_SECRET + "/" + kvCredential.getToken();
+
+        KVSecret kvSecret = new KVSecret(kvCredential.getKey(), kvCredential.getValue());
+
+        vaultTemplate.write(path, kvSecret);
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(path, KVSecret.class);
+
+        if (response == null || response.getData() == null && response.getData().getKey() == null) {
+            String msg = " KV credential of tenant " + kvCredential.getTenantId() +
+                    " of user " + kvCredential.getOwnerId() + " is not saved in vault";
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+
+        Secret secret = new Secret();
+        secret.setId(kvCredential.getToken());
+        secret.setDiscription(kvCredential.getDescription());
+        secret.setOwnerId(kvCredential.getOwnerId());
+        secret.setOwnerType(kvCredential.getResourceOwnerType().name());
+        secret.setSecretType(ResourceSecretType.KV.name());
+        secret.setTenantId(kvCredential.getTenantId());
+        secret.setExternalId(kvCredential.getKey());
+        secret.setType(kvCredential.getType());
+        repository.save(secret);
+        return true;
+
+    }
+
+    public boolean updateKVCredential(org.apache.custos.resource.secret.service.KVCredential kvCredential) {
+        Secret secret = null;
+
+        if (kvCredential.getToken() != null && !kvCredential.getToken().equals("")) {
+            Optional<Secret> exSecret = repository.findById(kvCredential.getToken());
+            if (!exSecret.isPresent() || (!exSecret.get().getOwnerId().equals(kvCredential.getMetadata().getOwnerId()) ||
+                    !exSecret.get().getExternalId().equals(kvCredential.getKey()))) {
+                String msg = " Cannot find record for token" + kvCredential.getToken()
+                        + " with given key " + kvCredential.getKey();
+                LOGGER.error(msg);
+                throw new CredentialStoreException(msg, null);
+            }
+            secret = exSecret.get();
+        } else {
+
+            List<Secret> secrets = repository.
+                    findAllByExternalIdAndOwnerIdAndTenantId(kvCredential.getKey(), kvCredential.getMetadata().getOwnerId(),
+                            kvCredential.getMetadata().getTenantId());
+
+            if (secrets == null && secrets.isEmpty()) {
+                String msg = " Cannot find record "
+                        + " with given key " + kvCredential.getKey();
+                LOGGER.error(msg);
+                throw new CredentialStoreException(msg, null);
+            }
+            secret = secrets.get(0);
+        }
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + kvCredential.getMetadata().getTenantId() + "/" +
+                kvCredential.getMetadata().getOwnerId() +
+                "/" + Constants.KV_SECRET + "/" + secret.getId();
+
+        KVSecret kvSecret = new KVSecret(kvCredential.getKey(), kvCredential.getValue());
+
+        vaultTemplate.delete(path);
+        vaultTemplate.write(path, kvSecret);
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(path, KVSecret.class);
+
+        if (response == null || response.getData() == null && response.getData().getKey() == null) {
+            String msg = " KV credential of tenant " + kvCredential.getMetadata().getTenantId() +
+                    " of user " + kvCredential.getMetadata().getOwnerId() + " is not saved in vault";
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+
+        secret.setDiscription(kvCredential.getMetadata().getDescription());
+        repository.save(secret);
+        return true;
+
+    }
+
+    public boolean deleteKVCredential(org.apache.custos.resource.secret.service.KVCredential kvCredential) {
+        Secret secret = null;
+        if (kvCredential.getToken() != null && !kvCredential.getToken().equals("")) {
+            Optional<Secret> exSecret = repository.findById(kvCredential.getToken());
+            if (!exSecret.isPresent() || (!exSecret.get().getOwnerId().equals(kvCredential.getMetadata().getOwnerId()) ||
+                    !exSecret.get().getExternalId().equals(kvCredential.getKey()))) {
+                String msg = " Cannot find record for token" + kvCredential.getToken()
+                        + " with given key " + kvCredential.getKey();
+                LOGGER.error(msg);
+                throw new CredentialStoreException(msg, null);
+            }
+            secret = exSecret.get();
+        } else {
+
+            List<Secret> secrets = repository.
+                    findAllByExternalIdAndOwnerIdAndTenantId(kvCredential.getKey(), kvCredential.getMetadata().getOwnerId(),
+                            kvCredential.getMetadata().getTenantId());
+
+            if (secrets == null && secrets.isEmpty()) {
+                String msg = " Cannot find record "
+                        + " with given key " + kvCredential.getKey();
+                LOGGER.error(msg);
+                throw new CredentialStoreException(msg, null);
+            }
+            secret = secrets.get(0);
+        }
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + kvCredential.getMetadata().getTenantId() + "/"
+                + kvCredential.getMetadata().getOwnerId() +
+                "/" + Constants.KV_SECRET + "/" + secret.getId();
+
+        vaultTemplate.delete(path);
+
+        repository.delete(secret);
+        return true;
+    }
+
+    public boolean saveCredentialMap(CredentialMap credentialMap) {
+        Optional<Secret> exSecret = repository.findById(credentialMap.getToken());
+
+        if (exSecret.isPresent()) {
+            String msg = " Credential with token " + credentialMap.getToken() + " already exist";
+            LOGGER.error(msg);
+            throw new CredentialStoreException("Invalid token", null);
+        }
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credentialMap.getTenantId() + "/" + credentialMap.getOwnerId() +
+                "/" + Constants.SECRET_MAP + "/" + credentialMap.getToken();
+
+        KVSecret kvSecret = new KVSecret(credentialMap.getToken(), credentialMap.getCredentialString());
+
+        vaultTemplate.write(path, kvSecret);
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(path, KVSecret.class);
+
+        if (response == null || response.getData() == null && response.getData().getKey() == null) {
+            String msg = "  credential Map of tenant " + credentialMap.getTenantId() +
+                    " of user " + credentialMap.getOwnerId() + " is not saved in vault";
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+
+        Secret secret = new Secret();
+        secret.setId(credentialMap.getToken());
+        secret.setDiscription(credentialMap.getDescription());
+        secret.setOwnerId(credentialMap.getOwnerId());
+        secret.setOwnerType(credentialMap.getResourceOwnerType().name());
+        secret.setSecretType(ResourceSecretType.CREDENTIAL_MAP.name());
+        secret.setTenantId(credentialMap.getTenantId());
+        secret.setExternalId(credentialMap.getExternalId());
+        secret.setType(credentialMap.getType());
+        repository.save(secret);
+        return true;
+
+    }
+
+    public boolean updateCredentialMap(CredentialMap credentialMap) {
+
+        Optional<Secret> exSecret = repository.findById(credentialMap.getExternalId());
+        if (!exSecret.isPresent()) {
+            String msg = " Cannot find secret for token" + credentialMap.getToken();
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+        Secret secret = exSecret.get();
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credentialMap.getTenantId() + "/" +
+                secret.getOwnerId() +
+                "/" + Constants.SECRET_MAP + "/" + secret.getId();
+
+        KVSecret kvSecret = new KVSecret(credentialMap.getExternalId(), credentialMap.getCredentialString());
+
+        VaultResponseSupport<KVSecret> responseEx = vaultTemplate.read(path, KVSecret.class);
+
+        vaultTemplate.delete(path);
+        vaultTemplate.write(path, kvSecret);
+
+        VaultResponseSupport<KVSecret> response = vaultTemplate.read(path, KVSecret.class);
+
+        if (response == null || response.getData() == null && response.getData().getKey() == null) {
+            // Writing back previouse data
+            vaultTemplate.write(path, responseEx.getData());
+
+            String msg = " CredentialMap  of tenant " + credentialMap.getTenantId() +
+                    " of user " + credentialMap.getOwnerId() + " is not saved in vault";
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+        secret.setDiscription(credentialMap.getDescription());
+        repository.save(secret);
+        return true;
+
+    }
+
+    public boolean deleteCredentialMap(CredentialMap credentialMap) {
+        Optional<Secret> exSecret = repository.findById(credentialMap.getExternalId());
+        if (!exSecret.isPresent()) {
+            String msg = " Cannot find secret for token" + credentialMap.getExternalId();
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+        Secret secret = exSecret.get();
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credentialMap.getTenantId() + "/" +
+                secret.getOwnerId() +
+                "/" + Constants.SECRET_MAP + "/" + secret.getId();
+
+        vaultTemplate.delete(path);
+        repository.delete(secret);
+        return true;
+    }
+
+
+    public boolean updateCertificateCredential(CertificateCredential credential) {
+        Optional<Secret> exSecret = repository.findById(credential.getToken());
+
+        if (exSecret.isEmpty()) {
+            String msg = " Credential with token " + credential.getToken() + " not found";
+            LOGGER.error(msg);
+            throw new CredentialStoreException("Invalid token", null);
+        }
+
+        String path = Constants.VAULT_RESOURCE_SECRETS_PATH + credential.getTenantId() + "/" + credential.getOwnerId() +
+                "/" + Constants.CERTIFICATES + "/" + credential.getToken();
+
+
+        Certificate certificate = new Certificate(credential.getCert(),
+                String.valueOf(credential.getLifetime()),
+                credential.getNotBefore(),
+                credential.getNotAfter(),
+                credential.getPrivateKey());
+
+        vaultTemplate.write(path, certificate);
+
+        VaultResponseSupport<Certificate> response = vaultTemplate.read(path, Certificate.class);
+
+        if (response == null || response.getData() == null && response.getData().getCertificate() == null) {
+            String msg = " Certificate credential of tenant " + credential.getTenantId() +
+                    " of user " + credential.getOwnerId() + " is not saved in vault";
+            LOGGER.error(msg);
+            throw new CredentialStoreException(msg, null);
+        }
+
+        Secret secret = new Secret();
+        secret.setId(credential.getToken());
+        secret.setDiscription(credential.getDescription());
+        secret.setOwnerId(credential.getOwnerId());
+        secret.setOwnerType(credential.getResourceOwnerType().name());
+        secret.setSecretType(ResourceSecretType.X509_CERTIFICATE.name());
+        secret.setTenantId(credential.getTenantId());
+        secret.setExternalId(credential.getExternalId());
+        secret.setType(credential.getType());
+        secret.setCreatedAt(exSecret.get().getCreatedAt());
+        repository.save(secret);
+        return true;
+    }
 
 
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/KVCredential.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/KVCredential.java
new file mode 100644
index 0000000..aafa3f2
--- /dev/null
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/KVCredential.java
@@ -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.
+ */
+
+package org.apache.custos.resource.secret.manager.adaptor.outbound;
+
+import com.google.protobuf.GeneratedMessageV3;
+
+
+public class KVCredential extends ResourceCredential {
+    private String key;
+    private String value;
+
+    public KVCredential(GeneratedMessageV3 message) {
+        super(message);
+        if (message instanceof org.apache.custos.resource.secret.service.KVCredential) {
+            this.key = ((org.apache.custos.resource.secret.service.KVCredential) message).getKey();
+            this.value = ((org.apache.custos.resource.secret.service.KVCredential) message).getValue();
+        }
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/PasswordCredential.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/PasswordCredential.java
index 6b7b03c..2cd4c64 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/PasswordCredential.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/PasswordCredential.java
@@ -28,10 +28,14 @@
 
     private String password;
 
+    private String userId;
+
     public PasswordCredential(GeneratedMessageV3 message) {
         super(message);
         if (message instanceof org.apache.custos.resource.secret.service.PasswordCredential) {
           this.password =   ((org.apache.custos.resource.secret.service.PasswordCredential) message).getPassword();
+          this.userId = ((org.apache.custos.resource.secret.service.PasswordCredential) message).getUserId();
+
         }
     }
 
@@ -42,4 +46,12 @@
     public void setPassword(String password) {
         this.password = password;
     }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/ResourceCredential.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/ResourceCredential.java
index 27b6b10..5558f34 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/ResourceCredential.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/ResourceCredential.java
@@ -40,6 +40,10 @@
 
     private long tenantId;
 
+    private String type;
+
+    private String externalId;
+
 
     public ResourceCredential(GeneratedMessageV3 message) {
 
@@ -47,24 +51,31 @@
 
         if (message instanceof SSHCredential) {
             SecretMetadata metadata = ((SSHCredential) message).getMetadata();
-            this.description = metadata.getDescription();
-            this.ownerId = metadata.getOwnerId();
-            this.tenantId = metadata.getTenantId();
+            parseMetadata(metadata);
             this.resourceOwnerType = ResourceOwnerType.TENANT;
+            this.externalId = metadata.getToken();
 
         } else if (message instanceof CertificateCredential) {
             SecretMetadata metadata = ((CertificateCredential) message).getMetadata();
-            this.description = metadata.getDescription();
-            this.ownerId = metadata.getOwnerId();
-            this.tenantId = metadata.getTenantId();
+            parseMetadata(metadata);
             this.resourceOwnerType = ResourceOwnerType.TENANT;
+            this.externalId = metadata.getToken();
 
         } else if (message instanceof PasswordCredential) {
             SecretMetadata metadata = ((PasswordCredential) message).getMetadata();
-            this.description = metadata.getDescription();
-            this.ownerId = metadata.getOwnerId();
-            this.tenantId = metadata.getTenantId();
+            parseMetadata(metadata);
             this.resourceOwnerType = ResourceOwnerType.TENANT;
+            this.externalId = metadata.getToken();
+        } else if (message instanceof org.apache.custos.resource.secret.service.KVCredential) {
+            SecretMetadata metadata = ((org.apache.custos.resource.secret.service.KVCredential) message).getMetadata();
+            parseMetadata(metadata);
+            this.resourceOwnerType = ResourceOwnerType.TENANT_USER;
+            this.externalId = ((org.apache.custos.resource.secret.service.KVCredential) message).getKey();
+        } else if (message instanceof org.apache.custos.resource.secret.service.CredentialMap) {
+            SecretMetadata metadata = ((org.apache.custos.resource.secret.service.CredentialMap) message).getMetadata();
+            parseMetadata(metadata);
+            this.resourceOwnerType = ResourceOwnerType.TENANT;
+            this.externalId = metadata.getToken();
         }
     }
 
@@ -114,4 +125,30 @@
 
         return UUID.randomUUID().toString();
     }
+
+
+    public String getExternalId() {
+        return externalId;
+    }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    private boolean parseMetadata(SecretMetadata secretMetadata) {
+        this.description = secretMetadata.getDescription();
+        this.ownerId = secretMetadata.getOwnerId();
+        this.tenantId = secretMetadata.getTenantId();
+        this.type = secretMetadata.getResourceType().name();
+
+        return true;
+    }
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/SSHCredential.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/SSHCredential.java
index 5e2d6eb..ff6647a 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/SSHCredential.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/manager/adaptor/outbound/SSHCredential.java
@@ -26,7 +26,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 import java.io.File;
 import java.util.UUID;
 
@@ -42,20 +41,24 @@
     private String privateKey;
     private String passPhrase;
 
+
     public SSHCredential(GeneratedMessageV3 message) throws Exception {
         super(message);
-       if (message instanceof org.apache.custos.resource.secret.service.SSHCredential) {
+        if (message instanceof org.apache.custos.resource.secret.service.SSHCredential) {
 
-         this.passPhrase =  ((org.apache.custos.resource.secret.service.SSHCredential) message).getPassphrase();
-         this.privateKey = ((org.apache.custos.resource.secret.service.SSHCredential) message).getPrivateKey();
-         this.publicKey = ((org.apache.custos.resource.secret.service.SSHCredential) message).getPublicKey();
+            this.passPhrase = ((org.apache.custos.resource.secret.service.SSHCredential) message).getPassphrase();
+            this.privateKey = ((org.apache.custos.resource.secret.service.SSHCredential) message).getPrivateKey();
+            this.publicKey = ((org.apache.custos.resource.secret.service.SSHCredential) message).getPublicKey();
 
-         if (passPhrase == null || passPhrase.trim().equals("")) {
-             this.passPhrase = String.valueOf(UUID.randomUUID());
-         }
-          this.generateKeyPair(this.passPhrase);
 
-       }
+            if (passPhrase == null || passPhrase.trim().equals("")) {
+                this.passPhrase = String.valueOf(UUID.randomUUID());
+            }
+            if (this.publicKey == null || this.publicKey.trim().equals("")) {
+                this.generateKeyPair(this.passPhrase);
+            }
+
+        }
 
     }
 
@@ -83,15 +86,16 @@
         this.passPhrase = passPhrase;
     }
 
-    private void  generateKeyPair(String passPhrase) throws Exception{
-        JSch jsch=new JSch();
-        try{
-            KeyPair kpair= KeyPair.genKeyPair(jsch, KeyPair.RSA, 2048);
+
+    private void generateKeyPair(String passPhrase) throws Exception {
+        JSch jsch = new JSch();
+        try {
+            KeyPair kpair = KeyPair.genKeyPair(jsch, KeyPair.RSA, 2048);
             File file = File.createTempFile("id_rsa", "");
             String fileName = file.getAbsolutePath();
 
             kpair.writePrivateKey(fileName, passPhrase.getBytes());
-            kpair.writePublicKey(fileName + ".pub"  , "");
+            kpair.writePublicKey(fileName + ".pub", "");
             kpair.dispose();
             byte[] priKey = FileUtils.readFileToByteArray(new File(fileName));
 
@@ -99,8 +103,7 @@
             this.privateKey = new String(priKey);
             this.publicKey = new String(pubKey);
 
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             LOGGER.error("Error while creating key pair", e);
             throw new Exception("Error while creating key pair", e);
         }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/model/Secret.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/model/Secret.java
index fc74e80..50a4e04 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/model/Secret.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/model/Secret.java
@@ -62,6 +62,9 @@
     @LastModifiedDate
     private Date lastModifiedAt;
 
+    @Column
+    private String externalId;
+
 
     public String getId() {
         return id;
@@ -134,4 +137,13 @@
     public void setLastModifiedAt(Date lastModifiedAt) {
         this.lastModifiedAt = lastModifiedAt;
     }
+
+
+    public String getExternalId() {
+        return externalId;
+    }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/repository/SecretRepository.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/repository/SecretRepository.java
index 34ee966..26b1d02 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/repository/SecretRepository.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/local/repository/SecretRepository.java
@@ -21,7 +21,21 @@
 
 import org.apache.custos.resource.secret.persistance.local.model.Secret;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Iterator;
+import java.util.List;
 
 public interface SecretRepository extends JpaRepository<Secret, String> {
 
+
+    public List<Secret> findAllByExternalIdAndOwnerIdAndTenantId(String externalId, String ownerId, long tenantId);
+
+    public List<Secret> findAllByExternalIdAndTenantId(String externalId, long tenantId);
+
+    @Query(value = "select * from secret s where s.tenant_id = ?1 and ( s.id  IN ?2 " +
+            "or s.external_id  IN ?3 )", nativeQuery = true)
+    public List<Secret> getAllSecretsByIdOrExternalId(long tenantId, List<String> tokens, List<String> externalIds);
+
+
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/KVSecret.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/KVSecret.java
new file mode 100644
index 0000000..d78a065
--- /dev/null
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/KVSecret.java
@@ -0,0 +1,54 @@
+/*
+ * 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.custos.resource.secret.persistance.vault;
+
+/**
+ * KV secret store
+ */
+public class KVSecret {
+    private String key;
+
+    private String value;
+
+    public KVSecret() {
+
+    }
+
+    public KVSecret(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/PasswordSecret.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/PasswordSecret.java
index 1b094c4..399173b 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/PasswordSecret.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/persistance/vault/PasswordSecret.java
@@ -26,6 +26,8 @@
 
     private String password;
 
+    private String userId;
+
     public PasswordSecret() {
 
     }
@@ -35,6 +37,11 @@
         this.password = password;
     }
 
+    public PasswordSecret(String password, String userId) {
+        this.password = password;
+        this.userId = userId;
+    }
+
     public String getPassword() {
         return password;
     }
@@ -42,4 +49,13 @@
     public void setPassword(String password) {
         this.password = password;
     }
+
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/service/ResourceSecretService.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/service/ResourceSecretService.java
index 2f50e15..f189935 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/service/ResourceSecretService.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/service/ResourceSecretService.java
@@ -25,8 +25,8 @@
 import org.apache.custos.core.services.commons.persistance.model.OperationStatus;
 import org.apache.custos.resource.secret.manager.Credential;
 import org.apache.custos.resource.secret.manager.CredentialGeneratorFactory;
-import org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialWriter;
 import org.apache.custos.resource.secret.manager.adaptor.inbound.CredentialReader;
+import org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialWriter;
 import org.apache.custos.resource.secret.utils.Operations;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
@@ -34,6 +34,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.List;
+import java.util.Optional;
 
 /**
  * This class is responsible for handling resource secrets, such as SSH credentials, password credentials
@@ -58,24 +59,6 @@
 
 
     @Override
-    public void getSecret(GetSecretRequest request, StreamObserver<SecretMetadata> responseObserver) {
-        try {
-            LOGGER.debug(" Request received to getSecret in tenant " + request.getMetadata().getTenantId() +
-                    " of owner " + request.getMetadata().getOwnerId() + " with token  " + request.getMetadata().getToken());
-
-            responseObserver.onNext(SecretMetadata.newBuilder().build());
-            responseObserver.onCompleted();
-
-        } catch (Exception ex) {
-            String msg = "Exception occurred while fetching secret with " + request.getMetadata().getToken() +
-                    " : " + ex.getMessage();
-            LOGGER.error(msg);
-            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-        }
-    }
-
-
-    @Override
     public void getAllResourceCredentialSummaries(GetResourceCredentialSummariesRequest request, StreamObserver<ResourceCredentialSummaries> responseObserver) {
         try {
             LOGGER.debug(" Request received to getAllResourceCredentialSummaries in tenant " + request.getTenantId() +
@@ -94,7 +77,7 @@
 
         } catch (Exception ex) {
             String msg = "Exception occurred while fetching credential summaries  " +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -120,7 +103,8 @@
 
             AddResourceCredentialResponse resourceCredentialResponse = AddResourceCredentialResponse
                     .newBuilder()
-                    .setToken(sshCredential.getToken())
+                    .setToken((sshCredential.getExternalId() != null &&
+                            !sshCredential.getExternalId().trim().equals("")) ? sshCredential.getExternalId() : sshCredential.getToken())
                     .build();
             responseObserver.onNext(resourceCredentialResponse);
             responseObserver.onCompleted();
@@ -128,7 +112,7 @@
 
         } catch (Exception ex) {
             String msg = "Exception occurred while adding SSH credentials " + request.getMetadata().getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -153,14 +137,15 @@
 
             AddResourceCredentialResponse resourceCredentialResponse = AddResourceCredentialResponse
                     .newBuilder()
-                    .setToken(passwordCredential.getToken())
+                    .setToken((passwordCredential.getExternalId() != null &&
+                            !passwordCredential.getExternalId().trim().equals("")) ? passwordCredential.getExternalId() : passwordCredential.getToken())
                     .build();
             responseObserver.onNext(resourceCredentialResponse);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Exception occurred while adding password credentials " + request.getMetadata().getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -185,14 +170,16 @@
 
             AddResourceCredentialResponse resourceCredentialResponse = AddResourceCredentialResponse
                     .newBuilder()
-                    .setToken(certificateCredential.getToken())
+                    .setToken((certificateCredential.getExternalId() != null &&
+                            !certificateCredential.getExternalId().trim().equals("")) ?
+                            certificateCredential.getExternalId() : certificateCredential.getToken())
                     .build();
             responseObserver.onNext(resourceCredentialResponse);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Exception occurred while adding certificate credential secret " + request.getMetadata().getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -204,15 +191,15 @@
             LOGGER.debug(" Request received to getResourceCredentialSummary in tenant " + request.getTenantId() +
                     " with token  " + request.getToken());
 
-            SecretMetadata metadata = credentialReader.getCredentialSummary(request.getTenantId(), request.getToken());
+            Optional<SecretMetadata> metadata = credentialReader.getCredentialSummary(request.getTenantId(), request.getToken());
 
-            responseObserver.onNext(metadata);
+            responseObserver.onNext(metadata.get());
             responseObserver.onCompleted();
 
 
         } catch (Exception ex) {
             String msg = "Exception occurred while fetching resource credential summaries " + request.getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -224,13 +211,13 @@
             LOGGER.debug(" Request received to getSSHCredential in tenant " + request.getTenantId() +
                     " with token  " + request.getToken());
 
-            SSHCredential sshCredential = credentialReader.getSSHCredential(request.getTenantId(), request.getToken());
-            responseObserver.onNext(sshCredential);
+            Optional<SSHCredential> sshCredential = credentialReader.getSSHCredential(request.getTenantId(), request.getToken());
+            responseObserver.onNext(sshCredential.get());
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Exception occurred while fetching SSH credential " + request.getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -242,14 +229,14 @@
             LOGGER.debug(" Request received to getPasswordCredential in tenant " + request.getTenantId() +
                     " with token  " + request.getToken());
 
-            PasswordCredential passwordCredential = credentialReader.
+            Optional<PasswordCredential> passwordCredential = credentialReader.
                     getPasswordCredential(request.getTenantId(), request.getToken());
-            responseObserver.onNext(passwordCredential);
+            responseObserver.onNext(passwordCredential.get());
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Exception occurred while fetching password credential " + request.getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -261,14 +248,14 @@
             LOGGER.debug(" Request received to getCertificateCredential in tenant " + request.getTenantId() +
                     " with token  " + request.getToken());
 
-            CertificateCredential certificateCredential = credentialReader.
+            Optional<CertificateCredential> certificateCredential = credentialReader.
                     getCertificateCredential(request.getTenantId(), request.getToken());
-            responseObserver.onNext(certificateCredential);
+            responseObserver.onNext(certificateCredential.get());
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Exception occurred while fetching certificate credential " + request.getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -295,7 +282,7 @@
 
         } catch (Exception ex) {
             String msg = "Exception occurred while deleting SSH secret " + request.getToken() +
-                    " : " + ex.getMessage();
+                    " : " + ex;
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
@@ -321,6 +308,249 @@
 
         } catch (Exception ex) {
             String msg = "Exception occurred while deleting password credential " + request.getToken() +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void getKVCredential(KVCredential request, StreamObserver<KVCredential> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to getKVCredential in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getKey());
+            String token = request.getToken();
+            Optional<KVCredential> kvCredential = null;
+            if (token != null && !token.trim().equals("")) {
+                kvCredential = credentialReader.getKVSecretByToken(token,
+                        request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+            } else {
+                kvCredential = credentialReader.getKVSecretByKey(request.getKey(),
+                        request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+            }
+
+            responseObserver.onNext(kvCredential.get());
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while fetching KV credentials " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void setKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to setKVCredential in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getKey());
+            Credential credential = credentialGeneratorFactory.getCredential(request);
+
+            credentialWriter.saveKVCredential((org.apache.custos.resource.secret.manager.adaptor.outbound.KVCredential) credential);
+
+            statusUpdater.updateStatus(Operations.SAVE_KV_CREDENTIAL.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while  setting KV credentials " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to updateKVCredential in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getKey());
+            credentialWriter.updateKVCredential(request);
+
+            statusUpdater.updateStatus(Operations.UPDATE_KV_CREDENTIAL.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while updating  KV credential " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to deleteKVCredential in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getKey());
+
+            credentialWriter.deleteKVCredential(request);
+
+            statusUpdater.updateStatus(Operations.DELETE_KV_CREDENTIAL.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while deleting KV  credential " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void getCredentialMap(CredentialMap request, StreamObserver<CredentialMap> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to getCredentialMap in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getMetadata().getToken());
+
+            Optional<CredentialMap> certificateCredential = credentialReader.
+                    getCredentialMapByToken(request.getMetadata().getToken(), request.getMetadata().getTenantId());
+            if (certificateCredential.isPresent()) {
+                responseObserver.onNext(certificateCredential.get());
+                responseObserver.onCompleted();
+            } else {
+                String msg = "Cannot find a credential with token " + request.getMetadata().getToken();
+                LOGGER.error(msg);
+                responseObserver.onError(Status.NOT_FOUND.withDescription(msg).asRuntimeException());
+            }
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while fetching credential  Map " +
+                    " : " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void setCredentialMap(CredentialMap request, StreamObserver<AddResourceCredentialResponse> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to setCredentialMap in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getMetadata().getToken());
+
+            Credential credential = credentialGeneratorFactory.getCredential(request);
+
+            credentialWriter.saveCredentialMap((org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap) credential);
+
+            statusUpdater.updateStatus(Operations.SAVE_CREDENTIAL_MAP.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            AddResourceCredentialResponse operationStatus = AddResourceCredentialResponse
+                    .newBuilder()
+                    .setToken(((org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap) credential).getToken())
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while deleting KV  credential " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateCredentialMap(CredentialMap request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to updateCredentialMap in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getMetadata().getToken());
+            Credential credential = credentialGeneratorFactory.getCredential(request);
+            credentialWriter.updateCredentialMap((org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap) credential);
+
+            statusUpdater.updateStatus(Operations.UPDATE_CREDENTIAL_MAP.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while deleting KV  credential " +
+                    " : " + ex;
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteCredentialMap(CredentialMap request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to deleteCredentialMap in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getMetadata().getToken());
+            Credential credential = credentialGeneratorFactory.getCredential(request);
+            credentialWriter.deleteCredentialMap((org.apache.custos.resource.secret.manager.adaptor.outbound.CredentialMap) credential);
+
+            statusUpdater.updateStatus(Operations.DELETE_CREDENTIAL_MAP.name(), OperationStatus.SUCCESS,
+                    request.getMetadata().getTenantId(), request.getMetadata().getOwnerId());
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while deleting CredentialMap " +
+                    " : " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateCertificateCredential(CertificateCredential request,
+                                            StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        try {
+            LOGGER.debug(" Request received to updateCertificateCredential in tenant " + request.getMetadata().getTenantId() +
+                    " with key  " + request.getMetadata().getToken());
+
+            Credential credential = credentialGeneratorFactory.getCredential(request);
+
+            org.apache.custos.resource.secret.manager.adaptor.outbound.CertificateCredential certificateCredential =
+                    (org.apache.custos.resource.secret.manager.adaptor.outbound.CertificateCredential) credential;
+            certificateCredential.setToken(request.getMetadata().getToken());
+
+            credentialWriter
+                    .updateCertificateCredential(certificateCredential);
+
+
+            ResourceCredentialOperationStatus operationStatus = ResourceCredentialOperationStatus
+                    .newBuilder()
+                    .setStatus(true)
+                    .build();
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Exception occurred while updating certificate " +
                     " : " + ex.getMessage();
             LOGGER.error(msg);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Constants.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Constants.java
index 0b34ac1..8a7746c 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Constants.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Constants.java
@@ -25,6 +25,8 @@
     public static final String SSH_CREDENTIALS = "ssh";
     public static  final String CERTIFICATES = "certificates";
     public static final String PASSWORD = "passwd";
+    public static final String  KV_SECRET = "keyValue";
+    public static final String SECRET_MAP = "secretMap";
 
 
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Operations.java b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Operations.java
index 6749405..05d5018 100644
--- a/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Operations.java
+++ b/custos-core-services/resource-secret-core-service/src/main/java/org/apache/custos/resource/secret/utils/Operations.java
@@ -26,6 +26,12 @@
     ADD_PASSWORD_CREDENTIAL,
     DELETE_SSH_CREDENTIAL,
     DELETE_CERTIFICATE_CREDENTIAL,
-    DELETE_PASSWORD_CREDENTIAL
+    DELETE_PASSWORD_CREDENTIAL,
+    SAVE_KV_CREDENTIAL,
+    UPDATE_KV_CREDENTIAL,
+    DELETE_KV_CREDENTIAL,
+    SAVE_CREDENTIAL_MAP,
+    UPDATE_CREDENTIAL_MAP,
+    DELETE_CREDENTIAL_MAP
 
 }
diff --git a/custos-core-services/resource-secret-core-service/src/main/proto/ResourceSecretService.proto b/custos-core-services/resource-secret-core-service/src/main/proto/ResourceSecretService.proto
index 0ca5a8d..88c6620 100644
--- a/custos-core-services/resource-secret-core-service/src/main/proto/ResourceSecretService.proto
+++ b/custos-core-services/resource-secret-core-service/src/main/proto/ResourceSecretService.proto
@@ -23,6 +23,7 @@
 option java_multiple_files = true;
 package org.apache.custos.resource.secret.service;
 
+option go_package = "./pb";
 
 enum ResourceOwnerType {
     TENANT_USER = 0;
@@ -34,6 +35,16 @@
     SERVER_CERTIFICATE = 0;
     JWT_SIGNING_CERTIFICATE = 1;
     VAULT_CREDENTIAL = 2;
+    VM = 3;
+    ACCOUNT = 4;
+    OTHER = 5;
+    SCP =6;
+    S3 =7;
+    BOX =8;
+    AZURE =9;
+    GCS = 10;
+    DROPBOX=11;
+    FTP=12;
 }
 
 enum ResourceSource {
@@ -47,6 +58,9 @@
     SSH = 0;
     PASSWORD = 1;
     X509_CERTIFICATE = 2;
+    RAW_DATA= 3;
+    KV=4;
+    CREDENTIAL_MAP=5;
 }
 
 message SecretMetadata {
@@ -66,13 +80,7 @@
 }
 
 
-message GetSecretRequest {
-    SecretMetadata metadata = 1;
-    int64 tenantId = 2;
-    string clientId = 3;
-    string clientSec = 4;
-    string accessToken = 5;
-}
+
 
 
 message CertificateCredential {
@@ -82,11 +90,20 @@
     string private_key = 5;
     int64 life_time = 6;
     string not_before = 7;
+    bool use_shamirs_secret_sharing_with_encryption = 8;
+    int32 num_of_shares = 9;
+    int32 threshold = 10;
+    repeated bytes  private_key_shares = 11;
 }
 
 message PasswordCredential {
     SecretMetadata metadata = 1;
     string password = 3;
+    bool use_shamirs_secret_sharing_with_encryption = 4;
+    int32 num_of_shares = 5;
+    int32 threshold = 6;
+    repeated bytes  secret_shares = 7;
+    string userId = 8;
 }
 
 message SSHCredential {
@@ -94,6 +111,10 @@
     string passphrase = 3;
     string public_key = 4;
     string private_key = 5;
+    bool use_shamirs_secret_sharing_with_encryption = 6;
+    int32 num_of_shares = 7;
+    int32 threshold = 8;
+    repeated bytes  private_key_shares = 9;
 }
 
 
@@ -102,6 +123,10 @@
     string token = 2;
     string performed_by = 3;
     string client_id = 4;
+    bool use_shamirs_secret_sharing_with_encryption = 5;
+    int32 num_of_shares = 6;
+    int32 threshold = 7;
+
 }
 
 message GetResourceCredentialSummariesRequest {
@@ -126,14 +151,47 @@
 }
 
 
+message KVCredential {
+    string key = 1;
+    string value = 2;
+    SecretMetadata metadata = 3;
+    string token = 4;
+}
+
+
+
+
+message GetSecretRequest {
+    SecretMetadata metadata = 1;
+    string client_id =2;
+    int64 tenant_id = 3;
+    string client_sec = 4;
+}
+
+message CredentialMap {
+    map<string,string> credential_map = 1;
+    SecretMetadata metadata = 2;
+}
+
+
+
 service ResourceSecretService {
-    rpc getSecret (GetSecretRequest) returns (SecretMetadata);
+    rpc getKVCredential (KVCredential) returns (KVCredential);
+    rpc setKVCredential(KVCredential)  returns (ResourceCredentialOperationStatus);
+    rpc updateKVCredential (KVCredential) returns (ResourceCredentialOperationStatus);
+    rpc deleteKVCredential (KVCredential) returns (ResourceCredentialOperationStatus);
+
+    rpc getCredentialMap (CredentialMap) returns (CredentialMap);
+    rpc setCredentialMap (CredentialMap) returns (AddResourceCredentialResponse);
+    rpc updateCredentialMap (CredentialMap) returns (ResourceCredentialOperationStatus);
+    rpc deleteCredentialMap (CredentialMap) returns (ResourceCredentialOperationStatus);
 
     rpc getResourceCredentialSummary (GetResourceCredentialByTokenRequest) returns (SecretMetadata);
     rpc getAllResourceCredentialSummaries (GetResourceCredentialSummariesRequest) returns (ResourceCredentialSummaries);
     rpc addSSHCredential (SSHCredential) returns (AddResourceCredentialResponse);
     rpc addPasswordCredential (PasswordCredential) returns (AddResourceCredentialResponse);
     rpc addCertificateCredential (CertificateCredential) returns (AddResourceCredentialResponse);
+    rpc updateCertificateCredential (CertificateCredential) returns (ResourceCredentialOperationStatus);
 
     rpc getSSHCredential (GetResourceCredentialByTokenRequest) returns (SSHCredential);
     rpc getPasswordCredential (GetResourceCredentialByTokenRequest) returns (PasswordCredential);
diff --git a/custos-core-services/resource-secret-core-service/src/main/resources/application.properties b/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
index c34ddd3..c0b9add 100644
--- a/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
+++ b/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_resource_secret?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_resource_secret?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,4 @@
 
 # Hibernate ddl auto (create, create-drop, validate, update)
 spring.jpa.hibernate.ddl-auto = update
-
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-core-services/resource-secret-core-service/src/main/resources/bootstrap.properties b/custos-core-services/resource-secret-core-service/src/main/resources/bootstrap.properties
index da2d184..c23dcee 100644
--- a/custos-core-services/resource-secret-core-service/src/main/resources/bootstrap.properties
+++ b/custos-core-services/resource-secret-core-service/src/main/resources/bootstrap.properties
@@ -17,9 +17,12 @@
 #  under the License.
 #
 
-spring.cloud.vault.token={{vault_token}}
-spring.cloud.vault.scheme=http
-spring.cloud.vault.host=vault.custos.scigap.org
-spring.cloud.vault.port=30249
-spring.cloud.vault.uri=http://vault.custos.scigap.org:30249
+
+spring.cloud.vault.token=${vault.token}
+spring.cloud.vault.scheme=${vault.scheme}
+spring.cloud.vault.host=${vault.host}
+spring.cloud.vault.port=${vault.port}
+spring.cloud.vault.uri=${vault.uri}
 spring.cloud.vault.authentication=token
+spring.cloud.vault.ssl.trust-store=file:home/ubuntu/vault-client-truststore.pkcs12
+spring.cloud.vault.ssl.trust-store-password=vaultpass
\ No newline at end of file
diff --git a/custos-core-services/resource-secret-core-service/src/main/resources/vault-client-truststore.pkcs12 b/custos-core-services/resource-secret-core-service/src/main/resources/vault-client-truststore.pkcs12
new file mode 100644
index 0000000..ec1e989
--- /dev/null
+++ b/custos-core-services/resource-secret-core-service/src/main/resources/vault-client-truststore.pkcs12
Binary files differ
diff --git a/custos-core-services/sharing-core-service/Dockerfile b/custos-core-services/sharing-core-service/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/sharing-core-service/Dockerfile
+++ b/custos-core-services/sharing-core-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/sharing-core-service/pom.xml b/custos-core-services/sharing-core-service/pom.xml
index c78d457..c47183d 100644
--- a/custos-core-services/sharing-core-service/pom.xml
+++ b/custos-core-services/sharing-core-service/pom.xml
@@ -95,6 +95,7 @@
             <artifactId>commons-io</artifactId>
         </dependency>
 
+
     </dependencies>
 
 
@@ -114,6 +115,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/sharing-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/sharing-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/sharing-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/sharing-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/EntityMapper.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/EntityMapper.java
index a43e539..77d41fc 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/EntityMapper.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/EntityMapper.java
@@ -68,6 +68,7 @@
             perEntity.setExternalParentId(entity.getParentId());
         }
 
+
         if (entity.getOriginalCreationTime() > 0) {
             perEntity.setOriginalCreatedTime(new Date(entity.getOriginalCreationTime()));
         }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/SharingMapper.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/SharingMapper.java
index fd1ac13..4e2e4fe 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/SharingMapper.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/mapper/SharingMapper.java
@@ -23,11 +23,14 @@
 import org.apache.custos.sharing.persistance.model.PermissionType;
 import org.apache.custos.sharing.persistance.model.Sharing;
 import org.apache.custos.sharing.service.SharedOwners;
+import org.apache.custos.sharing.service.SharingMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 public class SharingMapper {
@@ -41,6 +44,7 @@
                                         String ownerId,
                                         String ownerType,
                                         String sharingType,
+                                        String sharedBy,
                                         long tenantId) {
 
         String id = entity.getId() + "_" +
@@ -55,6 +59,9 @@
         sharing.setInheritedParent(inheritedEntity);
         sharing.setTenantId(tenantId);
         sharing.setId(id);
+        if (sharedBy != null) {
+            sharing.setSharedBy(sharedBy);
+        }
         return sharing;
     }
 
@@ -71,6 +78,9 @@
         sharing.setAssociatingIdType(oldSharing.getAssociatingIdType());
         sharing.setInheritedParent(oldSharing.getInheritedParent());
         sharing.setCreatedAt(oldSharing.getCreatedAt());
+        if (oldSharing.getSharedBy() != null) {
+            sharing.setSharedBy(oldSharing.getSharedBy());
+        }
         sharing.setTenantId(tenantId);
         sharing.setId(id);
         return sharing;
@@ -90,9 +100,54 @@
                     map(shr -> shr.getAssociatingId()).collect(Collectors.toList());
 
         }
-
         return builder.addAllOwnerIds(ownerIds).build();
 
     }
 
+    public static SharingMetadata getSharingMetadata(Sharing sharing, Entity entity,
+                                                     PermissionType permissionType, String type) throws SQLException {
+        org.apache.custos.sharing.service.Entity en = EntityMapper.createEntity(entity);
+        return SharingMetadata.newBuilder()
+                .setEntity(en)
+                .setOwnerId(sharing.getAssociatingId())
+                .setOwnerType(type)
+                .setSharedBy(sharing.getSharedBy()!=null?sharing.getSharedBy():"")
+                .setPermission(org.apache.custos.sharing.service.PermissionType.newBuilder()
+                        .setId(permissionType.getExternalId()).build()).build();
+
+    }
+
+    public static Optional<List<SharingMetadata>> getSharingMetadata(List<Sharing> sharingList) {
+        if (sharingList != null && !sharingList.isEmpty()) {
+
+            return Optional.ofNullable(sharingList.stream().
+                    map(shr -> {
+                        try {
+                            SharingMetadata metadata = SharingMetadata.newBuilder()
+                                    .setPermission(org.apache.custos.sharing.service.PermissionType.newBuilder().
+                                            setId(shr.getPermissionType().getExternalId())
+                                            .setName(shr.getPermissionType().getName()
+                                            ).setDescription(shr.getPermissionType().getDescription() == null ?
+                                                    "" : shr.getPermissionType().getDescription()).
+                                                    setCreatedAt(shr.getCreatedAt().getTime())
+                                            .setUpdatedAt(shr.getLastModifiedAt().getTime()).build())
+                                    .setOwnerType(shr.getAssociatingIdType())
+                                    .setOwnerId(shr.getAssociatingId())
+                                    .setEntity(EntityMapper.createEntity(shr.getEntity()))
+                                    .setSharedBy(shr.getSharedBy() != null ? shr.getSharedBy() : "")
+                                    .build();
+                            return metadata;
+                        } catch (SQLException throwables) {
+                            String msg = "Error occurred while creating metadata " + throwables.getMessage();
+                            LOGGER.error(msg, throwables);
+                        }
+                        ;
+                        return null;
+                    }).collect(Collectors.toList()));
+
+        }
+        return Optional.empty();
+
+    }
+
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Entity.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Entity.java
index 6bad30f..7e91c4d 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Entity.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Entity.java
@@ -55,6 +55,7 @@
     private String description;
 
     @Column
+    @Lob
     private String fullText;
 
     @Column
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
index 566da2e..8284c70 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
@@ -33,6 +33,7 @@
 public class Sharing {
 
     @Id
+    @Column(length = 1000)
     private String id;
 
     @Column(nullable = false)
@@ -44,6 +45,9 @@
     @Column(nullable = false)
     private String sharingType;
 
+
+    private String sharedBy;
+
     @Column(nullable = false)
     @Temporal(TemporalType.TIMESTAMP)
     @CreatedDate
@@ -74,6 +78,14 @@
     private org.apache.custos.sharing.persistance.model.Entity inheritedParent;
 
 
+    public String getSharedBy() {
+        return sharedBy;
+    }
+
+    public void setSharedBy(String sharedBy) {
+        this.sharedBy = sharedBy;
+    }
+
     public String getAssociatingId() {
         return associatingId;
     }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
index f6623fa..813482c 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/EntityRepository.java
@@ -28,6 +28,10 @@
 
     public List<Entity> findAllByExternalParentIdAndTenantId(String externalParentId, long tenantId);
 
+    public List<Entity> findAllByTenantId(long tenantId);
+
+
+
 
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepository.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepository.java
index 3ae32a8..421a2c0 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepository.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepository.java
@@ -27,5 +27,5 @@
 public interface SearchEntityRepository {
 
 
-    List<Entity> searchEntities(long tenantId, List<SearchCriteria> searchCriteria);
+    List<Entity> searchEntities(long tenantId, List<SearchCriteria> searchCriteria, int limit, int offset);
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepositoryImpl.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepositoryImpl.java
index e185861..7858038 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepositoryImpl.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SearchEntityRepositoryImpl.java
@@ -35,7 +35,7 @@
 import java.util.Map;
 
 @Repository
-public  class SearchEntityRepositoryImpl implements SearchEntityRepository {
+public class SearchEntityRepositoryImpl implements SearchEntityRepository {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SearchEntityRepositoryImpl.class);
 
@@ -43,11 +43,10 @@
     EntityManager entityManager;
 
     @Override
-    public List<Entity> searchEntities(long tenantId, List<SearchCriteria> searchCriteria) {
+    public List<Entity> searchEntities(long tenantId, List<SearchCriteria> searchCriteria, int limit, int offset) {
 
         Map<String, Object> valueMap = new HashMap<>();
-        String query = createSQLQuery(tenantId,searchCriteria, valueMap);
-
+        String query = createSQLQuery(tenantId, searchCriteria, valueMap, limit, offset);
 
 
         Query q = entityManager.createNativeQuery(query, Entity.class);
@@ -60,9 +59,11 @@
     }
 
 
-    private String createSQLQuery(long tenantId, List<SearchCriteria> searchCriteriaList, Map<String, Object> valueMap) {
+    private String createSQLQuery(long tenantId, List<SearchCriteria> searchCriteriaList, Map<String, Object> valueMap, int limit, int offset) {
 
         String query = "SELECT * FROM entity E WHERE ";
+        query = query + "E.tenant_id = :" + "TENANT_ID" + " AND ";
+        valueMap.put("TENANT_ID", tenantId);
 
         for (SearchCriteria searchCriteria : searchCriteriaList) {
 
@@ -110,7 +111,7 @@
                 } else {
                     query = query + "E.entity_type_id != :" + EntitySearchField.ENTITY_TYPE_ID.name() + " AND ";
                 }
-                valueMap.put(EntitySearchField.ENTITY_TYPE_ID.name(), searchCriteria.getValue()+"@"+tenantId);
+                valueMap.put(EntitySearchField.ENTITY_TYPE_ID.name(), searchCriteria.getValue() + "@" + tenantId);
             } else if (searchCriteria.getSearchField().equals(EntitySearchField.CREATED_AT)) {
                 if (searchCriteria.getCondition().equals(SearchCondition.GTE)) {
                     query = query + "E.created_at >= :" + EntitySearchField.CREATED_AT.name() + " AND ";
@@ -142,10 +143,16 @@
             }
 
         }
-        query = query.substring(0, query.length() - 5);
 
+        query = query.substring(0, query.length() - 5);
         query = query + " ORDER BY E.created_at DESC";
 
+        if (limit > 0) {
+            query = query + " LIMIT " + ":limit" + " OFFSET " + ":offset";
+            valueMap.put("limit", limit);
+            valueMap.put("offset", offset);
+        }
+
         return query;
     }
 
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SharingRepository.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SharingRepository.java
index 9fd258b..f2e7cd9 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SharingRepository.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/repository/SharingRepository.java
@@ -47,17 +47,28 @@
 
 
     @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.entity_id = ?2 " +
+            "and s.sharing_type IN ?3", nativeQuery = true)
+    public List<Sharing> findAllByEntityAndSharingType
+            (long tenantId, String entityId,  List<String> sharingTypes);
+
+
+    @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.entity_id = ?2 " +
             "and s.permission_type_id = ?3 and s.associating_id_type = ?4", nativeQuery = true)
     public List<Sharing> findAllByEntityAndPermissionTypeAndOwnerType
             (long tenantId, String entityId, String permissionTypeId, String associatingIdType);
 
     @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.entity_id = ?2 " +
+            " and s.associating_id_type = ?3", nativeQuery = true)
+    public List<Sharing> findAllByEntityAndOwnerType
+            (long tenantId, String entityId, String associatingIdType);
+
+
+    @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.entity_id = ?2 " +
             "and s.permission_type_id = ?3 and s.associating_id_type = ?4 and s.sharing_type IN ?5", nativeQuery = true)
     public List<Sharing> findAllByEntityAndPermissionTypeAndOwnerTypeAndSharingType
             (long tenantId, String entityId, String permissionTypeId, String associatingIdType, List<String> sharingList);
 
 
-
     @Transactional
     public List<Sharing> deleteAllByInheritedParentIdAndPermissionTypeIdAndTenantIdAndSharingTypeAndAssociatingId(
             String inheritedParentId, String permissionTypeId, long tenantId, String sharingType, String associatedId);
@@ -69,18 +80,16 @@
 
     @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.entity_id = ?2 " +
             "and s.permission_type_id IN ?3 and s.associating_id IN  ?4", nativeQuery = true)
-    public List<Sharing>  findAllSharingOfEntityForGroupsUnderPermissions(long tenantId, String entityId,
-                                                                          List<String> permissionTypes,
-                                                                          List<String> associatedIds);
+    public List<Sharing> findAllSharingOfEntityForGroupsUnderPermissions(long tenantId, String entityId,
+                                                                         List<String> permissionTypes,
+                                                                         List<String> associatedIds);
 
 
     @Query(value = "select * from sharing s where s.tenant_id = ?1 and s.associating_id IN  ?2 " +
             "and s.entity_id  IN ?3", nativeQuery = true)
-    public List<Sharing>  findAllSharingEntitiesForUsers(long tenantId,
-                                                                          List<String> associatedIds,
-                                                                          List<String> entityIds);
-
-
+    public List<Sharing> findAllSharingEntitiesForUsers(long tenantId,
+                                                        List<String> associatedIds,
+                                                        List<String> entityIds);
 
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
index 18f7b4f..60b7949 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/service/SharingService.java
@@ -35,6 +35,7 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -489,7 +490,8 @@
 
             if (optionalPermissionType.isPresent()) {
                 Sharing sharing = SharingMapper.createSharing(optionalPermissionType.get(),
-                        savedEntity, savedEntity, entity.getOwnerId(), Constants.USER, Constants.DIRECT_CASCADING, tenantId);
+                        savedEntity, savedEntity, entity.getOwnerId(), Constants.USER, Constants.DIRECT_CASCADING,
+                        entity.getOwnerId(), tenantId);
 
                 sharingRepository.save(sharing);
 
@@ -503,9 +505,11 @@
 
             List<String> sharingType = new ArrayList<>();
             sharingType.add(Constants.INDIRECT_CASCADING);
-            List<Sharing> sharings = sharingRepository.findAllByEntityAndSharingTypeAndPermissionType(tenantId,
-                    enModel.getId(),
-                    optionalPermissionType.get().getId(), sharingType);
+            sharingType.add(Constants.DIRECT_CASCADING);
+            sharingType.add(Constants.DIRECT_NON_CASCADING);
+
+            List<Sharing> sharings = sharingRepository.findAllByEntityAndSharingType(tenantId,
+                    enModel.getId(), sharingType);
 
 
             if (sharings != null && sharings.size() > 0) {
@@ -596,9 +600,11 @@
             }
             List<String> sharingType = new ArrayList<>();
             sharingType.add(Constants.INDIRECT_CASCADING);
+            sharingType.add(Constants.DIRECT_CASCADING);
+            sharingType.add(Constants.DIRECT_NON_CASCADING);
 
-            List<Sharing> sharings = sharingRepository.findAllByEntityAndSharingTypeAndPermissionType(tenantId,
-                    internalEntityId, optionalPermissionType.get().getId(), sharingType);
+            List<Sharing> sharings = sharingRepository.findAllByEntityAndSharingType(tenantId,
+                    internalEntityId, sharingType);
 
             if (sharings != null && sharings.size() > 0) {
                 newEntity.setSharedCount(sharings.size());
@@ -738,9 +744,10 @@
                     + request.getTenantId());
 
             long tenantId = request.getTenantId();
+            int limit = request.getLimit() == 0 ? -1 : request.getLimit();
 
             List<org.apache.custos.sharing.persistance.model.Entity> entities = entityRepository.
-                    searchEntities(tenantId, request.getSearchCriteriaList());
+                    searchEntities(tenantId, request.getSearchCriteriaList(), limit, request.getOffset());
 
             HashMap<String, org.apache.custos.sharing.service.Entity> entryMap = new HashMap<>();
 
@@ -786,17 +793,17 @@
         try {
             LOGGER.debug("Request received to getListOfSharedUsers " + request.getTenantId() + " for entity "
                     + request.getEntity().getId());
-
+            List<Sharing> sharings = null;
             long tenantId = request.getTenantId();
 
             String entityId = request.getEntity().getId();
 
             String internalEntityId = entityId + "@" + tenantId;
 
+
             String permisstionType = request.getPermissionType().getId();
 
             String internalPermissionTypeId = request.getPermissionType().getId() + "@" + tenantId;
-
             Optional<org.apache.custos.sharing.persistance.model.PermissionType> permissionType =
                     permissionTypeRepository.findById(internalPermissionTypeId);
 
@@ -819,7 +826,7 @@
 
             Optional<org.apache.custos.sharing.persistance.model.PermissionType> optionalPermissionType =
                     permissionTypeRepository.findByExternalIdAndTenantId(Constants.OWNER, tenantId);
-            List<Sharing> sharings = null;
+
             if (optionalPermissionType.get().equals(internalPermissionTypeId)) {
                 List<String> sharingList = new ArrayList<>();
                 sharingList.add(Constants.DIRECT_CASCADING);
@@ -835,6 +842,7 @@
                                 internalPermissionTypeId, Constants.USER);
 
             }
+
             org.apache.custos.sharing.service.SharedOwners owners = SharingMapper.getSharedOwners(sharings);
 
             responseObserver.onNext(owners);
@@ -921,6 +929,7 @@
             String entityId = request.getEntity().getId();
 
             String internalEntityId = entityId + "@" + tenantId;
+            List<Sharing> sharings = null;
 
             String permisstionType = request.getPermissionType().getId();
 
@@ -946,7 +955,7 @@
                 return;
             }
 
-            List<Sharing> sharings = sharingRepository.
+            sharings = sharingRepository.
                     findAllByEntityAndPermissionTypeAndOwnerType(tenantId, internalEntityId,
                             internalPermissionTypeId, Constants.GROUP);
 
@@ -1156,6 +1165,130 @@
     }
 
 
+    @Override
+    public void getAllDirectSharings(SharingRequest request, StreamObserver<GetAllDirectSharingsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to getAllEntities in " + request.getTenantId());
+            List<org.apache.custos.sharing.persistance.model.Entity> entities = entityRepository
+                    .findAllByTenantId(request.getTenantId());
+            List<org.apache.custos.sharing.persistance.model.PermissionType> permissionTypes =
+                    permissionTypeRepository.findAllByTenantId(request.getTenantId());
+            List<org.apache.custos.sharing.service.Entity> arrayList = new ArrayList<>();
+            List<SharingMetadata> sharingMetadata = new ArrayList<>();
+            entities.forEach(entity -> {
+                permissionTypes.forEach(perm -> {
+                    String permId = perm.getId();
+                    List<String> sharingList = new ArrayList<>();
+                    sharingList.add(Constants.DIRECT_CASCADING);
+                    sharingList.add(Constants.DIRECT_NON_CASCADING);
+
+                    List<Sharing> sharings = sharingRepository.
+                            findAllByEntityAndPermissionTypeAndOwnerTypeAndSharingType(request.getTenantId(), entity.getId(),
+                                    permId, Constants.USER, sharingList);
+                    sharings.forEach(shr -> {
+                        try {
+                            sharingMetadata.add(SharingMapper.getSharingMetadata(shr, entity, perm, Constants.USER));
+                        } catch (SQLException throwables) {
+                            String msg = "Error occurred while transforming entity" + entity.getId();
+                            LOGGER.error(msg);
+                        }
+                    });
+
+
+                    List<Sharing> sharingsGroups = sharingRepository.
+                            findAllByEntityAndPermissionTypeAndOwnerTypeAndSharingType(request.getTenantId(), entity.getId(),
+                                    permId, Constants.GROUP, sharingList);
+                    sharingsGroups.forEach(shr -> {
+                        try {
+                            sharingMetadata.add(SharingMapper.getSharingMetadata(shr, entity, perm, Constants.GROUP));
+                        } catch (SQLException throwables) {
+                            String msg = "Error occurred while transforming entity" + entity.getId();
+                            LOGGER.error(msg);
+                        }
+                    });
+                });
+
+            });
+            GetAllDirectSharingsResponse response = GetAllDirectSharingsResponse
+                    .newBuilder().addAllSharedData(sharingMetadata).build();
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while fetching all entities related to " + request.getTenantId();
+            LOGGER.error(msg);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+
+    }
+
+
+    @Override
+    public void getAllSharings(SharingRequest request, StreamObserver<GetAllSharingsResponse> responseObserver) {
+        try {
+            List<org.apache.custos.sharing.service.Entity> arrayList = new ArrayList<>();
+            List<org.apache.custos.sharing.persistance.model.Entity> entities = new ArrayList<>();
+            List<SharingMetadata> sharingMetadata = new ArrayList<>();
+            List<SharingMetadata> selectedList = new ArrayList<>();
+            if (request.hasEntity() && !request.getEntity().getId().isEmpty()) {
+                arrayList.add(request.getEntity());
+                String entityId = request.getEntity().getId() + "@" + request.getTenantId();
+                Optional<org.apache.custos.sharing.persistance.model.Entity> entityOptional = entityRepository.findById(entityId);
+                if (entityOptional.isEmpty()) {
+                    String msg = "Entity " + request.getEntity().getId() + " not found ";
+                    LOGGER.error(msg);
+                    responseObserver.onError(io.grpc.Status.NOT_FOUND.withDescription(msg).asRuntimeException());
+                    return;
+                }
+                entities.add(entityOptional.get());
+            } else {
+                entities = entityRepository
+                        .findAllByTenantId(request.getTenantId());
+            }
+            entities.forEach(entity -> {
+                List<Sharing> userSharings = sharingRepository.
+                        findAllByEntityAndOwnerType(request.getTenantId(), entity.getId(), Constants.USER);
+                List<Sharing> groupSharings = sharingRepository.
+                        findAllByEntityAndOwnerType(request.getTenantId(), entity.getId(), Constants.GROUP);
+                Optional<List<SharingMetadata>> optionalUserSharings = SharingMapper.getSharingMetadata(userSharings);
+                Optional<List<SharingMetadata>> optionalGroupSharings = SharingMapper.getSharingMetadata(groupSharings);
+                if (optionalUserSharings.isPresent()) {
+                    sharingMetadata.addAll(optionalUserSharings.get());
+                }
+                if (optionalGroupSharings.isPresent()) {
+                    sharingMetadata.addAll(optionalGroupSharings.get());
+                }
+
+            });
+
+            //TODO: replace with proper query
+            sharingMetadata.forEach(shr -> {
+                if (selectedList.isEmpty()) {
+                    selectedList.add(shr);
+                } else {
+                    new ArrayList<>(selectedList).forEach(selVar -> {
+                        if (!(shr.getEntity().getId().equals(selVar.getEntity().getId())
+                                && shr.getOwnerId().equals(selVar.getOwnerId()) &&
+                                shr.getPermission().getId().equals(selVar.getPermission().getId()))) {
+                            selectedList.add(shr);
+                        }
+                    });
+                }
+            });
+
+
+            GetAllSharingsResponse response = GetAllSharingsResponse
+                    .newBuilder().addAllSharedData(selectedList).build();
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while fetching all sharings " + request.getTenantId() + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
     private boolean addCascadingPermissionForEntity
             (org.apache.custos.sharing.persistance.model.Entity entity, String internalParentId, long tenantId) {
         List<String> newSharingTypes = new ArrayList<>();
@@ -1167,7 +1300,6 @@
 
         if (sharings != null && !sharings.isEmpty()) {
 
-            LOGGER.info("Sharing s found for entity with Id " + internalParentId);
             for (Sharing sharing : sharings) {
                 Sharing newShr = SharingMapper.getNewSharing(sharing, tenantId, entity);
                 newShr.setSharingType(Constants.INDIRECT_CASCADING);
@@ -1186,7 +1318,7 @@
                                                         org.apache.custos.sharing.persistance.model.PermissionType permissionType,
                                                         List<Sharing> sharings,
                                                         String ownerType,
-                                                        String sharingType) {
+                                                        String sharingType, String sharedBy) {
 
         List<org.apache.custos.sharing.persistance.model.Entity> entities =
                 entityRepository.findAllByExternalParentIdAndTenantId(entity.getExternalId(), tenantId);
@@ -1196,10 +1328,10 @@
             for (org.apache.custos.sharing.persistance.model.Entity child : entities) {
                 for (String userId : userIds) {
                     Sharing sharing = SharingMapper.createSharing(permissionType,
-                            child, inheritedEntity, userId, ownerType, sharingType, tenantId);
+                            child, inheritedEntity, userId, ownerType, sharingType, sharedBy, tenantId);
                     sharings.add(sharing);
                 }
-                getAllSharingForChildEntities(child, inheritedEntity, userIds, tenantId, permissionType, sharings, ownerType, sharingType);
+                getAllSharingForChildEntities(child, inheritedEntity, userIds, tenantId, permissionType, sharings, ownerType, sharingType, sharedBy);
 
             }
             return sharings;
@@ -1249,7 +1381,7 @@
         Optional<org.apache.custos.sharing.persistance.model.PermissionType> optionalOwnerPermissionType =
                 permissionTypeRepository.findByExternalIdAndTenantId(Constants.OWNER, tenantId);
 
-        if (optionalOwnerPermissionType.get().equals(internalPermissionId)) {
+        if (optionalOwnerPermissionType.get().getId().equals(internalPermissionId)) {
             String msg = "Owner permission type can not be assigned";
             LOGGER.error(msg);
             responseObserver.onError(io.grpc.Status.PERMISSION_DENIED.withDescription(msg).asRuntimeException());
@@ -1269,14 +1401,16 @@
         for (String userId : userIds) {
 
             Sharing sharing = SharingMapper.createSharing(optionalPermissionType.get(),
-                    entityOptional.get(), entityOptional.get(), userId, ownerType, sharingType, tenantId);
+                    entityOptional.get(), entityOptional.get(), userId, ownerType, sharingType, request.getSharedBy(),
+                    tenantId);
             sharings.add(sharing);
         }
 
         if (cascade) {
             List<Sharing> childSharings = new ArrayList<>();
             childSharings = getAllSharingForChildEntities(entityOptional.get(), entityOptional.get(), userIds, tenantId,
-                    optionalPermissionType.get(), childSharings, ownerType, Constants.INDIRECT_CASCADING);
+                    optionalPermissionType.get(), childSharings, ownerType,
+                    Constants.INDIRECT_CASCADING, request.getSharedBy());
             if (!childSharings.isEmpty()) {
                 sharings.addAll(childSharings);
             }
@@ -1295,22 +1429,48 @@
 
         }
 
-
         if (!effectiveSharings.isEmpty()) {
             sharingRepository.saveAll(effectiveSharings);
 
+            //revoke other permissions
+            for (String userId : userIds) {
+                List<org.apache.custos.sharing.persistance.model.PermissionType> existingPermissionTypes =
+                        permissionTypeRepository.findAllByTenantId(tenantId);
+
+                existingPermissionTypes.forEach(permission -> {
+                    if (!(permission.getExternalId().equals(Constants.OWNER) || permission.getId().equals(internalPermissionId))) {
+                        sharingRepository.
+                                deleteAllByEntityIdAndPermissionTypeIdAndAssociatingIdAndTenantIdAndInheritedParentId(
+                                        internalEntityId,
+                                        permission.getId(),
+                                        userId,
+                                        tenantId,
+                                        internalEntityId);
+                        sharingRepository.deleteAllByInheritedParentIdAndPermissionTypeIdAndTenantIdAndSharingTypeAndAssociatingId(
+                                internalEntityId,
+                                permission.getId(),
+                                tenantId,
+                                Constants.INDIRECT_CASCADING,
+                                userId);
+                    }
+                });
+            }
+
 
             List<String> checkTypes = new ArrayList<>();
             checkTypes.add(Constants.INDIRECT_CASCADING);
+            checkTypes.add(Constants.DIRECT_CASCADING);
+            checkTypes.add(Constants.DIRECT_NON_CASCADING);
 
-            List<Sharing> newSharings = sharingRepository.findAllByEntityAndSharingTypeAndPermissionType(tenantId,
-                    internalEntityId, optionalPermissionType.get().getId(), checkTypes);
+            List<Sharing> newSharings = sharingRepository.findAllByEntityAndSharingType(tenantId,
+                    internalEntityId, checkTypes);
             org.apache.custos.sharing.persistance.model.Entity entity = entityOptional.get();
             if (newSharings != null && newSharings.size() > 0) {
                 entity.setSharedCount(newSharings.size());
+                entityRepository.save(entity);
             }
 
-            entityRepository.save(entity);
+
         }
 
         org.apache.custos.sharing.service.Status status = org.apache.custos.sharing.service.Status
@@ -1320,7 +1480,6 @@
         responseObserver.onNext(status);
         responseObserver.onCompleted();
 
-
     }
 
     private void revokePermission(org.apache.custos.sharing.service.SharingRequest request,
@@ -1361,7 +1520,7 @@
         Optional<org.apache.custos.sharing.persistance.model.PermissionType> optionalOwnerPermissionType =
                 permissionTypeRepository.findByExternalIdAndTenantId(Constants.OWNER, tenantId);
 
-        if (optionalOwnerPermissionType.get().equals(internalPermissionType)) {
+        if (optionalOwnerPermissionType.get().getId().equals(internalPermissionType)) {
             String msg = "Owner permission type can not be assigned";
             LOGGER.error(msg);
             responseObserver.onError(io.grpc.Status.PERMISSION_DENIED.withDescription(msg).asRuntimeException());
@@ -1371,7 +1530,7 @@
 
         for (String userId : usersList) {
 
-            LOGGER.info("deleting " + userId + ":" + internalEntityId + ":" + internalPermissionType + ":" + tenantId);
+            LOGGER.debug("deleting " + userId + ":" + internalEntityId + ":" + internalPermissionType + ":" + tenantId);
             sharingRepository.
                     deleteAllByEntityIdAndPermissionTypeIdAndAssociatingIdAndTenantIdAndInheritedParentId(
                             internalEntityId,
@@ -1390,15 +1549,17 @@
 
         List<String> checkTypes = new ArrayList<>();
         checkTypes.add(Constants.INDIRECT_CASCADING);
+        checkTypes.add(Constants.DIRECT_CASCADING);
+        checkTypes.add(Constants.DIRECT_NON_CASCADING);
 
-        List<Sharing> newSharings = sharingRepository.findAllByEntityAndSharingTypeAndPermissionType(tenantId,
-                internalEntityId, optionalPermissionType.get().getId(), checkTypes);
+        List<Sharing> newSharings = sharingRepository.findAllByEntityAndSharingType(tenantId,
+                internalEntityId, checkTypes);
         org.apache.custos.sharing.persistance.model.Entity entity = entityOptional.get();
         if (newSharings != null && newSharings.size() > 0) {
             entity.setSharedCount(newSharings.size());
+            entityRepository.save(entity);
         }
 
-        entityRepository.save(entity);
 
         org.apache.custos.sharing.service.Status status = org.apache.custos.sharing.service.Status
                 .newBuilder()
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
index e5ea4aa..2d2276b 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/validator/InputValidator.java
@@ -23,11 +23,6 @@
 import org.apache.custos.core.services.commons.Validator;
 import org.apache.custos.core.services.commons.exceptions.MissingParameterException;
 import org.apache.custos.sharing.service.*;
-import org.apache.custos.sharing.service.EntityRequest;
-import org.apache.custos.sharing.service.EntityTypeRequest;
-import org.apache.custos.sharing.service.PermissionTypeRequest;
-import org.apache.custos.sharing.service.SearchRequest;
-import org.apache.custos.sharing.service.SharingRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,6 +93,10 @@
             case "userHasAccess":
                 validateCheckAccessRequest(obj, methodName);
                 break;
+            case "getAllDirectSharings":
+            case "getAllSharings":
+                validateGetAllDirectSharings(obj, methodName);
+                break;
             default:
                 throw new RuntimeException("Method not implemented");
         }
@@ -241,14 +240,6 @@
             if (entityRequest.getTenantId() == 0) {
                 throw new MissingParameterException("Tenant Id not found ", null);
             }
-
-            if (entityRequest.getSearchCriteriaList() == null) {
-                throw new MissingParameterException("Search Criteria  not found ", null);
-            }
-
-            if (entityRequest.getSearchCriteriaList().isEmpty()) {
-                throw new MissingParameterException("Search Criteria  not found ", null);
-            }
         } else {
             throw new RuntimeException("Unexpected input type for method " + methodName);
         }
@@ -271,13 +262,13 @@
                 throw new MissingParameterException("Entity id is  not found ", null);
             }
 
-            if (entityRequest.getPermissionType() == null) {
-                throw new MissingParameterException("Permission Type is  not found ", null);
-            }
-
-            if (entityRequest.getPermissionType().getId() == null || entityRequest.getPermissionType().getId().equals("")) {
-                throw new MissingParameterException("Permission Type Id is  not found ", null);
-            }
+//            if (entityRequest.getPermissionType() == null) {
+//                throw new MissingParameterException("Permission Type is  not found ", null);
+//            }
+//
+//            if (entityRequest.getPermissionType().getId() == null || entityRequest.getPermissionType().getId().equals("")) {
+//                throw new MissingParameterException("Permission Type Id is  not found ", null);
+//            }
 
 
         } else {
@@ -352,5 +343,18 @@
         return true;
     }
 
+    private boolean validateGetAllDirectSharings(Object object, String methodName) {
+        if (object instanceof SharingRequest) {
+            SharingRequest entityRequest = (SharingRequest) object;
+            if (entityRequest.getTenantId() == 0) {
+                throw new MissingParameterException("Tenant Id not found ", null);
+            }
+
+        } else {
+            throw new RuntimeException("Unexpected input type for method " + methodName);
+        }
+        return true;
+    }
+
 
 }
diff --git a/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto b/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
index fff95b9..c11f6ac 100644
--- a/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
+++ b/custos-core-services/sharing-core-service/src/main/proto/SharingService.proto
@@ -23,7 +23,7 @@
 option java_multiple_files = true;
 package org.apache.custos.sharing.service;
 
-
+option go_package = "./pb";
 enum SearchCondition {
     EQUAL = 0;
     LIKE = 1;
@@ -134,6 +134,7 @@
     repeated string owner_id = 5;
     bool cascade = 6;
     string client_sec = 7;
+    string shared_by = 8;
 }
 
 message SharesFilteringRequest {
@@ -164,6 +165,22 @@
     repeated string owner_ids = 1;
 }
 
+message GetAllDirectSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message GetAllSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message SharingMetadata {
+    Entity entity = 1;
+    string owner_id = 2;
+    string owner_type = 3;
+    PermissionType permission = 4;
+    string shared_by = 5;
+}
+
 service SharingService {
 
 
@@ -187,10 +204,13 @@
     rpc searchEntities (SearchRequest) returns (Entities);
 
 
+
     rpc getListOfSharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedUsers (SharingRequest) returns (SharedOwners);
     rpc getListOfSharedGroups (SharingRequest) returns (SharedOwners);
     rpc getListOfDirectlySharedGroups (SharingRequest) returns (SharedOwners);
+    rpc getAllDirectSharings (SharingRequest) returns (GetAllDirectSharingsResponse);
+    rpc getAllSharings (SharingRequest) returns (GetAllSharingsResponse);
 
     rpc shareEntityWithUsers (SharingRequest) returns (Status);
     rpc shareEntityWithGroups (SharingRequest) returns (Status);
@@ -199,6 +219,4 @@
     rpc userHasAccess (SharingRequest) returns (Status);
 
 
-
-
 }
\ No newline at end of file
diff --git a/custos-core-services/sharing-core-service/src/main/resources/application.properties b/custos-core-services/sharing-core-service/src/main/resources/application.properties
index bc2eb60..dd0d4b4 100644
--- a/custos-core-services/sharing-core-service/src/main/resources/application.properties
+++ b/custos-core-services/sharing-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_sharing?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_sharing?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,4 @@
 
 # Hibernate ddl auto (create, create-drop, validate, update)
 spring.jpa.hibernate.ddl-auto = update
-
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-core-services/tenant-profile-core-service/Dockerfile b/custos-core-services/tenant-profile-core-service/Dockerfile
index a2b1503..8007b96 100644
--- a/custos-core-services/tenant-profile-core-service/Dockerfile
+++ b/custos-core-services/tenant-profile-core-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-core-services/tenant-profile-core-service/pom.xml b/custos-core-services/tenant-profile-core-service/pom.xml
index 31efefc..3e9eca7 100644
--- a/custos-core-services/tenant-profile-core-service/pom.xml
+++ b/custos-core-services/tenant-profile-core-service/pom.xml
@@ -98,6 +98,7 @@
           <artifactId>persistence-api</artifactId>
       </dependency>
 
+
   </dependencies>
 
 
@@ -117,6 +118,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/custos-core-services/tenant-profile-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/tenant-profile-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/tenant-profile-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/mapper/TenantMapper.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/mapper/TenantMapper.java
index 5ab26af..a3b541c 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/mapper/TenantMapper.java
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/mapper/TenantMapper.java
@@ -53,7 +53,7 @@
         tenantEntity.setAdminLastName(tenant.getAdminLastName());
         tenantEntity.setAdminEmail(tenant.getAdminEmail());
         tenantEntity.setRequesterEmail(tenant.getRequesterEmail());
-        tenantEntity.setLogoURI(tenant.getClientUri());
+        tenantEntity.setLogoURI(tenant.getLogoUri());
         tenantEntity.setScope(tenant.getScope());
         tenantEntity.setDomain(tenant.getDomain());
         tenantEntity.setAdminUsername(tenant.getAdminUsername());
@@ -132,7 +132,7 @@
                 .setAdminFirstName(tenantEntity.getAdminFirstName())
                 .setAdminLastName(tenantEntity.getAdminLastName())
                 .setDomain(tenantEntity.getDomain())
-                .setClientUri(tenantEntity.getLogoURI())
+                .setClientUri(tenantEntity.getUri()==null?tenantEntity.getLogoURI():tenantEntity.getUri())
                 .setRequesterEmail(tenantEntity.getRequesterEmail())
                 .setScope(tenantEntity.getScope())
                 .addAllContacts(contactList)
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepository.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepository.java
new file mode 100644
index 0000000..586d73c
--- /dev/null
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepository.java
@@ -0,0 +1,31 @@
+/*
+ * 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.custos.tenant.profile.persistance.respository;
+
+
+import org.apache.custos.tenant.profile.persistance.model.Tenant;
+
+import java.util.List;
+
+public interface SearchTenantRepository {
+
+
+    List<Tenant> searchTenants(String requestEmail, String status, long parentId, int limit, int offset, String type);
+}
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepositoryImpl.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepositoryImpl.java
new file mode 100644
index 0000000..735bf52
--- /dev/null
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/SearchTenantRepositoryImpl.java
@@ -0,0 +1,103 @@
+/*
+ * 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.custos.tenant.profile.persistance.respository;
+
+import org.apache.custos.tenant.profile.persistance.model.Tenant;
+import org.apache.custos.tenant.profile.service.TenantStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class SearchTenantRepositoryImpl implements SearchTenantRepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SearchTenantRepositoryImpl.class);
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Override
+    public List<Tenant> searchTenants(String requestEmail, String status, long parentId, int limit, int offset, String type) {
+        Map<String, Object> valueMap = new HashMap<>();
+        String query = createSQLQuery(requestEmail, status, type, parentId, limit, offset, valueMap);
+
+        Query q = entityManager.createNativeQuery(query, Tenant.class);
+        for (String key : valueMap.keySet()) {
+            q.setParameter(key, valueMap.get(key));
+        }
+
+        return q.getResultList();
+    }
+
+
+    private String createSQLQuery(String requestEmail, String status, String type, long parentId, int limit, int offset,
+                                  Map<String, Object> valueMap) {
+        String query = "SELECT * FROM tenant E WHERE ";
+
+        if (requestEmail != null && !requestEmail.isEmpty()) {
+            query = query + "E.requester_email = :" + "requester_email" + " AND ";
+            valueMap.put("requester_email", requestEmail);
+
+        }
+
+        if (status != null  && !status.isEmpty()) {
+            query = query + "E.status LIKE :" + "status" + " AND ";
+            valueMap.put("status", status);
+
+        } else {
+            String defaultStatus = "'"+TenantStatus.REQUESTED.name()+ "'"+ "," +
+                    "'"+TenantStatus.ACTIVE.name()+"'" + "," + "'"+TenantStatus.DENIED.name()+"'";
+            query = query + "E.status IN (" + defaultStatus + ") AND ";
+        }
+
+        if (parentId > 0) {
+            query = query + "E.parent_id = :" + "parent_id" + " AND ";
+            valueMap.put("parent_id", parentId);
+
+        }
+
+        if (type != null && type.equals("ADMIN")) {
+            query = query + "E.parent_id = :" + "parent_id" + " AND ";
+            valueMap.put("parent_id", 0);
+        }
+
+        query = query.substring(0, query.length() - 5);
+
+        query = query + " ORDER BY E.created_at DESC";
+
+
+        if (limit > 0) {
+            query = query + " LIMIT " + ":limit" + " OFFSET " + ":offset";
+            valueMap.put("limit", limit);
+            valueMap.put("offset", offset);
+        }
+
+        return query;
+    }
+
+
+}
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/TenantRepository.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/TenantRepository.java
index 0f0a48b..c84a3d5 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/TenantRepository.java
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/persistance/respository/TenantRepository.java
@@ -25,10 +25,12 @@
 
 import java.util.List;
 
-public interface TenantRepository extends JpaRepository<Tenant, Long> {
+public interface TenantRepository extends JpaRepository<Tenant, Long>, SearchTenantRepository {
 
     public List<Tenant> findByRequesterEmail(String requesterEmail);
 
+    public List<Tenant> findByRequesterEmailAndStatus(String requesterEmail, String status);
+
     public List<Tenant> findByDomainAndName(String domain, String name);
 
     @Query(value = "select * from tenant t where t.status LIKE ?1 order by t.id limit ?2 offset ?3", nativeQuery = true)
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/service/TenantProfileService.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/service/TenantProfileService.java
index defb7a2..30c251a 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/service/TenantProfileService.java
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/service/TenantProfileService.java
@@ -125,12 +125,12 @@
 
             //Do not update the tenant status
 
-            if (tenantEntity.getParentId() > 0) {
-
-                tenantEntity.setStatus(exTenant.getStatus());
-            } else {
-                tenantEntity.setStatus(TenantStatus.REQUESTED.name());
-            }
+//            if (tenantEntity.getParentId() > 0) {
+//
+//                tenantEntity.setStatus(exTenant.getStatus());
+//            } else {
+//                tenantEntity.setStatus(TenantStatus.REQUESTED.name());
+//            }
 
             tenantEntity.setCreatedAt(exTenant.getCreatedAt());
 
@@ -164,30 +164,22 @@
 
             String status = null;
 
-            if (request.getStatus() != null && !request.getStatus().name().equals("")){
+            if (!request.getStatus().equals(TenantStatus.UNKNOWN)) {
                 status = request.getStatus().name();
             }
 
             int offset = request.getOffset();
             int limit = request.getLimit();
             long parentId = request.getParentId();
+            String tenantType = request.getType().name();
 
             String requesterEmail = request.getRequesterEmail();
 
             List<Tenant> tenants = null;
+            List<Tenant> total_tenants = null;
 
-            if (requesterEmail != null && !requesterEmail.equals("")) {
-              tenants = tenantRepository.findByRequesterEmail(requesterEmail);
-            } else if (status == null && parentId == 0) {
-                tenants = tenantRepository.getAllWithPaginate(limit,offset);
-            } else if (status != null && parentId == 0){
-                tenants = tenantRepository.findByStatusWithPaginate(status,limit,offset);
-            } else if (status == null && parentId > 0) {
-                tenants = tenantRepository.getAllChildTenantsWithPaginate(parentId,limit,offset);
-            } else if (status != null && parentId >0 ) {
-                tenants = tenantRepository.findChildTenantsByStatusWithPaginate(status,parentId,limit,offset);
-            }
-
+            tenants = tenantRepository.searchTenants(requesterEmail, status, parentId, limit, offset, tenantType);
+            total_tenants = tenantRepository.searchTenants(requesterEmail, status, parentId, -1, -1, tenantType);
 
             List<org.apache.custos.tenant.profile.service.Tenant> tenantList = new ArrayList<>();
 
@@ -196,7 +188,10 @@
                 tenantList.add(t);
             }
 
-            GetAllTenantsResponse response = GetAllTenantsResponse.newBuilder().addAllTenant(tenantList).build();
+            GetAllTenantsResponse response = GetAllTenantsResponse
+                    .newBuilder()
+                    .setTotalNumOfTenants(total_tenants.size())
+                    .addAllTenant(tenantList).build();
             responseObserver.onNext(response);
             responseObserver.onCompleted();
 
diff --git a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/validator/InputValidator.java b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/validator/InputValidator.java
index 2949b98..5e99319 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/validator/InputValidator.java
+++ b/custos-core-services/tenant-profile-core-service/src/main/java/org/apache/custos/tenant/profile/validator/InputValidator.java
@@ -156,10 +156,6 @@
                 throw new MissingParameterException(" Admin username should not be null", null);
             }
 
-            if (tenant.getAdminPassword() == null || tenant.getAdminPassword().trim() == "") {
-                throw new MissingParameterException(" Admin password should not be null", null);
-            }
-
             if (tenant.getRequesterEmail() == null || tenant.getRequesterEmail().trim() == "") {
                 throw new MissingParameterException("Tenant requester email  should not be null", null);
             }
diff --git a/custos-core-services/tenant-profile-core-service/src/main/proto/TenantProfileService.proto b/custos-core-services/tenant-profile-core-service/src/main/proto/TenantProfileService.proto
index af4f291..b84dbfe 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/proto/TenantProfileService.proto
+++ b/custos-core-services/tenant-profile-core-service/src/main/proto/TenantProfileService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.tenant.profile.service;
+option go_package = "./pb";
 
 message Tenant {
     int64 tenant_id = 1;
@@ -52,33 +53,40 @@
     string software_version = 27;
     int64 refesh_token_lifetime = 28;
     string client_id = 29;
+    string parent_client_id = 30;
 }
 
 enum TenantStatus {
-    REQUESTED = 0;
-    APPROVED = 1;
-    DENIED = 2;
-    CANCELLED = 3;
-    ACTIVE = 4;
-    DEACTIVATED = 5;
+    UNKNOWN = 0;
+    REQUESTED = 1;
+    APPROVED = 2;
+    DENIED = 3;
+    CANCELLED = 4;
+    ACTIVE = 5;
+    DEACTIVATED = 6;
+}
+
+enum TenantType {
+    UNSPECIFIED = 0;
+    ADMIN = 1;
 }
 
 message TenantAttributeUpdateMetadata {
-    string updatedAttribute = 1;
-    string updatedAttributeValue = 2;
-    string updatedBy = 3;
-    string updatedAt = 4;
+    string updated_attribute = 1;
+    string updated_attributeValue = 2;
+    string updated_by = 3;
+    string updated_at = 4;
 }
 
 message TenantStatusUpdateMetadata {
-    TenantStatus updatedStatus = 1;
-    string updatedBy = 2;
-    string updatedAt = 3;
+    TenantStatus updated_status = 1;
+    string updated_by = 2;
+    string updated_at = 3;
 }
 
 
 message AddTenantResponse {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 
@@ -88,7 +96,7 @@
 }
 
 message GetTenantRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message GetTenantResponse {
@@ -98,18 +106,19 @@
 
 message GetAllTenantsResponse {
     repeated Tenant tenant = 1;
+    int32 total_num_of_tenants =2;
 }
 
 message IsTenantExistRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message IsTenantExistResponse {
-    bool isExist = 1;
+    bool is_exist = 1;
 }
 
 message GetAllTenantsForUserRequest {
-    string requesterEmail = 1;
+    string requester_email = 1;
 }
 
 message GetAllTenantsForUserResponse {
@@ -119,19 +128,19 @@
 message UpdateStatusRequest {
     string client_id = 1;
     TenantStatus status = 2;
-    string updatedBy = 3;
-    int64 tenantId = 4;
+    string updated_by = 3;
+    int64 tenant_id = 4;
     bool super_tenant = 5;
-    string accessToken = 6;
+    string access_token = 6;
 }
 
 message UpdateStatusResponse {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     TenantStatus status = 2;
 }
 
 message GetAuditTrailRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message GetStatusUpdateAuditTrailResponse {
@@ -148,6 +157,8 @@
  int64 parent_id = 3;
  TenantStatus status = 4;
  string requester_email = 5;
+ string parent_client_id = 6;
+ TenantType type= 7;
 }
 
 service TenantProfileService {
diff --git a/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties b/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
index af475b5..6ec01c7 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_tenant?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_tenant?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -38,4 +38,4 @@
 
 # Hibernate ddl auto (create, create-drop, validate, update)
 spring.jpa.hibernate.ddl-auto = update
-
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-core-services/user-profile-core-service/pom.xml b/custos-core-services/user-profile-core-service/pom.xml
index 9aef334..02cdadd 100644
--- a/custos-core-services/user-profile-core-service/pom.xml
+++ b/custos-core-services/user-profile-core-service/pom.xml
@@ -96,6 +96,7 @@
             <artifactId>persistence-api</artifactId>
         </dependency>
 
+
     </dependencies>
 
 
@@ -115,6 +116,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-core-services/user-profile-core-service/src/main/helm/templates/deployment.yaml b/custos-core-services/user-profile-core-service/src/main/helm/templates/deployment.yaml
index 31e54a6..74401f2 100644
--- a/custos-core-services/user-profile-core-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/user-profile-core-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: 8080
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
index 2e13a1e..7851366 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/mapper/UserProfileMapper.java
@@ -76,8 +76,8 @@
 
 
             userProfile.getAttributesList().forEach(atr -> {
-                if (atr.getValueList() != null && !atr.getValueList().isEmpty()) {
-                    for (String value : atr.getValueList()) {
+                if (atr.getValuesList() != null && !atr.getValuesList().isEmpty()) {
+                    for (String value : atr.getValuesList()) {
                         UserAttribute userAttribute = new UserAttribute();
                         userAttribute.setKey(atr.getKey());
                         userAttribute.setValue(value);
@@ -167,7 +167,7 @@
                         .UserAttribute
                         .newBuilder()
                         .setKey(key)
-                        .addAllValue(atrMap.get(key))
+                        .addAllValues(atrMap.get(key))
                         .build();
                 attributeList.add(attribute);
             });
@@ -195,7 +195,7 @@
         }
 
         if (membershipType != null ) {
-            builder.setMembershipType(DefaultGroupMembershipTypes.valueOf(membershipType));
+            builder.setMembershipType(membershipType);
         }
 
         if (profileEntity.getType() == null) {
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupMembershipRepository.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupMembershipRepository.java
index 0220fd1..14e8f34 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupMembershipRepository.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupMembershipRepository.java
@@ -36,5 +36,7 @@
     public List<UserGroupMembership>
     findAllByGroupIdAndUserProfileIdAndUserGroupMembershipTypeId(String groupId, String userProfileId, String groupMembershipId);
 
+    public List<UserGroupMembership> findAllByGroupIdAndUserGroupMembershipTypeId(String id, String groupMembershipId);
+
 
 }
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupRepository.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupRepository.java
index d7a534c..1c03ae3 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupRepository.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/GroupRepository.java
@@ -24,8 +24,10 @@
 
 import java.util.List;
 
-public interface GroupRepository extends JpaRepository<Group, String> {
+public interface GroupRepository extends JpaRepository<Group, String>, SearchGroupsRepository {
 
 
     public List<Group> findByParentId(String s);
+
+    public List<Group> findAllByTenantId(long tenantId);
 }
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepository.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepository.java
new file mode 100644
index 0000000..d2a798b
--- /dev/null
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepository.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.custos.user.profile.persistance.repository;
+
+import org.apache.custos.user.profile.persistance.model.Group;
+
+import java.util.List;
+
+public interface SearchGroupsRepository {
+
+    List<Group> searchEntities(long tenantId, org.apache.custos.user.profile.service.Group group);
+}
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepositoryImpl.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepositoryImpl.java
new file mode 100644
index 0000000..3236250
--- /dev/null
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/persistance/repository/SearchGroupsRepositoryImpl.java
@@ -0,0 +1,113 @@
+/*
+ * 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.custos.user.profile.persistance.repository;
+
+import org.apache.custos.user.profile.persistance.model.Group;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class SearchGroupsRepositoryImpl implements SearchGroupsRepository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SearchGroupsRepositoryImpl.class);
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Override
+    public List<Group> searchEntities(long tenantId, org.apache.custos.user.profile.service.Group group) {
+        Map<String, Object> valueMap = new HashMap<>();
+        String query = createSQLQuery(tenantId, group, valueMap);
+
+
+        Query q = entityManager.createNativeQuery(query, Group.class);
+        for (String key : valueMap.keySet()) {
+            q.setParameter(key, valueMap.get(key));
+        }
+
+        return q.getResultList();
+    }
+
+    private String createSQLQuery(long tenantId, org.apache.custos.user.profile.service.Group group, Map<String, Object> valueMap) {
+
+        String query = "SELECT * FROM group_entity E WHERE ";
+
+        if (!group.getName().isBlank()) {
+
+            query = query + "E.name  LIKE :" + "name" + " AND ";
+
+            valueMap.put("name", group.getName());
+        }
+
+        if (!group.getDescription().isBlank()) {
+
+            query = query + "E.description LIKE :" + "description" + " AND ";
+
+            valueMap.put("description", group.getDescription());
+        }
+
+        if (!group.getId().isBlank()) {
+            query = query + "E.external_id = :" + "external_id" + " AND ";
+
+            valueMap.put("external_id", group.getId());
+        }
+
+
+        if (group.getCreatedTime() != 0) {
+
+            Date date = new Date(group.getCreatedTime());
+
+            query = query + "E.created_at >= :" + "created_at" + " AND ";
+
+            valueMap.put("created_at", date);
+        }
+
+        if (group.getLastModifiedTime() != 0) {
+            Date date = new Date(group.getLastModifiedTime());
+            query = query + "E.last_modified_at >= :" + "last_modified_at" + " AND ";
+
+            valueMap.put("last_modified_at", date);
+        }
+        if (tenantId != 0) {
+
+            query = query + "E.tenant_id = :" + "tenant_id" + " AND ";
+
+            valueMap.put("tenant_id", tenantId);
+        }
+
+
+        query = query.substring(0, query.length() - 5);
+
+        query = query + " ORDER BY E.created_at DESC";
+
+        return query;
+    }
+
+
+}
diff --git a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
index 16490e3..48c8c91 100644
--- a/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
+++ b/custos-core-services/user-profile-core-service/src/main/java/org/apache/custos/user/profile/service/UserProfileService.java
@@ -253,7 +253,7 @@
             responseObserver.onCompleted();
         } catch (Exception ex) {
             String msg = "Error occurred while fetching  user profile for tenant " + request.getTenantId();
-            LOGGER.error(msg);
+            LOGGER.error(msg, ex);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
 
@@ -272,7 +272,7 @@
             List<org.apache.custos.user.profile.service.UserProfile> userProfileList = new ArrayList<>();
             attributeList.forEach(atr -> {
 
-                List<String> values = atr.getValueList();
+                List<String> values = atr.getValuesList();
                 values.forEach(val -> {
                     List<UserProfile>
                             userAttributes = userAttributeRepository.findFilteredUserProfiles(atr.getKey(), val);
@@ -467,7 +467,7 @@
                 userGroupMembership.setUserGroupMembershipType(exist);
                 groupMembershipRepository.save(userGroupMembership);
 
-                Group exGroup = GroupMapper.createGroup(exOP.get(), ownerId);
+                Group exGroup = GroupMapper.createGroup(exOP.get(), userGroupMembership.getUserProfile().getUsername());
                 responseObserver.onNext(exGroup);
                 responseObserver.onCompleted();
             } else {
@@ -675,11 +675,17 @@
         try {
             LOGGER.debug("Request received to getAllGroups for " + request.getTenantId());
 
-            List<org.apache.custos.user.profile.persistance.model.Group> groups = groupRepository.findAll();
+            List<org.apache.custos.user.profile.persistance.model.Group> groups = groupRepository
+                    .searchEntities(request.getTenantId(), request.getGroup());
+            if (groups == null || groups.isEmpty()) {
+                groups = groupRepository.
+                        findAllByTenantId(request.getTenantId());
+
+            }
 
             List<Group> groupList = new ArrayList<>();
 
-            if (groups != null && groups.isEmpty()) {
+            if (groups != null && !groups.isEmpty()) {
                 for (org.apache.custos.user.profile.persistance.model.Group group : groups) {
 
                     List<UserGroupMembership> userGroupMemberships = groupMembershipRepository.findAllByGroupId(group.getId());
@@ -688,8 +694,10 @@
                     for (UserGroupMembership userGroupMembership : userGroupMemberships) {
                         if (userGroupMembership.getUserGroupMembershipType().getId().equals(DefaultGroupMembershipTypes.OWNER.name())) {
                             ownerId = userGroupMembership.getUserProfile().getUsername();
+                            break;
                         }
                     }
+
                     Group gr = GroupMapper.createGroup(group, ownerId);
 
                     groupList.add(gr);
@@ -700,9 +708,9 @@
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
-            String msg = "Error occurred while fetching groups for " + request.getTenantId() + "at "
-                    + request.getTenantId() + " reason :" + ex.getMessage();
-            LOGGER.error(msg);
+            String msg = "Error occurred while fetching groups of client " + request.getClientId() +
+                    " reason :" + ex;
+            LOGGER.error(msg,ex);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
@@ -732,7 +740,7 @@
 
 
                     String type = request.getType();
-                    if (type == null || type.trim().equals("")) {
+                    if (type == null || type.trim().isEmpty()) {
                         type = DefaultGroupMembershipTypes.MEMBER.name();
                     } else {
                         type = type.toUpperCase();
@@ -772,9 +780,9 @@
             }
 
         } catch (Exception ex) {
-            String msg = "Error occurred while fetching groups for " + request.getTenantId() + "at "
-                    + request.getTenantId() + " reason :" + ex.getMessage();
-            LOGGER.error(msg);
+            String msg = "Error occurred while add user to  group at  " + request.getTenantId() +
+                    " reason :" + ex;
+            LOGGER.error(msg,ex);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
@@ -795,6 +803,17 @@
             List<UserGroupMembership> memberships =
                     groupMembershipRepository.findAllByGroupIdAndUserProfileId(effectiveGroupId, userId);
 
+            List<UserGroupMembership> userGroupMemberships = groupMembershipRepository
+                    .findAllByGroupIdAndUserGroupMembershipTypeId(effectiveGroupId, DefaultGroupMembershipTypes.OWNER.name());
+
+            if (userGroupMemberships != null && userGroupMemberships.size() == 1 &&
+                    userGroupMemberships.get(0).getUserProfile().getUsername().equals(username)) {
+                String msg = "Default owner " + username + " cannot be removed from group " + group_id;
+                LOGGER.error(msg);
+                responseObserver.onError(Status.ABORTED.withDescription(msg).asRuntimeException());
+                return;
+            }
+
             if (memberships != null && !memberships.isEmpty()) {
 
                 memberships.forEach(membership -> {
@@ -808,9 +827,9 @@
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
-            String msg = "Error occurred while fetching groups for " + request.getTenantId() + "at "
-                    + request.getTenantId() + " reason :" + ex.getMessage();
-            LOGGER.error(msg);
+            String msg = "Error occurred while removing user from  in client " + request.getClientId() + " reason :"
+                    + ex;
+            LOGGER.error(msg,ex);
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
@@ -1286,6 +1305,17 @@
                 return;
             }
 
+            List<UserGroupMembership> userMemberships = groupMembershipRepository
+                    .findAllByGroupIdAndUserGroupMembershipTypeId(effectiveGroupId, DefaultGroupMembershipTypes.OWNER.name());
+
+            if (userMemberships != null && userMemberships.size() == 1 &&
+                    userMemberships.get(0).getUserProfile().getUsername().equals(username)) {
+                String msg = "Default owner " + username + " cannot be changed for group " + groupId;
+                LOGGER.error(msg);
+                responseObserver.onError(Status.ABORTED.withDescription(msg).asRuntimeException());
+                return;
+            }
+
             UserGroupMembership groupMembership = userGroupMemberships.get(0);
 
             UserGroupMembershipType groupMembershipType = groupMembership.getUserGroupMembershipType();
diff --git a/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto b/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
index d4c9c56..94711b1 100644
--- a/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
+++ b/custos-core-services/user-profile-core-service/src/main/proto/UserProfileService.proto
@@ -22,7 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.user.profile.service;
-
+option go_package = "./pb";
 
 enum UserStatus {
     ACTIVE = 0;
@@ -65,21 +65,21 @@
     repeated string realm_roles = 9;
     int64 last_modified_at = 10;
     UserTypes type = 11;
-    DefaultGroupMembershipTypes membership_type = 12;
+    string membership_type = 12;
 }
 
 message UserProfileRequest {
     int64 tenantId = 1;
     UserProfile profile = 2;
-    string performedBy = 3;
-    string clientId = 4;
+    string performed_by = 3;
+    string client_id = 4;
 }
 
 
 message UserAttribute {
     int64 id = 1;
     string key = 2;
-    repeated string value = 3;
+    repeated string values = 3;
 }
 
 
@@ -93,29 +93,31 @@
 }
 
 message UserProfileAttributeUpdateMetadata {
-    string updatedAttribute = 1;
-    string updatedAttributeValue = 2;
-    string updatedBy = 3;
-    string updatedAt = 4;
+    string updated_attribute = 1;
+    string updated_attribute_value = 2;
+    string updated_by = 3;
+    string updated_at = 4;
 }
 
 message UserProfileStatusUpdateMetadata {
-    UserStatus updatedStatus = 1;
-    string updatedBy = 2;
-    string updatedAt = 3;
+    UserStatus updated_status = 1;
+    string updated_by = 2;
+    string updated_at = 3;
 }
 
 message GetUpdateAuditTrailResponse {
-    repeated UserProfileAttributeUpdateMetadata attributeAudit = 1;
-    repeated UserProfileStatusUpdateMetadata statusAudit = 2;
+    repeated UserProfileAttributeUpdateMetadata attribute_audit = 1;
+    repeated UserProfileStatusUpdateMetadata status_audit = 2;
 }
 
 message GroupRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     Group group = 2;
-    string performedBy = 3;
-    string clientId = 4;
-    DefaultGroupMembershipTypes membership_type = 5;
+    string performed_by = 3;
+    string client_id = 4;
+    string membership_type = 5;
+    string id = 6;
+    string client_sec =7;
 
 }
 
@@ -142,15 +144,16 @@
 }
 
 message GroupMembership {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     string group_id = 2;
     string username = 3;
     string type = 4;
     string clientId = 5;
+    string clientSec = 6;
 }
 
 message GroupToGroupMembership {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     string parent_id = 2;
     string child_id = 3;
     string client_id = 4;
@@ -162,6 +165,8 @@
 
 message UserGroupMembershipTypeRequest {
     string type = 1;
+    int64 tenant_id = 2;
+    string client_id = 3;
 }
 
 
diff --git a/custos-core-services/user-profile-core-service/src/main/resources/application.properties b/custos-core-services/user-profile-core-service/src/main/resources/application.properties
index c045435..df908b8 100644
--- a/custos-core-services/user-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/user-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_user_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_user_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&createDatabaseIfNotExist=true
 spring.datasource.username = root
 spring.datasource.password = root
 
@@ -37,4 +37,5 @@
 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
 # Hibernate ddl auto (create, create-drop, validate, update)
-spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
+spring.jpa.hibernate.ddl-auto = update
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/pom.xml b/custos-core-services/utility-services/custos-configuration-service/pom.xml
index 6b0446d..82f4f9f 100644
--- a/custos-core-services/utility-services/custos-configuration-service/pom.xml
+++ b/custos-core-services/utility-services/custos-configuration-service/pom.xml
@@ -42,6 +42,7 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-config-server</artifactId>
         </dependency>
+
     </dependencies>
     <build>
         <plugins>
@@ -59,6 +60,29 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <target>
+                        <!-- keyfile+passphrase or  password, choose one -->
+                        <!--
+                        <scp localFile="${project.basedir}/target/qos-spark-1.0.jar"
+                          remoteToFile="root@192.168.203.156:/usr/sanss" verbose="true"
+                          keyfile="C:\Users\shengw\.ssh\192.168.203.156\id_rsa"
+                          passphrase="">
+                        </scp>
+                         -->
+                        <scp localFile="${project.basedir}/target/helm/${project.artifactId}-${project.version}.tgz"
+                             remoteToFile="ubuntu@${host}:/home/ubuntu/custos/artifacts"
+                             verbose="true"
+                             keyfile="/Users/isururanawaka/.ssh/custos/id_rsa"
+                             passphrase="isjarana" trust="true">
+                        </scp>
+                    </target>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/helm/templates/deployment.yaml b/custos-core-services/utility-services/custos-configuration-service/src/main/helm/templates/deployment.yaml
index a040bc0..b5440d0 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/helm/templates/deployment.yaml
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -42,9 +43,9 @@
             httpGet:
               path: /actuator/health
               port: 9000
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService-staging.properties
new file mode 100644
index 0000000..b49f9d6
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService-staging.properties
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+agent.profile.core.service.dns.name=agent-profile-core-service.custos.svc.cluster.local
+agent.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService.properties
index d83afa8..bf8d668 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/agentManagementService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -37,4 +37,6 @@
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
 resource.secret.service.port=7000
 user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
-user.profile.core.service.port=7000
\ No newline at end of file
+user.profile.core.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService-staging.properties
new file mode 100644
index 0000000..a6df68b
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService-staging.properties
@@ -0,0 +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.
+#
+custos.server.secret.name=tls-secret
+custos.server.kube.namespace=custos
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService.properties
index a6df68b..055c8fe 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/clusterManagementCoreService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticatedCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticatedCoreService.properties
new file mode 100644
index 0000000..f7d21d1
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticatedCoreService.properties
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+ciLogon.admin.client.id=${cilogon.dev.id}
+ciLogon.admin.client.secret=${cilogon.dev.sec}
+ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService-staging.properties
new file mode 100644
index 0000000..7649b0d
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService-staging.properties
@@ -0,0 +1,3 @@
+ciLogon.admin.client.id=${cilogon.staging.id}
+ciLogon.admin.client.secret=${cilogon.staging.sec}
+ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService.properties
deleted file mode 100644
index dac040a..0000000
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/federatedAuthenticationCoreService.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-ciLogon.admin.client.id=XXXXX
-ciLogon.admin.client.secret=XXXX
-ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService-staging.properties
new file mode 100644
index 0000000..f5ac6c2
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService-staging.properties
@@ -0,0 +1,38 @@
+#
+# 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.
+#
+
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService.properties
index 2993245..be9cca7 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/groupManagementService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -34,3 +34,5 @@
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
 resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService-staging.properties
new file mode 100644
index 0000000..c6d22a4
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService-staging.properties
@@ -0,0 +1,25 @@
+iam.server.client.id=admin-cli
+iam.server.truststore.path=/home/ubuntu/keystore/keycloak-client-truststore.pkcs12
+iam.server.truststore.password=keycloak
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+iam.server.admin.username=${iam.staging.username}
+iam.server.admin.password=${iam.staging.password}
+iam.server.super.admin.realm.id=master
+iam.federated.cilogon.authorization.endpoint=https://cilogon.org/authorize
+iam.federated.cilogon.token.endpoint=https://cilogon.org/oauth2/token
+iam.federated.cilogon.token.userinfo.endpoint=https://cilogon.org/oauth2/userinfo
+iam.federated.cilogon.issuer=https://cilogon.org
+iam.federated.cilogon.jwksUri=https://cilogon.org/oauth2/certs
+introspection.endpoint=https://service.staging.usecustos.org/identity-management/v1.0.0/token/introspect
+issuer=https://service.staging.usecustos.org/
+authorization.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/authorize
+token.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/token
+end.session.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/logout
+user.info.endpoint=https://service.staging.usecustos.org/apiserver/user-management/v1.0.0/userinfo
+jwks_uri=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/certs
+registration.endpoint=https://service.staging.usecustos.org/apiserver/tenant-management/v1.0.0/oauth2/tenant
+ciLogon.admin.client.id=${cilogon.staging.id}
+ciLogon.admin.client.secret=${cilogon.staging.sec}
+ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
+cluster.management.core.service.dns.name=cluster-management-core-service.keycloak.svc.cluster.local
+cluster.management.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService.properties
index 5f7b569..589bdc1 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/iamAdminCoreService.properties
@@ -1,9 +1,28 @@
+#
+# 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.
+#
+
 iam.server.client.id=admin-cli
 iam.server.truststore.path=/home/ubuntu/keystore/keycloak-client-truststore.pkcs12
 iam.server.truststore.password=keycloak
 iam.server.url=https://keycloak.custos.scigap.org:31000/auth/
-iam.server.admin.username=XXXXXX
-iam.server.admin.password=XXXXXX
+iam.server.admin.username=${iam.dev.username}
+iam.server.admin.password=${iam.dev.password}
 iam.server.super.admin.realm.id=master
 iam.federated.cilogon.authorization.endpoint=https://cilogon.org/authorize
 iam.federated.cilogon.token.endpoint=https://cilogon.org/oauth2/token
@@ -18,6 +37,8 @@
 user.info.endpoint=https://custos.scigap.org/apiserver/user-management/v1.0.0/userinfo
 jwks_uri=https://custos.scigap.org/apiserver/identity-management/v1.0.0/certs
 registration.endpoint=https://custos.scigap.org/apiserver/tenant-management/v1.0.0/oauth2/tenant
-ciLogon.admin.client.id=XXXXXXX
-ciLogon.admin.client.secret=XXXXXXXX
-ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
\ No newline at end of file
+ciLogon.admin.client.id=${cilogon.dev.id}
+ciLogon.admin.client.secret=${cilogon.dev.sec}
+ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
+cluster.management.core.service.dns.name=cluster-management-core-service.keycloak.svc.cluster.local
+cluster.management.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService-staging.properties
new file mode 100644
index 0000000..a3dc94a
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService-staging.properties
@@ -0,0 +1,46 @@
+#
+# 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.
+#
+
+custos.identity.auth.cache.enabled=true
+custos.identity.auth.cache.size=1024
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+iam.server.truststore.path=/home/ubuntu/keystore/keycloak-client-truststore.pkcs12
+iam.server.truststore.password=keycloak
+introspection.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/token/introspect
+issuer=https://custos.scigap.org/
+authorization.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/authorize
+token.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/token
+end.session.endpoint=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/logout
+user.info.endpoint=https://service.staging.usecustos.org/apiserver/user-management/v1.0.0/userinfo
+jwks_uri=https://service.staging.usecustos.org/apiserver/identity-management/v1.0.0/certs
+registration.endpoint=https://service.staging.usecustos.org/apiserver/tenant-management/v1.0.0/oauth2/tenant
+iam.server.client.id=admin-cli
+iam.server.admin.username=${iam.staging.username}
+iam.server.admin.password=${iam.staging.password}
+iam.server.super.admin.realm.id=master
+iam.federated.cilogon.authorization.endpoint=https://cilogon.org/authorize
+iam.federated.cilogon.token.endpoint=https://cilogon.org/oauth2/token
+iam.federated.cilogon.token.userinfo.endpoint=https://cilogon.org/oauth2/userinfo
+iam.federated.cilogon.issuer=https://cilogon.org
+iam.federated.cilogon.jwksUri=https://cilogon.org/oauth2/certs
+ciLogon.admin.client.id=${cilogon.staging.id}
+ciLogon.admin.client.secret=${cilogon.staging.sec}
+ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
+cluster.management.core.service.dns.name=cluster-management-core-service.keycloak.svc.cluster.local
+cluster.management.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService.properties
index 61f1cfb..a0ce104 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityCoreService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -31,14 +31,16 @@
 jwks_uri=https://custos.scigap.org/apiserver/identity-management/v1.0.0/certs
 registration.endpoint=https://custos.scigap.org:/apiserver/tenant-management/v1.0.0/oauth2/tenant
 iam.server.client.id=admin-cli
-iam.server.admin.username=XXXXXXX
-iam.server.admin.password=XXXXXXX
+iam.server.admin.username=${iam.dev.username}
+iam.server.admin.password=${iam.dev.password}
 iam.server.super.admin.realm.id=master
 iam.federated.cilogon.authorization.endpoint=https://cilogon.org/authorize
 iam.federated.cilogon.token.endpoint=https://cilogon.org/oauth2/token
 iam.federated.cilogon.token.userinfo.endpoint=https://cilogon.org/oauth2/userinfo
 iam.federated.cilogon.issuer=https://cilogon.org
 iam.federated.cilogon.jwksUri=https://cilogon.org/oauth2/certs
-ciLogon.admin.client.id=XXXXXXX
-ciLogon.admin.client.secret=XXXXXXXXX
+ciLogon.admin.client.id=${cilogon.dev.id}
+ciLogon.admin.client.secret=${cilogon.dev.sec}
 ciLogon.admin.auth.endpoint=https://test.cilogon.org/oauth2/oidc-cm
+cluster.management.core.service.dns.name=cluster-management-core-service.keycloak.svc.cluster.local
+cluster.management.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService-staging.properties
new file mode 100644
index 0000000..ad9bc71
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService-staging.properties
@@ -0,0 +1,38 @@
+#
+# 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.
+#
+
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService.properties
index d62acbc..e3c0333 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/identityManagementService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -33,4 +33,6 @@
 cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
-resource.secret.service.port=7000
\ No newline at end of file
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService-staging.properties
new file mode 100644
index 0000000..7f601c4
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService-staging.properties
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService.properties
index 11595f9..6391688 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/logManagementService.properties
@@ -35,4 +35,6 @@
 cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
-resource.secret.service.port=7000
\ No newline at end of file
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService-staging.properties
new file mode 100644
index 0000000..e20c32b
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService-staging.properties
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+
+core.messaging.service.broker.url=149.165.156.200:9092
+core.messaging.service.publisher.id=custosEventPublisher
+mail.smtp.auth=true
+mail.smtp.starttls.enable=true
+mail.smtp.host=smtp.gmail.com
+mail.smtp.port=587
+mail.smtp.ssl.trust=smtp.gmail.com
+mail.sender.username=custosemailagent@gmail.com
+mail.sender.password={{custos.email.password}}
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService.properties
new file mode 100644
index 0000000..ddd9d1b
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/messagingCoreService.properties
@@ -0,0 +1,30 @@
+#
+# 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.
+#
+
+core.messaging.service.broker.url=149.165.170.70:9092
+core.messaging.service.publisher.id=custosEventPublisher
+mail.smtp.auth=true
+mail.smtp.starttls.enable=true
+mail.smtp.host=smtp.gmail.com
+mail.smtp.port=587
+mail.smtp.ssl.trust=smtp.gmail.com
+mail.sender.username=custosemailagent@gmail.com
+mail.sender.password={{custos.email.password}}
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService-staging.properties
new file mode 100644
index 0000000..7ef9103
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService-staging.properties
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService.properties
index a6fe4f9..8cb95c5 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/resourceSecretManagementService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -36,3 +36,5 @@
 resource.secret.service.port=7000
 custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
 custos.logging.core.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService-staging.properties
new file mode 100644
index 0000000..a926847
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService-staging.properties
@@ -0,0 +1,38 @@
+#
+# 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.
+#
+
+scim.resource.user.endpoint=https://service.staging.usecustos.org/apiserver/scim/v2/Users
+scim.resource.group.endpoint=https://service.staging.usecustos.org/apiserver/scim/v2/Groups
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.server.url=https://service.staging.usecustos.org/apiserver/auth/
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService.properties
index 63fb825..08d3588 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/scimService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -31,4 +31,8 @@
 user.profile.core.service.port=7000
 iam.server.url=https://keycloak.custos.scigap.org:31000/auth/
 tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
-tenant.profile.core.service.port=7000
\ No newline at end of file
+tenant.profile.core.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService-staging.properties
new file mode 100644
index 0000000..84d4835
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService-staging.properties
@@ -0,0 +1,42 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied. See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+sharing.core.service.dns.name=sharing-core-service.custos.svc.cluster.local
+sharing.core.service.port=7000
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService.properties
index c966d3c..23b2910 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/sharingManagementService.properties
@@ -37,4 +37,6 @@
 cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
-resource.secret.service.port=7000
\ No newline at end of file
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService-staging.properties
new file mode 100644
index 0000000..bec2fc9
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService-staging.properties
@@ -0,0 +1,22 @@
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+federated.authentication.service.dns.name=federeted-authentication-core-service.custos.svc.cluster.local
+federated.authentication.service.port=7000
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+tenant.base.uri=https://service.staging.usecustos.org/apiserver/tenant-management/v1.0.0/oauth2/tenant
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService.properties
index afccf04..0f1c5df 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/tenantManagementService.properties
@@ -1,3 +1,22 @@
+#
+# 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.
+#
+
 tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
 tenant.profile.core.service.port=7000
 iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
@@ -16,4 +35,9 @@
 cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
-resource.secret.service.port=7000
\ No newline at end of file
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
+sharing.core.service.dns.name=sharing-core-service.custos.svc.cluster.local
+sharing.core.service.port=7000
+tenant.base.uri=https://custos.scigap.org/apiserver/tenant-management/v1.0.0/oauth2/tenant
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService-staging.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService-staging.properties
new file mode 100644
index 0000000..1d4ba4f
--- /dev/null
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService-staging.properties
@@ -0,0 +1,38 @@
+#
+# 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.
+#
+
+identity.service.dns.name=identity-core-service.custos.svc.cluster.local
+identity.service.port=7000
+tenant.profile.core.service.dns.name=tenant-profile-core-service.custos.svc.cluster.local
+tenant.profile.core.service.port=7000
+credential.store.service.dns.name=credential-store-core-service.custos.svc.cluster.local
+credential.store.service.port=7000
+user.profile.core.service.dns.name=user-profile-core-service.custos.svc.cluster.local
+user.profile.core.service.port=7000
+iam.admin.service.dns.name=iam-admin-core-service.custos.svc.cluster.local
+iam.admin.service.port=7000
+iam.server.url=https://service.staging.usecustos.org:30170/auth/
+custos.logging.core.service.dns.name=custos-logging.custos.svc.cluster.local
+custos.logging.core.service.port=7000
+cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
+cluster.management.core.service.port=7000
+resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService.properties b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService.properties
index 32adfca..06a9f09 100644
--- a/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService.properties
+++ b/custos-core-services/utility-services/custos-configuration-service/src/main/resources/userManagementService.properties
@@ -7,12 +7,12 @@
 # "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
+#  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
+#  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.
 #
@@ -33,4 +33,6 @@
 cluster.management.core.service.dns.name=cluster-management-core-service.custos.svc.cluster.local
 cluster.management.core.service.port=7000
 resource.secret.service.dns.name=resource-secret-core-service.custos.svc.cluster.local
-resource.secret.service.port=7000
\ No newline at end of file
+resource.secret.service.port=7000
+messaging.core.service.dns.name=custos-messaging-core-service.custos.svc.cluster.local
+messaging.core.service.port=7000
\ No newline at end of file
diff --git a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/messages/messages_en.properties b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/messages/messages_en.properties
new file mode 100644
index 0000000..1028c4b
--- /dev/null
+++ b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/messages/messages_en.properties
@@ -0,0 +1,55 @@
+emailVerificationSubject=Verify email
+emailVerificationBody=Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address\n\n{0}\n\nThis link will expire within {3}.\n\nIf you didn''t create this account, just ignore this message.
+emailVerificationBodyHtml=<p>Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address</p><p><a href="{0}">Link to e-mail address verification</a></p><p>This link will expire within {3}.</p><p>If you didn''t create this account, just ignore this message.</p>
+emailTestSubject=[KEYCLOAK] - SMTP test message
+emailTestBody=This is a test message
+emailTestBodyHtml=<p>This is a test message</p>
+identityProviderLinkSubject=Link your HTRC Analytics Account
+identityProviderLinkBody=It looks like you are trying to sign in to your HTRC Analytics account after a change your institution made to its authentication credentials. If this was you, click the link below to continue signing into your HTRC account.\n\n{3}\n\nThis link will expire within {5}.\n\nIf you don''t wish to sign into your account, just ignore this message.
+identityProviderLinkBodyHtml=<p>It looks like you are trying to sign in to your HTRC Analytics account after a change your institution made to its authentication credentials. If this was you, click the link below to continue signing into your HTRC account.</p><p><a href="{3}">Link to confirm this is you</a></p><p>This link will expire within {5}.</p><p>If you don''t wish to sign into your account, just ignore this message.</p>
+#identityProviderLinkBody=Someone wants to link your HTRC Analytics Account with the user account {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {5}.\n\nIf you don''t want to link account, just ignore this message.
+#identityProviderLinkBodyHtml=<p>Someone wants to link your <b>HTRC Analytics Account</b> account with the user account <b>{2}</b> . If this was you, click the link below to link accounts</p><p><a href="{3}">Link to confirm account linking</a></p><p>This link will expire within {5}.</p><p>If you don''t want to link account, just ignore this message.</p>
+#identityProviderLinkBody=Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {5}.\n\nIf you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.
+#identityProviderLinkBodyHtml=<p>Someone wants to link your <b>{1}</b> account with <b>{0}</b> account of user {2} . If this was you, click the link below to link accounts</p><p><a href="{3}">Link to confirm account linking</a></p><p>This link will expire within {5}.</p><p>If you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.</p>
+passwordResetSubject=Reset password
+passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {3}.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed.
+passwordResetBodyHtml=<p>Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.</p><p><a href="{0}">Link to reset credentials</a></p><p>This link will expire within {3}.</p><p>If you don''t want to reset your credentials, just ignore this message and nothing will be changed.</p>
+executeActionsSubject=Update Your Account
+executeActionsBody=Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {4}.\n\nIf you are unaware that your administrator has requested this, just ignore this message and nothing will be changed.
+executeActionsBodyHtml=<p>Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.</p><p><a href="{0}">Link to account update</a></p><p>This link will expire within {4}.</p><p>If you are unaware that your administrator has requested this, just ignore this message and nothing will be changed.</p>
+eventLoginErrorSubject=Login error
+eventLoginErrorBody=A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator.
+eventLoginErrorBodyHtml=<p>A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator.</p>
+eventRemoveTotpSubject=Remove OTP
+eventRemoveTotpBody=OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator.
+eventRemoveTotpBodyHtml=<p>OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator.</p>
+eventUpdatePasswordSubject=Update password
+eventUpdatePasswordBody=Your password was changed on {0} from {1}. If this was not you, please contact an administrator.
+eventUpdatePasswordBodyHtml=<p>Your password was changed on {0} from {1}. If this was not you, please contact an administrator.</p>
+eventUpdateTotpSubject=Update OTP
+eventUpdateTotpBody=OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator.
+eventUpdateTotpBodyHtml=<p>OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator.</p>
+
+requiredAction.CONFIGURE_TOTP=Configure OTP
+requiredAction.terms_and_conditions=Terms and Conditions
+requiredAction.UPDATE_PASSWORD=Update Password
+requiredAction.UPDATE_PROFILE=Update Profile
+requiredAction.VERIFY_EMAIL=Verify Email
+
+# units for link expiration timeout formatting
+linkExpirationFormatter.timePeriodUnit.seconds=seconds
+linkExpirationFormatter.timePeriodUnit.seconds.1=second
+linkExpirationFormatter.timePeriodUnit.minutes=minutes
+linkExpirationFormatter.timePeriodUnit.minutes.1=minute
+#for language which have more unit plural forms depending on the value (eg. Czech and other Slavic langs) you can override unit text for some other values like this: 
+#linkExpirationFormatter.timePeriodUnit.minutes.2=minuty
+#linkExpirationFormatter.timePeriodUnit.minutes.3=minuty
+#linkExpirationFormatter.timePeriodUnit.minutes.4=minuty
+linkExpirationFormatter.timePeriodUnit.hours=hours
+linkExpirationFormatter.timePeriodUnit.hours.1=hour
+linkExpirationFormatter.timePeriodUnit.days=days
+linkExpirationFormatter.timePeriodUnit.days.1=day
+
+emailVerificationBodyCode=Please verify your email address by entering in the following code.\n\n{0}\n\n.
+emailVerificationBodyCodeHtml=<p>Please verify your email address by entering in the following code.</p><p><b>{0}</b></p>
+
diff --git a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/theme.properties b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/theme.properties
new file mode 100644
index 0000000..e936822
--- /dev/null
+++ b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/email/theme.properties
@@ -0,0 +1,18 @@
+#
+# Copyright 2016 Red Hat, Inc. and/or its affiliates
+# and other contributors as indicated by the @author tags.
+#
+# Licensed 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.
+#
+
+parent=keycloak
diff --git a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-confirm.ftl b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-confirm.ftl
new file mode 100644
index 0000000..72432eb
--- /dev/null
+++ b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-confirm.ftl
@@ -0,0 +1,42 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+    <#if section = "header">
+    <#elseif section = "form">
+        <style>
+            #kc-idp-link {
+                position: relative;
+                z-index: 1;
+                background: #ffffff;
+                max-width: 460px;
+                margin: 0 auto 10px;
+                padding: 45px;
+                border-radius: 2px;
+                box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
+                color: #ff6f01;
+            }
+
+            #kc-idp-link-header > p {
+                font-weight: bold;
+                font-size: 1.4rem;
+                border-bottom: #dddddd 1px solid;
+                padding-bottom: 5px;
+            }
+        </style>
+        <div id="kc-idp-link">
+            <div id="kc-idp-link-header">
+                <p>
+                    Looks like you already have an account
+                </p>
+            </div>
+            <div id="kc-idp-link-message">
+                <p class="htrc-body-text">Your institution has made a change to their authentication credentials. Please click the button below to link the new credentials to your HTRC account.</p>
+                <form id="kc-register-form" action="${url.loginAction}" method="post">
+                <div class="${properties.kcFormGroupClass!}">
+                    <#--                <button type="submit" class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" name="submitAction" id="updateProfile" value="updateProfile">${msg("confirmLinkIdpReviewProfile")}</button>-->
+                    <button type="submit" class="htrc-btn-confirm" name="submitAction" id="linkAccount" value="linkAccount">Update Account</button>
+                </div>
+                </form>
+            </div>
+        </div>
+    </#if>
+</@layout.registrationLayout>
\ No newline at end of file
diff --git a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-email.ftl b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-email.ftl
new file mode 100644
index 0000000..dd4284c
--- /dev/null
+++ b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/login-idp-link-email.ftl
@@ -0,0 +1,45 @@
+<#import "template.ftl" as layout>
+<@layout.registrationLayout; section>
+    <style>
+        #kc-link-confirm {
+            position: relative;
+            z-index: 1;
+            background: #ffffff;
+            max-width: 460px;
+            margin: 0 auto 10px;
+            padding: 45px;
+            border-radius: 2px;
+            box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
+            color: #ff6f01;
+        }
+
+        #kc-link-confirm-header > p {
+            font-weight: bold;
+            font-size: 1.4rem;
+            border-bottom: #dddddd 1px solid;
+            padding-bottom: 5px;
+        }
+    </style>
+    <#if section = "header">
+<#--        ${msg("emailLinkIdpTitle", idpAlias)}-->
+    <#elseif section = "form">
+        <div id="kc-link-confirm">
+            <div id="kc-link-confirm-header">
+                <p>Link HTRC Analytics Account</p>
+            </div>
+
+            <p id="instruction1" class="htrc-body-text">
+                An email has been sent to the email address associated with your HTRC Analytics account.<br><br>
+                Follow the instructions in that email to link your institution's new authentication credentials to your HTRC account.
+                <#--            ${msg("emailLinkIdp1", idpAlias, brokerContext.username, realm.displayName)}-->
+            </p>
+
+            <p id="instruction2" class="htrc-body-text">
+                Haven't received a verification email? Click <a href="${url.loginAction}">here</a> to resend that email.
+            </p>
+        </div>
+<#--        <p id="instruction3" class="instruction">-->
+<#--            ${msg("emailLinkIdp4")} <a href="${url.loginAction}">${msg("doClickHere")}</a> ${msg("emailLinkIdp5")}-->
+<#--        </p>-->
+    </#if>
+</@layout.registrationLayout>
\ No newline at end of file
diff --git a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/resources/css/styles.css b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/resources/css/styles.css
index a5b4d70..8baee86 100644
--- a/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/resources/css/styles.css
+++ b/custos-external-services-distributions/custos-keycloak/src/main/resources/themes/htrc/login/resources/css/styles.css
@@ -25,6 +25,13 @@
   color: #ff6f01;
 }
 
+.htrc-body-text {
+  color: #333333;
+  font-family: "Roboto", sans-serif;
+  font-size: 16px;
+  line-height: 24px;
+}
+
 a {
   color: #ff6f01;
 }
@@ -121,7 +128,7 @@
   font-size: 14px;
 }
 
-.login-form > form > button {
+.login-form > form > button, .htrc-btn-confirm {
   font-family: "Roboto", sans-serif;
   text-transform: uppercase;
   outline: 0;
@@ -140,7 +147,7 @@
 
 .login-form > form > button:hover,
 .login-form > form > button:active,
-.login-form > form > button:focus {
+.login-form > form > button:focus, .htrc-btn-confirm:hover, .htrc-btn-confirm:active, .htrc-btn-confirm:focus {
   background: #ffb688;
 }
 
diff --git a/custos-federated-services-clients/pom.xml b/custos-federated-services-clients/pom.xml
index 9f415cc..724ea87 100644
--- a/custos-federated-services-clients/pom.xml
+++ b/custos-federated-services-clients/pom.xml
@@ -70,10 +70,21 @@
             <artifactId>resteasy-multipart-provider</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>cluster-management-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.json</groupId>
             <artifactId>json</artifactId>
             <version>20090211</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>cluster-management-core-service-client-stub</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
     <plugins>
diff --git a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
index e127c5a..ec6a4c3 100644
--- a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
+++ b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
@@ -19,29 +19,25 @@
 
 package org.apache.custos.federated.services.clients.keycloak;
 
-import org.apache.catalina.security.SecurityUtil;
+import org.apache.custos.cluster.management.client.ClusterManagementClient;
 import org.apache.custos.core.services.commons.util.Constants;
+import org.apache.custos.federated.services.clients.keycloak.auth.KeycloakAuthClient;
 import org.apache.http.HttpStatus;
-import org.jboss.resteasy.client.jaxrs.ResteasyClient;
-import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
 import org.keycloak.admin.client.Keycloak;
 import org.keycloak.admin.client.resource.*;
 import org.keycloak.representations.idm.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.core.Response;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.net.URI;
-import java.security.KeyStore;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -51,13 +47,15 @@
 public class KeycloakClient {
     private final static Logger LOGGER = LoggerFactory.getLogger(KeycloakClient.class);
 
-
     private final static int POOL_SIZE = 10;
 
     private final static int ACCESS_TOKEN_LIFE_SPAN = 1800;
 
     private final static int SESSION_IDLE_TIMEOUT = 3600;
 
+    @Autowired
+    private KeycloakAuthClient keycloakAuthClient;
+
     @Value("${iam.server.client.id:admin-cli}")
     private String clientId;
 
@@ -94,6 +92,12 @@
     @Value("${iam.federated.cilogon.jwksUri:https://cilogon.org/oauth2/certs}")
     private String jwksUri;
 
+    @Value("${spring.profiles.active}")
+    private String activeProfile;
+
+    @Autowired
+    private ClusterManagementClient clusterManagementClient;
+
     public void createRealm(String realmId, String displayName) {
         Keycloak client = null;
         try {
@@ -160,7 +164,8 @@
         }
     }
 
-    public boolean createRealmAdminAccount(String realmId, String adminUsername, String adminFirstname, String adminLastname, String adminEmail, String adminPassword) {
+    public boolean createRealmAdminAccount(String realmId, String adminUsername, String adminFirstname,
+                                           String adminLastname, String adminEmail, String adminPassword) {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
@@ -216,7 +221,8 @@
     }
 
 
-    public boolean updateRealmAdminAccount(String realmId, String adminUsername, String adminFirstname, String adminLastname, String adminEmail, String adminPassword) {
+    public boolean updateRealmAdminAccount(String realmId, String adminUsername, String adminFirstname,
+                                           String adminLastname, String adminEmail, String adminPassword) {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
@@ -259,7 +265,8 @@
 
                 String realmManagementClientId = getRealmManagementClientId(client, realmId);
 
-                retrievedUser.roles().clientLevel(realmManagementClientId).add(retrievedUser.roles().clientLevel(realmManagementClientId).listAvailable());
+                retrievedUser.roles().clientLevel(realmManagementClientId).
+                        add(retrievedUser.roles().clientLevel(realmManagementClientId).listAvailable());
                 return true;
 
             } else {
@@ -289,9 +296,11 @@
                 RoleResource adminRoleResource = client.realm(realmId).roles().get("admin");
                 retrievedUser.roles().realmLevel().remove(Arrays.asList(adminRoleResource.toRepresentation()));
                 String realmManagementClientId = getRealmManagementClientId(client, realmId);
-                List<RoleRepresentation> representations = retrievedUser.roles().clientLevel(realmManagementClientId).listEffective();
+                List<RoleRepresentation> representations = retrievedUser.roles().
+                        clientLevel(realmManagementClientId).listEffective();
 
-                retrievedUser.roles().clientLevel(realmManagementClientId).remove(retrievedUser.roles().clientLevel(realmManagementClientId).listEffective());
+                retrievedUser.roles().clientLevel(realmManagementClientId).
+                        remove(retrievedUser.roles().clientLevel(realmManagementClientId).listEffective());
                 return true;
 
             } else {
@@ -311,7 +320,8 @@
     }
 
 
-    public KeycloakClientSecret configureClient(String realmId, String clientName, @NotNull String tenantURL, List<String> redirectUris) {
+    public KeycloakClientSecret configureClient(String realmId, String clientName,
+                                                @NotNull String tenantURL, List<String> redirectUris) {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
@@ -356,13 +366,15 @@
             LOGGER.debug("Realm client configuration exited with code : " + httpResponse.getStatus() + " : " + httpResponse.getStatusInfo());
 
             // Add the manage-users role to the web client
-            UserRepresentation serviceAccountUserRepresentation = getUserByUsername(client, realmId, "service-account-" + pgaClient.getClientId());
+            UserRepresentation serviceAccountUserRepresentation =
+                    getUserByUsername(client, realmId, "service-account-" + pgaClient.getClientId());
             UserResource serviceAccountUser = client.realms().realm(realmId).users().get(serviceAccountUserRepresentation.getId());
             String realmManagementClientId = getRealmManagementClientId(client, realmId);
-            List<RoleRepresentation> manageUsersRole = serviceAccountUser.roles().clientLevel(realmManagementClientId).listAvailable()
-                    .stream()
-                    .filter(r -> r.getName().equals("manage-users"))
-                    .collect(Collectors.toList());
+            List<RoleRepresentation> manageUsersRole =
+                    serviceAccountUser.roles().clientLevel(realmManagementClientId).listAvailable()
+                            .stream()
+                            .filter(r -> r.getName().equals("manage-users"))
+                            .collect(Collectors.toList());
             serviceAccountUser.roles().clientLevel(realmManagementClientId).add(manageUsersRole);
 
             if (httpResponse.getStatus() == HttpStatus.SC_CREATED) {
@@ -388,7 +400,8 @@
     }
 
 
-    public KeycloakClientSecret updateClient(String realmId, String clientName, @NotNull String tenantURL, List<String> redirectUris) {
+    public KeycloakClientSecret updateClient(String realmId, String clientName,
+                                             @NotNull String tenantURL, List<String> redirectUris) {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
@@ -461,7 +474,8 @@
 
 
     public boolean createUser(String realmId, String username, String newPassword, String firstName,
-                              String lastName, String emailAddress, boolean tempPassowrd, String accessToken) throws UnauthorizedException {
+                              String lastName, String emailAddress,
+                              boolean tempPassowrd, String accessToken) throws UnauthorizedException {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, realmId, accessToken);
@@ -604,9 +618,26 @@
         }
     }
 
+    public UserRepresentation getUser(String realmId, String username) {
+        Keycloak client = null;
+        try {
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
+            return getUserByUsername(client, realmId, username);
+        } catch (Exception ex) {
+            String msg = "Error retrieving user, reason: " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            throw new RuntimeException(msg, ex);
+        } finally {
+            if (client != null) {
+                client.close();
+            }
+        }
+    }
+
 
     public List<UserRepresentation> getUsers(String accessToken, String realmId, int offset, int limit,
-                                             String username, String firstName, String lastName, String email, String search) {
+                                             String username, String firstName, String lastName,
+                                             String email, String search) {
         Keycloak client = null;
         try {
             client = getClient(iamServerURL, realmId, accessToken);
@@ -730,12 +761,12 @@
     }
 
 
-    public boolean addRolesToUsers(String accessToken, String realmId, List<String> users, List<String> roles, String clientId, boolean clientLevel) {
+    public boolean addRolesToUsers(String accessToken, String realmId, List<String> users,
+                                   List<String> roles, String clientId, boolean clientLevel) {
 
         Keycloak client = null;
         try {
-            client = getClient(iamServerURL, realmId, accessToken);
-
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
             for (String username : users) {
 
                 UserRepresentation representation = getUserByUsername(client, realmId, username.toLowerCase());
@@ -775,11 +806,12 @@
     }
 
 
-    public boolean removeRoleFromUser(String accessToken, String realmId, String username, List<String> roles, String clientId, boolean clientLevel) {
+    public boolean removeRoleFromUser(String accessToken, String realmId, String username,
+                                      List<String> roles, String clientId, boolean clientLevel) {
 
         Keycloak client = null;
         try {
-            client = getClient(iamServerURL, realmId, accessToken);
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
             UserRepresentation representation = getUserByUsername(client, realmId, username.toLowerCase());
 
             if (representation != null) {
@@ -835,6 +867,7 @@
         Keycloak client = null;
         try {
             // get client
+            LOGGER.info("IAM server URL "+ iamServerURL);
             client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
 
             RealmResource realmResource = client.realm(realmId);
@@ -1128,6 +1161,42 @@
         return true;
     }
 
+    /**
+     * Delete Roles in keycloak Realm or Client
+     *
+     * @param realmId
+     * @param clientScope if true add roles to client else to realm
+     * @return
+     */
+    public boolean deleteRole(String id, String realmId, String clientId, boolean clientScope) {
+        Keycloak client = null;
+        try {
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
+
+            RealmResource realmResource = client.realm(realmId);
+
+            if (clientScope) {
+                ClientRepresentation representation = realmResource.clients().findByClientId(clientId).get(0);
+                realmResource.clients().get(representation.getId()).roles().deleteRole(id);
+
+            } else {
+                realmResource.roles().deleteRole(id);
+
+            }
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while delete role" + id +
+                    " in Keycloak Server, reason: " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            throw new RuntimeException(msg, ex);
+        } finally {
+            if (client != null) {
+                client.close();
+            }
+        }
+        return true;
+    }
+
 
     /**
      * Provides all Roles belongs to client, if clientId not present, provides all
@@ -1252,8 +1321,8 @@
 
         } catch (Exception ex) {
             String msg = "Error occurred while pulling events, reason: " + ex.getMessage();
-            LOGGER.error(msg, ex);
-            throw new RuntimeException(msg, ex);
+            LOGGER.warn(msg, ex);
+            return null;
 
         } finally {
             if (client != null) {
@@ -1276,7 +1345,7 @@
 
         Keycloak client = null;
         try {
-            client = getClient(iamServerURL, realmId, accessToken);
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
 
             List<UserRepresentation> userResourceList = client.realm(realmId).users().search(
                     username.toLowerCase(), null, null, null, null, null);
@@ -1305,6 +1374,76 @@
 
     }
 
+
+    public boolean deleteExternalIDPLinks(String realmId) {
+
+        Keycloak client = null;
+        try {
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
+
+            RealmResource realmResource = client.realm(realmId);
+            List<UserRepresentation> userResourceList = client.realm(realmId).users().list();
+            userResourceList.forEach(user -> {
+                UserResource userResource = realmResource.users().get(user.getId());
+                List<FederatedIdentityRepresentation> federatedIdentityRepresentations =
+                        userResource.getFederatedIdentity();
+                if (federatedIdentityRepresentations != null && !federatedIdentityRepresentations.isEmpty()) {
+                    federatedIdentityRepresentations.forEach(fed -> {
+                        userResource.removeFederatedIdentity(fed.getIdentityProvider());
+                    });
+                }
+            });
+            return true;
+        } catch (Exception ex) {
+            String msg = "Error occurred while deleting external IDP links of realm "
+                    + realmId + ", reason " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            throw new RuntimeException(msg, ex);
+
+        } finally {
+            if (client != null) {
+                client.close();
+            }
+        }
+
+    }
+
+    public boolean deleteExternalIDPLinks(String realmId, List<String> users) {
+
+        Keycloak client = null;
+        try {
+            client = getClient(iamServerURL, superAdminRealmID, superAdminUserName, superAdminPassword);
+
+            RealmResource realmResource = client.realm(realmId);
+            List<UserRepresentation> userResourceList = client.realm(realmId).users().list();
+            userResourceList.forEach(user -> {
+                if (users.contains(user.getUsername())) {
+                    UserResource userResource = realmResource.users().get(user.getId());
+                    List<FederatedIdentityRepresentation> federatedIdentityRepresentations =
+                            userResource.getFederatedIdentity();
+                    if (federatedIdentityRepresentations != null && !federatedIdentityRepresentations.isEmpty()) {
+                        federatedIdentityRepresentations.forEach(fed -> {
+                            userResource.removeFederatedIdentity(fed.getIdentityProvider());
+                        });
+                    }
+                }
+            });
+            return true;
+        } catch (Exception ex) {
+            String msg = "Error occurred while deleting external IDP links of realm "
+                    + realmId + ", reason " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            throw new RuntimeException(msg, ex);
+
+        } finally {
+            if (client != null) {
+                client.close();
+            }
+        }
+
+    }
+
+
     /**
      * creates groups and child groups in Keycloak
      *
@@ -1736,61 +1875,18 @@
     }
 
 
-    private ResteasyClient getRestClient() {
-        return new ResteasyClientBuilder()
-                .connectionPoolSize(POOL_SIZE)
-                .trustStore(loadKeyStore())
-                .build();
-    }
+
 
     private Keycloak getClient(String adminUrl, String realm, String loginUsername, String password) {
 
         return KeycloakUtils.getClient(adminUrl, realm, loginUsername,
-                password, clientId, trustStorePath, truststorePassword);
+                password, clientId, trustStorePath, truststorePassword, activeProfile, clusterManagementClient);
     }
 
     private Keycloak getClient(String adminUrl, String realm, String accessToken) {
 
-        return KeycloakUtils.getClient(adminUrl, realm, accessToken, trustStorePath, truststorePassword);
-    }
-
-    private KeyStore loadKeyStore() {
-
-        InputStream is = null;
-        try {
-
-
-            File trustStoreFile = new File(trustStorePath);
-
-            if (trustStoreFile.exists()) {
-                LOGGER.debug("Loading trust store file from path " + trustStorePath);
-                is = new FileInputStream(trustStorePath);
-            } else {
-                LOGGER.debug("Trying to load trust store file form class path " + trustStorePath);
-                is = SecurityUtil.class.getClassLoader().getResourceAsStream(trustStorePath);
-                if (is != null) {
-                    LOGGER.debug("Trust store file was loaded form class path " + trustStorePath);
-                }
-            }
-
-            if (is == null) {
-                throw new RuntimeException("Could not find a trust store file in path " + trustStorePath);
-            }
-
-            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
-            ks.load(is, truststorePassword.toCharArray());
-            return ks;
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to load trust store KeyStore instance", e);
-        } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    LOGGER.error("Failed to close trust store FileInputStream", e);
-                }
-            }
-        }
+        return KeycloakUtils.getClient(adminUrl, realm, accessToken, trustStorePath, truststorePassword,
+                activeProfile, clusterManagementClient);
     }
 
 
@@ -1800,22 +1896,18 @@
         adminRole.setName("admin");
         adminRole.setDescription("Admin role for PGA users");
         defaultRoles.add(adminRole);
-        RoleRepresentation adminReadOnlyRole = new RoleRepresentation();
-        adminReadOnlyRole.setName("admin-read-only");
-        adminReadOnlyRole.setDescription("Read only role for PGA Admin users");
-        defaultRoles.add(adminReadOnlyRole);
-        RoleRepresentation gatewayUserRole = new RoleRepresentation();
-        gatewayUserRole.setName("gateway-user");
-        gatewayUserRole.setDescription("default role for PGA users");
-        defaultRoles.add(gatewayUserRole);
-        RoleRepresentation pendingUserRole = new RoleRepresentation();
-        pendingUserRole.setName("user-pending");
-        pendingUserRole.setDescription("role for newly registered PGA users");
-        defaultRoles.add(pendingUserRole);
-        RoleRepresentation gatewayProviderRole = new RoleRepresentation();
-        gatewayProviderRole.setName("gateway-provider");
-        gatewayProviderRole.setDescription("role for gateway providers in the super-admin PGA");
-        defaultRoles.add(gatewayProviderRole);
+//        RoleRepresentation gatewayUserRole = new RoleRepresentation();
+//        gatewayUserRole.setName("gateway-user");
+//        gatewayUserRole.setDescription("default role for PGA users");
+//        defaultRoles.add(gatewayUserRole);
+//        RoleRepresentation pendingUserRole = new RoleRepresentation();
+//        pendingUserRole.setName("user-pending");
+//        pendingUserRole.setDescription("role for newly registered PGA users");
+//        defaultRoles.add(pendingUserRole);
+//        RoleRepresentation gatewayProviderRole = new RoleRepresentation();
+//        gatewayProviderRole.setName("gateway-provider");
+//        gatewayProviderRole.setDescription("role for gateway providers in the super-admin PGA");
+//        defaultRoles.add(gatewayProviderRole);
         RolesRepresentation rolesRepresentation = new RolesRepresentation();
         rolesRepresentation.setRealm(defaultRoles);
         realmDetails.setRoles(rolesRepresentation);
@@ -1834,6 +1926,19 @@
         return realmManagementClientId;
     }
 
+    private Optional<String> getRealmManagementClientSecret(Keycloak client, String realmId) {
+        List<ClientRepresentation> realmClients = client.realm(realmId).clients().findAll();
+        String realmManagementClientId = null;
+        for (ClientRepresentation realmClient : realmClients) {
+            if (realmClient.getClientId().equals("realm-management")) {
+                realmManagementClientId = realmClient.getClientId();
+                String ClientUUID = client.realms().realm(realmId).clients().findByClientId(realmManagementClientId).get(0).getId();
+                return Optional.ofNullable(client.realms().realm(realmId).clients().get(ClientUUID).getSecret().getValue());
+            }
+        }
+        return Optional.empty();
+    }
+
 
     private UserRepresentation getUserByUsername(Keycloak client, String tenantId, String username) {
 
diff --git a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakUtils.java b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakUtils.java
index 723a6fb..88d26a4 100644
--- a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakUtils.java
+++ b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakUtils.java
@@ -20,6 +20,9 @@
 package org.apache.custos.federated.services.clients.keycloak;
 
 import org.apache.catalina.security.SecurityUtil;
+import org.apache.custos.cluster.management.client.ClusterManagementClient;
+import org.apache.custos.cluster.management.service.GetServerCertificateRequest;
+import org.apache.custos.cluster.management.service.GetServerCertificateResponse;
 import org.jboss.resteasy.client.jaxrs.ResteasyClient;
 import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
 import org.keycloak.admin.client.Keycloak;
@@ -35,7 +38,10 @@
 import java.security.KeyStore;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
+import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
+import java.util.concurrent.TimeUnit;
+import java.security.cert.CertificateFactory;
 
 public class KeycloakUtils {
 
@@ -44,20 +50,22 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(KeycloakUtils.class);
 
 
-    public static Keycloak getClient (String serverURL, String realm, String accessToken,
-                                      String trustStorePath, String trustorePassword) {
+    public static Keycloak getClient(String serverURL, String realm, String accessToken,
+                                     String trustStorePath, String trustorePassword, String profile,
+                                     ClusterManagementClient clusterManagementClient) {
 
         return KeycloakBuilder.builder()
                 .serverUrl(serverURL)
                 .realm(realm)
                 .authorization(accessToken)
-                .resteasyClient(getRestClient(trustStorePath,trustorePassword))
+                .resteasyClient(getRestClient(trustStorePath, trustorePassword, profile, clusterManagementClient))
                 .build();
     }
 
 
     public static Keycloak getClient(String serverURL, String realm, String loginUsername,
-                                     String password, String clientId, String trustStorePath, String trustorePassword) {
+                                     String password, String clientId, String trustStorePath, String trustorePassword, String profile,
+                                     ClusterManagementClient clusterManagementClient) {
 
         return KeycloakBuilder.builder()
                 .serverUrl(serverURL)
@@ -65,44 +73,68 @@
                 .username(loginUsername)
                 .password(password)
                 .clientId(clientId)
-                .resteasyClient(getRestClient(trustStorePath, trustorePassword))
+                .resteasyClient(getRestClient(trustStorePath, trustorePassword, profile, clusterManagementClient))
                 .build();
     }
 
 
-    private static ResteasyClient getRestClient(String trustorePath, String trustorePassword) {
+    private static ResteasyClient getRestClient(String trustorePath, String trustorePassword, String profile,
+                                                ClusterManagementClient clusterManagementClient) {
         return new ResteasyClientBuilder()
+                .establishConnectionTimeout(100, TimeUnit.SECONDS)
+                .socketTimeout(10, TimeUnit.SECONDS)
                 .connectionPoolSize(POOL_SIZE)
-                .trustStore(loadKeyStore(trustorePath, trustorePassword))
+                .trustStore(loadKeyStore(trustorePath, trustorePassword, profile, clusterManagementClient))
                 .build();
     }
 
 
-    private static KeyStore loadKeyStore(String trustStorePath, String trustorePassword) {
+    private static KeyStore loadKeyStore(String trustStorePath, String trustorePassword,
+                                         String profile, ClusterManagementClient clusterManagementClient) {
 
         InputStream is = null;
         try {
 
-
-            File trustStoreFile = new File(trustStorePath);
-
-            if (trustStoreFile.exists()) {
-                LOGGER.debug("Loading trust store file from path " + trustStorePath);
-                is = new FileInputStream(trustStorePath);
-            } else {
-                LOGGER.debug("Trying to load trust store file form class path " + trustStorePath);
-                is = SecurityUtil.class.getClassLoader().getResourceAsStream(trustStorePath);
-                if (is != null) {
-                    LOGGER.debug("Trust store file was loaded form class path " + trustStorePath);
-                }
-            }
-
-            if (is == null) {
-                throw new RuntimeException("Could not find a trust store file in path " + trustStorePath);
-            }
-
             KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
-            ks.load(is, trustorePassword.toCharArray());
+            LOGGER.info("Profile " + profile);
+            if (profile.equals("staging") || profile.equals("prod")) {
+                LOGGER.info("Profile inside  " + profile);
+                GetServerCertificateRequest getServerCertificateRequest = GetServerCertificateRequest
+                        .newBuilder()
+                        .setNamespace("keycloak")
+                        .setSecretName("tls-keycloak-secret")
+                        .build();
+                GetServerCertificateResponse response = clusterManagementClient.getCustosServerCertificate(getServerCertificateRequest);
+                CertificateFactory cf = CertificateFactory.getInstance("X.509");
+                LOGGER.info(response.getCertificate());
+                InputStream targetStream = new ByteArrayInputStream(response.getCertificate().getBytes());
+                Certificate certs = cf.generateCertificate(targetStream);
+                // Add the certificate
+                ks.load(null, null);
+                ks.setCertificateEntry("custos", certs);
+
+            } else {
+
+                File trustStoreFile = new File(trustStorePath);
+
+                if (trustStoreFile.exists()) {
+                    LOGGER.debug("Loading trust store file from path " + trustStorePath);
+                    is = new FileInputStream(trustStorePath);
+                } else {
+                    LOGGER.debug("Trying to load trust store file form class path " + trustStorePath);
+                    is = SecurityUtil.class.getClassLoader().getResourceAsStream(trustStorePath);
+                    if (is != null) {
+                        LOGGER.debug("Trust store file was loaded form class path " + trustStorePath);
+                    }
+                }
+
+                if (is == null) {
+                    throw new RuntimeException("Could not find a trust store file in path " + trustStorePath);
+                }
+
+
+                ks.load(is, trustorePassword.toCharArray());
+            }
             return ks;
         } catch (Exception e) {
             throw new RuntimeException("Failed to load trust store KeyStore instance", e);
@@ -118,9 +150,26 @@
     }
 
 
-    public static SSLContext initializeTrustStoreManager(String trustStorePath, String trustStorePassword) throws
+    public static SSLContext initializeTrustStoreManager(String trustStorePath, String trustStorePassword,
+                                                         String profile, ClusterManagementClient clusterManagementClient) throws
             IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, KeyManagementException {
 
+        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+        if (profile.equals("staging") || profile.equals("prod")) {
+            GetServerCertificateRequest getServerCertificateRequest = GetServerCertificateRequest
+                    .newBuilder()
+                    .setNamespace("keycloak")
+                    .setSecretName("tls-keycloak-secret")
+                    .build();
+            GetServerCertificateResponse response = clusterManagementClient.getCustosServerCertificate(getServerCertificateRequest);
+            CertificateFactory cf = CertificateFactory.getInstance("X.509");
+            InputStream targetStream = new ByteArrayInputStream(response.getCertificate().getBytes());
+            Certificate certs = cf.generateCertificate(targetStream);
+            trustStore.load(null, null);
+            trustStore.setCertificateEntry("custos", certs);
+
+
+        } else {
             File trustStoreFile = new File(trustStorePath);
             InputStream is;
             if (trustStoreFile.exists()) {
@@ -137,26 +186,24 @@
             if (is == null) {
                 throw new RuntimeException("Could not find a trust store file in path " + trustStorePath);
             }
-
-            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
-
             char[] trustPassword = trustStorePassword.toCharArray();
-
             trustStore.load(is, trustPassword);
+        }
 
-            // initialize a trust manager factory
-            TrustManagerFactory trustFactory =
-                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
-            trustFactory.init(trustStore);
 
-            // get the trust managers from the factory
-            TrustManager[] trustManagers = trustFactory.getTrustManagers();
+        // initialize a trust manager factory
+        TrustManagerFactory trustFactory =
+                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+        trustFactory.init(trustStore);
 
-            // initialize an ssl context to use these managers and set as default
-            SSLContext sslContext = SSLContext.getInstance("SSL");
-            sslContext.init(null, trustManagers, null);
-            SSLContext.setDefault(sslContext);
-            return sslContext;
+        // get the trust managers from the factory
+        TrustManager[] trustManagers = trustFactory.getTrustManagers();
+
+        // initialize an ssl context to use these managers and set as default
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        sslContext.init(null, trustManagers, null);
+        SSLContext.setDefault(sslContext);
+        return sslContext;
 
     }
 
diff --git a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/KeycloakAuthClient.java b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/KeycloakAuthClient.java
index 908f901..bc973d9 100644
--- a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/KeycloakAuthClient.java
+++ b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/KeycloakAuthClient.java
@@ -19,6 +19,7 @@
 
 package org.apache.custos.federated.services.clients.keycloak.auth;
 
+import org.apache.custos.cluster.management.client.ClusterManagementClient;
 import org.apache.custos.federated.services.clients.keycloak.KeycloakUtils;
 import org.apache.http.Consts;
 import org.apache.http.HttpHeaders;
@@ -41,6 +42,7 @@
 import org.keycloak.representations.AccessTokenResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
 import org.springframework.context.event.EventListener;
@@ -97,6 +99,12 @@
     @Value("${user.info.endpoint}")
     private String userInfoEndpoint;
 
+    @Value("${spring.profiles.active}")
+    private String activeProfile;
+
+    @Autowired
+    private ClusterManagementClient clusterManagementClient;
+
     private static final Logger LOGGER = LoggerFactory.getLogger(KeycloakAuthClient.class);
 
     public KeycloakAuthClient() {
@@ -108,7 +116,8 @@
             KeyStoreException, KeyManagementException, IOException {
         try {
             LOGGER.info("initializing security requirements");
-            KeycloakUtils.initializeTrustStoreManager(trustStorePath, trustStorePassword);
+            KeycloakUtils.initializeTrustStoreManager(trustStorePath, trustStorePassword,
+                    activeProfile, clusterManagementClient);
         } catch (Exception ex) {
             LOGGER.error("Keycloak Authclient initialization failed " + ex.getMessage());
             throw ex;
@@ -160,7 +169,7 @@
             }
             return true;
         } catch (Exception e) {
-            String msg = "Error occurred while checking if user: " + username + " is authorized in gateway: " + realmId;
+            String msg = "Error occurred while validating if user: " + username + " is authorized in gateway: " + realmId;
             LOGGER.error(msg, e);
             throw new RuntimeException(msg, e);
         }
@@ -323,15 +332,16 @@
         String userInfoEndPoint = openIdConnectConfig.getString("userinfo_endpoint");
         JSONObject userInfo = new JSONObject(getFromUrl(userInfoEndPoint, token));
         return new User(userInfo.getString("sub"),
-                userInfo.getString("name"),
-                userInfo.getString("given_name"),
-                userInfo.getString("family_name"),
-                userInfo.getString("email"),
+                userInfo.has("name") ? userInfo.getString("name") : "",
+                userInfo.has("given_name") ? userInfo.getString("given_name") : "",
+                userInfo.has("family_name") ? userInfo.getString("family_name") : "",
+                userInfo.has("email") ? userInfo.getString("email") : "",
                 userInfo.getString("preferred_username"));
     }
 
 
     private String getOpenIDConfigurationUrl(String realm) {
+        LOGGER.info("Connecting to "+ idpServerURL);
         return idpServerURL + "realms/" + realm + "/.well-known/openid-configuration";
     }
 
@@ -554,7 +564,4 @@
     }
 
 
-
-
-
 }
diff --git a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/User.java b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/User.java
index 9f27ded..3d1c54e 100644
--- a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/User.java
+++ b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/auth/User.java
@@ -33,7 +33,9 @@
 
     private String username;
 
-    public User(String sub, String fullName, String firstName, String lastName, String emailAddress, String username) {
+
+    public User(String sub, String fullName, String firstName, String lastName, String emailAddress,
+                String username) {
         this.sub = sub;
         this.fullName = fullName;
         this.firstName = firstName;
@@ -89,4 +91,5 @@
     public void setUsername(String username) {
         this.username = username;
     }
+
 }
diff --git a/custos-federated-services-clients/src/main/resources/keycloak-client-truststore.pkcs12 b/custos-federated-services-clients/src/main/resources/keycloak-client-truststore.pkcs12
deleted file mode 100644
index 6b84b0f..0000000
--- a/custos-federated-services-clients/src/main/resources/keycloak-client-truststore.pkcs12
+++ /dev/null
Binary files differ
diff --git a/custos-integration-core/pom.xml b/custos-integration-core/pom.xml
index a7f394c..7fb086d 100644
--- a/custos-integration-core/pom.xml
+++ b/custos-integration-core/pom.xml
@@ -56,6 +56,10 @@
             <groupId>io.grpc</groupId>
             <artifactId>grpc-netty</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.codahale</groupId>
+            <artifactId>shamir</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/InValidParameterException.java b/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/InValidParameterException.java
new file mode 100644
index 0000000..bfd8721
--- /dev/null
+++ b/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/InValidParameterException.java
@@ -0,0 +1,27 @@
+/*
+ * 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.custos.integration.core.exceptions;
+
+public class InValidParameterException extends RuntimeException {
+
+    public InValidParameterException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/NotAuthorizedException.java b/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/UnAuthorizedException.java
similarity index 85%
rename from custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/NotAuthorizedException.java
rename to custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/UnAuthorizedException.java
index f61b6cb..58cf1fe 100644
--- a/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/NotAuthorizedException.java
+++ b/custos-integration-core/src/main/java/org/apache/custos/integration/core/exceptions/UnAuthorizedException.java
@@ -20,11 +20,11 @@
 package org.apache.custos.integration.core.exceptions;
 
 /**
- * Not authorized exception
+ * Un authorized exception
  */
-public class NotAuthorizedException extends RuntimeException {
+public class UnAuthorizedException extends RuntimeException {
 
-    public NotAuthorizedException(String msg, Throwable e) {
+    public UnAuthorizedException(String msg, Throwable e) {
         super(msg, e);
     }
 }
diff --git a/custos-integration-core/src/main/java/org/apache/custos/integration/core/interceptor/ServiceInterceptor.java b/custos-integration-core/src/main/java/org/apache/custos/integration/core/interceptor/ServiceInterceptor.java
index 251044b..d3c34fc 100644
--- a/custos-integration-core/src/main/java/org/apache/custos/integration/core/interceptor/ServiceInterceptor.java
+++ b/custos-integration-core/src/main/java/org/apache/custos/integration/core/interceptor/ServiceInterceptor.java
@@ -21,7 +21,7 @@
 
 
 import io.grpc.*;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.core.utils.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,14 +67,14 @@
                         resp = interceptor.intercept(methodName, metadata, (resp == null) ? message : resp);
                     }
                     super.onMessage(resp);
-                } catch (NotAuthorizedException ex) {
+                } catch (UnAuthorizedException ex) {
                     String msg = "Error while authorizing method " + methodName + ", " + ex.getMessage();
                     LOGGER.error(msg);
-                    serverCall.close(Status.UNAUTHENTICATED.withDescription(msg), metadata);
+                    serverCall.close(Status.UNAUTHENTICATED.withDescription(msg), new Metadata());
                 } catch (Exception ex) {
                     String msg = "Error while validating method " + methodName + ", " + ex.getMessage();
                     LOGGER.error(msg, ex);
-                    serverCall.close(Status.INVALID_ARGUMENT.withDescription(msg), metadata);
+                    serverCall.close(Status.INVALID_ARGUMENT.withDescription(msg), new Metadata());
                 }
             }
 
diff --git a/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/Constants.java b/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/Constants.java
index c99745c..4a84459 100644
--- a/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/Constants.java
+++ b/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/Constants.java
@@ -28,6 +28,8 @@
 
     public static final String USER_TOKEN = "user-token";
 
+    public static final String AUTHENTICATE_AGENT = "authenticate-agent";
+
     public static final String TenantId = "tenant-id";
 
     public static final String X_FORWARDED_FOR = "x-forwarded-for";
diff --git a/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/ShamirSecretHandler.java b/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/ShamirSecretHandler.java
new file mode 100644
index 0000000..3ad2374
--- /dev/null
+++ b/custos-integration-core/src/main/java/org/apache/custos/integration/core/utils/ShamirSecretHandler.java
@@ -0,0 +1,72 @@
+/*
+ * 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.custos.integration.core.utils;
+
+import com.codahale.shamir.Scheme;
+import com.google.protobuf.ByteString;
+import org.apache.custos.integration.core.exceptions.InValidParameterException;
+
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ShamirSecretHandler {
+
+    public static Map<Integer, byte[]> splitSecret(String secret, int numOfsplits, int threshold) {
+
+        if (numOfsplits >= threshold) {
+            Scheme scheme = new Scheme(new SecureRandom(), numOfsplits, threshold);
+            byte[] secretArray = secret.getBytes(StandardCharsets.UTF_8);
+            final Map<Integer, byte[]> parts =  scheme.split(secretArray);
+            final Map<Integer, byte[]> selectedParts = new HashMap<>();
+            int count  = 1;
+            for (Integer integer : parts.keySet()){
+                selectedParts.put(integer, parts.get(integer));
+                count ++;
+                if (count == threshold){
+                    break;
+                }
+            }
+            return  selectedParts;
+        } else {
+            throw new
+                    InValidParameterException(
+                    "Cannot split message number of splits should be greater than threshold", null);
+        }
+    }
+
+
+    public static  String generateSecret(List<ByteString> byteStringList, int numOfsplits, int threshold) {
+        Scheme scheme = new Scheme(new SecureRandom(), numOfsplits, threshold);
+        Map<Integer, byte[]> selectedSplits = new HashMap<>();
+        AtomicInteger count = new AtomicInteger();
+        byteStringList.forEach(str-> {
+            selectedSplits.put(count.get(), str.toByteArray());
+            count.getAndIncrement();
+        });
+
+        final byte[] recovered = scheme.join(selectedSplits);
+        return new String(recovered, StandardCharsets.UTF_8);
+    }
+
+}
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/Dockerfile b/custos-integration-services/agent-management-service-parent/agent-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/Dockerfile
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/pom.xml b/custos-integration-services/agent-management-service-parent/agent-management-service/pom.xml
index fc0dfc2..611bd16 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/pom.xml
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/pom.xml
@@ -118,6 +118,7 @@
             <groupId>com.google.api.grpc</groupId>
             <artifactId>proto-google-common-protos</artifactId>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -136,6 +137,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/deployment.yaml
index a0957f6..668c290 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
         - name: {{ .Chart.Name }}-envoy-proxy
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress-grpc.yaml
index ebf2b9d..d253c1a 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
           - path: /org.apache.custos.agent.management.service.AgentManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress.yaml
index de53722..36d23f6 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /agent-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/values.yaml b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/values.yaml
index d83557d..630e08d 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/helm/values.yaml
@@ -82,4 +82,7 @@
 readinessProbe:
   initialDelaySeconds: 5
   periodSeconds: 1
-  successThreshold: 1
\ No newline at end of file
+  successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/ClientAuthInterceptorImpl.java
index 8a3adf1..3218e29 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/ClientAuthInterceptorImpl.java
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/ClientAuthInterceptorImpl.java
@@ -38,14 +38,15 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
 
     @Autowired
-    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient,
+                                     TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
         super(credentialStoreServiceClient, tenantProfileClient, identityClient);
     }
 
     @Override
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
 
-      return reqT;
+        return reqT;
     }
 
 }
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
index d1f2a4e..9bb051b 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
@@ -21,9 +21,8 @@
 
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.iam.service.GetAllResources;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
@@ -31,6 +30,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 @Component
 public class SuperTenantRestrictedOperationsInterceptorImpl extends AuthInterceptor {
 
@@ -49,15 +50,15 @@
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
 
         if (method.equals("synchronizeAgentDBs")) {
-            AuthClaim claim = null;
+            Optional<AuthClaim> claim = null;
             try {
                 claim = authorizeUsingUserToken(headers);
             } catch (Exception ex) {
                 LOGGER.error(" Authorizing error " + ex.getMessage());
-                throw new NotAuthorizedException("Request is not authorized", ex);
+                throw new UnAuthorizedException("Request is not authorized", ex);
             }
-            if (claim == null || !claim.isSuperTenant() || !claim.isAdmin()) {
-                throw new NotAuthorizedException("Request is not authorized", null);
+            if (claim == null || claim.isEmpty() || !claim.get().isSuperTenant() || !claim.get().isAdmin()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
             }
 
         }
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/UserAuthInterceptorImpl.java b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/UserAuthInterceptorImpl.java
index d7ece06..b93035d 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/UserAuthInterceptorImpl.java
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/interceptors/UserAuthInterceptorImpl.java
@@ -27,7 +27,7 @@
 import org.apache.custos.credential.store.service.Type;
 import org.apache.custos.iam.service.*;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
@@ -36,6 +36,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * Responsible for validate user specific authorization
  * Methods authenticates users access tokens are implemented here
@@ -55,12 +57,12 @@
     @Override
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
         String token = getToken(headers);
-        AuthClaim claim = authorizeUsingUserToken(headers);
-        long tenantId = claim.getTenantId();
+        Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
 
-        if (claim == null) {
-            throw new NotAuthorizedException("Request is not authorized", null);
+        if (claim.isEmpty()) {
+            throw new UnAuthorizedException("Request is not authorized", null);
         }
+        long tenantId = claim.get().getTenantId();
 
         if (!method.equals("enableAgents")) {
 
@@ -72,7 +74,7 @@
 
             CredentialMetadata metadata = this.credentialStoreServiceClient.getCredential(request);
             if (metadata == null || metadata.getId().equals("")) {
-                throw new NotAuthorizedException("Agent creation is not enabled", null);
+                throw new UnAuthorizedException("Agent creation is not enabled", null);
             }
 
         }
@@ -82,7 +84,7 @@
             return (ReqT) ((AgentClientMetadata) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
         } else if (method.equals("registerAndEnableAgent")) {
 
@@ -90,7 +92,8 @@
             return (ReqT) ((RegisterUserRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setClientId(claim.get().getCustosId())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("getAgent") || method.equals("deleteAgent") || method.equals("disableAgent") ||
@@ -100,7 +103,7 @@
             return (ReqT) ((AgentSearchRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("addAgentAttributes")) {
@@ -108,7 +111,7 @@
             return (ReqT) ((AddUserAttributesRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("deleteAgentAttributes")) {
@@ -116,7 +119,7 @@
             return (ReqT) ((DeleteUserAttributeRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("addRolesToAgent")) {
@@ -124,7 +127,7 @@
             return (ReqT) ((AddUserRolesRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("deleteRolesFromAgent")) {
@@ -132,7 +135,7 @@
             return (ReqT) ((DeleteUserRolesRequest) msg).toBuilder()
                     .setTenantId(tenantId)
                     .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
+                    .setPerformedBy(claim.get().getPerformedBy())
                     .build();
 
         } else if (method.equals("addProtocolMapper")) {
@@ -145,7 +148,7 @@
 
             CredentialMetadata metadata = this.credentialStoreServiceClient.getCredential(request);
             if (metadata == null || metadata.getId().equals("")) {
-                throw new NotAuthorizedException("Agent creation is not enabled", null);
+                throw new UnAuthorizedException("Agent creation is not enabled", null);
             }
 
             return (ReqT) ((AddProtocolMapperRequest) msg).toBuilder()
@@ -162,7 +165,7 @@
 
             CredentialMetadata metadata = this.credentialStoreServiceClient.getCredential(request);
             if (metadata == null || metadata.getId().equals("")) {
-                throw new NotAuthorizedException("Agent creation is not enabled", null);
+                throw new UnAuthorizedException("Agent creation is not enabled", null);
             }
 
             return (ReqT) ((AddRolesRequest) msg).toBuilder()
@@ -178,7 +181,7 @@
 
             CredentialMetadata metadata = this.credentialStoreServiceClient.getCredential(request);
             if (metadata == null || metadata.getId().equals("")) {
-                throw new NotAuthorizedException("Agent creation is not enabled", null);
+                throw new UnAuthorizedException("Agent creation is not enabled", null);
             }
 
             return (ReqT) ((GetAllResources) msg).toBuilder()
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/service/AgentManagementService.java b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/service/AgentManagementService.java
index 342bbbe..8c98c83 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/service/AgentManagementService.java
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/java/org/apache/custos/agent/management/service/AgentManagementService.java
@@ -71,6 +71,9 @@
 
     private static final String CUSTOS_REALM_AGENT = "custos-realm-agent";
 
+    public static final String AGENT_ID = "agent-id";
+    public static final String AGENT_PARENT_ID = "agent-parent-id";
+
 
     @Override
     public void enableAgents(AgentClientMetadata request, StreamObserver<OperationStatus> responseObserver) {
@@ -130,13 +133,35 @@
                 return;
             }
 
+
+            AddProtocolMapperRequest addProtocolMapperRequest = AddProtocolMapperRequest
+                    .newBuilder()
+                    .setAddToAccessToken(true)
+                    .setAddToIdToken(true)
+                    .setMapperType(MapperTypes.USER_ATTRIBUTE)
+                    .setClaimName(AGENT_ID)
+                    .setName(AGENT_ID)
+                    .setAttributeName(AGENT_ID)
+                    .setTenantId(request.getTenantId())
+                    .setClientId(setUpTenantResponse.getClientId())
+                    .build();
+
+            iamAdminServiceClient.addProtocolMapper(addProtocolMapperRequest);
+
+            addProtocolMapperRequest = addProtocolMapperRequest.toBuilder()
+                    .setClaimName(AGENT_PARENT_ID).setName(AGENT_PARENT_ID)
+                    .setAttributeName(AGENT_PARENT_ID).build();
+
+            iamAdminServiceClient.addProtocolMapper(addProtocolMapperRequest);
+
             CredentialMetadata metadata = CredentialMetadata.newBuilder().
                     setId(setUpTenantResponse.getClientId())
                     .setSecret(setUpTenantResponse.getClientSecret())
                     .setOwnerId(request.getTenantId())
                     .setType(Type.AGENT_CLIENT)
                     .build();
-            org.apache.custos.credential.store.service.OperationStatus status = credentialStoreServiceClient.putCredential(metadata);
+            org.apache.custos.credential.store.service.OperationStatus status =
+                    credentialStoreServiceClient.putCredential(metadata);
 
             OperationStatus operationStatus = OperationStatus.newBuilder().setStatus(status.getState()).build();
             responseObserver.onNext(operationStatus);
@@ -155,7 +180,8 @@
 
 
     @Override
-    public void registerAndEnableAgent(RegisterUserRequest request, StreamObserver<org.apache.custos.agent.management.service.AgentRegistrationResponse> responseObserver) {
+    public void registerAndEnableAgent(RegisterUserRequest request,
+                                       StreamObserver<org.apache.custos.agent.management.service.AgentRegistrationResponse> responseObserver) {
         try {
 
             LOGGER.debug("Request received to registerAndEnableAgent for tenant " + request.getTenantId() +
@@ -163,6 +189,7 @@
 
             UserSearchMetadata metadata = UserSearchMetadata.newBuilder().setId(request.getUser().getId()).build();
 
+
             UserSearchRequest userSearchRequest = UserSearchRequest.
                     newBuilder().setUser(metadata).
                     setTenantId(request.getTenantId())
@@ -194,7 +221,13 @@
 
                 UserAttribute attribute = UserAttribute.newBuilder()
                         .setKey(CUSTOS_REALM_AGENT).addValues("true").build();
+                UserAttribute agentId = UserAttribute.newBuilder()
+                        .setKey(AGENT_ID).addValues(request.getUser().getId()).build();
+                UserAttribute agentParentId = UserAttribute.newBuilder()
+                        .setKey(AGENT_PARENT_ID).addValues(request.getClientId()).build();
+                newAtrList.add(agentId);
                 newAtrList.add(attribute);
+                newAtrList.add(agentParentId);
                 representation = representation.toBuilder().addAllAttributes(newAtrList).build();
 
                 request = request.toBuilder().setUser(representation).setClientId(AGENT_CLIENT).build();
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/proto/AgentManagementService.proto b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/proto/AgentManagementService.proto
index 6dd59e6..12609e7 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/proto/AgentManagementService.proto
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/proto/AgentManagementService.proto
@@ -28,6 +28,8 @@
 import "google/protobuf/empty.proto";
 import "IamAdminService.proto";
 
+option go_package = "./pb";
+
 
 message AgentSearchRequest {
     int64 tenantId = 2;
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/application.properties b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/application.properties
index 46960c9..5020492 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/agent-management-service-parent/agent-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/custos-integration-services-commons/pom.xml b/custos-integration-services/custos-integration-services-commons/pom.xml
index bded007..80f3163 100644
--- a/custos-integration-services/custos-integration-services-commons/pom.xml
+++ b/custos-integration-services/custos-integration-services-commons/pom.xml
@@ -57,6 +57,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.custos</groupId>
+            <artifactId>messaging-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
             <artifactId>custos-logging-client-stub</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/AuthInterceptor.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/AuthInterceptor.java
index 94eab51..a8c24da 100644
--- a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/AuthInterceptor.java
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/AuthInterceptor.java
@@ -26,8 +26,8 @@
 import org.apache.custos.identity.service.AuthToken;
 import org.apache.custos.identity.service.Claim;
 import org.apache.custos.identity.service.GetUserManagementSATokenRequest;
-import org.apache.custos.identity.service.IsAuthenticateResponse;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.identity.service.IsAuthenticatedResponse;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.integration.core.utils.Constants;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
@@ -36,12 +36,14 @@
 import org.apache.custos.tenant.profile.service.GetTenantResponse;
 import org.apache.custos.tenant.profile.service.Tenant;
 import org.apache.custos.tenant.profile.service.TenantStatus;
-import org.apache.tomcat.util.bcel.Const;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Responsible for managing auth flow
@@ -58,27 +60,28 @@
     private IdentityClient identityClient;
 
 
-    public AuthInterceptor(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+    public AuthInterceptor(CredentialStoreServiceClient credentialStoreServiceClient,
+                           TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
         this.credentialStoreServiceClient = credentialStoreServiceClient;
         this.tenantProfileClient = tenantProfileClient;
         this.identityClient = identityClient;
     }
 
-    public AuthClaim authorize(Metadata headers) {
+    public Optional<AuthClaim> authorize(Metadata headers) {
         try {
             String formattedToken = getToken(headers);
 
             if (formattedToken == null) {
-                return null;
+                throw new UnAuthorizedException(" token not found ", null);
             }
             return authorize(formattedToken);
         } catch (Exception ex) {
-            throw new NotAuthorizedException("Wrong credentials " + ex.getMessage(), ex);
+            throw new UnAuthorizedException(" invalid token " + ex.getMessage(), ex);
         }
 
     }
 
-    public AuthClaim authorize(String formattedToken) {
+    public Optional<AuthClaim> authorize(String formattedToken) {
         try {
             TokenRequest request = TokenRequest
                     .newBuilder()
@@ -87,29 +90,29 @@
             GetAllCredentialsResponse response = credentialStoreServiceClient.getAllCredentialFromToken(request);
             return getAuthClaim(response);
         } catch (Exception ex) {
-            throw new NotAuthorizedException("Wrong credentials " + ex.getMessage(), ex);
+            throw new UnAuthorizedException(" invalid token " + ex.getMessage(), ex);
         }
 
     }
 
 
-    public AuthClaim authorizeUsingUserToken(Metadata headers) {
+    public Optional<AuthClaim> authorizeUsingUserToken(Metadata headers) {
 
         try {
             String formattedToken = getToken(headers);
 
             if (formattedToken == null) {
-                return null;
+                throw new UnAuthorizedException(" token not found ", null);
             }
 
             return authorizeUsingUserToken(formattedToken);
         } catch (Exception ex) {
-            throw new NotAuthorizedException("Wrong credentials " + ex.getMessage(), ex);
+            throw new UnAuthorizedException(" invalid token " + ex.getMessage(), ex);
         }
 
     }
 
-    public AuthClaim authorizeUsingUserToken(String formattedToken) {
+    public Optional<AuthClaim> authorizeUsingUserToken(String formattedToken) {
 
         try {
 
@@ -120,17 +123,17 @@
 
             GetAllCredentialsResponse response = credentialStoreServiceClient.getAllCredentialsFromJWTToken(request);
 
-            AuthClaim claim = getAuthClaim(response);
+            Optional<AuthClaim> claim = getAuthClaim(response);
 
-            if (claim != null) {
+            if (claim.isPresent()) {
 
                 Claim userNameClaim = Claim.newBuilder()
                         .setKey("username")
-                        .setValue(claim.getUsername()).build();
+                        .setValue(claim.get().getUsername()).build();
 
                 Claim tenantClaim = Claim.newBuilder()
                         .setKey("tenantId")
-                        .setValue(String.valueOf(claim.getTenantId()))
+                        .setValue(String.valueOf(claim.get().getTenantId()))
                         .build();
 
 
@@ -144,28 +147,29 @@
                         .addAllClaims(claimList)
                         .build();
 
-
-                IsAuthenticateResponse isAuthenticateResponse = identityClient.isAuthenticated(token);
+                IsAuthenticatedResponse isAuthenticateResponse = identityClient.isAuthenticated(token);
                 if (isAuthenticateResponse.getAuthenticated()) {
                     return claim;
+                } else {
+                    throw new UnAuthorizedException(" expired user token ", null);
                 }
+            } else {
+                throw new UnAuthorizedException(" expired user token ", null);
             }
-
-            return null;
         } catch (Exception ex) {
-            throw new NotAuthorizedException("Wrong credentials " + ex.getMessage(), ex);
+            throw new UnAuthorizedException(ex.getMessage(), ex);
         }
 
     }
 
 
-    public AuthClaim authorizeUsingAgentBasicToken(Metadata headers, String parentId) {
+    public Optional<AuthClaim> authorizeUsingAgentBasicToken(Metadata headers, String parentId) {
 
         try {
             String formattedToken = getToken(headers);
 
             if (formattedToken == null) {
-                return null;
+                throw new UnAuthorizedException(" token not found ", null);
             }
 
             TokenRequest request = TokenRequest
@@ -179,12 +183,105 @@
             return getAuthClaim(response);
 
         } catch (Exception ex) {
-            throw new NotAuthorizedException("Wrong credentials " + ex.getMessage(), ex);
+            throw new UnAuthorizedException(" invalid token " + ex.getMessage(), ex);
         }
 
     }
 
 
+    public Optional<AuthClaim> authorizeUsingAgentAndUserJWTTokens(Metadata headers) {
+        try {
+
+            String agentToken = getToken(headers);
+            TokenRequest request = TokenRequest
+                    .newBuilder()
+                    .setToken(agentToken)
+                    .build();
+
+            GetAllCredentialsResponse response = credentialStoreServiceClient.getCredentialByAgentJWTToken(request);
+
+            AtomicLong agentTenantId = new AtomicLong();
+            AtomicReference<String> agentId = new AtomicReference<>();
+            response.getSecretListList().forEach(sec -> {
+                if (sec.getType() == Type.AGENT) {
+                    agentTenantId.set(sec.getOwnerId());
+                    agentId.set(sec.getId());
+                }
+            });
+
+            Claim userNameClaim = Claim.newBuilder()
+                    .setKey("username")
+                    .setValue(agentId.get().toLowerCase()).build();
+
+            Claim tenantClaim = Claim.newBuilder()
+                    .setKey("tenantId")
+                    .setValue(String.valueOf(agentTenantId.get()))
+                    .build();
+
+
+            List<Claim> claimList = new ArrayList<>();
+            claimList.add(userNameClaim);
+            claimList.add(tenantClaim);
+
+
+            AuthToken token = AuthToken.newBuilder().
+                    setAccessToken(agentToken)
+                    .addAllClaims(claimList)
+                    .build();
+
+
+            IsAuthenticatedResponse isAuthenticateResponse = identityClient.isAuthenticated(token);
+            if (isAuthenticateResponse.getAuthenticated()) {
+
+                Optional<String> userToken = getUserTokenFromUserTokenHeader(headers);
+                if (userToken.isPresent()) {
+                    Optional<AuthClaim> claim = authorizeUsingUserToken(userToken.get());
+                    if (claim.isPresent() && validateParentChildTenantRelationShip(agentTenantId.get(),
+                            claim.get().getTenantId())) {
+                        return claim;
+                    } else {
+                        throw new UnAuthorizedException("Agent" + agentId.get() + "" +
+                                "  is not authorized to access resources on behalf of tenant ", null);
+                    }
+                } else {
+                    throw new UnAuthorizedException("Agent" + agentId.get() + "" +
+                            "  is not authorized to access resources on behalf of  user: user token not found ", null);
+                }
+            } else {
+                throw new UnAuthorizedException("Agent" + agentId.get() + "" +
+                        "  is not authorized ", null);
+            }
+
+        } catch (Exception ex) {
+            throw new UnAuthorizedException(" invalid token " + ex.getMessage(), ex);
+        }
+
+    }
+
+
+    public boolean isValidAgentJWTToken(Metadata headers) {
+
+        try {
+            String formattedToken = getToken(headers);
+
+            if (formattedToken == null) {
+                return false;
+            }
+            TokenRequest request = TokenRequest
+                    .newBuilder()
+                    .setToken(formattedToken)
+                    .build();
+
+            OperationStatus status = credentialStoreServiceClient.validateAgentJWTToken(request);
+
+            return status.getState();
+
+        } catch (Exception ex) {
+            return false;
+        }
+
+    }
+
     public String getToken(Metadata headers) {
         String tokenWithBearer = headers.get(Metadata.Key.of("authorization", Metadata.ASCII_STRING_MARSHALLER));
         if (tokenWithBearer == null) {
@@ -206,14 +303,10 @@
      * @param childClientId childTenant Headers
      * @return AuthClaim of child tenant
      */
-    public AuthClaim authorizeWithParentChildTenantValidationByBasicAuth(Metadata headers, String childClientId) {
-        AuthClaim authClaim = authorize(headers);
+    public Optional<AuthClaim> authorizeParentChildTenantValidationWithBasicAuth(Metadata headers, String childClientId) {
+        Optional<AuthClaim> authClaim = authorize(headers);
 
-        if (authClaim == null) {
-            return null;
-        }
-
-        if (childClientId == null || childClientId.trim().equals("")) {
+        if (authClaim.isEmpty() || childClientId == null || childClientId.isEmpty()) {
             return authClaim;
         }
 
@@ -225,28 +318,18 @@
         CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
 
 
-        GetCredentialRequest credentialRequest = GetCredentialRequest
+        GetAllCredentialsRequest credentialRequest = GetAllCredentialsRequest
                 .newBuilder()
                 .setOwnerId(metadata.getOwnerId())
-                .setType(Type.IAM).build();
+                .build();
 
-        CredentialMetadata iamCredentials = credentialStoreServiceClient.getCredential(credentialRequest);
+        GetAllCredentialsResponse allCredentials = credentialStoreServiceClient.getAllCredentials(credentialRequest);
 
-        AuthClaim childClaim = getAuthClaim(metadata);
+        Optional<AuthClaim> childClaim = getAuthClaim(allCredentials);
 
-        childClaim.setIamAuthSecret(iamCredentials.getSecret());
-        childClaim.setIamAuthId(iamCredentials.getId());
-
-        boolean statusValidation = validateTenantStatus(childClaim.getTenantId());
-
-        if (!statusValidation) {
-            return null;
-        }
-
-        boolean relationShipValidation = validateParentChildTenantRelationShip(authClaim.getTenantId(), childClaim.getTenantId());
-
-        if (!relationShipValidation) {
-            return null;
+        if (childClaim.isPresent() && (!validateTenantStatus(childClaim.get().getTenantId()) ||
+                !validateParentChildTenantRelationShip(authClaim.get().getTenantId(), childClaim.get().getTenantId()))) {
+            return Optional.empty();
         }
 
         return childClaim;
@@ -254,18 +337,41 @@
     }
 
 
-    public AuthClaim authorizeWithParentChildTenantValidationByBasicAuthAndUserTokenValidation(Metadata headers,
-                                                                                               String childClientId,
-                                                                                               String userToken) {
-        AuthClaim authClaim = authorize(headers);
+    public Optional<AuthClaim> authorizeParentChildTenantWithBasicAuthAndUserTokenValidation(Metadata headers,
+                                                                                             String childClientId,
+                                                                                             String userToken) {
+        Optional<AuthClaim> authClaim = authorize(headers);
 
-        if (authClaim == null) {
-            return null;
+        if (authClaim == null || childClientId == null || childClientId.isEmpty()) {
+            return Optional.empty();
         }
 
-        if (childClientId == null || childClientId.trim().equals("")) {
-            return authClaim;
+        GetCredentialRequest request = GetCredentialRequest
+                .newBuilder()
+                .setId(childClientId).build();
+
+        CredentialMetadata metadata = credentialStoreServiceClient
+                .getCustosCredentialFromClientId(request);
+
+        Optional<AuthClaim> optionalAuthClaim = getAuthClaim(metadata);
+
+        if (optionalAuthClaim.isPresent() &&
+                validateTenantStatus(optionalAuthClaim.get().getTenantId()) &&
+                validateParentChildTenantRelationShip(authClaim.get().getTenantId(),
+                        optionalAuthClaim.get().getTenantId())) {
+            return authorizeUsingUserToken(userToken);
         }
+        return Optional.empty();
+    }
+
+    public Optional<AuthClaim> authorizeParentChildTenantWithUserTokenValidation(Metadata headers,
+                                                                                 String childClientId) {
+
+        if (childClientId == null || childClientId.trim().isEmpty()) {
+            return Optional.empty();
+        }
+
+        Optional<AuthClaim> authClaim = authorizeUsingUserToken(headers);
 
         GetCredentialRequest request = GetCredentialRequest
                 .newBuilder()
@@ -273,22 +379,21 @@
 
         CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
 
-        AuthClaim childClaim = getAuthClaim(metadata);
 
-
-        boolean statusValidation = validateTenantStatus(childClaim.getTenantId());
-
-        if (!statusValidation) {
-            return null;
+        if (!validateTenantStatus(metadata.getOwnerId()) ||
+                (authClaim.isPresent() && !authClaim.get().isSuperTenant() &&
+                        !validateParentChildTenantRelationShip(authClaim.get().getTenantId(),
+                                metadata.getOwnerId()))) {
+            return Optional.empty();
         }
 
-        boolean relationShipValidation = validateParentChildTenantRelationShip(authClaim.getTenantId(), childClaim.getTenantId());
+        GetAllCredentialsRequest allReq = GetAllCredentialsRequest
+                .newBuilder()
+                .setOwnerId(metadata.getOwnerId())
+                .build();
+        GetAllCredentialsResponse response = credentialStoreServiceClient.getAllCredentials(allReq);
 
-        if (!relationShipValidation) {
-            return null;
-        }
-
-        return authorizeUsingUserToken(userToken);
+        return getAuthClaim(response);
 
     }
 
@@ -305,9 +410,23 @@
     }
 
 
-    private AuthClaim getAuthClaim(GetAllCredentialsResponse response) {
-        if (response == null || response.getSecretListCount() == 0) {
-            return null;
+    public CredentialMetadata getCredentialsFromClientId(String clientId) {
+        GetCredentialRequest request = GetCredentialRequest.newBuilder()
+                .setId(clientId)
+                .build();
+        CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
+
+        if (metadata == null || metadata.getOwnerId() == 0) {
+            throw new UnAuthorizedException("Invalid client_id", null);
+        }
+
+        return metadata;
+    }
+
+
+    private Optional<AuthClaim> getAuthClaim(GetAllCredentialsResponse response) {
+        if (response == null || response.getSecretListList().isEmpty()) {
+            return Optional.empty();
         }
 
         AuthClaim authClaim = new AuthClaim();
@@ -352,13 +471,13 @@
         GetTenantResponse tentResp = tenantProfileClient.getTenant(tenantRequest);
 
         if (tentResp.getTenant() != null && tentResp.getTenant().getTenantStatus().equals(TenantStatus.ACTIVE)) {
-            return authClaim;
+            return Optional.of(authClaim);
         }
-        return null;
+        return Optional.empty();
     }
 
 
-    private AuthClaim getAuthClaim(CredentialMetadata metadata) {
+    private Optional<AuthClaim> getAuthClaim(CredentialMetadata metadata) {
         AuthClaim authClaim = new AuthClaim();
         if (metadata.getType() == Type.CUSTOS) {
             authClaim.setTenantId(metadata.getOwnerId());
@@ -382,7 +501,7 @@
             authClaim.setAgentId(metadata.getId());
             authClaim.setAgentPassword(metadata.getInternalSec());
         }
-        return authClaim;
+        return Optional.of(authClaim);
 
     }
 
@@ -402,7 +521,7 @@
     }
 
 
-    private boolean validateParentChildTenantRelationShip(long parentId, long childTenantId) {
+    public boolean validateParentChildTenantRelationShip(long parentId, long childTenantId) {
 
         GetTenantRequest childTenantReq = GetTenantRequest
                 .newBuilder()
@@ -413,6 +532,7 @@
 
         Tenant childTenant = childTenantRes.getTenant();
 
+
         // referring to same tenant
         if (childTenant != null && childTenant.getTenantId() == parentId) {
             return true;
@@ -428,8 +548,50 @@
 
 
     private void attachTenantId(String tenantId, Metadata headers) {
-        headers.put(Metadata.Key.of(Constants.TenantId,Metadata.ASCII_STRING_MARSHALLER), tenantId);
+        headers.put(Metadata.Key.of(Constants.TenantId, Metadata.ASCII_STRING_MARSHALLER), tenantId);
     }
 
+    public Optional<String> getUserTokenFromUserTokenHeader(Metadata headers) {
+        String header = headers.get(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER));
+        if (header != null && !header.trim().isEmpty()) {
+            return Optional.of(header);
+        } else {
+            return Optional.empty();
+        }
+
+    }
+
+    public boolean clearUserTokenFromHeader(Metadata headers) {
+        String obj = headers.get(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER));
+        headers.remove(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER), obj);
+        return true;
+    }
+
+    public boolean isAgentAuthenticationEnabled(Metadata headers) {
+        String header = headers.get(Metadata.Key.of(Constants.AUTHENTICATE_AGENT, Metadata.ASCII_STRING_MARSHALLER));
+        if (header != null && Boolean.parseBoolean(header)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public boolean isBasicAuth(Metadata headers) {
+        try {
+            this.authorize(headers);
+            return true;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
+
+    public boolean isUserToken(Metadata headers) {
+        try {
+            this.authorizeUsingUserToken(headers);
+            return true;
+        } catch (Exception ex) {
+            return false;
+        }
+    }
 
 }
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/MultiTenantAuthInterceptor.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/MultiTenantAuthInterceptor.java
index 8b311e6..2db92a1 100644
--- a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/MultiTenantAuthInterceptor.java
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/interceptors/MultiTenantAuthInterceptor.java
@@ -22,12 +22,13 @@
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.utils.Constants;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Optional;
+
 /**
  * Responsible for authorization  of  multi tenant middleware requests
  */
@@ -51,27 +52,40 @@
     }
 
 
-    public AuthClaim authorize(Metadata headers, String clientId) {
+    public Optional<AuthClaim> authorize(Metadata headers, String clientId) {
 
-        if (clientId != null && clientId.trim().equals("")) {
-            clientId = null;
-        }
+        try {
 
-        String userToken = headers.get(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER));
+            if (clientId != null && clientId.trim().isEmpty()) {
+                clientId = null;
+            }
 
-        if (clientId == null && userToken == null) {
-            return authorize(headers);
-        } else if (clientId != null && userToken == null) {
-            return authorizeWithParentChildTenantValidationByBasicAuth(headers, clientId);
-        } else if (clientId != null && userToken != null) {
-            return authorizeWithParentChildTenantValidationByBasicAuthAndUserTokenValidation(headers, clientId, userToken);
-        } else {
-            return authorizeUsingUserToken(headers);
+            boolean agentAuthenticationEnabled = isAgentAuthenticationEnabled(headers);
+
+            if (agentAuthenticationEnabled) {
+                return authorizeUsingAgentAndUserJWTTokens(headers);
+            }
+            Optional<String> userToken = getUserTokenFromUserTokenHeader(headers);
+            boolean isBasicAuth = isBasicAuth(headers);
+
+            if (clientId == null && userToken.isEmpty() && isBasicAuth) {
+                return authorize(headers);
+            } else if (clientId != null && userToken.isEmpty() && isBasicAuth) {
+                return authorizeParentChildTenantValidationWithBasicAuth(headers, clientId);
+            } else if (clientId != null && userToken.isPresent()) {
+                return authorizeParentChildTenantWithBasicAuthAndUserTokenValidation(headers, clientId, userToken.get());
+            } else if (clientId != null && isUserToken(headers)) {
+                return authorizeParentChildTenantWithUserTokenValidation(headers, clientId);
+            } else {
+                return authorizeUsingUserToken(headers);
+            }
+
+        } catch (Exception ex) {
+            LOGGER.error(ex.getMessage(),ex);
+            clearUserTokenFromHeader(headers);
+            throw ex;
         }
     }
 
 
-    public String getUserTokenFromUserTokenHeader(Metadata headers) {
-        return headers.get(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER));
-    }
 }
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailSender.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailSender.java
new file mode 100644
index 0000000..54006ed
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailSender.java
@@ -0,0 +1,54 @@
+/*
+ * 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.custos.integration.services.commons.utils;
+
+import io.grpc.Context;
+import org.apache.custos.messaging.client.MessagingClient;
+import org.apache.custos.messaging.email.service.CustosEvent;
+import org.apache.custos.messaging.email.service.Email;
+import org.apache.custos.messaging.email.service.EmailMessageSendingRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class EmailSender {
+
+    @Autowired
+    private MessagingClient messagingClient;
+
+
+    public void sendEmail(long tenantId, CustosEvent custosEvent, Map<String, String> parametersMap) {
+        Email email = Email.newBuilder().setCustosEvent(custosEvent)
+                .putAllParameters(parametersMap)
+                .build();
+        EmailMessageSendingRequest emailMessageSendingRequest = EmailMessageSendingRequest.newBuilder()
+                .setTenantId(tenantId)
+                .setMessage(email)
+                .build();
+        Context ctx = Context.current().fork();
+        ctx.run(() -> {
+            messagingClient.sendEmailAsync(emailMessageSendingRequest,
+                    new EmailServiceOutputStreamObserver());
+        });
+    }
+
+}
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailServiceOutputStreamObserver.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailServiceOutputStreamObserver.java
new file mode 100644
index 0000000..6aed50d
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EmailServiceOutputStreamObserver.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied. See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.custos.integration.services.commons.utils;
+
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.email.service.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EmailServiceOutputStreamObserver implements StreamObserver<Status> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamObserver.class);
+    @Override
+    public void onNext(Status status) {
+        LOGGER.debug("Status received :" + status.getStatus());
+    }
+
+    @Override
+    public void onError(Throwable throwable) {
+
+    }
+
+    @Override
+    public void onCompleted() {
+
+    }
+}
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EventPublisher.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EventPublisher.java
new file mode 100644
index 0000000..4668938
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/EventPublisher.java
@@ -0,0 +1,55 @@
+/*
+ * 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.custos.integration.services.commons.utils;
+
+import io.grpc.Context;
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.client.MessagingClient;
+import org.apache.custos.messaging.service.Message;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.UUID;
+
+@Component
+public class EventPublisher {
+
+    @Autowired
+    private MessagingClient messagingClient;
+
+
+    public void publishMessage(String clientId, long tenantId, String serviceName, String eventType, Map<String, String> properties) {
+        Message message = Message
+                .newBuilder()
+                .setMessageId(UUID.randomUUID().toString())
+                .setClientId(clientId)
+                .setTenantId(tenantId)
+                .setServiceName(serviceName)
+                .setEventType(eventType)
+                .putAllProperties(properties)
+                .build();
+        Context ctx = Context.current().fork();
+        ctx.run(()->{
+            messagingClient.publishAsync(message, new OutputStreamObserver());
+        });
+    }
+
+}
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/InterServiceModelMapper.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/InterServiceModelMapper.java
index 9bfeb01..0ba9df9 100644
--- a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/InterServiceModelMapper.java
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/InterServiceModelMapper.java
@@ -48,7 +48,7 @@
                         org.apache.custos.user.profile.service.UserAttribute
                                 .newBuilder()
                                 .setKey(atr.getKey())
-                                .addAllValue(atr.getValuesList())
+                                .addAllValues(atr.getValuesList())
                                 .build();
 
                 userAtrList.add(userAttribute);
diff --git a/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/OutputStreamObserver.java b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/OutputStreamObserver.java
new file mode 100644
index 0000000..57d561f
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-commons/src/main/java/org/apache/custos/integration/services/commons/utils/OutputStreamObserver.java
@@ -0,0 +1,44 @@
+/*
+ * 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.custos.integration.services.commons.utils;
+
+import io.grpc.stub.StreamObserver;
+import org.apache.custos.messaging.service.Status;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OutputStreamObserver implements StreamObserver<Status> {
+    private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamObserver.class);
+
+    @Override
+    public void onNext(Status status) {
+        LOGGER.debug("Status received :" + status.getStatus());
+    }
+
+    @Override
+    public void onError(Throwable throwable) {
+
+    }
+
+    @Override
+    public void onCompleted() {
+
+    }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/Dockerfile b/custos-integration-services/custos-integration-services-swagger/Dockerfile
new file mode 100644
index 0000000..8007b96
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/Dockerfile
@@ -0,0 +1,5 @@
+FROM openjdk:11.0.5-jdk-slim
+VOLUME /tmp
+ARG JAR_FILE
+ADD ${JAR_FILE} app.jar
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/pom.xml b/custos-integration-services/custos-integration-services-swagger/pom.xml
new file mode 100644
index 0000000..140a5a3
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/pom.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>custos-integration-services</artifactId>
+        <groupId>org.apache.custos</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>custos-integration-services-swagger</artifactId>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-bean-validators</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-sleuth</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-spring-web</artifactId>
+            <version>2.9.2</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>com.deviceinsight.helm</groupId>
+                <artifactId>helm-maven-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/.helmignore b/custos-integration-services/custos-integration-services-swagger/src/main/helm/.helmignore
new file mode 100644
index 0000000..50af031
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/Chart.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/Chart.yaml
new file mode 100644
index 0000000..f3c727f
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm of custos log management service
+name: ${artifactId}
+version: ${project.version}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/NOTES.txt b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/NOTES.txt
new file mode 100644
index 0000000..b1a316f
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/NOTES.txt
@@ -0,0 +1,21 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "helm.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "helm.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "helm.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "helm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/_helpers.tpl b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/_helpers.tpl
new file mode 100644
index 0000000..86a9288
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/_helpers.tpl
@@ -0,0 +1,56 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "helm.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "helm.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "helm.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "helm.labels" -}}
+app.kubernetes.io/name: {{ include "helm.name" . }}
+helm.sh/chart: {{ include "helm.chart" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "helm.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+    {{ default (include "helm.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+    {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/deployment.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/deployment.yaml
new file mode 100644
index 0000000..3c30739
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/deployment.yaml
@@ -0,0 +1,61 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "helm.fullname" . }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  rollingUpdate:
+    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: {{ include "helm.name" . }}
+      app.kubernetes.io/instance: {{ .Release.Name }}
+  template:
+    metadata:
+      annotations:
+        linkerd.io/inject: enabled
+      labels:
+        app.kubernetes.io/name: {{ include "helm.name" . }}
+        app.kubernetes.io/instance: {{ .Release.Name }}
+    spec:
+    {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
+      serviceAccountName: {{ template "helm.serviceAccountName" . }}
+      securityContext:
+        {{- toYaml .Values.podSecurityContext | nindent 8 }}
+      containers:
+        - name: {{ .Chart.Name }}
+          securityContext:
+              {{- toYaml .Values.securityContext | nindent 12 }}
+          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - name: http
+              containerPort: {{ .Values.service.port }}
+              protocol: TCP
+          readinessProbe:
+            httpGet:
+              path: /actuator/health
+              port: {{ .Values.service.port }}
+              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+          resources:
+              {{- toYaml .Values.resources | nindent 12 }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+    {{- with .Values.affinity }}
+      affinity:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
+    {{- with .Values.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+    {{- end }}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/ingress.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/ingress.yaml
new file mode 100644
index 0000000..94b11c2
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/ingress.yaml
@@ -0,0 +1,21 @@
+apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
+kind: Ingress
+metadata:
+  name: ${artifactId}-ingress
+  annotations:
+    nginx.ingress.kubernetes.io/rewrite-target: /$2
+    cert-manager.io/cluster-issuer: letsencrypt-production
+spec:
+  rules:
+    - host: custos.scigap.org
+      http:
+        paths:
+          - path: /services(/|$)(.*)
+            backend:
+              serviceName: custos-integration-services-swagger
+              servicePort: http
+
+  tls:
+    - hosts:
+        - custos.scigap.org
+      secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/service.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/service.yaml
new file mode 100644
index 0000000..5752c1d
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/service.yaml
@@ -0,0 +1,25 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "helm.name" . }}
+  annotations:
+    getambassador.io/config: |
+      ---
+      apiVersion: ambassador/v1
+      kind: Mapping
+      name: tenant-management-service-mapping
+      prefix: /tenant-management/
+      rewrite: ""
+      service: tenant-management-service.custos:50000
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    app.kubernetes.io/name: {{ include "helm.name" . }}
+    app.kubernetes.io/instance: {{ .Release.Name }}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/serviceaccount.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/serviceaccount.yaml
new file mode 100644
index 0000000..87c82d5
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/serviceaccount.yaml
@@ -0,0 +1,8 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "helm.serviceAccountName" . }}
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+{{- end -}}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/tests/test-connection.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/tests/test-connection.yaml
new file mode 100644
index 0000000..eac279f
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "helm.fullname" . }}-test-connection"
+  labels:
+{{ include "helm.labels" . | indent 4 }}
+  annotations:
+    "helm.sh/hook": test-success
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args:  ['{{ include "helm.fullname" . }}:{{ .Values.service.port }}']
+  restartPolicy: Never
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/helm/values.yaml b/custos-integration-services/custos-integration-services-swagger/src/main/helm/values.yaml
new file mode 100644
index 0000000..8cc578c
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/helm/values.yaml
@@ -0,0 +1,82 @@
+# Default values for helm.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 2
+
+image:
+  repository: apachecustos/${artifactId}
+  tag: ${project.version}
+  pullPolicy: Always
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: ${artifactId}
+
+podSecurityContext: {}
+  # fsGroup: 2000
+
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+service:
+  type: ClusterIP
+  port: 8080
+
+ingress:
+  enabled: false
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+    # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: chart-example.local
+      paths: []
+
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  # limits:
+  #   cpu: 100m
+  #   memory: 128Mi
+  # requests:
+  #   cpu: 100m
+  #   memory: 128Mi
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
+
+role:
+  name: resource-fetch
+  binding: resource-role-binder
+
+
+rollingUpdate:
+  maxSurge: 1
+  maxUnavailable: 25%
+
+readinessProbe:
+  initialDelaySeconds: 5
+  periodSeconds: 1
+  successThreshold: 1
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerInitializer.java b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerInitializer.java
new file mode 100644
index 0000000..09b3c94
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerInitializer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.custos.services.swagger;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import static springfox.documentation.spi.DocumentationType.SWAGGER_2;
+
+
+@EnableSwagger2
+@SpringBootApplication
+public class SwaggerInitializer {
+    public static void main(String[] args) {
+        SpringApplication.run(SwaggerInitializer.class, args);
+    }
+
+
+    @Bean
+    public Docket swagger() {
+        return new Docket(SWAGGER_2)
+                .select()
+                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerSpecConfig.java b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerSpecConfig.java
new file mode 100644
index 0000000..ac49ee6
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/SwaggerSpecConfig.java
@@ -0,0 +1,55 @@
+/*
+ * 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.custos.services.swagger;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import springfox.documentation.swagger.web.SwaggerResource;
+import springfox.documentation.swagger.web.SwaggerResourcesProvider;
+
+@Configuration
+public class SwaggerSpecConfig {
+
+    @Primary
+    @Bean
+    public SwaggerResourcesProvider swaggerResourcesProvider() {
+        return () -> {
+            List<SwaggerResource> resources = new ArrayList<>();
+            Arrays.asList("log-management-service","agent-management-service",
+                    "cluster-management-service","group-management-service","identity-management-service",
+                    "resource-secret-management-service",
+                    "sharing-management-service","tenant-management-service","user-management-service")
+                    .forEach(resourceName -> resources.add(loadResource(resourceName)));
+            return resources;
+        };
+    }
+
+    private SwaggerResource loadResource(String resource) {
+        SwaggerResource wsResource = new SwaggerResource();
+        wsResource.setName(resource);
+        wsResource.setSwaggerVersion("2.0");
+        wsResource.setLocation("/swagger-apis/" + resource + "/swagger.json");
+        return wsResource;
+    }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/controller/SwaggerUIController.java b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/controller/SwaggerUIController.java
new file mode 100644
index 0000000..f995936
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/java/org/apache/custos/services/swagger/controller/SwaggerUIController.java
@@ -0,0 +1,37 @@
+/*
+ * 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.custos.services.swagger.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/swagger")
+public class SwaggerUIController {
+
+    @GetMapping("/{name}/{version}")
+    public String homePage(@PathVariable("name") String name, @PathVariable("version") String version, Model model) {
+        model.addAttribute("filePath", "/swagger/" + name + '/' + version + "/swagger.json");
+        return "redoc";
+    }
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/application.properties b/custos-integration-services/custos-integration-services-swagger/src/main/resources/application.properties
new file mode 100644
index 0000000..aac3bad
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/application.properties
@@ -0,0 +1,26 @@
+#
+# 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.
+#
+server.port=8080
+spring.application.name=swaggerService
+spring.zipkin.baseUrl=http://149.165.169.49:9411/
+spring.sleuth.sampler.probability=1
+management.security.enabled=false
+management.endpoints.web.exposure.include=*
+management.endpoint.metrics.enabled=true
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentManagementService.proto
new file mode 100644
index 0000000..12609e7
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentManagementService.proto
@@ -0,0 +1,148 @@
+/*
+ * 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.custos.agent.management.service;
+
+import "google/api/annotations.proto";
+import "google/rpc/error_details.proto";
+import "google/protobuf/empty.proto";
+import "IamAdminService.proto";
+
+option go_package = "./pb";
+
+
+message AgentSearchRequest {
+    int64 tenantId = 2;
+    string accessToken = 3;
+    string clientId = 4;
+    string clientSec = 5;
+    string performedBy = 6;
+    string id = 7;
+}
+
+message AgentRegistrationResponse {
+    string id = 1;
+    string secret = 2;
+}
+
+message SynchronizeAgentDBRequest {
+    int64 tenantId = 2;
+    string clientId = 4;
+}
+
+
+service AgentManagementService {
+
+    rpc enableAgents (org.apache.custos.iam.service.AgentClientMetadata) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/enable"
+         };
+    }
+    rpc configureAgentClient (org.apache.custos.iam.service.AgentClientMetadata) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/token/configuration"
+         };
+    }
+
+
+    rpc addRolesToClient (org.apache.custos.iam.service.AddRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/roles"
+         };
+    }
+
+    rpc registerAndEnableAgent (org.apache.custos.iam.service.RegisterUserRequest) returns (AgentRegistrationResponse) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/agent"
+           body: "user"
+         };
+    }
+
+    rpc getAgent (AgentSearchRequest) returns (org.apache.custos.iam.service.Agent) {
+        option (google.api.http) = {
+           get: "/agent-management/v1.0.0/agent/{id}"
+         };
+    }
+
+    rpc deleteAgent (AgentSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/agent-management/v1.0.0/agent/{id}"
+         };
+    }
+    rpc disableAgent (AgentSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/agent/deactivation/{id}"
+         };
+
+    }
+
+    rpc enableAgent (AgentSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/agent/activation/{id}"
+         };
+
+    }
+
+    rpc addAgentAttributes (org.apache.custos.iam.service.AddUserAttributesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/agent/attributes"
+         };
+    }
+    rpc deleteAgentAttributes (org.apache.custos.iam.service.DeleteUserAttributeRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/agent-management/v1.0.0/agent/attributes"
+         };
+    }
+    rpc addRolesToAgent (org.apache.custos.iam.service.AddUserRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/agent/roles"
+         };
+    }
+    rpc deleteRolesFromAgent (org.apache.custos.iam.service.DeleteUserRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/agent-management/v1.0.0/agent/roles"
+         };
+    }
+
+    rpc addProtocolMapper (org.apache.custos.iam.service.AddProtocolMapperRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/agent-management/v1.0.0/protocol/mapper"
+        };
+    }
+
+    rpc getAllAgents (org.apache.custos.iam.service.GetAllResources) returns (org.apache.custos.iam.service.GetAllResourcesResponse) {
+        option (google.api.http) = {
+           get: "/agent-management/v1.0.0/agents"
+        };
+    }
+
+     rpc synchronizeAgentDBs (SynchronizeAgentDBRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+         option (google.api.http) = {
+           post: "/agent-management/v1.0.0/db/synchronize"
+        };
+      }
+
+
+}
+
+
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentProfileService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentProfileService.proto
new file mode 100644
index 0000000..7d26877
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/AgentProfileService.proto
@@ -0,0 +1,66 @@
+/*
+ * 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.custos.agent.profile.service;
+
+option go_package = "./pb";
+
+message Agent {
+    string id = 1;
+    AgentStatus status = 2;
+    int64 created_at = 3;
+    int64 last_modified_at = 4;
+    repeated string roles = 5;
+    repeated AgentAttribute attributes = 6;
+    repeated string agent_client_roles = 8;
+
+}
+
+enum AgentStatus {
+    ENABLED = 0;
+    DISABLED = 1;
+}
+
+message AgentAttribute {
+    string id = 1;
+    string key = 2;
+    repeated string value = 3;
+}
+
+message AgentRequest {
+    int64 tenant_id = 1;
+    Agent agent = 2;
+}
+
+message OperationStatus {
+    bool status = 1;
+}
+
+service AgentProfileService {
+
+    rpc createAgent (AgentRequest) returns (Agent);
+    rpc updateAgent (AgentRequest) returns (Agent);
+    rpc deleteAgent (AgentRequest) returns (OperationStatus);
+    rpc getAgent (AgentRequest) returns (Agent);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ClusterManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ClusterManagementService.proto
new file mode 100644
index 0000000..6c58702
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ClusterManagementService.proto
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+syntax = "proto3";
+
+option java_multiple_files = true;
+package org.apache.custos.cluster.management.service;
+option go_package = "./pb";
+message GetServerCertificateRequest {
+    string secretName = 1;
+    string namespace = 2;
+}
+
+message GetServerCertificateResponse {
+    string certificate = 1;
+}
+
+
+
+
+service ClusterManagementService {
+
+    rpc getCustosServerCertificate (GetServerCertificateRequest) returns (GetServerCertificateResponse);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/CredentialStoreService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/CredentialStoreService.proto
new file mode 100644
index 0000000..691df79
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/CredentialStoreService.proto
@@ -0,0 +1,143 @@
+/*
+ * 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.custos.credential.store.service;
+option go_package = "./pb";
+
+enum Type {
+    CUSTOS = 0;
+    IAM = 1;
+    CILOGON = 2;
+    INDIVIDUAL = 3;
+    AGENT_CLIENT = 4;
+    AGENT = 5;
+}
+
+message CredentialMetadata {
+    int64 owner_id = 1;
+    string id = 2;
+    string secret = 3;
+    int64 client_secret_expired_at = 4;
+    int64 client_id_issued_at = 5;
+    Type type = 6;
+    bool super_tenant = 7;
+    bool super_admin = 8;
+    string internal_sec = 11;
+}
+
+message GetCredentialRequest {
+    int64 ownerId = 1;
+    string id = 2;
+    Type type = 3;
+}
+
+message GetAllCredentialsRequest {
+    int64 ownerId = 1;
+}
+
+message GetAllCredentialsResponse {
+    repeated CredentialMetadata secret_list = 1;
+    string requester_user_email = 2;
+    string requester_username = 3;
+}
+
+message OperationStatus {
+    bool state = 1;
+}
+
+message DeleteCredentialRequest {
+    int64 owner_id = 1;
+    Type type = 2;
+}
+
+message GetOperationsMetadataRequest {
+    int64 trace_id = 1;
+}
+
+message OperationMetadata {
+    string event = 1;
+    string status = 2;
+    string time_stamp = 3;
+    string performed_by = 4;
+}
+message GetOperationsMetadataResponse {
+    repeated OperationMetadata metadata = 1;
+}
+
+message GetNewCustosCredentialRequest {
+    int64 owner_id = 1;
+    string performed_by = 2;
+}
+
+message GetNewCustosCredentialResponse {
+    string client_id = 1;
+    string client_secret = 2;
+}
+
+message TokenRequest {
+    string token = 1;
+    string parent_client_id = 2;
+}
+
+message GetOwnerIdResponse {
+    int64 owner_id = 2;
+}
+
+message Credentials {
+    string iam_client_id = 1;
+    string iam_client_secret = 2;
+    string ci_logon_client_id = 3;
+    string ci_logon_client_secret = 4;
+    string custos_client_id = 5;
+    string custos_client_secret = 6;
+    double custos_client_id_issued_at = 7;
+    double custos_client_secret_expired_at = 8;
+}
+
+
+
+service CredentialStoreService {
+    rpc putCredential (CredentialMetadata) returns (OperationStatus);
+    rpc deleteCredential (DeleteCredentialRequest) returns (OperationStatus);
+    rpc getCredential (GetCredentialRequest) returns (CredentialMetadata);
+    rpc getAllCredentials (GetAllCredentialsRequest) returns (GetAllCredentialsResponse);
+    rpc getOperationMetadata (GetOperationsMetadataRequest) returns (GetOperationsMetadataResponse);
+    rpc getNewCustosCredential (GetNewCustosCredentialRequest) returns (CredentialMetadata);
+    rpc getOwnerIdFromToken (TokenRequest) returns (GetOwnerIdResponse);
+    rpc getCustosCredentialFromToken (TokenRequest) returns (CredentialMetadata);
+    rpc getCustosCredentialFromClientId (GetCredentialRequest) returns (CredentialMetadata);
+    rpc getAllCredentialsFromToken (TokenRequest) returns (GetAllCredentialsResponse);
+    rpc getMasterCredentials (GetCredentialRequest) returns (GetAllCredentialsResponse);
+    rpc getAllCredentialsFromJWTToken (TokenRequest) returns (GetAllCredentialsResponse);
+    rpc getBasicCredentials (TokenRequest) returns (Credentials);
+
+
+    rpc createAgentCredential (CredentialMetadata) returns (CredentialMetadata);
+    rpc getAgentCredential (GetCredentialRequest) returns (CredentialMetadata);
+    rpc deleteAgentCredential (CredentialMetadata) returns (OperationStatus);
+    rpc getCredentialByAgentBasicAuth (TokenRequest) returns (GetAllCredentialsResponse);
+    rpc getCredentialByAgentJWTToken (TokenRequest) returns (GetAllCredentialsResponse);
+    rpc validateAgentJWTToken(TokenRequest) returns (OperationStatus);
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/EmailService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/EmailService.proto
new file mode 100644
index 0000000..e645eda
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/EmailService.proto
@@ -0,0 +1,112 @@
+/*
+ * 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.custos.messaging.email.service;
+
+import "google/protobuf/empty.proto";
+
+option go_package = "./pb";
+
+enum CustosEvent {
+    UNKNOWN = 0;
+    NEW_USER_SIGNUP = 1;
+    GROUP_MEMBERSHIP_CHANGE = 2;
+}
+
+message Email {
+    string sender_email = 3;
+    repeated string receiver_email = 4;
+    CustosEvent custos_event = 5;
+    map<string, string> parameters = 6;
+}
+
+message EmailTemplate {
+    int64 template_id = 1;
+    CustosEvent custos_event = 2;
+    string subject = 3;
+    repeated string body_params = 4;
+    repeated string receiving_users = 5;
+    repeated string receiving_groups = 6;
+    string body = 7;
+}
+
+message EmailEnablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    EmailTemplate email_template = 3;
+}
+
+message EmailDisablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    EmailTemplate email_template = 3;
+}
+
+message Status {
+    bool status = 1;
+}
+
+
+message EmailMessageSendingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    Email message = 3;
+}
+
+message FetchEmailTemplatesRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+message FetchEmailTemplatesResponse {
+   repeated EmailTemplate templates = 1;
+}
+
+message FetchEmailFriendlyEvents {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+
+message CustosEmailEvent {
+    CustosEvent event = 1;
+    repeated string body_params = 2;
+}
+
+message FetchEmailFriendlyEventsResponse {
+    repeated CustosEmailEvent events = 1;
+}
+
+
+service EmailService {
+
+    rpc send (EmailMessageSendingRequest) returns (Status);
+
+    rpc enable (EmailEnablingRequest) returns (EmailTemplate);
+
+    rpc disable (EmailDisablingRequest) returns (Status);
+
+    rpc getTemplates (FetchEmailTemplatesRequest) returns (FetchEmailTemplatesResponse);
+
+    rpc getEmailFriendlyEvents(FetchEmailFriendlyEvents) returns(FetchEmailFriendlyEventsResponse);
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/FederatedAuthenticationService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/FederatedAuthenticationService.proto
new file mode 100644
index 0000000..7da3d0c
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/FederatedAuthenticationService.proto
@@ -0,0 +1,143 @@
+/*
+ * 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.custos.federated.authentication.service;
+import "google/protobuf/struct.proto";
+option go_package = "./pb";
+
+enum InstitutionCacheType {
+    WHITELIST = 0;
+    BACKLIST = 1;
+}
+
+
+message ClientMetadata {
+    int64 tenant_id = 1;
+    string tenant_name = 2;
+    repeated string scope = 3;
+    string tenant_uRI = 4;
+    repeated string contacts = 5;
+    string comment = 6;
+    repeated string redirect_uRIs = 7;
+    string client_id = 8;
+    string performed_by = 9;
+}
+
+
+message RegisterClientResponse {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 client_id_issued_at = 3;
+    int64 client_secret_expires_at = 4;
+    string client_registration_uri = 5;
+}
+
+
+message GetClientRequest {
+    int64 tenant_id= 1;
+    string client_id = 2;
+}
+
+message GetClientResponse {
+    string client_id = 1;
+    string client_name = 2;
+    repeated string redirect_uRIs = 3;
+    repeated string grant_types = 4;
+    repeated string scope = 5;
+    int64 client_id_issued_at = 6;
+    string comment = 7;
+    string client_secret = 8;
+    int64 client_secret_expires_at = 9;
+    string client_registration_uri = 10;
+}
+
+message DeleteClientRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    string performed_by = 3;
+}
+
+message Empty {
+
+}
+
+message GetOperationsMetadataRequest {
+    int64 trace_id = 1;
+}
+
+message OperationMetadata {
+    string event = 1;
+    string status = 2;
+    string time_stamp = 3;
+    string performed_by = 4;
+}
+message GetOperationsMetadataResponse {
+    repeated OperationMetadata metadata = 1;
+}
+
+
+message CacheManipulationRequest {
+    int64 tenant_id = 1;
+    repeated string institution_ids = 2;
+    InstitutionCacheType type = 3;
+    string performedBy = 4;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message InstitutionOperationResponse {
+
+}
+
+message Institution {
+    string entity_id = 1;
+    string organization_name = 2;
+    string display_name = 3;
+    bool rand_s = 4;
+}
+
+message GetInstitutionsIdsAsResponse {
+   repeated string entity_ids = 1;
+}
+
+
+message GetInstitutionsResponse {
+    repeated Institution institutions = 2;
+}
+
+
+service FederatedAuthenticationService {
+    rpc addClient (ClientMetadata) returns (RegisterClientResponse);
+    rpc updateClient (ClientMetadata) returns (Empty);
+    rpc getClient (GetClientRequest) returns (GetClientResponse);
+    rpc deleteClient (DeleteClientRequest) returns (Empty);
+    rpc getOperationMetadata (GetOperationsMetadataRequest) returns (GetOperationsMetadataResponse);
+
+    rpc addToCache (CacheManipulationRequest) returns (Status);
+    rpc removeFromCache (CacheManipulationRequest) returns (Status);
+    rpc getFromCache (CacheManipulationRequest) returns (GetInstitutionsResponse);
+    rpc getInstitutions (CacheManipulationRequest) returns (GetInstitutionsResponse);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/GroupManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/GroupManagementService.proto
new file mode 100644
index 0000000..df5d5bd
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/GroupManagementService.proto
@@ -0,0 +1,211 @@
+/*
+ * 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.custos.group.management.service;
+option go_package = "./pb";
+
+import "google/api/annotations.proto";
+import "UserProfileService.proto";
+import "IamAdminService.proto";
+
+
+service GroupManagementService {
+
+    rpc createKeycloakGroups (org.apache.custos.iam.service.GroupsRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/keycloak/groups"
+         };
+    }
+
+
+    rpc updateKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+
+        option (google.api.http) = {
+           put: "/group-management/v1.0.0/keycloak/group/{id}"
+         };
+    }
+
+    rpc deleteKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/keycloak/group/{id}"
+         };
+    }
+
+    rpc findKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/keycloak/group"
+         };
+    }
+
+
+    rpc getAllKeycloakGroups (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/keycloak/groups"
+         };
+    }
+
+    rpc addUserToKeycloakGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/keycloak/user/group/membership"
+         };
+    }
+
+
+    rpc removeUserFromKeycloakGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/keycloak/user/group/membership"
+         };
+    }
+
+    rpc createGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/group"
+         };
+    }
+
+
+    rpc updateGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
+
+        option (google.api.http) = {
+           put: "/group-management/v1.0.0/group/{id}"
+         };
+    }
+
+    rpc deleteGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Status) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/group/{id}"
+         };
+    }
+
+    rpc findGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/group"
+         };
+    }
+
+
+    rpc getAllGroups (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.GetAllGroupsResponse) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/groups"
+         };
+    }
+
+    rpc addUserToGroup (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/user/group/membership"
+         };
+    }
+
+
+    rpc removeUserFromGroup (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/user/group/membership"
+         };
+    }
+
+
+    rpc addChildGroupToParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/group/membership"
+         };
+
+    }
+    rpc removeChildGroupFromParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/group/membership"
+         };
+    }
+
+    rpc getAllGroupsOfUser (org.apache.custos.user.profile.service.UserProfileRequest) returns (org.apache.custos.user.profile.service.GetAllGroupsResponse) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/user/group/memberships"
+         };
+    }
+
+    rpc getAllParentGroupsOfGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.GetAllGroupsResponse) {
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/groups/memberships"
+         };
+
+    }
+
+
+    rpc getAllChildUsers(org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.GetAllUserProfilesResponse) {
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/user/group/memberships/child"
+         };
+
+    }
+    rpc getAllChildGroups(org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.GetAllGroupsResponse) {
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/groups/memberships/child"
+         };
+
+    }
+    rpc changeUserMembershipType (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           put: "/group-management/v1.0.0/user/group/membership"
+         };
+
+    }
+    rpc hasAccess(org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/user/group/access"
+         };
+
+    }
+
+    rpc addGroupMembershipType(org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/user/group/membership/type"
+         };
+
+    }
+
+    rpc removeUserGroupMembershipType(org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/user/group/membership/type"
+         };
+
+    }
+
+
+}
+
+
+
+
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IamAdminService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IamAdminService.proto
new file mode 100644
index 0000000..418ba8f
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IamAdminService.proto
@@ -0,0 +1,482 @@
+/*
+ * 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.custos.iam.service;
+
+import "google/protobuf/empty.proto";
+option go_package = "./pb";
+
+enum FederatedIDPs {
+    CILOGON = 0;
+    FACEBOOK = 1;
+    GOOGLE = 2;
+    LINKEDIN = 3;
+    TWITTER = 4;
+    CUSTOM_OIDC = 5;
+}
+
+
+message SetUpTenantRequest {
+    int64 tenant_id = 1;
+    string tenant_name = 2;
+    string admin_username = 3;
+    string admin_firstname = 4;
+    string admin_lastname = 5;
+    string admin_email = 6;
+    string admin_password = 7;
+    string tenant_uRL = 8;
+    string requester_email = 9;
+    repeated string redirect_uRIs = 10;
+    string custos_client_id = 11;
+
+}
+
+message ConfigureFederateIDPRequest {
+    int64 tenant_id = 1;
+    FederatedIDPs type = 2;
+    string client_iD = 3;
+    string client_sec = 4;
+    map<string, string> config_map = 5;
+    string requester_email = 6;
+    string idp_id = 7;
+    string scope = 8;
+}
+
+
+message FederateIDPResponse {
+    bool status = 1;
+}
+
+message SetUpTenantResponse {
+    string client_id = 1;
+    string client_secret = 2;
+}
+
+message IsUsernameAvailableRequest {
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string user_name = 3;
+
+}
+
+message CheckingResponse {
+    bool is_exist = 1;
+}
+
+
+message UserRepresentation {
+    string id = 1;
+    string username = 3;
+    string first_name = 4;
+    string last_name = 5;
+    string password = 6;
+    string email = 7;
+    bool temporary_password = 8;
+    repeated string realm_roles = 9;
+    repeated string client_roles = 10;
+    repeated UserAttribute attributes = 11;
+    string state = 12;
+    double creation_time = 13;
+    double last_login_at = 14;
+}
+
+
+message GroupRepresentation {
+    string name = 1;
+    string id = 2;
+    repeated string realm_roles = 3;
+    repeated string client_roles = 4;
+    repeated UserAttribute attributes = 5;
+    repeated UserRepresentation users = 6;
+    repeated GroupRepresentation sub_groups = 7;
+    string description = 8;
+    string ownerId = 9;
+}
+
+
+message RegisterUserRequest {
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string client_id = 3;
+    string client_sec = 4;
+    UserRepresentation user = 5;
+    string performed_by = 6;
+}
+
+
+message RegisterUsersRequest {
+    repeated UserRepresentation users = 1;
+    int64 tenant_id = 2;
+    string access_token = 3;
+    string client_id = 4;
+    string performed_by = 5;
+}
+
+message RegisterUserResponse {
+    bool is_registered = 1;
+}
+
+message RegisterUsersResponse {
+    bool all_useres_registered = 1;
+    repeated UserRepresentation failed_users = 2;
+}
+
+
+message UserSearchMetadata {
+    string username = 1;
+    string first_name = 2;
+    string last_name = 3;
+    string email = 4;
+    string id = 5;
+}
+
+message FindUsersRequest {
+    UserSearchMetadata user = 3;
+    int32 offset = 4;
+    int32 limit = 5;
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string client_id = 6;
+    string client_sec = 7;
+
+}
+
+message UserSearchRequest {
+    UserSearchMetadata user = 1;
+    int64 tenant_id = 2;
+    string access_token = 3;
+    string client_id = 4;
+    string client_sec = 5;
+    string performed_by = 6;
+}
+
+message FindUsersResponse {
+    repeated UserRepresentation users = 1;
+}
+
+message ResetUserPassword {
+    string username = 1;
+    string password = 2;
+    int64 tenant_id = 3;
+    string access_token = 4;
+    string client_id = 5;
+    string client_sec = 6;
+}
+
+
+message DeleteUserRolesRequest {
+    int64 tenant_id = 1;
+    string username = 2;
+    repeated string client_roles = 3;
+    repeated string roles = 4;
+    string access_token = 5;
+    string client_id = 6;
+    string performed_by = 7;
+    string id = 8;
+}
+
+message AddUserRolesRequest {
+    int64 tenant_id = 1;
+    repeated string usernames = 2;
+    repeated string roles = 3;
+    string access_token = 4;
+    string client_id = 5;
+    bool client_level = 6;
+    string performed_by = 7;
+    repeated string agents = 8;
+}
+
+message UpdateUserProfileRequest {
+    string access_token = 1;
+    int64 tenant_id = 2;
+    UserRepresentation user = 3;
+
+}
+
+message AddUserResponse {
+    string code = 1;
+}
+
+message GetOperationsMetadataRequest {
+    int64 trace_id = 1;
+}
+
+message OperationMetadata {
+    string event = 1;
+    string status = 2;
+    string time_stamp = 3;
+    string performed_by = 4;
+}
+message GetOperationsMetadataResponse {
+    repeated OperationMetadata metadata = 1;
+}
+
+message DeleteTenantRequest {
+    int64 tenant_id = 1;
+}
+
+message AddRolesRequest {
+    repeated RoleRepresentation roles = 1;
+    bool client_level = 2;
+    int64 tenant_id = 3;
+    string client_id = 4;
+}
+
+message GetRolesRequest {
+    bool client_level = 1;
+    int64 tenant_id = 2;
+    string client_id = 3;
+}
+
+message RoleRepresentation {
+    string name = 1;
+    string description = 2;
+    bool composite = 3;
+    string id = 4;
+}
+
+message DeleteRoleRequest {
+    bool client_level = 1;
+    int64 tenant_id = 2;
+    string client_id = 3;
+    RoleRepresentation role = 4;
+}
+
+message AllRoles {
+    repeated RoleRepresentation roles = 1;
+    string scope = 2;
+}
+
+message AddProtocolMapperRequest {
+    string name = 1;
+    string attribute_name = 2;
+    string claim_name = 3;
+    ClaimJSONTypes claim_type = 4;
+    int64 tenant_id = 6;
+    string client_id = 7;
+    MapperTypes mapper_type = 8;
+    bool add_to_id_token = 9;
+    bool add_to_access_token = 10;
+    bool add_to_user_info = 11;
+    bool multi_valued = 12;
+    bool aggregate_attribute_values = 13;
+}
+
+enum MapperTypes {
+    USER_ATTRIBUTE = 0;
+    USER_REALM_ROLE = 1;
+    USER_CLIENT_ROLE = 2;
+}
+
+enum ClaimJSONTypes {
+    STRING = 0;
+    LONG = 1;
+    INTEGER = 2;
+    BOOLEAN = 3;
+    JSON = 4;
+}
+
+enum ResourceTypes {
+    USER =0;
+    AGENT = 1;
+}
+
+message OperationStatus {
+    bool status = 1;
+}
+
+message AddUserAttributesRequest {
+    repeated UserAttribute attributes = 1;
+    repeated string users = 2;
+    int64 tenant_id = 3;
+    string client_id = 4;
+    string access_token = 5;
+    string performedBy = 6;
+    repeated string agents = 7;
+}
+
+message DeleteUserAttributeRequest {
+    repeated UserAttribute attributes = 1;
+    repeated string users = 2;
+    int64 tenant_id = 3;
+    string client_id = 4;
+    string access_token = 5;
+    string performedBy = 6;
+    repeated string agents = 7;
+}
+
+message UserAttribute {
+    string key = 1;
+    repeated string values = 2;
+}
+
+message EventPersistenceRequest {
+    int64 tenantId = 1;
+    bool admin_event = 2;
+    string event = 3;
+    bool enable = 4;
+    int64 persistence_time = 5;
+    string performedBy = 6;
+}
+
+
+message GroupsRequest {
+    int64 tenantId = 1;
+    string accessToken = 2;
+    string performedBy = 3;
+    string clientId = 4;
+    string clientSec = 5;
+    repeated GroupRepresentation groups = 6;
+}
+
+message GroupRequest {
+    int64 tenantId = 1;
+    string accessToken = 2;
+    string performedBy = 3;
+    string clientId = 4;
+    string clientSec = 5;
+    string id = 6;
+    GroupRepresentation group = 7;
+}
+
+message GroupsResponse {
+    repeated GroupRepresentation groups = 1;
+}
+
+message UserGroupMappingRequest {
+    int64 tenantId = 1;
+    string accessToken = 2;
+    string performedBy = 3;
+    string clientId = 4;
+    string clientSec = 5;
+    string username = 6;
+    string group_id = 7;
+    string membership_type = 8;
+}
+
+message AgentClientMetadata {
+    int64 tenantId = 1;
+    string tenantURL = 2;
+    repeated string redirectURIs = 3;
+    string clientName = 4;
+    int64 access_token_life_time = 5;
+    string performedBy = 6;
+    string access_token = 7;
+}
+
+message Agent {
+    string id = 1;
+    repeated string realm_roles = 2;
+    repeated UserAttribute attributes = 3;
+    bool isEnabled = 4;
+    double creation_time = 5;
+    double last_modified_at = 6;
+    repeated string client_roles = 7;
+}
+
+
+message GetAllResources {
+    int64 tenantId = 1;
+    string clientId = 2;
+    ResourceTypes resource_type = 3;
+}
+
+message GetAllResourcesResponse {
+    repeated Agent agents = 1;
+    repeated UserRepresentation users = 2;
+}
+
+message DeleteExternalIDPsRequest {
+    int64 tenant_id= 1;
+    string client_id = 2;
+    repeated string user_id=3;
+}
+
+service IamAdminService {
+
+    rpc setUPTenant (SetUpTenantRequest) returns (SetUpTenantResponse);
+    rpc updateTenant (SetUpTenantRequest) returns (SetUpTenantResponse);
+    rpc deleteTenant (DeleteTenantRequest) returns (google.protobuf.Empty);
+    rpc configureFederatedIDP (ConfigureFederateIDPRequest) returns (FederateIDPResponse);
+    rpc addRolesToTenant (AddRolesRequest) returns (AllRoles);
+    rpc addProtocolMapper (AddProtocolMapperRequest) returns (OperationStatus);
+    rpc getRolesOfTenant (GetRolesRequest) returns (AllRoles);
+    rpc deleteRole (DeleteRoleRequest) returns (OperationStatus);
+
+    rpc isUsernameAvailable (UserSearchRequest) returns (OperationStatus);
+    rpc registerUser (RegisterUserRequest) returns (RegisterUserResponse);
+    rpc enableUser (UserSearchRequest) returns (UserRepresentation);
+    rpc disableUser (UserSearchRequest) returns (UserRepresentation);
+    rpc isUserEnabled (UserSearchRequest) returns (OperationStatus);
+    rpc isUserExist (UserSearchRequest) returns (CheckingResponse);
+    rpc getUser (UserSearchRequest) returns (UserRepresentation);
+    rpc findUsers (FindUsersRequest) returns (FindUsersResponse);
+    rpc resetPassword (ResetUserPassword) returns (OperationStatus);
+    rpc grantAdminPrivilege (UserSearchRequest) returns (OperationStatus);
+    rpc removeAdminPrivilege (UserSearchRequest) returns (OperationStatus);
+    rpc deleteExternalIDPLinksOfUsers(DeleteExternalIDPsRequest) returns (OperationStatus);
+
+    rpc registerAndEnableUsers (RegisterUsersRequest) returns (RegisterUsersResponse);
+    rpc addUserAttributes (AddUserAttributesRequest) returns (OperationStatus);
+    rpc deleteUserAttributes (DeleteUserAttributeRequest) returns (OperationStatus);
+    rpc addRolesToUsers (AddUserRolesRequest) returns (OperationStatus);
+
+    rpc deleteUser (UserSearchRequest) returns (OperationStatus);
+
+    rpc deleteRolesFromUser (DeleteUserRolesRequest) returns (OperationStatus);
+
+    rpc updateUserProfile (UpdateUserProfileRequest) returns (OperationStatus);
+
+    rpc getOperationMetadata (GetOperationsMetadataRequest) returns (GetOperationsMetadataResponse);
+
+    rpc configureEventPersistence (EventPersistenceRequest) returns (OperationStatus);
+
+    rpc createGroups (GroupsRequest) returns (GroupsResponse);
+    rpc updateGroup (GroupRequest) returns (GroupRepresentation);
+    rpc deleteGroup (GroupRequest) returns (OperationStatus);
+    rpc findGroup (GroupRequest) returns (GroupRepresentation);
+    rpc getAllGroups (GroupRequest) returns (GroupsResponse);
+
+    rpc addUserToGroup (UserGroupMappingRequest) returns (OperationStatus);
+    rpc removeUserFromGroup (UserGroupMappingRequest) returns (OperationStatus);
+
+    rpc createAgentClient (AgentClientMetadata) returns (SetUpTenantResponse);
+    rpc configureAgentClient (AgentClientMetadata) returns (OperationStatus);
+
+
+    rpc isAgentNameAvailable (UserSearchRequest) returns (OperationStatus);
+    rpc registerAndEnableAgent (RegisterUserRequest) returns (RegisterUserResponse);
+    rpc deleteAgent (UserSearchRequest) returns (OperationStatus);
+    rpc getAgent (UserSearchRequest) returns (Agent);
+    rpc disableAgent (UserSearchRequest) returns (OperationStatus);
+    rpc enableAgent (UserSearchRequest) returns (OperationStatus);
+    rpc addAgentAttributes (AddUserAttributesRequest) returns (OperationStatus);
+    rpc deleteAgentAttributes (DeleteUserAttributeRequest) returns (OperationStatus);
+    rpc addRolesToAgent (AddUserRolesRequest) returns (OperationStatus);
+    rpc deleteAgentRoles (DeleteUserRolesRequest) returns (OperationStatus);
+
+
+    rpc getAllResources (GetAllResources) returns (GetAllResourcesResponse);
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityManagementService.proto
new file mode 100644
index 0000000..486f1e9
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityManagementService.proto
@@ -0,0 +1,160 @@
+/*
+ * 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.custos.identity.management.service;
+option go_package = "./pb";
+
+import "google/api/annotations.proto";
+import "IdentityService.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/any.proto";
+import "CredentialStoreService.proto";
+
+
+
+message AuthorizationRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    string client_secret = 3;
+    string redirect_uri = 4;
+    string response_type = 5;
+    string scope = 6;
+    string state = 7;
+}
+
+message AuthorizationResponse {
+    string loginURI = 1;
+}
+
+message GetCredentialsRequest {
+    string client_id = 1;
+    org.apache.custos.credential.store.service.Credentials credentials = 2;
+}
+
+
+message GetAgentTokenRequest {
+    int64 tenant_id = 1;
+    string agent_client_id = 2;
+    string agent_client_secret = 3;
+    string agentId = 4;
+    string agentPassword = 5;
+    string  client_id = 6;
+    string grant_type = 7;
+    string refresh_token = 8;
+}
+
+message EndSessionRequest {
+    string client_id = 1;
+    org.apache.custos.identity.service.EndSessionRequest body = 2;
+}
+
+
+
+
+service IdentityManagementService {
+
+    rpc authenticate (org.apache.custos.identity.service.AuthenticationRequest) returns (org.apache.custos.identity.service.AuthToken) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/authenticate"
+         };
+    }
+
+    rpc isAuthenticated (org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.IsAuthenticatedResponse) {
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/authenticate/status"
+         };
+    }
+
+    rpc getUser (org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.User) {
+
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/user"
+         };
+
+
+    }
+    rpc getUserManagementServiceAccountAccessToken (org.apache.custos.identity.service.GetUserManagementSATokenRequest) returns (org.apache.custos.identity.service.AuthToken) {
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/account/token"
+
+         };
+
+    }
+
+    rpc endUserSession(EndSessionRequest) returns (org.apache.custos.identity.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/user/logout"
+           body: "body"
+         };
+    }
+
+    rpc authorize (AuthorizationRequest) returns (AuthorizationResponse) {
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/authorize"
+
+         };
+    }
+
+
+    rpc token (org.apache.custos.identity.service.GetTokenRequest) returns (google.protobuf.Struct) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/token"
+
+         };
+    }
+
+    rpc getCredentials (GetCredentialsRequest) returns (org.apache.custos.credential.store.service.Credentials) {
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/credentials"
+        };
+    }
+
+
+
+    rpc getOIDCConfiguration(org.apache.custos.identity.service.GetOIDCConfiguration) returns (google.protobuf.Struct) {
+        option (google.api.http) = {
+           get: "/identity-management/v1.0.0/.well-known/openid-configuration"
+         };
+    }
+
+
+    rpc getAgentToken(GetAgentTokenRequest) returns (google.protobuf.Struct) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/agent/token/{client_id}"
+         };
+    }
+
+    rpc endAgentSession(EndSessionRequest) returns (org.apache.custos.identity.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/agent/logout/{client_id}"
+           body: "body"
+         };
+    }
+
+    rpc isAgentAuthenticated(org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.IsAuthenticatedResponse) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/agent/authentication/status"
+
+         };
+    }
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityService.proto
new file mode 100644
index 0000000..a55a3a0
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/IdentityService.proto
@@ -0,0 +1,137 @@
+/*
+ * 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.custos.identity.service;
+import "google/protobuf/struct.proto";
+option go_package = "./pb";
+
+message AuthToken {
+    string access_token = 1;
+    repeated Claim claims = 2;
+}
+
+
+message Claim {
+    string key = 1;
+    string value = 2;
+}
+
+message User {
+    string sub = 1;
+    string full_name = 2;
+    string first_name = 3;
+    string last_name = 4;
+    string email_address = 5;
+    string username = 6;
+    string client_id = 7;
+}
+
+
+message GetTokenRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+    string client_secret = 3;
+    string redirect_uri = 4;
+    string code = 6;
+    string username = 7;
+    string password = 8;
+    string refresh_token = 9;
+    string grant_type = 10;
+}
+
+message TokenResponse {
+    string access_token = 1;
+    double expires_in = 2;
+    double refresh_expires_in = 3;
+    string refresh_token = 4;
+    string token_type = 5;
+    string id_token = 6;
+    double not_before_policy = 7;
+    string session_state = 8;
+    string scope = 9;
+}
+
+
+message AuthenticationRequest {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
+    string username = 4;
+    string password = 5;
+}
+
+message IsAuthenticatedResponse {
+    bool authenticated = 1;
+}
+
+message GetUserManagementSATokenRequest {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
+}
+
+message GetAuthorizationEndpointRequest {
+    int64 tenant_id = 1;
+}
+
+message AuthorizationResponse {
+    string authorization_endpoint = 2;
+}
+
+message GetOIDCConfiguration {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
+}
+
+message GetJWKSRequest {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
+}
+
+message EndSessionRequest {
+    string client_id = 1;
+    string client_secret = 2;
+    int64 tenant_id = 3;
+    string refresh_token = 4;
+}
+
+message OperationStatus {
+    bool status = 1;
+}
+
+service IdentityService {
+    rpc authenticate (AuthenticationRequest) returns (AuthToken);
+    rpc isAuthenticated (AuthToken) returns (IsAuthenticatedResponse);
+    rpc getUser (AuthToken) returns (User);
+    rpc getUserManagementServiceAccountAccessToken (GetUserManagementSATokenRequest) returns (AuthToken);
+    rpc getToken (GetTokenRequest) returns (google.protobuf.Struct);
+    rpc getAuthorizeEndpoint (GetAuthorizationEndpointRequest) returns (AuthorizationResponse);
+    rpc getOIDCConfiguration (GetOIDCConfiguration) returns (google.protobuf.Struct);
+    rpc getTokenByPasswordGrantType (GetTokenRequest) returns (google.protobuf.Struct);
+    rpc getTokenByRefreshTokenGrantType (GetTokenRequest) returns (google.protobuf.Struct);
+    rpc getJWKS (GetJWKSRequest) returns (google.protobuf.Struct);
+    rpc endSession(EndSessionRequest) returns (OperationStatus);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LogManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LogManagementService.proto
new file mode 100644
index 0000000..3b1c772
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LogManagementService.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.custos.log.management.service;
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/struct.proto";
+import "LoggingService.proto";
+
+option go_package = "./pb";
+
+service LogManagementService {
+
+    rpc getLogEvents(org.apache.custos.logging.service.LogEventRequest) returns (org.apache.custos.logging.service.LogEvents) {
+        option (google.api.http) = {
+           get: "/log-management/v1.0.0/logs"
+         };
+    }
+
+    rpc isLogEnabled(org.apache.custos.logging.service.LoggingConfigurationRequest) returns(org.apache.custos.logging.service.Status) {
+        option (google.api.http) = {
+           get: "/log-management/v1.0.0/status"
+         };
+    }
+
+    rpc enable(org.apache.custos.logging.service.LoggingConfigurationRequest) returns (org.apache.custos.logging.service.Status) {
+        option (google.api.http) = {
+           post: "/log-management/v1.0.0/status"
+         };
+    }
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LoggingService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LoggingService.proto
new file mode 100644
index 0000000..7ab3fa5
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/LoggingService.proto
@@ -0,0 +1,78 @@
+/*
+ * 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.custos.logging.service;
+
+import "google/protobuf/empty.proto";
+
+option go_package = "./pb";
+
+
+message LogEvent {
+    int64 created_time = 1;
+    string service_name = 2;
+    string event_type = 3;
+    string username = 4;
+    string client_id = 5;
+    int64 tenant_id = 6;
+    string external_ip = 7;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message LogEventRequest {
+    int64 tenant_id = 1;
+    int64 start_time = 2;
+    int64 end_time = 3;
+    string client_id = 4;
+    string username = 5;
+    string remote_ip = 6;
+    string service_name = 7;
+    string event_type = 8;
+    int32 offset = 9;
+    int32 limit = 10;
+}
+
+message LogEvents {
+    repeated LogEvent events = 1;
+}
+
+message LoggingConfigurationRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+
+service LoggingService {
+
+    rpc addLogEvent(LogEvent) returns (Status);
+
+    rpc getLogEvents(LogEventRequest) returns (LogEvents);
+
+    rpc isLogEnabled(LoggingConfigurationRequest) returns(Status);
+
+    rpc enable(LoggingConfigurationRequest) returns (Status);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/MessagingService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/MessagingService.proto
new file mode 100644
index 0000000..52c2697
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/MessagingService.proto
@@ -0,0 +1,63 @@
+/*
+ * 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.custos.messaging.service;
+
+import "google/protobuf/empty.proto";
+
+
+option go_package = "./pb";
+
+
+message Message {
+    int64 created_time = 1;
+    string service_name = 2;
+    string event_type = 3;
+    string username = 4;
+    string client_id = 5;
+    int64 tenant_id = 6;
+    map<string, string> properties = 7;
+    string message_id = 8;
+}
+
+message MessageEnablingRequest {
+    int64 tenant_id = 1;
+    string client_id = 2;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message MessageEnablingResponse {
+    string topic = 1;
+}
+
+
+service MessagingService {
+
+    rpc publish(Message) returns(Status);
+
+    rpc enable(MessageEnablingRequest) returns(MessageEnablingResponse);
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretManagementService.proto
new file mode 100644
index 0000000..f46ad29
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretManagementService.proto
@@ -0,0 +1,156 @@
+/*
+ * 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.custos.resource.secret.management.service;
+option go_package = "./pb";
+
+import "google/api/annotations.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/struct.proto";
+import "ResourceSecretService.proto";
+import "IdentityService.proto";
+
+
+service ResourceSecretManagementService {
+
+    rpc getSecret (org.apache.custos.resource.secret.service.GetSecretRequest) returns (org.apache.custos.resource.secret.service.SecretMetadata) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret"
+         };
+    }
+
+    rpc getKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.KVCredential) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc addKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc updateKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc deleteKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+
+    rpc getJWKS (org.apache.custos.identity.service.GetJWKSRequest) returns (google.protobuf.Struct) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/openid-connect/certs"
+         };
+    }
+
+    rpc getResourceCredentialSummary (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.SecretMetadata) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/summary"
+         };
+    }
+    rpc getAllResourceCredentialSummaries (org.apache.custos.resource.secret.service.GetResourceCredentialSummariesRequest) returns (org.apache.custos.resource.secret.service.ResourceCredentialSummaries) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/summaries"
+         };
+    }
+    rpc addSSHCredential (org.apache.custos.resource.secret.service.SSHCredential) returns (org.apache.custos.resource.secret.service.AddResourceCredentialResponse) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/ssh"
+         };
+    }
+    rpc addPasswordCredential (org.apache.custos.resource.secret.service.PasswordCredential) returns (org.apache.custos.resource.secret.service.AddResourceCredentialResponse) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/password"
+         };
+    }
+    rpc addCertificateCredential (org.apache.custos.resource.secret.service.CertificateCredential) returns (org.apache.custos.resource.secret.service.AddResourceCredentialResponse) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/certificate"
+         };
+    }
+
+    rpc updateCertificateCredential (org.apache.custos.resource.secret.service.CertificateCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/certificate"
+         };
+    }
+
+    rpc getSSHCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.SSHCredential) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/ssh"
+         };
+    }
+    rpc getPasswordCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.PasswordCredential) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/password"
+         };
+    }
+    rpc getCertificateCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.CertificateCredential) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/certificate"
+         };
+    }
+
+    rpc deleteSSHCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/ssh"
+         };
+    }
+    rpc deletePWDCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/password"
+         };
+    }
+    rpc deleteCertificateCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/certificate"
+         };
+    }
+
+
+
+    rpc getCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.CredentialMap) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc addCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.AddResourceCredentialResponse) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc updateCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc deleteCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretService.proto
new file mode 100644
index 0000000..88c6620
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/ResourceSecretService.proto
@@ -0,0 +1,203 @@
+/*
+ * 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.custos.resource.secret.service;
+
+option go_package = "./pb";
+
+enum ResourceOwnerType {
+    TENANT_USER = 0;
+    CUSTOS = 1;
+    TENANT = 2;
+}
+
+enum ResourceType {
+    SERVER_CERTIFICATE = 0;
+    JWT_SIGNING_CERTIFICATE = 1;
+    VAULT_CREDENTIAL = 2;
+    VM = 3;
+    ACCOUNT = 4;
+    OTHER = 5;
+    SCP =6;
+    S3 =7;
+    BOX =8;
+    AZURE =9;
+    GCS = 10;
+    DROPBOX=11;
+    FTP=12;
+}
+
+enum ResourceSource {
+    KUBE = 0;
+    LOCAL = 1;
+    EXTERNAL = 2;
+    LETSENCRYPT = 3;
+}
+
+enum ResourceSecretType {
+    SSH = 0;
+    PASSWORD = 1;
+    X509_CERTIFICATE = 2;
+    RAW_DATA= 3;
+    KV=4;
+    CREDENTIAL_MAP=5;
+}
+
+message SecretMetadata {
+    ResourceOwnerType owner_type = 1;
+    ResourceType resource_type = 2;
+    ResourceSource source = 3;
+    string name = 4;
+    string value = 5;
+    ResourceSecretType type = 6;
+    int64 tenantId = 7;
+    string owner_id = 8;
+    int64 persisted_time = 9;
+    string token = 10;
+    string description = 11;
+    string client_id = 12;
+
+}
+
+
+
+
+
+message CertificateCredential {
+    SecretMetadata metadata = 1;
+    string x509_cert = 3;
+    string not_after = 4;
+    string private_key = 5;
+    int64 life_time = 6;
+    string not_before = 7;
+    bool use_shamirs_secret_sharing_with_encryption = 8;
+    int32 num_of_shares = 9;
+    int32 threshold = 10;
+    repeated bytes  private_key_shares = 11;
+}
+
+message PasswordCredential {
+    SecretMetadata metadata = 1;
+    string password = 3;
+    bool use_shamirs_secret_sharing_with_encryption = 4;
+    int32 num_of_shares = 5;
+    int32 threshold = 6;
+    repeated bytes  secret_shares = 7;
+    string userId = 8;
+}
+
+message SSHCredential {
+    SecretMetadata metadata = 1;
+    string passphrase = 3;
+    string public_key = 4;
+    string private_key = 5;
+    bool use_shamirs_secret_sharing_with_encryption = 6;
+    int32 num_of_shares = 7;
+    int32 threshold = 8;
+    repeated bytes  private_key_shares = 9;
+}
+
+
+message GetResourceCredentialByTokenRequest {
+    int64 tenantId = 1;
+    string token = 2;
+    string performed_by = 3;
+    string client_id = 4;
+    bool use_shamirs_secret_sharing_with_encryption = 5;
+    int32 num_of_shares = 6;
+    int32 threshold = 7;
+
+}
+
+message GetResourceCredentialSummariesRequest {
+    ResourceType type = 1;
+    repeated string accessible_tokens = 2;
+    int64 tenantId = 3;
+    string owner_id = 4;
+    bool all_types = 5;
+    string client_id =6;
+}
+
+message ResourceCredentialSummaries {
+    repeated SecretMetadata metadata = 1;
+}
+
+message AddResourceCredentialResponse {
+    string token = 1;
+}
+
+message ResourceCredentialOperationStatus {
+    bool status = 1;
+}
+
+
+message KVCredential {
+    string key = 1;
+    string value = 2;
+    SecretMetadata metadata = 3;
+    string token = 4;
+}
+
+
+
+
+message GetSecretRequest {
+    SecretMetadata metadata = 1;
+    string client_id =2;
+    int64 tenant_id = 3;
+    string client_sec = 4;
+}
+
+message CredentialMap {
+    map<string,string> credential_map = 1;
+    SecretMetadata metadata = 2;
+}
+
+
+
+service ResourceSecretService {
+    rpc getKVCredential (KVCredential) returns (KVCredential);
+    rpc setKVCredential(KVCredential)  returns (ResourceCredentialOperationStatus);
+    rpc updateKVCredential (KVCredential) returns (ResourceCredentialOperationStatus);
+    rpc deleteKVCredential (KVCredential) returns (ResourceCredentialOperationStatus);
+
+    rpc getCredentialMap (CredentialMap) returns (CredentialMap);
+    rpc setCredentialMap (CredentialMap) returns (AddResourceCredentialResponse);
+    rpc updateCredentialMap (CredentialMap) returns (ResourceCredentialOperationStatus);
+    rpc deleteCredentialMap (CredentialMap) returns (ResourceCredentialOperationStatus);
+
+    rpc getResourceCredentialSummary (GetResourceCredentialByTokenRequest) returns (SecretMetadata);
+    rpc getAllResourceCredentialSummaries (GetResourceCredentialSummariesRequest) returns (ResourceCredentialSummaries);
+    rpc addSSHCredential (SSHCredential) returns (AddResourceCredentialResponse);
+    rpc addPasswordCredential (PasswordCredential) returns (AddResourceCredentialResponse);
+    rpc addCertificateCredential (CertificateCredential) returns (AddResourceCredentialResponse);
+    rpc updateCertificateCredential (CertificateCredential) returns (ResourceCredentialOperationStatus);
+
+    rpc getSSHCredential (GetResourceCredentialByTokenRequest) returns (SSHCredential);
+    rpc getPasswordCredential (GetResourceCredentialByTokenRequest) returns (PasswordCredential);
+    rpc getCertificateCredential (GetResourceCredentialByTokenRequest) returns (CertificateCredential);
+
+    rpc deleteSSHCredential (GetResourceCredentialByTokenRequest) returns (ResourceCredentialOperationStatus);
+    rpc deletePWDCredential (GetResourceCredentialByTokenRequest) returns (ResourceCredentialOperationStatus);
+    rpc deleteCertificateCredential (GetResourceCredentialByTokenRequest) returns (ResourceCredentialOperationStatus);
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto
new file mode 100644
index 0000000..961f1aa
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingManagementService.proto
@@ -0,0 +1,206 @@
+/*
+ * 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.custos.sharing.management.service;
+option go_package = "./pb";
+
+import "SharingService.proto";
+import "google/api/annotations.proto";
+
+
+service SharingManagementService {
+
+
+    rpc createEntityType (org.apache.custos.sharing.service.EntityTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/entity/type"
+        };
+
+    }
+    rpc updateEntityType (org.apache.custos.sharing.service.EntityTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           put: "/sharing-management/v1.0.0/entity/type"
+        };
+
+    }
+    rpc deleteEntityType (org.apache.custos.sharing.service.EntityTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           delete: "/sharing-management/v1.0.0/entity/type"
+        };
+
+    }
+    rpc getEntityType (org.apache.custos.sharing.service.EntityTypeRequest) returns (org.apache.custos.sharing.service.EntityType) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/entity/type"
+        };
+
+    }
+    rpc getEntityTypes (org.apache.custos.sharing.service.SearchRequest) returns (org.apache.custos.sharing.service.EntityTypes) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/entity/types"
+        };
+
+    }
+
+    rpc createPermissionType (org.apache.custos.sharing.service.PermissionTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/permission/type"
+        };
+
+    }
+    rpc updatePermissionType (org.apache.custos.sharing.service.PermissionTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           put: "/sharing-management/v1.0.0/permission/type"
+        };
+
+    }
+    rpc deletePermissionType (org.apache.custos.sharing.service.PermissionTypeRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           delete: "/sharing-management/v1.0.0/permission/type"
+        };
+
+    }
+    rpc getPermissionType (org.apache.custos.sharing.service.PermissionTypeRequest) returns (org.apache.custos.sharing.service.PermissionType) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/permission/type"
+        };
+
+    }
+    rpc getPermissionTypes (org.apache.custos.sharing.service.SearchRequest) returns (org.apache.custos.sharing.service.PermissionTypes) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/permission/types"
+        };
+
+    }
+
+    rpc createEntity (org.apache.custos.sharing.service.EntityRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/entity"
+        };
+
+    }
+    rpc updateEntity (org.apache.custos.sharing.service.EntityRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           put: "/sharing-management/v1.0.0/entity"
+        };
+
+    }
+    rpc isEntityExists (org.apache.custos.sharing.service.EntityRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/entity/existence"
+        };
+
+    }
+    rpc getEntity (org.apache.custos.sharing.service.EntityRequest) returns (org.apache.custos.sharing.service.Entity) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/entity"
+        };
+
+    }
+    rpc deleteEntity (org.apache.custos.sharing.service.EntityRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           delete: "/sharing-management/v1.0.0/entity"
+        };
+
+    }
+    rpc searchEntities (org.apache.custos.sharing.service.SearchRequest) returns (org.apache.custos.sharing.service.Entities) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/entities"
+        };
+
+    }
+
+
+    rpc getListOfSharedUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.SharedOwners) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/users/share"
+        };
+
+    }
+    rpc getListOfDirectlySharedUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.SharedOwners) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/users/share/direct"
+        };
+
+    }
+    rpc getListOfSharedGroups (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.SharedOwners) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/groups/share"
+        };
+
+    }
+    rpc getListOfDirectlySharedGroups (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.SharedOwners) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/groups/share/direct"
+        };
+
+    }
+
+    rpc getAllDirectSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllDirectSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share/direct"
+        };
+
+    }
+
+    rpc getAllSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share"
+        };
+
+    }
+
+    rpc shareEntityWithUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/users/share"
+        };
+
+    }
+    rpc shareEntityWithGroups (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           post: "/sharing-management/v1.0.0/groups/share"
+        };
+
+    }
+    rpc revokeEntitySharingFromUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           delete: "/sharing-management/v1.0.0/users/share"
+        };
+
+    }
+    rpc revokeEntitySharingFromGroups (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           delete: "/sharing-management/v1.0.0/groups/share"
+        };
+
+    }
+    rpc userHasAccess (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/entity/user/access"
+        };
+
+    }
+
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto
new file mode 100644
index 0000000..c11f6ac
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/SharingService.proto
@@ -0,0 +1,222 @@
+/*
+ * 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.custos.sharing.service;
+
+option go_package = "./pb";
+enum SearchCondition {
+    EQUAL = 0;
+    LIKE = 1;
+    GTE = 2;
+    LTE = 3;
+    NOT = 4;
+}
+
+enum EntitySearchField {
+    NAME = 0;
+    DESCRIPTION = 1;
+    ID = 2;
+    FULL_TEXT = 3;
+    OWNER_ID = 4;
+    CREATED_AT = 5;
+    LAST_MODIFIED_AT = 6;
+    ENTITY_TYPE_ID = 7;
+    PARENT_ID = 8;
+    SHARED_COUNT = 9;
+    PERMISSION_TYPE_ID = 10;
+}
+
+
+message EntityType {
+    string id = 1;
+    string name = 2;
+    string description = 3;
+    int64 created_at = 4;
+    int64 updated_at = 5;
+}
+
+message PermissionType {
+    string id = 1;
+    string name = 2;
+    string description = 3;
+    int64 created_at = 4;
+    int64 updated_at = 5;
+}
+
+message Entity {
+    string id = 1;
+    string type = 2;
+    string owner_id = 3;
+    string parent_id = 4;
+    string name = 5;
+    string description = 6;
+    bytes binary_data = 7;
+    string full_text = 8;
+    int64 original_creation_time = 9;
+    int64 created_at = 10;
+    int64 updated_at = 11;
+    int32 shared_count = 12;
+}
+
+message EntityRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    Entity entity = 3;
+    string client_sec = 4;
+}
+
+message EntityTypeRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    EntityType entity_type = 3;
+    string client_sec = 4;
+}
+
+
+message PermissionTypeRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    PermissionType permission_type = 3;
+    string client_sec = 4;
+}
+
+
+message SearchCriteria {
+    EntitySearchField search_field = 1;
+    string value = 2;
+    SearchCondition condition = 3;
+}
+
+message SearchRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    string owner_id = 3;
+    int32 offset = 4;
+    int32 limit = 5;
+    repeated SearchCriteria search_criteria = 6;
+    string client_sec = 7;
+    repeated string associating_ids = 8;
+}
+
+message PermissionRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    Entity entity = 3;
+    PermissionType permission_type = 4;
+    string client_sec = 5;
+}
+
+message SharingRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    Entity entity = 3;
+    PermissionType permission_type = 4;
+    repeated string owner_id = 5;
+    bool cascade = 6;
+    string client_sec = 7;
+    string shared_by = 8;
+}
+
+message SharesFilteringRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    repeated string owner_id = 5;
+    bool cascade = 6;
+    string client_sec = 7;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message EntityTypes {
+    repeated EntityType types = 1;
+}
+
+message PermissionTypes {
+    repeated PermissionType types = 1;
+}
+
+message Entities {
+    repeated Entity entity_array = 1;
+}
+
+message SharedOwners {
+    repeated string owner_ids = 1;
+}
+
+message GetAllDirectSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message GetAllSharingsResponse {
+    repeated SharingMetadata  shared_data = 1;
+}
+
+message SharingMetadata {
+    Entity entity = 1;
+    string owner_id = 2;
+    string owner_type = 3;
+    PermissionType permission = 4;
+    string shared_by = 5;
+}
+
+service SharingService {
+
+
+    rpc createEntityType (EntityTypeRequest) returns (Status);
+    rpc updateEntityType (EntityTypeRequest) returns (Status);
+    rpc deleteEntityType (EntityTypeRequest) returns (Status);
+    rpc getEntityType (EntityTypeRequest) returns (EntityType);
+    rpc getEntityTypes (SearchRequest) returns (EntityTypes);
+
+    rpc createPermissionType (PermissionTypeRequest) returns (Status);
+    rpc updatePermissionType (PermissionTypeRequest) returns (Status);
+    rpc deletePermissionType (PermissionTypeRequest) returns (Status);
+    rpc getPermissionType (PermissionTypeRequest) returns (PermissionType);
+    rpc getPermissionTypes (SearchRequest) returns (PermissionTypes);
+
+    rpc createEntity (EntityRequest) returns (Status);
+    rpc updateEntity (EntityRequest) returns (Status);
+    rpc isEntityExists (EntityRequest) returns (Status);
+    rpc getEntity (EntityRequest) returns (Entity);
+    rpc deleteEntity (EntityRequest) returns (Status);
+    rpc searchEntities (SearchRequest) returns (Entities);
+
+
+
+    rpc getListOfSharedUsers (SharingRequest) returns (SharedOwners);
+    rpc getListOfDirectlySharedUsers (SharingRequest) returns (SharedOwners);
+    rpc getListOfSharedGroups (SharingRequest) returns (SharedOwners);
+    rpc getListOfDirectlySharedGroups (SharingRequest) returns (SharedOwners);
+    rpc getAllDirectSharings (SharingRequest) returns (GetAllDirectSharingsResponse);
+    rpc getAllSharings (SharingRequest) returns (GetAllSharingsResponse);
+
+    rpc shareEntityWithUsers (SharingRequest) returns (Status);
+    rpc shareEntityWithGroups (SharingRequest) returns (Status);
+    rpc revokeEntitySharingFromUsers (SharingRequest) returns (Status);
+    rpc revokeEntitySharingFromGroups (SharingRequest) returns (Status);
+    rpc userHasAccess (SharingRequest) returns (Status);
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantManagementService.proto
new file mode 100644
index 0000000..35e3324
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantManagementService.proto
@@ -0,0 +1,285 @@
+/*
+ * 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.custos.tenant.management.service;
+option go_package = "./pb";
+
+import "google/api/annotations.proto";
+import "TenantProfileService.proto";
+import "google/rpc/error_details.proto";
+import "google/protobuf/empty.proto";
+import "IamAdminService.proto";
+import "FederatedAuthenticationService.proto";
+import "MessagingService.proto";
+import "EmailService.proto";
+
+
+message CreateTenantResponse {
+    string client_id = 1;
+    string client_secret = 2;
+    bool is_activated = 3;
+    double client_id_issued_at = 4;
+    double client_secret_expires_at = 5;
+    string registration_client_uri = 6;
+    string token_endpoint_auth_method = 17;
+    string msg = 7;
+}
+
+message GetTenantResponse {
+    string client_id = 1;
+    string client_name = 2;
+    string requester_email = 3;
+    string admin_first_name = 4;
+    string admin_last_name = 5;
+    string admin_email = 6;
+    repeated string contacts = 7;
+    repeated string redirect_uris = 8;
+    repeated string grant_types = 9;
+    double client_id_issued_at = 10;
+    string client_uri = 11;
+    string scope = 12;
+    string domain = 13;
+    string comment = 14;
+    string logo_uri = 15;
+    string application_type = 16;
+    string jwks_uri = 17;
+    string example_extension_parameter = 18;
+    string tos_uri = 19;
+    string policy_uri = 20;
+    map<string, string> jwks = 21;
+    string software_id = 22;
+    string software_version = 23;
+    string admin_username = 24;
+}
+
+
+message GetTenantRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    org.apache.custos.tenant.profile.service.Tenant tenant = 4;
+    Credentials credentials = 5;
+}
+
+
+message Credentials {
+    string iam_client_id = 1;
+    string iam_client_secret = 2;
+    string ci_logon_client_id = 3;
+    string ci_logon_client_secret = 4;
+    string custos_client_id = 5;
+    string custos_client_secret = 6;
+    double custos_client_id_issued_at = 7;
+    double custos_client_secret_expired_at = 8;
+}
+
+message UpdateTenantRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    Credentials credentials = 3;
+    org.apache.custos.tenant.profile.service.Tenant body = 4;
+}
+
+
+message DeleteTenantRequest {
+    string client_id = 1;
+    int64 tenant_id = 2;
+    Credentials credentials = 3;
+    org.apache.custos.tenant.profile.service.Tenant body = 4;
+}
+
+
+message GetCredentialsRequest {
+    int64 tenant_id = 1;
+}
+
+message GetCredentialsResponse {
+    string iam_client_id = 1;
+    string iam_client_secret = 2;
+    string ci_logon_client_id = 3;
+    string ci_logon_client_secret = 4;
+}
+
+
+message TenantValidationRequest {
+    string client_id = 1;
+    string client_sec = 2;
+
+}
+
+service TenantManagementService {
+
+    rpc createTenant (org.apache.custos.tenant.profile.service.Tenant) returns (CreateTenantResponse) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/oauth2/tenant"
+         };
+    }
+
+    rpc getTenant (GetTenantRequest) returns (org.apache.custos.tenant.profile.service.Tenant) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/oauth2/tenant"
+        };
+    }
+
+    rpc updateTenant (UpdateTenantRequest) returns (org.apache.custos.tenant.profile.service.Tenant) {
+        option (google.api.http) = {
+           put: "/tenant-management/v1.0.0/oauth2/tenant"
+           body: "body"
+        };
+    }
+
+
+    rpc deleteTenant (DeleteTenantRequest) returns (google.protobuf.Empty) {
+        option (google.api.http) = {
+           delete: "/tenant-management/v1.0.0/oauth2/tenant"
+        };
+    }
+
+    rpc validateTenant (TenantValidationRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/tenant/credentials/status"
+        };
+    }
+
+    rpc addTenantRoles (org.apache.custos.iam.service.AddRolesRequest) returns (org.apache.custos.iam.service.AllRoles) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/roles"
+        };
+    }
+
+    rpc getTenantRoles (org.apache.custos.iam.service.GetRolesRequest) returns (org.apache.custos.iam.service.AllRoles) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/roles"
+        };
+    }
+
+    rpc deleteRole (org.apache.custos.iam.service.DeleteRoleRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/tenant-management/v1.0.0/role"
+        };
+    }
+
+    rpc addProtocolMapper (org.apache.custos.iam.service.AddProtocolMapperRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/protocol/mapper"
+        };
+    }
+
+    rpc configureEventPersistence (org.apache.custos.iam.service.EventPersistenceRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/events"
+        };
+    }
+
+    rpc enableMessaging(org.apache.custos.messaging.service.MessageEnablingRequest) returns (org.apache.custos.messaging.service.MessageEnablingResponse) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/messaging"
+        };
+    }
+
+
+    rpc updateTenantStatus (org.apache.custos.tenant.profile.service.UpdateStatusRequest) returns (org.apache.custos.tenant.profile.service.UpdateStatusResponse) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/status"
+        };
+    }
+
+    rpc getAllTenants (org.apache.custos.tenant.profile.service.GetTenantsRequest) returns (org.apache.custos.tenant.profile.service.GetAllTenantsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/tenants"
+        };
+    }
+
+    rpc getChildTenants (org.apache.custos.tenant.profile.service.GetTenantsRequest) returns (org.apache.custos.tenant.profile.service.GetAllTenantsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/child/tenants"
+        };
+    }
+
+    rpc getAllTenantsForUser (org.apache.custos.tenant.profile.service.GetAllTenantsForUserRequest) returns (org.apache.custos.tenant.profile.service.GetAllTenantsForUserResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/tenants/{requesterEmail}"
+        };
+    }
+    rpc getTenantStatusUpdateAuditTrail (org.apache.custos.tenant.profile.service.GetAuditTrailRequest) returns (org.apache.custos.tenant.profile.service.GetStatusUpdateAuditTrailResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/audit/status/{tenantId}"
+        };
+    }
+    rpc getTenantAttributeUpdateAuditTrail (org.apache.custos.tenant.profile.service.GetAuditTrailRequest) returns (org.apache.custos.tenant.profile.service.GetAttributeUpdateAuditTrailResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/audit/attributes/{tenantId}"
+        };
+    }
+
+
+    rpc addToCache (org.apache.custos.federated.authentication.service.CacheManipulationRequest) returns (org.apache.custos.federated.authentication.service.Status) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/cache/institutions/CILogon"
+        };
+
+    }
+    rpc removeFromCache (org.apache.custos.federated.authentication.service.CacheManipulationRequest) returns (org.apache.custos.federated.authentication.service.Status) {
+        option (google.api.http) = {
+           delete: "/tenant-management/v1.0.0/cache/institutions/CILogon"
+        };
+
+    }
+    rpc getFromCache (org.apache.custos.federated.authentication.service.CacheManipulationRequest) returns (org.apache.custos.federated.authentication.service.GetInstitutionsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/cache/institutions/CILogon"
+        };
+
+    }
+    rpc getInstitutions (org.apache.custos.federated.authentication.service.CacheManipulationRequest) returns (org.apache.custos.federated.authentication.service.GetInstitutionsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/institutions/CILogon"
+        };
+    }
+
+
+    rpc enableEmail(org.apache.custos.messaging.email.service.EmailEnablingRequest) returns (org.apache.custos.messaging.email.service.EmailTemplate) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/email/activation"
+        };
+    }
+
+    rpc disableEmail(org.apache.custos.messaging.email.service.EmailDisablingRequest) returns (org.apache.custos.messaging.email.service.Status) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/email/deactivation"
+        };
+    }
+
+    rpc getEmailTemplates(org.apache.custos.messaging.email.service.FetchEmailTemplatesRequest) returns (org.apache.custos.messaging.email.service.FetchEmailTemplatesResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/email/templates"
+        };
+    }
+
+    rpc getEmailFriendlyEvents(org.apache.custos.messaging.email.service.FetchEmailFriendlyEvents) returns (org.apache.custos.messaging.email.service.FetchEmailFriendlyEventsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/email/events"
+        };
+    }
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantProfileService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantProfileService.proto
new file mode 100644
index 0000000..b84dbfe
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/TenantProfileService.proto
@@ -0,0 +1,174 @@
+/*
+ * 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.custos.tenant.profile.service;
+option go_package = "./pb";
+
+message Tenant {
+    int64 tenant_id = 1;
+    string client_name = 2;
+    string requester_email = 4;
+    string admin_first_name = 5;
+    string admin_last_name = 6;
+    string admin_email = 7;
+    string admin_username = 8;
+    string admin_password = 9;
+    TenantStatus tenant_status = 10;
+    repeated string contacts = 11;
+    repeated string redirect_uris = 12;
+    string client_uri = 13;
+    string scope = 14;
+    string domain = 15;
+    string comment = 16;
+    string logo_uri = 17;
+    int64 parent_tenant_id = 18;
+    string application_type = 19;
+    string token_endpoint_auth_method = 20;
+    string jwks_uri = 21;
+    string example_extension_parameter = 22;
+    string tos_uri = 23;
+    string policy_uri = 24;
+    map<string, string> jwks = 25;
+    string software_id = 26;
+    string software_version = 27;
+    int64 refesh_token_lifetime = 28;
+    string client_id = 29;
+    string parent_client_id = 30;
+}
+
+enum TenantStatus {
+    UNKNOWN = 0;
+    REQUESTED = 1;
+    APPROVED = 2;
+    DENIED = 3;
+    CANCELLED = 4;
+    ACTIVE = 5;
+    DEACTIVATED = 6;
+}
+
+enum TenantType {
+    UNSPECIFIED = 0;
+    ADMIN = 1;
+}
+
+message TenantAttributeUpdateMetadata {
+    string updated_attribute = 1;
+    string updated_attributeValue = 2;
+    string updated_by = 3;
+    string updated_at = 4;
+}
+
+message TenantStatusUpdateMetadata {
+    TenantStatus updated_status = 1;
+    string updated_by = 2;
+    string updated_at = 3;
+}
+
+
+message AddTenantResponse {
+    int64 tenant_id = 1;
+}
+
+
+message UpdateTenantResponse {
+    Tenant tenant = 1;
+
+}
+
+message GetTenantRequest {
+    int64 tenant_id = 1;
+}
+
+message GetTenantResponse {
+    Tenant tenant = 1;
+}
+
+
+message GetAllTenantsResponse {
+    repeated Tenant tenant = 1;
+    int32 total_num_of_tenants =2;
+}
+
+message IsTenantExistRequest {
+    int64 tenant_id = 1;
+}
+
+message IsTenantExistResponse {
+    bool is_exist = 1;
+}
+
+message GetAllTenantsForUserRequest {
+    string requester_email = 1;
+}
+
+message GetAllTenantsForUserResponse {
+    repeated Tenant tenant = 1;
+}
+
+message UpdateStatusRequest {
+    string client_id = 1;
+    TenantStatus status = 2;
+    string updated_by = 3;
+    int64 tenant_id = 4;
+    bool super_tenant = 5;
+    string access_token = 6;
+}
+
+message UpdateStatusResponse {
+    int64 tenant_id = 1;
+    TenantStatus status = 2;
+}
+
+message GetAuditTrailRequest {
+    int64 tenant_id = 1;
+}
+
+message GetStatusUpdateAuditTrailResponse {
+    repeated TenantStatusUpdateMetadata metadata = 1;
+}
+
+message GetAttributeUpdateAuditTrailResponse {
+    repeated TenantAttributeUpdateMetadata metadata = 2;
+}
+
+message GetTenantsRequest {
+ int32 offset = 1;
+ int32 limit = 2;
+ int64 parent_id = 3;
+ TenantStatus status = 4;
+ string requester_email = 5;
+ string parent_client_id = 6;
+ TenantType type= 7;
+}
+
+service TenantProfileService {
+    rpc addTenant (Tenant) returns (Tenant);
+    rpc updateTenant (Tenant) returns (Tenant);
+    rpc getTenant (GetTenantRequest) returns (GetTenantResponse);
+    rpc updateTenantStatus (UpdateStatusRequest) returns (UpdateStatusResponse);
+    rpc getAllTenants (GetTenantsRequest) returns (GetAllTenantsResponse);
+    rpc isTenantExist (IsTenantExistRequest) returns (IsTenantExistResponse);
+    rpc getAllTenantsForUser (GetAllTenantsForUserRequest) returns (GetAllTenantsForUserResponse);
+    rpc getTenantStatusUpdateAuditTrail (GetAuditTrailRequest) returns (GetStatusUpdateAuditTrailResponse);
+    rpc getTenantAttributeUpdateAuditTrail (GetAuditTrailRequest) returns (GetAttributeUpdateAuditTrailResponse);
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserManagementService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserManagementService.proto
new file mode 100644
index 0000000..b028e65
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserManagementService.proto
@@ -0,0 +1,264 @@
+/*
+ * 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.custos.user.management.service;
+option go_package = "./pb";
+import "google/api/annotations.proto";
+import "UserProfileService.proto";
+import "IamAdminService.proto";
+
+
+message UserProfileRequest {
+    org.apache.custos.user.profile.service.UserProfile user_profile = 1;
+    string client_id = 2;
+    int64 tenant_id = 3;
+    string access_token = 4;
+    string client_secret = 5;
+    string performed_by = 6;
+}
+
+message GetUserRequest {
+    string username = 1;
+    org.apache.custos.iam.service.UserSearchRequest user_search_request = 2;
+}
+
+message GetUsersRequest {
+    int64 tenant_id = 1;
+    string email = 2;
+    string username = 3;
+    int32 offset = 4;
+    int32 limit = 5;
+    string search = 6;
+    string iam_client_id = 7;
+    string iam_client_secret = 8;
+}
+
+message ResetPassword {
+    int64 tenant_id = 1;
+    string access_token = 2;
+    string username = 3;
+    string password = 4;
+    string iam_client_id = 5;
+    string iam_client_secret = 6;
+}
+
+message ResetPasswordRequest {
+    ResetPassword password_metadata = 1;
+}
+
+message LinkUserProfileRequest {
+    string current_username = 1;
+    string previous_username = 2;
+    repeated string linking_attributes = 3;
+    int64 tenantId = 4;
+    string iam_client_id = 5;
+    string iam_client_secret = 6;
+    string access_token = 7;
+    string performed_by = 8;
+}
+
+message SynchronizeUserDBRequest {
+    int64 tenant_id = 2;
+    string client_id = 4;
+}
+
+service UserManagementService {
+
+    rpc registerUser (org.apache.custos.iam.service.RegisterUserRequest) returns (org.apache.custos.iam.service.RegisterUserResponse) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/user"
+           body: "user"
+         };
+    }
+
+    rpc registerAndEnableUsers (org.apache.custos.iam.service.RegisterUsersRequest) returns (org.apache.custos.iam.service.RegisterUsersResponse) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/users"
+           body: "users"
+         };
+    }
+
+    rpc addUserAttributes (org.apache.custos.iam.service.AddUserAttributesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/attributes"
+         };
+    }
+
+    rpc deleteUserAttributes (org.apache.custos.iam.service.DeleteUserAttributeRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/attributes"
+         };
+    }
+
+    rpc enableUser (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.UserRepresentation) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/user/activation"
+           body: "user"
+         };
+    }
+
+    rpc disableUser (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.UserRepresentation) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/user/deactivation"
+           body: "user"
+         };
+    }
+
+    rpc grantAdminPrivileges (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/user/admin"
+           body: "user"
+         };
+    }
+
+    rpc removeAdminPrivileges (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/user/admin"
+           body: "user"
+         };
+    }
+
+
+    rpc deleteExternalIDPsOfUsers (org.apache.custos.iam.service.DeleteExternalIDPsRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/users/federatedIDPs"
+         };
+    }
+
+    rpc addRolesToUsers (org.apache.custos.iam.service.AddUserRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/users/roles"
+         };
+    }
+
+    rpc isUserEnabled (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/user/activation/status"
+         };
+
+    }
+
+    rpc isUsernameAvailable (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/user/availability"
+         };
+    }
+
+
+    rpc getUser (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.UserRepresentation) {
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/user"
+         };
+
+    }
+
+    rpc findUsers (org.apache.custos.iam.service.FindUsersRequest) returns (org.apache.custos.iam.service.FindUsersResponse) {
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/users"
+         };
+
+    }
+
+    rpc resetPassword (org.apache.custos.iam.service.ResetUserPassword) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           put: "/user-management/v1.0.0/user/password"
+         };
+
+    }
+
+
+    rpc deleteUser (org.apache.custos.iam.service.UserSearchRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/user"
+           body: "user"
+         };
+
+    }
+
+
+    rpc deleteUserRoles (org.apache.custos.iam.service.DeleteUserRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/user/roles"
+         };
+    }
+
+
+    rpc updateUserProfile (UserProfileRequest) returns (org.apache.custos.user.profile.service.UserProfile) {
+
+        option (google.api.http) = {
+           put: "/user-management/v1.0.0/user/profile"
+           body: "user_profile"
+         };
+    }
+
+    rpc getUserProfile (UserProfileRequest) returns (org.apache.custos.user.profile.service.UserProfile) {
+
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/user/profile"
+         };
+    }
+    rpc deleteUserProfile (UserProfileRequest) returns (org.apache.custos.user.profile.service.UserProfile) {
+
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/user/profile"
+         };
+
+    }
+    rpc getAllUserProfilesInTenant (UserProfileRequest) returns (org.apache.custos.user.profile.service.GetAllUserProfilesResponse) {
+
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/users/profile"
+         };
+
+
+    }
+
+    rpc linkUserProfile (LinkUserProfileRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/user/profile/mapper"
+         };
+
+
+    }
+
+
+    rpc getUserProfileAuditTrails (org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest) returns (org.apache.custos.user.profile.service.GetUpdateAuditTrailResponse) {
+
+        option (google.api.http) = {
+           get: "/user-management/v1.0.0/user/profile/audit"
+         };
+
+    }
+
+    rpc synchronizeUserDBs (SynchronizeUserDBRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/user-management/v1.0.0/db/synchronize"
+        };
+    }
+
+}
+
+
+
+
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto
new file mode 100644
index 0000000..94711b1
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos/UserProfileService.proto
@@ -0,0 +1,213 @@
+/*
+ * 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.custos.user.profile.service;
+option go_package = "./pb";
+
+enum UserStatus {
+    ACTIVE = 0;
+    CONFIRMED = 1;
+    APPROVED = 2;
+    DELETED = 3;
+    DUPLICATE = 4;
+    GRACE_PERIOD = 5;
+    INVITED = 6;
+    DENIED = 7;
+    PENDING = 8;
+    PENDING_APPROVAL = 9;
+    PENDING_CONFIRMATION = 10;
+    SUSPENDED = 11;
+    DECLINED = 12;
+    EXPIRED = 13;
+}
+
+enum DefaultGroupMembershipTypes {
+    OWNER = 0;
+    ADMIN = 1;
+    MEMBER = 2;
+}
+
+enum UserTypes {
+    END_USER = 0;
+    COMMUNITY = 1;
+}
+
+
+message UserProfile {
+    string username = 1;
+    string email = 2;
+    string first_name = 3;
+    string last_name = 4;
+    int64 created_at = 5;
+    UserStatus status = 6;
+    repeated UserAttribute attributes = 7;
+    repeated string client_roles = 8;
+    repeated string realm_roles = 9;
+    int64 last_modified_at = 10;
+    UserTypes type = 11;
+    string membership_type = 12;
+}
+
+message UserProfileRequest {
+    int64 tenantId = 1;
+    UserProfile profile = 2;
+    string performed_by = 3;
+    string client_id = 4;
+}
+
+
+message UserAttribute {
+    int64 id = 1;
+    string key = 2;
+    repeated string values = 3;
+}
+
+
+message GetAllUserProfilesResponse {
+    repeated UserProfile profiles = 1;
+}
+
+message GetUpdateAuditTrailRequest {
+    int64 tenantId = 1;
+    string username = 2;
+}
+
+message UserProfileAttributeUpdateMetadata {
+    string updated_attribute = 1;
+    string updated_attribute_value = 2;
+    string updated_by = 3;
+    string updated_at = 4;
+}
+
+message UserProfileStatusUpdateMetadata {
+    UserStatus updated_status = 1;
+    string updated_by = 2;
+    string updated_at = 3;
+}
+
+message GetUpdateAuditTrailResponse {
+    repeated UserProfileAttributeUpdateMetadata attribute_audit = 1;
+    repeated UserProfileStatusUpdateMetadata status_audit = 2;
+}
+
+message GroupRequest {
+    int64 tenant_id = 1;
+    Group group = 2;
+    string performed_by = 3;
+    string client_id = 4;
+    string membership_type = 5;
+    string id = 6;
+    string client_sec =7;
+
+}
+
+message GetAllGroupsResponse {
+    repeated Group groups = 1;
+}
+message Group {
+    string id = 1;
+    string name = 2;
+    repeated string realm_roles = 3;
+    repeated string client_roles = 4;
+    string parent_id = 5;
+    int64 created_time = 6;
+    int64 last_modified_time = 7;
+    repeated GroupAttribute attributes = 8;
+    string description = 9;
+    string owner_id = 10;
+}
+
+message GroupAttribute {
+    int64 id = 1;
+    string key = 2;
+    repeated string value = 3;
+}
+
+message GroupMembership {
+    int64 tenant_id = 1;
+    string group_id = 2;
+    string username = 3;
+    string type = 4;
+    string clientId = 5;
+    string clientSec = 6;
+}
+
+message GroupToGroupMembership {
+    int64 tenant_id = 1;
+    string parent_id = 2;
+    string child_id = 3;
+    string client_id = 4;
+}
+
+message Status {
+    bool status = 1;
+}
+
+message UserGroupMembershipTypeRequest {
+    string type = 1;
+    int64 tenant_id = 2;
+    string client_id = 3;
+}
+
+
+
+
+service UserProfileService {
+    rpc createUserProfile (UserProfileRequest) returns (UserProfile);
+    rpc updateUserProfile (UserProfileRequest) returns (UserProfile);
+    rpc getUserProfile (UserProfileRequest) returns (UserProfile);
+    rpc deleteUserProfile (UserProfileRequest) returns (UserProfile);
+    rpc getAllUserProfilesInTenant (UserProfileRequest) returns (GetAllUserProfilesResponse);
+    rpc findUserProfilesByAttributes (UserProfileRequest) returns (GetAllUserProfilesResponse);
+
+    rpc createGroup (GroupRequest) returns (Group);
+    rpc updateGroup (GroupRequest) returns (Group);
+    rpc deleteGroup (GroupRequest) returns (Group);
+    rpc getGroup (GroupRequest) returns (Group);
+    rpc getAllGroups (GroupRequest) returns (GetAllGroupsResponse);
+
+
+    rpc getUserProfileAuditTrails (GetUpdateAuditTrailRequest) returns (GetUpdateAuditTrailResponse);
+
+    rpc addUserToGroup (GroupMembership) returns (Status);
+    rpc removeUserFromGroup (GroupMembership) returns (Status);
+    rpc addChildGroupToParentGroup (GroupToGroupMembership) returns (Status);
+    rpc removeChildGroupFromParentGroup (GroupToGroupMembership) returns (Status);
+
+    rpc getAllGroupsOfUser (UserProfileRequest) returns (GetAllGroupsResponse);
+    rpc getAllParentGroupsOfGroup (GroupRequest) returns (GetAllGroupsResponse);
+
+    rpc addUserGroupMembershipType (UserGroupMembershipTypeRequest) returns (Status);
+    rpc removeUserGroupMembershipType (UserGroupMembershipTypeRequest) returns (Status);
+
+    rpc getAllChildUsers(GroupRequest) returns (GetAllUserProfilesResponse);
+    rpc getAllChildGroups(GroupRequest) returns (GetAllGroupsResponse);
+    rpc changeUserMembershipType (GroupMembership) returns (Status);
+    rpc hasAccess(GroupMembership) returns (Status);
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/pythonStubGenerator.sh b/custos-integration-services/custos-integration-services-swagger/src/main/resources/pythonStubGenerator.sh
new file mode 100644
index 0000000..684139d
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/pythonStubGenerator.sh
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+
+for file in protos/*; do
+    fileName="$(basename "$file")"
+    python3 -m grpc_tools.protoc -I/Users/isururanawaka/Documents/GOOGLE_APIS/googleapis -Iprotos  --python_out=. --grpc_python_out=. protos/"$fileName"
+    echo $fileName
+done
\ No newline at end of file
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/agent-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/agent-management-service/swagger.json
new file mode 100644
index 0000000..1a6dc1c
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/agent-management-service/swagger.json
@@ -0,0 +1,830 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "AgentManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "AgentManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/agent-management/v1.0.0/agent": {
+      "post": {
+        "operationId": "AgentManagementService_registerAndEnableAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAgentRegistrationResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserRepresentation"
+            }
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agent/activation/{id}": {
+      "post": {
+        "operationId": "AgentManagementService_enableAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agent/attributes": {
+      "delete": {
+        "operationId": "AgentManagementService_deleteAgentAttributes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "users",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "agents",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "AgentManagementService_addAgentAttributes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agent/deactivation/{id}": {
+      "post": {
+        "operationId": "AgentManagementService_disableAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agent/roles": {
+      "delete": {
+        "operationId": "AgentManagementService_deleteRolesFromAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "AgentManagementService_addRolesToAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agent/{id}": {
+      "get": {
+        "operationId": "AgentManagementService_getAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAgent"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "AgentManagementService_deleteAgent",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/agents": {
+      "get": {
+        "operationId": "AgentManagementService_getAllAgents",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllResourcesResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "USER",
+              "AGENT"
+            ],
+            "default": "USER"
+          }
+        ],
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/db/synchronize": {
+      "post": {
+        "operationId": "AgentManagementService_synchronizeAgentDBs",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/enable": {
+      "post": {
+        "operationId": "AgentManagementService_enableAgents",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/protocol/mapper": {
+      "post": {
+        "operationId": "AgentManagementService_addProtocolMapper",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/roles": {
+      "post": {
+        "operationId": "AgentManagementService_addRolesToClient",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    },
+    "/agent-management/v1.0.0/token/configuration": {
+      "post": {
+        "operationId": "AgentManagementService_configureAgentClient",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "AgentManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "serviceAgent": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserAttribute"
+          }
+        },
+        "isEnabled": {
+          "type": "boolean"
+        },
+        "creation_time": {
+          "type": "number",
+          "format": "double"
+        },
+        "last_modified_at": {
+          "type": "number",
+          "format": "double"
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "serviceAgentRegistrationResponse": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "secret": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceClaimJSONTypes": {
+      "type": "string",
+      "enum": [
+        "STRING",
+        "LONG",
+        "INTEGER",
+        "BOOLEAN",
+        "JSON"
+      ],
+      "default": "STRING"
+    },
+    "serviceGetAllResourcesResponse": {
+      "type": "object",
+      "properties": {
+        "agents": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceAgent"
+          }
+        },
+        "users": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserRepresentation"
+          }
+        }
+      }
+    },
+    "serviceMapperTypes": {
+      "type": "string",
+      "enum": [
+        "USER_ATTRIBUTE",
+        "USER_REALM_ROLE",
+        "USER_CLIENT_ROLE"
+      ],
+      "default": "USER_ATTRIBUTE"
+    },
+    "serviceOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceResourceTypes": {
+      "type": "string",
+      "enum": [
+        "USER",
+        "AGENT"
+      ],
+      "default": "USER"
+    },
+    "serviceRoleRepresentation": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "composite": {
+          "type": "boolean"
+        },
+        "id": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceUserAttribute": {
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string"
+        },
+        "values": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "serviceUserRepresentation": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "password": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "temporary_password": {
+          "type": "boolean"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserAttribute"
+          }
+        },
+        "state": {
+          "type": "string"
+        },
+        "creation_time": {
+          "type": "number",
+          "format": "double"
+        },
+        "last_login_at": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/cluster-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/cluster-management-service/swagger.json
new file mode 100644
index 0000000..11ea7fa
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/cluster-management-service/swagger.json
@@ -0,0 +1,59 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "ClusterManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "ClusterManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {},
+  "definitions": {
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "serviceGetServerCertificateResponse": {
+      "type": "object",
+      "properties": {
+        "certificate": {
+          "type": "string"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/group-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/group-management-service/swagger.json
new file mode 100644
index 0000000..0758adf
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/group-management-service/swagger.json
@@ -0,0 +1,2119 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "GroupManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "GroupManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/group-management/v1.0.0/group": {
+      "get": {
+        "operationId": "GroupManagementService_findGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroup"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_createGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroup"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/group/membership": {
+      "delete": {
+        "operationId": "GroupManagementService_removeChildGroupFromParentGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "child_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_addChildGroupToParentGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/group/{id}": {
+      "delete": {
+        "operationId": "GroupManagementService_deleteGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "GroupManagementService_updateGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroup"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/groups": {
+      "get": {
+        "operationId": "GroupManagementService_getAllGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/groups/memberships": {
+      "get": {
+        "operationId": "GroupManagementService_getAllParentGroupsOfGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/groups/memberships/child": {
+      "get": {
+        "operationId": "GroupManagementService_getAllChildGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/keycloak/group": {
+      "get": {
+        "operationId": "GroupManagementService_findKeycloakGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroupRepresentation"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.ownerId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/keycloak/group/{id}": {
+      "delete": {
+        "operationId": "GroupManagementService_deleteKeycloakGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.ownerId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "GroupManagementService_updateKeycloakGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroupRepresentation"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/keycloak/groups": {
+      "get": {
+        "operationId": "GroupManagementService_getAllKeycloakGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.ownerId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_createKeycloakGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/keycloak/user/group/membership": {
+      "delete": {
+        "operationId": "GroupManagementService_removeUserFromKeycloakGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "accessToken",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_addUserToKeycloakGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/user/group/access": {
+      "get": {
+        "operationId": "GroupManagementService_hasAccess",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/user/group/membership": {
+      "delete": {
+        "operationId": "GroupManagementService_removeUserFromGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientId",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "clientSec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_addUserToGroup",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "GroupManagementService_changeUserMembershipType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/user/group/membership/type": {
+      "delete": {
+        "operationId": "GroupManagementService_removeUserGroupMembershipType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "GroupManagementService_addGroupMembershipType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/profileserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/user/group/memberships": {
+      "get": {
+        "operationId": "GroupManagementService_getAllGroupsOfUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllGroupsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "profile.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "profile.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "profile.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "profile.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "profile.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "profile.status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "ACTIVE",
+              "CONFIRMED",
+              "APPROVED",
+              "DELETED",
+              "DUPLICATE",
+              "GRACE_PERIOD",
+              "INVITED",
+              "DENIED",
+              "PENDING",
+              "PENDING_APPROVAL",
+              "PENDING_CONFIRMATION",
+              "SUSPENDED",
+              "DECLINED",
+              "EXPIRED"
+            ],
+            "default": "ACTIVE"
+          },
+          {
+            "name": "profile.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "profile.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "profile.last_modified_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "profile.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "END_USER",
+              "COMMUNITY"
+            ],
+            "default": "END_USER"
+          },
+          {
+            "name": "profile.membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    },
+    "/group-management/v1.0.0/user/group/memberships/child": {
+      "get": {
+        "operationId": "GroupManagementService_getAllChildUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllUserProfilesResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "group.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.created_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.last_modified_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "group.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "group.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "GroupManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "custosiamserviceUserAttribute": {
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string"
+        },
+        "values": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "profileserviceStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "serviceDefaultGroupMembershipTypes": {
+      "type": "string",
+      "enum": [
+        "OWNER",
+        "ADMIN",
+        "MEMBER"
+      ],
+      "default": "OWNER"
+    },
+    "serviceGetAllGroupsResponse": {
+      "type": "object",
+      "properties": {
+        "groups": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceGroup"
+          }
+        }
+      }
+    },
+    "serviceGetAllUserProfilesResponse": {
+      "type": "object",
+      "properties": {
+        "profiles": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserProfile"
+          }
+        }
+      }
+    },
+    "serviceGroup": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "parent_id": {
+          "type": "string"
+        },
+        "created_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "last_modified_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceGroupAttribute"
+          }
+        },
+        "description": {
+          "type": "string"
+        },
+        "owner_id": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceGroupAttribute": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "key": {
+          "type": "string"
+        },
+        "value": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "serviceGroupRepresentation": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "id": {
+          "type": "string"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/custosiamserviceUserAttribute"
+          }
+        },
+        "users": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserRepresentation"
+          }
+        },
+        "sub_groups": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceGroupRepresentation"
+          }
+        },
+        "description": {
+          "type": "string"
+        },
+        "ownerId": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceGroupsResponse": {
+      "type": "object",
+      "properties": {
+        "groups": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceGroupRepresentation"
+          }
+        }
+      }
+    },
+    "serviceOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceUserProfile": {
+      "type": "object",
+      "properties": {
+        "username": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/serviceUserStatus"
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/userprofileserviceUserAttribute"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "last_modified_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "type": {
+          "$ref": "#/definitions/serviceUserTypes"
+        },
+        "membership_type": {
+          "$ref": "#/definitions/serviceDefaultGroupMembershipTypes"
+        }
+      }
+    },
+    "serviceUserRepresentation": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "password": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "temporary_password": {
+          "type": "boolean"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/custosiamserviceUserAttribute"
+          }
+        },
+        "state": {
+          "type": "string"
+        },
+        "creation_time": {
+          "type": "number",
+          "format": "double"
+        },
+        "last_login_at": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    },
+    "serviceUserStatus": {
+      "type": "string",
+      "enum": [
+        "ACTIVE",
+        "CONFIRMED",
+        "APPROVED",
+        "DELETED",
+        "DUPLICATE",
+        "GRACE_PERIOD",
+        "INVITED",
+        "DENIED",
+        "PENDING",
+        "PENDING_APPROVAL",
+        "PENDING_CONFIRMATION",
+        "SUSPENDED",
+        "DECLINED",
+        "EXPIRED"
+      ],
+      "default": "ACTIVE"
+    },
+    "serviceUserTypes": {
+      "type": "string",
+      "enum": [
+        "END_USER",
+        "COMMUNITY"
+      ],
+      "default": "END_USER"
+    },
+    "userprofileserviceUserAttribute": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "key": {
+          "type": "string"
+        },
+        "value": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/identity-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/identity-management-service/swagger.json
new file mode 100644
index 0000000..e172c30
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/identity-management-service/swagger.json
@@ -0,0 +1,659 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "IdentityManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "IdentityManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/identity-management/v1.0.0/.well-known/openid-configuration": {
+      "get": {
+        "operationId": "IdentityManagementService_getOIDCConfiguration",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "type": "object"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/account/token": {
+      "get": {
+        "operationId": "IdentityManagementService_getUserManagementServiceAccountAccessToken",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAuthToken"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/agent/authentication/status": {
+      "post": {
+        "operationId": "IdentityManagementService_isAgentAuthenticated",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceIsAuthenticatedResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceAuthToken"
+            }
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/agent/logout/{client_id}": {
+      "post": {
+        "operationId": "IdentityManagementService_endAgentSession",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/custosidentityserviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/custosidentityserviceEndSessionRequest"
+            }
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/agent/token/{client_id}": {
+      "post": {
+        "operationId": "IdentityManagementService_getAgentToken",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "type": "object"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/authenticate": {
+      "post": {
+        "operationId": "IdentityManagementService_authenticate",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAuthToken"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/authenticate/status": {
+      "get": {
+        "operationId": "IdentityManagementService_isAuthenticated",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceIsAuthenticatedResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/authorize": {
+      "get": {
+        "operationId": "IdentityManagementService_authorize",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/identitymanagementserviceAuthorizationResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "redirect_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "response_type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "scope",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "state",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/credentials": {
+      "get": {
+        "operationId": "IdentityManagementService_getCredentials",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceCredentials"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id_issued_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          },
+          {
+            "name": "credentials.custos_client_secret_expired_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/token": {
+      "post": {
+        "operationId": "IdentityManagementService_token",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "type": "object"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/user": {
+      "get": {
+        "operationId": "IdentityManagementService_getUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUser"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    },
+    "/identity-management/v1.0.0/user/logout": {
+      "post": {
+        "operationId": "IdentityManagementService_endUserSession",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/custosidentityserviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/custosidentityserviceEndSessionRequest"
+            }
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "IdentityManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "custosidentityserviceEndSessionRequest": {
+      "type": "object",
+      "properties": {
+        "client_id": {
+          "type": "string"
+        },
+        "client_secret": {
+          "type": "string"
+        },
+        "tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "refresh_token": {
+          "type": "string"
+        }
+      }
+    },
+    "custosidentityserviceOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "identitymanagementserviceAuthorizationResponse": {
+      "type": "object",
+      "properties": {
+        "loginURI": {
+          "type": "string"
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string",
+          "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n  value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n  URL, or have them precompiled into a binary to avoid any\n  lookup. Therefore, binary compatibility needs to be preserved\n  on changes to types. (Use versioned type names to manage\n  breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
+        },
+        "value": {
+          "type": "string",
+          "format": "byte",
+          "description": "Must be a valid serialized protocol buffer of the above specified type."
+        }
+      },
+      "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n    Foo foo = ...;\n    Any any;\n    any.PackFrom(foo);\n    ...\n    if (any.UnpackTo(\u0026foo)) {\n      ...\n    }\n\nExample 2: Pack and unpack a message in Java.\n\n    Foo foo = ...;\n    Any any = Any.pack(foo);\n    ...\n    if (any.is(Foo.class)) {\n      foo = any.unpack(Foo.class);\n    }\n\n Example 3: Pack and unpack a message in Python.\n\n    foo = Foo(...)\n    any = Any()\n    any.Pack(foo)\n    ...\n    if any.Is(Foo.DESCRIPTOR):\n      any.Unpack(foo)\n      ...\n\n Example 4: Pack and unpack a message in Go\n\n     foo := \u0026pb.Foo{...}\n     any, err := ptypes.MarshalAny(foo)\n     ...\n     foo := \u0026pb.Foo{}\n     if err := ptypes.UnmarshalAny(any, foo); err != nil {\n       ...\n     }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n    package google.profile;\n    message Person {\n      string first_name = 1;\n      string last_name = 2;\n    }\n\n    {\n      \"@type\": \"type.googleapis.com/google.profile.Person\",\n      \"firstName\": \u003cstring\u003e,\n      \"lastName\": \u003cstring\u003e\n    }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n    {\n      \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n      \"value\": \"1.212s\"\n    }"
+    },
+    "protobufNullValue": {
+      "type": "string",
+      "enum": [
+        "NULL_VALUE"
+      ],
+      "default": "NULL_VALUE",
+      "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value."
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "serviceAuthToken": {
+      "type": "object",
+      "properties": {
+        "access_token": {
+          "type": "string"
+        },
+        "claims": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceClaim"
+          }
+        }
+      }
+    },
+    "serviceClaim": {
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceCredentials": {
+      "type": "object",
+      "properties": {
+        "iam_client_id": {
+          "type": "string"
+        },
+        "iam_client_secret": {
+          "type": "string"
+        },
+        "ci_logon_client_id": {
+          "type": "string"
+        },
+        "ci_logon_client_secret": {
+          "type": "string"
+        },
+        "custos_client_id": {
+          "type": "string"
+        },
+        "custos_client_secret": {
+          "type": "string"
+        },
+        "custos_client_id_issued_at": {
+          "type": "number",
+          "format": "double"
+        },
+        "custos_client_secret_expired_at": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    },
+    "serviceIsAuthenticatedResponse": {
+      "type": "object",
+      "properties": {
+        "authenticated": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceUser": {
+      "type": "object",
+      "properties": {
+        "sub": {
+          "type": "string"
+        },
+        "full_name": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "email_address": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/log-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/log-management-service/swagger.json
new file mode 100644
index 0000000..4158f8d
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/log-management-service/swagger.json
@@ -0,0 +1,245 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "LogManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "LogManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/log-management/v1.0.0/logs": {
+      "get": {
+        "operationId": "LogManagementService_getLogEvents",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceLogEvents"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "start_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "end_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "remote_ip",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "service_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "event_type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "LogManagementService"
+        ]
+      }
+    },
+    "/log-management/v1.0.0/status": {
+      "get": {
+        "operationId": "LogManagementService_isLogEnabled",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/loggingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "LogManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "LogManagementService_enable",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/loggingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "LogManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "loggingserviceStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "serviceLogEvent": {
+      "type": "object",
+      "properties": {
+        "created_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "service_name": {
+          "type": "string"
+        },
+        "event_type": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        },
+        "client_id": {
+          "type": "string"
+        },
+        "tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "external_ip": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceLogEvents": {
+      "type": "object",
+      "properties": {
+        "events": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceLogEvent"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/resource-secret-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/resource-secret-management-service/swagger.json
new file mode 100644
index 0000000..3bb8086
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/resource-secret-management-service/swagger.json
@@ -0,0 +1,1792 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "ResourceSecretManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "ResourceSecretManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/resource-secret-management/v1.0.0/openid-connect/certs": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getJWKS",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "type": "object"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getSecret",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSecretMetadata"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "metadata.owner_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "TENANT_USER",
+              "CUSTOS",
+              "TENANT"
+            ],
+            "default": "TENANT_USER"
+          },
+          {
+            "name": "metadata.resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "metadata.source",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "KUBE",
+              "LOCAL",
+              "EXTERNAL",
+              "LETSENCRYPT"
+            ],
+            "default": "KUBE"
+          },
+          {
+            "name": "metadata.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SSH",
+              "PASSWORD",
+              "X509_CERTIFICATE",
+              "RAW_DATA",
+              "KV",
+              "CREDENTIAL_MAP"
+            ],
+            "default": "SSH"
+          },
+          {
+            "name": "metadata.tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.persisted_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/certificate": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getCertificateCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceCertificateCredential"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "ResourceSecretManagementService_deleteCertificateCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "ResourceSecretManagementService_addCertificateCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAddResourceCredentialResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/kv": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getKVCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceKVCredential"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "key",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.owner_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "TENANT_USER",
+              "CUSTOS",
+              "TENANT"
+            ],
+            "default": "TENANT_USER"
+          },
+          {
+            "name": "metadata.resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "metadata.source",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "KUBE",
+              "LOCAL",
+              "EXTERNAL",
+              "LETSENCRYPT"
+            ],
+            "default": "KUBE"
+          },
+          {
+            "name": "metadata.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SSH",
+              "PASSWORD",
+              "X509_CERTIFICATE",
+              "RAW_DATA",
+              "KV",
+              "CREDENTIAL_MAP"
+            ],
+            "default": "SSH"
+          },
+          {
+            "name": "metadata.tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.persisted_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "ResourceSecretManagementService_deleteKVCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "key",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.owner_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "TENANT_USER",
+              "CUSTOS",
+              "TENANT"
+            ],
+            "default": "TENANT_USER"
+          },
+          {
+            "name": "metadata.resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "metadata.source",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "KUBE",
+              "LOCAL",
+              "EXTERNAL",
+              "LETSENCRYPT"
+            ],
+            "default": "KUBE"
+          },
+          {
+            "name": "metadata.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SSH",
+              "PASSWORD",
+              "X509_CERTIFICATE",
+              "RAW_DATA",
+              "KV",
+              "CREDENTIAL_MAP"
+            ],
+            "default": "SSH"
+          },
+          {
+            "name": "metadata.tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.persisted_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "ResourceSecretManagementService_addKVCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "ResourceSecretManagementService_updateKVCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/map": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getCredentialMap",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceCredentialMap"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "metadata.owner_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "TENANT_USER",
+              "CUSTOS",
+              "TENANT"
+            ],
+            "default": "TENANT_USER"
+          },
+          {
+            "name": "metadata.resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "metadata.source",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "KUBE",
+              "LOCAL",
+              "EXTERNAL",
+              "LETSENCRYPT"
+            ],
+            "default": "KUBE"
+          },
+          {
+            "name": "metadata.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SSH",
+              "PASSWORD",
+              "X509_CERTIFICATE",
+              "RAW_DATA",
+              "KV",
+              "CREDENTIAL_MAP"
+            ],
+            "default": "SSH"
+          },
+          {
+            "name": "metadata.tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.persisted_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "ResourceSecretManagementService_deleteCredentialMap",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "metadata.owner_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "TENANT_USER",
+              "CUSTOS",
+              "TENANT"
+            ],
+            "default": "TENANT_USER"
+          },
+          {
+            "name": "metadata.resource_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "metadata.source",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "KUBE",
+              "LOCAL",
+              "EXTERNAL",
+              "LETSENCRYPT"
+            ],
+            "default": "KUBE"
+          },
+          {
+            "name": "metadata.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.value",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SSH",
+              "PASSWORD",
+              "X509_CERTIFICATE",
+              "RAW_DATA",
+              "KV",
+              "CREDENTIAL_MAP"
+            ],
+            "default": "SSH"
+          },
+          {
+            "name": "metadata.tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.persisted_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "metadata.token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "metadata.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "ResourceSecretManagementService_addCredentialMap",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAddResourceCredentialResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "ResourceSecretManagementService_updateCredentialMap",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/password": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getPasswordCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/servicePasswordCredential"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "ResourceSecretManagementService_deletePWDCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "ResourceSecretManagementService_addPasswordCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAddResourceCredentialResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/ssh": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getSSHCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSSHCredential"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "ResourceSecretManagementService_deleteSSHCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "ResourceSecretManagementService_addSSHCredential",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAddResourceCredentialResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/summaries": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getAllResourceCredentialSummaries",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceResourceCredentialSummaries"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "SERVER_CERTIFICATE",
+              "JWT_SIGNING_CERTIFICATE",
+              "VAULT_CREDENTIAL",
+              "VM",
+              "ACCOUNT",
+              "OTHER",
+              "SCP",
+              "S3",
+              "BOX",
+              "AZURE",
+              "GCS",
+              "DROPBOX",
+              "FTP"
+            ],
+            "default": "SERVER_CERTIFICATE"
+          },
+          {
+            "name": "accessible_tokens",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "all_types",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    },
+    "/resource-secret-management/v1.0.0/secret/summary": {
+      "get": {
+        "operationId": "ResourceSecretManagementService_getResourceCredentialSummary",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSecretMetadata"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/rpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "use_shamirs_secret_sharing_with_encryption",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "num_of_shares",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "threshold",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          }
+        ],
+        "tags": [
+          "ResourceSecretManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "protobufNullValue": {
+      "type": "string",
+      "enum": [
+        "NULL_VALUE"
+      ],
+      "default": "NULL_VALUE",
+      "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value."
+    },
+    "rpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "serviceAddResourceCredentialResponse": {
+      "type": "object",
+      "properties": {
+        "token": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceCertificateCredential": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "#/definitions/serviceSecretMetadata"
+        },
+        "x509_cert": {
+          "type": "string"
+        },
+        "not_after": {
+          "type": "string"
+        },
+        "private_key": {
+          "type": "string"
+        },
+        "life_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "not_before": {
+          "type": "string"
+        },
+        "use_shamirs_secret_sharing_with_encryption": {
+          "type": "boolean"
+        },
+        "num_of_shares": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "threshold": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "private_key_shares": {
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "byte"
+          }
+        }
+      }
+    },
+    "serviceCredentialMap": {
+      "type": "object",
+      "properties": {
+        "credential_map": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "metadata": {
+          "$ref": "#/definitions/serviceSecretMetadata"
+        }
+      }
+    },
+    "serviceKVCredential": {
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "#/definitions/serviceSecretMetadata"
+        },
+        "token": {
+          "type": "string"
+        }
+      }
+    },
+    "servicePasswordCredential": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "#/definitions/serviceSecretMetadata"
+        },
+        "password": {
+          "type": "string"
+        },
+        "use_shamirs_secret_sharing_with_encryption": {
+          "type": "boolean"
+        },
+        "num_of_shares": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "threshold": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "secret_shares": {
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "byte"
+          }
+        },
+        "userId": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceResourceCredentialOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceResourceCredentialSummaries": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceSecretMetadata"
+          }
+        }
+      }
+    },
+    "serviceResourceOwnerType": {
+      "type": "string",
+      "enum": [
+        "TENANT_USER",
+        "CUSTOS",
+        "TENANT"
+      ],
+      "default": "TENANT_USER"
+    },
+    "serviceResourceSecretType": {
+      "type": "string",
+      "enum": [
+        "SSH",
+        "PASSWORD",
+        "X509_CERTIFICATE",
+        "RAW_DATA",
+        "KV",
+        "CREDENTIAL_MAP"
+      ],
+      "default": "SSH"
+    },
+    "serviceResourceSource": {
+      "type": "string",
+      "enum": [
+        "KUBE",
+        "LOCAL",
+        "EXTERNAL",
+        "LETSENCRYPT"
+      ],
+      "default": "KUBE"
+    },
+    "serviceResourceType": {
+      "type": "string",
+      "enum": [
+        "SERVER_CERTIFICATE",
+        "JWT_SIGNING_CERTIFICATE",
+        "VAULT_CREDENTIAL",
+        "VM",
+        "ACCOUNT",
+        "OTHER",
+        "SCP",
+        "S3",
+        "BOX",
+        "AZURE",
+        "GCS",
+        "DROPBOX",
+        "FTP"
+      ],
+      "default": "SERVER_CERTIFICATE"
+    },
+    "serviceSSHCredential": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "#/definitions/serviceSecretMetadata"
+        },
+        "passphrase": {
+          "type": "string"
+        },
+        "public_key": {
+          "type": "string"
+        },
+        "private_key": {
+          "type": "string"
+        },
+        "use_shamirs_secret_sharing_with_encryption": {
+          "type": "boolean"
+        },
+        "num_of_shares": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "threshold": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "private_key_shares": {
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "byte"
+          }
+        }
+      }
+    },
+    "serviceSecretMetadata": {
+      "type": "object",
+      "properties": {
+        "owner_type": {
+          "$ref": "#/definitions/serviceResourceOwnerType"
+        },
+        "resource_type": {
+          "$ref": "#/definitions/serviceResourceType"
+        },
+        "source": {
+          "$ref": "#/definitions/serviceResourceSource"
+        },
+        "name": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string"
+        },
+        "type": {
+          "$ref": "#/definitions/serviceResourceSecretType"
+        },
+        "tenantId": {
+          "type": "string",
+          "format": "int64"
+        },
+        "owner_id": {
+          "type": "string"
+        },
+        "persisted_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "token": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "client_id": {
+          "type": "string"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/sharing-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/sharing-management-service/swagger.json
new file mode 100644
index 0000000..7a6cd12
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/sharing-management-service/swagger.json
@@ -0,0 +1,2390 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "SharingManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "SharingManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/sharing-management/v1.0.0/entities": {
+      "post": {
+        "operationId": "SharingManagementService_searchEntities",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceEntities"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/entity": {
+      "get": {
+        "operationId": "SharingManagementService_getEntity",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceEntity"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "SharingManagementService_deleteEntity",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "SharingManagementService_createEntity",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "SharingManagementService_updateEntity",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/entity/existence": {
+      "get": {
+        "operationId": "SharingManagementService_isEntityExists",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/entity/type": {
+      "get": {
+        "operationId": "SharingManagementService_getEntityType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceEntityType"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "SharingManagementService_deleteEntityType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "SharingManagementService_createEntityType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "SharingManagementService_updateEntityType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/entity/types": {
+      "get": {
+        "operationId": "SharingManagementService_getEntityTypes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceEntityTypes"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "associating_ids",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/entity/user/access": {
+      "get": {
+        "operationId": "SharingManagementService_userHasAccess",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/groups/share": {
+      "get": {
+        "operationId": "SharingManagementService_getListOfSharedGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSharedOwners"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "SharingManagementService_revokeEntitySharingFromGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "SharingManagementService_shareEntityWithGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/groups/share/direct": {
+      "get": {
+        "operationId": "SharingManagementService_getListOfDirectlySharedGroups",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSharedOwners"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/permission/type": {
+      "get": {
+        "operationId": "SharingManagementService_getPermissionType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/servicePermissionType"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "SharingManagementService_deletePermissionType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "SharingManagementService_createPermissionType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "SharingManagementService_updatePermissionType",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/permission/types": {
+      "get": {
+        "operationId": "SharingManagementService_getPermissionTypes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/servicePermissionTypes"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "associating_ids",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/users/share": {
+      "get": {
+        "operationId": "SharingManagementService_getListOfSharedUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSharedOwners"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "SharingManagementService_revokeEntitySharingFromUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "SharingManagementService_shareEntityWithUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/sharingserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    },
+    "/sharing-management/v1.0.0/users/share/direct": {
+      "get": {
+        "operationId": "SharingManagementService_getListOfDirectlySharedUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceSharedOwners"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.owner_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.binary_data",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "byte"
+          },
+          {
+            "name": "entity.full_text",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "entity.original_creation_time",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "entity.shared_count",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "permission_type.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "permission_type.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "permission_type.updated_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "cascade",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "SharingManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "serviceEntities": {
+      "type": "object",
+      "properties": {
+        "entity_array": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceEntity"
+          }
+        }
+      }
+    },
+    "serviceEntity": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "type": {
+          "type": "string"
+        },
+        "owner_id": {
+          "type": "string"
+        },
+        "parent_id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "binary_data": {
+          "type": "string",
+          "format": "byte"
+        },
+        "full_text": {
+          "type": "string"
+        },
+        "original_creation_time": {
+          "type": "string",
+          "format": "int64"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "shared_count": {
+          "type": "integer",
+          "format": "int32"
+        }
+      }
+    },
+    "serviceEntitySearchField": {
+      "type": "string",
+      "enum": [
+        "NAME",
+        "DESCRIPTION",
+        "ID",
+        "FULL_TEXT",
+        "OWNER_ID",
+        "CREATED_AT",
+        "LAST_MODIFIED_AT",
+        "ENTITY_TYPE_ID",
+        "PARENT_ID",
+        "SHARED_COUNT",
+        "PERMISSION_TYPE_ID"
+      ],
+      "default": "NAME"
+    },
+    "serviceEntityType": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "serviceEntityTypes": {
+      "type": "object",
+      "properties": {
+        "types": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceEntityType"
+          }
+        }
+      }
+    },
+    "servicePermissionType": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "updated_at": {
+          "type": "string",
+          "format": "int64"
+        }
+      }
+    },
+    "servicePermissionTypes": {
+      "type": "object",
+      "properties": {
+        "types": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/servicePermissionType"
+          }
+        }
+      }
+    },
+    "serviceSearchCondition": {
+      "type": "string",
+      "enum": [
+        "EQUAL",
+        "LIKE",
+        "GTE",
+        "LTE",
+        "NOT"
+      ],
+      "default": "EQUAL"
+    },
+    "serviceSearchCriteria": {
+      "type": "object",
+      "properties": {
+        "search_field": {
+          "$ref": "#/definitions/serviceEntitySearchField"
+        },
+        "value": {
+          "type": "string"
+        },
+        "condition": {
+          "$ref": "#/definitions/serviceSearchCondition"
+        }
+      }
+    },
+    "serviceSharedOwners": {
+      "type": "object",
+      "properties": {
+        "owner_ids": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "sharingserviceStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/tenant-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/tenant-management-service/swagger.json
new file mode 100644
index 0000000..316e452
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/tenant-management-service/swagger.json
@@ -0,0 +1,1660 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "TenantManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "TenantManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/tenant-management/v1.0.0/audit/attributes/{tenant_id}": {
+      "get": {
+        "operationId": "TenantManagementService_getTenantAttributeUpdateAuditTrail",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAttributeUpdateAuditTrailResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "path",
+            "required": true,
+            "type": "string",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/cache/institutions/CILogon": {
+      "get": {
+        "operationId": "TenantManagementService_getFromCache",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetInstitutionsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "institution_ids",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "WHITELIST",
+              "BACKLIST"
+            ],
+            "default": "WHITELIST"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "TenantManagementService_removeFromCache",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/authenticationserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "institution_ids",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "WHITELIST",
+              "BACKLIST"
+            ],
+            "default": "WHITELIST"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "TenantManagementService_addToCache",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/authenticationserviceStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/child/tenants": {
+      "get": {
+        "operationId": "TenantManagementService_getChildTenants",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllTenantsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "REQUESTED",
+              "APPROVED",
+              "DENIED",
+              "CANCELLED",
+              "ACTIVE",
+              "DEACTIVATED"
+            ],
+            "default": "REQUESTED"
+          },
+          {
+            "name": "requester_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "parent_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/events": {
+      "post": {
+        "operationId": "TenantManagementService_configureEventPersistence",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/institutions/CILogon": {
+      "get": {
+        "operationId": "TenantManagementService_getInstitutions",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetInstitutionsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "institution_ids",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "WHITELIST",
+              "BACKLIST"
+            ],
+            "default": "WHITELIST"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/oauth2/tenant": {
+      "get": {
+        "operationId": "TenantManagementService_getTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceTenant"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "tenant.tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "tenant.client_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.requester_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.admin_first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.admin_last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.admin_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.admin_username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.admin_password",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.tenant_status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "REQUESTED",
+              "APPROVED",
+              "DENIED",
+              "CANCELLED",
+              "ACTIVE",
+              "DEACTIVATED"
+            ],
+            "default": "REQUESTED"
+          },
+          {
+            "name": "tenant.contacts",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tenant.redirect_uris",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tenant.client_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.scope",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.domain",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.comment",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.logo_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.parent_tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "tenant.application_type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.token_endpoint_auth_method",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.jwks_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.example_extension_parameter",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.tos_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.policy_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.software_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.software_version",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant.refesh_token_lifetime",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "tenant.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id_issued_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          },
+          {
+            "name": "credentials.custos_client_secret_expired_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "TenantManagementService_deleteTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "properties": {}
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "credentials.iam_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id_issued_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          },
+          {
+            "name": "credentials.custos_client_secret_expired_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          },
+          {
+            "name": "body.tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "body.client_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.requester_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.admin_first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.admin_last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.admin_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.admin_username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.admin_password",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.tenant_status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "REQUESTED",
+              "APPROVED",
+              "DENIED",
+              "CANCELLED",
+              "ACTIVE",
+              "DEACTIVATED"
+            ],
+            "default": "REQUESTED"
+          },
+          {
+            "name": "body.contacts",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "body.redirect_uris",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "body.client_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.scope",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.domain",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.comment",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.logo_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.parent_tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "body.application_type",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.token_endpoint_auth_method",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.jwks_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.example_extension_parameter",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.tos_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.policy_uri",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.software_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.software_version",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "body.refesh_token_lifetime",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "body.client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "TenantManagementService_createTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceCreateTenantResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "TenantManagementService_updateTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceTenant"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceTenant"
+            }
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "credentials.iam_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.iam_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.ci_logon_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "credentials.custos_client_id_issued_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          },
+          {
+            "name": "credentials.custos_client_secret_expired_at",
+            "in": "query",
+            "required": false,
+            "type": "number",
+            "format": "double"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/protocol/mapper": {
+      "post": {
+        "operationId": "TenantManagementService_addProtocolMapper",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/role": {
+      "delete": {
+        "operationId": "TenantManagementService_deleteRole",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_level",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "role.name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "role.description",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "role.composite",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "role.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/roles": {
+      "get": {
+        "operationId": "TenantManagementService_getTenantRoles",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAllRoles"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "client_level",
+            "in": "query",
+            "required": false,
+            "type": "boolean"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "TenantManagementService_addTenantRoles",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceAllRoles"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/status": {
+      "post": {
+        "operationId": "TenantManagementService_updateTenantStatus",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUpdateStatusResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/tenant/credentials/status": {
+      "post": {
+        "operationId": "TenantManagementService_validateTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/tenants": {
+      "get": {
+        "operationId": "TenantManagementService_getAllTenants",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllTenantsResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "parent_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "REQUESTED",
+              "APPROVED",
+              "DENIED",
+              "CANCELLED",
+              "ACTIVE",
+              "DEACTIVATED"
+            ],
+            "default": "REQUESTED"
+          },
+          {
+            "name": "requester_email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "parent_client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    },
+    "/tenant-management/v1.0.0/tenants/{requester_email}": {
+      "get": {
+        "operationId": "TenantManagementService_getAllTenantsForUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllTenantsForUserResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "requester_email",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "TenantManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "authenticationserviceStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "serviceAllRoles": {
+      "type": "object",
+      "properties": {
+        "roles": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceRoleRepresentation"
+          }
+        },
+        "scope": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceClaimJSONTypes": {
+      "type": "string",
+      "enum": [
+        "STRING",
+        "LONG",
+        "INTEGER",
+        "BOOLEAN",
+        "JSON"
+      ],
+      "default": "STRING"
+    },
+    "serviceCreateTenantResponse": {
+      "type": "object",
+      "properties": {
+        "client_id": {
+          "type": "string"
+        },
+        "client_secret": {
+          "type": "string"
+        },
+        "is_activated": {
+          "type": "boolean"
+        },
+        "client_id_issued_at": {
+          "type": "number",
+          "format": "double"
+        },
+        "client_secret_expires_at": {
+          "type": "number",
+          "format": "double"
+        },
+        "registration_client_uri": {
+          "type": "string"
+        },
+        "token_endpoint_auth_method": {
+          "type": "string"
+        },
+        "msg": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceCredentials": {
+      "type": "object",
+      "properties": {
+        "iam_client_id": {
+          "type": "string"
+        },
+        "iam_client_secret": {
+          "type": "string"
+        },
+        "ci_logon_client_id": {
+          "type": "string"
+        },
+        "ci_logon_client_secret": {
+          "type": "string"
+        },
+        "custos_client_id": {
+          "type": "string"
+        },
+        "custos_client_secret": {
+          "type": "string"
+        },
+        "custos_client_id_issued_at": {
+          "type": "number",
+          "format": "double"
+        },
+        "custos_client_secret_expired_at": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    },
+    "serviceGetAllTenantsForUserResponse": {
+      "type": "object",
+      "properties": {
+        "tenant": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceTenant"
+          }
+        }
+      }
+    },
+    "serviceGetAllTenantsResponse": {
+      "type": "object",
+      "properties": {
+        "tenant": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceTenant"
+          }
+        },
+        "total_num_of_tenants": {
+          "type": "integer",
+          "format": "int32"
+        }
+      }
+    },
+    "serviceGetAttributeUpdateAuditTrailResponse": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceTenantAttributeUpdateMetadata"
+          }
+        }
+      }
+    },
+    "serviceGetInstitutionsResponse": {
+      "type": "object",
+      "properties": {
+        "institutions": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceInstitution"
+          }
+        }
+      }
+    },
+    "serviceInstitution": {
+      "type": "object",
+      "properties": {
+        "entity_id": {
+          "type": "string"
+        },
+        "organization_name": {
+          "type": "string"
+        },
+        "display_name": {
+          "type": "string"
+        },
+        "rand_s": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceInstitutionCacheType": {
+      "type": "string",
+      "enum": [
+        "WHITELIST",
+        "BACKLIST"
+      ],
+      "default": "WHITELIST"
+    },
+    "serviceMapperTypes": {
+      "type": "string",
+      "enum": [
+        "USER_ATTRIBUTE",
+        "USER_REALM_ROLE",
+        "USER_CLIENT_ROLE"
+      ],
+      "default": "USER_ATTRIBUTE"
+    },
+    "serviceOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceRoleRepresentation": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string"
+        },
+        "description": {
+          "type": "string"
+        },
+        "composite": {
+          "type": "boolean"
+        },
+        "id": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceTenant": {
+      "type": "object",
+      "properties": {
+        "tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "client_name": {
+          "type": "string"
+        },
+        "requester_email": {
+          "type": "string"
+        },
+        "admin_first_name": {
+          "type": "string"
+        },
+        "admin_last_name": {
+          "type": "string"
+        },
+        "admin_email": {
+          "type": "string"
+        },
+        "admin_username": {
+          "type": "string"
+        },
+        "admin_password": {
+          "type": "string"
+        },
+        "tenant_status": {
+          "$ref": "#/definitions/serviceTenantStatus"
+        },
+        "contacts": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "redirect_uris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_uri": {
+          "type": "string"
+        },
+        "scope": {
+          "type": "string"
+        },
+        "domain": {
+          "type": "string"
+        },
+        "comment": {
+          "type": "string"
+        },
+        "logo_uri": {
+          "type": "string"
+        },
+        "parent_tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "application_type": {
+          "type": "string"
+        },
+        "token_endpoint_auth_method": {
+          "type": "string"
+        },
+        "jwks_uri": {
+          "type": "string"
+        },
+        "example_extension_parameter": {
+          "type": "string"
+        },
+        "tos_uri": {
+          "type": "string"
+        },
+        "policy_uri": {
+          "type": "string"
+        },
+        "jwks": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "software_id": {
+          "type": "string"
+        },
+        "software_version": {
+          "type": "string"
+        },
+        "refesh_token_lifetime": {
+          "type": "string",
+          "format": "int64"
+        },
+        "client_id": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceTenantAttributeUpdateMetadata": {
+      "type": "object",
+      "properties": {
+        "updated_attribute": {
+          "type": "string"
+        },
+        "updated_attributeValue": {
+          "type": "string"
+        },
+        "updated_by": {
+          "type": "string"
+        },
+        "updated_at": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceTenantStatus": {
+      "type": "string",
+      "enum": [
+        "REQUESTED",
+        "APPROVED",
+        "DENIED",
+        "CANCELLED",
+        "ACTIVE",
+        "DEACTIVATED"
+      ],
+      "default": "REQUESTED"
+    },
+    "serviceUpdateStatusResponse": {
+      "type": "object",
+      "properties": {
+        "tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/serviceTenantStatus"
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/user-management-service/swagger.json b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/user-management-service/swagger.json
new file mode 100644
index 0000000..ce2cc86
--- /dev/null
+++ b/custos-integration-services/custos-integration-services-swagger/src/main/resources/static/swagger-apis/user-management-service/swagger.json
@@ -0,0 +1,1997 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "UserManagementService.proto",
+    "version": "version not set"
+  },
+  "tags": [
+    {
+      "name": "UserManagementService"
+    }
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/user-management/v1.0.0/attributes": {
+      "delete": {
+        "operationId": "UserManagementService_deleteUserAttributes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "users",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performedBy",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "agents",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "UserManagementService_addUserAttributes",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/db/synchronize": {
+      "post": {
+        "operationId": "UserManagementService_synchronizeUserDBs",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user": {
+      "get": {
+        "operationId": "UserManagementService_getUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserRepresentation"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "UserManagementService_deleteUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "UserManagementService_registerUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceRegisterUserResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserRepresentation"
+            }
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/activation": {
+      "post": {
+        "operationId": "UserManagementService_enableUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserRepresentation"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserSearchMetadata"
+            }
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/activation/status": {
+      "get": {
+        "operationId": "UserManagementService_isUserEnabled",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/admin": {
+      "delete": {
+        "operationId": "UserManagementService_removeAdminPrivileges",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "UserManagementService_grantAdminPrivileges",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserSearchMetadata"
+            }
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/availability": {
+      "get": {
+        "operationId": "UserManagementService_isUsernameAvailable",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/deactivation": {
+      "post": {
+        "operationId": "UserManagementService_disableUser",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserRepresentation"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserSearchMetadata"
+            }
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/password": {
+      "put": {
+        "operationId": "UserManagementService_resetPassword",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/profile": {
+      "get": {
+        "operationId": "UserManagementService_getUserProfile",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserProfile"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user_profile.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "ACTIVE",
+              "CONFIRMED",
+              "APPROVED",
+              "DELETED",
+              "DUPLICATE",
+              "GRACE_PERIOD",
+              "INVITED",
+              "DENIED",
+              "PENDING",
+              "PENDING_APPROVAL",
+              "PENDING_CONFIRMATION",
+              "SUSPENDED",
+              "DECLINED",
+              "EXPIRED"
+            ],
+            "default": "ACTIVE"
+          },
+          {
+            "name": "user_profile.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.last_modified_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "END_USER",
+              "COMMUNITY"
+            ],
+            "default": "END_USER"
+          },
+          {
+            "name": "user_profile.membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "delete": {
+        "operationId": "UserManagementService_deleteUserProfile",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserProfile"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user_profile.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "ACTIVE",
+              "CONFIRMED",
+              "APPROVED",
+              "DELETED",
+              "DUPLICATE",
+              "GRACE_PERIOD",
+              "INVITED",
+              "DENIED",
+              "PENDING",
+              "PENDING_APPROVAL",
+              "PENDING_CONFIRMATION",
+              "SUSPENDED",
+              "DECLINED",
+              "EXPIRED"
+            ],
+            "default": "ACTIVE"
+          },
+          {
+            "name": "user_profile.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.last_modified_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "END_USER",
+              "COMMUNITY"
+            ],
+            "default": "END_USER"
+          },
+          {
+            "name": "user_profile.membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "put": {
+        "operationId": "UserManagementService_updateUserProfile",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceUserProfile"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceUserProfile"
+            }
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/profile/audit": {
+      "get": {
+        "operationId": "UserManagementService_getUserProfileAuditTrails",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetUpdateAuditTrailResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenantId",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/profile/mapper": {
+      "post": {
+        "operationId": "UserManagementService_linkUserProfile",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/user/roles": {
+      "delete": {
+        "operationId": "UserManagementService_deleteUserRoles",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/users": {
+      "get": {
+        "operationId": "UserManagementService_findUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceFindUsersResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user.id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "offset",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int32"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_sec",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      },
+      "post": {
+        "operationId": "UserManagementService_registerAndEnableUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceRegisterUsersResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/serviceRegisterUsersRequest"
+            }
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/users/profile": {
+      "get": {
+        "operationId": "UserManagementService_getAllUserProfilesInTenant",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceGetAllUserProfilesResponse"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "user_profile.username",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.email",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.first_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.last_name",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "user_profile.created_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.status",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "ACTIVE",
+              "CONFIRMED",
+              "APPROVED",
+              "DELETED",
+              "DUPLICATE",
+              "GRACE_PERIOD",
+              "INVITED",
+              "DENIED",
+              "PENDING",
+              "PENDING_APPROVAL",
+              "PENDING_CONFIRMATION",
+              "SUSPENDED",
+              "DECLINED",
+              "EXPIRED"
+            ],
+            "default": "ACTIVE"
+          },
+          {
+            "name": "user_profile.client_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.realm_roles",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "user_profile.last_modified_at",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "user_profile.type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "END_USER",
+              "COMMUNITY"
+            ],
+            "default": "END_USER"
+          },
+          {
+            "name": "user_profile.membership_type",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "enum": [
+              "OWNER",
+              "ADMIN",
+              "MEMBER"
+            ],
+            "default": "OWNER"
+          },
+          {
+            "name": "client_id",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "tenant_id",
+            "in": "query",
+            "required": false,
+            "type": "string",
+            "format": "int64"
+          },
+          {
+            "name": "access_token",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "client_secret",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "performed_by",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    },
+    "/user-management/v1.0.0/users/roles": {
+      "post": {
+        "operationId": "UserManagementService_addRolesToUsers",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/serviceOperationStatus"
+            }
+          },
+          "default": {
+            "description": "An unexpected error response.",
+            "schema": {
+              "$ref": "#/definitions/googlerpcStatus"
+            }
+          }
+        },
+        "tags": [
+          "UserManagementService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "custosiamserviceUserAttribute": {
+      "type": "object",
+      "properties": {
+        "key": {
+          "type": "string"
+        },
+        "values": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "googlerpcStatus": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/protobufAny"
+          }
+        }
+      }
+    },
+    "protobufAny": {
+      "type": "object",
+      "properties": {
+        "type_url": {
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "format": "byte"
+        }
+      }
+    },
+    "serviceDefaultGroupMembershipTypes": {
+      "type": "string",
+      "enum": [
+        "OWNER",
+        "ADMIN",
+        "MEMBER"
+      ],
+      "default": "OWNER"
+    },
+    "serviceFindUsersResponse": {
+      "type": "object",
+      "properties": {
+        "users": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserRepresentation"
+          }
+        }
+      }
+    },
+    "serviceGetAllUserProfilesResponse": {
+      "type": "object",
+      "properties": {
+        "profiles": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserProfile"
+          }
+        }
+      }
+    },
+    "serviceGetUpdateAuditTrailResponse": {
+      "type": "object",
+      "properties": {
+        "attribute_audit": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserProfileAttributeUpdateMetadata"
+          }
+        },
+        "status_audit": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserProfileStatusUpdateMetadata"
+          }
+        }
+      }
+    },
+    "serviceOperationStatus": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceRegisterUserResponse": {
+      "type": "object",
+      "properties": {
+        "is_registered": {
+          "type": "boolean"
+        }
+      }
+    },
+    "serviceRegisterUsersRequest": {
+      "type": "object",
+      "properties": {
+        "users": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserRepresentation"
+          }
+        },
+        "tenant_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "access_token": {
+          "type": "string"
+        },
+        "client_id": {
+          "type": "string"
+        },
+        "performed_by": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceRegisterUsersResponse": {
+      "type": "object",
+      "properties": {
+        "all_useres_registered": {
+          "type": "boolean"
+        },
+        "failed_users": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/serviceUserRepresentation"
+          }
+        }
+      }
+    },
+    "serviceUserProfile": {
+      "type": "object",
+      "properties": {
+        "username": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "created_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "status": {
+          "$ref": "#/definitions/serviceUserStatus"
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/userprofileserviceUserAttribute"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "last_modified_at": {
+          "type": "string",
+          "format": "int64"
+        },
+        "type": {
+          "$ref": "#/definitions/serviceUserTypes"
+        },
+        "membership_type": {
+          "$ref": "#/definitions/serviceDefaultGroupMembershipTypes"
+        }
+      }
+    },
+    "serviceUserProfileAttributeUpdateMetadata": {
+      "type": "object",
+      "properties": {
+        "updated_attribute": {
+          "type": "string"
+        },
+        "updated_attribute_value": {
+          "type": "string"
+        },
+        "updated_by": {
+          "type": "string"
+        },
+        "updated_at": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceUserProfileStatusUpdateMetadata": {
+      "type": "object",
+      "properties": {
+        "updated_status": {
+          "$ref": "#/definitions/serviceUserStatus"
+        },
+        "updated_by": {
+          "type": "string"
+        },
+        "updated_at": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceUserRepresentation": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string"
+        },
+        "username": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "password": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "temporary_password": {
+          "type": "boolean"
+        },
+        "realm_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "client_roles": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "attributes": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/custosiamserviceUserAttribute"
+          }
+        },
+        "state": {
+          "type": "string"
+        },
+        "creation_time": {
+          "type": "number",
+          "format": "double"
+        },
+        "last_login_at": {
+          "type": "number",
+          "format": "double"
+        }
+      }
+    },
+    "serviceUserSearchMetadata": {
+      "type": "object",
+      "properties": {
+        "username": {
+          "type": "string"
+        },
+        "first_name": {
+          "type": "string"
+        },
+        "last_name": {
+          "type": "string"
+        },
+        "email": {
+          "type": "string"
+        },
+        "id": {
+          "type": "string"
+        }
+      }
+    },
+    "serviceUserStatus": {
+      "type": "string",
+      "enum": [
+        "ACTIVE",
+        "CONFIRMED",
+        "APPROVED",
+        "DELETED",
+        "DUPLICATE",
+        "GRACE_PERIOD",
+        "INVITED",
+        "DENIED",
+        "PENDING",
+        "PENDING_APPROVAL",
+        "PENDING_CONFIRMATION",
+        "SUSPENDED",
+        "DECLINED",
+        "EXPIRED"
+      ],
+      "default": "ACTIVE"
+    },
+    "serviceUserTypes": {
+      "type": "string",
+      "enum": [
+        "END_USER",
+        "COMMUNITY"
+      ],
+      "default": "END_USER"
+    },
+    "userprofileserviceUserAttribute": {
+      "type": "object",
+      "properties": {
+        "id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "key": {
+          "type": "string"
+        },
+        "value": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb b/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb
index 11c7db6..301f700 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb
+++ b/custos-integration-services/group-management-service-parent/group-management-service-sidecar/src/main/resources/group-management-service.pb
Binary files differ
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/Dockerfile b/custos-integration-services/group-management-service-parent/group-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/Dockerfile
+++ b/custos-integration-services/group-management-service-parent/group-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/pom.xml b/custos-integration-services/group-management-service-parent/group-management-service/pom.xml
index 1ac8b6f..7678ff9 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/pom.xml
+++ b/custos-integration-services/group-management-service-parent/group-management-service/pom.xml
@@ -114,6 +114,7 @@
             <groupId>com.google.api.grpc</groupId>
             <artifactId>proto-google-common-protos</artifactId>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -132,6 +133,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/deployment.yaml
index a0957f6..668c290 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
         - name: {{ .Chart.Name }}-envoy-proxy
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress-grpc.yaml
index 727abc1..29e45a3 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /org.apache.custos.group.management.service.GroupManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress.yaml
index 70f3029..af22d95 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /group-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/values.yaml b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/values.yaml
index fc25587..b7fc7d8 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/helm/values.yaml
@@ -82,3 +82,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
index fc4aa95..d576b03 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/ClientAuthInterceptorImpl.java
@@ -21,24 +21,20 @@
 
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.iam.service.GroupRequest;
-import org.apache.custos.iam.service.GroupsRequest;
-import org.apache.custos.iam.service.UserGroupMappingRequest;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.identity.service.AuthToken;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.core.utils.Constants;
 import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.apache.custos.user.profile.service.GroupMembership;
-import org.apache.custos.user.profile.service.GroupToGroupMembership;
-import org.apache.custos.user.profile.service.UserProfileRequest;
+import org.apache.custos.user.profile.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * Responsible for validate confidential client specific authorization.
  * Methods which authenticates based only on client are implemented here.
@@ -48,7 +44,8 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
 
     @Autowired
-    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient,
+                                     TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
         super(credentialStoreServiceClient, tenantProfileClient, identityClient);
     }
 
@@ -59,147 +56,135 @@
         if (method.equals("findGroup") || method.equals("getAllGroups")
                 || method.equals("updateGroup") || method.equals("deleteGroup")) {
             GroupRequest request = (GroupRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
 
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
+           return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
 
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
+                long tenantId = cl.getTenantId();
 
-            long tenantId = claim.getTenantId();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
+                return (ReqT) ((org.apache.custos.user.profile.service.GroupRequest) reqT).toBuilder()
+                        .setClientId(oauthId)
+                        .setTenantId(tenantId)
+                        .setPerformedBy(cl.getPerformedBy() != null ? cl.getPerformedBy() : Constants.SYSTEM)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
 
-            return (ReqT) ((GroupRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setClientSec(oauthSec)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(claim.getPerformedBy() != null ? claim.getPerformedBy(): Constants.SYSTEM)
-                    .build();
+        } else if (method.equals("createGroup")) {
+            GroupRequest request = (GroupRequest) reqT;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+           return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((GroupRequest) reqT).toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId)
+                        .setPerformedBy(cl.getPerformedBy() != null ? cl.getPerformedBy() : Constants.SYSTEM)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
-        } else if (method.equals("createGroups")) {
-            GroupsRequest request = (GroupsRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-
-            return (ReqT) ((GroupsRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setClientSec(oauthSec)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(claim.getPerformedBy() != null ? claim.getPerformedBy(): Constants.SYSTEM)
-                    .build();
 
         } else if (method.equals("addUserToGroup") || method.equals("removeUserFromGroup")) {
-            UserGroupMappingRequest request = (UserGroupMappingRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
+            GroupMembership request = (GroupMembership) reqT;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
 
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
 
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
+                long tenantId = cl.getTenantId();
 
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-
-            return (ReqT) ((UserGroupMappingRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(claim.getPerformedBy() != null ? claim.getPerformedBy(): Constants.SYSTEM)
-                    .build();
+                return (ReqT) ((GroupMembership) reqT).toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("addChildGroupToParentGroup") || method.equals("removeChildGroupFromParentGroup")) {
-            GroupToGroupMembership groupToGroupMembership = (GroupToGroupMembership)reqT;
-            AuthClaim claim = authorize(headers, groupToGroupMembership.getClientId());
+            GroupToGroupMembership groupToGroupMembership = (GroupToGroupMembership) reqT;
+            Optional<AuthClaim> claim = authorize(headers, groupToGroupMembership.getClientId());
 
 
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            long tenantId = claim.getTenantId();
+           return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
 
+                return (ReqT) ((GroupToGroupMembership) reqT).toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
 
-            return (ReqT) ((GroupToGroupMembership) reqT).toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
-
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("getAllGroupsOfUser")) {
-            UserProfileRequest request = (UserProfileRequest)reqT;
-            AuthClaim claim = authorize(headers,request.getClientId());
+            UserProfileRequest request = (UserProfileRequest) reqT;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+           return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
 
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            long tenantId = claim.getTenantId();
-
-            return (ReqT) ((UserProfileRequest) reqT).toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
-
+                return (ReqT) ((UserProfileRequest) reqT).toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("getAllChildUsers") || method.equals("getAllChildGroups")
                 || method.equals("getAllParentGroupsOfGroup")) {
 
             org.apache.custos.user.profile.service.GroupRequest request =
                     (org.apache.custos.user.profile.service.GroupRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+
+           return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((org.apache.custos.user.profile.service.GroupRequest) reqT).toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
 
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            long tenantId = claim.getTenantId();
-
-
-            return (ReqT) ((org.apache.custos.user.profile.service.GroupRequest) reqT).toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
         } else if (method.equals("changeUserMembershipType") || method.equals("hasAccess")) {
             GroupMembership request =
                     (GroupMembership) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
 
+           return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
 
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            long tenantId = claim.getTenantId();
+                return (ReqT) ((GroupMembership) reqT).toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
-            return (ReqT) ((GroupMembership) reqT).toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
+        } else if (method.equals("addGroupMembershipType") || method.equals("removeUserGroupMembershipType")) {
+            UserGroupMembershipTypeRequest request =
+                    (UserGroupMembershipTypeRequest) reqT;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+           return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
+
+                return (ReqT) ((UserGroupMembershipTypeRequest) reqT).toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         }
         return reqT;
     }
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/InputValidator.java b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/InputValidator.java
index ce6cdc1..4cd6079 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/InputValidator.java
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/interceptors/InputValidator.java
@@ -45,7 +45,7 @@
     private void validate(String methodName, Object body, Metadata headers) {
 
         switch (methodName) {
-            case "createGroups":
+            case "createGroup":
             case "updateGroup":
             case "deleteGroup":
             case "findGroup":
@@ -56,6 +56,8 @@
             case "removeChildGroupFromParentGroup":
             case "getAllGroupsOfUser":
             case "getAllParentGroupsOfGroup":
+            case "addGroupMembershipType":
+            case "removeUserGroupMembershipType":
                 validateMethods(methodName, body, headers);
                 break;
             default:
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/service/GroupManagementService.java b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/service/GroupManagementService.java
index 296a8b6..6940c96 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/service/GroupManagementService.java
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/java/org/apache/custos/group/management/service/GroupManagementService.java
@@ -29,6 +29,7 @@
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.service.AuthToken;
 import org.apache.custos.identity.service.GetUserManagementSATokenRequest;
+import org.apache.custos.integration.services.commons.utils.EventPublisher;
 import org.apache.custos.user.profile.client.UserProfileClient;
 import org.apache.custos.user.profile.service.*;
 import org.lognet.springboot.grpc.GRpcService;
@@ -36,8 +37,7 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 @GRpcService
 public class GroupManagementService extends GroupManagementServiceGrpc.GroupManagementServiceImplBase {
@@ -54,10 +54,13 @@
     @Autowired
     private IdentityClient identityClient;
 
+    @Autowired
+    private EventPublisher eventPublisher;
+
 
     //TODO: improve error handling to avoid database consistency
     @Override
-    public void createGroups(GroupsRequest request, StreamObserver<GroupsResponse> responseObserver) {
+    public void createKeycloakGroups(GroupsRequest request, StreamObserver<GroupsResponse> responseObserver) {
         try {
             LOGGER.debug("Request received create Groups for tenant " + request.getTenantId());
 
@@ -89,13 +92,13 @@
 
     //TODO: improve error handling to avoid database consistency
     @Override
-    public void updateGroup(GroupRequest request, StreamObserver<GroupRepresentation> responseObserver) {
+    public void updateKeycloakGroup(GroupRequest request, StreamObserver<GroupRepresentation> responseObserver) {
         try {
             LOGGER.debug("Request received to updateGroup for tenant " + request.getTenantId());
 
             GroupRepresentation gr = request.getGroup();
 
-            if (request.getId() != null && ! request.getId().trim().equals("")) {
+            if (request.getId() != null && !request.getId().trim().equals("")) {
                 gr = gr.toBuilder().setId(request.getId()).build();
             }
             request = request.toBuilder().setGroup(gr).build();
@@ -140,12 +143,12 @@
 
     //TODO: improve error handling to avoid database consistency
     @Override
-    public void deleteGroup(GroupRequest request, StreamObserver<OperationStatus> responseObserver) {
+    public void deleteKeycloakGroup(GroupRequest request, StreamObserver<OperationStatus> responseObserver) {
         try {
             LOGGER.debug("Request received to updateGroup for tenant " + request.getTenantId());
 
             GroupRepresentation gr = request.getGroup();
-            if (request.getId() != null && ! request.getId().trim().equals("")) {
+            if (request.getId() != null && !request.getId().trim().equals("")) {
                 gr = gr.toBuilder().setId(request.getId()).build();
             }
             request = request.toBuilder().setGroup(gr).build();
@@ -180,7 +183,7 @@
     }
 
     @Override
-    public void findGroup(GroupRequest request, StreamObserver<GroupRepresentation> responseObserver) {
+    public void findKeycloakGroup(GroupRequest request, StreamObserver<GroupRepresentation> responseObserver) {
         try {
             LOGGER.debug("Request received findGroup for group Id " + request.getGroup().getId() + " of  tenant "
                     + request.getTenantId());
@@ -220,7 +223,7 @@
     }
 
     @Override
-    public void getAllGroups(GroupRequest request, StreamObserver<GroupsResponse> responseObserver) {
+    public void getAllKeycloakGroups(GroupRequest request, StreamObserver<GroupsResponse> responseObserver) {
         try {
             LOGGER.debug("Request received getAllGroups for  tenant "
                     + request.getTenantId());
@@ -259,7 +262,7 @@
     }
 
     @Override
-    public void addUserToGroup(UserGroupMappingRequest request, StreamObserver<OperationStatus> responseObserver) {
+    public void addUserToKeycloakGroup(UserGroupMappingRequest request, StreamObserver<OperationStatus> responseObserver) {
         try {
             LOGGER.debug("Request received to addUserToGroup for  user  " + request.getUsername() + " of tenant "
                     + request.getTenantId());
@@ -299,7 +302,7 @@
 
 
     @Override
-    public void removeUserFromGroup(UserGroupMappingRequest request, StreamObserver<OperationStatus> responseObserver) {
+    public void removeUserFromKeycloakGroup(UserGroupMappingRequest request, StreamObserver<OperationStatus> responseObserver) {
         try {
             LOGGER.debug("Request received to removeUserFromGroup for  user  " + request.getUsername() + " of tenant "
                     + request.getTenantId());
@@ -337,53 +340,239 @@
 
 
     @Override
+    public void createGroup(org.apache.custos.user.profile.service.GroupRequest request, StreamObserver<Group> responseObserver) {
+        try {
+            LOGGER.debug("Request received to createGroup   " + request.getGroup().getName() + " of tenant "
+                    + request.getTenantId());
+
+            String id = request.getGroup().getId();
+
+            updateProfile(request.getClientId(), request.getClientSec(),
+                    request.getTenantId(), request.getGroup().getOwnerId());
+            if (id != null && !id.trim().equals("")) {
+                Group group = Group.newBuilder()
+                        .setId(id)
+                        .build();
+
+                org.apache.custos.user.profile.service.GroupRequest groupRequest = org.apache.custos.user.profile.service.GroupRequest
+                        .newBuilder().
+                                setTenantId(request.getTenantId()).
+                                setPerformedBy(request.getPerformedBy()).
+                                setGroup(group).build();
+                Group exGroup = userProfileClient.getGroup(groupRequest);
+
+                if (exGroup.getName() != null && !exGroup.getName().trim().equals("")) {
+                    String msg = "Group already exist with given id " + id;
+                    LOGGER.error(msg);
+                    responseObserver.onError(Status.ALREADY_EXISTS.withDescription(msg).asRuntimeException());
+                }
+
+            } else {
+                id = request.getGroup().
+                        getName().toLowerCase().replace(" ", "_") + "_" + UUID.randomUUID();
+            }
+            Group group = request.getGroup().toBuilder().setId(id).build();
+            request = request.toBuilder().setGroup(group).build();
+            Group creadredGroup = userProfileClient.createGroup(request);
+            responseObserver.onNext(creadredGroup);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at createGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateGroup(org.apache.custos.user.profile.service.GroupRequest request, StreamObserver<Group> responseObserver) {
+        try {
+            LOGGER.debug("Request received to updateGroup for  group  " + request.getGroup().getId() + " of tenant "
+                    + request.getTenantId());
+
+
+            if (request.getId() != null && !request.getId().trim().equals("")) {
+                Group group = request.getGroup().toBuilder().setId(request.getId()).build();
+                request = request.toBuilder().setGroup(group).build();
+            }
+
+            Group exGroup = userProfileClient.getGroup(request);
+            if (exGroup.getName() != null && !exGroup.getName().trim().equals("")) {
+                Group group = request.getGroup().toBuilder().setParentId(exGroup.getParentId()).build();
+                request = request.toBuilder().setGroup(group).build();
+                Group updatedGr = userProfileClient.updateGroup(request);
+                responseObserver.onNext(updatedGr);
+                responseObserver.onCompleted();
+            } else {
+                String msg = "Cannot find a group with id " + request.getId();
+                LOGGER.error(msg);
+                responseObserver.onError(Status.NOT_FOUND.withDescription(msg).asRuntimeException());
+            }
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at updateGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
+    public void deleteGroup(org.apache.custos.user.profile.service.GroupRequest request,
+                            StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to deleteGroup for  group  " + request.getGroup().getId() + " of tenant "
+                    + request.getTenantId());
+            if (request.getId() != null && !request.getId().trim().equals("")) {
+                Group group = request.getGroup().toBuilder().setId(request.getId()).build();
+                request = request.toBuilder().setGroup(group).build();
+            }
+            userProfileClient.deleteGroup(request);
+            org.apache.custos.user.profile.service.Status status =
+                    org.apache.custos.user.profile.service.Status.newBuilder().setStatus(true).build();
+
+                Map<String, String> value = new HashMap<>();
+                value.put("GROUP_ID", request.getGroup().getId());
+                eventPublisher.publishMessage(request.getClientId(),
+                        request.getTenantId(),
+                        "GROUP_MANAGEMENT_SERVICE", "DELETE_GROUP",
+                        value);
+
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at removeUserFromGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void findGroup(org.apache.custos.user.profile.service.GroupRequest request, StreamObserver<Group> responseObserver) {
+        try {
+            LOGGER.debug("Request received to findGroup  of tenant " + request.getTenantId());
+            Group group = userProfileClient.getGroup(request);
+            responseObserver.onNext(group);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at removeUserFromGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
+    public void getAllGroups(org.apache.custos.user.profile.service.GroupRequest request, StreamObserver<GetAllGroupsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to getAllGroups of tenant " + request.getTenantId());
+            GetAllGroupsResponse response = userProfileClient.getAllGroups(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at removeUserFromGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
+    public void addUserToGroup(GroupMembership request, StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to addUserToGroup for  user  " + request.getUsername() + " of tenant "
+                    + request.getTenantId());
+
+            updateProfile(request.getClientId(), request.getClientSec(), request.getTenantId(), request.getUsername());
+
+            org.apache.custos.user.profile.service.Status status = userProfileClient.addUserToGroup(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at addUserToGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
+    public void removeUserFromGroup(GroupMembership request, StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to removeUserFromGroup for  user  " + request.getUsername() + " of tenant "
+                    + request.getTenantId());
+            org.apache.custos.user.profile.service.Status status = userProfileClient.removeUserFromGroup(request);
+
+            Map<String, String> value = new HashMap<>();
+            value.put("GROUP_ID", request.getGroupId());
+            value.put("USER_ID",request.getUsername());
+            eventPublisher.publishMessage(request.getClientId(),
+                    request.getTenantId(),
+                    "GROUP_MANAGEMENT_SERVICE", "REMOVE_USER_FROM_GROUP",
+                    value);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+        } catch (Exception ex) {
+            String msg = "Error occurred at removeUserFromGroup " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
     public void addChildGroupToParentGroup(GroupToGroupMembership request,
-                                           StreamObserver<OperationStatus> responseObserver) {
+                                           StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
         try {
             LOGGER.debug("Request received to addChildGroupToParentGroup for  group  " + request.getChildId() +
                     " to add " + request.getParentId() + " of tenant " + request.getTenantId());
 
             org.apache.custos.user.profile.service.Status status = userProfileClient.addChildGroupToParentGroup(request);
 
-            OperationStatus operationStatus = OperationStatus.newBuilder().setStatus(status.getStatus()).build();
 
-            responseObserver.onNext(operationStatus);
+            responseObserver.onNext(status);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Error occurred at addChildGroupToParentGroup " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
     @Override
     public void removeChildGroupFromParentGroup(GroupToGroupMembership request,
-                                                StreamObserver<OperationStatus> responseObserver) {
+                                                StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
         try {
             LOGGER.debug("Request received to removeUserFromGroup for  group  " + request.getChildId() +
                     " to remove " + request.getParentId() + " of tenant " + request.getTenantId());
 
             org.apache.custos.user.profile.service.Status status = userProfileClient.removeChildGroupFromParentGroup(request);
 
-            OperationStatus operationStatus = OperationStatus.newBuilder().setStatus(status.getStatus()).build();
+            Map<String, String> value = new HashMap<>();
+            value.put("PARENT_GROUP_ID", request.getParentId());
+            value.put("CHILD_GROUP_ID",request.getChildId());
+            eventPublisher.publishMessage(request.getClientId(),
+                    request.getTenantId(),
+                    "GROUP_MANAGEMENT_SERVICE", "REMOVE_CHILD_GROUP_FROM_PARENT_GROUP",
+                    value);
 
-            responseObserver.onNext(operationStatus);
+
+            responseObserver.onNext(status);
             responseObserver.onCompleted();
 
 
         } catch (Exception ex) {
             String msg = "Error occurred at removeChildGroupFromParentGroup " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
@@ -403,11 +592,8 @@
         } catch (Exception ex) {
             String msg = "Error occurred at getAllGroupsOfUser " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
@@ -426,11 +612,8 @@
         } catch (Exception ex) {
             String msg = "Error occurred at getAllParentGroupsOfGroup " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
@@ -449,11 +632,8 @@
         } catch (Exception ex) {
             String msg = "Error occurred at getAllChildUsers " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
@@ -471,63 +651,156 @@
         } catch (Exception ex) {
             String msg = "Error occurred at getAllChildGroups " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
     @Override
-    public void changeUserMembershipType(GroupMembership request, StreamObserver<OperationStatus> responseObserver) {
+    public void changeUserMembershipType(GroupMembership request, StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
         try {
             LOGGER.debug("Request received to changeUserMembershipType for  user  "
                     + request.getUsername() + " of tenant " + request.getTenantId());
 
             org.apache.custos.user.profile.service.Status response = userProfileClient.changeUserMembershipType(request);
 
-            OperationStatus status = OperationStatus.newBuilder().setStatus(response.getStatus()).build();
+            Map<String, String> value = new HashMap<>();
+            value.put("USER_ID", request.getUsername());
+            value.put("GROUP_ID",request.getGroupId());
+            value.put("MEMBERSHIP_TYPE",request.getType());
+            eventPublisher.publishMessage(request.getClientId(),
+                    request.getTenantId(),
+                    "GROUP_MANAGEMENT_SERVICE", "CHANGE_USER_MEMBERSHIP",
+                    value);
 
-            responseObserver.onNext(status);
+
+            responseObserver.onNext(response);
             responseObserver.onCompleted();
 
 
         } catch (Exception ex) {
             String msg = "Error occurred at changeUserMembershipType " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
     @Override
-    public void hasAccess(GroupMembership request, StreamObserver<OperationStatus> responseObserver) {
+    public void hasAccess(GroupMembership request, StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
         try {
             LOGGER.debug("Request received to hasAccess for  user  "
                     + request.getUsername() + " of tenant " + request.getTenantId());
 
             org.apache.custos.user.profile.service.Status response = userProfileClient.hasAccess(request);
 
-            OperationStatus status = OperationStatus.newBuilder().setStatus(response.getStatus()).build();
-
-            responseObserver.onNext(status);
+            responseObserver.onNext(response);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
             String msg = "Error occurred at hasAccess " + ex.getMessage();
             LOGGER.error(msg, ex);
-            if (ex.getMessage().contains("UNAUTHENTICATED")) {
-                responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
-            } else {
-                responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
-            }
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
         }
     }
 
+    @Override
+    public void addGroupMembershipType(UserGroupMembershipTypeRequest request,
+                                       StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to addGroupMembershipType for  tenant " + request.getTenantId()
+                    + ", type " + request.getType());
+
+            org.apache.custos.user.profile.service.Status response = userProfileClient.addUserMembershipType(request);
+
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at addGroupMembershipType " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+
+    }
+
+    @Override
+    public void removeUserGroupMembershipType(UserGroupMembershipTypeRequest request,
+                                              StreamObserver<org.apache.custos.user.profile.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to removeUserGroupMembershipType for  tenant " + request.getTenantId()
+                    + ", type " + request.getType());
+
+            org.apache.custos.user.profile.service.Status response = userProfileClient.removeUserMembershipType(request);
+
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at removeUserGroupMembershipType " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+
+    }
+
+    private void updateProfile(String clientId, String clientSec, long tenantId, String username) {
+
+        UserProfile userProfile = UserProfile.newBuilder().setUsername(username).build();
+        UserProfileRequest userProfileRequest = UserProfileRequest
+                .newBuilder()
+                .setTenantId(tenantId)
+                .setProfile(userProfile)
+                .build();
+
+        UserProfile exUser = userProfileClient.getUser(userProfileRequest);
+        if (exUser.getUsername().isBlank()) {
+
+            GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
+                    .newBuilder()
+                    .setClientId(clientId)
+                    .setClientSecret(clientSec)
+                    .setTenantId(tenantId)
+                    .build();
+
+            AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);
+            UserSearchMetadata userSearchMetadata = UserSearchMetadata
+                    .newBuilder().setUsername(username).build();
+
+            UserSearchRequest searchRequest = UserSearchRequest
+                    .newBuilder()
+                    .setClientId(clientId)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token.getAccessToken())
+                    .setUser(userSearchMetadata)
+                    .build();
+
+            UserRepresentation representation = iamAdminServiceClient.getUser(searchRequest);
+
+            UserProfile profile = UserProfile
+                    .newBuilder()
+                    .setUsername(username)
+                    .setFirstName(representation.getFirstName())
+                    .setLastName(representation.getLastName())
+                    .setEmail(representation.getEmail())
+                    .build();
+
+            UserProfileRequest profileRequest = UserProfileRequest
+                    .newBuilder()
+                    .setTenantId(tenantId)
+                    .setProfile(profile)
+                    .build();
+
+            userProfileClient.createUserProfile(profileRequest);
+        }
+
+
+    }
+
+
     private org.apache.custos.user.profile.service.GroupRequest createGroup(GroupRepresentation representation,
                                                                             String parentId,
                                                                             long tenantId,
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/proto/GroupManagementService.proto b/custos-integration-services/group-management-service-parent/group-management-service/src/main/proto/GroupManagementService.proto
index faab105..df5d5bd 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/proto/GroupManagementService.proto
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/proto/GroupManagementService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.group.management.service;
+option go_package = "./pb";
 
 import "google/api/annotations.proto";
 import "UserProfileService.proto";
@@ -30,29 +31,81 @@
 
 service GroupManagementService {
 
-    rpc createGroups (org.apache.custos.iam.service.GroupsRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
+    rpc createKeycloakGroups (org.apache.custos.iam.service.GroupsRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
 
         option (google.api.http) = {
-           post: "/group-management/v1.0.0/groups"
+           post: "/group-management/v1.0.0/keycloak/groups"
          };
     }
 
 
-    rpc updateGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+    rpc updateKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+
+        option (google.api.http) = {
+           put: "/group-management/v1.0.0/keycloak/group/{id}"
+         };
+    }
+
+    rpc deleteKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/keycloak/group/{id}"
+         };
+    }
+
+    rpc findKeycloakGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/keycloak/group"
+         };
+    }
+
+
+    rpc getAllKeycloakGroups (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
+
+        option (google.api.http) = {
+           get: "/group-management/v1.0.0/keycloak/groups"
+         };
+    }
+
+    rpc addUserToKeycloakGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/keycloak/user/group/membership"
+         };
+    }
+
+
+    rpc removeUserFromKeycloakGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/keycloak/user/group/membership"
+         };
+    }
+
+    rpc createGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
+
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/group"
+         };
+    }
+
+
+    rpc updateGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
 
         option (google.api.http) = {
            put: "/group-management/v1.0.0/group/{id}"
          };
     }
 
-    rpc deleteGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc deleteGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Status) {
 
         option (google.api.http) = {
            delete: "/group-management/v1.0.0/group/{id}"
          };
     }
 
-    rpc findGroup (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupRepresentation) {
+    rpc findGroup (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.Group) {
 
         option (google.api.http) = {
            get: "/group-management/v1.0.0/group"
@@ -60,14 +113,14 @@
     }
 
 
-    rpc getAllGroups (org.apache.custos.iam.service.GroupRequest) returns (org.apache.custos.iam.service.GroupsResponse) {
+    rpc getAllGroups (org.apache.custos.user.profile.service.GroupRequest) returns (org.apache.custos.user.profile.service.GetAllGroupsResponse) {
 
         option (google.api.http) = {
            get: "/group-management/v1.0.0/groups"
          };
     }
 
-    rpc addUserToGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc addUserToGroup (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
 
         option (google.api.http) = {
            post: "/group-management/v1.0.0/user/group/membership"
@@ -75,20 +128,21 @@
     }
 
 
-    rpc removeUserFromGroup (org.apache.custos.iam.service.UserGroupMappingRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc removeUserFromGroup (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
 
         option (google.api.http) = {
            delete: "/group-management/v1.0.0/user/group/membership"
          };
     }
 
-    rpc addChildGroupToParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.iam.service.OperationStatus) {
+
+    rpc addChildGroupToParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.user.profile.service.Status) {
         option (google.api.http) = {
            post: "/group-management/v1.0.0/group/membership"
          };
 
     }
-    rpc removeChildGroupFromParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc removeChildGroupFromParentGroup (org.apache.custos.user.profile.service.GroupToGroupMembership) returns (org.apache.custos.user.profile.service.Status) {
 
         option (google.api.http) = {
            delete: "/group-management/v1.0.0/group/membership"
@@ -122,19 +176,33 @@
          };
 
     }
-    rpc changeUserMembershipType (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc changeUserMembershipType (org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
         option (google.api.http) = {
            put: "/group-management/v1.0.0/user/group/membership"
          };
 
     }
-    rpc hasAccess(org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.iam.service.OperationStatus) {
+    rpc hasAccess(org.apache.custos.user.profile.service.GroupMembership) returns (org.apache.custos.user.profile.service.Status) {
         option (google.api.http) = {
            get: "/group-management/v1.0.0/user/group/access"
          };
 
     }
 
+    rpc addGroupMembershipType(org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           post: "/group-management/v1.0.0/user/group/membership/type"
+         };
+
+    }
+
+    rpc removeUserGroupMembershipType(org.apache.custos.user.profile.service.UserGroupMembershipTypeRequest) returns (org.apache.custos.user.profile.service.Status) {
+        option (google.api.http) = {
+           delete: "/group-management/v1.0.0/user/group/membership/type"
+         };
+
+    }
+
 
 }
 
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/application.properties b/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/application.properties
index 3af6681..3767f76 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/application.properties
@@ -25,4 +25,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/group-management-service-parent/group-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service-sidecar/src/main/resources/identity-management-service.pb b/custos-integration-services/identity-management-service-parent/identity-management-service-sidecar/src/main/resources/identity-management-service.pb
index 7d6ebaa..9a00313 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service-sidecar/src/main/resources/identity-management-service.pb
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service-sidecar/src/main/resources/identity-management-service.pb
Binary files differ
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/Dockerfile b/custos-integration-services/identity-management-service-parent/identity-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/Dockerfile
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/pom.xml b/custos-integration-services/identity-management-service-parent/identity-management-service/pom.xml
index 7ced6c4..aeeb8ba 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/pom.xml
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/pom.xml
@@ -106,6 +106,17 @@
             <groupId>com.google.api.grpc</groupId>
             <artifactId>proto-google-common-protos</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>messaging-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>user-profile-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -124,6 +135,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/deployment.yaml
index a0957f6..668c290 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
         - name: {{ .Chart.Name }}-envoy-proxy
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress-grpc.yaml
index 0fbbed6..4200e90 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
          - path: /org.apache.custos.identity.management.service.IdentityManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress.yaml
index 078bfee..1e59c91 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /identity-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/values.yaml b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/values.yaml
index b79f6ef..45c6de0 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/helm/values.yaml
@@ -82,4 +82,7 @@
 readinessProbe:
   initialDelaySeconds: 5
   periodSeconds: 1
-  successThreshold: 1
\ No newline at end of file
+  successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/IdentityManagementServiceInitializer.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/IdentityManagementServiceInitializer.java
index 305c78f..e1e56d0 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/IdentityManagementServiceInitializer.java
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/IdentityManagementServiceInitializer.java
@@ -26,7 +26,6 @@
 import org.apache.custos.identity.management.interceptors.AgentAuthInterceptor;
 import org.apache.custos.identity.management.interceptors.AuthInterceptorImpl;
 import org.apache.custos.identity.management.interceptors.InputValidator;
-import org.apache.custos.identity.management.interceptors.ResponseInterceptor;
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.integration.core.interceptor.ServiceInterceptor;
 import org.apache.custos.integration.services.commons.interceptors.LoggingInterceptor;
@@ -84,5 +83,4 @@
     }
 
 
-
 }
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AgentAuthInterceptor.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AgentAuthInterceptor.java
index 155c402..0f3d37a 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AgentAuthInterceptor.java
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AgentAuthInterceptor.java
@@ -24,7 +24,7 @@
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.management.service.EndSessionRequest;
 import org.apache.custos.identity.management.service.GetAgentTokenRequest;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
@@ -32,6 +32,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * Responsible for authorize agent specific methods
  */
@@ -48,35 +50,38 @@
     @Override
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
         if (method.equals("getAgentToken")) {
-            AuthClaim claim = authorizeUsingAgentBasicToken(headers, ((GetAgentTokenRequest) msg).getClientId());
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            GetAgentTokenRequest reqCore =
-                    ((GetAgentTokenRequest) msg).toBuilder()
-                            .setTenantId(claim.getTenantId())
-                            .setAgentClientId(claim.getAgentClientId())
-                            .setAgentClientSecret(claim.getAgentClientSecret())
-                            .setAgentId(claim.getAgentId())
-                            .setAgentPassword(claim.getAgentPassword())
-                            .build();
+            Optional<AuthClaim> claim =
+                    authorizeUsingAgentBasicToken(headers, ((GetAgentTokenRequest) msg).getClientId());
+            return claim.map(cl -> {
+                GetAgentTokenRequest reqCore =
+                        ((GetAgentTokenRequest) msg).toBuilder()
+                                .setTenantId(cl.getTenantId())
+                                .setAgentClientId(cl.getAgentClientId())
+                                .setAgentClientSecret(cl.getAgentClientSecret())
+                                .setAgentId(cl.getAgentId())
+                                .setAgentPassword(cl.getAgentPassword())
+                                .build();
 
-            return (ReqT) reqCore;
+                return (ReqT) reqCore;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
         } else if (method.equals("endAgentSession")) {
-            LOGGER.info("ClientId " + ((EndSessionRequest) msg).getClientId());
-            AuthClaim claim = authorizeUsingAgentBasicToken(headers, ((EndSessionRequest) msg).getClientId());
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
+            Optional<AuthClaim> claim = authorizeUsingAgentBasicToken(headers, ((EndSessionRequest) msg).getClientId());
+            return claim.map(cl -> {
+                org.apache.custos.identity.service.EndSessionRequest endSessionRequest =
+                        ((EndSessionRequest) msg).getBody().toBuilder()
+                                .setClientId(cl.getAgentClientId())
+                                .setClientSecret(cl.getAgentClientSecret())
+                                .setTenantId(cl.getTenantId())
+                                .build();
+                return (ReqT) ((EndSessionRequest) msg).toBuilder().setBody(endSessionRequest).build();
 
 
-            org.apache.custos.identity.service.EndSessionRequest endSessionRequest =
-                    ((EndSessionRequest) msg).getBody().toBuilder()
-                            .setClientId(claim.getAgentClientId())
-                            .setClientSecret(claim.getAgentClientSecret())
-                            .setTenantId(claim.getTenantId())
-                            .build();
-            return (ReqT) ((EndSessionRequest) msg).toBuilder().setBody(endSessionRequest).build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         }
         return msg;
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AuthInterceptorImpl.java
index 416b79c..b00bc2b 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AuthInterceptorImpl.java
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/AuthInterceptorImpl.java
@@ -25,12 +25,11 @@
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.management.service.EndSessionRequest;
 import org.apache.custos.identity.management.service.GetCredentialsRequest;
-import org.apache.custos.identity.management.utils.Constants;
 import org.apache.custos.identity.service.AuthToken;
 import org.apache.custos.identity.service.AuthenticationRequest;
 import org.apache.custos.identity.service.Claim;
 import org.apache.custos.identity.service.GetTokenRequest;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
@@ -39,6 +38,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * Responsible for managing auth flow
  */
@@ -48,7 +49,8 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(AuthInterceptorImpl.class);
 
     @Autowired
-    public AuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+    public AuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient,
+                               TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
         super(credentialStoreServiceClient, tenantProfileClient, identityClient);
     }
 
@@ -56,145 +58,116 @@
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
 
         if (method.equals("authorize") || method.equals("getAgentToken") || method.equals("endAgentSession")) {
-
             return reqT;
         }
 
-
         if (method.equals("authenticate")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            AuthenticationRequest reqCore =
-                    ((AuthenticationRequest) reqT).toBuilder()
-                            .setTenantId(claim.getTenantId())
-                            .setClientId(claim.getIamAuthId())
-                            .setClientSecret(claim.getIamAuthSecret())
-                            .build();
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                AuthenticationRequest reqCore =
+                        ((AuthenticationRequest) reqT).toBuilder()
+                                .setTenantId(cl.getTenantId())
+                                .setClientId(cl.getIamAuthId())
+                                .setClientSecret(cl.getIamAuthSecret())
+                                .build();
 
-            return (ReqT) reqCore;
-        } else if (method.equals("isAuthenticated")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
+                return (ReqT) reqCore;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("isAuthenticated") || method.equals("getUser")) {
+            Optional<AuthClaim> claim = authorize(headers);
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
             }
 
             String accessToken = ((AuthToken) reqT).getAccessToken();
 
+            Optional<AuthClaim> authClaim = authorizeUsingUserToken(accessToken);
+
             AuthToken.Builder authzBuilder = AuthToken.newBuilder()
                     .setAccessToken(accessToken);
 
-            String username = null;
+            if (authClaim.isPresent()) {
+                Claim userClaim = Claim.newBuilder().setKey("username").setValue(authClaim.get()
+                        .getUsername()).build();
 
-            for (Claim claims : ((AuthToken) reqT).getClaimsList()) {
-                if (claims.getKey().equals("username")) {
-                    username = claims.getValue();
-                }
+                Claim tenantClaim = Claim.newBuilder().setKey("tenantId").setValue(String.valueOf(authClaim.get()
+                        .getTenantId())).build();
+                Claim clientClaim = Claim.newBuilder().setKey("clientId").setValue(String.valueOf(authClaim.get()
+                        .getCustosId())).build();
+                authzBuilder.addClaims(userClaim);
+                authzBuilder.addClaims(tenantClaim);
+                authzBuilder.addClaims(clientClaim);
+            } else {
+                throw new UnAuthorizedException("Request is not authorized, User token not found", null);
             }
-            Claim userClaim = Claim.newBuilder().setKey("username").setValue(username).build();
-
-            Claim tenantClaim = Claim.newBuilder().setKey("tenantId").setValue(String.valueOf(claim.getTenantId())).build();
-
-            authzBuilder.addClaims(userClaim);
-            authzBuilder.addClaims(tenantClaim);
-
             return (ReqT) authzBuilder.build();
 
 
-        } else if (method.equals("getUser")) {
-
-            AuthToken authToken = ((AuthToken) reqT);
-            String clientId = null;
-            for (Claim claim : authToken.getClaimsList()) {
-                if (claim.getKey().equals(Constants.CLIENT_ID)) {
-                    clientId = claim.getValue();
-                }
-            }
-
-            String username = null;
-            for (Claim claims : ((AuthToken) reqT).getClaimsList()) {
-                if (claims.getKey().equals("username")) {
-                    username = claims.getValue();
-                }
-            }
-
-            String accessToken = ((AuthToken) reqT).getAccessToken();
-            AuthToken.Builder authzBuilder = AuthToken.newBuilder()
-                    .setAccessToken(accessToken);
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            long tenantId = claim.getTenantId();
-
-            Claim userClaim = Claim.newBuilder().setKey("username").setValue(username).build();
-            Claim tenantClaim = Claim.newBuilder().setKey("tenantId").setValue(String.valueOf(tenantId)).build();
-            authzBuilder.addClaims(userClaim);
-            authzBuilder.addClaims(tenantClaim);
-
-            return (ReqT) authzBuilder.build();
         } else if (method.equals("getUserManagementServiceAccountAccessToken")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            org.apache.custos.identity.service.GetUserManagementSATokenRequest request =
-                    org.apache.custos.identity.service.GetUserManagementSATokenRequest
-                            .newBuilder()
-                            .setTenantId(claim.getTenantId())
-                            .setClientId(claim.getIamAuthId())
-                            .setClientSecret(claim.getIamAuthSecret())
-                            .build();
-            return (ReqT) request;
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                org.apache.custos.identity.service.GetUserManagementSATokenRequest request =
+                        org.apache.custos.identity.service.GetUserManagementSATokenRequest
+                                .newBuilder()
+                                .setTenantId(cl.getTenantId())
+                                .setClientId(cl.getIamAuthId())
+                                .setClientSecret(cl.getIamAuthSecret())
+                                .build();
+                return (ReqT) request;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("token")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            GetTokenRequest request = ((GetTokenRequest) reqT).toBuilder()
-                    .setTenantId(claim.getTenantId())
-                    .setClientId(claim.getIamAuthId())
-                    .setClientSecret(claim.getIamAuthSecret())
-                    .build();
-            return (ReqT) request;
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                GetTokenRequest request = ((GetTokenRequest) reqT).toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getIamAuthId())
+                        .setClientSecret(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("getCredentials")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
+            String clientId = ((GetCredentialsRequest) reqT).getClientId();
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                Credentials credentials = Credentials.newBuilder()
+                        .setCustosClientId(cl.getCustosId())
+                        .setCustosClientSecret(cl.getCustosSecret())
+                        .setCustosClientIdIssuedAt(cl.getCustosIdIssuedAt())
+                        .setCustosClientSecretExpiredAt(cl.getCustosSecretExpiredAt())
+                        .setCiLogonClientId(cl.getCiLogonId())
+                        .setCiLogonClientSecret(cl.getCiLogonSecret())
+                        .setIamClientId(cl.getIamAuthId())
+                        .setIamClientSecret(cl.getIamAuthSecret())
+                        .build();
 
-            Credentials credentials = Credentials.newBuilder()
-                    .setCustosClientId(claim.getCustosId())
-                    .setCustosClientSecret(claim.getCustosSecret())
-                    .setCustosClientIdIssuedAt(claim.getCustosIdIssuedAt())
-                    .setCustosClientSecretExpiredAt(claim.getCustosSecretExpiredAt())
-                    .setCiLogonClientId(claim.getCiLogonId())
-                    .setCiLogonClientSecret(claim.getCiLogonSecret())
-                    .setIamClientId(claim.getIamAuthId())
-                    .setIamClientSecret(claim.getIamAuthSecret())
-                    .build();
-
-            return (ReqT) ((GetCredentialsRequest) reqT).toBuilder().setCredentials(credentials).build();
+                return (ReqT) ((GetCredentialsRequest) reqT).toBuilder().setCredentials(credentials).build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
 
         } else if (method.equals("endUserSession")) {
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            org.apache.custos.identity.service.EndSessionRequest endSessionRequest =
-                    ((EndSessionRequest) reqT).getBody().toBuilder()
-                            .setClientId(claim.getIamAuthId())
-                            .setClientSecret(claim.getIamAuthSecret())
-                            .setTenantId(claim.getTenantId())
-                            .build();
-            return (ReqT) ((EndSessionRequest) reqT).toBuilder().setBody(endSessionRequest).build();
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                org.apache.custos.identity.service.EndSessionRequest endSessionRequest =
+                        ((EndSessionRequest) reqT).getBody().toBuilder()
+                                .setClientId(cl.getIamAuthId())
+                                .setClientSecret(cl.getIamAuthSecret())
+                                .setTenantId(cl.getTenantId())
+                                .build();
+                return (ReqT) ((EndSessionRequest) reqT).toBuilder().setBody(endSessionRequest).build();
 
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         }
 
         return reqT;
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/InputValidator.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/InputValidator.java
index 9ce7a78..379d4c3 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/InputValidator.java
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/InputValidator.java
@@ -67,16 +67,16 @@
 
             AuthorizationRequest request = (AuthorizationRequest) body;
 
-            if (request.getResponseType() == null || !request.getResponseType().trim().equals(Constants.AUTHORIZATION_CODE)) {
+            if (request.getResponseType().isEmpty() || !request.getResponseType().trim().equals(Constants.AUTHORIZATION_CODE)) {
                 throw new MissingParameterException("Incorrect response type", null);
             }
-            if (request.getClientId() == null || !request.getClientId().trim().equals("")) {
+            if (request.getClientId().isEmpty()) {
                 throw new MissingParameterException("ClientId is not available", null);
             }
-            if (request.getRedirectUri() == null || request.getRedirectUri().trim().equals("")) {
+            if (request.getRedirectUri().isEmpty()) {
                 throw new MissingParameterException("redirectUri is not available", null);
             }
-            if (request.getScope() == null || request.getScope().trim().equals("")) {
+            if (request.getScope().isEmpty()) {
                 throw new MissingParameterException("scope is not available", null);
             }
 
@@ -89,14 +89,15 @@
     private boolean validateGetAgentToken(Metadata headers, Object body, String method) {
         validationAuthorizationHeader(headers);
 
-            GetAgentTokenRequest request = (GetAgentTokenRequest) body;
+        GetAgentTokenRequest request = (GetAgentTokenRequest) body;
 
-            if (request.getClientId() == null || request.getClientId().trim().equals("")) {
-                throw new MissingParameterException("ClientId is not available", null);
-            } if (request.getGrantType() == null || !(request.getGrantType().equals(Constants.CLIENT_CREDENTIALS) ||
-                    request.getGrantType().equals(Constants.REFERESH_TOKEN))) {
-                throw new MissingParameterException("Grant type should not be null", null);
-            }
+        if (request.getClientId().isEmpty()) {
+            throw new MissingParameterException("ClientId is not available", null);
+        }
+        if (request.getGrantType().isEmpty() || !(request.getGrantType().equals(Constants.CLIENT_CREDENTIALS) ||
+                request.getGrantType().equals(Constants.REFERESH_TOKEN))) {
+            throw new MissingParameterException("Grant type should not be null", null);
+        }
 
         return true;
     }
@@ -114,7 +115,7 @@
     private boolean validationGetOIDCConfiguration(Metadata headers, Object body, String method) {
         if (body instanceof GetOIDCConfiguration) {
             GetOIDCConfiguration configuration = (GetOIDCConfiguration) body;
-            if (configuration.getClientId() == null || configuration.getClientId().equals("")) {
+            if (configuration.getClientId().isEmpty()) {
                 throw new MissingParameterException("Client Id  is not available", null);
             }
         }
@@ -125,7 +126,7 @@
     private boolean validationGetCredentials(Metadata headers, Object body, String method) {
         if (body instanceof GetCredentialsRequest) {
             GetCredentialsRequest configuration = (GetCredentialsRequest) body;
-            if (configuration.getClientId() == null || configuration.getClientId().equals("")) {
+            if (configuration.getClientId().isEmpty()) {
                 throw new MissingParameterException("Client Id  is not available", null);
             }
         }
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/ResponseInterceptor.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/ResponseInterceptor.java
deleted file mode 100644
index 1727b91..0000000
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/interceptors/ResponseInterceptor.java
+++ /dev/null
@@ -1,63 +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.custos.identity.management.interceptors;
-
-import io.grpc.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-
-public class ResponseInterceptor implements ServerInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ResponseInterceptor.class);
-
-    @Override
-    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata,
-                                                                 ServerCallHandler<ReqT, RespT> serverCallHandler) {
-
-        LOGGER.info("right now calling");
-        return serverCallHandler.startCall(new ForwardingServerCall.SimpleForwardingServerCall<ReqT, RespT>(serverCall) {
-
-
-            @Override
-            public void sendHeaders(Metadata responseHeaders) {
-                Metadata.Key<String> CUSTOM_HEADER_KEY =
-                        Metadata.Key.of("Location", Metadata.ASCII_STRING_MARSHALLER);
-                Metadata.Key<String> HEADER_KEY =
-                        Metadata.Key.of("grpc-status", Metadata.ASCII_STRING_MARSHALLER);
-                responseHeaders.put(CUSTOM_HEADER_KEY, "https://location.com");
-                responseHeaders.put(HEADER_KEY, "302");
-                LOGGER.info("Header Location" + "settet");
-
-                Set<String> keys = responseHeaders.keys();
-
-                for (String key : keys) {
-                    LOGGER.info("Key " + key);
-                    Metadata.Key<String> KEY =
-                            Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
-                    LOGGER.info("Value " + responseHeaders.get(KEY));
-                }
-
-                super.sendHeaders(responseHeaders);
-            }
-
-        }, metadata);
-    }
-}
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/service/IdentityManagementService.java b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/service/IdentityManagementService.java
index 80e0ec6..b2efea6 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/service/IdentityManagementService.java
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/java/org/apache/custos/identity/management/service/IdentityManagementService.java
@@ -20,6 +20,7 @@
 package org.apache.custos.identity.management.service;
 
 import com.google.protobuf.Struct;
+import io.grpc.Context;
 import io.grpc.Status;
 import io.grpc.stub.StreamObserver;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
@@ -30,15 +31,22 @@
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.management.utils.Constants;
 import org.apache.custos.identity.service.*;
+import org.apache.custos.integration.services.commons.utils.EmailSender;
+import org.apache.custos.messaging.email.service.CustosEvent;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
 import org.apache.custos.tenant.profile.service.GetTenantRequest;
 import org.apache.custos.tenant.profile.service.GetTenantResponse;
 import org.apache.custos.tenant.profile.service.Tenant;
+import org.apache.custos.user.profile.client.UserProfileClient;
+import org.apache.custos.user.profile.service.UserProfile;
 import org.lognet.springboot.grpc.GRpcService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * The grpc service class to use for Identity management related services
  */
@@ -56,6 +64,13 @@
     @Autowired
     private CredentialStoreServiceClient credentialStoreServiceClient;
 
+    @Autowired
+    private UserProfileClient userProfileClient;
+
+
+    @Autowired
+    private EmailSender emailSender;
+
     @Override
     public void authenticate(AuthenticationRequest request, StreamObserver<AuthToken> responseObserver) {
         try {
@@ -103,10 +118,10 @@
     }
 
     @Override
-    public void isAuthenticated(AuthToken request, StreamObserver<IsAuthenticateResponse> responseObserver) {
+    public void isAuthenticated(AuthToken request, StreamObserver<IsAuthenticatedResponse> responseObserver) {
         try {
             LOGGER.debug("Request received  to isAuthenticated ");
-            IsAuthenticateResponse response = identityClient.isAuthenticated(request);
+            IsAuthenticatedResponse response = identityClient.isAuthenticated(request);
             responseObserver.onNext(response);
             responseObserver.onCompleted();
         } catch (Exception ex) {
@@ -191,6 +206,57 @@
 
             Struct response = identityClient.getAccessToken(request);
 
+            Context ctx = Context.current().fork();
+            ctx.run(() -> {
+                long tenantId = request.getTenantId();
+                if (response.getFieldsMap().get("access_token").isInitialized() &&
+                        !response.getFieldsMap().get("access_token").equals("")) {
+                    String accessToken = response.getFieldsMap().get("access_token").getStringValue();
+                    LOGGER.info(accessToken);
+                    String clientId = request.getClientId();
+                    AuthToken authToken = AuthToken.newBuilder()
+                            .setAccessToken(accessToken)
+                            .addClaims(Claim.newBuilder().setKey("clientId").setValue(clientId).build())
+                            .addClaims(Claim.newBuilder().setKey("username").setValue("isjarana"))
+                            .addClaims(Claim.newBuilder().setKey("tenantId").setValue(String.valueOf(tenantId))
+                                    .build()).build();
+                    User user = identityClient.getUser(authToken);
+                    LOGGER.info("User" + user.getUsername());
+
+                    UserProfile userProfile = UserProfile.newBuilder()
+                            .setUsername(user.getUsername())
+                            .setFirstName(user.getFirstName())
+                            .setLastName(user.getLastName())
+                            .setEmail(user.getEmailAddress())
+                            .build();
+                    org.apache.custos.user.profile.service.UserProfileRequest req =
+                            org.apache.custos.user.profile.service.UserProfileRequest
+                                    .newBuilder()
+                                    .setTenantId(request.getTenantId())
+                                    .setProfile(userProfile)
+                                    .build();
+
+                    UserProfile exsistingProfile = userProfileClient.getUser(req);
+                    Map<String, String> values = new HashMap<>();
+                    values.put("param:username", user.getUsername());
+                    values.put("param:first_name", user.getFirstName());
+                    values.put("param:last_name", user.getLastName());
+                    values.put("param:email", user.getEmailAddress());
+                    values.put("param:tenant_id", request.getClientId());
+
+                    if (exsistingProfile == null || exsistingProfile.getUsername().trim().isEmpty()) {
+                        userProfileClient.createUserProfile(req);
+                        org.apache.custos.tenant.profile.service.GetTenantRequest tenantReq =
+                                org.apache.custos.tenant.profile.service.GetTenantRequest
+                                        .newBuilder().setTenantId(request.getTenantId()).build();
+
+                        org.apache.custos.tenant.profile.service.GetTenantResponse tenantResponse =
+                                tenantProfileClient.getTenant(tenantReq);
+                        values.put("param:tenant_name", tenantResponse.getTenant().getClientName());
+                        emailSender.sendEmail(tenantId, CustosEvent.NEW_USER_SIGNUP, values);
+                    }
+                }
+            });
             responseObserver.onNext(response);
             responseObserver.onCompleted();
 
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/proto/IdentityManagementService.proto b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/proto/IdentityManagementService.proto
index ae10be1..486f1e9 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/proto/IdentityManagementService.proto
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/proto/IdentityManagementService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.identity.management.service;
+option go_package = "./pb";
 
 import "google/api/annotations.proto";
 import "IdentityService.proto";
@@ -78,7 +79,7 @@
          };
     }
 
-    rpc isAuthenticated (org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.IsAuthenticateResponse) {
+    rpc isAuthenticated (org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.IsAuthenticatedResponse) {
         option (google.api.http) = {
            get: "/identity-management/v1.0.0/authenticate/status"
          };
@@ -149,4 +150,11 @@
            body: "body"
          };
     }
+
+    rpc isAgentAuthenticated(org.apache.custos.identity.service.AuthToken) returns (org.apache.custos.identity.service.IsAuthenticatedResponse) {
+        option (google.api.http) = {
+           post: "/identity-management/v1.0.0/agent/authentication/status"
+
+         };
+    }
 }
\ No newline at end of file
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/application.properties b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/application.properties
index f63fe56..882a9bd 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/identity-management-service-parent/identity-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/Dockerfile b/custos-integration-services/log-management-service-parent/log-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/Dockerfile
+++ b/custos-integration-services/log-management-service-parent/log-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/pom.xml b/custos-integration-services/log-management-service-parent/log-management-service/pom.xml
index b1392ad..90d38f8 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/pom.xml
+++ b/custos-integration-services/log-management-service-parent/log-management-service/pom.xml
@@ -144,6 +144,7 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -162,6 +163,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/deployment.yaml
index a0957f6..668c290 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
         - name: {{ .Chart.Name }}-envoy-proxy
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress-grpc.yaml
index aa95840..26fcd4a 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
           - path: /org.apache.custos.log.management.service.LogManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress.yaml
index 708e8ab..64b7f2f 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /log-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/values.yaml b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/values.yaml
index 9bbe139..05f0e39 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/helm/values.yaml
@@ -80,6 +80,7 @@
    webport: 50001
    adminport: 9901
 
+
 rollingUpdate:
   maxSurge: 1
   maxUnavailable: 25%
@@ -88,3 +89,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/LogManagementServiceInitializer.java b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/LogManagementServiceInitializer.java
index 362d9b1..94e87c4 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/LogManagementServiceInitializer.java
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/LogManagementServiceInitializer.java
@@ -26,9 +26,8 @@
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.integration.core.interceptor.ServiceInterceptor;
 import org.apache.custos.integration.services.commons.interceptors.LoggingInterceptor;
-import org.apache.custos.log.management.interceptors.ClientAuthInterceptorImpl;
+import org.apache.custos.log.management.interceptors.AuthInterceptorImpl;
 import org.apache.custos.log.management.interceptors.InputValidator;
-import org.apache.custos.log.management.interceptors.UserAuthInterceptorImpl;
 import org.lognet.springboot.grpc.GRpcGlobalInterceptor;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -65,12 +64,10 @@
 
     @Bean
     public Stack<IntegrationServiceInterceptor> getInterceptorSet(InputValidator inputValidator,
-                                                                  ClientAuthInterceptorImpl authInterceptor,
-                                                                  UserAuthInterceptorImpl userAuthInterceptor,
+                                                                  AuthInterceptorImpl userAuthInterceptor,
                                                                   LoggingInterceptor loggingInterceptor) {
         Stack<IntegrationServiceInterceptor> interceptors = new Stack<>();
         interceptors.add(inputValidator);
-        interceptors.add(authInterceptor);
         interceptors.add(userAuthInterceptor);
         interceptors.add(loggingInterceptor);
         return interceptors;
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/AuthInterceptorImpl.java
new file mode 100644
index 0000000..1356f36
--- /dev/null
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/AuthInterceptorImpl.java
@@ -0,0 +1,126 @@
+/*
+ * 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.custos.log.management.interceptors;
+
+import io.grpc.Metadata;
+import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
+import org.apache.custos.identity.client.IdentityClient;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
+import org.apache.custos.integration.core.utils.Constants;
+import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
+import org.apache.custos.integration.services.commons.model.AuthClaim;
+import org.apache.custos.logging.service.LogEventRequest;
+import org.apache.custos.logging.service.LoggingConfigurationRequest;
+import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+/**
+ * Responsible for validate user specific authorization
+ * Methods authenticates users access tokens are implemented here
+ */
+@Component
+public class AuthInterceptorImpl extends MultiTenantAuthInterceptor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AuthInterceptorImpl.class);
+
+    @Autowired
+    public AuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
+    }
+
+    @Override
+    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
+
+
+        if (method.equals("enable")) {
+            LoggingConfigurationRequest loggingConfigRequest = (LoggingConfigurationRequest) msg;
+            headers = attachUserToken(headers, loggingConfigRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, loggingConfigRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            if (!claim.get().isAdmin()) {
+                throw new UnAuthorizedException("Your are not a tenant admin", null);
+            }
+
+            long tenantId = claim.get().getTenantId();
+
+            return (ReqT) ((LoggingConfigurationRequest) msg).toBuilder()
+                    .setTenantId(tenantId)
+                    .build();
+        } else if (method.equals("getLogEvents")) {
+            LogEventRequest request = (LogEventRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((LogEventRequest) msg).toBuilder()
+                        .setClientId(oauthId)
+                        .setTenantId(tenantId)
+                        .build();
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("isLogEnabled")) {
+
+            LoggingConfigurationRequest request = (LoggingConfigurationRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+
+                long tenantId = cl.getTenantId();
+                LoggingConfigurationRequest registerUserRequest =
+                        ((LoggingConfigurationRequest) msg).toBuilder()
+                                .setTenantId(tenantId)
+                                .setClientId(oauthId)
+                                .build();
+
+                return (ReqT) registerUserRequest;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        }
+        return msg;
+    }
+
+
+    private Metadata attachUserToken(Metadata headers, String clientId) {
+        if (clientId == null || clientId.trim().equals("")) {
+            String formattedUserToken = getToken(headers);
+            headers.put(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER), formattedUserToken);
+            return headers;
+        }
+        return headers;
+    }
+
+
+}
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/ClientAuthInterceptorImpl.java
deleted file mode 100644
index 4daee2e..0000000
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/ClientAuthInterceptorImpl.java
+++ /dev/null
@@ -1,92 +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.custos.log.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
-import org.apache.custos.integration.services.commons.model.AuthClaim;
-import org.apache.custos.logging.service.LogEventRequest;
-import org.apache.custos.logging.service.LoggingConfigurationRequest;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate confidential client specific authorization.
- * Methods which authenticates based only on client are implemented here.
- */
-@Component
-public class ClientAuthInterceptorImpl extends MultiTenantAuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    @Autowired
-    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
-
-
-        if (method.equals("getLogEvents")) {
-            LogEventRequest request = (LogEventRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-
-            long tenantId = claim.getTenantId();
-            return (ReqT) ((LogEventRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .build();
-
-        } else if (method.equals("isLogEnabled")) {
-
-            LoggingConfigurationRequest request = (LoggingConfigurationRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-
-            long tenantId = claim.getTenantId();
-            LoggingConfigurationRequest registerUserRequest =
-                    ((LoggingConfigurationRequest) reqT).toBuilder()
-                            .setTenantId(tenantId)
-                            .setClientId(oauthId)
-                            .build();
-
-            return (ReqT) registerUserRequest;
-        }
-        return reqT;
-    }
-
-}
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/UserAuthInterceptorImpl.java b/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/UserAuthInterceptorImpl.java
deleted file mode 100644
index 1e403f4..0000000
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/java/org/apache/custos/log/management/interceptors/UserAuthInterceptorImpl.java
+++ /dev/null
@@ -1,86 +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.custos.log.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.core.utils.Constants;
-import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
-import org.apache.custos.integration.services.commons.model.AuthClaim;
-import org.apache.custos.logging.service.LoggingConfigurationRequest;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate user specific authorization
- * Methods authenticates users access tokens are implemented here
- */
-@Component
-public class UserAuthInterceptorImpl extends MultiTenantAuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    @Autowired
-    public UserAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
-
-
-        if (method.equals("enable")) {
-            LoggingConfigurationRequest loggingConfigRequest = (LoggingConfigurationRequest) msg;
-            headers = attachUserToken(headers, loggingConfigRequest.getClientId());
-            AuthClaim claim = authorize(headers, loggingConfigRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            if (!claim.isAdmin()) {
-                throw new NotAuthorizedException("Your are not a tenant admin", null);
-            }
-
-            long tenantId = claim.getTenantId();
-
-            return (ReqT) ((LoggingConfigurationRequest) msg).toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
-        }
-        return msg;
-    }
-
-
-    private Metadata attachUserToken(Metadata headers, String clientId) {
-        if (clientId == null || clientId.trim().equals("")) {
-            String formattedUserToken = getToken(headers);
-            headers.put(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER), formattedUserToken);
-            return headers;
-        }
-        return headers;
-    }
-
-
-}
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/proto/LogManagementService.proto b/custos-integration-services/log-management-service-parent/log-management-service/src/main/proto/LogManagementService.proto
index 25a5133..3b1c772 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/proto/LogManagementService.proto
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/proto/LogManagementService.proto
@@ -28,7 +28,7 @@
 import "google/protobuf/struct.proto";
 import "LoggingService.proto";
 
-
+option go_package = "./pb";
 
 service LogManagementService {
 
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/application.properties b/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/application.properties
index 7b72b95..8111e5f 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/log-management-service-parent/log-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/pom.xml b/custos-integration-services/pom.xml
index 3e41b46..47fc278 100644
--- a/custos-integration-services/pom.xml
+++ b/custos-integration-services/pom.xml
@@ -42,6 +42,7 @@
         <module>resource-secret-management-service-parent</module>
         <module>sharing-management-service-parent</module>
         <module>log-management-service-parent</module>
+        <module>custos-integration-services-swagger</module>
 
     </modules>
 
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service-sidecar/src/main/resources/resource-secret-management-service.pb b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service-sidecar/src/main/resources/resource-secret-management-service.pb
index a2e19f0..ae6e9b2 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service-sidecar/src/main/resources/resource-secret-management-service.pb
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service-sidecar/src/main/resources/resource-secret-management-service.pb
Binary files differ
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/Dockerfile b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/Dockerfile
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/pom.xml b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/pom.xml
index e4972c4..b563851 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/pom.xml
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/pom.xml
@@ -133,6 +133,7 @@
             <groupId>io.kubernetes</groupId>
             <artifactId>client-java</artifactId>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -151,6 +152,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/deployment.yaml
index a0957f6..668c290 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -45,9 +46,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
         - name: {{ .Chart.Name }}-envoy-proxy
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress-grpc.yaml
index 3c97bc2..efdc37a 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
           - path: /org.apache.custos.resource.secret.management.service.ResourceSecretManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress.yaml
index b71a1d0..fb98f11 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /resource-secret-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/values.yaml b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/values.yaml
index 0928901..4e39553 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/helm/values.yaml
@@ -88,3 +88,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/ResourceSecretManagementInitializer.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/ResourceSecretManagementInitializer.java
index 8610dd3..8018d95 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/ResourceSecretManagementInitializer.java
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/ResourceSecretManagementInitializer.java
@@ -26,9 +26,8 @@
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.integration.core.interceptor.ServiceInterceptor;
 import org.apache.custos.integration.services.commons.interceptors.LoggingInterceptor;
-import org.apache.custos.resource.secret.management.interceptors.ClientAuthInterceptorImpl;
+import org.apache.custos.resource.secret.management.interceptors.AuthInterceptorImpl;
 import org.apache.custos.resource.secret.management.interceptors.InputValidator;
-import org.apache.custos.resource.secret.management.interceptors.UserAuthInterceptorImpl;
 import org.lognet.springboot.grpc.GRpcGlobalInterceptor;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -66,13 +65,11 @@
 
     @Bean
     public Stack<IntegrationServiceInterceptor> getInterceptorSet(InputValidator validator,
-                                                                  ClientAuthInterceptorImpl authInterceptor,
-                                                                  UserAuthInterceptorImpl userAuthInterceptor,
+                                                                  AuthInterceptorImpl authInterceptor,
                                                                   LoggingInterceptor loggingInterceptor) {
         Stack<IntegrationServiceInterceptor> interceptors = new Stack<>();
         interceptors.add(validator);
         interceptors.add(authInterceptor);
-        interceptors.add(userAuthInterceptor);
         interceptors.add(loggingInterceptor);
 
         return interceptors;
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/AuthInterceptorImpl.java
new file mode 100644
index 0000000..1fca7f0
--- /dev/null
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/AuthInterceptorImpl.java
@@ -0,0 +1,205 @@
+/*
+ * 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.custos.resource.secret.management.interceptors;
+
+import io.grpc.Metadata;
+import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
+import org.apache.custos.identity.client.IdentityClient;
+import org.apache.custos.identity.service.GetJWKSRequest;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
+import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
+import org.apache.custos.integration.services.commons.model.AuthClaim;
+import org.apache.custos.resource.secret.service.*;
+import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+/**
+ * Responsible for validate confidential client specific authorization.
+ * Methods which authenticates based only on client are implemented here.
+ */
+@Component
+public class AuthInterceptorImpl extends MultiTenantAuthInterceptor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AuthInterceptorImpl.class);
+
+    @Autowired
+    public AuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
+    }
+
+    @Override
+    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
+
+        if (method.equals("getSecret")) {
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((GetSecretRequest) reqT).toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("getJWKS")) {
+            Optional<AuthClaim> claim = authorize(headers);
+
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((GetJWKSRequest) reqT).toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSecret(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("getAllResourceCredentialSummaries")) {
+            String clientId = ((GetResourceCredentialSummariesRequest) reqT).getClientId();
+
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                return (ReqT) ((GetResourceCredentialSummariesRequest) reqT).toBuilder()
+                        .setTenantId(cl.getTenantId()).build();
+
+            }).orElseThrow(() -> {
+
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("addSSHCredential")) {
+            String clientId = ((SSHCredential) reqT).getMetadata().getClientId();
+
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((SSHCredential) reqT).getMetadata().toBuilder()
+                        .setTenantId(cl.getTenantId()).build();
+
+                return (ReqT) ((SSHCredential) reqT).toBuilder().setMetadata(metadata).build();
+
+            }).orElseThrow(() -> {
+
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("addPasswordCredential")) {
+            String clientId = ((PasswordCredential) reqT).getMetadata().getClientId();
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((PasswordCredential) reqT).
+                        getMetadata().toBuilder().setTenantId(cl.getTenantId()).build();
+
+                return (ReqT) ((PasswordCredential) reqT).toBuilder().setMetadata(metadata).build();
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("addCertificateCredential")) {
+            String clientId = ((CertificateCredential) reqT).getMetadata().getClientId();
+
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((CertificateCredential) reqT).getMetadata()
+                        .toBuilder().setTenantId(cl.getTenantId()).build();
+
+                return (ReqT) ((CertificateCredential) reqT).toBuilder().setMetadata(metadata).build();
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("updateCertificateCredential")) {
+            String clientId = ((CertificateCredential) reqT).getMetadata().getClientId();
+
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((CertificateCredential) reqT).getMetadata()
+                        .toBuilder().setTenantId(cl.getTenantId()).build();
+
+                return (ReqT) ((CertificateCredential) reqT).toBuilder().setMetadata(metadata).build();
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("getSSHCredential") || method.equals("getPasswordCredential") || method.equals("getCertificateCredential")
+                || method.equals("deleteSSHCredential") || method.equals("deletePWDCredential") || method.equals("deleteCertificateCredential")
+                || method.equals("getResourceCredentialSummary")) {
+            String clientId = ((GetResourceCredentialByTokenRequest) reqT).getClientId();
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                return (ReqT) ((GetResourceCredentialByTokenRequest) reqT).toBuilder().
+                        setTenantId(cl.getTenantId()).build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("getKVCredential") || method.equals("addKVCredential") || method.equals("updateKVCredential")
+                || method.equals("deleteKVCredential")) {
+            String clientId = ((KVCredential) reqT).getMetadata().getClientId();
+
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((KVCredential) reqT)
+                        .getMetadata()
+                        .toBuilder().setOwnerId(cl.getUsername()).setTenantId(cl.getTenantId()).build();
+                return (ReqT) ((KVCredential) reqT).toBuilder().setMetadata(metadata).build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("getCredentialMap") || method.equals("addCredentialMap") || method.equals("updateCredentialMap")
+                || method.equals("deleteCredentialMap")) {
+            String clientId = ((CredentialMap) reqT).getMetadata().getClientId();
+            Optional<AuthClaim> claim = authorize(headers, clientId);
+
+            return claim.map(cl -> {
+                SecretMetadata metadata = ((CredentialMap) reqT)
+                        .getMetadata()
+                        .toBuilder().setTenantId(cl.getTenantId()).build();
+                return (ReqT) ((CredentialMap) reqT).toBuilder().setMetadata(metadata).build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        }
+        return reqT;
+    }
+
+}
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/ClientAuthInterceptorImpl.java
deleted file mode 100644
index 3ffa22c..0000000
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/ClientAuthInterceptorImpl.java
+++ /dev/null
@@ -1,145 +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.custos.resource.secret.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.identity.service.GetJWKSRequest;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
-import org.apache.custos.integration.services.commons.model.AuthClaim;
-import org.apache.custos.resource.secret.service.*;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate confidential client specific authorization.
- * Methods which authenticates based only on client are implemented here.
- */
-@Component
-public class ClientAuthInterceptorImpl extends MultiTenantAuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    @Autowired
-    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
-
-        if (method.equals("getSecret")) {
-            AuthClaim claim = authorize(headers);
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            return (ReqT) ((GetSecretRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId)
-                    .build();
-
-        } else if (method.equals("getJWKS")) {
-            AuthClaim claim = authorize(headers);
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            return (ReqT) ((GetJWKSRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSecret(oauthSec)
-                    .setTenantId(tenantId)
-                    .build();
-
-        } else if (method.equals("getAllResourceCredentialSummaries")) {
-            String clientId = ((GetResourceCredentialSummariesRequest) reqT).getClientId();
-
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            return (ReqT) ((GetResourceCredentialSummariesRequest) reqT).toBuilder().setTenantId(claim.getTenantId()).build();
-
-
-        } else if (method.equals("addSSHCredential")) {
-            String clientId = ((SSHCredential) reqT).getMetadata().getClientId();
-
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            SecretMetadata metadata = ((SSHCredential) reqT).getMetadata().toBuilder().setTenantId(claim.getTenantId()).build();
-
-            return (ReqT) ((SSHCredential) reqT).toBuilder().setMetadata(metadata).build();
-
-
-        } else if (method.equals("addPasswordCredential")) {
-            String clientId = ((PasswordCredential) reqT).getMetadata().getClientId();
-
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            SecretMetadata metadata = ((PasswordCredential) reqT).getMetadata().toBuilder().setTenantId(claim.getTenantId()).build();
-
-            return (ReqT) ((PasswordCredential) reqT).toBuilder().setMetadata(metadata).build();
-
-        } else if (method.equals("addCertificateCredential")) {
-            String clientId = ((CertificateCredential) reqT).getMetadata().getClientId();
-
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            SecretMetadata metadata = ((CertificateCredential) reqT).getMetadata().toBuilder().setTenantId(claim.getTenantId()).build();
-
-            return (ReqT) ((CertificateCredential) reqT).toBuilder().setMetadata(metadata).build();
-
-        } else if (method.equals("getSSHCredential") || method.equals("getPasswordCredential") || method.equals("getCertificateCredential")
-                || method.equals("deleteSSHCredential") || method.equals("deletePWDCredential") || method.equals("deleteCertificateCredential")
-                || method.equals("getResourceCredentialSummary")) {
-            String clientId = ((GetResourceCredentialByTokenRequest) reqT).getClientId();
-
-            AuthClaim claim = authorize(headers, clientId);
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-            return (ReqT) ((GetResourceCredentialByTokenRequest) reqT).toBuilder().setTenantId(claim.getTenantId()).build();
-
-        }
-        return reqT;
-    }
-
-}
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
index 3309950..ce7f2d8 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
@@ -24,6 +24,7 @@
 import org.apache.custos.integration.core.exceptions.MissingParameterException;
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.resource.secret.service.CertificateCredential;
+import org.apache.custos.resource.secret.service.KVCredential;
 import org.apache.custos.resource.secret.service.PasswordCredential;
 import org.apache.custos.resource.secret.service.SSHCredential;
 import org.slf4j.Logger;
@@ -68,6 +69,23 @@
         if (method.equals("addSSHCredential") || method.equals("addPasswordCredential")
                 || method.equals("addCertificateCredential")) {
             validateSecretMetadata(msg, method);
+        } else if (method.equals("addKVCredential") || method.equals("getKVCredential") ||
+                method.equals("updateKVCredential") || method.equals("deleteKVCredential")) {
+            if (msg instanceof KVCredential) {
+                String key = ((KVCredential) msg).getKey();
+                String value = (((KVCredential) msg)).getValue();
+                String token = (((KVCredential) msg)).getToken();
+                if ((token == null || token.trim().equals("")) && (key == null || key.trim().equals(""))) {
+                    throw new MissingParameterException("At least key or token should be added ", null);
+                }
+
+                if ((method.equals("addKVCredential") || method.equals("updateKVCredential")) && (value == null || value.trim().equals(""))) {
+                    throw new MissingParameterException("Value should not be null ", null);
+                }
+
+            } else {
+                throw new RuntimeException("Unknown message type", null);
+            }
         }
         return msg;
     }
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/UserAuthInterceptorImpl.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/UserAuthInterceptorImpl.java
deleted file mode 100644
index 87c8765..0000000
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/UserAuthInterceptorImpl.java
+++ /dev/null
@@ -1,54 +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.custos.resource.secret.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate user specific authorization
- * Methods authenticates users access tokens are implemented here
- */
-@Component
-public class UserAuthInterceptorImpl extends AuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    private CredentialStoreServiceClient credentialStoreServiceClient;
-
-    @Autowired
-    public UserAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-        this.credentialStoreServiceClient = credentialStoreServiceClient;
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
-        return msg;
-    }
-
-
-}
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/service/ResourceSecretManagementService.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/service/ResourceSecretManagementService.java
index ee48a50..b5a68ac 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/service/ResourceSecretManagementService.java
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/service/ResourceSecretManagementService.java
@@ -19,6 +19,7 @@
 
 package org.apache.custos.resource.secret.management.service;
 
+import com.google.protobuf.ByteString;
 import com.google.protobuf.Struct;
 import io.grpc.Status;
 import io.grpc.stub.StreamObserver;
@@ -27,6 +28,7 @@
 import org.apache.custos.cluster.management.service.GetServerCertificateResponse;
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.service.GetJWKSRequest;
+import org.apache.custos.integration.core.utils.ShamirSecretHandler;
 import org.apache.custos.resource.secret.client.ResourceSecretClient;
 import org.apache.custos.resource.secret.management.service.ResourceSecretManagementServiceGrpc.ResourceSecretManagementServiceImplBase;
 import org.apache.custos.resource.secret.service.*;
@@ -35,6 +37,10 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 @GRpcService
 public class ResourceSecretManagementService extends ResourceSecretManagementServiceImplBase {
 
@@ -128,6 +134,16 @@
         LOGGER.debug("Request received to add SSHCredential ");
         try {
 
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+                List<ByteString> byteStringList = request.getPrivateKeySharesList();
+                if (byteStringList != null && byteStringList.size() > 0) {
+
+                    String secret = ShamirSecretHandler.
+                            generateSecret(byteStringList, request.getNumOfShares(), request.getThreshold());
+                    request = request.toBuilder().setPrivateKey(secret).build();
+                }
+            }
+
             AddResourceCredentialResponse response = resourceSecretClient.addSSHCredential(request);
 
             responseObserver.onNext(response);
@@ -143,6 +159,15 @@
     public void addPasswordCredential(PasswordCredential request, StreamObserver<AddResourceCredentialResponse> responseObserver) {
         LOGGER.debug("Request received to add PasswordCredential ");
         try {
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+                List<ByteString> byteStringList = request.getSecretSharesList();
+                if (byteStringList != null && byteStringList.size() > 0) {
+
+                    String secret = ShamirSecretHandler.
+                            generateSecret(byteStringList, request.getNumOfShares(), request.getThreshold());
+                    request = request.toBuilder().setPassword(secret).build();
+                }
+            }
 
             AddResourceCredentialResponse response = resourceSecretClient.addPasswordCredential(request);
             responseObserver.onNext(response);
@@ -158,7 +183,15 @@
     public void addCertificateCredential(CertificateCredential request, StreamObserver<AddResourceCredentialResponse> responseObserver) {
         LOGGER.debug("Request received to add CertificateCredential ");
         try {
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+                List<ByteString> byteStringList = request.getPrivateKeySharesList();
+                if (byteStringList != null && byteStringList.size() > 0) {
 
+                    String secret = ShamirSecretHandler.
+                            generateSecret(byteStringList, request.getNumOfShares(), request.getThreshold());
+                    request = request.toBuilder().setPrivateKey(secret).build();
+                }
+            }
             AddResourceCredentialResponse response = resourceSecretClient.addCertificateCredential(request);
             responseObserver.onNext(response);
             responseObserver.onCompleted();
@@ -175,8 +208,28 @@
     public void getSSHCredential(GetResourceCredentialByTokenRequest request, StreamObserver<SSHCredential> responseObserver) {
         LOGGER.debug("Request received to get SSHCredential ");
         try {
-
             SSHCredential response = resourceSecretClient.getSSHCredential(request);
+
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+
+                int numberOfShares = response.getNumOfShares();
+                int threshold = response.getThreshold();
+
+                String privateKey = response.getPrivateKey();
+
+                if (privateKey != null && privateKey.trim().equals("")) {
+                    Map<Integer, byte[]> shares = ShamirSecretHandler.splitSecret(privateKey, numberOfShares, threshold);
+
+                    List<ByteString> byteStringList = shares.values().stream().
+                            map(val -> ByteString.copyFromUtf8(new String(val))).collect(Collectors.toList());
+
+                    response = response.toBuilder().addAllPrivateKeyShares(byteStringList)
+                            .setPrivateKey("")
+                            .build();
+
+                }
+            }
+
             responseObserver.onNext(response);
             responseObserver.onCompleted();
         } catch (Exception ex) {
@@ -192,6 +245,25 @@
         try {
 
             PasswordCredential response = resourceSecretClient.getPasswordCredential(request);
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+
+                int numberOfShares = response.getNumOfShares();
+                int threshold = response.getThreshold();
+
+                String privateKey = response.getPassword();
+
+                if (privateKey != null && privateKey.trim().equals("")) {
+                    Map<Integer, byte[]> shares = ShamirSecretHandler.splitSecret(privateKey, numberOfShares, threshold);
+
+                    List<ByteString> byteStringList = shares.values().stream().
+                            map(val -> ByteString.copyFromUtf8(new String(val))).collect(Collectors.toList());
+
+                    response = response.toBuilder().addAllSecretShares(byteStringList)
+                            .setPassword("")
+                            .build();
+
+                }
+            }
 
             responseObserver.onNext(response);
             responseObserver.onCompleted();
@@ -208,6 +280,25 @@
         try {
 
             CertificateCredential response = resourceSecretClient.getCertificateCredential(request);
+            if (request.getUseShamirsSecretSharingWithEncryption()) {
+
+                int numberOfShares = response.getNumOfShares();
+                int threshold = response.getThreshold();
+
+                String privateKey = response.getPrivateKey();
+
+                if (privateKey != null && privateKey.trim().equals("")) {
+                    Map<Integer, byte[]> shares = ShamirSecretHandler.splitSecret(privateKey, numberOfShares, threshold);
+
+                    List<ByteString> byteStringList = shares.values().stream().
+                            map(val -> ByteString.copyFromUtf8(new String(val))).collect(Collectors.toList());
+
+                    response = response.toBuilder().addAllPrivateKeyShares(byteStringList)
+                            .setPrivateKey("")
+                            .build();
+
+                }
+            }
             responseObserver.onNext(response);
             responseObserver.onCompleted();
         } catch (Exception ex) {
@@ -262,4 +353,154 @@
             responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
+
+
+    @Override
+    public void getKVCredential(KVCredential request, StreamObserver<KVCredential> responseObserver) {
+        LOGGER.debug("Request received to getKVCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getKey());
+        try {
+
+            KVCredential kvCredential = resourceSecretClient.getKVCredential(request);
+
+            responseObserver.onNext(kvCredential);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while fetching  KV credentials :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void addKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to addKVCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getKey());
+        try {
+
+            ResourceCredentialOperationStatus status = resourceSecretClient.setKVCredential(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while adding  KV  credentials :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to updateKVCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getKey());
+        try {
+            ResourceCredentialOperationStatus status = resourceSecretClient.updateKVCredential(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while updating  KV credentials :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteKVCredential(KVCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to deleteKVCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getKey());
+        try {
+            ResourceCredentialOperationStatus status = resourceSecretClient.deleteKVCredential(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while deleting  KV credentials :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void getCredentialMap(CredentialMap request, StreamObserver<CredentialMap> responseObserver) {
+        LOGGER.debug("Request received to getCredentialMap in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getMetadata().getToken());
+        try {
+            CredentialMap status = resourceSecretClient.getCredentialMap(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while fetching   Credentials  Map :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void addCredentialMap(CredentialMap request, StreamObserver<AddResourceCredentialResponse> responseObserver) {
+        LOGGER.debug("Request received to addCredentialMap in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getMetadata().getToken());
+        try {
+            AddResourceCredentialResponse status = resourceSecretClient.setCredentialMap(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while saving  CredentialMap :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void updateCredentialMap(CredentialMap request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to updateCredentialMap in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getMetadata().getToken());
+        try {
+            ResourceCredentialOperationStatus status = resourceSecretClient.updateCredentialMap(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while updaintg  Credentials  Map:  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void deleteCredentialMap(CredentialMap request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to deleteKVCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getMetadata().getToken());
+        try {
+            ResourceCredentialOperationStatus status = resourceSecretClient.deleteCredentialMap(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while deleting  Credential Map :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+
+    @Override
+    public void updateCertificateCredential(CertificateCredential request, StreamObserver<ResourceCredentialOperationStatus> responseObserver) {
+        LOGGER.debug("Request received to updateCertificateCredential in tenant " + request.getMetadata().getTenantId()
+                + " of user " + request.getMetadata().getOwnerId() + "for key " + request.getMetadata().getToken());
+        try {
+            ResourceCredentialOperationStatus status = resourceSecretClient.updateCertificate(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while deleting  Credential Map :  " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
 }
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/proto/ResourceSecretManagementService.proto b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/proto/ResourceSecretManagementService.proto
index 50ff876..f46ad29 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/proto/ResourceSecretManagementService.proto
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/proto/ResourceSecretManagementService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.resource.secret.management.service;
+option go_package = "./pb";
 
 import "google/api/annotations.proto";
 import "google/protobuf/empty.proto";
@@ -38,6 +39,27 @@
          };
     }
 
+    rpc getKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.KVCredential) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc addKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc updateKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+    rpc deleteKVCredential (org.apache.custos.resource.secret.service.KVCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/kv"
+         };
+    }
+
     rpc getJWKS (org.apache.custos.identity.service.GetJWKSRequest) returns (google.protobuf.Struct) {
         option (google.api.http) = {
            get: "/resource-secret-management/v1.0.0/openid-connect/certs"
@@ -70,6 +92,12 @@
          };
     }
 
+    rpc updateCertificateCredential (org.apache.custos.resource.secret.service.CertificateCredential) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/certificate"
+         };
+    }
+
     rpc getSSHCredential (org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest) returns (org.apache.custos.resource.secret.service.SSHCredential) {
         option (google.api.http) = {
            get: "/resource-secret-management/v1.0.0/secret/ssh"
@@ -102,4 +130,27 @@
          };
     }
 
+
+
+    rpc getCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.CredentialMap) {
+        option (google.api.http) = {
+           get: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc addCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.AddResourceCredentialResponse) {
+        option (google.api.http) = {
+           post: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc updateCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           put: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+    rpc deleteCredentialMap (org.apache.custos.resource.secret.service.CredentialMap) returns (org.apache.custos.resource.secret.service.ResourceCredentialOperationStatus) {
+        option (google.api.http) = {
+           delete: "/resource-secret-management/v1.0.0/secret/map"
+         };
+    }
+
 }
\ No newline at end of file
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/application.properties b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/application.properties
index 74e6151..33d266d 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/scim-service/Dockerfile b/custos-integration-services/scim-service/Dockerfile
index fdf9c0f..2d857af 100644
--- a/custos-integration-services/scim-service/Dockerfile
+++ b/custos-integration-services/scim-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 COPY src/main/resources/custos_user_schema_extention.json /home/ubuntu/schemas/custos_user_schema_extention.json
 VOLUME /tmp
 ARG JAR_FILE
diff --git a/custos-integration-services/scim-service/pom.xml b/custos-integration-services/scim-service/pom.xml
index 0ab3971..6aeb85d 100644
--- a/custos-integration-services/scim-service/pom.xml
+++ b/custos-integration-services/scim-service/pom.xml
@@ -122,6 +122,7 @@
             <artifactId>tenant-profile-core-service-client-stub</artifactId>
             <version>${project.version}</version>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -140,6 +141,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/scim-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/scim-service/src/main/helm/templates/deployment.yaml
index 8cc78dc..2027640 100644
--- a/custos-integration-services/scim-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/scim-service/src/main/helm/templates/deployment.yaml
@@ -44,9 +44,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
               {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-integration-services/scim-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/scim-service/src/main/helm/templates/ingress.yaml
index 5f90e04..3e53ca3 100644
--- a/custos-integration-services/scim-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/scim-service/src/main/helm/templates/ingress.yaml
@@ -8,7 +8,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /scim(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/scim-service/src/main/helm/values.yaml b/custos-integration-services/scim-service/src/main/helm/values.yaml
index 24389a2..ef61dd6 100644
--- a/custos-integration-services/scim-service/src/main/helm/values.yaml
+++ b/custos-integration-services/scim-service/src/main/helm/values.yaml
@@ -78,5 +78,6 @@
   successThreshold: 1
 
 
-
+deployment:
+  host: service.staging.usecustos.org
 
diff --git a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/GroupResource.java b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/GroupResource.java
index 68f1b04..be78009 100644
--- a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/GroupResource.java
+++ b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/GroupResource.java
@@ -35,6 +35,7 @@
 import org.wso2.charon3.core.protocol.endpoints.GroupResourceManager;
 
 import java.util.Map;
+import java.util.Optional;
 
 @RestController
 @RequestMapping(value = {"/v2/Groups"})
@@ -62,19 +63,20 @@
                                    @ApiParam(value = Constants.ATTRIBUTES_DESC, required = false)
                                    @RequestParam(value = Constants.ATTRIBUTES, required = false) String attribute,
                                    @ApiParam(value = Constants.EXCLUDED_ATTRIBUTES_DESC, required = false)
-                                   @RequestParam(value =Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
+                                   @RequestParam(value = Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
                                    @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject newObj = new JSONObject();
 
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-
+        if (claim.isPresent()) {
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        }
 
         JSONObject custosExtention = new JSONObject();
         custosExtention.put(Constants.CUSTOS_EXTENSION, newObj);
@@ -102,7 +104,7 @@
                                       @RequestParam(value = Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
                                       @RequestBody Map<String, Object> payload,
                                       @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject object = new JSONObject(payload);
 
@@ -110,17 +112,19 @@
 //
 //        JSONArray cust = null;
 //        if (custosExtension == null) {
-        JSONArray    cust = new JSONArray();
+        JSONArray cust = new JSONArray();
 //        } else if (custosExtension instanceof JSONArray) {
 //            cust = (JSONArray) custosExtension;
 //        }
 
         JSONObject jsonObject = new JSONObject();
 
-        jsonObject.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        jsonObject.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        jsonObject.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-        jsonObject.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
+        if (claim.isPresent()) {
+            jsonObject.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            jsonObject.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            jsonObject.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+            jsonObject.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+        }
 
 
         // create charon-SCIM user endpoint and hand-over the request.
@@ -129,7 +133,7 @@
         JSONObject member = new JSONObject();
 
         member.put(Constants.VALUE, jsonObject.toString());
-        member.put("display",Constants.CUSTOS_EXTENSION);
+        member.put("display", Constants.CUSTOS_EXTENSION);
 
         cust.put(member);
 
@@ -156,17 +160,18 @@
                                       @PathVariable(Constants.ID) String id,
                                       @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
 
         JSONObject newObj = new JSONObject();
 
-
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        if (claim.isPresent()) {
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        }
 
 
         JSONObject custosExtention = new JSONObject();
@@ -198,52 +203,49 @@
                                       @RequestBody Map<String, Object> payload,
                                       @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject object = new JSONObject(payload);
 
 
-
-
 //        Object custosExtension = object.get(Constants.MEMBERS);
 //
 //        JSONArray cust = null;
 //        if (custosExtension == null) {
-        JSONArray    cust = new JSONArray();
+        JSONArray cust = new JSONArray();
 //        } else if (custosExtension instanceof JSONArray) {
 //            cust = (JSONArray) custosExtension;
 //        }
 
         JSONObject jsonObject = new JSONObject();
-
-        jsonObject.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        jsonObject.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        jsonObject.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-        jsonObject.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-
-
-        JSONObject member = new JSONObject();
-
-        member.put(Constants.VALUE, jsonObject.toString());
-        member.put("display",Constants.CUSTOS_EXTENSION);
-
-        cust.put(member);
-
-        object.put(Constants.MEMBERS, cust);
-
-
         JSONObject newObj = new JSONObject();
-
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        if (claim.isPresent()) {
+            jsonObject.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            jsonObject.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            jsonObject.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+            jsonObject.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
 
 
+            JSONObject member = new JSONObject();
+
+            member.put(Constants.VALUE, jsonObject.toString());
+            member.put("display", Constants.CUSTOS_EXTENSION);
+
+            cust.put(member);
+
+            object.put(Constants.MEMBERS, cust);
+
+
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+
+        }
         JSONObject custosExt = new JSONObject();
-        custosExt.put(Constants.CUSTOS_EXTENSION, newObj);
 
+        custosExt.put(Constants.CUSTOS_EXTENSION, newObj);
 
 
         // create charon-SCIM user endpoint and hand-over the request.
@@ -255,6 +257,7 @@
 
 
         return buildResponse(response);
+
     }
 
     @ApiOperation(
diff --git a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/UserResource.java b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/UserResource.java
index 728a4c3..bb2fa7f 100644
--- a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/UserResource.java
+++ b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/UserResource.java
@@ -34,6 +34,7 @@
 import org.wso2.charon3.core.protocol.endpoints.UserResourceManager;
 
 import java.util.Map;
+import java.util.Optional;
 
 
 @RestController
@@ -68,18 +69,19 @@
                                   @RequestParam(value = Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
                                   @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject newObj = new JSONObject();
-
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-
-
         JSONObject custosExtention = new JSONObject();
+        if (claim.isPresent()) {
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+
+
+        }
         custosExtention.put(Constants.CUSTOS_EXTENSION, newObj);
 
         // create charon-SCIM user endpoint and hand-over the request.
@@ -107,19 +109,20 @@
                                      @RequestBody Map<String, Object> payload,
                                      @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject object = new JSONObject(payload);
 
         JSONObject custosExtension = new JSONObject();
 
-        custosExtension.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        custosExtension.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        custosExtension.put(Constants.TENANT_ID, claim.getTenantId());
-        custosExtension.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        if (claim.isPresent()) {
+            custosExtension.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            custosExtension.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            custosExtension.put(Constants.TENANT_ID, claim.get().getTenantId());
+            custosExtension.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
 
-        object.put(Constants.CUSTOS_EXTENSION, custosExtension);
-
+            object.put(Constants.CUSTOS_EXTENSION, custosExtension);
+        }
         // create charon-SCIM user endpoint and hand-over the request.
         UserResourceManager userResourceManager = new UserResourceManager();
 
@@ -145,19 +148,19 @@
                                      @PathVariable(Constants.ID) String id,
                                      @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
 
         JSONObject newObj = new JSONObject();
-
-
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-
         JSONObject custosExtention = new JSONObject();
+        if (claim.isPresent()) {
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        }
+
         custosExtention.put(Constants.CUSTOS_EXTENSION, newObj);
 
         // create charon-SCIM user endpoint and hand-over the request.
@@ -186,15 +189,15 @@
                                   @ApiParam(value = Constants.FILTER_DESC, required = false)
                                   @RequestParam(value = Constants.FILTER, required = false) String filter,
                                   @ApiParam(value = Constants.START_INDEX_DESC, required = false)
-                                  @RequestParam(value =Constants.START_INDEX, required = false) int startIndex,
+                                  @RequestParam(value = Constants.START_INDEX, required = false) int startIndex,
                                   @ApiParam(value = Constants.COUNT_DESC, required = false)
-                                  @RequestParam(value= Constants.COUNT, required = false) int count,
+                                  @RequestParam(value = Constants.COUNT, required = false) int count,
                                   @ApiParam(value = Constants.SORT_BY_DESC, required = false)
-                                  @RequestParam(value =Constants.SORT_BY, required = false) String sortBy,
+                                  @RequestParam(value = Constants.SORT_BY, required = false) String sortBy,
                                   @ApiParam(value = Constants.SORT_ORDER_DESC, required = false)
                                   @RequestParam(value = Constants.SORT_ORDER, required = false) String sortOrder,
                                   @ApiParam(value = Constants.DOMAIN_DESC, required = false)
-                                  @RequestParam(value= Constants.DOMAIN, required = false) String domainName,
+                                  @RequestParam(value = Constants.DOMAIN, required = false) String domainName,
                                   @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
         authHandler.validateAndConfigure(authorizationHeader, false);
 
@@ -244,33 +247,32 @@
                                      @ApiParam(value = Constants.ATTRIBUTES_DESC, required = false)
                                      @RequestParam(value = Constants.ATTRIBUTES, required = false) String attribute,
                                      @ApiParam(value = Constants.EXCLUDED_ATTRIBUTES_DESC, required = false)
-                                     @RequestParam(value =Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
+                                     @RequestParam(value = Constants.EXCLUDE_ATTRIBUTES, required = false) String excludedAttributes,
                                      @RequestBody Map<String, Object> payload,
                                      @RequestHeader(value = Constants.AUTHORIZATION) String authorizationHeader) {
 
-        AuthClaim claim = authHandler.validateAndConfigure(authorizationHeader, false);
+        Optional<AuthClaim> claim = authHandler.validateAndConfigure(authorizationHeader, false);
 
         JSONObject object = new JSONObject(payload);
 
         JSONObject custosExtension = new JSONObject();
-
-        custosExtension.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        custosExtension.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        custosExtension.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
-        custosExtension.put(Constants.TENANT_ID, claim.getTenantId());
-        object.put(Constants.CUSTOS_EXTENSION, custosExtension);
-
-
-
         JSONObject newObj = new JSONObject();
 
-        newObj.put(Constants.CLIENT_ID, claim.getIamAuthId());
-        newObj.put(Constants.CLIENT_SEC, claim.getIamAuthSecret());
-        newObj.put(Constants.ID, id);
-        newObj.put(Constants.TENANT_ID, String.valueOf(claim.getTenantId()));
-        newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+        if (claim.isPresent()) {
+            custosExtension.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            custosExtension.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            custosExtension.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+            custosExtension.put(Constants.TENANT_ID, claim.get().getTenantId());
+            object.put(Constants.CUSTOS_EXTENSION, custosExtension);
 
 
+            newObj.put(Constants.CLIENT_ID, claim.get().getIamAuthId());
+            newObj.put(Constants.CLIENT_SEC, claim.get().getIamAuthSecret());
+            newObj.put(Constants.ID, id);
+            newObj.put(Constants.TENANT_ID, String.valueOf(claim.get().getTenantId()));
+            newObj.put(Constants.ACCESS_TOKEN, authHandler.getToken(authorizationHeader));
+
+        }
         JSONObject custosExt = new JSONObject();
         custosExt.put(Constants.CUSTOS_EXTENSION, newObj);
 
diff --git a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/manager/ResourceManager.java b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/manager/ResourceManager.java
index b03e183..5b1bd5e 100644
--- a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/manager/ResourceManager.java
+++ b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/resource/manager/ResourceManager.java
@@ -769,7 +769,7 @@
                         org.apache.custos.user.profile.service.UserAttribute
                                 .newBuilder()
                                 .setKey(atr.getKey())
-                                .addAllValue(atr.getValuesList())
+                                .addAllValues(atr.getValuesList())
                                 .build();
 
                 userAtrList.add(userAttribute);
diff --git a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/utils/AuthHandler.java b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/utils/AuthHandler.java
index 6857901..3baf19c 100644
--- a/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/utils/AuthHandler.java
+++ b/custos-integration-services/scim-service/src/main/java/org/apache/custos/scim/utils/AuthHandler.java
@@ -29,7 +29,9 @@
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.HttpStatusCodeException;
 
+import javax.swing.text.html.Option;
 import java.util.Map;
+import java.util.Optional;
 
 @Component
 public class AuthHandler extends AuthInterceptor {
@@ -46,16 +48,16 @@
         return token.trim();
     }
 
-    public AuthClaim validateAndConfigure(String header, boolean userTokenValidation) throws HttpStatusCodeException {
+    public Optional<AuthClaim> validateAndConfigure(String header, boolean userTokenValidation) throws HttpStatusCodeException {
         String token = this.getToken(header);
-        AuthClaim claim = null;
+        Optional<AuthClaim> claim = null;
         if (userTokenValidation) {
             claim = authorizeUsingUserToken(token);
         } else {
             claim = authorize(token);
         }
 
-        if (claim == null) {
+        if (claim.isEmpty()) {
             throw new NotAuthorizedException();
         }
 
diff --git a/custos-integration-services/scim-service/src/main/resources/application.properties b/custos-integration-services/scim-service/src/main/resources/application.properties
index 480f8fe..ccd2d0d 100644
--- a/custos-integration-services/scim-service/src/main/resources/application.properties
+++ b/custos-integration-services/scim-service/src/main/resources/application.properties
@@ -26,4 +26,4 @@
 management.endpoint.metrics.enabled=true
 spring.main.allow-bean-definition-overriding=true
 logging.level.root=INFO
-#logging.level.org.springframework.web=INFO
\ No newline at end of file
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/scim-service/src/main/resources/bootstrap.properties b/custos-integration-services/scim-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/scim-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/scim-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb b/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb
index 227eb2a..41047ba 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service-sidecar/src/main/resources/sharing-management-service.pb
Binary files differ
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/Dockerfile b/custos-integration-services/sharing-management-service-parent/sharing-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/Dockerfile
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/pom.xml b/custos-integration-services/sharing-management-service-parent/sharing-management-service/pom.xml
index 9015d9f..362cf0b 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/pom.xml
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/pom.xml
@@ -123,6 +123,7 @@
             <groupId>com.google.api.grpc</groupId>
             <artifactId>proto-google-common-protos</artifactId>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -141,6 +142,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/deployment.yaml
index 2fe140f..9fe298c 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -59,9 +60,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress-grpc.yaml
index 3fe743d..ce0a4f1 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
           - path: /org.apache.custos.sharing.management.service.SharingManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress.yaml
index 634f5a8..002207d 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /sharing-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/values.yaml b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/values.yaml
index 292eba6..bab2648 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/helm/values.yaml
@@ -82,3 +82,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/interceptors/AuthInterceptorImpl.java
index 1c4a274..64a1185 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/interceptors/AuthInterceptorImpl.java
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/interceptors/AuthInterceptorImpl.java
@@ -22,7 +22,7 @@
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.sharing.service.*;
@@ -31,6 +31,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * This validates custos credentials
  */
@@ -50,51 +52,78 @@
 
     @Override
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
-        AuthClaim authClaim;
+        Optional<AuthClaim> authClaim;
         if (msg instanceof EntityTypeRequest) {
             EntityTypeRequest req = ((EntityTypeRequest) msg);
             authClaim = validateAuth(headers, req.getClientId());
-            req = req.toBuilder()
-                    .setTenantId(authClaim.getTenantId())
-                    .setClientSec(authClaim.getIamAuthSecret())
-                    .build();
-            return (ReqT) req;
+            return authClaim.map(cl -> {
+                EntityTypeRequest request = ((EntityTypeRequest) msg);
+                request = request.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientSec(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
         } else if (msg instanceof SearchRequest) {
             SearchRequest req = ((SearchRequest) msg);
             authClaim = validateAuth(headers, req.getClientId());
-            req = req.toBuilder()
-                    .setTenantId(authClaim.getTenantId())
-                    .setClientSec(authClaim.getIamAuthSecret())
-                    .build();
-            return (ReqT) req;
+            return authClaim.map(cl -> {
+                SearchRequest request = ((SearchRequest) msg);
+                request = request.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientSec(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
 
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         } else if (msg instanceof PermissionTypeRequest) {
             PermissionTypeRequest req = ((PermissionTypeRequest) msg);
             authClaim = validateAuth(headers, req.getClientId());
-            req = req.toBuilder()
-                    .setTenantId(authClaim.getTenantId())
-                    .setClientSec(authClaim.getIamAuthSecret())
-                    .build();
-            return (ReqT) req;
+           return authClaim.map(cl -> {
+                PermissionTypeRequest request = ((PermissionTypeRequest) msg);
+                request = request.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientSec(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
 
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         } else if (msg instanceof EntityRequest) {
             EntityRequest req = ((EntityRequest) msg);
             authClaim = validateAuth(headers, req.getClientId());
-            req = req.toBuilder()
-                    .setTenantId(authClaim.getTenantId())
-                    .setClientSec(authClaim.getIamAuthSecret())
-                    .build();
-            return (ReqT) req;
+            return authClaim.map(cl -> {
+                EntityRequest request = ((EntityRequest) msg);
+                request = request.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientSec(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
 
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         } else if (msg instanceof SharingRequest) {
             SharingRequest req = ((SharingRequest) msg);
             authClaim = validateAuth(headers, req.getClientId());
-            req = req.toBuilder()
-                    .setTenantId(authClaim.getTenantId())
-                    .setClientSec(authClaim.getIamAuthSecret())
-                    .build();
-            return (ReqT) req;
+           return authClaim.map(cl -> {
+                SharingRequest request = ((SharingRequest) msg);
+                request = request.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientSec(cl.getIamAuthSecret())
+                        .build();
+                return (ReqT) request;
 
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
         }
 
         return (ReqT) msg;
@@ -102,19 +131,14 @@
     }
 
 
-    private AuthClaim validateAuth(Metadata headers, String clientId) {
-        AuthClaim claim = null;
+    private Optional<AuthClaim> validateAuth(Metadata headers, String clientId) {
         try {
 
-            claim = authorize(headers, clientId);
+            return authorize(headers, clientId);
         } catch (Exception ex) {
             LOGGER.error(" Authorizing error " + ex.getMessage());
-            throw new NotAuthorizedException("Request is not authorized", ex);
+            throw new UnAuthorizedException("Request is not authorized", ex);
         }
-        if (claim == null) {
-            throw new NotAuthorizedException("Request is not authorized", null);
-        }
-        return claim;
     }
 
 
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
index 9c415ea..c4aef67 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/java/org/apache/custos/sharing/management/service/SharingManagementService.java
@@ -28,7 +28,7 @@
 import org.apache.custos.identity.client.IdentityClient;
 import org.apache.custos.identity.service.AuthToken;
 import org.apache.custos.identity.service.GetUserManagementSATokenRequest;
-import org.apache.custos.identity.service.User;
+import org.apache.custos.integration.services.commons.utils.EventPublisher;
 import org.apache.custos.integration.services.commons.utils.InterServiceModelMapper;
 import org.apache.custos.sharing.client.SharingClient;
 import org.apache.custos.sharing.management.exceptions.SharingException;
@@ -43,7 +43,9 @@
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @GRpcService
 public class SharingManagementService extends SharingManagementServiceImplBase {
@@ -62,6 +64,9 @@
     @Autowired
     private IdentityClient identityClient;
 
+    @Autowired
+    private EventPublisher eventPublisher;
+
 
     @Override
     public void createEntityType(EntityTypeRequest request, StreamObserver<Status> responseObserver) {
@@ -342,13 +347,20 @@
             LOGGER.debug("Request received to deleteEntity in tenant " + request.getTenantId() +
                     "  with  entity Id " + request.getEntity().getId());
 
+            Entity exEntity = sharingClient.getEntity(request);
             Status status = sharingClient.deleteEntity(request);
+            Map<String, String> value = new HashMap<>();
+            value.put("ENTITY_ID", request.getEntity().getId());
+            value.put("ENTITY_TYPE", exEntity.getType());
+            eventPublisher.publishMessage(request.getClientId(),
+                    request.getTenantId(),
+                    "SHARING_MANAGEMENT_SERVICE", "DELETE_ENTITY",
+                    value);
             responseObserver.onNext(status);
             responseObserver.onCompleted();
-
         } catch (Exception ex) {
             String msg = "Error occurred at deleteEntity " + ex.getMessage();
-            LOGGER.error(msg);
+            LOGGER.error(msg, ex);
             responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
         }
     }
@@ -365,14 +377,14 @@
             UserProfileRequest profileRequest = UserProfileRequest.newBuilder()
                     .setProfile(profile).setTenantId(request.getTenantId()).build();
 
-           GetAllGroupsResponse response =  userProfileClient.getAllGroupsOfUser(profileRequest);
+            GetAllGroupsResponse response = userProfileClient.getAllGroupsOfUser(profileRequest);
 
-           List<String> associatingIds = new ArrayList<>();
-           associatingIds.add(userId);
+            List<String> associatingIds = new ArrayList<>();
+            associatingIds.add(userId);
 
-           for (Group gr: response.getGroupsList()) {
-               associatingIds.add(gr.getId());
-           }
+            for (Group gr : response.getGroupsList()) {
+                associatingIds.add(gr.getId());
+            }
 
             request = request.toBuilder().addAllAssociatingIds(associatingIds).build();
 
@@ -457,6 +469,39 @@
     }
 
     @Override
+    public void getAllDirectSharings(SharingRequest request, StreamObserver<GetAllDirectSharingsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to getAllDirectSharings in tenant " + request.getTenantId());
+
+            GetAllDirectSharingsResponse response = sharingClient.getAllDirectSharings(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at getAllDirectSharings " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+
+    @Override
+    public void getAllSharings(SharingRequest request, StreamObserver<GetAllSharingsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to getAllSharings in tenant " + request.getTenantId());
+
+            GetAllSharingsResponse response = sharingClient.getAllSharings(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at getAllSharings " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
     public void shareEntityWithUsers(SharingRequest request, StreamObserver<Status> responseObserver) {
         try {
             LOGGER.debug("Request received to shareEntityWithUsers in tenant " + request.getTenantId() +
@@ -473,6 +518,11 @@
                 validateAndGetUserProfile(username, clientId, clientSec, tenantId);
             }
 
+            String sharedBy = request.getSharedBy();
+            if (!sharedBy.isEmpty()) {
+                validateAndGetUserProfile(sharedBy, clientId, clientSec, tenantId);
+            }
+
             Status status = sharingClient.shareEntityWithUsers(request);
 
             responseObserver.onNext(status);
@@ -498,6 +548,11 @@
 
                 validateAndGetGroupId(groupId, tenantId);
             }
+            String sharedBy = request.getSharedBy();
+            if (!sharedBy.isEmpty()) {
+                validateAndGetUserProfile(sharedBy, request.getClientId(), request.getClientSec(), tenantId);
+            }
+
 
             Status status = sharingClient.shareEntityWithGroups(request);
 
@@ -528,12 +583,28 @@
                 validateAndGetUserProfile(username, clientId, clientSec, tenantId);
             }
 
+            EntityRequest entityRequest = EntityRequest.newBuilder().setTenantId(tenantId)
+                    .setEntity(request.getEntity()).build();
+            Entity entity = sharingClient.getEntity(entityRequest);
+
             Status status = sharingClient.revokeEntitySharingFromUsers(request);
 
+
+            request.getOwnerIdList().forEach(owner -> {
+                Map<String, String> value = new HashMap<>();
+                value.put("ENTITY_ID", request.getEntity().getId());
+                value.put("ENTITY_TYPE", entity.getType());
+                value.put("PERMISSION_TYPE", request.getPermissionType().getId());
+                value.put("USER_ID", owner);
+                eventPublisher.publishMessage(request.getClientId(),
+                        request.getTenantId(),
+                        "SHARING_MANAGEMENT_SERVICE", "REVOKE_ENTITY_SHARING_FROM_USERS",
+                        value);
+            });
+
+
             responseObserver.onNext(status);
             responseObserver.onCompleted();
-
-
         } catch (Exception ex) {
             String msg = "Error occurred at revokeEntitySharingFromUsers " + ex.getMessage();
             LOGGER.error(msg);
@@ -552,11 +623,29 @@
 
             for (String username : request.getOwnerIdList()) {
 
-                validateAndGetGroupId(username,  tenantId);
+                validateAndGetGroupId(username, tenantId);
             }
 
+            EntityRequest entityRequest = EntityRequest.newBuilder().setTenantId(tenantId)
+                    .setEntity(request.getEntity()).build();
+
+            Entity entity = sharingClient.getEntity(entityRequest);
+
             Status status = sharingClient.revokeEntitySharingFromGroups(request);
 
+
+            request.getOwnerIdList().forEach(owner -> {
+                Map<String, String> value = new HashMap<>();
+                value.put("ENTITY_ID", request.getEntity().getId());
+                value.put("ENTITY_TYPE", entity.getType());
+                value.put("PERMISSION_TYPE", request.getPermissionType().getId());
+                value.put("USER_ID", owner);
+                eventPublisher.publishMessage(request.getClientId(),
+                        request.getTenantId(),
+                        "SHARING_MANAGEMENT_SERVICE", "REVOKE_ENTITY_SHARING_FROM_GROUPS",
+                        value);
+            });
+
             responseObserver.onNext(status);
             responseObserver.onCompleted();
 
@@ -581,14 +670,8 @@
             long tenantId = request.getTenantId();
 
 
-            for (String username : request.getOwnerIdList()) {
-
-                validateAndGetUserProfile(username, clientId, clientSec, tenantId);
-            }
-
             UserProfile profile = UserProfile.newBuilder().setUsername(request.getOwnerId(0)).build();
 
-
             UserProfileRequest userProfileRequest = UserProfileRequest.newBuilder()
                     .setTenantId(tenantId)
                     .setProfile(profile)
@@ -609,6 +692,10 @@
             responseObserver.onNext(status);
             responseObserver.onCompleted();
 
+            for (String username : request.getOwnerIdList()) {
+
+                validateAndGetUserProfile(username, clientId, clientSec, tenantId);
+            }
 
         } catch (Exception ex) {
             String msg = "Error occurred at userHasAccess " + ex.getMessage();
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
index 74e4ca5..961f1aa 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/proto/SharingManagementService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.sharing.management.service;
+option go_package = "./pb";
 
 import "SharingService.proto";
 import "google/api/annotations.proto";
@@ -155,6 +156,20 @@
 
     }
 
+    rpc getAllDirectSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllDirectSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share/direct"
+        };
+
+    }
+
+    rpc getAllSharings (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.GetAllSharingsResponse) {
+        option (google.api.http) = {
+           get: "/sharing-management/v1.0.0/share"
+        };
+
+    }
+
     rpc shareEntityWithUsers (org.apache.custos.sharing.service.SharingRequest) returns (org.apache.custos.sharing.service.Status) {
         option (google.api.http) = {
            post: "/sharing-management/v1.0.0/users/share"
@@ -186,4 +201,6 @@
 
     }
 
+
+
 }
\ No newline at end of file
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/application.properties b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/application.properties
index fe296f1..be1dafa 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/sharing-management-service-parent/sharing-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service-sidecar/src/main/resources/tenant-management-service.pb b/custos-integration-services/tenant-management-service-parent/tenant-management-service-sidecar/src/main/resources/tenant-management-service.pb
index 90cb160..07c0c49 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service-sidecar/src/main/resources/tenant-management-service.pb
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service-sidecar/src/main/resources/tenant-management-service.pb
Binary files differ
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/Dockerfile b/custos-integration-services/tenant-management-service-parent/tenant-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/Dockerfile
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/pom.xml b/custos-integration-services/tenant-management-service-parent/tenant-management-service/pom.xml
index ddd6a8f..e238bd4 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/pom.xml
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/pom.xml
@@ -63,6 +63,11 @@
             <artifactId>credential-store-core-service-client-stubs</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>messaging-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
           <dependency>
               <groupId>org.apache.custos</groupId>
               <artifactId>custos-integration-core</artifactId>
@@ -73,6 +78,11 @@
             <artifactId>custos-integration-services-commons</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>sharing-core-service-client-stub</artifactId>
+            <version>${project.version}</version>
+        </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
@@ -121,7 +131,19 @@
               <groupId>com.google.api.grpc</groupId>
               <artifactId>proto-google-common-protos</artifactId>
           </dependency>
-      </dependencies>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>messaging-core-service-client-stub</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.custos</groupId>
+            <artifactId>sharing-core-service-client-stub</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
 
     <build>
         <plugins>
@@ -139,6 +161,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/deployment.yaml
index 2fe140f..9fe298c 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -59,9 +60,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress-grpc.yaml
index afc2746..1962249 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-     - host: custos.scigap.org
+     - host: {{ .Values.deployment.host }}
        http:
         paths:
           - path: /org.apache.custos.tenant.management.service.TenantManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress.yaml
index 98f3b28..dca76f7 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /tenant-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/values.yaml b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/values.yaml
index 059067a..158aaa6 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/helm/values.yaml
@@ -82,3 +82,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/AuthInterceptorImpl.java
index 593c5ed..65a41e2 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/AuthInterceptorImpl.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/AuthInterceptorImpl.java
@@ -21,15 +21,18 @@
 
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
+import org.apache.custos.credential.store.service.CredentialMetadata;
 import org.apache.custos.federated.authentication.service.CacheManipulationRequest;
-import org.apache.custos.iam.service.AddProtocolMapperRequest;
-import org.apache.custos.iam.service.AddRolesRequest;
-import org.apache.custos.iam.service.EventPersistenceRequest;
-import org.apache.custos.iam.service.GetRolesRequest;
+import org.apache.custos.iam.service.*;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
+import org.apache.custos.messaging.email.service.EmailDisablingRequest;
+import org.apache.custos.messaging.email.service.EmailEnablingRequest;
+import org.apache.custos.messaging.email.service.FetchEmailFriendlyEvents;
+import org.apache.custos.messaging.email.service.FetchEmailTemplatesRequest;
+import org.apache.custos.messaging.service.MessageEnablingRequest;
 import org.apache.custos.tenant.management.service.Credentials;
 import org.apache.custos.tenant.management.service.DeleteTenantRequest;
 import org.apache.custos.tenant.management.service.GetTenantRequest;
@@ -42,6 +45,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * This validates custos credentials
  */
@@ -65,148 +70,354 @@
 
         if (method.equals("createTenant")) {
 
-            AuthClaim claim = authorize(headers);
-            if (claim == null) {
+            String token = getToken(headers);
+            if (token == null) {
+                return msg;
+            }
+            Optional<AuthClaim> claim = authorize(headers);
+            if (claim.isEmpty()) {
                 return msg;
             } else {
-
-                return (ReqT) ((Tenant) msg).toBuilder().setParentTenantId(claim.getTenantId()).build();
+                return (ReqT) ((Tenant) msg).toBuilder().setParentTenantId(claim.get().getTenantId()).build();
             }
 
         } else if (method.equals("getTenant")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            return claim.map(cl -> {
+                GetTenantRequest tenantRequest = ((GetTenantRequest) msg);
 
-            GetTenantRequest tenantRequest = ((GetTenantRequest) msg);
+                Credentials credentials = getCredentials(cl);
 
-            Credentials credentials = getCredentials(claim);
+                return (ReqT) tenantRequest.toBuilder()
+                        .setTenantId(cl.getTenantId()).setCredentials(credentials).build();
+            }).orElseThrow(() ->
+            {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
 
 
-            return (ReqT) tenantRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setCredentials(credentials).build();
         } else if (method.equals("updateTenant")) {
 
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            return claim.map(cl -> {
+                UpdateTenantRequest tenantRequest = ((UpdateTenantRequest) msg);
+                Credentials credentials = getCredentials(cl);
+                return (ReqT) tenantRequest.toBuilder()
+                        .setTenantId(cl.getTenantId()).setCredentials(credentials).build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
 
-            AuthClaim claim = validateAuth(headers);
-
-            UpdateTenantRequest tenantRequest = ((UpdateTenantRequest) msg);
-
-            Credentials credentials = getCredentials(claim);
-
-            return (ReqT) tenantRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setCredentials(credentials).build();
         } else if (method.equals("deleteTenant")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            return claim.map(cl -> {
+                DeleteTenantRequest tenantRequest = ((DeleteTenantRequest) msg);
+                Credentials credentials = getCredentials(cl);
+                return (ReqT) tenantRequest.toBuilder()
+                        .setTenantId(cl.getTenantId()).setCredentials(credentials).build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
 
-            DeleteTenantRequest tenantRequest = ((DeleteTenantRequest) msg);
-
-            Credentials credentials = getCredentials(claim);
-
-
-            return (ReqT) tenantRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setCredentials(credentials).build();
         } else if (method.equals("addTenantRoles")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
 
-            AddRolesRequest rolesRequest = ((AddRolesRequest) msg);
+            if (claim.isPresent()) {
+                AddRolesRequest rolesRequest = ((AddRolesRequest) msg);
+                String clientId = rolesRequest.getClientId();
+                if (rolesRequest.getClientId() == null || rolesRequest.getClientId().trim().isEmpty()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(claim.get().getTenantId()).
+                            setClientId(claim.get().getCustosId()).build();
+                }
 
-            return (ReqT) rolesRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setClientId(claim.getCustosId()).build();
+                CredentialMetadata metadata = getCredentialsFromClientId(clientId);
+
+                if (claim.get().isSuperTenant()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                }
+
+                boolean validationStatus = validateParentChildTenantRelationShip(claim.get().getTenantId(),
+                        metadata.getOwnerId());
+
+                if (validationStatus) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                } else {
+                    String error = "Request is not authorized, user not authorized with requested clientId: "
+                            + clientId;
+                    throw new UnAuthorizedException(error, null);
+                }
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
         } else if (method.equals("getTenantRoles")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            if (claim.isPresent()) {
+                GetRolesRequest rolesRequest = ((GetRolesRequest) msg);
+                String clientId = rolesRequest.getClientId();
+                if (rolesRequest.getClientId() == null || rolesRequest.getClientId().trim().isEmpty()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(claim.get().getTenantId()).
+                            setClientId(claim.get().getCustosId()).build();
+                }
+                CredentialMetadata metadata = getCredentialsFromClientId(clientId);
 
-            GetRolesRequest rolesRequest = ((GetRolesRequest) msg);
+                if (claim.get().isSuperTenant()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                }
 
-            return (ReqT) rolesRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setClientId(claim.getCustosId()).build();
+                boolean validationStatus = validateParentChildTenantRelationShip(claim.get().getTenantId(),
+                        metadata.getOwnerId());
+
+                if (validationStatus) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                } else {
+                    String error = "Request is not authorized, user not authorized with requested clientId: " + clientId;
+                    throw new UnAuthorizedException(error, null);
+                }
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
+        } else if (method.equals("deleteRole")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            if (claim.isPresent()) {
+
+                DeleteRoleRequest rolesRequest = ((DeleteRoleRequest) msg);
+                String clientId = rolesRequest.getClientId();
+                if (rolesRequest.getClientId() == null || rolesRequest.getClientId().trim().isEmpty()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(claim.get().getTenantId()).
+                            setClientId(claim.get().getCustosId()).build();
+                }
+                CredentialMetadata metadata = getCredentialsFromClientId(clientId);
+
+                if (claim.get().isSuperTenant()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                }
+
+                boolean validationStatus = validateParentChildTenantRelationShip(claim.get().getTenantId(),
+                        metadata.getOwnerId());
+
+                if (validationStatus) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                } else {
+                    String error = "Request is not authorized, user not authorized with requested clientId: " + clientId;
+                    throw new UnAuthorizedException(error, null);
+                }
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
         } else if (method.equals("addProtocolMapper")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
 
-            AddProtocolMapperRequest rolesRequest = ((AddProtocolMapperRequest) msg);
+            if (claim.isPresent()) {
+                AddProtocolMapperRequest rolesRequest = ((AddProtocolMapperRequest) msg);
+                String clientId = rolesRequest.getClientId();
 
-            return (ReqT) rolesRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setClientId(claim.getCustosId()).build();
+                if (rolesRequest.getClientId() == null || rolesRequest.getClientId().trim().isEmpty()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(claim.get().getTenantId()).
+                            setClientId(claim.get().getCustosId()).build();
+                }
+                CredentialMetadata metadata = getCredentialsFromClientId(clientId);
+
+                if (claim.get().isSuperTenant()) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                }
+
+                boolean validationStatus = validateParentChildTenantRelationShip(claim.get().getTenantId(),
+                        metadata.getOwnerId());
+
+                if (validationStatus) {
+                    return (ReqT) rolesRequest.toBuilder().setTenantId(metadata.getOwnerId()).build();
+                } else {
+                    String error = "Request is not authorized, user not authorized with requested clientId: "
+                            + clientId;
+                    throw new UnAuthorizedException(error, null);
+                }
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
+
         } else if (method.equals("configureEventPersistence")) {
 
-            AuthClaim claim = validateAuth(headers);
-
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
             EventPersistenceRequest rolesRequest = ((EventPersistenceRequest) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId()).setPerformedBy(cl.getUsername())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
 
-            return (ReqT) rolesRequest.toBuilder()
-                    .setTenantId(claim.getTenantId()).setPerformedBy("Tenant Admin")
-                    .build();
+        } else if (method.equals("enableMessaging")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            MessageEnablingRequest rolesRequest = ((MessageEnablingRequest) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getCustosId())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
+
+        } else if (method.equals("enableEmail")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            EmailEnablingRequest rolesRequest = ((EmailEnablingRequest) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getCustosId())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
+
+        } else if (method.equals("disableEmail")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            EmailDisablingRequest rolesRequest = ((EmailDisablingRequest) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getCustosId())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
+
+        } else if (method.equals("getEmailTemplates")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            FetchEmailTemplatesRequest rolesRequest = ((FetchEmailTemplatesRequest) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getCustosId())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
+
+        } else if (method.equals("getEmailFriendlyEvents")) {
+
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+            FetchEmailFriendlyEvents rolesRequest = ((FetchEmailFriendlyEvents) msg);
+            return claim.map(cl -> {
+                return (ReqT) rolesRequest.toBuilder()
+                        .setTenantId(cl.getTenantId())
+                        .setClientId(cl.getCustosId())
+                        .build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
+
         } else if (method.equals("getChildTenants")) {
 
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
 
-            GetTenantsRequest tenantsRequest = ((GetTenantsRequest) msg);
+            if (claim.isPresent()) {
+                GetTenantsRequest tenantsRequest = ((GetTenantsRequest) msg);
+                String clientId = tenantsRequest.getParentClientId();
 
-            return (ReqT) tenantsRequest.toBuilder()
-                    .setParentId(claim.getTenantId()).build();
+                if (tenantsRequest.getParentClientId() == null ||
+                        tenantsRequest.getParentClientId().trim().isEmpty()) {
+                    return (ReqT) tenantsRequest.toBuilder().setParentId(claim.get().getTenantId()).build();
+                }
+                CredentialMetadata metadata = getCredentialsFromClientId(clientId);
+
+                if (claim.get().isSuperTenant()) {
+                    return (ReqT) tenantsRequest.toBuilder().setParentId(metadata.getOwnerId()).build();
+                }
+
+                boolean validationStatus = validateParentChildTenantRelationShip(claim.get().getTenantId(),
+                        metadata.getOwnerId());
+
+                if (validationStatus) {
+                    return (ReqT) tenantsRequest.toBuilder().setParentId(metadata.getOwnerId()).build();
+                } else {
+                    String error = "Request is not authorized, user not authorized with requested clientId: "
+                            + clientId;
+                    throw new UnAuthorizedException(error, null);
+                }
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
         } else if (method.equals("getAllTenantsForUser")) {
             validateAuth(headers);
             return msg;
         } else if (method.equals("getFromCache") || method.equals("getInstitutions")) {
-            AuthClaim claim = validateAuth(headers);
+            Optional<AuthClaim> claim = validateAuth(headers);
 
-            CacheManipulationRequest request = ((CacheManipulationRequest) msg);
-            return (ReqT) request.toBuilder().setTenantId(claim.getTenantId()).build();
-
+            return claim.map(cl -> {
+                CacheManipulationRequest request = ((CacheManipulationRequest) msg);
+                return (ReqT) request.toBuilder().setTenantId(cl.getTenantId()).build();
+            }).orElseThrow(() -> {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            });
         } else if (method.equals("addToCache") || method.equals("removeFromCache")) {
-            AuthClaim claim = validateAuth(headers);
-            AuthClaim userClaim = validateUserToken(headers);
+            Optional<AuthClaim> claim = validateAuth(headers);
+            Optional<AuthClaim> userClaim = validateUserToken(headers);
 
             CacheManipulationRequest.Builder request = ((CacheManipulationRequest) msg).toBuilder();
 
-            if (userClaim != null) {
-                request = request.setPerformedBy(userClaim.getUsername());
+            if (userClaim.isPresent()) {
+                request = request.setPerformedBy(userClaim.get().getUsername());
             }
-
-            return (ReqT) request.setTenantId(claim.getTenantId()).build();
-
+            if (claim.isPresent()) {
+                return (ReqT) request.setTenantId(claim.get().getTenantId()).build();
+            } else {
+                String error = "Request is not authorized, token not found";
+                throw new UnAuthorizedException(error, null);
+            }
         }
         return msg;
     }
 
 
-    private AuthClaim validateAuth(Metadata headers) {
-        AuthClaim claim = null;
+    private Optional<AuthClaim> validateAuth(Metadata headers) {
         try {
-            claim = authorize(headers);
+            return authorize(headers);
         } catch (Exception ex) {
             LOGGER.error(" Authorizing error " + ex.getMessage());
-            throw new NotAuthorizedException("Request is not authorized", ex);
+            throw new UnAuthorizedException("Request is not authorized", ex);
         }
-        if (claim == null) {
-            throw new NotAuthorizedException("Request is not authorized", null);
-        }
-        return claim;
     }
 
 
-    private AuthClaim validateUserToken(Metadata headers) {
-        AuthClaim claim = null;
+    private Optional<AuthClaim> validateUserToken(Metadata headers) {
         try {
             String usertoken = headers.get(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER));
             if (usertoken == null) {
-                return null;
+                return Optional.empty();
             }
 
-            claim = authorizeUsingUserToken(usertoken);
+            return authorizeUsingUserToken(usertoken);
         } catch (Exception ex) {
             LOGGER.error(" Authorizing error " + ex.getMessage());
-            throw new NotAuthorizedException("Request is not authorized", ex);
+            throw new UnAuthorizedException("Request is not authorized", ex);
         }
-        if (claim == null) {
-            throw new NotAuthorizedException("Request is not authorized", null);
-        }
-        return claim;
-
-
     }
 
     private Credentials getCredentials(AuthClaim claim) {
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/DynamicRegistrationValidator.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/DynamicRegistrationValidator.java
index cdfe8b7..3c793b2 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/DynamicRegistrationValidator.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/DynamicRegistrationValidator.java
@@ -22,10 +22,8 @@
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
 import org.apache.custos.credential.store.service.CredentialMetadata;
-import org.apache.custos.credential.store.service.GetCredentialRequest;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.management.service.DeleteTenantRequest;
@@ -37,11 +35,13 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 /**
  * This class validates the  conditions that should be satisfied by the Dynamic Registration Protocol
  */
 @Component
-public class DynamicRegistrationValidator extends AuthInterceptor implements IntegrationServiceInterceptor {
+public class DynamicRegistrationValidator extends AuthInterceptor {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(DynamicRegistrationValidator.class);
 
@@ -65,16 +65,9 @@
 
             String clientId = tenantRequest.getClientId();
 
-            GetCredentialRequest request = GetCredentialRequest.newBuilder()
-                    .setId(clientId)
-                    .build();
-            CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
+            CredentialMetadata metadata = getCredentialsFromClientId(clientId);
 
-            if (metadata == null || metadata.getOwnerId() == 0) {
-                throw new NotAuthorizedException("Invalid client_id", null);
-            }
-
-            Tenant tenant = validateTenant(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
+            Tenant tenant = validateTenantWithUserToken(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
             return (ReqT) tenantRequest.toBuilder().setTenantId(tenant != null ? tenant.getTenantId() :
                     tenantRequest.getTenantId()).setTenant(tenant).build();
 
@@ -83,7 +76,7 @@
             Tenant tenantRequest = ((Tenant) msg);
 
             if (tenantRequest.getParentTenantId() > 0) {
-                validateTenant(tenantRequest.getParentTenantId(), tenantRequest.getParentTenantId(), headers);
+                validateTenantWithBasicAuth(tenantRequest.getParentTenantId(), tenantRequest.getParentTenantId(), headers);
             }
 
         } else if (method.equals("updateTenant")) {
@@ -97,17 +90,10 @@
                 clientId = tenantRequest.getBody().getClientId();
             }
 
-            GetCredentialRequest request = GetCredentialRequest.newBuilder()
-                    .setId(clientId)
-                    .build();
-            CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
-
-            if (metadata == null || metadata.getOwnerId() == 0) {
-                throw new NotAuthorizedException("Invalid client_id", null);
-            }
+            CredentialMetadata metadata = getCredentialsFromClientId(clientId);
 
 
-            Tenant tenant = validateTenant(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
+            Tenant tenant = validateTenantWithUserToken(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
 
             return (ReqT) tenantRequest.toBuilder().setTenantId(tenant.getTenantId()).setClientId(clientId).build();
 
@@ -118,26 +104,19 @@
 
             String clientId = tenantRequest.getClientId();
 
-            GetCredentialRequest request = GetCredentialRequest.newBuilder()
-                    .setId(clientId)
-                    .build();
-            CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(request);
+            CredentialMetadata metadata = getCredentialsFromClientId(clientId);
 
-            if (metadata == null || metadata.getOwnerId() == 0) {
-                throw new NotAuthorizedException("Invalid client_id", null);
-            }
-
-
-            Tenant tenant = validateTenant(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
+            Tenant tenant = validateTenantWithUserToken(metadata.getOwnerId(), tenantRequest.getTenantId(), headers);
 
             return (ReqT) tenantRequest.toBuilder().setTenantId(tenant.getTenantId()).build();
 
         }
         return msg;
+
     }
 
 
-    private Tenant validateTenant(long ownerId, long parentTenant, Metadata headers) {
+    private Tenant validateTenantWithBasicAuth(long ownerId, long parentTenant, Metadata headers) {
 
         org.apache.custos.tenant.profile.service.GetTenantRequest tenantReq =
                 org.apache.custos.tenant.profile.service.GetTenantRequest
@@ -148,16 +127,42 @@
 
         Tenant tenant = response.getTenant();
 
-        AuthClaim authClaim = authorize(headers);
+        Optional<AuthClaim> authClaim = authorize(headers);
 
-        if (authClaim != null && authClaim.isSuperTenant()) {
+        if (authClaim.isPresent() && authClaim.get().isSuperTenant()) {
             return tenant;
         }
 
         if (tenant == null || (tenant.getParentTenantId() != 0 && tenant.getParentTenantId() != parentTenant)) {
-            throw new NotAuthorizedException("Not a valid admin client", null);
+            throw new UnAuthorizedException("Not a valid admin client", null);
         }
 
         return tenant;
     }
+
+    private Tenant validateTenantWithUserToken(long ownerId, long parentTenant, Metadata headers) {
+
+        org.apache.custos.tenant.profile.service.GetTenantRequest tenantReq =
+                org.apache.custos.tenant.profile.service.GetTenantRequest
+                        .newBuilder().setTenantId(ownerId).build();
+
+        org.apache.custos.tenant.profile.service.GetTenantResponse response =
+                tenantProfileClient.getTenant(tenantReq);
+
+        Tenant tenant = response.getTenant();
+
+        Optional<AuthClaim> authClaim = authorizeUsingUserToken(headers);
+
+        if (authClaim.isPresent() && authClaim.get().isSuperTenant()) {
+            return tenant;
+        }
+
+        if (tenant == null || (tenant.getParentTenantId() != 0 && tenant.getParentTenantId() != parentTenant)) {
+            throw new UnAuthorizedException("Not a valid admin client", null);
+        }
+
+        return tenant;
+    }
+
+
 }
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/InputValidator.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/InputValidator.java
index 1643788..7909689 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/InputValidator.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/InputValidator.java
@@ -27,6 +27,7 @@
 import org.apache.custos.tenant.management.exceptions.MissingParameterException;
 import org.apache.custos.tenant.management.service.DeleteTenantRequest;
 import org.apache.custos.tenant.management.service.GetTenantRequest;
+import org.apache.custos.tenant.management.service.TenantValidationRequest;
 import org.apache.custos.tenant.management.service.UpdateTenantRequest;
 import org.apache.custos.tenant.management.utils.Constants;
 import org.apache.custos.tenant.profile.service.UpdateStatusRequest;
@@ -66,6 +67,9 @@
             case "deleteTenant":
                 validateDeleteTenant(headers, body, methodName);
                 break;
+            case "validateTenant":
+                validateTenant(headers, body, methodName);
+                break;
             case "addTenantRoles":
                 validateAddRoleToTenant(headers, body, methodName);
                 break;
@@ -81,6 +85,12 @@
             case "getFromCache":
             case "getInstitutions":
             case "getTenantRoles":
+            case "deleteRole":
+            case "enableMessaging":
+            case "enableEmail":
+            case "disableEmail":
+            case "getEmailTemplates":
+            case "getEmailFriendlyEvents":
                 validationAuthorizationHeader(headers);
                 break;
             default:
@@ -184,6 +194,21 @@
     }
 
 
+    private boolean validateTenant(Metadata headers, Object body, String method) {
+        validationAuthorizationHeader(headers);
+
+        TenantValidationRequest updateStatusRequest = ((TenantValidationRequest) body);
+
+        if (updateStatusRequest.getClientId() == null || updateStatusRequest.getClientId().trim().equals("")) {
+            throw new MissingParameterException("Client Id should not be null", null);
+        }
+        if (updateStatusRequest.getClientSec() == null || updateStatusRequest.getClientSec().trim().equals("")) {
+            throw new MissingParameterException("Client Secret should not be null", null);
+        }
+        return true;
+    }
+
+
     private boolean validationAuthorizationHeader(Metadata headers) {
         if (headers.get(Metadata.Key.of(Constants.AUTHORIZATION_HEADER, Metadata.ASCII_STRING_MARSHALLER)) == null
                 || headers.get(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER)) == null) {
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
index cdaafd1..189e86b 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
@@ -22,7 +22,7 @@
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.management.service.Credentials;
@@ -32,6 +32,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 @Component
 public class SuperTenantRestrictedOperationsInterceptorImpl extends AuthInterceptor {
 
@@ -50,34 +52,46 @@
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
 
         if (method.equals("updateTenantStatus")) {
-            if ( !((UpdateStatusRequest)msg).getSuperTenant() ) {
-                AuthClaim claim = null;
+            if (!((UpdateStatusRequest) msg).getSuperTenant()) {
+                Optional<AuthClaim> claim = null;
                 String token = getToken(headers);
                 try {
                     claim = authorizeUsingUserToken(headers);
                 } catch (Exception ex) {
                     LOGGER.error(" Authorizing error " + ex.getMessage());
-                    throw new NotAuthorizedException("Request is not authorized", ex);
+                    throw new UnAuthorizedException("Request is not authorized", ex);
                 }
-                if (claim == null || !claim.isSuperTenant() || !claim.isAdmin()) {
-                    throw new NotAuthorizedException("Request is not authorized", null);
+                if (claim == null || claim.isEmpty() || !claim.get().isSuperTenant() || !claim.get().isAdmin()) {
+                    throw new UnAuthorizedException("Request is not authorized", null);
                 }
-                return (ReqT) ((UpdateStatusRequest) msg).toBuilder().setUpdatedBy(claim.getPerformedBy())
+                return (ReqT) ((UpdateStatusRequest) msg).toBuilder().setUpdatedBy(claim.get().getPerformedBy())
                         .setAccessToken(token).build();
             }
             return msg;
 
         } else if (method.equals("getAllTenants")) {
-            AuthClaim claim = null;
+            Optional<AuthClaim> claim = null;
             try {
-                claim = authorize(headers);
-                LOGGER.info("Claim "+ claim);
-                LOGGER.info("Claim Auth "+ claim.isSuperTenant());
+                claim = authorizeUsingUserToken(headers);
             } catch (Exception ex) {
-                throw new NotAuthorizedException("Request is not authorized", ex);
+                throw new UnAuthorizedException("Request is not authorized", ex);
             }
-            if (claim == null || !claim.isSuperTenant()) {
-                throw new NotAuthorizedException("Request is not authorized", null);
+            if (claim == null || claim.isEmpty() || !claim.get().isSuperTenant()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            return msg;
+
+        } else if (method.equals("validateTenant")) {
+            Optional<AuthClaim> claim = null;
+            try {
+                claim = authorizeUsingUserToken(headers);
+            } catch (Exception ex) {
+                LOGGER.error(" Authorizing error " + ex.getMessage());
+                throw new UnAuthorizedException("Request is not authorized", ex);
+            }
+            if (claim == null || claim.isEmpty()|| !claim.get().isSuperTenant()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
             }
 
             return msg;
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
index 7db8d5b..39ba845 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/service/TenantManagementService.java
@@ -27,7 +27,6 @@
 import org.apache.custos.federated.authentication.client.FederatedAuthenticationClient;
 import org.apache.custos.federated.authentication.service.CacheManipulationRequest;
 import org.apache.custos.federated.authentication.service.DeleteClientRequest;
-import org.apache.custos.federated.authentication.service.GetInstitutionsIdsAsResponse;
 import org.apache.custos.federated.authentication.service.GetInstitutionsResponse;
 import org.apache.custos.iam.admin.client.IamAdminServiceClient;
 import org.apache.custos.iam.service.OperationStatus;
@@ -38,10 +37,14 @@
 import org.apache.custos.integration.core.ServiceCallback;
 import org.apache.custos.integration.core.ServiceChain;
 import org.apache.custos.integration.core.ServiceException;
+import org.apache.custos.messaging.client.MessagingClient;
+import org.apache.custos.messaging.email.service.*;
+import org.apache.custos.messaging.service.MessageEnablingResponse;
 import org.apache.custos.tenant.management.service.TenantManagementServiceGrpc.TenantManagementServiceImplBase;
 import org.apache.custos.tenant.management.tasks.TenantActivationTask;
 import org.apache.custos.tenant.management.utils.Constants;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
+import org.apache.custos.tenant.profile.service.GetTenantResponse;
 import org.apache.custos.tenant.profile.service.*;
 import org.apache.custos.user.profile.client.UserProfileClient;
 import org.apache.custos.user.profile.service.UserProfile;
@@ -50,9 +53,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 
@@ -82,6 +85,12 @@
     @Autowired
     private IdentityClient identityClient;
 
+    @Value("${tenant.base.uri}")
+    private String TENANT_BASE_URI;
+
+    @Autowired
+    private MessagingClient messagingClient;
+
 
     @Override
     public void createTenant(Tenant request, StreamObserver<CreateTenantResponse> responseObserver) {
@@ -123,7 +132,7 @@
 
             }
 
-            String tenantBaseURI = Constants.TENANT_BASE_URI + "?client_id=" + resp.getId();
+            String tenantBaseURI = TENANT_BASE_URI + "?client_id=" + resp.getId();
 
 
             CreateTenantResponse tenantResponse = CreateTenantResponse.newBuilder()
@@ -149,7 +158,7 @@
     }
 
     @Override
-    public void getTenant(GetTenantRequest request, StreamObserver<GetTenantResponse> responseObserver) {
+    public void getTenant(GetTenantRequest request, StreamObserver<Tenant> responseObserver) {
         try {
 
             Tenant tenant = request.getTenant(); // retrieved cached tenant from interceptors
@@ -163,49 +172,25 @@
                         profileClient.getTenant(tenantReq);
                 tenant = response.getTenant();
             }
-
-            double clientIdIssuedAt = request.getCredentials().getCustosClientIdIssuedAt();
-
-            if (!request.getCredentials().getCustosClientId().equals(request.getClientId())) {
-
-                GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
-                        .setOwnerId(tenant.getTenantId())
-                        .setId(request.getClientId())
+            if (tenant.getParentTenantId() > 0) {
+                GetCredentialRequest cR = GetCredentialRequest.newBuilder()
+                        .setOwnerId(tenant.getParentTenantId())
                         .setType(Type.CUSTOS).build();
 
-                clientIdIssuedAt = credentialStoreServiceClient.
-                        getCredential(credentialRequest).getClientIdIssuedAt();
+                CredentialMetadata parentMetadata = credentialStoreServiceClient.
+                        getCredential(cR);
+                tenant = tenant.toBuilder().setParentClientId(parentMetadata.getId()).build();
             }
+            GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
+                    .setOwnerId(tenant.getTenantId())
+                    .setType(Type.CUSTOS).build();
 
+            CredentialMetadata metadata = credentialStoreServiceClient.
+                    getCredential(credentialRequest);
 
-            String[] grantTypes = {Constants.AUTHORIZATION_CODE};
+            tenant = tenant.toBuilder().setClientId(metadata.getId()).build();
 
-            GetTenantResponse tenantResponse = GetTenantResponse.newBuilder()
-                    .setClientId(request.getClientId())
-                    .setAdminEmail(tenant.getAdminEmail())
-                    .setAdminFirstName(tenant.getAdminFirstName())
-                    .setAdminLastName(tenant.getAdminLastName())
-                    .setAdminUsername(tenant.getAdminUsername())
-                    .setRequesterEmail(tenant.getRequesterEmail())
-                    .setApplicationType(tenant.getApplicationType())
-                    .setClientName(tenant.getClientName())
-                    .setClientUri(tenant.getClientUri())
-                    .setComment(tenant.getComment())
-                    .setDomain(tenant.getDomain())
-                    .setExampleExtensionParameter(tenant.getExampleExtensionParameter())
-                    .setJwksUri(tenant.getJwksUri())
-                    .addAllContacts(tenant.getContactsList())
-                    .addAllRedirectUris(tenant.getRedirectUrisList())
-                    .setLogoUri(tenant.getLogoUri())
-                    .setPolicyUri(tenant.getPolicyUri())
-                    .setTosUri(tenant.getTosUri())
-                    .setScope(tenant.getScope())
-                    .setSoftwareId(tenant.getSoftwareId())
-                    .setSoftwareVersion(tenant.getSoftwareVersion())
-                    .addAllGrantTypes(Arrays.asList(grantTypes))
-                    .setClientIdIssuedAt(clientIdIssuedAt)
-                    .build();
-            responseObserver.onNext(tenantResponse);
+            responseObserver.onNext(tenant);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
@@ -217,115 +202,109 @@
 
 
     @Override
-    public void updateTenant(UpdateTenantRequest request, StreamObserver<GetTenantResponse> responseObserver) {
+    public void updateTenant(UpdateTenantRequest request, StreamObserver<Tenant> responseObserver) {
 
         try {
             Tenant tenant = request.getBody();
 
             tenant = tenant.toBuilder().setTenantId(request.getTenantId()).build();
 
+            org.apache.custos.tenant.profile.service.GetTenantRequest tenantRequest =
+                    org.apache.custos.tenant.profile.service.GetTenantRequest.newBuilder()
+                            .setTenantId(request.getTenantId()).build();
+
+            GetTenantResponse tenantResponse = profileClient.getTenant(tenantRequest);
+
+            if (tenantResponse.getTenant() == null && tenantResponse.getTenant().getTenantId() == 0) {
+                String msg = "Cannot find tenant with Tenant name" + tenant.getClientName();
+                LOGGER.error(msg);
+                responseObserver.onError(Status.INVALID_ARGUMENT.withDescription(msg).asRuntimeException());
+                return;
+            }
+
+            Tenant exTenant = tenantResponse.getTenant();
+
+            tenant = tenant.toBuilder().setTenantStatus(exTenant.getTenantStatus()).build();
+
+            GetCredentialRequest passwordRequest = GetCredentialRequest
+                    .newBuilder()
+                    .setId(tenant.getAdminUsername())
+                    .setOwnerId(tenant.getTenantId())
+                    .setType(Type.INDIVIDUAL)
+                    .build();
+            CredentialMetadata metadata = credentialStoreServiceClient.getCredential(passwordRequest);
+
+            if (metadata != null && metadata.getSecret() != null) {
+                tenant = tenant.toBuilder().setAdminPassword(metadata.getSecret()).build();
+            }
+
             Tenant updateTenant = profileClient.updateTenant(tenant);
 
-            tenantActivationTask.activateTenant(updateTenant, Constants.GATEWAY_ADMIN, true);
+            GetCredentialRequest clientIdRequest = GetCredentialRequest.newBuilder()
+                    .setOwnerId(tenant.getTenantId())
+                    .setType(Type.CUSTOS).build();
 
-            double clientIdIssuedAt = request.getCredentials().getCustosClientIdIssuedAt();
+            CredentialMetadata idMeta = credentialStoreServiceClient.
+                    getCredential(clientIdRequest);
 
+            tenant = tenant.toBuilder().setClientId(idMeta.getId()).build();
 
-            if (!request.getCredentials().getCustosClientId().equals(request.getClientId())) {
+            if (tenant.getTenantStatus().equals(TenantStatus.ACTIVE)) {
 
+                tenantActivationTask.activateTenant(updateTenant, Constants.GATEWAY_ADMIN, true);
                 GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
                         .setOwnerId(tenant.getTenantId())
                         .setId(request.getClientId())
-                        .setType(Type.CUSTOS).build();
+                        .setType(Type.IAM).build();
 
-                clientIdIssuedAt = credentialStoreServiceClient.
-                        getCredential(credentialRequest).getClientIdIssuedAt();
-            }
+                CredentialMetadata iamCredential = credentialStoreServiceClient.
+                        getCredential(credentialRequest);
 
 
-            String[] grantTypes = {Constants.AUTHORIZATION_CODE,
-                    Constants.CLIENT_CREDENTIALS,
-                    Constants.PASSWORD_GRANT_TYPE,
-                    Constants.REFRESH_TOKEN};
-
-            GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
-                    .setOwnerId(tenant.getTenantId())
-                    .setId(request.getClientId())
-                    .setType(Type.IAM).build();
-
-            CredentialMetadata iamCredential = credentialStoreServiceClient.
-                    getCredential(credentialRequest);
-
-
-            GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
-                    .newBuilder()
-                    .setClientId(iamCredential.getId())
-                    .setClientSecret(iamCredential.getSecret())
-                    .setTenantId(request.getTenantId())
-                    .build();
-            AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);
-
-            if (token != null && token.getAccessToken() != null) {
-                UserSearchMetadata userSearchMetadata = UserSearchMetadata
+                GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
                         .newBuilder()
-                        .setUsername(tenant.getAdminUsername())
-                        .build();
-
-                UserSearchRequest searchRequest = UserSearchRequest.newBuilder().
-                        setTenantId(request.getTenantId())
-                        .setPerformedBy(Constants.GATEWAY_ADMIN)
-                        .setAccessToken(token.getAccessToken())
-                        .setUser(userSearchMetadata)
-                        .build();
-
-                UserRepresentation userRepresentation = iamAdminServiceClient.getUser(searchRequest);
-
-                UserProfile profile = convertToProfile(userRepresentation);
-
-                UserProfileRequest userProfileRequest = UserProfileRequest
-                        .newBuilder()
-                        .setProfile(profile)
-                        .setPerformedBy(Constants.GATEWAY_ADMIN)
+                        .setClientId(iamCredential.getId())
+                        .setClientSecret(iamCredential.getSecret())
                         .setTenantId(request.getTenantId())
                         .build();
+                AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);
 
-                UserProfile userProfile = userProfileClient.getUser(userProfileRequest);
+                if (token != null && token.getAccessToken() != null) {
+                    UserSearchMetadata userSearchMetadata = UserSearchMetadata
+                            .newBuilder()
+                            .setUsername(tenant.getAdminUsername())
+                            .build();
 
-                if (userProfile == null || userProfile.getUsername().equals("")) {
-                    userProfileClient.createUserProfile(userProfileRequest);
-                } else {
-                    userProfileClient.updateUserProfile(userProfileRequest);
+                    UserSearchRequest searchRequest = UserSearchRequest.newBuilder().
+                            setTenantId(request.getTenantId())
+                            .setPerformedBy(Constants.GATEWAY_ADMIN)
+                            .setAccessToken(token.getAccessToken())
+                            .setUser(userSearchMetadata)
+                            .build();
+
+                    UserRepresentation userRepresentation = iamAdminServiceClient.getUser(searchRequest);
+
+                    UserProfile profile = convertToProfile(userRepresentation);
+
+                    UserProfileRequest userProfileRequest = UserProfileRequest
+                            .newBuilder()
+                            .setProfile(profile)
+                            .setPerformedBy(Constants.GATEWAY_ADMIN)
+                            .setTenantId(request.getTenantId())
+                            .build();
+
+                    UserProfile userProfile = userProfileClient.getUser(userProfileRequest);
+
+                    if (userProfile == null || userProfile.getUsername().equals("")) {
+                        userProfileClient.createUserProfile(userProfileRequest);
+                    } else {
+                        userProfileClient.updateUserProfile(userProfileRequest);
+                    }
                 }
 
-
             }
 
-            GetTenantResponse tenantResponse = GetTenantResponse.newBuilder()
-                    .setClientId(request.getClientId())
-                    .setAdminEmail(tenant.getAdminEmail())
-                    .setAdminFirstName(tenant.getAdminFirstName())
-                    .setAdminLastName(tenant.getAdminLastName())
-                    .setRequesterEmail(tenant.getRequesterEmail())
-                    .setApplicationType(tenant.getApplicationType())
-                    .setClientName(tenant.getClientName())
-                    .setClientUri(tenant.getClientUri())
-                    .setComment(tenant.getComment())
-                    .setDomain(tenant.getDomain())
-                    .setExampleExtensionParameter(tenant.getExampleExtensionParameter())
-                    .setJwksUri(tenant.getJwksUri())
-                    .addAllContacts(tenant.getContactsList())
-                    .addAllRedirectUris(tenant.getRedirectUrisList())
-                    .setLogoUri(tenant.getLogoUri())
-                    .setPolicyUri(tenant.getPolicyUri())
-                    .setTosUri(tenant.getTosUri())
-                    .setScope(tenant.getScope())
-                    .setSoftwareId(tenant.getSoftwareId())
-                    .setSoftwareVersion(tenant.getSoftwareVersion())
-                    .addAllGrantTypes(Arrays.asList(grantTypes))
-                    .setClientIdIssuedAt(clientIdIssuedAt)
-                    .build();
-
-            responseObserver.onNext(tenantResponse);
+            responseObserver.onNext(tenant);
             responseObserver.onCompleted();
 
         } catch (Exception ex) {
@@ -420,6 +399,35 @@
 
 
     @Override
+    public void validateTenant(TenantValidationRequest request, StreamObserver<OperationStatus> responseObserver) {
+        try {
+            GetCredentialRequest credentialRequest = GetCredentialRequest
+                    .newBuilder()
+                    .setId(request.getClientId()).build();
+
+
+            CredentialMetadata metadata = credentialStoreServiceClient.getCustosCredentialFromClientId(credentialRequest);
+
+            if (metadata.getSecret() != null && metadata.getSecret().trim().
+                    equals(request.getClientSec().trim())) {
+                OperationStatus status = OperationStatus.newBuilder().setStatus(true).build();
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
+            } else {
+                OperationStatus status = OperationStatus.newBuilder().setStatus(false).build();
+                responseObserver.onNext(status);
+                responseObserver.onCompleted();
+            }
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while validating tenant with Id " + request.getClientId()
+                    + " reason: " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
     public void addTenantRoles(AddRolesRequest request, StreamObserver<AllRoles> responseObserver) {
         try {
             AllRoles allRoles = iamAdminServiceClient.addRolesToTenant(request);
@@ -451,6 +459,22 @@
     }
 
     @Override
+    public void deleteRole(DeleteRoleRequest request, StreamObserver<OperationStatus> responseObserver) {
+        try {
+            OperationStatus operationStatus = iamAdminServiceClient.deleteRole(request);
+
+            responseObserver.onNext(operationStatus);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at deleteRole " + request.getRole() + " of tenant "
+                    + request.getTenantId() + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
     public void addProtocolMapper(AddProtocolMapperRequest request, StreamObserver<OperationStatus> responseObserver) {
         try {
             OperationStatus allRoles = iamAdminServiceClient.addProtocolMapper(request);
@@ -482,6 +506,22 @@
     }
 
     @Override
+    public void enableMessaging(org.apache.custos.messaging.service.MessageEnablingRequest request,
+                                StreamObserver<org.apache.custos.messaging.service.MessageEnablingResponse> responseObserver) {
+        try {
+            MessageEnablingResponse response = messagingClient.enableMessaging(request);
+
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred at enableMessaging " + ex.getMessage();
+            LOGGER.error(msg);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
     public void getAllTenants(GetTenantsRequest request, StreamObserver<GetAllTenantsResponse> responseObserver) {
         try {
             GetAllTenantsResponse response = profileClient.getAllTenants(request);
@@ -498,6 +538,17 @@
                     CredentialMetadata metadata = credentialStoreServiceClient.
                             getCredential(credentialRequest);
 
+
+                    if (tenant.getParentTenantId() > 0) {
+                        GetCredentialRequest cR = GetCredentialRequest.newBuilder()
+                                .setOwnerId(tenant.getParentTenantId())
+                                .setType(Type.CUSTOS).build();
+
+                        CredentialMetadata parentMetadata = credentialStoreServiceClient.
+                                getCredential(cR);
+                        tenant = tenant.toBuilder().setParentClientId(parentMetadata.getId()).build();
+                    }
+
                     tenant = tenant.toBuilder().setClientId(metadata.getId()).build();
                     tenantList.add(tenant);
 
@@ -519,6 +570,36 @@
     public void getChildTenants(GetTenantsRequest request, StreamObserver<GetAllTenantsResponse> responseObserver) {
         try {
             GetAllTenantsResponse response = profileClient.getAllTenants(request);
+            if (response != null && !response.getTenantList().isEmpty()) {
+                List<Tenant> tenantList = new ArrayList<>();
+
+                for (Tenant tenant : response.getTenantList()) {
+
+                    GetCredentialRequest credentialRequest = GetCredentialRequest.newBuilder()
+                            .setOwnerId(tenant.getTenantId())
+                            .setType(Type.CUSTOS).build();
+
+                    CredentialMetadata metadata = credentialStoreServiceClient.
+                            getCredential(credentialRequest);
+
+
+                    if (tenant.getParentTenantId() > 0) {
+                        GetCredentialRequest cR = GetCredentialRequest.newBuilder()
+                                .setOwnerId(tenant.getParentTenantId())
+                                .setType(Type.CUSTOS).build();
+
+                        CredentialMetadata parentMetadata = credentialStoreServiceClient.
+                                getCredential(cR);
+                        tenant = tenant.toBuilder().setParentClientId(parentMetadata.getId()).build();
+                    }
+
+                    tenant = tenant.toBuilder().setClientId(metadata.getId()).build();
+                    tenantList.add(tenant);
+
+                }
+
+                response = response.toBuilder().clearTenant().addAllTenant(tenantList).build();
+            }
             responseObserver.onNext(response);
             responseObserver.onCompleted();
         } catch (Exception ex) {
@@ -761,6 +842,78 @@
     }
 
 
+    @Override
+    public void enableEmail(EmailEnablingRequest request,
+                            StreamObserver<EmailTemplate> responseObserver) {
+        try {
+            LOGGER.debug("Request received to enable emails for tenant " + request.getTenantId());
+
+            EmailTemplate emailTemplate = messagingClient.enableEmail(request);
+            responseObserver.onNext(emailTemplate);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while enabling emails for tenant " + request.getTenantId() + " for event "
+                    + request.getEmailTemplate().getCustosEvent().name();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+        }
+    }
+
+    @Override
+    public void disableEmail(EmailDisablingRequest request,
+                             StreamObserver<org.apache.custos.messaging.email.service.Status> responseObserver) {
+        try {
+            LOGGER.debug("Request received to disable emails for tenant " + request.getTenantId());
+
+            org.apache.custos.messaging.email.service.Status status = messagingClient.disableEmail(request);
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while disabling emails for tenant " + request.getTenantId() + " for event "
+                    + request.getEmailTemplate().getCustosEvent().name();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
+    public void getEmailTemplates(FetchEmailTemplatesRequest request,
+                                  StreamObserver<FetchEmailTemplatesResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to get email templates for tenant " + request.getTenantId());
+            FetchEmailTemplatesResponse response = messagingClient.getEmailTemplates(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while fetching emails for tenant " + request.getTenantId();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+
+    @Override
+    public void getEmailFriendlyEvents(FetchEmailFriendlyEvents request, StreamObserver<FetchEmailFriendlyEventsResponse> responseObserver) {
+        try {
+            LOGGER.debug("Request received to get getEmailFriendlyEvents for tenant " + request.getTenantId());
+            FetchEmailFriendlyEventsResponse response = messagingClient.fetchEmailFriendlyEvents(request);
+            responseObserver.onNext(response);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = " Error occurred while fetching email events for tenant " + request.getTenantId();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
     private UserProfile convertToProfile(UserRepresentation representation) {
         UserProfile.Builder profileBuilder = UserProfile.newBuilder();
 
@@ -784,7 +937,7 @@
                         org.apache.custos.user.profile.service.UserAttribute
                                 .newBuilder()
                                 .setKey(atr.getKey())
-                                .addAllValue(atr.getValuesList())
+                                .addAllValues(atr.getValuesList())
                                 .build();
 
                 userAtrList.add(userAttribute);
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/tasks/TenantActivationTask.java b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/tasks/TenantActivationTask.java
index 1aba81b..443d0e2 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/tasks/TenantActivationTask.java
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/java/org/apache/custos/tenant/management/tasks/TenantActivationTask.java
@@ -33,13 +33,14 @@
 import org.apache.custos.iam.service.SetUpTenantResponse;
 import org.apache.custos.integration.core.ServiceException;
 import org.apache.custos.integration.core.ServiceTaskImpl;
+import org.apache.custos.sharing.client.SharingClient;
+import org.apache.custos.sharing.service.EntityType;
+import org.apache.custos.sharing.service.EntityTypeRequest;
+import org.apache.custos.sharing.service.PermissionType;
+import org.apache.custos.sharing.service.PermissionTypeRequest;
 import org.apache.custos.tenant.management.utils.Constants;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
 import org.apache.custos.tenant.profile.service.*;
-import org.apache.custos.user.profile.client.UserProfileClient;
-import org.apache.custos.user.profile.service.UserProfile;
-import org.apache.custos.user.profile.service.UserProfileRequest;
-import org.apache.custos.user.profile.service.UserStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -67,6 +68,9 @@
     @Autowired
     private TenantProfileClient profileClient;
 
+    @Autowired
+    private SharingClient sharingClient;
+
 
     @Override
     public void invokeService(T data) {
@@ -109,7 +113,7 @@
 
                         UpdateStatusResponse response = null;
                         if (iamMetadata == null || iamMetadata.getId() == null || iamMetadata.getId().equals("")) {
-                             response = this.activateTenant(newTenant, Constants.SYSTEM, false);
+                            response = this.activateTenant(newTenant, Constants.SYSTEM, false);
                         } else {
                             response = this.activateTenant(newTenant, Constants.SYSTEM, true);
                         }
@@ -192,7 +196,8 @@
                 .setOwnerId(tenant.getTenantId())
                 .setType(Type.CILOGON).build();
 
-        String ciLogonRedirectURI = iamAdminServiceClient.getIamServerURL() + "realms" + "/" + tenant.getTenantId() + "/" + "broker" + "/" + "oidc" + "/" + "endpoint";
+        String ciLogonRedirectURI = iamAdminServiceClient.getIamServerURL() +
+                "realms" + "/" + tenant.getTenantId() + "/" + "broker" + "/" + "oidc" + "/" + "endpoint";
 
 
         List<String> arrayList = new ArrayList<>();
@@ -242,6 +247,34 @@
                     .setType(FederatedIDPs.CILOGON)
                     .build();
             iamAdminServiceClient.configureFederatedIDP(request);
+
+            PermissionType permissionType = PermissionType
+                    .newBuilder()
+                    .setId("OWNER")
+                    .setName("OWNER")
+                    .setDescription("Owner permission type").build();
+
+            PermissionTypeRequest permissionTypeRequest = PermissionTypeRequest
+                    .newBuilder()
+                    .setPermissionType(permissionType)
+                    .setTenantId(tenant.getTenantId())
+                    .build();
+            sharingClient.createPermissionType(permissionTypeRequest);
+
+            EntityType entityType = EntityType
+                    .newBuilder()
+                    .setId("SECRET")
+                    .setName("SECRET")
+                    .setDescription("Secret entity type").build();
+
+            EntityTypeRequest entityTypeRequest = EntityTypeRequest
+                    .newBuilder()
+                    .setEntityType(entityType)
+                    .setTenantId(tenant.getTenantId())
+                    .build();
+            sharingClient.createEntityType(entityTypeRequest);
+
+
         }
 
         org.apache.custos.tenant.profile.service.UpdateStatusRequest updateTenantRequest =
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/proto/TenantManagementService.proto b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/proto/TenantManagementService.proto
index eeba841..35e3324 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/proto/TenantManagementService.proto
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/proto/TenantManagementService.proto
@@ -22,6 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.tenant.management.service;
+option go_package = "./pb";
 
 import "google/api/annotations.proto";
 import "TenantProfileService.proto";
@@ -29,6 +30,8 @@
 import "google/protobuf/empty.proto";
 import "IamAdminService.proto";
 import "FederatedAuthenticationService.proto";
+import "MessagingService.proto";
+import "EmailService.proto";
 
 
 message CreateTenantResponse {
@@ -106,14 +109,21 @@
 
 
 message GetCredentialsRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
 }
 
 message GetCredentialsResponse {
-    string iamClientId = 1;
-    string iamClientSecret = 2;
-    string ciLogonClientId = 3;
-    string ciLogonClientSecret = 4;
+    string iam_client_id = 1;
+    string iam_client_secret = 2;
+    string ci_logon_client_id = 3;
+    string ci_logon_client_secret = 4;
+}
+
+
+message TenantValidationRequest {
+    string client_id = 1;
+    string client_sec = 2;
+
 }
 
 service TenantManagementService {
@@ -124,13 +134,13 @@
          };
     }
 
-    rpc getTenant (GetTenantRequest) returns (GetTenantResponse) {
+    rpc getTenant (GetTenantRequest) returns (org.apache.custos.tenant.profile.service.Tenant) {
         option (google.api.http) = {
            get: "/tenant-management/v1.0.0/oauth2/tenant"
         };
     }
 
-    rpc updateTenant (UpdateTenantRequest) returns (GetTenantResponse) {
+    rpc updateTenant (UpdateTenantRequest) returns (org.apache.custos.tenant.profile.service.Tenant) {
         option (google.api.http) = {
            put: "/tenant-management/v1.0.0/oauth2/tenant"
            body: "body"
@@ -144,6 +154,12 @@
         };
     }
 
+    rpc validateTenant (TenantValidationRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/tenant/credentials/status"
+        };
+    }
+
     rpc addTenantRoles (org.apache.custos.iam.service.AddRolesRequest) returns (org.apache.custos.iam.service.AllRoles) {
         option (google.api.http) = {
            post: "/tenant-management/v1.0.0/roles"
@@ -156,6 +172,12 @@
         };
     }
 
+    rpc deleteRole (org.apache.custos.iam.service.DeleteRoleRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/tenant-management/v1.0.0/role"
+        };
+    }
+
     rpc addProtocolMapper (org.apache.custos.iam.service.AddProtocolMapperRequest) returns (org.apache.custos.iam.service.OperationStatus) {
         option (google.api.http) = {
            post: "/tenant-management/v1.0.0/protocol/mapper"
@@ -168,6 +190,12 @@
         };
     }
 
+    rpc enableMessaging(org.apache.custos.messaging.service.MessageEnablingRequest) returns (org.apache.custos.messaging.service.MessageEnablingResponse) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/messaging"
+        };
+    }
+
 
     rpc updateTenantStatus (org.apache.custos.tenant.profile.service.UpdateStatusRequest) returns (org.apache.custos.tenant.profile.service.UpdateStatusResponse) {
         option (google.api.http) = {
@@ -229,4 +257,29 @@
     }
 
 
+    rpc enableEmail(org.apache.custos.messaging.email.service.EmailEnablingRequest) returns (org.apache.custos.messaging.email.service.EmailTemplate) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/email/activation"
+        };
+    }
+
+    rpc disableEmail(org.apache.custos.messaging.email.service.EmailDisablingRequest) returns (org.apache.custos.messaging.email.service.Status) {
+        option (google.api.http) = {
+           post: "/tenant-management/v1.0.0/email/deactivation"
+        };
+    }
+
+    rpc getEmailTemplates(org.apache.custos.messaging.email.service.FetchEmailTemplatesRequest) returns (org.apache.custos.messaging.email.service.FetchEmailTemplatesResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/email/templates"
+        };
+    }
+
+    rpc getEmailFriendlyEvents(org.apache.custos.messaging.email.service.FetchEmailFriendlyEvents) returns (org.apache.custos.messaging.email.service.FetchEmailFriendlyEventsResponse) {
+        option (google.api.http) = {
+           get: "/tenant-management/v1.0.0/email/events"
+        };
+    }
+
+
 }
\ No newline at end of file
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/application.properties b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/application.properties
index 49b6041..7bfb302 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/application.properties
@@ -24,4 +24,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/tenant-management-service-parent/tenant-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb b/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb
index baccaa2..ac21497 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb
+++ b/custos-integration-services/user-management-service-parent/user-management-service-sidecar/src/main/resources/user-management-service.pb
Binary files differ
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/Dockerfile b/custos-integration-services/user-management-service-parent/user-management-service/Dockerfile
index 6457ff8..a1827dd 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/Dockerfile
+++ b/custos-integration-services/user-management-service-parent/user-management-service/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:11-jre-slim
+FROM openjdk:11.0.5-jdk-slim
 VOLUME /tmp
 ARG JAR_FILE
 ADD ${JAR_FILE} app.jar
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/pom.xml b/custos-integration-services/user-management-service-parent/user-management-service/pom.xml
index 23c254d..83b4778 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/pom.xml
+++ b/custos-integration-services/user-management-service-parent/user-management-service/pom.xml
@@ -132,6 +132,13 @@
                     <skip>false</skip>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <configuration>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/deployment.yaml b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/deployment.yaml
index 2fe140f..9fe298c 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/deployment.yaml
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/deployment.yaml
@@ -6,9 +6,10 @@
 {{ include "helm.labels" . | indent 4 }}
 spec:
   replicas: {{ .Values.replicaCount }}
-  rollingUpdate:
-    maxSurge: {{ .Values.rollingUpdate.maxSurge }}
-    maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
+  strategy:
+    rollingUpdate:
+      maxSurge: {{ .Values.rollingUpdate.maxSurge }}
+      maxUnavailable: {{ .Values.rollingUpdate.maxUnavailable }}
   selector:
     matchLabels:
       app.kubernetes.io/name: {{ include "helm.name" . }}
@@ -59,9 +60,9 @@
             httpGet:
               path: /actuator/health
               port: {{ .Values.service.port }}
-              initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
-              periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
-              successThreshold: {{ .Values.readinessProbe.successThreshold }}
+            initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+            periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
+            successThreshold: {{ .Values.readinessProbe.successThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       {{- with .Values.nodeSelector }}
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress-grpc.yaml b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress-grpc.yaml
index c8f3487..cb1b712 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress-grpc.yaml
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress-grpc.yaml
@@ -1,4 +1,4 @@
-apiVersion: extensions/v1beta1
+apiVersion: networking.k8s.io/v1beta1
 kind: Ingress
 metadata:
   annotations:
@@ -8,7 +8,7 @@
   name: ${artifactId}-ingress-grpc
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /org.apache.custos.user.management.service.UserManagementService(/|$)(.*)
@@ -18,5 +18,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress.yaml b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress.yaml
index fd24a57..d5d248b 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress.yaml
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/templates/ingress.yaml
@@ -7,7 +7,7 @@
     cert-manager.io/cluster-issuer: letsencrypt-production
 spec:
   rules:
-    - host: custos.scigap.org
+    - host: {{ .Values.deployment.host }}
       http:
         paths:
           - path: /user-management(/|$)(.*)
@@ -17,5 +17,5 @@
 
   tls:
     - hosts:
-        - custos.scigap.org
+        - {{ .Values.deployment.host }}
       secretName: tls-secret
\ No newline at end of file
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/values.yaml b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/values.yaml
index a516b9c..27d7142 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/values.yaml
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/helm/values.yaml
@@ -82,3 +82,6 @@
   initialDelaySeconds: 5
   periodSeconds: 1
   successThreshold: 1
+
+deployment:
+  host: service.staging.usecustos.org
\ No newline at end of file
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/UserManagementServiceInitializer.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/UserManagementServiceInitializer.java
index 42362d9..a67c6ec 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/UserManagementServiceInitializer.java
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/UserManagementServiceInitializer.java
@@ -26,10 +26,9 @@
 import org.apache.custos.integration.core.interceptor.IntegrationServiceInterceptor;
 import org.apache.custos.integration.core.interceptor.ServiceInterceptor;
 import org.apache.custos.integration.services.commons.interceptors.LoggingInterceptor;
-import org.apache.custos.user.management.interceptors.ClientAuthInterceptorImpl;
+import org.apache.custos.user.management.interceptors.AuthInterceptorImpl;
 import org.apache.custos.user.management.interceptors.InputValidator;
 import org.apache.custos.user.management.interceptors.SuperTenantRestrictedOperationsInterceptorImpl;
-import org.apache.custos.user.management.interceptors.UserAuthInterceptorImpl;
 import org.lognet.springboot.grpc.GRpcGlobalInterceptor;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -66,13 +65,11 @@
 
     @Bean
     public Stack<IntegrationServiceInterceptor> getInterceptorSet(InputValidator inputValidator,
-                                                                  ClientAuthInterceptorImpl authInterceptor,
-                                                                  UserAuthInterceptorImpl userAuthInterceptor,
+                                                                  AuthInterceptorImpl userAuthInterceptor,
                                                                   SuperTenantRestrictedOperationsInterceptorImpl superTenantRestrictedOperationsInterceptor,
                                                                   LoggingInterceptor loggingInterceptor) {
         Stack<IntegrationServiceInterceptor> interceptors = new Stack<>();
         interceptors.add(inputValidator);
-        interceptors.add(authInterceptor);
         interceptors.add(userAuthInterceptor);
         interceptors.add(superTenantRestrictedOperationsInterceptor);
         interceptors.add(loggingInterceptor);
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/AuthInterceptorImpl.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/AuthInterceptorImpl.java
new file mode 100644
index 0000000..aba3cc8
--- /dev/null
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/AuthInterceptorImpl.java
@@ -0,0 +1,487 @@
+/*
+ * 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.custos.user.management.interceptors;
+
+import io.grpc.Metadata;
+import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
+import org.apache.custos.iam.service.*;
+import org.apache.custos.identity.client.IdentityClient;
+import org.apache.custos.identity.service.AuthToken;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
+import org.apache.custos.integration.core.utils.Constants;
+import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
+import org.apache.custos.integration.services.commons.model.AuthClaim;
+import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
+import org.apache.custos.user.management.service.LinkUserProfileRequest;
+import org.apache.custos.user.management.service.UserProfileRequest;
+import org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+/**
+ * Responsible for validate user specific authorization
+ * Methods authenticates users access tokens are implemented here
+ */
+@Component
+public class AuthInterceptorImpl extends MultiTenantAuthInterceptor {
+    private static final Logger LOGGER = LoggerFactory.getLogger(AuthInterceptorImpl.class);
+
+    private CredentialStoreServiceClient credentialStoreServiceClient;
+
+    @Autowired
+    public AuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
+        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
+        this.credentialStoreServiceClient = credentialStoreServiceClient;
+    }
+
+    @Override
+    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
+
+
+        if (method.equals("addUserAttributes")) {
+            AddUserAttributesRequest userAttributesRequest = (AddUserAttributesRequest) msg;
+            headers = attachUserToken(headers, userAttributesRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, userAttributesRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            String oauthId = claim.get().getIamAuthId();
+            long tenantId = claim.get().getTenantId();
+            AuthToken token = getSAToken(claim.get().getIamAuthId(),
+                    claim.get().getIamAuthSecret(), claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+            return (ReqT) ((AddUserAttributesRequest) msg).toBuilder()
+                    .setClientId(oauthId)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token.getAccessToken())
+                    .setPerformedBy(claim.get().getPerformedBy())
+                    .build();
+
+        } else if (method.equals("deleteUserAttributes")) {
+
+            DeleteUserAttributeRequest userAttributesRequest = (DeleteUserAttributeRequest) msg;
+            headers = attachUserToken(headers, userAttributesRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, userAttributesRequest.getClientId());
+
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            String oauthId = claim.get().getIamAuthId();
+
+            long tenantId = claim.get().getTenantId();
+
+            AuthToken token = getSAToken(claim.get().getIamAuthId(), claim.get().getIamAuthSecret(),
+                    claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+            return (ReqT) ((DeleteUserAttributeRequest) msg).toBuilder()
+                    .setClientId(oauthId)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token.getAccessToken())
+                    .setPerformedBy(claim.get().getPerformedBy())
+                    .build();
+
+        } else if (method.equals("addRolesToUsers")) {
+
+            AddUserRolesRequest userAttributesRequest = (AddUserRolesRequest) msg;
+            headers = attachUserToken(headers, userAttributesRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, userAttributesRequest.getClientId());
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+
+            String oauthId = claim.get().getIamAuthId();
+
+            long tenantId = claim.get().getTenantId();
+
+            AuthToken token = getSAToken(claim.get().getIamAuthId(), claim.get().getIamAuthSecret(),
+                    claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+            return (ReqT) ((AddUserRolesRequest) msg).toBuilder()
+                    .setClientId(oauthId)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token.getAccessToken())
+                    .setPerformedBy(claim.get().getPerformedBy())
+                    .build();
+
+        } else if (method.equals("registerAndEnableUsers")) {
+
+            RegisterUsersRequest registerUsersRequest = (RegisterUsersRequest) msg;
+            headers = attachUserToken(headers, registerUsersRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, registerUsersRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            String oauthId = claim.get().getIamAuthId();
+            String oauthSec = claim.get().getIamAuthSecret();
+            Optional<String> userTokenOp = getUserTokenFromUserTokenHeader(headers);
+
+            String userToken = null;
+
+            if (userTokenOp.isEmpty()) {
+                userToken = getToken(headers);
+            } else {
+                userToken = userTokenOp.get();
+            }
+
+            long tenantId = claim.get().getTenantId();
+            org.apache.custos.iam.service.RegisterUsersRequest registerUserRequest =
+                    ((RegisterUsersRequest) msg).toBuilder()
+                            .setTenantId(tenantId)
+                            .setClientId(oauthId)
+                            .setAccessToken(userToken)
+                            .setPerformedBy(claim.get().getPerformedBy())
+                            .build();
+            return (ReqT) registerUserRequest;
+        } else if (method.equals("deleteUserRoles")) {
+
+            DeleteUserRolesRequest deleteUserRolesRequest = (DeleteUserRolesRequest) msg;
+            headers = attachUserToken(headers, deleteUserRolesRequest.getClientId());
+            Optional<AuthClaim> claim = authorize(headers, deleteUserRolesRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+
+            String oauthId = claim.get().getIamAuthId();
+
+            long tenantId = claim.get().getTenantId();
+
+            AuthToken token = getSAToken(claim.get().getIamAuthId(), claim.get().getIamAuthSecret(),
+                    claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+            DeleteUserRolesRequest operationRequest = ((DeleteUserRolesRequest) msg)
+                    .toBuilder()
+                    .setClientId(oauthId)
+                    .setAccessToken(token.getAccessToken())
+                    .setTenantId(tenantId)
+                    .setPerformedBy(claim.get().getPerformedBy().isEmpty()?Constants.SYSTEM:claim.get().getPerformedBy())
+                    .build();
+
+            return (ReqT) operationRequest;
+
+        } else if (method.equals("deleteUser") || method.equals("grantAdminPrivileges") ||
+                method.equals("removeAdminPrivileges")) {
+
+            UserSearchRequest userSearchRequest = (UserSearchRequest) msg;
+            headers = attachUserToken(headers, userSearchRequest.getClientId());
+            Optional<AuthClaim> claim =
+                    validateRoleManagementAuthorizations(headers, userSearchRequest.getClientId());
+            String oauthId = claim.get().getIamAuthId();
+            String oauthSec = claim.get().getIamAuthSecret();
+
+            AuthToken token = getSAToken(claim.get().getIamAuthId(), claim.get().getIamAuthSecret(), claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+
+            long tenantId = claim.get().getTenantId();
+            UserSearchRequest operationRequest = ((UserSearchRequest) msg)
+                    .toBuilder()
+                    .setClientId(oauthId)
+                    .setClientSec(oauthSec)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token.getAccessToken())
+                    .setPerformedBy(Constants.SYSTEM)
+                    .build();
+
+            return (ReqT) operationRequest;
+
+        } else if (method.equals("linkUserProfile")) {
+            String token = getToken(headers);
+            Optional<AuthClaim> claim = authorizeUsingUserToken(headers);
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            String oauthId = claim.get().getIamAuthId();
+            String oauthSec = claim.get().getIamAuthSecret();
+
+            long tenantId = claim.get().getTenantId();
+            LinkUserProfileRequest operationRequest = ((LinkUserProfileRequest) msg)
+                    .toBuilder()
+                    .setIamClientId(oauthId)
+                    .setIamClientSecret(oauthSec)
+                    .setTenantId(tenantId)
+                    .setAccessToken(token)
+                    .setPerformedBy(claim.get().getPerformedBy())
+                    .build();
+
+            return (ReqT) operationRequest;
+
+        } else if (method.equals("deleteUserProfile")) {
+            UserProfileRequest request = (UserProfileRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                return (ReqT) ((UserProfileRequest) msg).toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSecret(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("registerUser")) {
+
+            RegisterUserRequest request = (RegisterUserRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                org.apache.custos.iam.service.RegisterUserRequest registerUserRequest =
+                        ((RegisterUserRequest) msg).toBuilder()
+                                .setTenantId(tenantId)
+                                .setClientId(oauthId)
+                                .setClientSec(oauthSec)
+                                .build();
+                return (ReqT) registerUserRequest;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("enableUser") || method.equals("disableUser") ||
+                method.equals("isUserEnabled") || method.equals("isUsernameAvailable")) {
+            UserSearchRequest request = (UserSearchRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, request.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                UserSearchRequest info = ((UserSearchRequest) msg)
+                        .toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+
+                return (ReqT) info;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("getUserProfile")) {
+
+            UserProfileRequest req = (UserProfileRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, req.getClientId());
+            return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
+                UserProfileRequest request = ((UserProfileRequest) msg)
+                        .toBuilder()
+                        .setTenantId(tenantId).build();
+
+                return (ReqT) request;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+        } else if (method.equals("getAllUserProfilesInTenant")) {
+            UserProfileRequest req = (UserProfileRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, req.getClientId());
+            return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
+                UserProfileRequest request = ((UserProfileRequest) msg)
+                        .toBuilder().setTenantId(tenantId).build();
+
+                return (ReqT) request;
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("getUserProfileAuditTrails")) {
+            Optional<AuthClaim> claim = authorize(headers);
+            return claim.map(cl -> {
+                long tenantId = cl.getTenantId();
+                GetUpdateAuditTrailRequest request = ((GetUpdateAuditTrailRequest) msg)
+                        .toBuilder()
+                        .setTenantId(tenantId)
+                        .build();
+
+                return (ReqT) request;
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("resetPassword")) {
+            ResetUserPassword req = (ResetUserPassword) msg;
+            Optional<AuthClaim> claim = authorize(headers, req.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+
+                ResetUserPassword request = ((ResetUserPassword) msg)
+                        .toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId)
+                        .build();
+
+                return (ReqT) request;
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("getUser")) {
+            UserSearchRequest req = (UserSearchRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, req.getClientId());
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                UserSearchRequest request = ((UserSearchRequest) msg)
+                        .toBuilder()
+                        .setClientId(oauthId)
+                        .setTenantId(tenantId)
+                        .setClientSec(oauthSec)
+                        .build();
+                return (ReqT) request;
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+
+        } else if (method.equals("findUsers")) {
+            FindUsersRequest req = (FindUsersRequest) msg;
+            Optional<AuthClaim> claim = authorize(headers, req.getClientId());
+
+            return claim.map(cl -> {
+                String oauthId = cl.getIamAuthId();
+                String oauthSec = cl.getIamAuthSecret();
+
+                long tenantId = cl.getTenantId();
+                FindUsersRequest request = ((FindUsersRequest) msg)
+                        .toBuilder()
+                        .setClientId(oauthId)
+                        .setClientSec(oauthSec)
+                        .setTenantId(tenantId).build();
+
+                return (ReqT) request;
+
+            }).orElseThrow(() -> {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            });
+
+        } else if (method.equals("updateUserProfile")) {
+
+            UserProfileRequest userProfileRequest = (UserProfileRequest) msg;
+
+            Optional<AuthClaim> claim = authorize(headers, userProfileRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+
+            String oauthId = claim.get().getIamAuthId();
+            String oauthSec = claim.get().getIamAuthSecret();
+
+            long tenantId = claim.get().getTenantId();
+
+            AuthToken token = getSAToken(claim.get().getIamAuthId(), claim.get().getIamAuthSecret(), claim.get().getTenantId());
+            if (token == null || token.getAccessToken() == null) {
+                throw new UnAuthorizedException("Request is not authorized SA token is invalid", null);
+            }
+
+            return (ReqT) ((UserProfileRequest) msg).toBuilder()
+                    .setAccessToken(token.getAccessToken())
+                    .setTenantId(tenantId)
+                    .setClientId(oauthId)
+                    .setClientSecret(oauthSec)
+                    .setPerformedBy(Constants.SYSTEM)
+                    .build();
+
+        } else if (method.equals("deleteExternalIDPsOfUsers")) {
+            DeleteExternalIDPsRequest deleteExternalIDPsRequest = (DeleteExternalIDPsRequest) msg;
+
+            Optional<AuthClaim> claim = authorize(headers, deleteExternalIDPsRequest.getClientId());
+
+            if (claim.isEmpty()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
+            }
+            String oauthId = claim.get().getIamAuthId();
+            long tenantId = claim.get().getTenantId();
+
+            return (ReqT) ((DeleteExternalIDPsRequest) msg).toBuilder()
+                    .setTenantId(tenantId)
+                    .setClientId(oauthId)
+                    .build();
+        }
+
+        return msg;
+    }
+
+
+    private Metadata attachUserToken(Metadata headers, String clientId) {
+        if (clientId == null || clientId.trim().equals("")) {
+            String formattedUserToken = getToken(headers);
+            headers.put(Metadata.Key.of(Constants.USER_TOKEN, Metadata.ASCII_STRING_MARSHALLER), formattedUserToken);
+            return headers;
+        }
+        return headers;
+    }
+
+    private Optional<AuthClaim> validateRoleManagementAuthorizations(Metadata headers, String clientId) {
+//        Optional<AuthClaim> parentClaim = authorizeUsingUserToken(headers);
+        Optional<AuthClaim> claim = authorize(headers, clientId);
+
+//        if (claim.isEmpty() || parentClaim.isEmpty() || !parentClaim.get().isAdmin()) {
+//            throw new UnAuthorizedException("Request is not authorized", null);
+//        }
+        return claim;
+    }
+
+
+}
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/ClientAuthInterceptorImpl.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/ClientAuthInterceptorImpl.java
deleted file mode 100644
index 8abd0b1..0000000
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/ClientAuthInterceptorImpl.java
+++ /dev/null
@@ -1,267 +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.custos.user.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.iam.service.FindUsersRequest;
-import org.apache.custos.iam.service.RegisterUserRequest;
-import org.apache.custos.iam.service.ResetUserPassword;
-import org.apache.custos.iam.service.UserSearchRequest;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.identity.service.AuthToken;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.core.utils.Constants;
-import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
-import org.apache.custos.integration.services.commons.model.AuthClaim;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.apache.custos.user.management.service.UserProfileRequest;
-import org.apache.custos.user.profile.service.GetUpdateAuditTrailRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate confidential client specific authorization.
- * Methods which authenticates based only on client are implemented here.
- */
-@Component
-public class ClientAuthInterceptorImpl extends MultiTenantAuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    @Autowired
-    public ClientAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT reqT) {
-
-
-        if (method.equals("deleteUserProfile")) {
-            UserProfileRequest request = (UserProfileRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            return (ReqT) ((UserProfileRequest) reqT).toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSecret(oauthSec)
-                    .setTenantId(tenantId)
-                    .build();
-
-        } else if (method.equals("registerUser")) {
-
-            RegisterUserRequest request = (RegisterUserRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            org.apache.custos.iam.service.RegisterUserRequest registerUserRequest =
-                    ((RegisterUserRequest) reqT).toBuilder()
-                            .setTenantId(tenantId)
-                            .setClientId(oauthId)
-                            .setClientSec(oauthSec)
-                            .build();
-
-            return (ReqT) registerUserRequest;
-        } else if (method.equals("enableUser") || method.equals("disableUser") ||
-                method.equals("isUserEnabled") || method.equals("isUsernameAvailable")) {
-            UserSearchRequest request = (UserSearchRequest) reqT;
-            AuthClaim claim = authorize(headers, request.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            UserSearchRequest info = ((UserSearchRequest) reqT)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId)
-                    .build();
-
-            return (ReqT) info;
-
-        } else if (method.equals("getUserProfile")) {
-
-            UserProfileRequest req = (UserProfileRequest) reqT;
-            AuthClaim claim = authorize(headers, req.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            UserProfileRequest request = ((UserProfileRequest) reqT)
-                    .toBuilder()
-                    .setTenantId(tenantId).build();
-
-            return (ReqT) request;
-        } else if (method.equals("getAllUserProfilesInTenant")) {
-            UserProfileRequest req = (UserProfileRequest) reqT;
-            AuthClaim claim = authorize(headers, req.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            UserProfileRequest request = ((UserProfileRequest) reqT)
-                    .toBuilder().setTenantId(tenantId).build();
-
-            return (ReqT) request;
-        } else if (method.equals("getUserProfileAuditTrails")) {
-            AuthClaim claim = authorize(headers);
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            GetUpdateAuditTrailRequest request = ((GetUpdateAuditTrailRequest) reqT)
-                    .toBuilder()
-                    .setTenantId(tenantId)
-                    .build();
-
-            return (ReqT) request;
-        } else if (method.equals("resetPassword")) {
-            ResetUserPassword req = (ResetUserPassword) reqT;
-            AuthClaim claim = authorize(headers, req.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-
-            ResetUserPassword request = ((ResetUserPassword) reqT)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId)
-                    .build();
-
-            return (ReqT) request;
-        } else if (method.equals("getUser")) {
-            UserSearchRequest req = (UserSearchRequest) reqT;
-
-            AuthClaim claim = authorize(headers, req.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-
-
-            UserSearchRequest request = ((UserSearchRequest) reqT)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setClientSec(oauthSec)
-                    .build();
-            return (ReqT) request;
-
-        } else if (method.equals("findUsers")) {
-            FindUsersRequest req = (FindUsersRequest) reqT;
-            AuthClaim claim = authorize(headers, req.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            FindUsersRequest request = ((FindUsersRequest) reqT)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId).build();
-
-
-            return (ReqT) request;
-        } else if (method.equals("updateUserProfile")) {
-
-            UserProfileRequest userProfileRequest = (UserProfileRequest) reqT;
-
-            AuthClaim claim = authorize(headers, userProfileRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-            return (ReqT) ((UserProfileRequest) reqT).toBuilder()
-                    .setAccessToken(token.getAccessToken())
-                    .setTenantId(tenantId)
-                    .setClientId(oauthId)
-                    .setClientSecret(oauthSec)
-                    .setPerformedBy(Constants.SYSTEM)
-                    .build();
-
-        }
-        return reqT;
-    }
-
-}
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
index 6f82546..ae10d96 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/SuperTenantRestrictedOperationsInterceptorImpl.java
@@ -21,9 +21,8 @@
 
 import io.grpc.Metadata;
 import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.iam.service.GetAllResources;
 import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
+import org.apache.custos.integration.core.exceptions.UnAuthorizedException;
 import org.apache.custos.integration.services.commons.interceptors.AuthInterceptor;
 import org.apache.custos.integration.services.commons.model.AuthClaim;
 import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
@@ -31,6 +30,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.Optional;
+
 @Component
 public class SuperTenantRestrictedOperationsInterceptorImpl extends AuthInterceptor {
 
@@ -49,15 +50,15 @@
     public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
 
         if (method.equals("synchronizeUserDBs")) {
-            AuthClaim claim = null;
+            Optional<AuthClaim> claim = null;
             try {
                 claim = authorizeUsingUserToken(headers);
             } catch (Exception ex) {
                 LOGGER.error(" Authorizing error " + ex.getMessage());
-                throw new NotAuthorizedException("Request is not authorized", ex);
+                throw new UnAuthorizedException("Request is not authorized", ex);
             }
-            if (claim == null || !claim.isSuperTenant() || !claim.isAdmin()) {
-                throw new NotAuthorizedException("Request is not authorized", null);
+            if (claim == null || claim.isEmpty() || !claim.get().isSuperTenant() || !claim.get().isAdmin()) {
+                throw new UnAuthorizedException("Request is not authorized", null);
             }
 
         }
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/UserAuthInterceptorImpl.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/UserAuthInterceptorImpl.java
deleted file mode 100644
index bb375cb..0000000
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/interceptors/UserAuthInterceptorImpl.java
+++ /dev/null
@@ -1,266 +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.custos.user.management.interceptors;
-
-import io.grpc.Metadata;
-import org.apache.custos.credential.store.client.CredentialStoreServiceClient;
-import org.apache.custos.iam.service.*;
-import org.apache.custos.identity.client.IdentityClient;
-import org.apache.custos.identity.service.AuthToken;
-import org.apache.custos.integration.core.exceptions.NotAuthorizedException;
-import org.apache.custos.integration.core.utils.Constants;
-import org.apache.custos.integration.services.commons.interceptors.MultiTenantAuthInterceptor;
-import org.apache.custos.integration.services.commons.model.AuthClaim;
-import org.apache.custos.tenant.profile.client.async.TenantProfileClient;
-import org.apache.custos.user.management.service.LinkUserProfileRequest;
-import org.apache.custos.user.management.service.UserProfileRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Responsible for validate user specific authorization
- * Methods authenticates users access tokens are implemented here
- */
-@Component
-public class UserAuthInterceptorImpl extends MultiTenantAuthInterceptor {
-    private static final Logger LOGGER = LoggerFactory.getLogger(ClientAuthInterceptorImpl.class);
-
-    @Autowired
-    public UserAuthInterceptorImpl(CredentialStoreServiceClient credentialStoreServiceClient, TenantProfileClient tenantProfileClient, IdentityClient identityClient) {
-        super(credentialStoreServiceClient, tenantProfileClient, identityClient);
-    }
-
-    @Override
-    public <ReqT> ReqT intercept(String method, Metadata headers, ReqT msg) {
-
-
-        if (method.equals("addUserAttributes")) {
-            AddUserAttributesRequest userAttributesRequest = (AddUserAttributesRequest) msg;
-            headers =  attachUserToken(headers, userAttributesRequest.getClientId());
-            AuthClaim claim = authorize(headers, userAttributesRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-
-            long tenantId = claim.getTenantId();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-
-            return (ReqT) ((AddUserAttributesRequest) msg).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(claim.getPerformedBy())
-                    .build();
-
-        } else if (method.equals("deleteUserAttributes")) {
-
-            DeleteUserAttributeRequest userAttributesRequest = (DeleteUserAttributeRequest) msg;
-            headers =  attachUserToken(headers, userAttributesRequest.getClientId());
-            AuthClaim claim = authorize(headers, userAttributesRequest.getClientId());
-
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-
-            long tenantId = claim.getTenantId();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-            return (ReqT) ((DeleteUserAttributeRequest) msg).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(claim.getPerformedBy())
-                    .build();
-
-        } else if (method.equals("addRolesToUsers")) {
-
-            AddUserRolesRequest userAttributesRequest = (AddUserRolesRequest) msg;
-            headers =  attachUserToken(headers, userAttributesRequest.getClientId());
-            AuthClaim claim = authorize(headers, userAttributesRequest.getClientId());
-
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-
-            long tenantId = claim.getTenantId();
-
-            String userToken = getUserTokenFromUserTokenHeader(headers);
-
-            if (userToken == null || userToken.trim().equals("")) {
-                userToken = getToken(headers);
-            }
-
-
-            return (ReqT) ((AddUserRolesRequest) msg).toBuilder()
-                    .setClientId(oauthId)
-                    .setTenantId(tenantId)
-                    .setAccessToken(userToken)
-                    .setPerformedBy(claim.getPerformedBy())
-                    .build();
-
-        } else if (method.equals("registerAndEnableUsers")) {
-
-            RegisterUsersRequest registerUsersRequest = (RegisterUsersRequest) msg;
-            headers =  attachUserToken(headers, registerUsersRequest.getClientId());
-            AuthClaim claim = authorize(headers, registerUsersRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-            String userToken = getUserTokenFromUserTokenHeader(headers);
-
-            if (userToken == null || userToken.trim().equals("")) {
-                userToken = getToken(headers);
-            }
-
-            long tenantId = claim.getTenantId();
-            org.apache.custos.iam.service.RegisterUsersRequest registerUserRequest =
-                    ((RegisterUsersRequest) msg).toBuilder()
-                            .setTenantId(tenantId)
-                            .setClientId(oauthId)
-                            .setAccessToken(userToken)
-                            .setPerformedBy(claim.getPerformedBy())
-                            .build();
-            return (ReqT) registerUserRequest;
-        } else if (method.equals("deleteUserRoles")) {
-
-            DeleteUserRolesRequest deleteUserRolesRequest = (DeleteUserRolesRequest) msg;
-            headers =  attachUserToken(headers, deleteUserRolesRequest.getClientId());
-            AuthClaim claim = authorize(headers, deleteUserRolesRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-            String userToken = getUserTokenFromUserTokenHeader(headers);
-
-            if (userToken == null || userToken.trim().equals("")) {
-                userToken = getToken(headers);
-            }
-
-            long tenantId = claim.getTenantId();
-            DeleteUserRolesRequest operationRequest = ((DeleteUserRolesRequest) msg)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setAccessToken(userToken)
-                    .setTenantId(tenantId)
-                    .setPerformedBy(claim.getPerformedBy())
-                    .build();
-
-            return (ReqT) operationRequest;
-
-        }  else if (method.equals("deleteUser") || method.equals("grantAdminPrivileges") ||
-                method.equals("removeAdminPrivileges")) {
-
-            UserSearchRequest userSearchRequest = (UserSearchRequest) msg;
-            headers =  attachUserToken(headers, userSearchRequest.getClientId());
-            AuthClaim claim = authorize(headers, userSearchRequest.getClientId());
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            AuthToken token = getSAToken(claim.getIamAuthId(), claim.getIamAuthSecret(), claim.getTenantId());
-            if (token == null || token.getAccessToken() == null) {
-                throw new NotAuthorizedException("Request is not authorized SA token is invalid", null);
-            }
-
-
-            long tenantId = claim.getTenantId();
-            UserSearchRequest operationRequest = ((UserSearchRequest) msg)
-                    .toBuilder()
-                    .setClientId(oauthId)
-                    .setClientSec(oauthSec)
-                    .setTenantId(tenantId)
-                    .setAccessToken(token.getAccessToken())
-                    .setPerformedBy(Constants.SYSTEM)
-                    .build();
-
-            return (ReqT) operationRequest;
-
-        } else if (method.equals("linkUserProfile")) {
-            String token = getToken(headers);
-            AuthClaim claim = authorizeUsingUserToken(headers);
-
-            if (claim == null) {
-                throw new NotAuthorizedException("Request is not authorized", null);
-            }
-
-            String oauthId = claim.getIamAuthId();
-            String oauthSec = claim.getIamAuthSecret();
-
-            long tenantId = claim.getTenantId();
-            LinkUserProfileRequest operationRequest = ((LinkUserProfileRequest) msg)
-                    .toBuilder()
-                    .setIamClientId(oauthId)
-                    .setIamClientSecret(oauthSec)
-                    .setTenantId(tenantId)
-                    .setAccessToken(token)
-                    .setPerformedBy(claim.getPerformedBy())
-                    .build();
-
-            return (ReqT) operationRequest;
-
-        }
-
-        return msg;
-    }
-
-
-
-    private Metadata attachUserToken(Metadata headers, String clientId) {
-        if (clientId == null || clientId.trim().equals("")) {
-           String formattedUserToken =  getToken(headers);
-           headers.put(Metadata.Key.of(Constants.USER_TOKEN,Metadata.ASCII_STRING_MARSHALLER), formattedUserToken);
-           return headers;
-        }
-        return headers;
-    }
-
-
-}
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/service/UserManagementService.java b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/service/UserManagementService.java
index 84b2fac..ebe3f74 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/service/UserManagementService.java
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/java/org/apache/custos/user/management/service/UserManagementService.java
@@ -125,7 +125,7 @@
                                         org.apache.custos.user.profile.service.UserAttribute
                                                 .newBuilder()
                                                 .setKey(atr.getKey())
-                                                .addAllValue(atr.getValuesList())
+                                                .addAllValues(atr.getValuesList())
                                                 .build();
 
                                 userAtrList.add(userAttribute);
@@ -630,7 +630,7 @@
 
                     UserProfile exsistingProfile = userProfileClient.getUser(req);
 
-                    if (exsistingProfile == null || exsistingProfile.getUsername().trim().equals("")) {
+                    if (exsistingProfile == null || exsistingProfile.getUsername().trim().isEmpty()) {
                         userProfileClient.createUserProfile(req);
                     } else {
 
@@ -697,10 +697,9 @@
             responseObserver.onNext(response);
             responseObserver.onCompleted();
 
-        } catch (
-                Exception ex) {
+        } catch (Exception ex) {
             String msg = "Error occurred while delete user roles,  " + ex.getMessage();
-            LOGGER.error(msg);
+            LOGGER.error(msg, ex);
             if (ex.getMessage().contains("UNAUTHENTICATED")) {
                 responseObserver.onError(Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
             } else {
@@ -1269,6 +1268,24 @@
 
 
     @Override
+    public void deleteExternalIDPsOfUsers(DeleteExternalIDPsRequest request, StreamObserver<OperationStatus> responseObserver) {
+        try {
+            LOGGER.debug("Request received to deleteExternalIDPsOfUsers for " + request.getTenantId());
+
+            OperationStatus status = iamAdminServiceClient.deleteExternalIDPLinksOfUsers(request);
+
+            responseObserver.onNext(status);
+            responseObserver.onCompleted();
+
+        } catch (Exception ex) {
+            String msg = "Error occurred while  deleting external IDPs of Users " + ex.getMessage();
+            LOGGER.error(msg, ex);
+            responseObserver.onError(Status.INTERNAL.withDescription(msg).asRuntimeException());
+
+        }
+    }
+
+    @Override
     public void synchronizeUserDBs(SynchronizeUserDBRequest request, StreamObserver<OperationStatus> responseObserver) {
         try {
 
@@ -1343,9 +1360,8 @@
                         org.apache.custos.user.profile.service.UserAttribute
                                 .newBuilder()
                                 .setKey(atr.getKey())
-                                .addAllValue(atr.getValuesList())
+                                .addAllValues(atr.getValuesList())
                                 .build();
-
                 userAtrList.add(userAttribute);
             });
             profileBuilder.addAllAttributes(userAtrList);
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/proto/UserManagementService.proto b/custos-integration-services/user-management-service-parent/user-management-service/src/main/proto/UserManagementService.proto
index f6f73cb..b028e65 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/proto/UserManagementService.proto
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/proto/UserManagementService.proto
@@ -22,7 +22,7 @@
 
 option java_multiple_files = true;
 package org.apache.custos.user.management.service;
-
+option go_package = "./pb";
 import "google/api/annotations.proto";
 import "UserProfileService.proto";
 import "IamAdminService.proto";
@@ -30,40 +30,40 @@
 
 message UserProfileRequest {
     org.apache.custos.user.profile.service.UserProfile user_profile = 1;
-    string clientId = 2;
-    int64 tenantId = 3;
-    string accessToken = 4;
-    string clientSecret = 5;
-    string performedBy = 6;
+    string client_id = 2;
+    int64 tenant_id = 3;
+    string access_token = 4;
+    string client_secret = 5;
+    string performed_by = 6;
 }
 
 message GetUserRequest {
     string username = 1;
-    org.apache.custos.iam.service.UserSearchRequest userSearchRequest = 2;
+    org.apache.custos.iam.service.UserSearchRequest user_search_request = 2;
 }
 
 message GetUsersRequest {
-    int64 tenantId = 1;
+    int64 tenant_id = 1;
     string email = 2;
     string username = 3;
     int32 offset = 4;
     int32 limit = 5;
     string search = 6;
-    string iamClientId = 7;
-    string iamClientSecret = 8;
+    string iam_client_id = 7;
+    string iam_client_secret = 8;
 }
 
 message ResetPassword {
-    int64 tenantId = 1;
-    string accessToken = 2;
+    int64 tenant_id = 1;
+    string access_token = 2;
     string username = 3;
     string password = 4;
-    string iamClientId = 5;
-    string iamClientSecret = 6;
+    string iam_client_id = 5;
+    string iam_client_secret = 6;
 }
 
 message ResetPasswordRequest {
-    ResetPassword passwordMetadata = 1;
+    ResetPassword password_metadata = 1;
 }
 
 message LinkUserProfileRequest {
@@ -71,15 +71,15 @@
     string previous_username = 2;
     repeated string linking_attributes = 3;
     int64 tenantId = 4;
-    string iamClientId = 5;
-    string iamClientSecret = 6;
-    string accessToken = 7;
-    string performedBy = 8;
+    string iam_client_id = 5;
+    string iam_client_secret = 6;
+    string access_token = 7;
+    string performed_by = 8;
 }
 
 message SynchronizeUserDBRequest {
-    int64 tenantId = 2;
-    string clientId = 4;
+    int64 tenant_id = 2;
+    string client_id = 4;
 }
 
 service UserManagementService {
@@ -138,6 +138,13 @@
          };
     }
 
+
+    rpc deleteExternalIDPsOfUsers (org.apache.custos.iam.service.DeleteExternalIDPsRequest) returns (org.apache.custos.iam.service.OperationStatus) {
+        option (google.api.http) = {
+           delete: "/user-management/v1.0.0/users/federatedIDPs"
+         };
+    }
+
     rpc addRolesToUsers (org.apache.custos.iam.service.AddUserRolesRequest) returns (org.apache.custos.iam.service.OperationStatus) {
         option (google.api.http) = {
            post: "/user-management/v1.0.0/users/roles"
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/application.properties b/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/application.properties
index 5798f47..9a39c36 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/application.properties
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/application.properties
@@ -25,4 +25,5 @@
 management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
-spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
+spring.main.allow-bean-definition-overriding=true
+spring.profiles.active=@spring.profiles.active@
\ No newline at end of file
diff --git a/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/bootstrap.properties b/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/bootstrap.properties
index 4b7ed78..5ba4b1d 100644
--- a/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/bootstrap.properties
+++ b/custos-integration-services/user-management-service-parent/user-management-service/src/main/resources/bootstrap.properties
@@ -19,4 +19,4 @@
 
 spring.cloud.config.uri=http://custos-configuration-service.custos.svc.cluster.local:9000
 #spring.cloud.config.uri=http://localhost:9000
-spring.profiles.active:default
+spring.profiles.active=@spring.profiles.active@
diff --git a/custos-tests/src/test/java/org/apache/custos/integration/tests/TenantManagementTests.java b/custos-tests/src/test/java/org/apache/custos/integration/tests/TenantManagementTests.java
index 23a8273..9d37215 100644
--- a/custos-tests/src/test/java/org/apache/custos/integration/tests/TenantManagementTests.java
+++ b/custos-tests/src/test/java/org/apache/custos/integration/tests/TenantManagementTests.java
@@ -6,6 +6,7 @@
 import org.apache.custos.tenant.management.service.GetTenantResponse;
 import org.apache.custos.tenant.manamgement.client.TenantManagementClient;
 import org.apache.custos.tenant.profile.service.GetAllTenantsResponse;
+import org.apache.custos.tenant.profile.service.Tenant;
 import org.junit.Assert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -82,11 +83,11 @@
     @Test(groups = {"tenant-management"}, dependsOnMethods = {"createTenant"})
     public void getTenant() {
         LOGGER.info("Executing getTenant test case ");
-        GetTenantResponse response = tenantManagementClient.getTenant(clientId);
-        Assert.assertEquals(response.getClientName(), "Testing tenant");
-        Assert.assertEquals(response.getRequesterEmail(), "custos@airavata.apache.org");
-        Assert.assertEquals(response.getScope(), "email openid profile org.cilogon.userinfo");
-        Assert.assertTrue(response.getRedirectUrisList().contains("http://localhost:8080/callback"));
+//        Tenant response = tenantManagementClient.getTenant(clientId);
+//        Assert.assertEquals(response.getClientName(), "Testing tenant");
+//        Assert.assertEquals(response.getRequesterEmail(), "custos@airavata.apache.org");
+//        Assert.assertEquals(response.getScope(), "email openid profile org.cilogon.userinfo");
+//        Assert.assertTrue(response.getRedirectUrisList().contains("http://localhost:8080/callback"));
 
     }
 
@@ -112,25 +113,25 @@
 
         String[] redirectURI = {"http://localhost:8080/callback", "http://localhost:8080/callback/updated"};
 
-        GetTenantResponse response = tenantManagementClient.updateTenant(clientId,
-                "Testing tenant updated",
-                "custos@airavata.apache.org",
-                "Merry",
-                "Jhonson",
-                "custos@airavata.apache.org",
-                "testuser",
-                "12345",
-                contants,
-                redirectURI,
-                "https://test.custos.org",
-                "email openid profile org.cilogon.userinfo",
-                "test.custos.org",
-                "https://test.custos.org",
-                "Integration tenant client"
-        );
+//        Tenant response = tenantManagementClient.updateTenant(clientId,
+//                "Testing tenant updated",
+//                "custos@airavata.apache.org",
+//                "Merry",
+//                "Jhonson",
+//                "custos@airavata.apache.org",
+//                "testuser",
+//                "12345",
+//                contants,
+//                redirectURI,
+//                "https://test.custos.org",
+//                "email openid profile org.cilogon.userinfo",
+//                "test.custos.org",
+//                "https://test.custos.org",
+//                "Integration tenant client"
+//        );
 
-        Assert.assertEquals(response.getClientName(), "Testing tenant updated");
-        Assert.assertTrue(response.getRedirectUrisList().contains("http://localhost:8080/callback/updated"));
+//        Assert.assertEquals(response.getClientName(), "Testing tenant updated");
+//        Assert.assertTrue(response.getRedirectUrisList().contains("http://localhost:8080/callback/updated"));
     }
 
     @Test(groups = {"tenant-management"}, dependsOnMethods = {"updateTenant"})
@@ -176,7 +177,7 @@
     @Test(groups = {"tenant-management"}, dependsOnMethods = {"addTenantRoles"})
     public void deleteTenant() {
         LOGGER.info("Executing delete tenant test");
-        tenantManagementClient.deleteTenant(clientId);
+//        tenantManagementClient.deleteTenant(clientId);
 
     }
 
diff --git a/pom.xml b/pom.xml
index 4b810fd..92f1478 100644
--- a/pom.xml
+++ b/pom.xml
@@ -195,6 +195,11 @@
                 <artifactId>jaxb-api</artifactId>
                 <version>${jaxb.version}</version>
             </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-common</artifactId>
+                <version>${springfox.swagger.version}</version>
+            </dependency>
 
             <!-- SCIM-->
             <dependency>
@@ -242,6 +247,34 @@
                 <version>${io.commons.version}</version>
             </dependency>
 
+            <!-- Secret handling dependencies -->
+            <dependency>
+                <groupId>com.codahale</groupId>
+                <artifactId>shamir</artifactId>
+                <version>${com.codahale.version}</version>
+            </dependency>
+
+            <!-- dozer -->
+            <dependency>
+                <groupId>net.sf.dozer</groupId>
+                <artifactId>dozer</artifactId>
+                <version>${dozer.version}</version>
+            </dependency>
+
+            <!--- kafka -->
+            <dependency>
+                <groupId>org.apache.kafka</groupId>
+                <artifactId>kafka-clients</artifactId>
+                <version>${kafka-clients.version}</version>
+            </dependency>
+
+            <!--- email sending -->
+            <dependency>
+                <groupId>javax.mail</groupId>
+                <artifactId>mail</artifactId>
+                <version>${email.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -267,15 +300,31 @@
                         </configuration>
                     </plugin>
                     <plugin>
-                        <groupId>org.springframework.boot</groupId>
-                        <artifactId>spring-boot-maven-plugin</artifactId>
-                        <version>${spring.boot.version}</version>
+                        <artifactId>maven-resources-plugin</artifactId>
+                        <version>3.0.2</version>
                         <executions>
                             <execution>
-                                <id>default</id>
+                                <id>copy-resources</id>
+                                <!-- here the phase you need -->
+                                <phase>install</phase>
                                 <goals>
-                                    <goal>repackage</goal>
+                                    <goal>copy-resources</goal>
                                 </goals>
+                                <configuration>
+                                    <outputDirectory>
+                                        /Users/isururanawaka/Documents/Airavata_Repository/airavata-custos/custos-integration-services/custos-integration-services-swagger/src/main/resources/protos
+                                    </outputDirectory>   <!-- output directory -->
+                                    <resources>
+                                        <resource>
+                                            <directory>${basedir}/src/main/proto
+                                            </directory>         <!-- source directory -->
+                                            <includes>
+                                                <include>**/*.proto</include>
+                                            </includes>
+                                            <filtering>true</filtering>
+                                        </resource>
+                                    </resources>
+                                </configuration>
                             </execution>
                         </executions>
                     </plugin>
@@ -304,7 +353,42 @@
         </profile>
         <profile>
             <id>container</id>
+            <properties>
+                <spring.profiles.active>staging</spring.profiles.active>
+                <vault.token>{{token}}</vault.token>
+                <vault.scheme>https</vault.scheme>
+                <vault.host>vault.custos.scigap.org</vault.host>
+                <vault.port>31190</vault.port>
+                <vault.uri>https://vault.custos.scigap.org:31190</vault.uri>
+                <iam.dev.username>{{token}}</iam.dev.username>
+                <iam.dev.password>{{token}}</iam.dev.password>
+                <iam.staging.username>{{token}}</iam.staging.username>
+                <iam.staging.password>{{token}}</iam.staging.password>
+                <cilogon.dev.id>{{token}}</cilogon.dev.id>
+                <cilogon.dev.sec>{{token}}</cilogon.dev.sec>
+                <cilogon.staging.id>{{token}}</cilogon.staging.id>
+                <cilogon.staging.sec>{{token}}</cilogon.staging.sec>
+                <custos.email.password>{{token}}</custos.email.password>
+
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
             <build>
+                <resources>
+                    <resource>
+                        <directory>src/main/resources</directory>
+                        <filtering>true</filtering>
+<!--                        <excludes>-->
+<!--                            <exclude>vault-client-truststore.pkcs12</exclude>-->
+<!--                            <exclude>keycloak-client-truststore.pkcs12</exclude>-->
+<!--                        </excludes>-->
+                        <includes>
+                            <include>**/*.pcks12</include>
+                            <include>**/*.properties</include>
+                        </includes>
+                    </resource>
+                </resources>
                 <plugins>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
@@ -386,7 +470,11 @@
                         <configuration>
                             <chartName>${project.artifactId}</chartName>
                             <chartFolder>src/main/helm</chartFolder>
-                            <chartRepoUrl>https://kubernetes-charts.storage.googleapis.com/</chartRepoUrl>
+                            <chartRepoUrl>https://charts.helm.sh/stable</chartRepoUrl>
+                            <!--                            <chartRepoUrl>https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts</chartRepoUrl>-->
+                            <helmVersion>3.4.2</helmVersion>
+                            <!--                            <chartRepoUrl>null</chartRepoUrl>-->
+                            <chartRepoUrl>https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts</chartRepoUrl>
                             <helmVersion>2.16.0</helmVersion>
                             <strictLint>true</strictLint>
                             <valuesFile>src/main/helm/values.yaml</valuesFile>
@@ -404,7 +492,66 @@
                             </execution>
                         </executions>
                     </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>scp-to-remote</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <version>1.8</version>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <dependencies>
+                            <dependency>
+                                <groupId>ant</groupId>
+                                <artifactId>ant-commons-net</artifactId>
+                                <version>1.6.5</version>
+                            </dependency>
+                            <dependency>
+                                <groupId>org.apache.ant</groupId>
+                                <artifactId>ant-jsch</artifactId>
+                                <version>1.10.9</version>
+                            </dependency>
+                        </dependencies>
+                        <configuration>
+                            <target>
 
+                                <scp localFile="${project.basedir}/target/helm/${project.artifactId}-${project.version}.tgz"
+                                     remoteToFile="ubuntu@${host}:/home/ubuntu/custos/artifacts"
+                                     verbose="true"
+                                     keyfile="${ssh.privatekey}"
+                                     passphrase="${ssh.passphrase}" trust="true">
+                                </scp>
+                                <sshexec host="${host}"
+                                         username="ubuntu"
+                                         keyfile="${ssh.privatekey}"
+                                         passphrase="${ssh.passphrase}" trust="true"
+                                         command="helm delete ${project.artifactId} -n custos"/>
+
+                                <sshexec host="${host}"
+                                         username="ubuntu"
+                                         keyfile="${ssh.privatekey}"
+                                         passphrase="${ssh.passphrase}" trust="true"
+                                         command="helm install ${project.artifactId} /home/ubuntu/custos/artifacts/${project.artifactId}-${project.version}.tgz -n custos"/>
+
+                                <!-- SSH -->
+                                <taskdef name="sshexec"
+                                         classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
+                                         classpathref="maven.plugin.classpath" />
+
+                            </target>
+                            <skip>true</skip>
+                        </configuration>
+                    </plugin>
                 </plugins>
             </build>
         </profile>
@@ -459,6 +606,7 @@
                 <version>${os.maven.plugin}</version>
             </extension>
         </extensions>
+
     </build>
 
     <properties>
@@ -496,13 +644,13 @@
         <docker.image.repo>custos</docker.image.repo>
         <docker.plugin.version>1.4.13</docker.plugin.version>
 
-        <helm.maven.plugin.version>2.1.0</helm.maven.plugin.version>
+        <helm.maven.plugin.version>2.8.0</helm.maven.plugin.version>
         <maven.assembly.plugin.version>3.2.0</maven.assembly.plugin.version>
 
         <mysql.connector.java>8.0.18</mysql.connector.java>
         <javax.persistance>1.0.2</javax.persistance>
 
-        <keycloak.admin.version>7.0.0</keycloak.admin.version>
+        <keycloak.admin.version>9.0.2</keycloak.admin.version>
 
         <reasteasy.client.version>3.0.14.Final</reasteasy.client.version>
 
@@ -527,6 +675,19 @@
 
         <io.commons.version>2.7</io.commons.version>
 
+        <com.codahale.version>0.7.0</com.codahale.version>
+
+        <host>service.staging.usecustos.org</host>
+
+        <ssh.privatekey>/Users/isururanawaka/.ssh/custos/id_rsa</ssh.privatekey>
+
+        <ssh.passphrase>isjarana</ssh.passphrase>
+        <dozer.version>5.5.1</dozer.version>
+
+        <kafka-clients.version>1.0.0</kafka-clients.version>
+
+        <email.version>1.5.0-b01</email.version>
+
 
     </properties>