diff --git a/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java b/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java
index 40d123a1587f8b18676e05adf57f814ad758409f..7c39a2f174f267de1b84dd269e6aa17c3329199d 100644
--- a/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java
+++ b/src/main/java/de/uni_hamburg/corpora/server/ListCorpusFunctions.java
@@ -11,64 +11,107 @@ import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author bba1792 Dr. Herbert Lange
- * @version 20210705
+ * @version 20211004
  * Resource to list corpus functions defined in the corpus services
+ * Scope: any
  */
 @Path("list_corpus_functions")
 public class ListCorpusFunctions {
+    /**
+     * Class representing the relevant information for a corpus function, used to (de)serialize JSON
+     */
+    public static class CorpusFunctionInfo {
+        String name;
+        String description;
+        boolean available ;
+        Set<String> usableFor;
+
+        public CorpusFunctionInfo(String name, String description, boolean available, Set<String> usableFor) {
+            this.name = name;
+            this.description = description;
+            this.available = available;
+            this.usableFor = usableFor;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public boolean isAvailable() {
+            return available;
+        }
+
+        public Set<String> getUsableFor() {
+            return usableFor;
+        }
+    }
     /**
      * Method handling HTTP GET requests. The returned object will be sent
-     * to the client as "text/plain" media type.
+     * to the client as "application/json" media type.
      *
-     * @return String that will be returned as a text/plain response.
+     * @return JSON response containing the list of corpus functions or HTTP error code 400
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    public Response listFunctions() {
-        ArrayList<Map<String,String>> functionList = new ArrayList<>() ;
+    public Response getCorpusFunctions() {
+        // Convert to JSON
+        ArrayList<CorpusFunctionInfo> functionList = listFunctions();
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            String json = mapper.writeValueAsString(functionList);
+            return Response.ok().entity(json).build() ;
+        }
+        // On error return empty JSON and an error code
+        catch (JsonProcessingException e) {
+            return Response.status(400).entity(new JsonObject().toString()).build();
+        }
+    }
+
+
+    /**
+     * Gets the list of all corpus functions available in corpus services
+     *
+     * @return list of CorpusFunctionInfo objects representing the functions
+     */
+    public ArrayList<CorpusFunctionInfo> listFunctions() {
+
+        ArrayList<CorpusFunctionInfo> functionList = new ArrayList<>();
         for (String s : CorpusServices.getCorpusFunctions()) {
             String function, description;
-            boolean available ;
+            Set<String> usableClasses = new HashSet<>();
+            boolean available;
             try {
+                // Create the corpus function object using reflections and get its information
                 CorpusFunction cf = (CorpusFunction) Class.forName(s).getDeclaredConstructor().newInstance();
                 function = cf.getFunction();
+                usableClasses.addAll(cf.getIsUsableFor().stream().map(Class::getSimpleName).collect(Collectors.toSet()));
                 try {
                     description = cf.getDescription();
-                    available = true ;
+                    available = true;
                 } catch (Exception e) {
-                    description = "Error reading description" ;
-                    available = false ;
+                    description = "Error reading description";
+                    available = false;
                 }
             } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
-                function = s ;
-                description = "Error loading class" ;
-                available = false ;
+                function = s;
+                description = "Error loading class";
+                available = false;
             }
-            HashMap<String,String> functionInfo = new HashMap<>();
-            functionInfo.put("name", function);
-            functionInfo.put("description",description);
-            functionInfo.put("available",Boolean.toString(available));
-
+            // Create new info object and add it to the list
+            CorpusFunctionInfo functionInfo = new CorpusFunctionInfo(function, description, available, usableClasses);
             functionList.add(functionInfo);
         }
         // Sort the list by name
-        functionList.sort(Comparator.comparing((x) -> x.get("name")));
-        // Convert to JSON
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            String json = mapper.writeValueAsString(functionList);
-            return Response.ok().entity(json).build() ;
-        }
-        // On error return empty JSON and an error code
-        catch (JsonProcessingException e) {
-            return Response.status(400).entity(new JsonObject().toString()).build();
-        }
+        functionList.sort(Comparator.comparing(CorpusFunctionInfo::getName));
+        return functionList;
     }
 }