diff --git a/perun-oidc-server-webapp/src/main/resources/logback.xml b/perun-oidc-server-webapp/src/main/resources/logback.xml
index fa230a84a..37d6367df 100644
--- a/perun-oidc-server-webapp/src/main/resources/logback.xml
+++ b/perun-oidc-server-webapp/src/main/resources/logback.xml
@@ -55,7 +55,7 @@
 	<logger name="cz.muni.ics" level="${log.level}"/>
 	<logger name="cz.muni.ics.oidc.aop.WebLoggingAspect" level="debug"/>
 	<logger name="cz.muni.ics.oidc.aop.ExecutionTimeLoggingAspect" level="trace"/>
-	<logger name="cz.muni.ics.openid.connect.web.EndSessionEndpoint" level="${log.level}"/>
+	<logger name="cz.muni.ics.openid.connect.web.endpoint.EndSessionEndpoint" level="${log.level}"/>
 	<logger name="cz.muni.ics.openid.connect.config.JsonMessageSource" level="warn"/>
 
 </configuration>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/application-context.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/application-context.xml
index d5ef99ee5..a6a41b25c 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/application-context.xml
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/application-context.xml
@@ -17,104 +17,16 @@
     limitations under the License.
  -->
 <beans xmlns="http://www.springframework.org/schema/beans"
-	   xmlns:mvc="http://www.springframework.org/schema/mvc"
 	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	   xmlns:tx="http://www.springframework.org/schema/tx"
 	   xmlns:context="http://www.springframework.org/schema/context"
-	   xmlns:security="http://www.springframework.org/schema/security"
-	   xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
-	   xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2
-		 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
-		 http://www.springframework.org/schema/mvc
-		 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
-		 http://www.springframework.org/schema/security
-		 http://www.springframework.org/schema/security/spring-security-4.2.xsd
+	   xsi:schemaLocation="
 		 http://www.springframework.org/schema/beans
 		 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-		 http://www.springframework.org/schema/tx
-		 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
 		 http://www.springframework.org/schema/context
 		 http://www.springframework.org/schema/context/spring-context-4.3.xsd">
 
 	<!-- Scan for components -->
