diff --git a/classes/JWKSHandler.php b/classes/JWKSHandler.php
index 2f2d5bc96748730a8a1e592114c5827e1810992b..feffd906d1ac26d6c27e3ae528ffcf8461773efb 100644
--- a/classes/JWKSHandler.php
+++ b/classes/JWKSHandler.php
@@ -77,65 +77,4 @@ class JWKSHandler {
         return $matches[1];
     }
 
-    public function loadAllJWKS(): array {
-
-        foreach ($this->locator->getBrowserBasedOAuth2Clients() as $client) {
-            if ($client->jwks !== null) {
-                $this->loadJWKS($client->jwks);
-            }
-        }
-
-        $dao = $this->locator->getJWKSDAO();
-        return $dao->getAllPublicJWK();
-    }
-
-    private function loadJWKS($url) {
-
-        $dao = $this->locator->getJWKSDAO();
-
-        $conn = curl_init($url);
-        curl_setopt($conn, CURLOPT_FOLLOWLOCATION, 1);
-        curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
-
-        $result = curl_exec($conn);
-        $info = curl_getinfo($conn);
-
-        if ($info['http_code'] === 200) {
-            $jwks = json_decode($result, TRUE);
-
-            foreach ($jwks['keys'] as $key) {
-                $key['url'] = $url;
-                $jwk = $this->getPublicJWK($key);
-                $dao->updatePublicJWK($jwk);
-            }
-        } else {
-            error_log('Error while retrieving JWKS from ' . $url);
-        }
-
-        curl_close($conn);
-    }
-
-    private function getPublicJWK($data): PublicJWK {
-
-        // Convert Base64 uri-safe variant to default (needed for JWKS)
-        $n = strtr($data['n'], '-_', '+/');
-
-        $rsa = new RSA();
-
-        $key = "<RSAKeyPair>"
-                . "<Modulus>" . $n . "</Modulus>"
-                . "<Exponent>" . $data['e'] . "</Exponent>"
-                . "</RSAKeyPair>";
-
-        $rsa->loadKey($key, RSA::PUBLIC_FORMAT_XML);
-
-        $jwk = new PublicJWK();
-        $jwk->kid = $data['kid'];
-        $jwk->key = $rsa;
-        $jwk->url = $data['url'];
-        $jwk->updateTime = time();
-
-        return $jwk;
-    }
-
 }
diff --git a/classes/TokenExchanger.php b/classes/TokenExchanger.php
index 8aa7ac9c1967388b6492aa5e7eb6eb925362b0cb..fce83c9284661e2db0173d3da71dd134f1d7cc06 100644
--- a/classes/TokenExchanger.php
+++ b/classes/TokenExchanger.php
@@ -24,8 +24,6 @@
 
 namespace RAP;
 
-use \Firebase\JWT\JWT;
-
 /**
  * See https://tools.ietf.org/html/rfc8693
  */
@@ -70,9 +68,9 @@ class TokenExchanger {
         if ($params['expires_in'] !== null) {
             $claims['exp'] = time() + intval($params['expires_in']);
         }
-        
+
         $accessToken = $this->locator->getTokenBuilder()->generateToken($claims);
-        
+
         $data = [];
 
         $data['access_token'] = $accessToken;
@@ -92,56 +90,4 @@ class TokenExchanger {
         return $audiences;
     }
 
-    /**
-     * DEPRECATED (currently used by portals: to be removed)
-     */
-    public function exchangeTokenOld(string $token) {
-
-        $key = $this->getExternalKeyForToken($token);
-        $decoded = JWT::decode($token, $key->key, ['RS256']);
-
-        $subject = $decoded->sub;
-        $lifespan = ($decoded->exp - time());
-
-        $data = [];
-
-        $data['access_token'] = $this->locator->getTokenBuilder()->generateNewToken($subject, $lifespan / 3600, "gms");
-        $data['issued_token_type'] = "urn:ietf:params:oauth:token-type:access_token";
-        $data['token_type'] = 'Bearer';
-        $data['expires_in'] = $lifespan;
-
-        return $data;
-    }
-
-    private function getExternalKeyForToken(string $token): PublicJWK {
-
-        $keys = $this->locator->getJWKSDAO()->getAllPublicJWK();
-
-        $parts = explode('.', $token);
-        $head = JWT::jsonDecode(JWT::urlsafeB64Decode($parts[0]));
-
-        $kid = $head->kid;
-
-        $key = $this->getKeyByKid($keys, $kid);
-        if ($key === null) {
-            $keys = $this->locator->getJWKSHandler()->loadAllJWKS();
-        }
-        $key = $this->getKeyByKid($keys, $kid);
-
-        if ($key !== null) {
-            return $key;
-        }
-
-        throw new \Exception("Invalid kid");
-    }
-
-    private function getKeyByKid(array $keys, string $kid): ?PublicJWK {
-        foreach ($keys as $key) {
-            if ($key->kid === $kid) {
-                return $key;
-            }
-        }
-        return null;
-    }
-
 }
diff --git a/classes/UserHandler.php b/classes/UserHandler.php
index 9d8f573122420164675dca7a83225f15e7681d4f..8f27522a2398d6297de19505d44b3957b1ea620c 100644
--- a/classes/UserHandler.php
+++ b/classes/UserHandler.php
@@ -102,7 +102,7 @@ class UserHandler {
             return $this->joinNewIdentity($user1, $user2);
         }
 
