Index: eprms-spr/pom.xml
===================================================================
--- eprms-spr/pom.xml	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/pom.xml	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -8,5 +8,5 @@
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.4.4</version>
+		<version>2.4.5</version>
 		<relativePath />
 	</parent>
@@ -38,5 +38,5 @@
 
 		<postgresql-version>42.2.19</postgresql-version>
-		<cas-client-version>3.6.2</cas-client-version>
+		<servlet-api-version>3.0.1</servlet-api-version>
 
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -75,5 +75,5 @@
 			<optional>true</optional>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
@@ -87,7 +87,15 @@
 		</dependency>
 		<dependency>
-			<groupId>org.jasig.cas.client</groupId>
-			<artifactId>cas-client-core</artifactId>
-			<version>${cas-client-version}</version>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-security</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-cas</artifactId>
 		</dependency>
 
@@ -99,4 +107,10 @@
 
 		<!-- other -->
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
 		<dependency>
 			<groupId>org.freedesktop.tango</groupId>
@@ -213,4 +227,7 @@
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<finalName>epm</finalName>
+				</configuration>
 			</plugin>
 			<plugin>
@@ -221,6 +238,6 @@
 			</plugin>
 		</plugins>
-		
+
 	</build>
-	
+
 </project>
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/EprmsSprApplication.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/EprmsSprApplication.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/EprmsSprApplication.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -21,16 +21,4 @@
 package info.ajanovski.eprms.spr;
 
-import java.util.EnumSet;
-
-import javax.servlet.DispatcherType;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.SessionTrackingMode;
-
-import org.jasig.cas.client.authentication.AuthenticationFilter;
-import org.jasig.cas.client.session.SingleSignOutFilter;
-import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
-import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
-import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,18 +26,13 @@
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
-import org.springframework.boot.web.server.ErrorPage;
-import org.springframework.boot.web.servlet.ServletContextInitializer;
-import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
 import org.springframework.context.annotation.Bean;
-import org.springframework.http.HttpStatus;
-
-import info.ajanovski.eprms.spr.util.AppConfig;
-import info.ajanovski.eprms.spr.util.UTF8Filter;
-import info.ajanovski.eprms.spr.util.UserInfo;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
 @EntityScan(basePackages = "info.ajanovski.eprms.model.entities")
+@EnableTransactionManagement
 public class EprmsSprApplication {
+
+	private static final Logger logger = LoggerFactory.getLogger(EprmsSprApplication.class);
 
 	public static void main(String[] args) {
@@ -59,5 +42,5 @@
 	@Bean(name = "studentPageNames")
 	public String[] getStudentPageNames() {
-		return new String[] { "Index", "MyDatabases", "MyRepositories", "MyRepositoryAuth" };
+		return new String[] { "MyDatabases", "MyRepositories", "MyRepositoryAuth", "admin/ManageDatabases" };
 	}
 
@@ -67,56 +50,3 @@
 	}
 
-	private static final Logger logger = LoggerFactory.getLogger(UserInfo.class);
-
-	@Bean
-	public ServletContextInitializer initializer() {
-		return new ServletContextInitializer() {
-			@Override
-			public void onStartup(ServletContext servletContext) throws ServletException {
-
-				servletContext.setInitParameter("artifactParameterName", "ticket");
-
-				servletContext.setInitParameter("casServerLogoutUrl",
-						AppConfig.getString("cas.server") + "/cas/logout");
-
-				servletContext.setInitParameter("casServerLoginUrl", AppConfig.getString("cas.server") + "/cas/login");
-
-				servletContext.setInitParameter("casServerUrlPrefix", AppConfig.getString("cas.server") + "/cas");
-
-				servletContext.setInitParameter("service",
-						AppConfig.getString("app.server") + servletContext.getContextPath());
-
-				servletContext.addFilter("encodingFilter", UTF8Filter.class).addMappingForUrlPatterns(
-						EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false, "/*");
-
-				servletContext.addFilter("CAS Single Sign Out Filter", SingleSignOutFilter.class)
-						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
-								"/*");
-
-				servletContext.addFilter("CAS Authentication Filter", AuthenticationFilter.class)
-						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
-								"/*");
-
-				servletContext.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class)
-						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
-								"/*");
-
-				servletContext.addFilter("CAS HttpServletRequest Wrapper Filter", HttpServletRequestWrapperFilter.class)
-						.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST, DispatcherType.ERROR), false,
-								"/*");
-
-				servletContext.addListener(SingleSignOutHttpSessionListener.class);
-
-				servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
-			}
-		};
-	}
-
-	@Bean
-	public ConfigurableServletWebServerFactory webServerFactory() {
-		TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
-		factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error404"));
-		return factory;
-	}
-
 }
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/ServletInitializer.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/ServletInitializer.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/ServletInitializer.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -21,4 +21,5 @@
 package info.ajanovski.eprms.spr;
 
+import org.springframework.boot.SpringApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@@ -31,3 +32,6 @@
 	}
 