-	<context:component-scan annotation-config="true" base-package="cz.muni.ics" />
-
-	<!-- Enables the Spring MVC @Controller programming model -->
-	<tx:annotation-driven transaction-manager="transactionManager" />
-	<mvc:annotation-driven ignore-default-model-on-redirect="true">
-		<mvc:message-converters>
-			<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
-			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
-		</mvc:message-converters>
-	</mvc:annotation-driven>
-
-	<bean id="userInfoInterceptor" class="cz.muni.ics.openid.connect.web.UserInfoInterceptor" />
-	<bean id="serverConfigInterceptor" class="cz.muni.ics.openid.connect.web.ServerConfigInterceptor" />
-	<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
-		<property name="paramName" value="lang"/>
-	</bean>
-	<mvc:interceptors>
-		<mvc:interceptor>
-			<mvc:mapping path="/**"/>
-			<ref bean="localeChangeInterceptor"/>
-		</mvc:interceptor>
-		<mvc:interceptor>
-			<!-- Exclude APIs and other machine-facing endpoints from these interceptors -->
-			<mvc:mapping path="/**" />
-			<mvc:exclude-mapping path="/token**"/>
-			<mvc:exclude-mapping path="/resources/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.DynamicClientRegistrationEndpoint).URL}/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.ProtectedResourceRegistrationEndpoint).URL}/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.UserInfoEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.RootController).API_URL}/**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.DeviceEndpoint).ENDPOINT_URL}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.DeviceEndpoint).REQUEST_USER_CODE_URL}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.DeviceEndpoint).DEVICE_APPROVED_URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.IntrospectionEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.RevocationEndpoint).URL}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.IsTestSpController).MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.AupController).URL}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_AUTHORIZATION}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_ENSURE_VO_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_IS_CESNET_ELIGIBLE_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_MANDATORY_VOS_GROUPS}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_PROD_VOS_GROUPS}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_TEST_VOS_GROUPS}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_LOGGED_IN}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_SPECIFIC_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_CONTINUE_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_FORM_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_FORM_SUBMIT_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.RegistrationController).CONTINUE_DIRECT_MAPPING}**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}" />
-			<mvc:exclude-mapping path="/saml**" />
-			<!-- Inject the UserInfo into the response -->
-			<ref bean="userInfoInterceptor" />
-		</mvc:interceptor>
-		<mvc:interceptor>
-			<!-- Exclude APIs and other machine-facing endpoints from these interceptors -->
-			<mvc:mapping path="/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" />
-			<mvc:exclude-mapping path="/resources/**" />
-			<mvc:exclude-mapping path="/token**"/>
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.DynamicClientRegistrationEndpoint).URL}/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.ProtectedResourceRegistrationEndpoint).URL}/**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.UserInfoEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.RootController).API_URL}/**" />
-			<mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.DeviceEndpoint).ENDPOINT_URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.IntrospectionEndpoint).URL}**" />
-			<mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.RevocationEndpoint).URL}**" />
-			<!-- Inject the server configuration into the response -->
-			<ref bean="serverConfigInterceptor"/>
-		</mvc:interceptor>
-	</mvc:interceptors>
-
-	<mvc:default-servlet-handler />
+	<context:component-scan base-package="cz.muni.ics" />
 
 	<!-- Bean to hold configuration properties -->
 	<import resource="server-config.xml" />
@@ -122,186 +34,6 @@
 	<!-- Import the data context -->
 	<import resource="data-context.xml" />
 
-	<!-- SPEL processors -->
-	<security:global-method-security pre-post-annotations="enabled" proxy-target-class="true" authentication-manager-ref="authenticationManager">
-		<!--you could also wire in the expression handler up at the layer of the http filters. See https://jira.springsource.org/browse/SEC-1452 -->
-		<security:expression-handler ref="oauthExpressionHandler" />
-	</security:global-method-security>
-
-	<oauth:expression-handler id="oauthExpressionHandler" />
-
-	<oauth:web-expression-handler id="oauthWebExpressionHandler" />
-
-	<bean id="mdcFilter" class="cz.muni.ics.mdc.MultiMDCFilter"/>
-
-	<!-- Spring Security configuration -->
-
-	<oauth:resource-server id="resourceServerFilter" token-services-ref="defaultOAuth2ProviderTokenService" stateless="false" />
-
-	<security:http pattern="/token" 
-		create-session="stateless"
-		authentication-manager-ref="clientAuthenticationManager"
-		entry-point-ref="oauthAuthenticationEntryPoint"
-		use-expressions="true">
-		
-		<security:intercept-url pattern="/token" access="permitAll" method="OPTIONS" /> <!-- allow OPTIONS calls without auth for CORS stuff -->
-		<security:intercept-url pattern="/token" access="isAuthenticated()" />
-		<security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
-		<!-- include this only if you need to authenticate clients via request parameters -->
-		<security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
-		<security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:access-denied-handler ref="oauthAccessDeniedHandler" />
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<!-- Allow open access to discovery endpoints -->
-	<security:http pattern="/#{T(cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint).URL}**" use-expressions="true" entry-point-ref="http403EntryPoint" create-session="stateless">
-		<security:intercept-url pattern="/#{T(cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint).URL}**" access="permitAll"/>
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-	<security:http pattern="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" use-expressions="true" entry-point-ref="http403EntryPoint" create-session="stateless">
-		<security:intercept-url pattern="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" access="permitAll"/>
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<!-- Allow open access to all static resources -->	
-	<security:http pattern="/resources/**" use-expressions="true" entry-point-ref="http403EntryPoint" create-session="stateless">
-		<security:intercept-url pattern="/resources/**" access="permitAll"/>
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-	
-	<!-- OAuth-protect API and other endpoints -->
-	<security:http pattern="/#{T(cz.muni.ics.openid.connect.web.DynamicClientRegistrationEndpoint).URL}/**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="stateless">
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:expression-handler ref="oauthWebExpressionHandler" />
-		<security:intercept-url pattern="/register/**" access="permitAll"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<security:http pattern="/#{T(cz.muni.ics.openid.connect.web.ProtectedResourceRegistrationEndpoint).URL}/**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="stateless">
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:expression-handler ref="oauthWebExpressionHandler" />
-		<security:intercept-url pattern="/resource/**" access="permitAll"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<security:http pattern="/#{T(cz.muni.ics.openid.connect.web.UserInfoEndpoint).URL}**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="stateless">
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:expression-handler ref="oauthWebExpressionHandler" />
-		<security:csrf disabled="true"/>
-	</security:http>
-
- 	<security:http pattern="/#{T(cz.muni.ics.openid.connect.web.RootController).API_URL}/**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="never">
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:expression-handler ref="oauthWebExpressionHandler" />
-		<security:csrf disabled="true"/>
-	</security:http>
-	
- 	<security:http pattern="#{T(cz.muni.ics.oauth2.web.DeviceEndpoint).ENDPOINT_URL}**"
- 		use-expressions="true" 
- 		entry-point-ref="oauthAuthenticationEntryPoint" 
- 		create-session="stateless"
- 		authentication-manager-ref="clientAuthenticationManager">
-		<security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
-		<!-- include this only if you need to authenticate clients via request parameters -->
-		<security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
-		<security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:access-denied-handler ref="oauthAccessDeniedHandler" />
-		<security:csrf disabled="true"/>
-	</security:http>
-	
-	<security:http pattern="/#{T(cz.muni.ics.oauth2.web.IntrospectionEndpoint).URL}**"
-			use-expressions="true" 
-			entry-point-ref="oauthAuthenticationEntryPoint" 
-			create-session="stateless"
-			authentication-manager-ref="clientAuthenticationManager">
-		<security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<security:http pattern="/#{T(cz.muni.ics.oauth2.web.RevocationEndpoint).URL}**"
-			use-expressions="true" 
-			entry-point-ref="oauthAuthenticationEntryPoint" 
-			create-session="stateless"
-			authentication-manager-ref="clientAuthenticationManager">
-		<security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
-		<security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
-		<security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
-		<security:custom-filter ref="mdcFilter" before="FIRST"/>
-		<security:csrf disabled="true"/>
-	</security:http>
-
-	<bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
-		<property name="realmName" value="openidconnect" />
-	</bean>
-
-	<bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />
-
-	<!-- Additional endpoints for extensions (such as UMA) -->
-	
-	<import resource="endpoint-config.xml" />
-
-	<!-- SECOAUTH Authorization Server -->
-
-	<import resource="authz-config.xml" />
-
-	<bean id="oauth2ExceptionTranslator" class="org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator" />
-
-	<bean id="clientAuthMatcher" class="cz.muni.ics.openid.connect.filter.MultiUrlRequestMatcher">
-		<constructor-arg name="filterProcessesUrls">
-			<set>
-				<value>/introspect</value>
-				<value>/revoke</value>
-				<value>/token</value>
-			</set>
-		</constructor-arg>
-	</bean>
-
-	<bean id="clientCredentialsEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
-		<property name="authenticationManager" ref="clientAuthenticationManager" />
-		<property name="requiresAuthenticationRequestMatcher" ref="clientAuthMatcher" />
-	</bean>
-	
-	<bean id="clientAssertionEndpointFilter" class="cz.muni.ics.openid.connect.assertion.JWTBearerClientAssertionTokenEndpointFilter">
-		<constructor-arg name="additionalMatcher" ref="clientAuthMatcher" />
-		<property name="authenticationManager" ref="clientAssertionAuthenticationManager" />
-	</bean>
-
-	<security:authentication-manager id="clientAuthenticationManager">
-		<security:authentication-provider user-service-ref="clientUserDetailsService" />
-		<security:authentication-provider user-service-ref="uriEncodedClientUserDetailsService" />
-	</security:authentication-manager>
-
-	<security:authentication-manager id="clientAssertionAuthenticationManager">
-		<security:authentication-provider ref="clientAssertionAuthenticationProvider" />
-	</security:authentication-manager>
-	
-	<bean id="clientAssertionAuthenticationProvider" class="cz.muni.ics.openid.connect.assertion.JWTBearerAuthenticationProvider" />
-
 	<!-- Configure locale information -->
 	<import resource="locale-config.xml" />
 
@@ -311,49 +43,15 @@
 	<!-- assertion processing -->
 	<import resource="assertion-config.xml" />
 
-	<!-- End Spring Security configuration -->
-
 	<!-- JPA -->
-
 	<import resource="jpa-config.xml" />
 
-	<!-- End JPA -->
-
 	<!-- Crypto -->
-
 	<import resource="crypto-config.xml" />
-
-	<!-- End Crypto -->
-
-	<!-- View configuration -->
-
-	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
-		up static resources in the ${webappRoot}/resources directory -->
-	<mvc:resources mapping="/resources/**" location="/resources/" />
-
-	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
-		in the /WEB-INF/views directory -->
-	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
-		<property name="prefix" value="/WEB-INF/views/" />
-		<property name="suffix" value=".jsp" />
-		<property name="order" value="2" />
-	</bean>
-
-	<!-- Resolve views based on string names -->
-	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
-		<property name="order" value="1" />
-	</bean>
-
-	<!-- End view configuration -->
-
-	<!--Import scheduled task configuration -->
-	<import resource="task-config.xml" />
 	
 	<!-- Import configuration for front-end (JavaScript) UI components -->
 	<import resource="ui-config.xml" />
 
-	<!-- import application-local configuration information (such as bean definitions) -->
-	<import resource="local-config.xml" />
+	<import resource="web-context.xml" />
 
 </beans>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/authz-config.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/authz-config.xml
deleted file mode 100644
index 4ca0109b9..000000000
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/authz-config.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Copyright 2018 The MIT Internet Trust Consortium
-   
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-   
-      http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
- -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:mvc="http://www.springframework.org/schema/mvc"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:tx="http://www.springframework.org/schema/tx"
-	xmlns:context="http://www.springframework.org/schema/context"
-	xmlns:security="http://www.springframework.org/schema/security"
-	xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
-	xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
-		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
-		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
-		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
-		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
-
-
-	<oauth:authorization-server 
-		client-details-service-ref="defaultOAuth2ClientDetailsEntityService"
-		authorization-request-manager-ref="connectOAuth2RequestFactory" 
-		token-services-ref="defaultOAuth2ProviderTokenService" 
-		user-approval-handler-ref="tofuUserApprovalHandler" 
-		request-validator-ref="oauthRequestValidator"
-		redirect-resolver-ref="blacklistAwareRedirectResolver"
-		authorization-endpoint-url="/authorize" 
-		token-endpoint-url="/token"
-		error-page="/error">
-		
-		<oauth:authorization-code authorization-code-services-ref="defaultOAuth2AuthorizationCodeService"/>
-		<oauth:implicit/>
-		<oauth:refresh-token/>
-		<oauth:client-credentials/>
-		<oauth:custom-grant token-granter-ref="chainedTokenGranter" />
-		<oauth:custom-grant token-granter-ref="jwtAssertionTokenGranter" />
-		<oauth:custom-grant token-granter-ref="deviceTokenGranter" />
-
-	</oauth:authorization-server>
-
-	<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
-
-	<bean id="oauthRequestValidator" class="cz.muni.ics.oauth2.token.ScopeServiceAwareOAuth2RequestValidator" />
-
-	<!-- Error page handler. -->
-	<mvc:view-controller path="/error" view-name="error" />
-
-</beans>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/endpoint-config.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/endpoint-config.xml
deleted file mode 100644
index 44390d5de..000000000
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/endpoint-config.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Copyright 2018 The MIT Internet Trust Consortium
-   
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-   
-      http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
- -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:mvc="http://www.springframework.org/schema/mvc"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:tx="http://www.springframework.org/schema/tx"
-	xmlns:context="http://www.springframework.org/schema/context"
-	xmlns:security="http://www.springframework.org/schema/security"
-	xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
-	xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
-		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
-		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
-		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
-		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
-
-
-	<security:http pattern="/devicecodeMFA/**"
-				   use-expressions="true"
-				   entry-point-ref="oauthAuthenticationEntryPoint"
-				   create-session="stateless"
-				   authentication-manager-ref="clientAuthenticationManager">
-		<security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
-		<!-- include this only if you need to authenticate clients via request parameters -->
-		<security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
-		<security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
-		<security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
-		<security:access-denied-handler ref="oauthAccessDeniedHandler" />
-		<security:csrf disabled="true"/>
-	</security:http>
-
-</beans>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/local-config.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/local-config.xml
deleted file mode 100644
index 3e5fef8e8..000000000
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/local-config.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Copyright 2018 The MIT Internet Trust Consortium
-   
-    Portions copyright 2011-2013 The MITRE Corporation
-   
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-   
-      http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
- -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:mvc="http://www.springframework.org/schema/mvc"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:tx="http://www.springframework.org/schema/tx"
-	xmlns:context="http://www.springframework.org/schema/context"
-	xmlns:security="http://www.springframework.org/schema/security"
-	xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
-	xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
-		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
-		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
-		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
-		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
-		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
-
-
-<!-- Empty: Override this file in your local project to change configuration options. -->
-
-</beans>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/task-config.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/task-config.xml
deleted file mode 100644
index 4719b08e3..000000000
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/task-config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Copyright 2018 The MIT Internet Trust Consortium
-   
-    Portions copyright 2011-2013 The MITRE Corporation
-   
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-   
-      http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
- -->
-<beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:task="http://www.springframework.org/schema/task"
-	xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
-		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
-
-</beans>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/user-context.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/user-context.xml
index 0ef67be68..9441f224a 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/user-context.xml
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/user-context.xml
@@ -73,8 +73,6 @@
 				<prop key="saml.idp.defaultIdpEntityId"/>
 				<prop key="saml.idp.metadataLocation"/> <!-- i.e. /etc/perun/login-cesnet-metadata.xml -->
 				<prop key="saml.idp.metadataUrl"/> <!-- i.e. https://login.cesnet.cz/proxy/module.php/metadata -->
-				<prop key="saml.proxy.spEntityId"/>
-				<prop key="saml.internalReferrers"/> <!-- comma separated list of URLs (which are matched as prefixes) -->
 				<prop key="saml.acrs.reserverdPrefixes">urn:cesnet:</prop>
 				<prop key="saml.acrs.enableComparison">false</prop>
 				<prop key="saml.acrs.onlyreserved.append">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</prop>
@@ -474,295 +472,6 @@
 		<property name="testSpAttr" value="testSp" />
 	</bean>
 
-	<!-- authentication -->
-
-	<!--suppress SpringXmlModelInspection -->
-	<security:http auto-config="false"
-				   use-expressions="true"
-				   entry-point-ref="samlEntryPoint"
-				   create-session="always"
-				   authentication-manager-ref="authenticationManager">
-		<security:csrf disabled="true"/>
-		<security:intercept-url pattern="/saml/**" access="permitAll()"/>
-		<security:intercept-url pattern="/logout" access="permitAll()"/>
-		<security:intercept-url pattern="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}" access="permitAll()"/>
-		<security:intercept-url pattern="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}" access="permitAll()"/>
-		<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
-		<security:custom-filter ref="mdcMuFilter" before="FIRST"/>
-		<security:custom-filter ref="metadataGeneratorFilter" before="CHANNEL_FILTER"/>
-		<security:custom-filter ref="clearSessionFilter" after="CHANNEL_FILTER"/>
-		<security:custom-filter ref="samlFilter" before="CSRF_FILTER"/>
-		<security:custom-filter ref="samlFilter" after="BASIC_AUTH_FILTER"/>
-		<security:custom-filter ref="callPerunFiltersFilter" before="LAST"/>
-		<security:logout logout-url="/saml/logout"/>
-	</security:http>
-
-	<security:authentication-manager id="authenticationManager">
-		<security:authentication-provider ref="authenticationProvider"/>
-	</security:authentication-manager>
-
-	<bean id="mdcMuFilter" class="cz.muni.ics.oidc.server.filters.impl.MultiMDCFilter"/>
-
-	<!-- SAML -->
-
-	<bean id="clearSessionFilter" class="cz.muni.ics.oidc.saml.SamlInvalidateSessionFilter">
-		<constructor-arg name="oidcIssuer" value="${main.oidc.issuer.url}"/>
-		<constructor-arg name="idpEntityId" value="${saml.idp.defaultIdpEntityId}"/>
-		<constructor-arg name="proxySpEntityId" value="${saml.proxy.spEntityId}"/>
-		<constructor-arg name="internalReferrers" value="#{'${saml.internalReferrers}'.split('\s*,\s*')}"/>
-		<constructor-arg name="contextLogoutHandler" ref="logoutHandler"/>
-	</bean>
-
-	<bean id="samlDiscovery" class="org.springframework.security.saml.SAMLDiscovery">
-		<property name="contextProvider" ref="samlContextProvider"/>
-		<property name="samlEntryPoint" ref="samlEntryPoint"/>
-		<property name="metadata" ref="metadata"/>
-	</bean>
-
-	<bean id="successRedirectHandler" class="cz.muni.ics.oidc.saml.PerunSamlAuthenticationSuccessHandler">
-		<property name="defaultTargetUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_SUCCESS}"/>
-	</bean>
-
-	<bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
-		<property name="defaultFailureUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}"/>
-		<property name="useForward" value="true"/>
-	</bean>
-
-	<bean id="successLogoutHandler" class="cz.muni.ics.oidc.saml.PerunOidcLogoutSuccessHandler">
-		<property name="defaultTargetUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}"/>
-		<property name="targetUrlParameter" value="#{T(cz.muni.ics.oidc.server.filters.PerunFilterConstants).PARAM_TARGET}"/>
-	</bean>
-
-	<bean id="logoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
-		<property name="clearAuthentication" value="true"/>
-		<property name="invalidateHttpSession" value="true"/>
-	</bean>
-
-	<bean id="samlLogoutProcessingFilter" class="org.springframework.security.saml.SAMLLogoutProcessingFilter">
-		<constructor-arg name="logoutSuccessHandler" ref="successLogoutHandler"/>
-		<constructor-arg name="handlers" ref="logoutHandler"/>
-	</bean>
-
-	<bean id="samlLogoutFilter" class="org.springframework.security.saml.SAMLLogoutFilter">
-		<constructor-arg name="logoutSuccessHandler" ref="successLogoutHandler"/>
-		<constructor-arg name="localHandler" ref="logoutHandler"/>
-		<constructor-arg name="globalHandlers" ref="logoutHandler"/>
-	</bean>
-
-	<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
-		<constructor-arg name="storeFile">
-			<bean class="org.springframework.core.io.FileSystemResource">
-				<constructor-arg name="path" value="${saml.keystore.location}"/>
-			</bean>
-		</constructor-arg>
-		<constructor-arg name="storePass" value="${saml.keystore.password}"/>
-		<constructor-arg name="passwords">
-			<map>
-				<entry key="${saml.keystore.defaultKey}" value="${saml.keystore.defaultKeyPass}"/>
-			</map>
-		</constructor-arg>
-		<constructor-arg name="defaultKey" value="${saml.keystore.defaultKey}"/>
-	</bean>
-
-	<bean id="extendedMetadata" class="org.springframework.security.saml.metadata.ExtendedMetadata">
-		<property name="idpDiscoveryEnabled" value="false"/>
-	</bean>
-
-	<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
-		<constructor-arg name="generator">
-			<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
-				<property name="includeDiscoveryExtension" value="false"/>
-				<property name="entityId" value="${saml.entityID}"/>
-				<property name="extendedMetadata" ref="extendedMetadata"/>
-				<property name="wantAssertionSigned" value="true"/>
-				<property name="requestSigned" value="true"/>
-			</bean>
-		</constructor-arg>
-		<property name="normalizeBaseUrl" value="true"/>
-	</bean>
-
-	<bean id="metadataDisplayFilter" class="org.springframework.security.saml.metadata.MetadataDisplayFilter"/>
-
-	<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
-		<property name="defaultIDP" value="${saml.idp.defaultIdpEntityId}"/>
-		<property name="refreshCheckInterval" value="3600000"/>
-		<property name="refreshRequired" value="true"/>
-		<constructor-arg name="providers">
-			<list>
-				<ref bean="idpMetadata"/>
-			</list>
-		</constructor-arg>
-	</bean>
-
-	<bean id="parserPool" class="org.opensaml.xml.parse.StaticBasicParserPool" init-method="initialize"/>
-
-	<bean id="parserPoolHolder" class="org.springframework.security.saml.parser.ParserPoolHolder"/>
-
-	<bean id="processor" class="org.springframework.security.saml.processor.SAMLProcessorImpl">
-		<constructor-arg name="bindings">
-			<list>
-				<bean id="httpPostBinding" class="org.springframework.security.saml.processor.HTTPPostBinding">
-					<constructor-arg name="parserPool" ref="parserPool"/>
-					<constructor-arg name="encoder">
-						<bean class="cz.muni.ics.oidc.saml.PerunPostEncoder">
-							<constructor-arg name="engine" value="#{T(org.springframework.security.saml.util.VelocityFactory).getEngine()}"/>
-							<constructor-arg name="templateId" value="/templates/saml2-post-binding.vm"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="decoder">
-						<bean class="org.opensaml.saml2.binding.decoding.HTTPPostDecoder">
-							<constructor-arg name="pool" ref="parserPool"/>
-						</bean>
-					</constructor-arg>
-				</bean>
-				<bean id="httpRedirectDeflateBinding" class="org.springframework.security.saml.processor.HTTPRedirectDeflateBinding">
-					<constructor-arg name="encoder">
-						<bean class="cz.muni.ics.oidc.saml.PerunHTTPRedirectDeflateEncoder"/>
-					</constructor-arg>
-					<constructor-arg name="decoder">
-						<bean class="org.opensaml.saml2.binding.decoding.HTTPRedirectDeflateDecoder">
-							<constructor-arg name="pool" ref="parserPool"/>
-						</bean>
-					</constructor-arg>
-				</bean>
-			</list>
-		</constructor-arg>
-	</bean>
-
-	<bean id="samlWebSSOProcessingFilter" class="org.springframework.security.saml.SAMLProcessingFilter">
-		<property name="authenticationManager" ref="authenticationManager"/>
-		<property name="authenticationSuccessHandler" ref="successRedirectHandler"/>
-		<property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
-	</bean>
-
-	<bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy">
-		<constructor-arg name="filterChains">
-			<list>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-							<constructor-arg name="pattern"
-											 value="#{T(org.springframework.security.saml.metadata.MetadataDisplayFilter).FILTER_URL}/**"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="metadataDisplayFilter"/>
-						</list>
-					</constructor-arg>
-				</bean>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-							<constructor-arg name="pattern"
-											 value="#{T(org.springframework.security.saml.SAMLProcessingFilter).FILTER_URL}"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="samlWebSSOProcessingFilter"/>
-						</list>
-					</constructor-arg>
-				</bean>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-							<constructor-arg name="pattern"
-											 value="#{T(org.springframework.security.saml.SAMLDiscovery).FILTER_URL}"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="samlDiscovery"/>
-						</list>
-					</constructor-arg>
-				</bean>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-							<constructor-arg name="pattern"
-											 value="#{T(org.springframework.security.saml.SAMLEntryPoint).FILTER_URL}"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="samlEntryPoint"/>
-						</list>
-					</constructor-arg>
-				</bean>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.OrRequestMatcher">
-							<constructor-arg name="requestMatchers">
-								<list>
-									<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-										<constructor-arg name="pattern"
-														 value="#{T(org.springframework.security.saml.SAMLLogoutFilter).FILTER_URL}"/>
-									</bean>
-									<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-										<constructor-arg name="pattern" value="/logout"/>
-									</bean>
-								</list>
-							</constructor-arg>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="samlLogoutFilter"/>
-						</list>
-					</constructor-arg>
-				</bean>
-				<bean class="org.springframework.security.web.DefaultSecurityFilterChain">
-					<constructor-arg name="requestMatcher">
-						<bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
-							<constructor-arg name="pattern" value="#{T(org.springframework.security.saml.SAMLLogoutProcessingFilter).FILTER_URL}/**"/>
-						</bean>
-					</constructor-arg>
-					<constructor-arg name="filters">
-						<list>
-							<ref bean="samlLogoutProcessingFilter"/>
-						</list>
-					</constructor-arg>
-				</bean>
-			</list>
-		</constructor-arg>
-	</bean>
-
-	<bean id="webSSOProfileOptions" class="org.springframework.security.saml.websso.WebSSOProfileOptions">
-		<property name="includeScoping" value="false"/>
-	</bean>
-
-	<bean id="samlEntryPoint" class="cz.muni.ics.oidc.saml.PerunSamlEntryPoint">
-		<property name="defaultProfileOptions" ref="webSSOProfileOptions"/>
-	</bean>
-
-	<bean id="samlContextProvider" class="org.springframework.security.saml.context.SAMLContextProviderImpl"/>
-
-	<bean id="samlLogger" class="org.springframework.security.saml.log.SAMLDefaultLogger">
-		<property name="logMessagesOnException" value="true"/>
-		<property name="logErrors" value="true"/>
-	</bean>
-
-	<bean id="singleLogoutProfile" class="org.springframework.security.saml.websso.SingleLogoutProfileImpl"/>
-
-	<bean id="webSSOprofileConsumer" class="cz.muni.ics.oidc.saml.PerunWebSSOProfileConsumerImpl">
-		<property name="enableComparison" value="${saml.acrs.enableComparison}"/>
-		<property name="reservedPrefixes" value="#{'${saml.acrs.reserverdPrefixes}'.split('\s*,\s*')}"/>
-		<property name="maxAuthenticationAge" value="360"/>
-	</bean>
-
-	<bean id="webSSOprofile" class="org.springframework.security.saml.websso.WebSSOProfileImpl"/>
-
-	<bean id="hokWebSSOprofileConsumer" class="org.springframework.security.saml.websso.WebSSOProfileConsumerHoKImpl"/>
-
-	<bean id="samlUserDetailsService" class="cz.muni.ics.oidc.saml.PerunSamlUserDetailsService"/>
-
-	<bean id="authenticationProvider" class="cz.muni.ics.oidc.saml.PerunSamlAuthenticationProvider">
-		<constructor-arg name="adminIds" value="#{'${admins}'.split('\s*,\s*')}"/>
-	</bean>
-
-	<bean class="org.springframework.security.saml.SAMLBootstrap"/>
-
 	<!-- END SAML -->
 
 	<bean id="accessTokenClaimsModifier" class="${accessTokenClaimsModifier}"/>
@@ -778,7 +487,7 @@
 
 	<bean id="oidcTokenService" class="cz.muni.ics.oidc.server.PerunOIDCTokenService" primary="true"/>
 
-	<bean id="callPerunFiltersFilter" class="cz.muni.ics.oidc.server.filters.CallPerunFiltersFilter"/>
+	<bean id="authProcFilters" class="cz.muni.ics.oidc.server.filters.AuthProcFiltersContainer"/>
 
 	<bean id="htmlClasses" class="cz.muni.ics.oidc.web.WebHtmlClasses">
 		<constructor-arg name="perunOidcConfig" ref="perunOidcConfig"/>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approve.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approve.jsp
index 32e2a3dba..9c6a74347 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approve.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approve.jsp
@@ -37,7 +37,7 @@
 		</h1>
 
 		<form name="confirmationForm"
-			action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }authorize" method="post">
+			action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }auth/authorize" method="post">
 
 			<div class="row">
 				<div class="span5 offset1 well-small" style="text-align: left">
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
index 4a5462ba5..dbcdc1108 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/approveDevice.jsp
@@ -37,7 +37,7 @@
 		</h1>
 
 		<form name="confirmationForm"
-			action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }device/approved" method="post">
+			action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }auth/device/approved" method="post">
 
 			<div class="row">
 				<div class="span5 offset1 well-small" style="text-align: left">
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/requestUserCode.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/requestUserCode.jsp
index df4dd18e2..94d1eaae7 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/requestUserCode.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/requestUserCode.jsp
@@ -39,7 +39,7 @@
 	</c:if>
 
 
-		<form action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }device/code" method="POST">
+		<form action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }auth/device" method="POST">
 
 			<div class="row-fluid">
 				<div class="span12">
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApprove.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApprove.jsp
index 8aead87e5..1ba620d71 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApprove.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApprove.jsp
@@ -30,7 +30,7 @@
 <div id="content">
 	<c:remove scope="session" var="SPRING_SECURITY_LAST_EXCEPTION" />
 	<form name="confirmationForm" method="post" action="${pageContext.request.contextPath.endsWith('/') ?
-		   pageContext.request.contextPath : pageContext.request.contextPath.concat('/')}authorize">
+		   pageContext.request.contextPath : pageContext.request.contextPath.concat('/')}auth/authorize">
 		<p>
 			<c:if test="${not empty client.policyUri}">
 				<spring:message code="consent_privacy_policy"/>${" "}
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApproveDevice.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApproveDevice.jsp
index 80b75a830..329c74fb6 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApproveDevice.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedApproveDevice.jsp
@@ -33,7 +33,7 @@
 <div id="content">
     <c:remove scope="session" var="SPRING_SECURITY_LAST_EXCEPTION" />
         <form name="confirmationForm"
-              action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }device/approved" method="post">
+              action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }auth/device/approved" method="post">
             <p>
                 <c:if test="${not empty client.policyUri}">
                     <spring:message code="device_approve_privacy"/>${" "}<a target='_blank' href='${fn:escapeXml(client.policyUri)}'><em>${fn:escapeXml(client.clientName)}</em></a>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedRequestUserCode.jsp b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedRequestUserCode.jsp
index b3130f9f8..9b3ab9611 100644
--- a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedRequestUserCode.jsp
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/views/themedRequestUserCode.jsp
@@ -52,7 +52,7 @@
     </c:choose>
 
     <form name="confirmationForm" class="mt-2"  method="POST"
-          action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }device/code">
+          action="${ config.issuer }${ config.issuer.endsWith('/') ? '' : '/' }auth/device">
         <div class="row-fluid">
             <div class="span12">
                 <div>
diff --git a/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml
new file mode 100644
index 000000000..1c8371d42
--- /dev/null
+++ b/perun-oidc-server-webapp/src/main/webapp/WEB-INF/web-context.xml
@@ -0,0 +1,634 @@
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xmlns:security="http://www.springframework.org/schema/security"
+       xmlns:oauth="http://www.springframework.org/schema/security/oauth2"
+       xsi:schemaLocation="http://www.springframework.org/schema/security/oauth2
+		 http://www.springframework.org/schema/security/spring-security-oauth2-2.0.xsd
+		 http://www.springframework.org/schema/mvc
+		 http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
+		 http://www.springframework.org/schema/security
+		 http://www.springframework.org/schema/security/spring-security-4.2.xsd
+		 http://www.springframework.org/schema/beans
+		 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
+		 http://www.springframework.org/schema/tx
+		 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
+
+    <bean id="userInfoInterceptor" class="cz.muni.ics.openid.connect.web.interceptor.UserInfoInterceptor" />
+    <bean id="serverConfigInterceptor" class="cz.muni.ics.openid.connect.web.interceptor.ServerConfigInterceptor" />
+    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
+        <property name="paramName" value="lang"/>
+    </bean>
+
+    <!-- Enables the Spring MVC @Controller programming model -->
+    <tx:annotation-driven />
+
+    <bean id="mdcFilter" class="cz.muni.ics.mdc.MultiMDCFilter"/>
+
+    <!-- MVC -->
+
+    <!-- Error page handler. -->
+    <mvc:view-controller path="/error" view-name="error" />
+
+    <mvc:annotation-driven ignore-default-model-on-redirect="true">
+        <mvc:message-converters>
+            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
+            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
+        </mvc:message-converters>
+    </mvc:annotation-driven>
+
+    <mvc:interceptors>
+        <mvc:interceptor>
+            <mvc:mapping path="/**"/>
+            <ref bean="localeChangeInterceptor"/>
+        </mvc:interceptor>
+        <mvc:interceptor>
+            <!-- Exclude APIs and other machine-facing endpoints from these interceptors -->
+            <mvc:mapping path="/**" />
+            <mvc:exclude-mapping path="/token**"/>
+            <mvc:exclude-mapping path="/resources/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.DynamicClientRegistrationEndpoint).URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.ProtectedResourceRegistrationEndpoint).URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.UserInfoEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.controller.GuiController).API_URL}/**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).ENDPOINT_URL}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).REQUEST_USER_CODE_URL}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).REQUEST_USER_CODE_INIT_URL}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).DEVICE_APPROVED_URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.endpoint.IntrospectionEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.endpoint.RevocationEndpoint).URL}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.IsTestSpController).MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.AupController).URL}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_AUTHORIZATION}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_ENSURE_VO_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_IS_CESNET_ELIGIBLE_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_MANDATORY_VOS_GROUPS}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_PROD_VOS_GROUPS}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_IN_TEST_VOS_GROUPS}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_NOT_LOGGED_IN}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedController).UNAPPROVED_SPECIFIC_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_CONTINUE_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_FORM_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.PerunUnapprovedRegistrationController).REGISTRATION_FORM_SUBMIT_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.RegistrationController).CONTINUE_DIRECT_MAPPING}**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}" />
+            <mvc:exclude-mapping path="/saml**" />
+            <!-- Inject the UserInfo into the response -->
+            <ref bean="userInfoInterceptor" />
+        </mvc:interceptor>
+        <mvc:interceptor>
+            <!-- Exclude APIs and other machine-facing endpoints from these interceptors -->
+            <mvc:mapping path="/**" />
+            <mvc:exclude-mapping path="/token**"/>
+            <mvc:exclude-mapping path="/resources/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.DynamicClientRegistrationEndpoint).URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.ProtectedResourceRegistrationEndpoint).URL}/**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.endpoint.UserInfoEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.openid.connect.web.controller.GuiController).API_URL}/**" />
+            <mvc:exclude-mapping path="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).ENDPOINT_URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.endpoint.IntrospectionEndpoint).URL}**" />
+            <mvc:exclude-mapping path="/#{T(cz.muni.ics.oauth2.web.endpoint.RevocationEndpoint).URL}**" />
+            <!-- Inject the server configuration into the response -->
+            <ref bean="serverConfigInterceptor"/>
+        </mvc:interceptor>
+    </mvc:interceptors>
+
+    <!-- Handles HTTP GET requests for /resources/** by efficiently serving
+    up static resources in the ${webappRoot}/resources directory -->
+    <mvc:resources mapping="/resources/**" location="/resources/" />
+
+    <mvc:default-servlet-handler />
+
+    <!-- SECURITY -->
+
+    <!-- SPEL processor -->
+    <security:global-method-security pre-post-annotations="enabled"
+                                     proxy-target-class="true"
+                                     authentication-manager-ref="authenticationManager">
+        <security:expression-handler ref="oauthExpressionHandler" />
+    </security:global-method-security>
+
+    <!-- Token endpoint -->
+    <security:http pattern="/token"
+                   create-session="stateless"
+                   authentication-manager-ref="clientAuthenticationManager"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   use-expressions="true">
+        <security:intercept-url pattern="/token" access="permitAll" method="OPTIONS" /> <!-- allow OPTIONS calls without auth for CORS stuff -->
+        <security:intercept-url pattern="/token" access="isAuthenticated()" />
+        <security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
+        <!-- include this only if you need to authenticate clients via request parameters -->
+        <security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
+        <security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- Userinfo endpoint -->
+    <security:http pattern="/#{T(cz.muni.ics.openid.connect.web.endpoint.UserInfoEndpoint).URL}**"
+                   use-expressions="true"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   create-session="stateless">
+        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:expression-handler ref="oauthWebExpressionHandler" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- Introspection endpoint -->
+    <security:http pattern="/#{T(cz.muni.ics.oauth2.web.endpoint.IntrospectionEndpoint).URL}**"
+                   use-expressions="true"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   create-session="stateless"
+                   authentication-manager-ref="clientAuthenticationManager">
+        <security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
+        <security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- Revocation endpoint -->
+    <security:http pattern="/#{T(cz.muni.ics.oauth2.web.endpoint.RevocationEndpoint).URL}**"
+                   use-expressions="true"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   create-session="stateless"
+                   authentication-manager-ref="clientAuthenticationManager">
+        <security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
+        <security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- Device endpoint -->
+    <security:http pattern="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).ENDPOINT_URL}**"
+                   use-expressions="true"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   create-session="stateless"
+                   authentication-manager-ref="clientAuthenticationManager">
+        <security:http-basic entry-point-ref="oauthAuthenticationEntryPoint" />
+        <!-- include this only if you need to authenticate clients via request parameters -->
+        <security:custom-filter ref="clientAssertionEndpointFilter" after="PRE_AUTH_FILTER" /> <!-- this one has to go first -->
+        <security:custom-filter ref="clientCredentialsEndpointFilter" after="BASIC_AUTH_FILTER" />
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:access-denied-handler ref="oauthAccessDeniedHandler" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- JWK endpoint -->
+    <security:http pattern="/#{T(cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint).URL}**"
+                   use-expressions="true"
+                   entry-point-ref="http403EntryPoint"
+                   create-session="stateless">
+        <security:intercept-url pattern="/#{T(cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint).URL}**" access="permitAll"/>
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- Well-known -->
+    <security:http pattern="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**"
+                   use-expressions="true"
+                   entry-point-ref="http403EntryPoint"
+                   create-session="stateless">
+        <security:intercept-url pattern="/#{T(cz.muni.ics.discovery.web.DiscoveryEndpoint).WELL_KNOWN_URL}/**" access="permitAll"/>
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!--Static resources -->
+    <security:http pattern="/resources/**"
+                   use-expressions="true"
+                   entry-point-ref="http403EntryPoint"
+                   create-session="stateless">
+        <security:intercept-url pattern="/resources/**" access="permitAll"/>
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <!-- GUI -->
+    <security:http pattern="/#{T(cz.muni.ics.openid.connect.web.controller.GuiController).API_URL}/**"
+                   use-expressions="true"
+                   entry-point-ref="oauthAuthenticationEntryPoint"
+                   create-session="never">
+        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
+        <security:custom-filter ref="mdcFilter" before="FIRST"/>
+        <security:expression-handler ref="oauthWebExpressionHandler" />
+        <security:csrf disabled="true"/>
+    </security:http>
+
+    <security:http auto-config="false"
+                   use-expressions="true"
+                   entry-point-ref="samlEntryPoint"
+                   create-session="always"
+                   authentication-manager-ref="authenticationManager">
+        <security:csrf disabled="true"/>
+        <security:intercept-url pattern="#{T(cz.muni.ics.oauth2.web.endpoint.AuthorizationEndpoint).ENDPOINT_INIT_URL}"
+                                access="permitAll()"/>
+        <security:intercept-url pattern="#{T(cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint).REQUEST_USER_CODE_INIT_URL}"
+                                access="permitAll()"/>
+        <security:intercept-url pattern="/saml/**" access="permitAll()"/>
+        <security:intercept-url pattern="/logout" access="permitAll()"/>
+        <security:intercept-url pattern="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}"
+                                access="permitAll()"/>
+        <security:intercept-url pattern="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}"
+                                access="permitAll()"/>
+        <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
+        <security:custom-filter ref="mdcMuFilter" before="FIRST"/>
+        <security:custom-filter ref="metadataGeneratorFilter" before="CHANNEL_FILTER"/>
+        <security:custom-filter ref="clearSessionFilter" after="CHANNEL_FILTER"/>
+        <security:custom-filter ref="samlFilter" before="CSRF_FILTER"/>
+        <security:custom-filter ref="samlFilter" after="BASIC_AUTH_FILTER"/>
+        <security:custom-filter ref="authProcFilters" before="LAST"/>
+        <security:logout logout-url="/saml/logout"/>
+    </security:http>
+
+    <security:authentication-manager id="clientAuthenticationManager">
+        <security:authentication-provider user-service-ref="clientUserDetailsService" />
+        <security:authentication-provider user-service-ref="uriEncodedClientUserDetailsService" />
+    </security:authentication-manager>
+
+    <security:authentication-manager id="clientAssertionAuthenticationManager">
+        <security:authentication-provider ref="clientAssertionAuthenticationProvider" />
+    </security:authentication-manager>
+
+    <security:authentication-manager id="authenticationManager">
+        <security:authentication-provider ref="authenticationProvider"/>
+    </security:authentication-manager>
+
+    <!-- Dynamic registration endpoint -->
+<!--    <security:http pattern="/#{T(cz.muni.ics.openid.connect.web.endpoint.DynamicClientRegistrationEndpoint).URL}/**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="stateless">-->
+<!--        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />-->
+<!--        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />-->
+<!--        <security:custom-filter ref="mdcFilter" before="FIRST"/>-->
+<!--        <security:expression-handler ref="oauthWebExpressionHandler" />-->
+<!--        <security:intercept-url pattern="/register/**" access="permitAll"/>-->
+<!--        <security:csrf disabled="true"/>-->
+<!--    </security:http>-->
+
+<!--    <security:http pattern="/#{T(cz.muni.ics.openid.connect.web.endpoint.ProtectedResourceRegistrationEndpoint).URL}/**" use-expressions="true" entry-point-ref="oauthAuthenticationEntryPoint" create-session="stateless">-->
+<!--        <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />-->
+<!--        <security:custom-filter ref="corsFilter" after="SECURITY_CONTEXT_FILTER" />-->
+<!--        <security:custom-filter ref="mdcFilter" before="FIRST"/>-->
+<!--        <security:expression-handler ref="oauthWebExpressionHandler" />-->
+<!--        <security:intercept-url pattern="/resource/**" access="permitAll"/>-->
+<!--        <security:csrf disabled="true"/>-->
+<!--    </security:http>-->
+
+    <bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
+        <property name="realmName" value="openidconnect" />
+    </bean>
+
+    <bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />
+
+    <bean id="oauth2ExceptionTranslator" class="org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator" />
+
+    <bean id="clientAuthMatcher" class="cz.muni.ics.openid.connect.filter.MultiUrlRequestMatcher">
+        <constructor-arg name="filterProcessesUrls">
+            <set>
+                <value>/introspect</value>
+                <value>/revoke</value>
+                <value>/token</value>
+            </set>
+        </constructor-arg>
+    </bean>
+
+    <bean id="clientCredentialsEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
+        <property name="authenticationManager" ref="clientAuthenticationManager" />
+        <property name="requiresAuthenticationRequestMatcher" ref="clientAuthMatcher" />
+    </bean>
+
+    <bean id="clientAssertionEndpointFilter" class="cz.muni.ics.openid.connect.assertion.JWTBearerClientAssertionTokenEndpointFilter">
+        <constructor-arg name="additionalMatcher" ref="clientAuthMatcher" />
+        <property name="authenticationManager" ref="clientAssertionAuthenticationManager" />
+    </bean>
+
+    <bean id="clientAssertionAuthenticationProvider" class="cz.muni.ics.openid.connect.assertion.JWTBearerAuthenticationProvider" />
+
+    <!-- Resolves views selected for rendering by @Controllers to .jsp resources
+        in the /WEB-INF/views directory -->
+    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
+        <property name="prefix" value="/WEB-INF/views/" />
+        <property name="suffix" value=".jsp" />
+        <property name="order" value="2" />
+    </bean>
+
+    <!-- Resolve views based on string names -->
+    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
+        <property name="order" value="1" />
+    </bean>
+
+    <bean id="mdcMuFilter" class="cz.muni.ics.oidc.server.filters.impl.MultiMDCFilter"/>
+
+    <!-- SAML -->
+    <bean id="clearSessionFilter" class="cz.muni.ics.oidc.saml.SamlInvalidateSessionFilter">
+        <constructor-arg name="contextLogoutHandler" ref="logoutHandler"/>
+    </bean>
+
+    <bean id="samlDiscovery" class="org.springframework.security.saml.SAMLDiscovery">
+        <property name="contextProvider" ref="samlContextProvider"/>
+        <property name="samlEntryPoint" ref="samlEntryPoint"/>
+        <property name="metadata" ref="metadata"/>
+    </bean>
+
+    <bean id="successRedirectHandler" class="cz.muni.ics.oidc.saml.PerunSamlAuthenticationSuccessHandler">
+        <property name="defaultTargetUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_SUCCESS}"/>
+    </bean>
+
+    <bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
+        <property name="defaultFailureUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LoginController).MAPPING_FAILURE}"/>
+        <property name="useForward" value="true"/>
+    </bean>
+
+    <bean id="successLogoutHandler" class="cz.muni.ics.oidc.saml.PerunOidcLogoutSuccessHandler">
+        <property name="defaultTargetUrl" value="#{T(cz.muni.ics.oidc.web.controllers.LogoutController).MAPPING_SUCCESS}"/>
+        <property name="targetUrlParameter" value="#{T(cz.muni.ics.oidc.server.filters.PerunFilterConstants).PARAM_TARGET}"/>
+    </bean>
+
+    <bean id="logoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
+        <property name="clearAuthentication" value="true"/>
+        <property name="invalidateHttpSession" value="true"/>
+    </bean>
+
+    <bean id="samlLogoutProcessingFilter" class="org.springframework.security.saml.SAMLLogoutProcessingFilter">
+        <constructor-arg name="logoutSuccessHandler" ref="successLogoutHandler"/>
+        <constructor-arg name="handlers" ref="logoutHandler"/>
+    </bean>
+
+    <bean id="samlLogoutFilter" class="org.springframework.security.saml.SAMLLogoutFilter">
+        <constructor-arg name="logoutSuccessHandler" ref="successLogoutHandler"/>
+        <constructor-arg name="localHandler" ref="logoutHandler"/>
+        <constructor-arg name="globalHandlers" ref="logoutHandler"/>
+    </bean>
+
+    <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
+        <constructor-arg name="storeFile">
+            <bean class="org.springframework.core.io.FileSystemResource">
+                <constructor-arg name="path" value="${saml.keystore.location}"/>
+            </bean>
+        </constructor-arg>
+        <constructor-arg name="storePass" value="${saml.keystore.password}"/>
+        <constructor-arg name="passwords">
+            <map>
+                <entry key="${saml.keystore.defaultKey}" value="${saml.keystore.defaultKeyPass}"/>
+            </map>
+        </constructor-arg>
+        <constructor-arg name="defaultKey" value="${saml.keystore.defaultKey}"/>
+    </bean>
+
+    <bean id="extendedMetadata" class="org.springframework.security.saml.metadata.ExtendedMetadata">
+        <property name="idpDiscoveryEnabled" value="false"/>
+    </bean>
+
+    <bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
+        <constructor-arg name="generator">
+            <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
+                <property name="includeDiscoveryExtension" value="false"/>
+                <property name="entityId" value="${saml.entityID}"/>
+                <property name="extendedMetadata" ref="extendedMetadata"/>
+                <property name="wantAssertionSigned" value="true"/>
+                <property name="requestSigned" value="true"/>
+            </bean>
+        </constructor-arg>
+        <property name="normalizeBaseUrl" value="true"/>
+    </bean>
+
+    <bean id="metadataDisplayFilter" class="org.springframework.security.saml.metadata.MetadataDisplayFilter"/>
+
+    <bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
+        <property name="defaultIDP" value="${saml.idp.defaultIdpEntityId}"/>
+        <property name="refreshCheckInterval" value="3600000"/>
+        <property name="refreshRequired" value="true"/>
+        <constructor-arg name="providers">
+            <list>
+                <ref bean="idpMetadata"/>
+            </list>
+        </constructor-arg>
+    </bean>
+
+    <bean id="parserPool" class="org.opensaml.xml.parse.StaticBasicParserPool" init-method="initialize"/>
+
+    <bean id="parserPoolHolder" class="org.springframework.security.saml.parser.ParserPoolHolder"/>
+
+    <bean id="processor" class="org.springframework.security.saml.processor.SAMLProcessorImpl">
+    <constructor-arg name="bindings">
+        <list>
+            <bean id="httpPostBinding" class="org.springframework.security.saml.processor.HTTPPostBinding">
+                <constructor-arg name="parserPool" ref="parserPool"/>
+                <constructor-arg name="encoder">
+                    <bean class="cz.muni.ics.oidc.saml.PerunPostEncoder">
+                        <constructor-arg name="engine" value="#{T(org.springframework.security.saml.util.VelocityFactory).getEngine()}"/>
+                        <constructor-arg name="templateId" value="/templates/saml2-post-binding.vm"/>
+                    </bean>
+                </constructor-arg>
+                <constructor-arg name="decoder">
+                    <bean class="org.opensaml.saml2.binding.decoding.HTTPPostDecoder">
+                        <constructor-arg name="pool" ref="parserPool"/>
+                    </bean>
+                </constructor-arg>
+            </bean>
+            <bean id="httpRedirectDeflateBinding" class="org.springframework.security.saml.processor.HTTPRedirectDeflateBinding">
+                <constructor-arg name="encoder">
+                    <bean class="cz.muni.ics.oidc.saml.PerunHTTPRedirectDeflateEncoder"/>
+                </constructor-arg>
+                <constructor-arg name="decoder">
+                    <bean class="org.opensaml.saml2.binding.decoding.HTTPRedirectDeflateDecoder">
+                        <constructor-arg name="pool" ref="parserPool"/>
+                    </bean>
+                </constructor-arg>
+            </bean>
+        </list>
+    </constructor-arg>
+    </bean>
+
+    <bean id="samlWebSSOProcessingFilter" class="org.springframework.security.saml.SAMLProcessingFilter">
+        <property name="authenticationManager" ref="authenticationManager"/>
+        <property name="authenticationSuccessHandler" ref="successRedirectHandler"/>
+        <property name="authenticationFailureHandler" ref="authenticationFailureHandler"/>
+    </bean>
+
+    <bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy">
+        <constructor-arg name="filterChains">
+            <list>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                            <constructor-arg name="pattern"
+                                             value="#{T(org.springframework.security.saml.metadata.MetadataDisplayFilter).FILTER_URL}/**"/>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="metadataDisplayFilter"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                            <constructor-arg name="pattern"
+                                             value="#{T(org.springframework.security.saml.SAMLProcessingFilter).FILTER_URL}"/>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="samlWebSSOProcessingFilter"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                            <constructor-arg name="pattern"
+                                             value="#{T(org.springframework.security.saml.SAMLDiscovery).FILTER_URL}"/>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="samlDiscovery"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                            <constructor-arg name="pattern"
+                                             value="#{T(org.springframework.security.saml.SAMLEntryPoint).FILTER_URL}"/>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="samlEntryPoint"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.OrRequestMatcher">
+                            <constructor-arg name="requestMatchers">
+                                <list>
+                                    <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                                        <constructor-arg name="pattern"
+                                                         value="#{T(org.springframework.security.saml.SAMLLogoutFilter).FILTER_URL}"/>
+                                    </bean>
+                                    <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                                        <constructor-arg name="pattern" value="/logout"/>
+                                    </bean>
+                                </list>
+                            </constructor-arg>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="samlLogoutFilter"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+                <bean class="org.springframework.security.web.DefaultSecurityFilterChain">
+                    <constructor-arg name="requestMatcher">
+                        <bean class="org.springframework.security.web.util.matcher.AntPathRequestMatcher">
+                            <constructor-arg name="pattern" value="#{T(org.springframework.security.saml.SAMLLogoutProcessingFilter).FILTER_URL}/**"/>
+                        </bean>
+                    </constructor-arg>
+                    <constructor-arg name="filters">
+                        <list>
+                            <ref bean="samlLogoutProcessingFilter"/>
+                        </list>
+                    </constructor-arg>
+                </bean>
+            </list>
+        </constructor-arg>
+    </bean>
+
+    <bean id="webSSOProfileOptions" class="org.springframework.security.saml.websso.WebSSOProfileOptions">
+        <property name="includeScoping" value="false"/>
+    </bean>
+
+    <bean id="samlEntryPoint" class="cz.muni.ics.oidc.saml.PerunSamlEntryPoint">
+        <property name="defaultProfileOptions" ref="webSSOProfileOptions"/>
+    </bean>
+
+    <bean id="samlContextProvider" class="org.springframework.security.saml.context.SAMLContextProviderImpl"/>
+
+    <bean id="samlLogger" class="org.springframework.security.saml.log.SAMLDefaultLogger">
+        <property name="logMessagesOnException" value="true"/>
+        <property name="logErrors" value="true"/>
+        </bean>
+
+    <bean id="singleLogoutProfile" class="org.springframework.security.saml.websso.SingleLogoutProfileImpl"/>
+
+    <bean id="webSSOprofileConsumer" class="cz.muni.ics.oidc.saml.PerunWebSSOProfileConsumerImpl">
+        <property name="enableComparison" value="${saml.acrs.enableComparison}"/>
+        <property name="reservedPrefixes" value="#{'${saml.acrs.reserverdPrefixes}'.split('\s*,\s*')}"/>
+        <property name="maxAuthenticationAge" value="360"/>
+        </bean>
+
+    <bean id="webSSOprofile" class="org.springframework.security.saml.websso.WebSSOProfileImpl"/>
+
+    <bean id="hokWebSSOprofileConsumer" class="org.springframework.security.saml.websso.WebSSOProfileConsumerHoKImpl"/>
+
+    <bean id="samlUserDetailsService" class="cz.muni.ics.oidc.saml.PerunSamlUserDetailsService"/>
+
+    <bean id="authenticationProvider" class="cz.muni.ics.oidc.saml.PerunSamlAuthenticationProvider">
+        <constructor-arg name="adminIds" value="#{'${admins}'.split('\s*,\s*')}"/>
+    </bean>
+
+    <bean class="org.springframework.security.saml.SAMLBootstrap"/>
+
+    <!-- END SAML -->
+
+    <!-- OAuth -->
+
+    <oauth:authorization-server
+            client-details-service-ref="defaultOAuth2ClientDetailsEntityService"
+            authorization-request-manager-ref="connectOAuth2RequestFactory"
+            token-services-ref="defaultOAuth2ProviderTokenService"
+            user-approval-handler-ref="tofuUserApprovalHandler"
+            request-validator-ref="oauthRequestValidator"
+            redirect-resolver-ref="blacklistAwareRedirectResolver"
+            authorization-endpoint-url="/auth/authorize"
+            token-endpoint-url="/token"
+            error-page="/error">
+
+        <oauth:authorization-code authorization-code-services-ref="defaultOAuth2AuthorizationCodeService"/>
+        <oauth:implicit/>
+        <oauth:refresh-token/>
+        <oauth:client-credentials/>
+        <oauth:custom-grant token-granter-ref="chainedTokenGranter" />
+        <oauth:custom-grant token-granter-ref="jwtAssertionTokenGranter" />
+        <oauth:custom-grant token-granter-ref="deviceTokenGranter" />
+
+    </oauth:authorization-server>
+
+    <oauth:resource-server id="resourceServerFilter"
+                           token-services-ref="defaultOAuth2ProviderTokenService"
+                           stateless="false" />
+
+    <oauth:expression-handler id="oauthExpressionHandler" />
+
+    <oauth:web-expression-handler id="oauthWebExpressionHandler" />
+
+    <bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />
+
+    <bean id="oauthRequestValidator" class="cz.muni.ics.oauth2.token.ScopeServiceAwareOAuth2RequestValidator" />
+
+</beans>
\ No newline at end of file
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/discovery/web/DiscoveryEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/discovery/web/DiscoveryEndpoint.java
index fd7bca2e7..8b3e417d1 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/discovery/web/DiscoveryEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/discovery/web/DiscoveryEndpoint.java
@@ -28,18 +28,18 @@ import cz.muni.ics.jwt.encryption.service.JWTEncryptionAndDecryptionService;
 import cz.muni.ics.jwt.signer.service.JWTSigningAndValidationService;
 import cz.muni.ics.oauth2.model.PKCEAlgorithm;
 import cz.muni.ics.oauth2.service.SystemScopeService;
-import cz.muni.ics.oauth2.web.DeviceEndpoint;
-import cz.muni.ics.oauth2.web.IntrospectionEndpoint;
-import cz.muni.ics.oauth2.web.RevocationEndpoint;
+import cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint;
+import cz.muni.ics.oauth2.web.endpoint.IntrospectionEndpoint;
+import cz.muni.ics.oauth2.web.endpoint.RevocationEndpoint;
 import cz.muni.ics.openid.connect.config.ConfigurationPropertiesBean;
 import cz.muni.ics.openid.connect.model.UserInfo;
 import cz.muni.ics.openid.connect.service.UserInfoService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
-import cz.muni.ics.openid.connect.web.DynamicClientRegistrationEndpoint;
-import cz.muni.ics.openid.connect.web.EndSessionEndpoint;
-import cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint;
-import cz.muni.ics.openid.connect.web.UserInfoEndpoint;
+import cz.muni.ics.openid.connect.web.endpoint.DynamicClientRegistrationEndpoint;
+import cz.muni.ics.openid.connect.web.endpoint.EndSessionEndpoint;
+import cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint;
+import cz.muni.ics.openid.connect.web.endpoint.UserInfoEndpoint;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/token/DeviceTokenGranter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/token/DeviceTokenGranter.java
index c2175afe7..660c1371d 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/token/DeviceTokenGranter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/token/DeviceTokenGranter.java
@@ -20,7 +20,7 @@ import cz.muni.ics.oauth2.exception.AuthorizationPendingException;
 import cz.muni.ics.oauth2.exception.DeviceCodeExpiredException;
 import cz.muni.ics.oauth2.model.DeviceCode;
 import cz.muni.ics.oauth2.service.DeviceCodeService;
-import cz.muni.ics.oauth2.web.DeviceEndpoint;
+import cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint;
 import java.util.Date;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/ScopeAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/ScopeAPI.java
similarity index 97%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/ScopeAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/ScopeAPI.java
index 8feb60797..700469ade 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/ScopeAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/ScopeAPI.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.api;
 
 import com.google.gson.Gson;
 import cz.muni.ics.oauth2.model.SystemScope;
@@ -26,7 +26,7 @@ import cz.muni.ics.oauth2.service.SystemScopeService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
-import cz.muni.ics.openid.connect.web.RootController;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.util.Set;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,7 +50,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @Slf4j
 public class ScopeAPI {
 
-	public static final String URL = RootController.API_URL + "/scopes";
+	public static final String URL = GuiController.API_URL + "/scopes";
 
 	@Autowired
 	private SystemScopeService scopeService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/TokenAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/TokenAPI.java
similarity index 98%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/TokenAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/TokenAPI.java
index 4bd657a6a..e9dae6a0a 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/TokenAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/api/TokenAPI.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.api;
 
 import cz.muni.ics.oauth2.model.ClientDetailsEntity;
 import cz.muni.ics.oauth2.model.OAuth2AccessTokenEntity;
@@ -27,7 +27,7 @@ import cz.muni.ics.openid.connect.service.OIDCTokenService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
-import cz.muni.ics.openid.connect.web.RootController;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.security.Principal;
 import java.util.List;
 import java.util.Set;
@@ -53,7 +53,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @Slf4j
 public class TokenAPI {
 
-	public static final String URL = RootController.API_URL + "/tokens";
+	public static final String URL = GuiController.API_URL + "/tokens";
 
 	@Autowired
 	private OAuth2TokenEntityService tokenService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/OAuthConfirmationController.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/controller/OAuthConfirmationController.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/OAuthConfirmationController.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/controller/OAuthConfirmationController.java
index 2ebfb4b63..68243c78b 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/OAuthConfirmationController.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/controller/OAuthConfirmationController.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.controller;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/AuthorizationEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/AuthorizationEndpoint.java
new file mode 100644
index 000000000..339a5caf0
--- /dev/null
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/AuthorizationEndpoint.java
@@ -0,0 +1,25 @@
+package cz.muni.ics.oauth2.web.endpoint;
+
+import javax.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.view.RedirectView;
+
+@Controller
+@Slf4j
+public class AuthorizationEndpoint {
+
+    public static final String ENDPOINT_INIT_URL = "/authorize";
+    public static final String ENDPOINT_URL = "/auth/authorize";
+
+    @RequestMapping(value = ENDPOINT_INIT_URL)
+    public RedirectView authorize(HttpServletRequest req) {
+        String redirect = ENDPOINT_URL + '?' + req.getQueryString();
+        RedirectView view = new RedirectView(redirect);
+        view.setContextRelative(true);
+        log.debug("Authorization endpoint - {}: user is being redirected to to: {}", ENDPOINT_INIT_URL, redirect);
+        return view;
+    }
+
+}
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/DeviceEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/DeviceEndpoint.java
similarity index 94%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/DeviceEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/DeviceEndpoint.java
index 76655760b..967163287 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/DeviceEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/DeviceEndpoint.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  *******************************************************************************/
 
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.endpoint;
 
 import cz.muni.ics.oauth2.exception.DeviceCodeCreationException;
 import cz.muni.ics.oauth2.model.ClientDetailsEntity;
