diff --git a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
index f8ca92efb7becf8d4826e3789829ae6bba5aaef8..0c027d4978eab28fdd61633a8b68c320598c50ec 100644
--- a/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/ExperimentApi.java
@@ -17,6 +17,7 @@ import eu.hbp.mip.model.galaxy.GalaxyWorkflowResult;
 import eu.hbp.mip.model.galaxy.PostWorkflowToGalaxyDtoResponse;
 import eu.hbp.mip.repositories.ExperimentRepository;
 import eu.hbp.mip.repositories.ModelRepository;
+import eu.hbp.mip.utils.ClaimUtils;
 import eu.hbp.mip.utils.HTTPUtil;
 import eu.hbp.mip.utils.UserActionLogging;
 import io.swagger.annotations.Api;
@@ -110,37 +111,39 @@ public class ExperimentApi {
         UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Running the algorithm...");
 
         // --- Validating proper access rights on the datasets  ---
-        List<String> userRoles = Arrays.asList(authentication.getAuthorities().toString().toLowerCase()
-                .replaceAll("[\\s+\\]\\[]","").split(","));
-        UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Authorities", userRoles.toString());
-
-        // Getting the dataset from the experiment parameters
-        String experimentDatasets = null;
-        for (AlgorithmExecutionParamDTO parameter : experimentExecutionDTO.getAlgorithms().get(0).getParameters()) {
-            if (parameter.getName().equals("dataset")) {
-                experimentDatasets = parameter.getValue();
-                UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Found the dataset parameter!");
-                break;
+        List<String> userClaims = Arrays.asList(authentication.getAuthorities().toString().toLowerCase()
+                .replaceAll("[\\s+\\]\\[]", "").split(","));
+        UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "User Claims", userClaims.toString());
+
+        // Don't check for dataset claims if "super" claim exists allowing everything
+        if (!userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) {
+            // Getting the dataset from the experiment parameters
+            String experimentDatasets = null;
+            for (AlgorithmExecutionParamDTO parameter : experimentExecutionDTO.getAlgorithms().get(0).getParameters()) {
+                if (parameter.getName().equals("dataset")) {
+                    experimentDatasets = parameter.getValue();
+                    UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm", "Found the dataset parameter!");
+                    break;
+                }
             }
-        }
-
-        if (experimentDatasets == null || experimentDatasets.equals("")) {
-            UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm",
-                    "A dataset should be specified when running an algorithm.");
-            return ResponseEntity.badRequest().body("A dataset should be specified when running an algorithm.");
-        }
 
-        for (String dataset : experimentDatasets.split(",")) {
-            String datasetRole = "role_" + dataset;
-            if (!userRoles.contains(datasetRole.toLowerCase())) {
+            if (experimentDatasets == null || experimentDatasets.equals("")) {
                 UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm",
-                        "You are not allowed to use dataset: " + dataset);
-                return ResponseEntity.status(403).body("You are not allowed to use dataset: " + dataset);
+                        "A dataset should be specified when running an algorithm.");
+                return ResponseEntity.badRequest().body("A dataset should be specified when running an algorithm.");
             }
-        }
-        UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm",
-                "User is authorized to use the datasets: " + experimentDatasets);
 
+            for (String dataset : experimentDatasets.split(",")) {
+                String datasetRole = ClaimUtils.getDatasetClaim(dataset);
+                if (!userClaims.contains(datasetRole.toLowerCase())) {
+                    UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm",
+                            "You are not allowed to use dataset: " + dataset);
+                    return ResponseEntity.status(HttpStatus.FORBIDDEN).body("You are not allowed to use dataset: " + dataset);
+                }
+            }
+            UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Run algorithm",
+                    "User is authorized to use the datasets: " + experimentDatasets);
+        }
 
         // --- Run the experiment ---
 
diff --git a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java
index 48e2a0fa17e251f2e0f9141399fac5666b03128b..d2163e5814b09a2ff4c41a882f5fe79bf33fb411 100644
--- a/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java
+++ b/src/main/java/eu/hbp/mip/controllers/PathologiesApi.java
@@ -9,6 +9,7 @@ import com.google.gson.reflect.TypeToken;
 import eu.hbp.mip.model.PathologyDTO;
 import eu.hbp.mip.model.PathologyDTO.PathologyDatasetDTO;
 import eu.hbp.mip.model.UserInfo;
+import eu.hbp.mip.utils.ClaimUtils;
 import eu.hbp.mip.utils.CustomResourceLoader;
 import eu.hbp.mip.utils.UserActionLogging;
 import io.swagger.annotations.Api;