+	public static void main(String[] args) {
+		SpringApplication.run(EprmsSprApplication.class, args);
+	}
 }
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/CASConfig.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/CASConfig.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/CASConfig.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,101 @@
+package info.ajanovski.eprms.spr.configurations;
+
+import java.util.Arrays;
+
+import javax.servlet.http.HttpSessionEvent;
+
+import org.jasig.cas.client.session.SingleSignOutFilter;
+import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
+import org.jasig.cas.client.validation.Cas20ServiceTicketValidator;
+import org.jasig.cas.client.validation.TicketValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+import org.springframework.security.authentication.ProviderManager;
+import org.springframework.security.cas.ServiceProperties;
+import org.springframework.security.cas.authentication.CasAuthenticationProvider;
+import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
+import org.springframework.security.cas.web.CasAuthenticationFilter;
+import org.springframework.security.web.authentication.logout.LogoutFilter;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+
+import info.ajanovski.eprms.spr.services.CustomUserDetailsService;
+import info.ajanovski.eprms.spr.util.AppConfig;
+
+@Configuration
+public class CASConfig {
+
+	private final CustomUserDetailsService customUserDetailsService;
+
+	@Autowired
+	public CASConfig(CustomUserDetailsService customUserDetailsService) {
+		this.customUserDetailsService = customUserDetailsService;
+	}
+
+	@Bean
+	public ServiceProperties serviceProperties() {
+		ServiceProperties serviceProperties = new ServiceProperties();
+		serviceProperties.setService(AppConfig.getString("app.server") + "/login/cas");
+		serviceProperties.setSendRenew(false);
+		return serviceProperties;
+	}
+
+	@Bean
+	public CasAuthenticationEntryPoint casAuthenticationEntryPoint(ServiceProperties serviceProperties) {
+		CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
+		entryPoint.setLoginUrl(AppConfig.getString("cas.server") + "/cas/login");
+		entryPoint.setServiceProperties(serviceProperties);
+		return entryPoint;
+	}
+
+	@Bean
+	public TicketValidator ticketValidator() {
+		return new Cas20ServiceTicketValidator(AppConfig.getString("cas.server") + "/cas");
+	}
+
+	@Bean
+	public CasAuthenticationProvider casAuthenticationProvider() {
+		CasAuthenticationProvider provider = new CasAuthenticationProvider();
+		provider.setServiceProperties(this.serviceProperties());
+		provider.setTicketValidator(this.ticketValidator());
+		provider.setUserDetailsService(this.customUserDetailsService);
+		provider.setKey("CAS_PROVIDER_LOCALHOST_8080");
+		return provider;
+	}
+
+	@Bean
+	public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties serviceProperties) throws Exception {
+		CasAuthenticationFilter filter = new CasAuthenticationFilter();
+		filter.setServiceProperties(serviceProperties);
+		filter.setAuthenticationManager(new ProviderManager(Arrays.asList(this.casAuthenticationProvider())));
+		return filter;
+	}
+
+	@Bean
+	public SecurityContextLogoutHandler securityContextLogoutHandler() {
+		return new SecurityContextLogoutHandler();
+	}
+
+	@Bean
+	public LogoutFilter logoutFilter() {
+		LogoutFilter logoutFilter = new LogoutFilter(AppConfig.getString("cas.server") + "/cas/logout",
+				this.securityContextLogoutHandler());
+		logoutFilter.setFilterProcessesUrl(AppConfig.getString("app.server") + "/logout/cas");
+		return logoutFilter;
+	}
+
+	@Bean
+	public SingleSignOutFilter singleSignOutFilter() {
+		SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter();
+		singleSignOutFilter.setLogoutCallbackPath(AppConfig.getString("cas.server") + "/cas");
+		singleSignOutFilter.setIgnoreInitConfiguration(true);
+		return singleSignOutFilter;
+	}
+
+	@EventListener
+	public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(HttpSessionEvent event) {
+		return new SingleSignOutHttpSessionListener();
+	}
+
+}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/SecurityConfig.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/SecurityConfig.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/configurations/SecurityConfig.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,69 @@
+package info.ajanovski.eprms.spr.configurations;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.jasig.cas.client.session.SingleSignOutFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.cas.authentication.CasAuthenticationProvider;
+import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
+import org.springframework.security.cas.web.CasAuthenticationFilter;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.authentication.logout.LogoutFilter;
+import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
+
+@Configuration
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(securedEnabled = true)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+	private final CasAuthenticationProvider casAuthenticationProvider;
+	private final CasAuthenticationEntryPoint casAuthenticationEntryPoint;
+	private final LogoutFilter logoutFilter;
+	private final SingleSignOutFilter singleSignOutFilter;
+
+	@Autowired
+	public SecurityConfig(CasAuthenticationProvider casAuthenticationProvider,
+			CasAuthenticationEntryPoint casAuthenticationEntryPoint, LogoutFilter logoutFilter,
+			SingleSignOutFilter singleSignOutFilter) {
+		this.casAuthenticationProvider = casAuthenticationProvider;
+		this.casAuthenticationEntryPoint = casAuthenticationEntryPoint;
+		this.logoutFilter = logoutFilter;
+		this.singleSignOutFilter = singleSignOutFilter;
+	}
+
+	@Override
+	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+		auth.authenticationProvider(this.casAuthenticationProvider);
+	}
+
+//	@Bean
+//	public PasswordEncoder passwordEncoder() {
+//		return new BCryptPasswordEncoder();
+//	}
+
+	@Override
+	protected void configure(HttpSecurity http) throws Exception {
+		http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
+		http.authorizeRequests().regexMatchers("/My.*", "/admin/.*").authenticated();
+		http.httpBasic().authenticationEntryPoint(this.casAuthenticationEntryPoint);
+//		http.formLogin();
+		http.logout().logoutSuccessHandler((httpServletRequest, httpServletResponse, authentication) -> {
+			httpServletResponse.addHeader("Set-Cookie",
+					"JSESSIONID=; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT");
+			httpServletResponse.addHeader("Set-Cookie",
+					"XSRF-TOKEN=; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT");
+			httpServletResponse.setStatus(HttpServletResponse.SC_OK);
+		});
+		http.addFilterBefore(this.logoutFilter, LogoutFilter.class);
+		http.addFilterBefore(this.singleSignOutFilter, CasAuthenticationFilter.class);
+	}
+
+}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/Index.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/Index.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/Index.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -21,7 +21,4 @@
 package info.ajanovski.eprms.spr.controllers;
 
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,36 +26,11 @@
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.SessionAttributes;
-
-import info.ajanovski.eprms.spr.services.ModelConstructor;
-import info.ajanovski.eprms.spr.services.PersonManager;
-import info.ajanovski.eprms.spr.util.UserInfo;
 
 @Controller
-@SessionAttributes("userInfo")
 public class Index {
 	private static final Logger logger = LoggerFactory.getLogger(Index.class);
 
-	@Inject
-	private ModelConstructor modelOps;
-
-	@Inject
-	public HttpServletRequest request;
-
-	@Inject
-	public PersonManager personManager;
-
-	@ModelAttribute("userInfo")
-	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
-	}
-
 	@GetMapping(path = { "Index", "/" })