@@ -35,7 +35,6 @@ import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
 import java.net.URISyntaxException;
-import java.security.Principal;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
@@ -57,13 +56,14 @@ import org.springframework.security.oauth2.provider.AuthorizationRequest;
 import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.security.oauth2.provider.OAuth2Request;
 import org.springframework.security.oauth2.provider.OAuth2RequestFactory;
-import org.springframework.security.saml.SAMLCredential;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.view.RedirectView;
 
 /**
  * Implements https://tools.ietf.org/html/draft-ietf-oauth-device-flow
@@ -120,9 +120,10 @@ public class DeviceEndpoint {
 	// other
 	public static final String DEFAULT = "default";
 	public static final String ENDPOINT_URL = "/devicecode";
-	public static final String REQUEST_USER_CODE_URL = "/device/code";
-	public static final String CHECK_USER_CODE_URL = "/device/checkcode";
-	public static final String DEVICE_APPROVED_URL = "/device/approved";
+	public static final String REQUEST_USER_CODE_INIT_URL = "/device";
+	public static final String REQUEST_USER_CODE_URL = "/auth/device";
+	public static final String CHECK_USER_CODE_URL = "/auth/device/authorize";
+	public static final String DEVICE_APPROVED_URL = "/auth/device/approved";
 
 	private final ClientDetailsEntityService clientService;
 	private final SystemScopeService scopeService;
@@ -184,7 +185,7 @@ public class DeviceEndpoint {
 			if (StringUtils.hasText(acrValues)) {
 				uriParams.put(ACR_VALUES, acrValues);
 			}
-			String uriBase = perunOidcConfig.getConfigBean().getIssuer(false) + REQUEST_USER_CODE_URL;
+			String uriBase = perunOidcConfig.getConfigBean().getIssuer(false) + REQUEST_USER_CODE_INIT_URL;
 			response.put(VERIFICATION_URI, constructVerificationURI(uriBase, uriParams));
 			
 			if (perunOidcConfig.getConfigBean().isAllowCompleteDeviceCodeUri()) {
@@ -210,6 +211,16 @@ public class DeviceEndpoint {
 		}
 	}
 
+	@RequestMapping(value = REQUEST_USER_CODE_INIT_URL)
+	public RedirectView authorize(HttpServletRequest req) {
+		String redirect = REQUEST_USER_CODE_URL
+				+ (StringUtils.hasText(req.getQueryString()) ? '?' + req.getQueryString() : "");
+		RedirectView view = new RedirectView(redirect);
+		view.setContextRelative(true);
+		log.debug("User device endpoint - {}: user is being redirected to to: {}", REQUEST_USER_CODE_INIT_URL, redirect);
+		return view;
+	}
+
 	@PreAuthorize("hasRole('ROLE_USER')")
 	@GetMapping(value = REQUEST_USER_CODE_URL)
 	public String requestUserCode(@RequestParam(value = USER_CODE, required = false) String userCode,
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/IntrospectionEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/IntrospectionEndpoint.java
similarity index 98%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/IntrospectionEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/IntrospectionEndpoint.java
index 45ec000ae..9de0221ad 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/IntrospectionEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/IntrospectionEndpoint.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.endpoint;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
@@ -26,6 +26,7 @@ import cz.muni.ics.oauth2.service.ClientDetailsEntityService;
 import cz.muni.ics.oauth2.service.IntrospectionResultAssembler;
 import cz.muni.ics.oauth2.service.OAuth2TokenEntityService;
 import cz.muni.ics.oauth2.service.SystemScopeService;
+import cz.muni.ics.oauth2.web.AuthenticationUtilities;
 import cz.muni.ics.openid.connect.model.UserInfo;
 import cz.muni.ics.openid.connect.service.UserInfoService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/RevocationEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/RevocationEndpoint.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/RevocationEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/RevocationEndpoint.java
index 58584a35d..cd2a366a1 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/RevocationEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/endpoint/RevocationEndpoint.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.endpoint;
 
 import static cz.muni.ics.oauth2.web.AuthenticationUtilities.ensureOAuthScope;
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/CorsFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/filter/CorsFilter.java
similarity index 98%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/CorsFilter.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/filter/CorsFilter.java
index 041ec9c74..5f93ee1e5 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/CorsFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oauth2/web/filter/CorsFilter.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.oauth2.web;
+package cz.muni.ics.oauth2.web.filter;
 
 import java.io.IOException;
 import javax.servlet.FilterChain;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/SamlInvalidateSessionFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/SamlInvalidateSessionFilter.java
index 584e67bc4..483e317aa 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/SamlInvalidateSessionFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/saml/SamlInvalidateSessionFilter.java
@@ -1,14 +1,6 @@
 package cz.muni.ics.oidc.saml;
 
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AUTHORIZE_REQ_PATTERN;
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_APPROVE_REQ_PATTERN;
-import static org.springframework.http.HttpHeaders.REFERER;
-
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
@@ -20,45 +12,20 @@ import org.springframework.security.web.authentication.logout.SecurityContextLog
 import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 import org.springframework.security.web.util.matcher.OrRequestMatcher;
 import org.springframework.security.web.util.matcher.RequestMatcher;
-import org.springframework.util.StringUtils;
 import org.springframework.web.filter.GenericFilterBean;
 
 @Slf4j
 public class SamlInvalidateSessionFilter extends GenericFilterBean {
 
-    private static final RequestMatcher AUTHORIZE_MATCHER = new AntPathRequestMatcher(AUTHORIZE_REQ_PATTERN);
-    private static final RequestMatcher AUTHORIZE_ALL_MATCHER = new AntPathRequestMatcher(AUTHORIZE_REQ_PATTERN + "/**");
-    private static final RequestMatcher DEVICE_CODE_MATCHER = new AntPathRequestMatcher(DEVICE_APPROVE_REQ_PATTERN);
-    private static final RequestMatcher DEVICE_CODE_ALL_MATCHER = new AntPathRequestMatcher(DEVICE_APPROVE_REQ_PATTERN + "/**");
     private static final RequestMatcher MATCHER = new OrRequestMatcher(
-            Arrays.asList(AUTHORIZE_MATCHER, AUTHORIZE_ALL_MATCHER, DEVICE_CODE_MATCHER, DEVICE_CODE_ALL_MATCHER));
+            new AntPathRequestMatcher("/authorize"),
+            new AntPathRequestMatcher("/device")
+    );
 
     private final SecurityContextLogoutHandler contextLogoutHandler;
-    private final List<String> internalReferrers = new ArrayList<>();
 
-    public SamlInvalidateSessionFilter(String idpEntityId,
-                                       String oidcIssuer,
-                                       String proxySpEntityId,
-                                       SecurityContextLogoutHandler contextLogoutHandler,
-                                       String[] internalReferrers)
-    {
-        if (StringUtils.hasText(idpEntityId)) {
-            this.internalReferrers.add(idpEntityId);
-        }
-        if (StringUtils.hasText(oidcIssuer)) {
-            this.internalReferrers.add(oidcIssuer);
-        }
-        if (StringUtils.hasText(proxySpEntityId)) {
-            this.internalReferrers.add(proxySpEntityId);
-        }
+    public SamlInvalidateSessionFilter(SecurityContextLogoutHandler contextLogoutHandler) {
         this.contextLogoutHandler = contextLogoutHandler;
-        if (internalReferrers != null && internalReferrers.length > 0) {
-            List<String> referrers = Arrays.asList(internalReferrers);
-            referrers = referrers.stream().filter(StringUtils::hasText).collect(Collectors.toList());
-            if (!referrers.isEmpty()) {
-                this.internalReferrers.addAll(referrers);
-            }
-        }
     }
 
     @Override
@@ -68,25 +35,10 @@ public class SamlInvalidateSessionFilter extends GenericFilterBean {
         HttpServletRequest req = (HttpServletRequest) request;
         HttpServletResponse res = (HttpServletResponse) response;
         if (MATCHER.matches(req)) {
-            String referer = req.getHeader(REFERER);
-            if (!isInternalReferer(referer)) {
-                log.debug("Got external referer, clear session to reauthenticate");
-                contextLogoutHandler.logout(req, res, null);
-            }
+            log.debug("Invalidate session to enable SAML IdP re-authentication");
+            contextLogoutHandler.logout(req, res, null);
         }
         chain.doFilter(req, res);
     }
 
-    private boolean isInternalReferer(String referer) {
-        if (!StringUtils.hasText(referer)) {
-            return false;
-        }
-        for (String internal : internalReferrers) {
-            if (referer.startsWith(internal)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
 }
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java
similarity index 65%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilter.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java
index 3d5503c97..d736dc4f8 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilter.java
@@ -1,20 +1,14 @@
 package cz.muni.ics.oidc.server.filters;
 
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AUTHORIZE_REQ_PATTERN;
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_APPROVE_REQ_PATTERN;
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_CHECK_CODE_REQ_PATTERN;
-
 import java.io.IOException;
+import java.security.Principal;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-import org.springframework.security.web.util.matcher.OrRequestMatcher;
-import org.springframework.security.web.util.matcher.RequestMatcher;
 
 /**
  * Abstract class for Perun filters. All filters called in CallPerunFiltersFilter has to extend this.
@@ -39,7 +33,7 @@ import org.springframework.security.web.util.matcher.RequestMatcher;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public abstract class PerunRequestFilter {
+public abstract class AuthProcFilter {
 
     private static final String DELIMITER = ",";
     private static final String CLIENT_IDS = "clientIds";
@@ -49,7 +43,7 @@ public abstract class PerunRequestFilter {
     private Set<String> clientIds = new HashSet<>();
     private Set<String> subs = new HashSet<>();
 
-    public PerunRequestFilter(PerunRequestFilterParams params) {
+    public AuthProcFilter(AuthProcFilterParams params) {
         filterName = params.getFilterName();
 
         if (params.hasProperty(CLIENT_IDS)) {
@@ -65,6 +59,8 @@ public abstract class PerunRequestFilter {
         log.debug("{} - skip execution for clients with CLIENT_ID in: {}", filterName, clientIds);
     }
 
+    protected abstract String getSessionAppliedParamName();
+
     /**
      * In this method is done whole logic of filer
      *
@@ -73,31 +69,51 @@ public abstract class PerunRequestFilter {
      * @return boolean if filter was successfully done
      * @throws IOException this exception could be thrown because of failed or interrupted I/O operation
      */
-    protected abstract boolean process(ServletRequest request, ServletResponse response, FilterParams params)
+    protected abstract boolean process(HttpServletRequest request, HttpServletResponse response, FilterParams params)
             throws IOException;
 
-    public boolean doFilter(ServletRequest req, ServletResponse res, FilterParams params) throws IOException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        if (!skip(request)) {
+    public boolean doFilter(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException {
+        if (!skip(req)) {
             log.trace("{} - executing filter", filterName);
-            return this.process(req, res, params);
+            return process(req, res, params);
         } else {
             return true;
         }
     }
 
     private boolean skip(HttpServletRequest request) {
-        String sub = (request.getUserPrincipal() != null) ? request.getUserPrincipal().getName() : null;
-        String clientId = request.getParameter(PerunFilterConstants.PARAM_CLIENT_ID);
+        if (hasBeenApplied(request.getSession(true))) {
+            return true;
+        }
+        log.debug("{} - marking filter as applied", filterName);
+        request.getSession(true).setAttribute(getSessionAppliedParamName(), true);
+        return skipForSub(request.getUserPrincipal())
+                || skipForClientId(request.getParameter(PerunFilterConstants.PARAM_CLIENT_ID));
+    }
 
+    private boolean hasBeenApplied(HttpSession sess) {
+        String sessionParamName = getSessionAppliedParamName();
+        if (sess.getAttribute(sessionParamName) != null) {
+            log.debug("{} - skip filter execution: filter has been already applied", filterName);
+            return true;
+        }
+        return false;
+    }
+
+    private boolean skipForSub(Principal p) {
+        String sub = (p != null) ? p.getName() : null;
         if (sub != null && subs.contains(sub)) {
             log.debug("{} - skip filter execution: matched one of the ignored SUBS ({})", filterName, sub);
             return true;
-        } else if (clientId != null && clientIds.contains(clientId)){
+        }
+        return false;
+    }
+
+    private boolean skipForClientId(String clientId) {
+        if (clientId != null && clientIds.contains(clientId)){
             log.debug("{} - skip filter execution: matched one of the ignored CLIENT_IDS ({})", filterName, clientId);
             return true;
         }
-
         return false;
     }
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilterParams.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java
similarity index 87%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilterParams.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java
index 5c370fc0d..749fce772 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunRequestFilterParams.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFilterParams.java
@@ -8,7 +8,7 @@ import java.util.Properties;
  *
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
-public class PerunRequestFilterParams {
+public class AuthProcFilterParams {
 
 	private final String filterName;
 
@@ -16,7 +16,7 @@ public class PerunRequestFilterParams {
 	private final Properties properties;
 	private final BeanUtil beanUtil;
 
-	public PerunRequestFilterParams(String filterName, String propertyPrefix, Properties properties, BeanUtil beanUtil) {
+	public AuthProcFilterParams(String filterName, String propertyPrefix, Properties properties, BeanUtil beanUtil) {
 		this.filterName = filterName;
 		this.propertyPrefix = propertyPrefix;
 		this.properties = properties;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/CallPerunFiltersFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java
similarity index 75%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/CallPerunFiltersFilter.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java
index a4ce091d9..26a6d071d 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/CallPerunFiltersFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContainer.java
@@ -1,7 +1,7 @@
 package cz.muni.ics.oidc.server.filters;
 
 import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.AUTHORIZE_REQ_PATTERN;
-import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_CHECK_CODE_REQ_PATTERN;
+import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.DEVICE_APPROVE_REQ_PATTERN;
 
 import cz.muni.ics.oauth2.model.ClientDetailsEntity;
 import cz.muni.ics.oauth2.service.ClientDetailsEntityService;
@@ -20,6 +20,7 @@ import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.oauth2.provider.OAuth2RequestFactory;
@@ -36,12 +37,12 @@ import org.springframework.web.filter.GenericFilterBean;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class CallPerunFiltersFilter extends GenericFilterBean {
+public class AuthProcFiltersContainer extends GenericFilterBean {
 
     private static final RequestMatcher AUTHORIZE_MATCHER = new AntPathRequestMatcher(AUTHORIZE_REQ_PATTERN);
     private static final RequestMatcher AUTHORIZE_ALL_MATCHER = new AntPathRequestMatcher(AUTHORIZE_REQ_PATTERN + "/**");
-    private static final RequestMatcher DEVICE_CODE_MATCHER = new AntPathRequestMatcher(DEVICE_CHECK_CODE_REQ_PATTERN);
-    private static final RequestMatcher DEVICE_CODE_ALL_MATCHER = new AntPathRequestMatcher(DEVICE_CHECK_CODE_REQ_PATTERN + "/**");
+    private static final RequestMatcher DEVICE_CODE_MATCHER = new AntPathRequestMatcher(DEVICE_APPROVE_REQ_PATTERN);
+    private static final RequestMatcher DEVICE_CODE_ALL_MATCHER = new AntPathRequestMatcher(DEVICE_APPROVE_REQ_PATTERN + "/**");
     private static final RequestMatcher MATCHER = new OrRequestMatcher(
             Arrays.asList(AUTHORIZE_MATCHER, AUTHORIZE_ALL_MATCHER, DEVICE_CODE_MATCHER, DEVICE_CODE_ALL_MATCHER));
 
@@ -63,24 +64,25 @@ public class CallPerunFiltersFilter extends GenericFilterBean {
     @Autowired
     private SamlProperties samlProperties;
 
-    private PerunFiltersContext perunFiltersContext;
+    private AuthProcFiltersContext perunFiltersContext;
 
     @PostConstruct
     public void postConstruct() {
-        this.perunFiltersContext = new PerunFiltersContext(coreProperties, beanUtil);
+        this.perunFiltersContext = new AuthProcFiltersContext(coreProperties, beanUtil);
     }
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
             throws IOException, ServletException
     {
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
-        if (!MATCHER.matches(request)) {
-            log.debug("Custom filters have been skipped, did not match '/authorize' nor '/device/code' request");
+        HttpServletRequest req = (HttpServletRequest) servletRequest;
+        HttpServletResponse res = (HttpServletResponse) servletResponse;
+        if (!MATCHER.matches(req)) {
+            log.debug("AuthProc filters have been skipped, did not match authorization nor device req URL");
         } else {
-            List<PerunRequestFilter> filters = perunFiltersContext.getFilters();
+            List<AuthProcFilter> filters = perunFiltersContext.getFilters();
             if (filters != null && !filters.isEmpty()) {
-                ClientDetailsEntity client = FiltersUtils.extractClientFromRequest(request, authRequestFactory,
+                ClientDetailsEntity client = FiltersUtils.extractClientFromRequest(req, authRequestFactory,
                         clientDetailsEntityService);
                 Facility facility = null;
                 if (client != null && StringUtils.hasText(client.getClientId())) {
@@ -88,20 +90,20 @@ public class CallPerunFiltersFilter extends GenericFilterBean {
                         facility = perunAdapter.getFacilityByClientId(client.getClientId());
                     } catch (Exception e) {
                         log.warn("{} - could not fetch facility for client_id '{}'",
-                                CallPerunFiltersFilter.class.getSimpleName(), client.getClientId(), e);
+                                AuthProcFiltersContainer.class.getSimpleName(), client.getClientId(), e);
                     }
                 }
-                PerunUser user = FiltersUtils.getPerunUser(request, perunAdapter,
+                PerunUser user = FiltersUtils.getPerunUser(req, perunAdapter,
                         samlProperties.getUserIdentifierAttribute());
                 FilterParams params = new FilterParams(client, facility, user);
-                for (PerunRequestFilter filter : filters) {
-                    if (!filter.doFilter(servletRequest, servletResponse, params)) {
+                for (AuthProcFilter filter : filters) {
+                    if (!filter.doFilter(req, res, params)) {
                         return;
                     }
                 }
             }
         }
-        filterChain.doFilter(servletRequest, servletResponse);
+        filterChain.doFilter(req, res);
     }
 
 }
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFiltersContext.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java
similarity index 74%
rename from perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFiltersContext.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java
index 411b1ec97..c6f324a2b 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFiltersContext.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/AuthProcFiltersContext.java
@@ -16,22 +16,22 @@ import org.springframework.util.StringUtils;
  * Filters are configured from configuration file in following way:
  * filter.names=filterName1,filterName2,...
  *
- * @see PerunRequestFilter for configuration of filter
+ * @see AuthProcFilter for configuration of filter
  *
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class PerunFiltersContext {
+public class AuthProcFiltersContext {
 
 	private static final String FILTER_NAMES = "filter.names";
 	private static final String FILTER_CLASS = ".class";
 	private static final String PREFIX = "filter.";
 
-	private final List<PerunRequestFilter> filters;
+	private final List<AuthProcFilter> filters;
 	private final Properties properties;
 	private final BeanUtil beanUtil;
 
-	public PerunFiltersContext(Properties properties, BeanUtil beanUtil) {
+	public AuthProcFiltersContext(Properties properties, BeanUtil beanUtil) {
 		this.properties = properties;
 		this.beanUtil = beanUtil;
 		this.filters = new LinkedList<>();
@@ -41,18 +41,18 @@ public class PerunFiltersContext {
 
 		log.debug("--------------------------------");
 		for (String filterName: filterNames.split(",")) {
-			PerunRequestFilter requestFilter = loadFilter(filterName);
+			AuthProcFilter requestFilter = loadFilter(filterName);
 			filters.add(requestFilter);
 			log.debug("--------------------------------");
 		}
 	}
 
-	public List<PerunRequestFilter> getFilters() {
+	public List<AuthProcFilter> getFilters() {
 		return filters;
 	}
 
-	private PerunRequestFilter loadFilter(String filterName) {
-		String propPrefix = PerunFiltersContext.PREFIX + filterName;
+	private AuthProcFilter loadFilter(String filterName) {
+		String propPrefix = AuthProcFiltersContext.PREFIX + filterName;
 		String filterClass = properties.getProperty(propPrefix + FILTER_CLASS, null);
 		if (!StringUtils.hasText(filterClass)) {
 			log.warn("{} - failed to initialized filter: no class has ben configured", filterName);
@@ -62,15 +62,15 @@ public class PerunFiltersContext {
 
 		try {
 			Class<?> rawClazz = Class.forName(filterClass);
-			if (!PerunRequestFilter.class.isAssignableFrom(rawClazz)) {
-				log.warn("{} - failed to initialized filter: class '{}' does not extend PerunRequestFilter",
+			if (!AuthProcFilter.class.isAssignableFrom(rawClazz)) {
+				log.warn("{} - failed to initialized filter: class '{}' does not extend AuthProcFilter",
 						filterName, filterClass);
 				return null;
 			}
 			
-			@SuppressWarnings("unchecked") Class<PerunRequestFilter> clazz = (Class<PerunRequestFilter>) rawClazz;
-			Constructor<PerunRequestFilter> constructor = clazz.getConstructor(PerunRequestFilterParams.class);
-			PerunRequestFilterParams params = new PerunRequestFilterParams(filterName, propPrefix, properties, beanUtil);
+			@SuppressWarnings("unchecked") Class<AuthProcFilter> clazz = (Class<AuthProcFilter>) rawClazz;
+			Constructor<AuthProcFilter> constructor = clazz.getConstructor(AuthProcFilterParams.class);
+			AuthProcFilterParams params = new AuthProcFilterParams(filterName, propPrefix, properties, beanUtil);
 			return constructor.newInstance(params);
 		} catch (ClassNotFoundException e) {
 			log.warn("{} - failed to initialize filter: class '{}' was not found", filterName, filterClass);
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java
index 43964205d..2da01950b 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/FiltersUtils.java
@@ -1,6 +1,6 @@
 package cz.muni.ics.oidc.server.filters;
 
-import static cz.muni.ics.oauth2.web.DeviceEndpoint.DEVICE_CODE_SESSION_ATTRIBUTE;
+import static cz.muni.ics.oauth2.web.endpoint.DeviceEndpoint.DEVICE_CODE_SESSION_ATTRIBUTE;
 import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_FORCE_AUTHN;
 
 import cz.muni.ics.oauth2.model.ClientDetailsEntity;
@@ -278,7 +278,7 @@ public class FiltersUtils {
 
 	public static String fillStringMandatoryProperty(String propertyName,
 													 String filterName,
-													 PerunRequestFilterParams params) {
+													 AuthProcFilterParams params) {
 		String filled = params.getProperty(propertyName);
 
 		if (!StringUtils.hasText(filled)) {
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java
index 23a1f7426..d623a97ee 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/PerunFilterConstants.java
@@ -11,9 +11,8 @@ import java.util.Map;
  */
 public class PerunFilterConstants {
 
-    public static final String AUTHORIZE_REQ_PATTERN = "/authorize";
-    public static final String DEVICE_APPROVE_REQ_PATTERN = "/device/code";
-    public static final String DEVICE_CHECK_CODE_REQ_PATTERN = "/device/checkcode";
+    public static final String AUTHORIZE_REQ_PATTERN = "/auth/authorize";
+    public static final String DEVICE_APPROVE_REQ_PATTERN = "/auth/device/authorize";
 
     public static final String PARAM_CLIENT_ID = "client_id";
     public static final String PARAM_SCOPE = "scope";
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java
index f5679b096..4ef27d2c0 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunAuthorizationFilter.java
@@ -9,12 +9,10 @@ import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController;
 import java.util.Map;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -31,14 +29,16 @@ import lombok.extern.slf4j.Slf4j;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class PerunAuthorizationFilter extends PerunRequestFilter {
+public class PerunAuthorizationFilter extends AuthProcFilter {
+
+	public static final String APPLIED = "APPLIED_" + PerunAuthorizationFilter.class.getSimpleName();
 
 	private final PerunAdapter perunAdapter;
 	private final FacilityAttrsConfig facilityAttrsConfig;
 	private final String filterName;
 	private final PerunOidcConfig config;
 
-	public PerunAuthorizationFilter(PerunRequestFilterParams params) {
+	public PerunAuthorizationFilter(AuthProcFilterParams params) {
 		super(params);
 		BeanUtil beanUtil = params.getBeanUtil();
 		this.perunAdapter = beanUtil.getBean(PerunAdapter.class);
@@ -48,10 +48,12 @@ public class PerunAuthorizationFilter extends PerunRequestFilter {
 	}
 
 	@Override
-	protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) {
-		HttpServletRequest request = (HttpServletRequest) req;
-		HttpServletResponse response = (HttpServletResponse) res;
+	protected String getSessionAppliedParamName() {
+		return APPLIED;
+	}
 
+	@Override
+	protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) {
 		Facility facility = params.getFacility();
 		if (facility == null || facility.getId() == null) {
 			log.debug("{} - skip filter execution: no facility provided", filterName);
@@ -64,7 +66,7 @@ public class PerunAuthorizationFilter extends PerunRequestFilter {
 			return true;
 		}
 
-		return this.decideAccess(facility, user, request, response, params.getClientIdentifier(),
+		return this.decideAccess(facility, user, req, res, params.getClientIdentifier(),
 				perunAdapter, facilityAttrsConfig);
 	}
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java
index e3467b0ef..cb736dabe 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunEnsureVoMember.java
@@ -7,20 +7,15 @@ import cz.muni.ics.oidc.server.adapters.PerunAdapter;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.ControllerUtils;
 import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController;
 import cz.muni.ics.oidc.web.controllers.RegistrationController;
-import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpHeaders;
@@ -39,7 +34,9 @@ import org.springframework.util.StringUtils;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class PerunEnsureVoMember extends PerunRequestFilter {
+public class PerunEnsureVoMember extends AuthProcFilter {
+
+    public static final String APPLIED = "APPLIED_" + PerunEnsureVoMember.class.getSimpleName();
 
     private static final String TRIGGER_ATTR = "triggerAttr";
     private static final String VO_DEFS_ATTR = "voDefsAttr";
@@ -52,7 +49,7 @@ public class PerunEnsureVoMember extends PerunRequestFilter {
     private final String filterName;
     private final PerunOidcConfig perunOidcConfig;
 
-    public PerunEnsureVoMember(PerunRequestFilterParams params) {
+    public PerunEnsureVoMember(AuthProcFilterParams params) {
         super(params);
         BeanUtil beanUtil = params.getBeanUtil();
 
@@ -68,9 +65,12 @@ public class PerunEnsureVoMember extends PerunRequestFilter {
     }
 
     @Override
-    protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) throws IOException {
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected String getSessionAppliedParamName() {
+        return APPLIED;
+    }
 
+    @Override
+    protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) {
         Facility facility = params.getFacility();
         if (facility == null || facility.getId() == null) {
             log.debug("{} - skip execution: no facility provided", filterName);
@@ -100,7 +100,7 @@ public class PerunEnsureVoMember extends PerunRequestFilter {
             log.debug("{} - user allowed to continue", filterName);
             return true;
         } else {
-            redirect(response, getLoginUrl(facility.getId()), voShortName);
+            redirect(res, getLoginUrl(facility.getId()), voShortName);
             return false;
         }
     }
@@ -133,17 +133,6 @@ public class PerunEnsureVoMember extends PerunRequestFilter {
         return attrValue;
     }
 
-    private boolean canAccess(PerunAttributeValue attrValue, Set<String> memberShortNames) {
-        if (attrValue.valueAsJson().isArray()) {
-            Set<String> val = attrValue.valueAsList() == null ?
-                    Collections.emptySet() : new HashSet<>(attrValue.valueAsList());
-            return !Collections.disjoint(val, memberShortNames);
-        } else {
-            String val = attrValue.valueAsString();
-            return memberShortNames.contains(val);
-        }
-    }
-
     @Override
     public String toString() {
         return "PerunEnsureVoMember{" +
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java
index 25d630e81..1f738aa93 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunForceAupFilter.java
@@ -14,8 +14,8 @@ import cz.muni.ics.oidc.server.adapters.PerunAdapter;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.AupController;
 import java.io.IOException;
 import java.text.ParseException;
@@ -27,8 +27,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -52,7 +50,9 @@ import org.springframework.util.StringUtils;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class PerunForceAupFilter extends PerunRequestFilter {
+public class PerunForceAupFilter extends AuthProcFilter {
+
+    public static final String APPLIED = "APPLIED_" + PerunForceAupFilter.class.getSimpleName();
 
     private static final String DATE_FORMAT = "yyyy-MM-dd";
 
@@ -77,7 +77,7 @@ public class PerunForceAupFilter extends PerunRequestFilter {
     private final SamlProperties samlProperties;
     private final String filterName;
 
-    public PerunForceAupFilter(PerunRequestFilterParams params) {
+    public PerunForceAupFilter(AuthProcFilterParams params) {
         super(params);
         BeanUtil beanUtil = params.getBeanUtil();
         this.perunAdapter = beanUtil.getBean(PerunAdapter.class);
@@ -93,18 +93,20 @@ public class PerunForceAupFilter extends PerunRequestFilter {
     }
 
     @Override
-    protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) throws IOException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected String getSessionAppliedParamName() {
+        return APPLIED;
+    }
 
-        if (request.getSession() != null && request.getSession().getAttribute(APPROVED) != null) {
-            request.getSession().removeAttribute(APPROVED);
+    @Override
+    protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException {
+        if (req.getSession() != null && req.getSession().getAttribute(APPROVED) != null) {
+            req.getSession().removeAttribute(APPROVED);
             log.debug("{} - skip filter execution: aups are already approved, check at next access to the service due" +
                     " to a delayed propagation to LDAP", filterName);
             return true;
         }
 
-        PerunUser user = FiltersUtils.getPerunUser(request, perunAdapter, samlProperties.getUserIdentifierAttribute());
+        PerunUser user = FiltersUtils.getPerunUser(req, perunAdapter, samlProperties.getUserIdentifierAttribute());
         if (user == null || user.getId() == null) {
             log.debug("{} - skip filter execution: no user provider", filterName);
             return true;
@@ -147,13 +149,13 @@ public class PerunForceAupFilter extends PerunRequestFilter {
             log.trace("{} - AUPS to be approved: '{}'", filterName, newAups);
             String newAupsString = mapper.writeValueAsString(newAups);
 
-            request.getSession().setAttribute(AupController.RETURN_URL, request.getRequestURI()
-                    .replace(request.getContextPath(), "") + '?' + request.getQueryString());
-            request.getSession().setAttribute(AupController.NEW_AUPS, newAupsString);
-            request.getSession().setAttribute(AupController.USER_ATTR, perunUserAupsAttrName);
+            req.getSession().setAttribute(AupController.RETURN_URL, req.getRequestURI()
+                    .replace(req.getContextPath(), "") + '?' + req.getQueryString());
+            req.getSession().setAttribute(AupController.NEW_AUPS, newAupsString);
+            req.getSession().setAttribute(AupController.USER_ATTR, perunUserAupsAttrName);
 
             log.debug("{} - redirecting user '{}' to AUPs approval page", filterName, user);
-            response.sendRedirect(request.getContextPath() + '/' + AupController.URL);
+            res.sendRedirect(req.getContextPath() + '/' + AupController.URL);
             return false;
         }
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java
index a51236965..50a41686e 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsCesnetEligibleFilter.java
@@ -14,9 +14,8 @@ import cz.muni.ics.oidc.server.adapters.PerunAdapter;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunFilterConstants;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.ControllerUtils;
 import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController;
 import java.time.LocalDateTime;
@@ -25,8 +24,6 @@ import java.time.format.DateTimeParseException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -46,7 +43,9 @@ import org.apache.http.HttpHeaders;
  * @author Dominik Frantisek Bucik <bucik@ics.muni.cz>
  */
 @Slf4j
-public class PerunIsCesnetEligibleFilter extends PerunRequestFilter {
+public class PerunIsCesnetEligibleFilter extends AuthProcFilter {
+
+    public static final String APPLIED = "APPLIED_" + PerunIsCesnetEligibleFilter.class.getSimpleName();
 
     /* CONFIGURATION PROPERTIES */
     private static final String IS_CESNET_ELIGIBLE_ATTR_NAME = "isCesnetEligibleAttr";
@@ -63,7 +62,7 @@ public class PerunIsCesnetEligibleFilter extends PerunRequestFilter {
     private final PerunAdapter perunAdapter;
     private final String filterName;
 
-    public PerunIsCesnetEligibleFilter(PerunRequestFilterParams params) {
+    public PerunIsCesnetEligibleFilter(AuthProcFilterParams params) {
         super(params);
         BeanUtil beanUtil = params.getBeanUtil();
         this.config = beanUtil.getBean(PerunOidcConfig.class);
@@ -84,11 +83,13 @@ public class PerunIsCesnetEligibleFilter extends PerunRequestFilter {
     }
 
     @Override
-    protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected String getSessionAppliedParamName() {
+        return APPLIED;
+    }
 
-        if (!FiltersUtils.isScopePresent(request.getParameter(PARAM_SCOPE), triggerScope)) {
+    @Override
+    protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) {
+       if (!FiltersUtils.isScopePresent(req.getParameter(PARAM_SCOPE), triggerScope)) {
             log.debug("{} - skip execution: scope '{}' is not present in request", filterName, triggerScope);
             return true;
         }
@@ -124,7 +125,7 @@ public class PerunIsCesnetEligibleFilter extends PerunRequestFilter {
         }
 
         log.debug("{} - attribute '{}' value is invalid, stop user at this point", filterName, attrValue);
-        this.redirect(request, response, reason);
+        this.redirect(req, res, reason);
         return false;
     }
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java
index d027eed43..06fc36676 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/PerunIsTestSpFilter.java
@@ -10,16 +10,13 @@ import cz.muni.ics.oidc.server.adapters.PerunAdapter;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunFilterConstants;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.ControllerUtils;
 import cz.muni.ics.oidc.web.controllers.IsTestSpController;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -37,7 +34,9 @@ import org.apache.http.HttpHeaders;
  * @author Pavol Pluta <500348@mail.muni.cz>
  */
 @Slf4j
-public class PerunIsTestSpFilter extends PerunRequestFilter {
+public class PerunIsTestSpFilter extends AuthProcFilter {
+
+    public static final String APPLIED = "APPLIED_" + PerunIsTestSpFilter.class.getSimpleName();
 
     private static final String IS_TEST_SP_ATTR_NAME = "isTestSpAttr";
 
@@ -46,7 +45,7 @@ public class PerunIsTestSpFilter extends PerunRequestFilter {
     private final String filterName;
     private final PerunOidcConfig config;
 
-    public PerunIsTestSpFilter(PerunRequestFilterParams params) {
+    public PerunIsTestSpFilter(AuthProcFilterParams params) {
         super(params);
         BeanUtil beanUtil = params.getBeanUtil();
         this.perunAdapter = beanUtil.getBean(PerunAdapter.class);
@@ -56,14 +55,17 @@ public class PerunIsTestSpFilter extends PerunRequestFilter {
     }
 
     @Override
-    protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) throws IOException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
+    protected String getSessionAppliedParamName() {
+        return APPLIED;
+    }
+
+    @Override
+    protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) throws IOException {
         Facility facility = params.getFacility();
         if (facility == null || facility.getId() == null) {
             log.debug("{} - skip execution: no facility provided", filterName);
             return true;
-        } else if (testSpWarningApproved(request)){
+        } else if (testSpWarningApproved(req)){
             log.debug("{} - skip execution: warning already approved", filterName);
             return true;
         }
@@ -74,7 +76,7 @@ public class PerunIsTestSpFilter extends PerunRequestFilter {
             return true;
         } else if (attrValue.valueAsBoolean()) {
             log.debug("{} - redirecting user to test SP warning page", filterName);
-            this.redirect(request, response);
+            this.redirect(req, res);
             return false;
         }
         log.debug("{} - service is not testing, let user access it", filterName);
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java
index 6a9f90326..19fc1f3d0 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ProxyStatisticsFilter.java
@@ -8,8 +8,8 @@ import cz.muni.ics.oidc.BeanUtil;
 import cz.muni.ics.oidc.saml.SamlProperties;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import java.sql.Connection;
 import java.sql.Date;
 import java.sql.PreparedStatement;
@@ -17,10 +17,8 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.time.LocalDate;
 import java.util.Objects;
-import java.util.Properties;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.sql.DataSource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.saml.SAMLCredential;
@@ -51,7 +49,9 @@ import org.springframework.util.StringUtils;
  */
 @SuppressWarnings("SqlResolve")
 @Slf4j
-public class ProxyStatisticsFilter extends PerunRequestFilter {
+public class ProxyStatisticsFilter extends AuthProcFilter {
+
+	public static final String APPLIED = "APPLIED_" + ProxyStatisticsFilter.class.getSimpleName();
 
 	/* CONFIGURATION OPTIONS */
 	private static final String IDP_NAME_ATTRIBUTE_NAME = "idpNameAttributeName";
@@ -77,7 +77,7 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
 	private final String filterName;
 	private final SamlProperties samlProperties;
 
-	public ProxyStatisticsFilter(PerunRequestFilterParams params) {
+	public ProxyStatisticsFilter(AuthProcFilterParams params) {
 		super(params);
 		BeanUtil beanUtil = params.getBeanUtil();
 		this.mitreIdStats = beanUtil.getBean("mitreIdStats", DataSource.class);
@@ -97,9 +97,12 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
 	}
 
 	@Override
-	protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) {
-		HttpServletRequest request = (HttpServletRequest) req;
+	protected String getSessionAppliedParamName() {
+		return APPLIED;
+	}
 
+	@Override
+	protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) {
 		ClientDetailsEntity client = params.getClient();
 		if (client == null) {
 			log.warn("{} - skip execution: no client provided", filterName);
@@ -112,7 +115,7 @@ public class ProxyStatisticsFilter extends PerunRequestFilter {
 			return true;
 		}
 
-		SAMLCredential samlCredential = FiltersUtils.getSamlCredential(request);
+		SAMLCredential samlCredential = FiltersUtils.getSamlCredential(req);
 		if (samlCredential == null) {
 			log.warn("{} - skip execution: no authN object available, cannot extract user identifier and idp identifier",
 					filterName);
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java
index bf05d8c69..e3d4d2cf9 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/filters/impl/ValidUserFilter.java
@@ -9,14 +9,12 @@ import cz.muni.ics.oidc.server.configurations.FacilityAttrsConfig;
 import cz.muni.ics.oidc.server.configurations.PerunOidcConfig;
 import cz.muni.ics.oidc.server.filters.FilterParams;
 import cz.muni.ics.oidc.server.filters.FiltersUtils;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilter;
-import cz.muni.ics.oidc.server.filters.PerunRequestFilterParams;
+import cz.muni.ics.oidc.server.filters.AuthProcFilter;
+import cz.muni.ics.oidc.server.filters.AuthProcFilterParams;
 import cz.muni.ics.oidc.web.controllers.PerunUnapprovedController;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -46,7 +44,9 @@ import org.springframework.util.StringUtils;
  */
 @SuppressWarnings("SqlResolve")
 @Slf4j
-public class ValidUserFilter extends PerunRequestFilter {
+public class ValidUserFilter extends AuthProcFilter {
+
+	public static final String APPLIED = "APPLIED_" + ValidUserFilter.class.getSimpleName();
 
 	/* CONFIGURATION OPTIONS */
 	private static final String ALL_ENV_GROUPS = "allEnvGroups";
@@ -69,7 +69,7 @@ public class ValidUserFilter extends PerunRequestFilter {
 	private final String filterName;
 	private final PerunOidcConfig config;
 
-	public ValidUserFilter(PerunRequestFilterParams params) {
+	public ValidUserFilter(AuthProcFilterParams params) {
 		super(params);
 		BeanUtil beanUtil = params.getBeanUtil();
 		this.perunAdapter = beanUtil.getBean(PerunAdapter.class);
@@ -86,10 +86,12 @@ public class ValidUserFilter extends PerunRequestFilter {
 	}
 
 	@Override
-	protected boolean process(ServletRequest req, ServletResponse res, FilterParams params) {
-		HttpServletRequest request = (HttpServletRequest) req;
-		HttpServletResponse response = (HttpServletResponse) res;
+	protected String getSessionAppliedParamName() {
+		return APPLIED;
+	}
 
+	@Override
+	protected boolean process(HttpServletRequest req, HttpServletResponse res, FilterParams params) {
 		Set<Long> additionalVos = new HashSet<>();
 		Set<Long> additionalGroups = new HashSet<>();
 
@@ -106,7 +108,7 @@ public class ValidUserFilter extends PerunRequestFilter {
 			return true;
 		}
 
-		if (!checkMemberValidInGroupsAndVos(user, facility, response, params, allEnvVos, allEnvGroups,
+		if (!checkMemberValidInGroupsAndVos(user, facility, res, params, allEnvVos, allEnvGroups,
 				PerunUnapprovedController.UNAPPROVED_NOT_IN_MANDATORY_VOS_GROUPS)) {
 			return false;
 		}
@@ -121,7 +123,7 @@ public class ValidUserFilter extends PerunRequestFilter {
 			additionalVos.addAll(testEnvVos);
 			additionalGroups.addAll(testEnvGroups);
 
-			if (!checkMemberValidInGroupsAndVos(user, facility, response, params, additionalVos,
+			if (!checkMemberValidInGroupsAndVos(user, facility, res, params, additionalVos,
 					additionalGroups, PerunUnapprovedController.UNAPPROVED_NOT_IN_TEST_VOS_GROUPS)) {
 				return false;
 			}
@@ -129,7 +131,7 @@ public class ValidUserFilter extends PerunRequestFilter {
 			additionalVos.addAll(prodEnvVos);
 			additionalGroups.addAll(prodEnvGroups);
 
-			if (!checkMemberValidInGroupsAndVos(user, facility, response, params, additionalVos,
+			if (!checkMemberValidInGroupsAndVos(user, facility, res, params, additionalVos,
 					additionalGroups, PerunUnapprovedController.UNAPPROVED_NOT_IN_PROD_VOS_GROUPS)) {
 				return false;
 			}
@@ -139,7 +141,7 @@ public class ValidUserFilter extends PerunRequestFilter {
 		return true;
 	}
 
-	private Set<Long> getIdsFromParam(PerunRequestFilterParams params, String propKey) {
+	private Set<Long> getIdsFromParam(AuthProcFilterParams params, String propKey) {
 		Set<Long> result = new HashSet<>();
 
 		String prop = params.getProperty(propKey);
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/ga4gh/Ga4ghPassportAndVisaClaimSource.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/ga4gh/Ga4ghPassportAndVisaClaimSource.java
index 13307dc79..839aa3a1a 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/ga4gh/Ga4ghPassportAndVisaClaimSource.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/server/ga4gh/Ga4ghPassportAndVisaClaimSource.java
@@ -16,7 +16,7 @@ import cz.muni.ics.oidc.server.claims.ClaimSource;
 import cz.muni.ics.oidc.server.claims.ClaimSourceInitContext;
 import cz.muni.ics.oidc.server.claims.ClaimSourceProduceContext;
 import cz.muni.ics.oidc.server.connectors.Affiliation;
-import cz.muni.ics.openid.connect.web.JWKSetPublishingEndpoint;
+import cz.muni.ics.openid.connect.web.endpoint.JWKSetPublishingEndpoint;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/ControllerUtils.java b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/ControllerUtils.java
index b288789c9..91982cec2 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/ControllerUtils.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/oidc/web/controllers/ControllerUtils.java
@@ -1,7 +1,7 @@
 package cz.muni.ics.oidc.web.controllers;
 
-import static cz.muni.ics.oauth2.web.OAuthConfirmationController.CLAIMS;
-import static cz.muni.ics.oauth2.web.OAuthConfirmationController.SCOPES;
+import static cz.muni.ics.oauth2.web.controller.OAuthConfirmationController.CLAIMS;
+import static cz.muni.ics.oauth2.web.controller.OAuthConfirmationController.SCOPES;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Sets;
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 
-import cz.muni.ics.openid.connect.service.ScopeClaimTranslationService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.utils.URIBuilder;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/filter/AuthorizationRequestFilter.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/filter/AuthorizationRequestFilter.java
index 844f6648d..e7b969ade 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/filter/AuthorizationRequestFilter.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/filter/AuthorizationRequestFilter.java
@@ -78,7 +78,7 @@ public class AuthorizationRequestFilter extends GenericFilterBean {
 	@Autowired(required = false)
 	private LoginHintExtracter loginHintExtracter = new RemoveLoginHintsWithHTTP();
 
-	private RequestMatcher requestMatcher = new AntPathRequestMatcher("/authorize");
+	private RequestMatcher requestMatcher = new AntPathRequestMatcher("/auth/authorize");
 
 	/**
 	 *
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ApprovedSiteAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ApprovedSiteAPI.java
similarity index 96%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ApprovedSiteAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ApprovedSiteAPI.java
index c95d49bee..2b61b1b97 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ApprovedSiteAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ApprovedSiteAPI.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.api;
 
 import cz.muni.ics.openid.connect.model.ApprovedSite;
 import cz.muni.ics.openid.connect.service.ApprovedSiteService;
@@ -26,6 +26,7 @@ import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonApprovedSiteView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.security.Principal;
 import java.util.Collection;
 import lombok.extern.slf4j.Slf4j;
@@ -49,7 +50,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @Slf4j
 public class ApprovedSiteAPI {
 
-	public static final String URL = RootController.API_URL + "/approved";
+	public static final String URL = GuiController.API_URL + "/approved";
 
 	@Autowired
 	private ApprovedSiteService approvedSiteService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/BlacklistAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/BlacklistAPI.java
similarity index 97%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/BlacklistAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/BlacklistAPI.java
index d443b1adc..716d8d56e 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/BlacklistAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/BlacklistAPI.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.api;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
@@ -29,6 +29,7 @@ import cz.muni.ics.openid.connect.service.BlacklistedSiteService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.security.Principal;
 import java.util.Collection;
 import lombok.extern.slf4j.Slf4j;
@@ -53,7 +54,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @Slf4j
 public class BlacklistAPI {
 
-	public static final String URL = RootController.API_URL + "/blacklist";
+	public static final String URL = GuiController.API_URL + "/blacklist";
 
 	@Autowired
 	private BlacklistedSiteService blacklistService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ClientAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ClientAPI.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ClientAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ClientAPI.java
index fe402b3b8..262e32abe 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ClientAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/ClientAPI.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.api;
 
 import static cz.muni.ics.oauth2.model.RegisteredClientFields.APPLICATION_TYPE;
 import static cz.muni.ics.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS;
@@ -88,6 +88,7 @@ import cz.muni.ics.openid.connect.view.ClientEntityViewForUsers;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.lang.reflect.Type;
 import java.sql.SQLIntegrityConstraintViolationException;
 import java.text.ParseException;
@@ -120,7 +121,7 @@ import org.springframework.web.servlet.ModelAndView;
 @Slf4j
 public class ClientAPI {
 
-	public static final String URL = RootController.API_URL + "/clients";
+	public static final String URL = GuiController.API_URL + "/clients";
 
 	@Autowired
 	private ClientDetailsEntityService clientService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/WhitelistAPI.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/WhitelistAPI.java
similarity index 97%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/WhitelistAPI.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/WhitelistAPI.java
index 7d4e6bf15..a548525fc 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/WhitelistAPI.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/api/WhitelistAPI.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.api;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
@@ -29,6 +29,7 @@ import cz.muni.ics.openid.connect.service.WhitelistedSiteService;
 import cz.muni.ics.openid.connect.view.HttpCodeView;
 import cz.muni.ics.openid.connect.view.JsonEntityView;
 import cz.muni.ics.openid.connect.view.JsonErrorView;
+import cz.muni.ics.openid.connect.web.controller.GuiController;
 import java.security.Principal;
 import java.util.Collection;
 import lombok.extern.slf4j.Slf4j;
@@ -53,7 +54,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 @Slf4j
 public class WhitelistAPI {
 
-	public static final String URL = RootController.API_URL + "/whitelist";
+	public static final String URL = GuiController.API_URL + "/whitelist";
 
 	@Autowired
 	private WhitelistedSiteService whitelistService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/RootController.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/controller/GuiController.java
similarity index 95%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/RootController.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/controller/GuiController.java
index 0d5475c22..1670e62f0 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/RootController.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/controller/GuiController.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.controller;
 
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
@@ -27,7 +27,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
  */
 
 @Controller
-public class RootController {
+public class GuiController {
 
 	public static final String API_URL = "api";
 
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/DynamicClientRegistrationEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/DynamicClientRegistrationEndpoint.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/DynamicClientRegistrationEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/DynamicClientRegistrationEndpoint.java
index dfc335213..2d0579479 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/DynamicClientRegistrationEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/DynamicClientRegistrationEndpoint.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.endpoint;
 
 import static cz.muni.ics.oauth2.model.RegisteredClientFields.APPLICATION_TYPE;
 import static cz.muni.ics.oauth2.model.RegisteredClientFields.CLAIMS_REDIRECT_URIS;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/EndSessionEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/EndSessionEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java
index 569f73c08..7432e11b0 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/EndSessionEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/EndSessionEndpoint.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  *******************************************************************************/
 
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.endpoint;
 
 import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_POST_LOGOUT_REDIRECT_URI;
 import static cz.muni.ics.oidc.server.filters.PerunFilterConstants.PARAM_STATE;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/JWKSetPublishingEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/JWKSetPublishingEndpoint.java
similarity index 97%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/JWKSetPublishingEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/JWKSetPublishingEndpoint.java
index fdf3c9bfa..455bcf66d 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/JWKSetPublishingEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/JWKSetPublishingEndpoint.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.endpoint;
 
 import com.nimbusds.jose.jwk.JWK;
 import cz.muni.ics.jwt.signer.service.JWTSigningAndValidationService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ProtectedResourceRegistrationEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/ProtectedResourceRegistrationEndpoint.java
similarity index 99%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ProtectedResourceRegistrationEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/ProtectedResourceRegistrationEndpoint.java
index 9b10f06b9..1194d00ff 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ProtectedResourceRegistrationEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/ProtectedResourceRegistrationEndpoint.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.endpoint;
 
 import com.google.common.base.Strings;
 import com.google.gson.JsonSyntaxException;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoEndpoint.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/UserInfoEndpoint.java
similarity index 98%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoEndpoint.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/UserInfoEndpoint.java
index ccdfaa7f2..b00079233 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoEndpoint.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/endpoint/UserInfoEndpoint.java
@@ -15,11 +15,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *******************************************************************************/
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.endpoint;
 
 import com.google.common.base.Strings;
 import cz.muni.ics.oauth2.model.ClientDetailsEntity;
-import cz.muni.ics.oauth2.model.OAuth2AccessTokenEntity;
 import cz.muni.ics.oauth2.model.SavedUserAuthentication;
 import cz.muni.ics.oauth2.service.ClientDetailsEntityService;
 import cz.muni.ics.oauth2.service.SystemScopeService;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ServerConfigInterceptor.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/ServerConfigInterceptor.java
similarity index 97%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ServerConfigInterceptor.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/ServerConfigInterceptor.java
index eb5dd49f9..b19e3e9e8 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/ServerConfigInterceptor.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/ServerConfigInterceptor.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.interceptor;
 
 import cz.muni.ics.openid.connect.config.ConfigurationPropertiesBean;
 import cz.muni.ics.openid.connect.config.UIConfiguration;
diff --git a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoInterceptor.java b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/UserInfoInterceptor.java
similarity index 98%
rename from perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoInterceptor.java
rename to perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/UserInfoInterceptor.java
index 9a83505bd..9cfc4a88c 100644
--- a/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/UserInfoInterceptor.java
+++ b/perun-oidc-server/src/main/java/cz/muni/ics/openid/connect/web/interceptor/UserInfoInterceptor.java
@@ -18,7 +18,7 @@
 /**
  *
  */
-package cz.muni.ics.openid.connect.web;
+package cz.muni.ics.openid.connect.web.interceptor;
 
 import static cz.muni.ics.openid.connect.request.ConnectRequestParameters.CLIENT_ID;
 import static cz.muni.ics.openid.connect.request.ConnectRequestParameters.SCOPE;