diff --git a/full/src/test/java/de/ids_mannheim/korap/misc/ScopesTest.java b/full/src/test/java/de/ids_mannheim/korap/misc/ScopesTest.java
deleted file mode 100644
index 18f1cd1..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/misc/ScopesTest.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.ids_mannheim.korap.misc;
-import org.junit.Test;
-
-/**
- * @author hanl
- * @date 20/01/2016
- */
-public class ScopesTest {
-
-    @Test
-    public void testScopes () {
-
-    }
-
-
-    @Test
-    public void testOpenIDScopes () {
-
-    }
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java
deleted file mode 100644
index bced504..0000000
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2OpenIdControllerTest.java
+++ /dev/null
@@ -1,436 +0,0 @@
-package de.ids_mannheim.korap.web.controller;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.net.URI;
-import java.security.NoSuchAlgorithmException;
-import java.security.spec.InvalidKeySpecException;
-import java.text.ParseException;
-import java.util.Date;
-
-import jakarta.ws.rs.core.Form;
-import jakarta.ws.rs.core.MediaType;
-
-import org.apache.http.entity.ContentType;
-import org.apache.oltu.oauth2.common.message.types.TokenType;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.util.UriComponentsBuilder;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.net.HttpHeaders;
-import com.nimbusds.jose.JOSEException;
-import com.nimbusds.jose.JWSVerifier;
-import com.nimbusds.jose.crypto.RSASSAVerifier;
-import com.nimbusds.jose.jwk.JWKSet;
-import com.nimbusds.jose.jwk.RSAKey;
-import com.nimbusds.jwt.JWTClaimsSet;
-import com.nimbusds.jwt.SignedJWT;
-import com.nimbusds.oauth2.sdk.GrantType;
-import jakarta.ws.rs.ProcessingException;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.client.Entity;
-
-import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.FullConfiguration;
-import de.ids_mannheim.korap.config.SpringJerseyTest;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.oauth2.constant.OAuth2Error;
-import de.ids_mannheim.korap.utils.JsonUtils;
-
-// Open ID is not maintained and used.
-@Deprecated
-public class OAuth2OpenIdControllerTest extends SpringJerseyTest {
-
-    @Autowired
-    private FullConfiguration config;
-
-    private String redirectUri =
-            "https://korap.ids-mannheim.de/confidential/redirect";
-    private String username = "dory";
-
-    private Response sendAuthorizationRequest (
-            Form form) throws KustvaktException {
-        return target().path(API_VERSION).path("oauth2").path("openid").path("authorize")
-                .request()
-                .header(Attributes.AUTHORIZATION,
-                        HttpAuthorizationHandler
-                                .createBasicAuthorizationHeaderValue(username,
-                                        "password"))
-                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
-                .header(HttpHeaders.CONTENT_TYPE,
-                        ContentType.APPLICATION_FORM_URLENCODED)
-                .post(Entity.form(form));
-    }
-
-    private Response sendTokenRequest (
-            Form form) throws KustvaktException {
-        return target().path(API_VERSION).path("oauth2").path("openid").path("token")
-                .request()
-                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
-                .header(HttpHeaders.CONTENT_TYPE,
-                        ContentType.APPLICATION_FORM_URLENCODED)
-                .post(Entity.form(form));
-    }
-
-    @Test
-    public void testRequestAuthorizationCode ()
-            throws ProcessingException,
-            KustvaktException {
-
-        Form form = new Form();
-        form.param("response_type", "code");
-        form.param("client_id", "fCBbQkAyYzI4NzUxMg");
-        form.param("scope", "search");
-
-        //testRequestAuthorizationCodeMissingRedirectUri(form);
-        //testRequestAuthorizationCodeInvalidRedirectUri(form);
-
-        form.param("redirect_uri", redirectUri);
-        
-        testRequestAuthorizationCodeWithoutOpenID(form, redirectUri);
-
-        form.param("state", "thisIsMyState");
-
-        Response response = sendAuthorizationRequest(form);
-        URI location = response.getLocation();
-        assertEquals(redirectUri, location.getScheme() + "://"
-                + location.getHost() + location.getPath());
-
-        MultiValueMap<String, String> params =
-                UriComponentsBuilder.fromUri(location).build().getQueryParams();
-        assertNotNull(params.getFirst("code"));
-        assertEquals("thisIsMyState", params.getFirst("state"));
-    }
-
-    private void testRequestAuthorizationCodeWithoutOpenID (
-            Form form, String redirectUri)
-            throws KustvaktException {
-        Response response = sendAuthorizationRequest(form);
-
-        URI location = response.getLocation();
-        // System.out.println(location.toString());
-        assertEquals(redirectUri, location.getScheme() + "://"
-                + location.getHost() + location.getPath());
-    }
-
-    private void testRequestAuthorizationCodeMissingRedirectUri (
-            Form form) throws KustvaktException {
-        Response response = sendAuthorizationRequest(form);
-        String entity = response.readEntity(String.class);
-System.out.println(entity);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("redirect_uri is required",
-                node.at("/error_description").asText());
-    }
-
-    private void testRequestAuthorizationCodeInvalidRedirectUri (
-            Form form) throws KustvaktException {
-        form.param("redirect_uri", "blah");
-        Response response = sendAuthorizationRequest(form);
-        String entity = response.readEntity(String.class);
-
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid redirect URI",
-                node.at("/error_description").asText());
-
-        form.asMap().remove("redirect_uri");
-    }
-
-    @Test
-    public void testRequestAuthorizationCodeMissingClientID ()
-            throws KustvaktException {
-        Form form = new Form();
-        form.param("scope", "openid");
-        form.param("redirect_uri", redirectUri);
-
-        // error response is represented in JSON because redirect URI
-        // cannot be verified without client id
-        // Besides client_id is a mandatory parameter in a normal
-        // OAuth2 authorization request, thus it is checked first,
-        // before redirect_uri. see
-        // com.nimbusds.oauth2.sdk.AuthorizationRequest
-
-        Response response = sendAuthorizationRequest(form);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing client_id parameter",
-                node.at("/error_description").asText());
-
-    }
-
-    @Test
-    public void testRequestAuthorizationCodeMissingResponseType ()
-            throws KustvaktException {
-        Form form = new Form();
-        form.param("scope", "openid");
-        form.param("redirect_uri", redirectUri);
-        form.param("client_id", "blah");
-
-        // client_id has not been verified yet
-        // MUST NOT automatically redirect the user-agent to the
-        // invalid redirection URI.
-
-        Response response = sendAuthorizationRequest(form);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing response_type parameter",
-                node.at("/error_description").asText());
-    }
-
-    private void testRequestAuthorizationCodeUnsupportedResponseType (
-            Form form, String type)
-            throws KustvaktException {
-
-        Response response = sendAuthorizationRequest(form);
-        URI location = response.getLocation();
-        assertEquals(MediaType.APPLICATION_FORM_URLENCODED,
-                response.getMediaType().toString());
-
-        MultiValueMap<String, String> params =
-                UriComponentsBuilder.fromUri(location).build().getQueryParams();
-        assertEquals("invalid_request", params.getFirst("error"));
-        assertEquals("unsupported+response_type%3A+" + type,
-                params.getFirst("error_description"));
-    }
-
-    /**
-     * We don't support implicit grant. Implicit grant allows
-     * response_type:
-     * <ul>
-     * <li>id_token</li>
-     * <li>id_token token</li>
-     * </ul>
-     * 
-     * @throws KustvaktException
-     */
-    @Test
-    public void testRequestAuthorizationCodeUnsupportedImplicitFlow ()
-            throws KustvaktException {
-        Form form = new Form();
-        form.param("scope", "openid");
-        form.param("redirect_uri", redirectUri);
-        form.param("response_type", "id_token");
-        form.param("client_id", "fCBbQkAyYzI4NzUxMg");
-        form.param("nonce", "nonce");
-
-        testRequestAuthorizationCodeUnsupportedResponseType(form, "id_token");
-
-        form.asMap().remove("response_type");
-        form.param("response_type", "id_token token");
-        testRequestAuthorizationCodeUnsupportedResponseType(form, "id_token");
-    }
-
-    /**
-     * Hybrid flow is not supported. Hybrid flow allows
-     * response_type:
-     * <ul>
-     * <li>code id_token</li>
-     * <li>code token</li>
-     * <li>code id_token token</li>
-     * </ul>
-     * 
-     * @throws KustvaktExceptiony);
-     *             assertTrue(signedJWT.verify(verifier));
-     */
-
-    @Test
-    public void testRequestAuthorizationCodeUnsupportedHybridFlow ()
-            throws KustvaktException {
-        Form form = new Form();
-        form.param("scope", "openid");
-        form.param("redirect_uri", redirectUri);
-        form.param("response_type", "code id_token");
-        form.param("client_id", "fCBbQkAyYzI4NzUxMg");
-        form.param("nonce", "nonce");
-        testRequestAuthorizationCodeUnsupportedResponseType(form, "id_token");
-
-        form.asMap().remove("response_type");
-        form.param("response_type", "code token");
-        testRequestAuthorizationCodeUnsupportedResponseType(form, "token");
-    }
-
-    @Test
-    public void testRequestAccessTokenWithAuthorizationCode ()
-            throws KustvaktException, ParseException, InvalidKeySpecException,
-            NoSuchAlgorithmException, JOSEException {
-        String client_id = "fCBbQkAyYzI4NzUxMg";
-        String nonce = "thisIsMyNonce";
-        Form form = new Form();
-        form.param("response_type", "code");
-        form.param("client_id", client_id);
-        form.param("redirect_uri", redirectUri);
-        form.param("scope", "openid");
-        form.param("state", "thisIsMyState");
-        form.param("nonce", nonce);
-
-        Response response = sendAuthorizationRequest(form);
-        URI location = response.getLocation();
-        MultiValueMap<String, String> params =
-                UriComponentsBuilder.fromUri(location).build().getQueryParams();
-        assertEquals("thisIsMyState", params.getFirst("state"));
-        String code = params.getFirst("code");
-
-        Form tokenForm = new Form();
-        testRequestAccessTokenMissingGrant(tokenForm);
-        tokenForm.param("grant_type", "authorization_code");
-        tokenForm.param("code", code);
-        testRequestAccessTokenMissingClientId(tokenForm);
-        tokenForm.param("client_id", client_id);
-        testRequestAccessTokenMissingClientSecret(tokenForm);
-        tokenForm.param("client_secret", "secret");
-        tokenForm.param("redirect_uri", redirectUri);
-
-        Response tokenResponse = sendTokenRequest(tokenForm);
-        String entity = tokenResponse.readEntity(String.class);
-
-        JsonNode node = JsonUtils.readTree(entity);
-        assertNotNull(node.at("/access_token").asText());
-        assertNotNull(node.at("/refresh_token").asText());
-        assertEquals(TokenType.BEARER.toString(),
-                node.at("/token_type").asText());
-        assertNotNull(node.at("/expires_in").asText());
-        String id_token = node.at("/id_token").asText();
-        assertNotNull(id_token);
-
-        verifyingIdToken(id_token, username, client_id, nonce);
-    }
-
-    private void testRequestAccessTokenMissingGrant (
-            Form tokenForm) throws KustvaktException {
-        Response response = sendTokenRequest(tokenForm);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing grant_type parameter",
-                node.at("/error_description").asText());
-    }
-
-    private void testRequestAccessTokenMissingClientId (
-            Form tokenForm) throws KustvaktException {
-        Response response = sendTokenRequest(tokenForm);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing required client_id "
-                + "parameter", node.at("/error_description").asText());
-    }
-
-    private void testRequestAccessTokenMissingClientSecret (
-            Form tokenForm) throws KustvaktException {
-        Response response = sendTokenRequest(tokenForm);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Missing parameter: client_secret",
-                node.at("/error_description").asText());
-    }
-
-    private void verifyingIdToken (String id_token, String username,
-            String client_id, String nonce) throws ParseException,
-            InvalidKeySpecException, NoSuchAlgorithmException, JOSEException {
-        JWKSet keySet = config.getPublicKeySet();
-        RSAKey publicKey = (RSAKey) keySet.getKeyByKeyId(config.getRsaKeyId());
-
-        SignedJWT signedJWT = SignedJWT.parse(id_token);
-        JWSVerifier verifier = new RSASSAVerifier(publicKey);
-        assertTrue(signedJWT.verify(verifier));
-
-        JWTClaimsSet claimsSet = signedJWT.getJWTClaimsSet();
-        assertEquals(client_id, claimsSet.getAudience().get(0));
-        assertEquals(username, claimsSet.getSubject());
-        assertEquals(config.getIssuerURI().toString(), claimsSet.getIssuer());
-        assertTrue(new Date().before(claimsSet.getExpirationTime()));
-        assertNotNull(claimsSet.getClaim(Attributes.AUTHENTICATION_TIME));
-        assertEquals(nonce, claimsSet.getClaim("nonce"));
-    }
-
-    // no openid
-    @Test
-    public void testRequestAccessTokenWithPassword ()
-            throws KustvaktException, ParseException, InvalidKeySpecException,
-            NoSuchAlgorithmException, JOSEException {
-        // public client
-        String client_id = "8bIDtZnH6NvRkW2Fq";
-        Form tokenForm = new Form();
-        testRequestAccessTokenMissingGrant(tokenForm);
-
-        tokenForm.param("grant_type", GrantType.PASSWORD.toString());
-        testRequestAccessTokenMissingUsername(tokenForm);
-
-        tokenForm.param("username", username);
-        testRequestAccessTokenMissingPassword(tokenForm);
-
-        tokenForm.param("password", "pass");
-        tokenForm.param("client_id", client_id);
-
-        Response tokenResponse = sendTokenRequest(tokenForm);
-        String entity = tokenResponse.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-
-        assertEquals(OAuth2Error.UNAUTHORIZED_CLIENT,
-                node.at("/error").asText());
-        assertEquals("Password grant is not allowed for third party clients",
-                node.at("/error_description").asText());
-    }
-
-    private void testRequestAccessTokenMissingUsername (
-            Form tokenForm) throws KustvaktException {
-        Response response = sendTokenRequest(tokenForm);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing or empty username parameter",
-                node.at("/error_description").asText());
-    }
-
-    private void testRequestAccessTokenMissingPassword (
-            Form tokenForm) throws KustvaktException {
-        Response response = sendTokenRequest(tokenForm);
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid request: Missing or empty password parameter",
-                node.at("/error_description").asText());
-    }
-
-    @Test
-    public void testPublicKeyAPI () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("oauth2").path("openid")
-                .path("jwks")
-                .request()
-                .get();
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(1, node.at("/keys").size());
-        node = node.at("/keys/0");
-        assertEquals("RSA", node.at("/kty").asText());
-        assertEquals(config.getRsaKeyId(), node.at("/kid").asText());
-        assertNotNull(node.at("/e").asText());
-        assertNotNull(node.at("/n").asText());
-    }
-
-    @Test
-    public void testOpenIDConfiguration () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("oauth2").path("openid")
-                .path("config")
-                .request()
-                .get();
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
-        assertNotNull(node.at("/issuer"));
-        assertNotNull(node.at("/authorization_endpoint"));
-        assertNotNull(node.at("/token_endpoint"));
-        assertNotNull(node.at("/response_types_supported"));
-        assertNotNull(node.at("/subject_types_supported"));
-        assertNotNull(node.at("/id_token_signing_alg_values_supported"));
-    }
-}
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/TokenExpiryTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/TokenExpiryTest.java
index 9626116..0ebd7fb 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/TokenExpiryTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/TokenExpiryTest.java
@@ -93,11 +93,11 @@
         form.param("client_id", "fCBbQkAyYzI4NzUxMg");
         form.param("redirect_uri",
                 "https://korap.ids-mannheim.de/confidential/redirect");
-        form.param("scope", "openid");
+        form.param("scope", "search");
         form.param("max_age", "1");
 
         Response response =
-                target().path(API_VERSION).path("oauth2").path("openid").path("authorize")
+                target().path(API_VERSION).path("oauth2").path("authorize")
                         .request()
                         .header(Attributes.AUTHORIZATION, "Bearer " + token)
                         .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
diff --git a/full/src/test/resources/kustvakt-test.conf b/full/src/test/resources/kustvakt-test.conf
index 893d04b..913e2ed 100644
--- a/full/src/test/resources/kustvakt-test.conf
+++ b/full/src/test/resources/kustvakt-test.conf
@@ -91,29 +91,6 @@
 
 oauth2.initial.super.client=true
 
-# OpenId
-# multiple values are separated by space
-openid.grant.types = authorization_code
-openid.response.types = code
-openid.response.modes = query
-openid.client.auth.methods = client_secret_basic client_secret_post
-openid.token.signing.algorithms = RS256
-openid.subject.types = public
-openid.display.types = page
-openid.supported.scopes = openid email auth_time
-openid.support.claim.param = false
-openid.claim.types = normal
-openid.supported.claims = iss sub aud exp iat
-openid.ui.locales = en
-#openid.privacy.policy = 
-#openid.term.of.service =
-openid.service.doc = https://github.com/KorAP/Kustvakt/wiki
-
-# JWK
-# must be set for openid
-rsa.private = kustvakt_rsa.key
-rsa.public = kustvakt_rsa_public.key
-rsa.key.id = 74caa3a9-217c-49e6-94e9-2368fdd02c35
 
 # see SecureRandom Number Generation Algorithms
 # optional