-	public String Index(Model model, @ModelAttribute("userInfo") UserInfo userInfo) {
-		if (userInfo == null) {
-			userInfo = userInfo();
-		}
-		model = modelOps.addMainModelAttribs("ERPMS - Home Page", model, userInfo);
+	public String Index(Model model) {
 		return "Index";
 	}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/LoginLogout.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/LoginLogout.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/LoginLogout.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource 
+ * Management System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *     
+ * You should have received a copy of the GNU General Public License
+ * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ ******************************************************************************/
+
+package info.ajanovski.eprms.spr.controllers;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import info.ajanovski.eprms.spr.util.AppConfig;
+
+@Controller
+public class LoginLogout {
+	private final Logger logger = LoggerFactory.getLogger(LoginLogout.class);
+
+	@GetMapping("Login")
+	public String login() {
+		logger.info("Login called");
+		return "redirect:/MyProfile";
+	}
+
+	@GetMapping(path = { "Logout" })
+	public String logout(HttpServletRequest request, HttpServletResponse response,
+			SecurityContextLogoutHandler logoutHandler, Model model) {
+		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+		logoutHandler.logout(request, response, auth);
+		new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY)
+				.logout(request, response, auth);
+		model.addAttribute("casLogoutLink",
+				AppConfig.getString("cas.server") + "/cas/logout?service=" + AppConfig.getString("app.server"));
+		return "Logout";
+	}
+
+}
Index: rms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/Logout.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/Logout.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ 	(revision )
@@ -1,71 +1,0 @@
-/*******************************************************************************
- * Copyright (C) 2021 Vangel V. Ajanovski
- *     
- * This file is part of the EPRMS - Educational Project and Resource 
- * Management System (hereinafter: EPRMS).
- *     
- * EPRMS is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *     
- * EPRMS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *     
- * You should have received a copy of the GNU General Public License
- * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
- ******************************************************************************/
-
-package info.ajanovski.eprms.spr.controllers;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-
-import info.ajanovski.eprms.spr.services.ModelConstructor;
-import info.ajanovski.eprms.spr.services.PersonManager;
-import info.ajanovski.eprms.spr.util.AppConfig;
-
-@Controller
-public class Logout {
-	private final Logger logger = LoggerFactory.getLogger(Logout.class);
-
-	@Inject
-	private ModelConstructor modelOps;
-
-	@Inject
-	public HttpServletRequest request;
-
-	@Inject
-	public PersonManager personManager;
-
-	@GetMapping(path = { "Logout" })
-	public String onActivate(Model model, HttpServletRequest request, HttpSession session) {
-		model = modelOps.addPublicModelAttribs("ERPMS - Logout", model);
-		model.addAttribute("casServer", request.getServletContext().getInitParameter("casServerLogoutUrl"));
-		model.addAttribute("appServer", request.getServletContext().getInitParameter("service"));
-		model.addAttribute("logoutRedirectToServer", AppConfig.getString("logout.redirectToServer"));
-
-		// Clear session
-		// Session session = request.getSession(false);
-		if (session != null) {
-			session.invalidate();
-			logger.debug("Session successfully invalidated!");
-		}
-
-		clearCookie();
-		return "Logout";
-	}
-
-	private void clearCookie() {
-	}
-
-}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyDatabases.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyDatabases.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyDatabases.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -56,5 +56,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyProfile.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyProfile.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyProfile.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (C) 2021 Vangel V. Ajanovski
+ *     
+ * This file is part of the EPRMS - Educational Project and Resource 
+ * Management System (hereinafter: EPRMS).
+ *     
+ * EPRMS is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *     
+ * EPRMS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *     
+ * You should have received a copy of the GNU General Public License
+ * along with EPRMS.  If not, see <https://www.gnu.org/licenses/>.
+ ******************************************************************************/
+
+package info.ajanovski.eprms.spr.controllers;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.SessionAttributes;
+
+import info.ajanovski.eprms.spr.services.ModelConstructor;
+import info.ajanovski.eprms.spr.services.PersonManager;
+import info.ajanovski.eprms.spr.util.UserInfo;
+
+@Controller
+@SessionAttributes("userInfo")
+public class MyProfile {
+	private final Logger logger = LoggerFactory.getLogger(LoginLogout.class);
+
+	@Inject
+	private ModelConstructor modelOps;
+
+	@Inject
+	public HttpServletRequest request;
+
+	@Inject
+	public PersonManager personManager;
+
+	@ModelAttribute("userInfo")
+	public UserInfo userInfo() {
+		return new UserInfo(personManager);
+	}
+
+	@GetMapping(path = { "MyProfile" })
+	public String Index(Model model, @ModelAttribute("userInfo") UserInfo userInfo) {
+		model = modelOps.addMainModelAttribs("EPM - MyDatabases", model, userInfo);
+		return "MyProfile";
+	}
+
+}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositories.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositories.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositories.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -28,4 +28,5 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.access.annotation.Secured;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -56,5 +57,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositoryAuth.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositoryAuth.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/MyRepositoryAuth.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -60,6 +60,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		logger.info("setup session attribute userInfo");
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageDatabases.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageDatabases.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageDatabases.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -28,4 +28,5 @@
 import javax.transaction.Transactional;
 
+import org.springframework.security.access.annotation.Secured;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -44,4 +45,5 @@
 @Controller
 @SessionAttributes({ "userInfo", "isOnlyShowNotCreated" })
