diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java
index eb46bfc61e70059322575d3c0b6c42697124ca49..7be236d16fc22b3616996a4c82ea7ee48f00efaf 100644
--- a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java
+++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/GmsClient.java
@@ -6,10 +6,12 @@ import it.inaf.ia2.gms.client.call.AddPermissionCall;
 import it.inaf.ia2.gms.client.call.CreateGroupCall;
 import it.inaf.ia2.gms.client.call.DeleteGroupCall;
 import it.inaf.ia2.gms.client.call.GetUserGroupsCall;
+import it.inaf.ia2.gms.client.call.GetUserPermissionsCall;
 import it.inaf.ia2.gms.client.call.ListGroupsCall;
 import it.inaf.ia2.gms.client.call.RemoveMemberCall;
 import it.inaf.ia2.gms.client.call.RemovePermissionCall;
 import it.inaf.ia2.gms.client.model.Permission;
+import it.inaf.ia2.gms.client.model.UserPermission;
 import java.util.List;
 
 public class GmsClient {
@@ -21,7 +23,6 @@ public class GmsClient {
         if (!baseUrl.endsWith("/")) {
             baseUrl += "/";
         }
-        baseUrl += "ws/jwt";
 
         httpClientWrapper = new HttpClientWrapper(baseUrl);
     }
@@ -66,4 +67,8 @@ public class GmsClient {
     public void removePermission(String completeGroupName, String userId) {
         new RemovePermissionCall(httpClientWrapper).removePermission(completeGroupName, userId);
     }
+
+    public List<UserPermission> getUserPermissions(String userId) {
+        return new GetUserPermissionsCall(httpClientWrapper).getUserPermissions(userId);
+    }
 }
diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java
new file mode 100644
index 0000000000000000000000000000000000000000..34db2f11f5796ac57e7da7e11c0d2d5bd9bfaf2d
--- /dev/null
+++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/call/GetUserPermissionsCall.java
@@ -0,0 +1,53 @@
+package it.inaf.ia2.gms.client.call;
+
+import it.inaf.ia2.gms.client.model.Permission;
+import it.inaf.ia2.gms.client.model.UserPermission;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+public class GetUserPermissionsCall extends BaseGmsCall {
+
+    public GetUserPermissionsCall(HttpClientWrapper clientWrapper) {
+        super(clientWrapper);
+    }
+
+    public List<UserPermission> getUserPermissions(String userId) {
+
+        List<UserPermission> userPermissions = new ArrayList<>();
+
+        String endpoint = "permission";
+        endpoint += "?user_id=" + userId;
+
+        HttpRequest groupsRequest = newHttpRequest(endpoint)
+                .header("Accept", "text/plain")
+                .GET()
+                .build();
+
+        return getClient().sendAsync(groupsRequest, HttpResponse.BodyHandlers.ofInputStream())
+                .thenApply(response -> {
+                    if (response.statusCode() == 200) {
+                        return response.body();
+                    }
+                    logServerErrorInputStream(groupsRequest, response);
+                    throw new IllegalStateException("Unable to retrieve groups");
+                })
+                .thenApply(inputStream -> {
+                    try (Scanner scan = new Scanner(inputStream)) {
+                        while (scan.hasNextLine()) {
+                            String line = scan.nextLine();
+                            if (!line.isEmpty()) {
+                                String[] split = line.split(" ");
+                                UserPermission userPermission = new UserPermission();
+                                userPermission.setGroup(split[0]);
+                                userPermission.setPermission(Permission.valueOf(split[1]));
+                                userPermissions.add(userPermission);
+                            }
+                        }
+                    }
+                    return userPermissions;
+                }).join();
+    }
+}
diff --git a/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f9578d2a9c3273fe104ffb844c1f12714a2df12
--- /dev/null
+++ b/gms-client/gms-client-lib/src/main/java/it/inaf/ia2/gms/client/model/UserPermission.java
@@ -0,0 +1,23 @@
+package it.inaf.ia2.gms.client.model;
+
+public class UserPermission {
+
+    private String group;
+    private Permission permission;
+
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
+
+    public Permission getPermission() {
+        return permission;
+    }
+
+    public void setPermission(Permission permission) {
+        this.permission = permission;
+    }
+}
diff --git a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
index f338cfefd0179acd487c70921dd8123a44dcc86c..8985b3b7ec6ed246e3c1b071a0cd1a0b36fdd73f 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
@@ -6,6 +6,7 @@ import it.inaf.ia2.gms.manager.GroupsManager;
 import it.inaf.ia2.gms.manager.MembershipManager;
 import it.inaf.ia2.gms.manager.PermissionsManager;
 import it.inaf.ia2.gms.model.Permission;
+import it.inaf.ia2.gms.model.response.UserPermission;
 import it.inaf.ia2.gms.persistence.GroupsDAO;
 import it.inaf.ia2.gms.persistence.PermissionsDAO;
 import it.inaf.ia2.gms.persistence.model.GroupEntity;
@@ -13,6 +14,7 @@ import it.inaf.ia2.gms.persistence.model.PermissionEntity;
 import it.inaf.ia2.gms.service.GroupsService;
 import it.inaf.ia2.gms.service.JoinService;
 import it.inaf.ia2.gms.service.PermissionUtils;
+import it.inaf.ia2.gms.service.SearchService;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.security.Principal;
@@ -64,6 +66,9 @@ public class JWTWebServiceController {
     @Autowired
     private PermissionsDAO permissionsDAO;
 
+    @Autowired
+    private SearchService searchService;
+
     /**
      * This endpoint is compliant with the IVOA GMS standard.
      */
@@ -220,6 +225,17 @@ public class JWTWebServiceController {
         response.setStatus(HttpServletResponse.SC_NO_CONTENT);
     }
 
+    @GetMapping(value = "/permission", produces = MediaType.TEXT_PLAIN_VALUE)
+    public void getUserPermission(@RequestParam("user_id") String userId, HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+        try (PrintWriter pw = new PrintWriter(response.getOutputStream())) {
+            for (UserPermission userPermission : searchService.getUserPermission(userId, permissionsManager.getCurrentUserPermissions(getRoot()))) {
+                String group = String.join(".", userPermission.getGroupCompleteName());
+                pw.println(group + " " + userPermission.getPermission());
+            }
+        }
+    }
+
     @PostMapping(value = {"/permission/{group:.+}", "/permission/"}, produces = MediaType.TEXT_PLAIN_VALUE)
     public void addPermission(@PathVariable("group") Optional<String> groupNames, HttpServletRequest request, HttpServletResponse response) throws IOException {
 
diff --git a/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java b/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java
index 62651fb1112e04ace1610b0a486d9e8199503a68..ac6b72ad8944b1764c0ce6dac98ee811d43a8d89 100644
--- a/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java
+++ b/gms/src/main/java/it/inaf/ia2/gms/service/SearchService.java
@@ -145,7 +145,7 @@ public class SearchService {
                 .collect(Collectors.toList());
     }
 
-    private List<UserPermission> getUserPermission(String targetUserId, List<PermissionEntity> actorPermissions) {
+    public List<UserPermission> getUserPermission(String targetUserId, List<PermissionEntity> actorPermissions) {
 
         List<UserPermission> permissions = new ArrayList<>();