diff --git a/full/src/test/resources/kustvakt_rsa.key b/full/src/test/resources/kustvakt_rsa.key
deleted file mode 100644
index 1db25e9..0000000
--- a/full/src/test/resources/kustvakt_rsa.key
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "p": "y7t3f2VRo5TN3IsCjshSWWwe4H1-Xd7iBbtPS_fmBeaVDbLr-05LsGRJxXzKheMJ5DwBzhvWAlCig5uSJG3Gk4i0LgLY5YO33shb9qqqEnF54ZkJbiqxSs5l_dggzZgYB5z0riVl2VA3yfNm1qJIE2eipBouUjBEXMOEtJlOrFc",
-  "kty": "RSA",
-  "q": "v4HHIpOddl_78fVQgvZCsINygpLuniJ3sVShLhX7LnCU0Eb4TMK_Fyz9_JPb3YFvEoPpQw3kfnAhkOBTATTpXzg_dNtR6eQfvDJfHl9R6FuSoVTJoNAO_rqEpKzQOGXl4ohBxVjhXcbEo6GEVp4pZAeXMM8D02IWfvGbJd0Yw0k",
-  "d": "OJFnms4n3ajWKvK26aOh_r8JGgQwbQNIXpx8UqFnc_EB4nzxcLns8-FGKa9Vg3VMAs8cFC4iM9evx1084yqsCeSKgwiV5ZVQkwnp35Gd5BslZxuH8kCdR1mL5y0V0RMwgW-W1ry_YtdhBSIze8XCJXB7udNk7bviiJylEm8OouyxAq-5uUy_qMWYk-mtDSpmPW9SfFf91c6P7-ataDFcd_zxFotd1UwXDVDaPfUnxpOA6Jh1WsvIFhX4IzETuUG8n5C-j6FrK_YlU7U-zFzzF8qWTthQVj5l7A0zOGmq6OC9mv_xtnSc6z9I-HklWFXa8eDsc2JasYqJY8CmTDSy8Q",
-  "e": "AQAB",
-  "kid": "74caa3a9-217c-49e6-94e9-2368fdd02c35",
-  "qi": "Iv8_jAuCTdU7xZ1GXK0Zaql3Azu1-qXiZseod9urLFFZK6OvxrhH0BexG_P1tRikUfEUQiyqNVCU544Z0Y0AdDbgb5aEYNa3Bkb5WAHHXsLDtzXSsxgvR4Pzg3PhT3HTrLkgTlWy9g0u7bwfhb-KTRszcw4SyFXz9o62xJLPJZo",
-  "dp": "pA8_qHhHqMoAiNPsaFyKa_Y0WyTTqPX93w26SnvDYQcRCqoFfCbNrqrj-UOHtw9gfMmRzo795HlYlVCm--zmlxHjvpWOYiyS2bVQ0S8Xq6hztKbPQEbi5FGXMjZkHAuZdi__nWkCPmBpvJfkPX0LO40eHLX0jTzPIEBWUjSOdRs",
-  "dq": "GtnydumlqWRZ6hoQWNx4i1FS6_X4GRoSGD4af2C7oE5Ov0lEJVck_fXkAtcke9FbJohyW2GGSSglvK-HU-L8WcqEMzlRKe8_d97EMXkB_gdg7tf5kV-6yoKSeJh2dYHsErAyMJ5-suxcw-iwqohwm0LpMwHDso7NQq1TqKJwh2k",
-  "n": "mGgmGYIN06ibCh98nsXp0a77xRQNnB9rKpRGKm41tVi0zLQWqmEdDh2CmrMiOOxTJFSlAuAVkwK-KVQZ5Men5dJvRyTwZPtBWSJZk32Znj3VshFloSQlQU-g3oh3c2htP03EDtBLmecZMI-OUV1hRCvrRUrS-qF24CJ-rheFsCmpSievEJDQqTTfXcbAG2DdRQJHWb3y1iyNojB_mV1H2Gztg9DGEZarloqXoTFeDcxs7SpZJqAWCWTJQk8n6Ye79SfGMNrzaaqN9aHx__6FU-GFdZexlWE0CemQcfx_hTEkCTa2EsGgI_GETQIjeCZRB29x91E3AlWVvEgA591pzw"
-}
\ No newline at end of file
diff --git a/full/src/test/resources/kustvakt_rsa_public.key b/full/src/test/resources/kustvakt_rsa_public.key
deleted file mode 100644
index 28c2fad..0000000
--- a/full/src/test/resources/kustvakt_rsa_public.key
+++ /dev/null
@@ -1,6 +0,0 @@
-{"keys": [{
-  "kty": "RSA",
-  "e": "AQAB",
-  "kid": "74caa3a9-217c-49e6-94e9-2368fdd02c35",
-  "n": "mGgmGYIN06ibCh98nsXp0a77xRQNnB9rKpRGKm41tVi0zLQWqmEdDh2CmrMiOOxTJFSlAuAVkwK-KVQZ5Men5dJvRyTwZPtBWSJZk32Znj3VshFloSQlQU-g3oh3c2htP03EDtBLmecZMI-OUV1hRCvrRUrS-qF24CJ-rheFsCmpSievEJDQqTTfXcbAG2DdRQJHWb3y1iyNojB_mV1H2Gztg9DGEZarloqXoTFeDcxs7SpZJqAWCWTJQk8n6Ye79SfGMNrzaaqN9aHx__6FU-GFdZexlWE0CemQcfx_hTEkCTa2EsGgI_GETQIjeCZRB29x91E3AlWVvEgA591pzw"
-}]}
\ No newline at end of file
diff --git a/full/src/test/resources/test-config.xml b/full/src/test/resources/test-config.xml
index 2c16410..57501d3 100644
--- a/full/src/test/resources/test-config.xml
+++ b/full/src/test/resources/test-config.xml
@@ -229,14 +229,6 @@
 	</bean>
 
 	<!-- authentication providers to use -->
-	<!-- <bean id="openid_auth"
-		class="de.ids_mannheim.korap.authentication.OpenIDconnectAuthentication">
-		<constructor-arg type="de.ids_mannheim.korap.config.KustvaktConfiguration"
-			ref="kustvakt_config" />
-		<constructor-arg
-			type="de.ids_mannheim.korap.interfaces.db.PersistenceClient" ref="kustvakt_db" />
-	</bean> -->
-
 	<bean id="basic_auth"
 		class="de.ids_mannheim.korap.authentication.BasicAuthentication" />
 
@@ -257,7 +249,6 @@
 		value-type="de.ids_mannheim.korap.interfaces.AuthenticationIface">
 		<ref bean="basic_auth" />
 		<ref bean="session_auth" />
-		<!-- <ref bean="openid_auth" /> -->
 		<ref bean="oauth2_auth" />
 	</util:list>
 