@@ -47,27 +48,30 @@ public class PathologiesApi {
     public ResponseEntity<String> getPathologies(Authentication authentication) {
         UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Load all the pathologies", "");
 
+        // Load pathologies from file
         Resource resource = resourceLoader.getResource("file:/opt/portal/api/pathologies.json");
         List<PathologyDTO> allPathologies;
         try {
             allPathologies = gson.fromJson(convertInputStreamToString(resource.getInputStream()), new TypeToken<List<PathologyDTO>>() {
             }.getType());
         } catch (IOException e) {
-            return ResponseEntity.badRequest().body("{\"error\" : \"The pathologies.json file could not be read.\"}");
+            return ResponseEntity.badRequest().body("The pathologies.json file could not be read.");
         }
 
         // --- Providing only the allowed pathologies/datasets to the user  ---
         UserActionLogging.LogUserAction(userInfo.getUser().getUsername(),
                 "Load all the pathologies", "Filter out the unauthorised datasets.");
 
-        List<String> userRoles = Arrays.asList(authentication.getAuthorities().toString().toLowerCase()
-                .replaceAll("[\\s+\\]\\[]","").split(","));
+        List<String> userClaims = Arrays.asList(authentication.getAuthorities().toString().toLowerCase()
+                .replaceAll("[\\s+\\]\\[]", "").split(","));
 
         UserActionLogging.LogUserAction(userInfo.getUser().getUsername(),
-                "Load all the pathologies", "Authorities : " + authentication.getAuthorities().toString());
+                "Load all the pathologies", "User Claims: " + userClaims);
 
-        UserActionLogging.LogUserAction(userInfo.getUser().getUsername(),
-                "Load all the pathologies", "Authorities: " + userRoles);
+        // If the "dataset_all" claim exists then return everything
+        if (userClaims.contains(ClaimUtils.allDatasetsAllowedClaim())) {
+            return ResponseEntity.ok().body(gson.toJson(allPathologies));
+        }
 
         List<PathologyDTO> userPathologies = new ArrayList<>();
         for (PathologyDTO curPathology : allPathologies) {
@@ -76,17 +80,14 @@ public class PathologiesApi {
 
             List<PathologyDatasetDTO> userPathologyDatasets = new ArrayList<PathologyDatasetDTO>();
             for (PathologyDatasetDTO dataset : curPathology.getDatasets()) {
-                if(userRoles.contains("role_" + dataset.getCode())){
+                if (userClaims.contains(ClaimUtils.getDatasetClaim(dataset.getCode()))) {
                     userPathologyDatasets.add(dataset);
                 }
             }
 
-            UserActionLogging.LogUserAction(userInfo.getUser().getUsername(),
-                    "Load all the pathologies", "User Pathologies size: " + userPathologyDatasets.size());
-
-            if(userPathologyDatasets.size() > 0){
-                UserActionLogging.LogUserAction(userInfo.getUser().getUsername(),
-                        "Load all the pathologies", "Added the pathology");
+            if (userPathologyDatasets.size() > 0) {
+                UserActionLogging.LogUserAction(userInfo.getUser().getUsername(), "Load all the pathologies",
+                        "Added pathology '" + curPathology.getLabel() + " with datasets: '" + userPathologyDatasets + "'");
 
                 PathologyDTO userPathology = new PathologyDTO();
                 userPathology.setCode(curPathology.getCode());
diff --git a/src/main/java/eu/hbp/mip/utils/ClaimUtils.java b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9bd98b5886df396f233e95655f3e6240ac63b47
--- /dev/null
+++ b/src/main/java/eu/hbp/mip/utils/ClaimUtils.java
@@ -0,0 +1,11 @@
+package eu.hbp.mip.utils;
+
+public class ClaimUtils {
+    public static String allDatasetsAllowedClaim(){
+        return "dataset_all";
+    }
+
+    public static String getDatasetClaim(String datasetCode){
+        return "dataset_" + datasetCode;
+    }
+}
diff --git a/src/main/java/eu/hbp/mip/utils/JSONUtil.java b/src/main/java/eu/hbp/mip/utils/JSONUtil.java
deleted file mode 100644
index 5822a44053790772138f53a6e388bbfd4e6d888a..0000000000000000000000000000000000000000
--- a/src/main/java/eu/hbp/mip/utils/JSONUtil.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package eu.hbp.mip.utils;
-
-import com.google.gson.JsonParseException;
-import com.google.gson.JsonParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Created by mirco on 01.07.16.
- */
-public class JSONUtil {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(JSONUtil.class);
-
-    private JSONUtil() {
-        /* Hide implicit public constructor */
-        throw new IllegalAccessError("JSONUtil class");
-    }
-
-    public static boolean isJSONValid(String test) {
-        try {
-            new JsonParser().parse(test);
-        } catch (JsonParseException jpe)
-        {
-            LOGGER.trace("Cannot parse to json", jpe); // This is the normal behavior when the input string is not JSON-ified
-            return false;
-        }
-        return true;
-    }
-
-}