+@Secured("ROLE_ADMINISTRATOR")
 public class ManageDatabases {
 
@@ -57,5 +59,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageRepositories.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageRepositories.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/ManageRepositories.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -30,4 +30,5 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.access.annotation.Secured;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -45,4 +46,5 @@
 @Controller
 @SessionAttributes({ "userInfo", "isOnlyShowNotCreated" })
+@Secured("ROLE_ADMINISTRATOR")
 public class ManageRepositories {
 	private static final Logger logger = LoggerFactory.getLogger(ManageRepositories.class);
@@ -59,6 +61,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		logger.info("general user info");
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Projects.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Projects.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Projects.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -30,4 +30,5 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.access.annotation.Secured;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -38,5 +39,4 @@
 import org.springframework.web.bind.annotation.SessionAttributes;
 
-import groovy.util.logging.Log4j2;
 import info.ajanovski.eprms.model.entities.Database;
 import info.ajanovski.eprms.model.entities.Person;
@@ -53,5 +53,5 @@
 @Controller
 @SessionAttributes({ "userInfo", "selectedProject" })
-@Log4j2
+@Secured("ROLE_ADMINISTRATOR")
 public class Projects {
 	private static final Logger logger = LoggerFactory.getLogger(Projects.class);
@@ -68,5 +68,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Teams.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Teams.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/controllers/admin/Teams.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -28,4 +28,5 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.access.annotation.Secured;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -42,4 +43,5 @@
 @Controller
 @SessionAttributes("userInfo")
+@Secured("ROLE_ADMINISTRATOR")
 public class Teams {
 	private static final Logger logger = LoggerFactory.getLogger(Teams.class);
@@ -56,5 +58,5 @@
 	@ModelAttribute("userInfo")
 	public UserInfo userInfo() {
-		return new UserInfo(request, personManager);
+		return new UserInfo(personManager);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/GenericDaoImpl.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/GenericDaoImpl.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/GenericDaoImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -28,10 +28,10 @@
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
 
-import org.hibernate.Session;
-import org.hibernate.criterion.MatchMode;
-import org.hibernate.criterion.Restrictions;
 import org.hibernate.exception.DataException;
-import org.hibernate.query.Query;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,8 +46,4 @@
 	EntityManager entityManager;
 
-	private Session getSession() {
-		return entityManager.unwrap(org.hibernate.Session.class);
-	}
-
 	@Override
 	public Object getByPK(Class<?> classToLoad, long id) {
@@ -57,10 +53,10 @@
 	@Override
 	public void deleteByPK(Class<?> classToLoad, long id) {
-		getSession().delete(getByPK(classToLoad, id));
+		entityManager.remove(getByPK(classToLoad, id));
 	}
 
 	@Override
 	public void delete(Object object) {
-		getSession().delete(object);
+		entityManager.remove(object);
 	}
 
@@ -68,8 +64,8 @@
 	public List<Object> getQueryResult(String guery) {
 		try {
-			Query q = getSession().createQuery(guery);
+			Query q = entityManager.createQuery(guery);
 			List<Object> l = new ArrayList<Object>();
 
-			for (Iterator<?> it = q.iterate(); it.hasNext();) {
+			for (Iterator<?> it = q.getResultList().iterator(); it.hasNext();) {
 				Object[] row = (Object[]) it.next();
 				for (int i = 0; i < row.length; i++) {
@@ -83,6 +79,5 @@
 		} catch (DataException e) {
 			// Critical errors : database unreachable, etc.
-			logger.error(
-					"Exception - DataAccessException occurs : " + e.getMessage() + " on complete getQueryResult().");
+			logger.error("Exception - DataAccessException occurs : {} on complete getQueryResult().", e.getMessage());
 			return null;
 		}
@@ -108,7 +103,16 @@
 	@Override
 	public Object getByCode(Class<?> classToLoad, String code) {
-		List<?> l = getSession().createCriteria(classToLoad).add(Restrictions.eq("code", code)).list();
-		if (l.size() > 0) {
-			return l.get(0);
+		if (code != null) {
+			CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+			CriteriaQuery criteriaQuery = cb.createQuery(classToLoad.getClass());
+			Root root = criteriaQuery.from(classToLoad.getClass());
+			criteriaQuery.select(root).where(cb.equal(root.get("code"), code));
+			Query query = entityManager.createQuery(criteriaQuery);
+			List results = query.getResultList();
+			if (results.size() > 0) {
+				return results.get(0);
+			} else {
+				return null;
+			}
 		} else {
 			return null;
@@ -119,6 +123,11 @@
 	public List<?> getByTitleSubstring(Class<?> classToSearch, String searchSubString) {
 		if (searchSubString != null) {
-			return (List<?>) getSession().createCriteria(classToSearch)
-					.add(Restrictions.ilike("title", searchSubString, MatchMode.ANYWHERE)).list();
+			CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+			CriteriaQuery criteriaQuery = cb.createQuery(classToSearch.getClass());
+			Root root = criteriaQuery.from(classToSearch.getClass());
+			criteriaQuery.select(root).where(cb.like(root.get("title"), "%" + searchSubString + "%"));
+			Query query = entityManager.createQuery(criteriaQuery);
+			List results = query.getResultList();
+			return results;
 		} else {
 			return null;
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDao.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDao.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDao.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -26,4 +26,5 @@
 import info.ajanovski.eprms.model.entities.Person;
 import info.ajanovski.eprms.model.entities.PersonRole;
+import info.ajanovski.eprms.model.entities.Role;
 
 public interface PersonDao {
@@ -40,3 +41,5 @@
 	public List<PersonRole> getPersonRolesForPerson(long personId);
 
+	public List<Role> getRolesForPerson(long personId);
+
 }
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDaoImpl.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDaoImpl.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/PersonDaoImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -27,31 +27,25 @@
 import javax.persistence.PersistenceContext;
 
-import org.hibernate.Session;
-import org.hibernate.criterion.Order;
-import org.hibernate.criterion.Restrictions;
-import org.hibernate.exception.DataException;
-import org.hibernate.query.Query;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import info.ajanovski.eprms.model.entities.Person;
 import info.ajanovski.eprms.model.entities.PersonRole;
-import info.ajanovski.eprms.spr.util.UsefulMethods;
+import info.ajanovski.eprms.model.entities.Role;
 
 @Service
 public class PersonDaoImpl implements PersonDao {
+	private final Logger logger = LoggerFactory.getLogger(PersonDaoImpl.class);
 
 	@PersistenceContext
 	EntityManager entityManager;
 
-	private Session getSession() {
-		return entityManager.unwrap(org.hibernate.Session.class);
-	}
-
 	@Override
 	public List<Person> getAllPersons() {
 		try {
-			return UsefulMethods.castList(Person.class,
-					getSession().createCriteria(Person.class).addOrder(Order.asc("lastName")).list());
-		} catch (DataException e) {
+			return (List<Person>) entityManager.createQuery("from Person order by lastName, firstName, userName")
+					.getResultList();
+		} catch (Exception e) {
 			return null;
 		}
@@ -60,6 +54,11 @@
 	@Override
 	public Person getPersonByUsername(String username) {
-		return (Person) getSession().createCriteria(Person.class).add(Restrictions.eq("userName", username))
-				.setReadOnly(true).setCacheable(true).uniqueResult();
+		try {
+			return (Person) entityManager.createQuery("from Person where userName=:userName")
+					.setParameter("userName", username).getSingleResult();
+		} catch (Exception e) {
+			logger.error("Person with userName:{} was not found.", username);
+			return null;
+		}
 	}
 
@@ -67,14 +66,19 @@
 	public List<Person> getPersonByFilter(String filter) {
 		String f = "%" + filter.toLowerCase() + "%";
-		Query q = getSession()
-				.createQuery("select p from Person p  where (lower(concat(userName,firstName,lastName)) like :filter)");
-		q.setParameter("filter", f);
-		return UsefulMethods.castList(Person.class, q.list());
+		return entityManager
+				.createQuery("select p from Person p  where (lower(concat(userName,firstName,lastName)) like :filter)")
+				.setParameter("filter", f).getResultList();
 	}
 
 	@Override
 	public List<PersonRole> getPersonRolesForPerson(long personId) {
-		return (List<PersonRole>) getSession().createCriteria(PersonRole.class, "pr")
-				.add(Restrictions.eq("pr.person.personId", personId)).list();
+		return entityManager.createQuery("select pr from PersonRole pr " + "join pr.role r " + "join pr.person p "
+				+ "where p.personId=:personId").setParameter("personId", personId).getResultList();
+	}
+
+	@Override
+	public List<Role> getRolesForPerson(long personId) {
+		return entityManager.createQuery("select pr.role from PersonRole pr where pr.person.personId=:personId")
+				.setParameter("personId", personId).getResultList();
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/ResourceDaoImpl.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/ResourceDaoImpl.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/data/ResourceDaoImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -28,5 +28,4 @@
 import javax.persistence.PersistenceContext;
 
-import org.hibernate.Session;
 import org.springframework.stereotype.Service;
 
@@ -40,13 +39,9 @@
 	EntityManager entityManager;
 
-	private Session getSession() {
-		return entityManager.unwrap(org.hibernate.Session.class);
-	}
-
 	@Override
 	public List<Repository> getRepositoriesByPerson(long personId) {
 		try {
-			return getSession().createQuery("from Repository r where r.person.personId=:personId")
-					.setLong("personId", personId).list();
+			return entityManager.createQuery("from Repository r where r.person.personId=:personId")
+					.setParameter("personId", personId).getResultList();
 		} catch (Exception e) {
 			return new ArrayList<Repository>();
@@ -57,8 +52,8 @@
 	public List<Repository> getRepositoriesByTeam(long personId) {
 		try {
-			return getSession().createQuery("""
+			return entityManager.createQuery("""
 					select r from Repository r join r.team t, TeamMember tm join tm.person p
 					where tm.team.teamId=t.teamId and r.person.personId=:personId
-					""").setParameter("personId", personId).list();
+					""").setParameter("personId", personId).getResultList();
 		} catch (Exception e) {
 			return new ArrayList<Repository>();
@@ -69,10 +64,10 @@
 	public List<Repository> getRepositoriesByProject(long personId) {
 		try {
-			return getSession().createQuery("""
+			return entityManager.createQuery("""
 					select r from Repository r join r.project pr,
 					Responsibility res join res.team t, TeamMember tm join tm.person p
 					where pr.projectId=res.project.projectId and tm.team.teamId=t.teamId and
 					tm.person.personId=:personId
-					""").setLong("personId", personId).list();
+					""").setParameter("personId", personId).getResultList();
 		} catch (Exception e) {
 			return new ArrayList<Repository>();
@@ -83,10 +78,10 @@
 	public List<Database> getDatabasesByProject(long personId) {
 		try {
-			return getSession().createQuery("""
+			return entityManager.createQuery("""
 					select d from Database d join d.project pr,
 					Responsibility res join res.team t, TeamMember tm join tm.person p
 					where pr.projectId=res.project.projectId and tm.team.teamId=t.teamId and
 					tm.person.personId=:personId
-					""").setLong("personId", personId).list();
+					""").setParameter("personId", personId).getResultList();
 		} catch (Exception e) {
 			return new ArrayList<Database>();
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsService.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsService.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsService.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,7 @@
+package info.ajanovski.eprms.spr.services;
+
+import org.springframework.security.core.userdetails.UserDetailsService;
+
+public interface CustomUserDetailsService extends UserDetailsService {
+
+}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsServiceImpl.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsServiceImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/CustomUserDetailsServiceImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,57 @@
+package info.ajanovski.eprms.spr.services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.logging.log4j.util.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import info.ajanovski.eprms.model.entities.Person;
+import info.ajanovski.eprms.model.entities.Role;
+import info.ajanovski.eprms.model.util.ModelConstants;
+
+@Service
+public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
+
+	private final Logger logger = LoggerFactory.getLogger(CustomUserDetailsServiceImpl.class);
+
+	@Inject
+	public CustomUserDetailsServiceImpl(PersonManager personManager) {
+		this.personManager = personManager;
+	}
+
+	private PersonManager personManager;
+
+	@Override
+	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+		logger.info("Login attempted by: {}", username);
+		Person person = personManager.getPersonByUsername(username);
+		if (person != null) {
+			List<String> authList = new ArrayList<String>();
+			for (Role r : personManager.getRolesForPerson(person.getPersonId())) {
+				if (r.getName().equals(ModelConstants.RoleAdministrator)) {
+					authList.add("ROLE_ADMINISTRATOR");
+				} else if (r.getName().equals(ModelConstants.RoleInstructor)) {
+					authList.add("ROLE_INSTRUCTOR");
+				} else if (r.getName().equals(ModelConstants.RoleStudent)) {
+					authList.add("ROLE_STUDENT");
+				}
+			}
+			logger.info("Roles by {} :{}", username, Strings.join(authList, ','));
+			return new User(person.getUserName(), "", true, true, true, true,
+					AuthorityUtils.commaSeparatedStringToAuthorityList(Strings.join(authList, ',')));
+		} else {
+			logger.error("Username {} not found! Throwing exception.", username);
+			throw new UsernameNotFoundException("UserName Not Found");
+		}
+	}
+
+}
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/ModelConstructor.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/ModelConstructor.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/ModelConstructor.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -51,4 +51,13 @@
 	}
 
+	public Model addMainModelNoUserAttribs(String title, Model model) {
+		model.addAttribute("title", title);
+		model.addAttribute("studentPageNames", studentPageNames);
+		model.addAttribute("adminPageNames", adminPageNames);
+		model.addAttribute("classForPageName", "nav-link");
+		model.addAttribute("displayLanguage", "en");
+		return model;
+	}
+
 	public Model addPublicModelAttribs(String title, Model model) {
 		model.addAttribute("title", title);
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManager.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManager.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManager.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -25,4 +25,5 @@
 import info.ajanovski.eprms.model.entities.Person;
 import info.ajanovski.eprms.model.entities.PersonRole;
+import info.ajanovski.eprms.model.entities.Role;
 
 public interface PersonManager {
@@ -40,3 +41,5 @@
 	public List<PersonRole> getPersonRolesForPerson(long personId);
 
+	public List<Role> getRolesForPerson(long personId);
+
 }
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManagerImpl.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManagerImpl.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/services/PersonManagerImpl.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -29,4 +29,5 @@
 import info.ajanovski.eprms.model.entities.Person;
 import info.ajanovski.eprms.model.entities.PersonRole;
+import info.ajanovski.eprms.model.entities.Role;
 import info.ajanovski.eprms.spr.data.PersonDao;
 
@@ -59,6 +60,12 @@
 	}
 
+	@Override
 	public List<PersonRole> getPersonRolesForPerson(long personId) {
 		return personDao.getPersonRolesForPerson(personId);
+	}
+
+	@Override
+	public List<Role> getRolesForPerson(long personId) {
+		return personDao.getRolesForPerson(personId);
 	}
 
Index: eprms-spr/src/main/java/info/ajanovski/eprms/spr/util/UserInfo.java
===================================================================
--- eprms-spr/src/main/java/info/ajanovski/eprms/spr/util/UserInfo.java	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/java/info/ajanovski/eprms/spr/util/UserInfo.java	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -24,8 +24,9 @@
 import java.util.List;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
 
 import info.ajanovski.eprms.model.entities.Person;
@@ -43,20 +44,20 @@
 	private List<UserRole> userRoles;
 
-	HttpServletRequest request;
-	PersonManager pm;
+	private PersonManager pm;
 	private static final Logger logger = LoggerFactory.getLogger(UserInfo.class);
 
-	public UserInfo(HttpServletRequest request, PersonManager pm) {
-		if (request != null && pm != null) {
-			this.request = request;
+	public UserInfo(PersonManager pm) {
+		if (pm != null) {
 			this.pm = pm;
-			if (request.getRemoteUser() != null) {
-				this.userName = request.getRemoteUser();
+			Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+			if (auth.getPrincipal() != null) {
+				logger.info("Login by: {}", auth.getPrincipal());
+				userName = ((UserDetails) auth.getPrincipal()).getUsername();
 				this.setupUser();
 			} else {
-				this.userName = null;
+				userName = null;
 			}
 		} else {
-			this.userName = null;
+			userName = null;
 		}
 	}
@@ -64,5 +65,4 @@
 	private void setupUser() {
 		if (userName != null) {
-			logger.info("Logged in user: {}", userName);
 			userRoles = new ArrayList<UserRole>();
 			Person p = pm.getPersonByUsername(userName);
Index: eprms-spr/src/main/resources/app.properties
===================================================================
--- eprms-spr/src/main/resources/app.properties	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/app.properties	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -16,4 +16,5 @@
 application-logout=Application Logout
 
+login-label=CAS Login
 admin-label=Admin
 app-title-short=EPRMS
Index: eprms-spr/src/main/resources/app_mk.properties
===================================================================
--- eprms-spr/src/main/resources/app_mk.properties	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/app_mk.properties	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -13,4 +13,5 @@
 admin/ManageDatabases-pagelink=\u0423\u043F\u0440\u0430\u0432\u0443\u0432\u0430\u045A\u0435 \u0441\u043E \u0431\u0430\u0437\u0438 \u043D\u0430 \u043F\u043E\u0434\u0430\u0442\u043E\u0446\u0438
 
+login-label=\u041D\u0430\u0458\u0430\u0432\u0430
 delete-confirmation-label=Are you sure you want to delete this item?
 
Index: eprms-spr/src/main/resources/templates/Index.html
===================================================================
--- eprms-spr/src/main/resources/templates/Index.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/templates/Index.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -1,4 +1,4 @@
 <!DOCTYPE html>
-<html data-layout-decorate="~{fragments/layout.html}" lang="en">
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
 <head>
 <title data-th-text="#{app-title-short}"></title>
Index: eprms-spr/src/main/resources/templates/Logout.html
===================================================================
--- eprms-spr/src/main/resources/templates/Logout.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/templates/Logout.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -20,5 +20,5 @@
 		<p>
 			[[#{logout-desc-total}]]<br /> <a
-				data-th-href="@{${casServer}(service=${logoutRedirectToServer})}"
+				data-th-href="${casLogoutLink}"
 				class="btn btn-primary">[[#{logout-desc-total-title}]]</a> <br />
 			[[#{logout-desc-total-cont}]]
Index: eprms-spr/src/main/resources/templates/MyProfile.html
===================================================================
--- eprms-spr/src/main/resources/templates/MyProfile.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/MyProfile.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layout.html}" lang="en">
+<head>
+<title data-th-text="#{app-title-short}"></title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+
+				<div class="col-md-3 offset-md-1 mx-3 my-3">
+					<div class="view overlay">
+						<div class="mask rgba-white-slight">
+							<a> <img src="images/logo.png" class="img-fluid"
+								data-th-alt="#{greeting}" /></a>
+						</div>
+					</div>
+				</div>
+
+				<div class="col-md-8 text-md-left ml-3 mt-3">
+					<h4 class="h4 mb-4">[[#{greeting-title}]] [[${userInfo.userName}]]</h4>
+					<p class="font-weight-normal" data-th-text="#{greeting}"></p>
+					<a class="btn btn-success" data-th-href="#{greeting-url}"
+						data-th-text="#{greeting-url}"></a>
+				</div>
+
+			</div>
+
+		</div>
+
+	</div>
+</html>
Index: eprms-spr/src/main/resources/templates/admin/ManageDatabases.html
===================================================================
--- eprms-spr/src/main/resources/templates/admin/ManageDatabases.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/templates/admin/ManageDatabases.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -6,5 +6,5 @@
 <body>
 
-	<div layout:fragment="content">
+	<div data-layout-fragment="content">
 
 		<h1>[[#{admin/ManageDatabases-pagelink}]]</h1>
Index: rms-spr/src/main/resources/templates/error-403.html
===================================================================
--- eprms-spr/src/main/resources/templates/error-403.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ 	(revision )
@@ -1,16 +1,0 @@
-<!DOCTYPE html>
-<html data-layout-decorate="~{fragments/layout.html}" lang="en">
-<head>
-<title>ERROR</title>
-</head>
-<body>
-	<div data-layout-fragment="content">
-		<div class="row">
-			<div class="span-12">
-				<h1>Access Forbidden</h1>
-
-			</div>
-		</div>
-	</div>
-</body>
-</html>
Index: rms-spr/src/main/resources/templates/error-404.html
===================================================================
--- eprms-spr/src/main/resources/templates/error-404.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ 	(revision )
@@ -1,16 +1,0 @@
-<!DOCTYPE html>
-<html data-layout-decorate="~{fragments/layout.html}" lang="en">
-<head>
-<title>ERROR</title>
-</head>
-<body>
-	<div data-layout-fragment="content">
-		<div class="row">
-			<div class="span-12">
-				<h1>Resource Not Found</h1>
-
-			</div>
-		</div>
-	</div>
-</body>
-</html>
Index: rms-spr/src/main/resources/templates/error-500.html
===================================================================
--- eprms-spr/src/main/resources/templates/error-500.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ 	(revision )
@@ -1,16 +1,0 @@
-<!DOCTYPE html>
-<html data-layout-decorate="~{fragments/layout.html}" lang="en">
-<head>
-<title>ERROR</title>
-</head>
-<body>
-	<div data-layout-fragment="content">
-		<div class="row">
-			<div class="span-12">
-				<h1>Internal Server Error</h1>
-
-			</div>
-		</div>
-	</div>
-</body>
-</html>
Index: rms-spr/src/main/resources/templates/error.html
===================================================================
--- eprms-spr/src/main/resources/templates/error.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ 	(revision )
@@ -1,16 +1,0 @@
-<!DOCTYPE html>
-<html data-layout-decorate="~{fragments/layout.html}" lang="en">
-<head>
-<title>ERROR</title>
-</head>
-<body>
-	<div data-layout-fragment="content">
-		<div class="row">
-			<div class="span-12">
-				<h1>Error</h1>
-
-			</div>
-		</div>
-	</div>
-</body>
-</html>
Index: eprms-spr/src/main/resources/templates/error/401.html
===================================================================
--- eprms-spr/src/main/resources/templates/error/401.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/error/401.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
+<head>
+<title data-th-text="#{app-title-short}"></title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+				<div class="span-12">
+					<h1>Unrecognized user</h1>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
+</body>
+</html>
Index: eprms-spr/src/main/resources/templates/error/403.html
===================================================================
--- eprms-spr/src/main/resources/templates/error/403.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/error/403.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
+<head>
+<title>ERROR</title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+				<div class="span-12">
+					<h1>Access Denied</h1>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
+</body>
+</html>
Index: eprms-spr/src/main/resources/templates/error/404.html
===================================================================
--- eprms-spr/src/main/resources/templates/error/404.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/error/404.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
+<head>
+<title>ERROR</title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+				<div class="span-12">
+					<h1>Resource not found</h1>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
+</body>
+</html>
Index: eprms-spr/src/main/resources/templates/error/500.html
===================================================================
--- eprms-spr/src/main/resources/templates/error/500.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/error/500.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
+<head>
+<title>ERROR</title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+				<div class="span-12">
+					<h1>Internal server error</h1>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
+</body>
+</html>
Index: eprms-spr/src/main/resources/templates/error/error.html
===================================================================
--- eprms-spr/src/main/resources/templates/error/error.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
+++ eprms-spr/src/main/resources/templates/error/error.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html data-layout-decorate="~{fragments/layoutGuest.html}" lang="en">
+<head>
+<title data-th-text="#{app-title-short}"></title>
+</head>
+<body>
+
+	<div data-layout-fragment="content">
+
+		<div class="jumbotron text-center hoverable p-4">
+
+			<div class="row">
+				<div class="span-12">
+					<h1>Error</h1>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+
+</body>
+</html>
Index: eprms-spr/src/main/resources/templates/fragments/layout.html
===================================================================
--- eprms-spr/src/main/resources/templates/fragments/layout.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/templates/fragments/layout.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -10,17 +10,18 @@
 <meta name="description" data-th-content="#{system-description}" />
 <meta name="author" data-th-content="#{main-developer-name}" />
-<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="shortcut icon" data-th-href="@{favicon.ico}" />
 <meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT" />
 <meta http-equiv="Pragma" content="no-cache" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-<base href="/" />
-<script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script>
+<base data-th-href="@{/}" />
+<script type="text/javascript"
+	data-th-src="@{webjars/jquery/jquery.min.js}"></script>
 <link rel="stylesheet" type="text/css"
-	href="/webjars/bootstrap/css/bootstrap.min.css" />
+	data-th-href="@{webjars/bootstrap/css/bootstrap.min.css}" />
 <!--  >link rel="stylesheet" type="text/css"
 	href="/mybootstrap/css/bootstrap-theme.css" /-->
 <script type="text/javascript"
-	src="/webjars/bootstrap/js/bootstrap.min.js"></script>
-<link rel="stylesheet" href="site-overrides.css"></link>
+	data-th-src="@{webjars/bootstrap/js/bootstrap.min.js}"></script>
+<link rel="stylesheet" data-th-href="@{site-overrides.css}"></link>
 </head>
 
@@ -29,5 +30,6 @@
 	<nav class="navbar navbar-dark navbar-expand-lg bg-dark fixed-top"
 		style="background-color: #03030f;">
-		<a class="navbar-brand" href="Index" data-th-text="#{app-title-short}"></a>
+		<a class="navbar-brand" data-th-href="@{MyProfile}"
+			data-th-text="#{app-title-short}"></a>
 		<button class="navbar-toggler" type="button" data-toggle="collapse"
 			data-target="#mainMenu" aria-controls="mainMenu"
@@ -37,5 +39,5 @@
 
 		<div class="collapse navbar-collapse" id="mainMenu">
-			<ul class="navbar-nav mr-auto">
+			<ul class="navbar-nav mr-auto" data-th-if="${userInfo}">
 				<li data-th-if="${userInfo}"
 					data-th-each="pageName: ${studentPageNames}" class="nav-item"><a
@@ -57,5 +59,5 @@
 				<li class="nav-item"><a class="nav-link" href=""
 					id="localeToggle">[[#{lang-label}]] [[${displayLanguage}]]</a></li>
-				<li class="nav-item dropdown"><a
+				<li class="nav-item dropdown" data-th-if="${userInfo}"><a
 					class="nav-link dropdown-toggle" href="#" id="mainMenuUserProfile"
 					role="button" data-toggle="dropdown" aria-haspopup="true"
@@ -70,4 +72,6 @@
 							[[#{Logout-label}]]</a>
 					</div></li>
+				<li class="nav-item" data-th-unless="${userInfo}"><a
+					class="nav-link" data-th-href="@{Login}" id="login">[[#{login-label}]]</a></li>
 			</ul>
 		</div>
@@ -77,5 +81,5 @@
 		<div class="row">
 			<div class="col-12">
-				<p t:alerts />
+				<p class="talerts" />
 			</div>
 		</div>
@@ -89,6 +93,6 @@
 			<p>
 				Copyright &copy;<span data-th-text="#{copyrightYear}"></span> <a
-					data-th-href="#{main-developer-url}" data-th-text="#{copyrightHolder} ">
-				</a>
+					data-th-href="#{main-developer-url}"
+					data-th-text="#{copyrightHolder} "> </a>
 			</p>
 		</footer>
Index: eprms-spr/src/main/resources/templates/fragments/layoutGuest.html
===================================================================
--- eprms-spr/src/main/resources/templates/fragments/layoutGuest.html	(revision 5a8cecfe9bf7cf1c2fd87b6fc0e86f155bf0e237)
+++ eprms-spr/src/main/resources/templates/fragments/layoutGuest.html	(revision e8ef909bbfe51b781c516c4bb2bbfd6ee195085c)
@@ -1,4 +1,4 @@
 <!DOCTYPE html>
-<html>
+<html lang="en">
 <head>
 <meta charset="utf-8" />
@@ -10,17 +10,18 @@
 <meta name="description" data-th-content="#{system-description}" />
 <meta name="author" data-th-content="#{main-developer-name}" />
-<link rel="shortcut icon" href="/favicon.ico" />
+<link rel="shortcut icon" data-th-href="@{favicon.ico}" />
 <meta http-equiv="Expires" content="Mon, 26 Jul 1997 05:00:00 GMT" />
 <meta http-equiv="Pragma" content="no-cache" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-<base href="/" />
-<script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script>
+<base data-th-href="@{/}" />
+<script type="text/javascript"
+	data-th-src="@{webjars/jquery/jquery.min.js}"></script>
 <link rel="stylesheet" type="text/css"
-	href="/webjars/bootstrap/css/bootstrap.min.css" />
+	data-th-href="@{webjars/bootstrap/css/bootstrap.min.css}" />
 <!--  >link rel="stylesheet" type="text/css"
 	href="/mybootstrap/css/bootstrap-theme.css" /-->
 <script type="text/javascript"
-	src="/webjars/bootstrap/js/bootstrap.min.js"></script>
-<link rel="stylesheet" href="site-overrides.css"></link>
+	data-th-src="@{webjars/bootstrap/js/bootstrap.min.js}"></script>
+<link rel="stylesheet" data-th-href="@{site-overrides.css}"></link>
 </head>
 
@@ -29,5 +30,5 @@
 	<nav class="navbar navbar-dark navbar-expand-lg bg-dark fixed-top"
 		style="background-color: #03030f;">
-		<a class="navbar-brand" href="Index" data-th-text="#{app-title-short}"></a>
+		<a class="navbar-brand" data-th-href="@{Index}" data-th-text="#{app-title-short}"></a>
 		<button class="navbar-toggler" type="button" data-toggle="collapse"
 			data-target="#mainMenu" aria-controls="mainMenu"
@@ -44,4 +45,6 @@
 				<li class="nav-item"><a class="nav-link" href=""
 					id="localeToggle">[[#{lang-label}]] [[${displayLanguage}]]</a></li>
+				<li class="nav-item"><a class="nav-link"
+					data-th-href="@{Login}" id="login">[[#{login-label}]]</a></li>
 			</ul>
 		</div>
@@ -63,6 +66,6 @@
 			<p>
 				Copyright &copy;<span data-th-text="#{copyrightYear}"></span> <a
-					data-th-href="#{main-developer-url}" data-th-text="#{copyrightHolder} ">
-				</a>
+					data-th-href="#{main-developer-url}"
+					data-th-text="#{copyrightHolder} "> </a>
 			</p>
 		</footer>