-        // Call Grouper for moving groups and privileges from one user to the other
+        // Call GMS for moving groups and privileges from one user to the other
         $remainingUserId = $this->locator->getGmsClient()->joinGroups($userId1, $userId2);
 
         $remainingUser = $userId1 === $remainingUserId ? $user1 : $user2;
diff --git a/classes/datalayer/JWKSDAO.php b/classes/datalayer/JWKSDAO.php
index a5b52a612b834e745e1396ab8ca3c1ac81a3387f..9cd83f49900a9cfccd8cbadc77caa4116da2e0f2 100644
--- a/classes/datalayer/JWKSDAO.php
+++ b/classes/datalayer/JWKSDAO.php
@@ -11,8 +11,4 @@ interface JWKSDAO {
     public function insertRSAKeyPair(RSAKeyPair $keyPair): RSAKeyPair;
 
     public function getNewestKeyPair(): ?RSAKeyPair;
-
-    public function getAllPublicJWK(): array;
-
-    public function updatePublicJWK(PublicJWK $jwk);
 }
diff --git a/classes/datalayer/mysql/MySQLJWKSDAO.php b/classes/datalayer/mysql/MySQLJWKSDAO.php
index 5611db62ab69e85ec700c51bf174be86f98376e8..8e7a83ad188340b257950396055f12ceee49ec17 100644
--- a/classes/datalayer/mysql/MySQLJWKSDAO.php
+++ b/classes/datalayer/mysql/MySQLJWKSDAO.php
@@ -85,48 +85,4 @@ class MySQLJWKSDAO extends BaseMySQLDAO implements JWKSDAO {
         return $keyPair;
     }
 
-    public function getAllPublicJWK(): array {
-
-        $dbh = $this->getDBHandler();
-
-        $query = "SELECT `kid`, `key`, `url`, `update_time` FROM public_jwk";
-
-        $stmt = $dbh->prepare($query);
-        $stmt->execute();
-
-        $keys = [];
-
-        foreach ($stmt->fetchAll() as $row) {
-            array_push($keys, $this->getPublicJWKFromResultRow($row));
-        }
-
-        return $keys;
-    }
-
-    private function getPublicJWKFromResultRow($row): PublicJWK {
-
-        $jwk = new PublicJWK ();
-        $jwk->key = $row['key'];
-        $jwk->kid = $row['kid'];
-        $jwk->url = $row['url'];
-        $jwk->updateTime = $row['update_time'];
-        return $jwk;
-    }
-
-    public function updatePublicJWK(PublicJWK $jwk) {
-
-        $dbh = $this->getDBHandler();
-
-        $query = "INSERT INTO public_jwk(kid, `key`, `url`, update_time) VALUES (:kid, :key, :url, :update_time)"
-                . " ON DUPLICATE KEY UPDATE `key`=:key, `url`=:url, update_time=:update_time";
-
-        $stmt = $dbh->prepare($query);
-        $stmt->bindParam(':kid', $jwk->kid);
-        $stmt->bindParam(':key', $jwk->key);
-        $stmt->bindParam(':url', $jwk->url);
-        $stmt->bindParam(':update_time', $jwk->updateTime);
-
-        $stmt->execute();
-    }
-
 }
diff --git a/classes/model/BrowserBasedOAuth2Client.php b/classes/model/BrowserBasedOAuth2Client.php
index b4ffa124944dc8bea21818e2241d6fe058116539..6edad89b7cb898752f77d8bff0c481aef772d7c7 100644
--- a/classes/model/BrowserBasedOAuth2Client.php
+++ b/classes/model/BrowserBasedOAuth2Client.php
@@ -35,7 +35,6 @@ class BrowserBasedOAuth2Client extends BrowserBasedClient {
     public $scope;
     public $homePage;
     public $showInHome;
-    public $jwks;
     public $scopeAudienceMap = [];
 
     public function __construct(object $config) {
@@ -48,7 +47,6 @@ class BrowserBasedOAuth2Client extends BrowserBasedClient {
         $this->homePage = isset($config->home) ? $config->home : null;
         $this->showInHome = isset($config->showInHome) ? $config->showInHome : false;
         $this->authMethods = $config->methods;
-        $this->jwks = isset($config->jwks) ? $config->jwks : null;
         $this->scopeAudienceMap = isset($config->scopeAudienceMap) ? $config->scopeAudienceMap : null;
     }
 
diff --git a/classes/model/PublicJWK.php b/classes/model/PublicJWK.php
deleted file mode 100644
index c883bf5edd7e79d36b4b6da59b214b730ba0147f..0000000000000000000000000000000000000000
--- a/classes/model/PublicJWK.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-namespace RAP;
-
-class PublicJWK {
-
-    public $kid;
-    public $key;
-    public $url;
-    public $updateTime;
-
-}
diff --git a/config-example.yaml b/config-example.yaml
index 87b2554cbe5eed89f78b71f9ee34acbad4e3bac6..fb4208a165bc8598d317583ad90f9fe23a497317 100644
--- a/config-example.yaml
+++ b/config-example.yaml
@@ -59,7 +59,6 @@ clients:
     icon: 
     showInHome: true
     methods: [eduGAIN, Google, Facebook, LinkedIn, X.509, LocalIdP]
-    jwks:
   - label: "Asiago Astrophysical Observatory (localhost)"
     id: aao-dev
     secret: 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea
@@ -69,7 +68,6 @@ clients:
     icon: asiago.gif
     showInHome: true
     methods: [eduGAIN, Google, Facebook, LinkedIn, X.509, LocalIdP]
-    jwks: http://localhost:8081/aao/jwks
 cliClients:
   - id: gms_cli
     secret: 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea