Index: backend/mvnw.cmd
===================================================================
--- backend/mvnw.cmd	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/mvnw.cmd	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -24,5 +24,5 @@
 @REM Optional ENV vars
 @REM   MVNW_REPOURL - repo url base for downloading maven distribution
-@REM   MVNW_USERNAME/MVNW_PASSWORD - account and password for downloading maven
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
 @REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
 @REM ----------------------------------------------------------------------------
Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/pom.xml	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -61,4 +61,17 @@
 		</dependency>
 
+		<!-- MapStruct -->
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct</artifactId>
+			<version>1.6.3</version>
+		</dependency>
+<!--		<dependency>-->
+<!--			<groupId>org.mapstruct</groupId>-->
+<!--			<artifactId>mapstruct-processor</artifactId>-->
+<!--			<version>1.5.5.Final</version>-->
+<!--			<scope>provided</scope>-->
+<!--		</dependency>-->
+
 		<!-- Lombok -->
 		<dependency>
@@ -69,22 +82,31 @@
 		</dependency>
 
-		<!-- MapStruct (keep only if used) -->
+		<!-- JWT -->
 		<dependency>
-			<groupId>org.mapstruct</groupId>
-			<artifactId>mapstruct</artifactId>
-			<version>1.5.5.Final</version>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt-api</artifactId>
+			<version>0.11.5</version>
 		</dependency>
 		<dependency>
-			<groupId>org.mapstruct</groupId>
-			<artifactId>mapstruct-processor</artifactId>
-			<version>1.5.5.Final</version>
-			<scope>provided</scope>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt-impl</artifactId>
+			<version>0.11.5</version>
+		</dependency>
+		<dependency>
+			<groupId>io.jsonwebtoken</groupId>
+			<artifactId>jjwt-jackson</artifactId>
+			<version>0.11.5</version>
 		</dependency>
 
-		<!-- JWT (keep only if used) -->
+		<!-- Add these JAXB dependencies to fix the missing class -->
 		<dependency>
-			<groupId>io.jsonwebtoken</groupId>
-			<artifactId>jjwt</artifactId>
-			<version>0.9.1</version>
+			<groupId>jakarta.xml.bind</groupId>
+			<artifactId>jakarta.xml.bind-api</artifactId>
+			<version>4.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.glassfish.jaxb</groupId>
+			<artifactId>jaxb-runtime</artifactId>
+			<version>4.0.0</version>
 		</dependency>
 
@@ -111,9 +133,11 @@
 				<version>3.11.0</version>
 				<configuration>
+					<source>17</source>
+					<target>17</target>
 					<annotationProcessorPaths>
 						<path>
 							<groupId>org.mapstruct</groupId>
 							<artifactId>mapstruct-processor</artifactId>
-							<version>1.5.5.Final</version>
+							<version>1.6.3</version>
 						</path>
 						<path>
@@ -121,4 +145,9 @@
 							<artifactId>lombok</artifactId>
 							<version>1.18.38</version>
+						</path>
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok-mapstruct-binding</artifactId>
+							<version>0.2.0</version>
 						</path>
 					</annotationProcessorPaths>
Index: ckend/src/main/java/com/shifterwebapp/shifter/AppConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/AppConfig.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,67 +1,0 @@
-package com.shifterwebapp.shifter;
-
-import com.shifterwebapp.shifter.auth.CustomUserDetailsService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.Customizer;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.http.SessionCreationPolicy;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.NoOpPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-
-
-@Configuration
-@EnableWebSecurity
-@RequiredArgsConstructor
-public class AppConfig {
-
-    private final CustomUserDetailsService userDetailsService;
-
-    @Bean
-    public PasswordEncoder passwordEncoder() {
-        return new BCryptPasswordEncoder(12);
-    }
-
-    @Bean
-    public AuthenticationProvider authenticationProvider() {
-        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
-        provider.setUserDetailsService(userDetailsService);
-        provider.setPasswordEncoder(passwordEncoder());
-        return provider;
-    }
-
-    @Bean
-    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
-        return http.getSharedObject(AuthenticationManagerBuilder.class)
-                .authenticationProvider(authenticationProvider())
-                .build();
-    }
-
-    @Bean
-    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
-        http
-                .csrf(csrf -> csrf.disable())
-                .sessionManagement(session -> session
-                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
-                )
-                .authorizeHttpRequests(request -> request
-                        .requestMatchers("/api/auth/**").permitAll()
-                        .anyRequest().authenticated()
-                )
-//                .formLogin(AbstractHttpConfigurer::disable)
-                .httpBasic(Customizer.withDefaults())
-                .logout(AbstractHttpConfigurer::disable);
-
-        return http.build();
-    }
-
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/Validate.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -4,5 +4,5 @@
 import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
 import com.shifterwebapp.shifter.payment.PaymentRepository;
-import com.shifterwebapp.shifter.account.AccountRepository;
+import com.shifterwebapp.shifter.user.UserRepository;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
@@ -12,11 +12,17 @@
 public class Validate {
 
-    private final AccountRepository accountRepository;
+    private final UserRepository userRepository;
     private final CourseRepository courseRepository;
     private final PaymentRepository paymentRepository;
 
-    public void validateAccountExists(Long userId) {
-        if (!accountRepository.existsById(userId)) {
+    public void validateUserExists(Long userId) {
+        if (!userRepository.existsById(userId)) {
             throw new ResourceNotFoundException("User with ID " + userId + " not found!");
+        }
+    }
+
+    public void validateUserExists(String email) {
+        if (!userRepository.existsUserByEmail(email)) {
+            throw new ResourceNotFoundException("User with email " + email + " not found!");
         }
     }
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/Account.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/Account.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package com.shifterwebapp.shifter.account;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.util.List;
-
-@Getter
-@Setter
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Entity
-public class Account {
-    @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "account_seq")
-    @SequenceGenerator(name = "account_seq", sequenceName = "account_sequence", allocationSize = 1)
-    private Long id;
-
-    private String name;
-
-    private String email;
-    
-    @JsonIgnore
-    private String passwordHash;    // SHOULD I USE JSON IGNORE HERE? OR IS IT ENOUGH TO NOT EXPOSE IT IN DTO?
-
-    private Boolean isAdmin;
-    
-    private CompanyType companyType;
-    
-    private String workPosition;
-    
-    @ElementCollection(targetClass = Interests.class)
-    @Enumerated(EnumType.STRING)
-    private List<Interests> interests;
-
-    @ElementCollection(targetClass = Skills.class)
-    @Enumerated(EnumType.STRING)
-    private List<Skills> skills;
-
-    @ElementCollection(targetClass = Skills.class)
-    @Enumerated(EnumType.STRING)
-    private List<Skills> skillGap;
-    
-    private Integer points;
-
-    @ElementCollection
-    private List<Integer> favoriteCourses;
-
-    @OneToMany(mappedBy = "account", cascade = CascadeType.PERSIST, orphanRemoval = true)
-    private List<Payment> payments;             // WHEN DELETING account SET PAYMENTS TO NULL, BECAUSE PAYMENTS DONT GET DELETED
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/AccountController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/AccountController.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,107 +1,0 @@
-package com.shifterwebapp.shifter.account;
-
-import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import com.shifterwebapp.shifter.account.service.AccountService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("${api.base.path}/account")
-public class AccountController {
-
-    private final AccountService accountService;
-
-    @GetMapping("/{accountId}")
-    public ResponseEntity<AccountDto> getAccount(@PathVariable Long accountId) {
-        AccountDto accountDto = accountService.getAccountById(accountId);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @DeleteMapping("/{accountId}")
-    public ResponseEntity<Void> deleteAccount(@PathVariable Long accountId) {
-        accountService.deleteAccount(accountId);
-        return ResponseEntity.noContent().build();
-    }
-
-    @PutMapping("/{accountId}/name")
-    public ResponseEntity<?> updateName(@PathVariable Long accountId, @RequestParam String newName) {
-        AccountDto accountDto = accountService.updateName(accountId, newName);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/mail")
-    public ResponseEntity<?> updateMail(@PathVariable Long accountId, @RequestParam String newMail) {
-        AccountDto accountDto = accountService.updateMail(accountId, newMail);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/password")
-    public ResponseEntity<?> updatePassword(@PathVariable Long accountId, @RequestParam String newPassword) {
-        AccountDto accountDto = accountService.updatePassword(accountId, newPassword);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/work-position")
-    public ResponseEntity<?> updateWorkPosition(@PathVariable Long accountId, @RequestParam String newWorkPosition) {
-        AccountDto accountDto = accountService.updateWorkPosition(accountId, newWorkPosition);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/company-type")
-    public ResponseEntity<?> updateCompanyType(@PathVariable Long accountId, @RequestParam CompanyType newCompanyType) {
-        AccountDto accountDto = accountService.updateCompanyType(accountId, newCompanyType);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/add/interest")
-    public ResponseEntity<?> addInterest(@PathVariable Long accountId, @RequestParam Interests newInterest) {
-        AccountDto accountDto = accountService.addInterest(accountId, newInterest);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/add/skill")
-    public ResponseEntity<?> addSkill(@PathVariable Long accountId, @RequestParam Skills newSkill) {
-        AccountDto accountDto = accountService.addSkill(accountId, newSkill);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/add/skill-gap")
-    public ResponseEntity<?> addSkillGap(@PathVariable Long accountId, @RequestParam Skills newSkillGap) {
-        AccountDto accountDto = accountService.addSkillGap(accountId, newSkillGap);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/add/favorite-course")
-    public ResponseEntity<?> addFavoriteCourse(@PathVariable Long accountId, @RequestParam Integer newFavoriteCourse) {
-        AccountDto accountDto = accountService.addFavoriteCourse(accountId, newFavoriteCourse);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/remove/interest")
-    public ResponseEntity<?> removeInterest(@PathVariable Long accountId, @RequestParam Interests oldInterest) {
-        AccountDto accountDto = accountService.removeInterest(accountId, oldInterest);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/remove/skill")
-    public ResponseEntity<?> removeSkill(@PathVariable Long accountId, @RequestParam Skills oldSkill) {
-        AccountDto accountDto = accountService.removeSkill(accountId, oldSkill);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/remove/skill-gap")
-    public ResponseEntity<?> removeSkillGap(@PathVariable Long accountId, @RequestParam Skills oldSkillGap) {
-        AccountDto accountDto = accountService.removeSkillGap(accountId, oldSkillGap);
-        return ResponseEntity.ok(accountDto);
-    }
-
-    @PutMapping("/{accountId}/remove/favorite-course")
-    public ResponseEntity<?> removeFavoriteCourse(@PathVariable Long accountId, @RequestParam Integer oldFavoriteCourse) {
-        AccountDto accountDto = accountService.removeFavoriteCourse(accountId, oldFavoriteCourse);
-        return ResponseEntity.ok(accountDto);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/AccountDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/AccountDto.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,44 +1,0 @@
-package com.shifterwebapp.shifter.account;
-
-import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class AccountDto {
-
-    private Long id;
-
-    private String email;
-
-    private String password;
-
-    private String name;
-
-    private CompanyType companyType;
-
-    private String workPosition;
-
-    private List<Interests> interests;
-
-    private List<Skills> skills;
-
-    private List<Skills> skillGap;
-
-    private Integer points;
-
-    private List<Integer> favoriteCourses;
-
-    private List<PaymentDto> payments;
-}
-
-
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/AccountMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/AccountMapper.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.account;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface AccountMapper {
-
-    AccountDto toDto(Account account);
-    List<AccountDto> toDto(List<Account> accounts);
-
-    @InheritInverseConfiguration
-    Account toEntity(AccountDto accountDto);
-    @InheritInverseConfiguration
-    List<Account> toEntity(List<AccountDto> accountDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/AccountRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/AccountRepository.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.account;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.Optional;
-
-public interface AccountRepository extends JpaRepository<Account, Long> {
-
-    boolean existsAccountByEmail(String email);
-
-    Optional<Account> findByEmail(String email);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/service/AccountService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/service/AccountService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,267 +1,0 @@
-package com.shifterwebapp.shifter.account.service;
-
-import com.shifterwebapp.shifter.Validate;
-import com.shifterwebapp.shifter.auth.RegisterDto;
-import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.account.*;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class AccountService implements ImplAccountService {
-
-    private final AccountRepository accountRepository;
-    private final AccountMapper accountMapper;
-    private final Validate validate;
-    private final PasswordEncoder passwordEncoder;
-
-    @Override
-    public List<AccountDto> getAllAccounts() {
-        List<Account> accounts = accountRepository.findAll();
-        return accountMapper.toDto(accounts);
-    }
-
-    @Override
-    public AccountDto getAccountById(Long accountId) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public void createAccount(RegisterDto registerDto) {
-        if (accountRepository.existsAccountByEmail(registerDto.getEmail())) {
-            throw new RuntimeException("Email already in use");
-        }
-
-        Account account = Account.builder()
-                .name(registerDto.getName())
-                .email(registerDto.getEmail())
-                .passwordHash(passwordEncoder.encode(registerDto.getPassword()))
-                .isAdmin(false)
-                .companyType(registerDto.getCompanyType())
-                .workPosition(registerDto.getWorkPosition())
-                .interests(registerDto.getInterests())
-                .skills(registerDto.getSkills())
-                .skillGap(registerDto.getSkillGap())
-                .points(0)
-                .favoriteCourses(List.of())
-                .build();
-
-        accountRepository.save(account);
-    }
-
-    @Override
-    public void deleteAccount(Long accountId) {
-        validate.validateAccountExists(accountId);
-        accountRepository.deleteById(accountId);
-    }
-
-    @Override
-    public AccountDto updateName(Long accountId, String newName) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        account.setName(newName);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto updateMail(Long accountId, String newMail) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        account.setEmail(newMail);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto updatePassword(Long accountId, String newPass) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        account.setPasswordHash(passwordEncoder.encode(newPass));
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto updateWorkPosition(Long accountId, String newWorkPosition) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        account.setWorkPosition(newWorkPosition);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto updateCompanyType(Long accountId, CompanyType newCompanyType) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        account.setCompanyType(newCompanyType);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addInterest(Long accountId, Interests newInterest) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getInterests().contains(newInterest)) {
-            account.getInterests().add(newInterest);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addSkill(Long accountId, Skills newSkill) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getSkills().contains(newSkill)) {
-            account.getSkills().add(newSkill);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addSkills(Long accountId, List<Skills> newSkills) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        for (Skills skill : newSkills) {
-            if (!account.getSkills().contains(skill)) {
-                account.getSkills().add(skill);
-            }
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addSkillGap(Long accountId, Skills newSkillGap) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getSkillGap().contains(newSkillGap)) {
-            account.getSkillGap().add(newSkillGap);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addFavoriteCourse(Long accountId, Integer newFavoriteCourseId) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getFavoriteCourses().contains(newFavoriteCourseId)) {
-            account.getFavoriteCourses().add(newFavoriteCourseId);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addPoints(Long accountId, Integer newPointsAchieved) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        Integer newPoints = account.getPoints() + newPointsAchieved;
-        account.setPoints(newPoints);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto addPayment(Long accountId, Payment newPayment) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getPayments().contains(newPayment)) {
-            account.getPayments().add(newPayment);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removeInterest(Long accountId, Interests removeInterest) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getInterests().contains(removeInterest)) {
-            account.getInterests().remove(removeInterest);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removeSkill(Long accountId, Skills removeSkill) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getSkills().contains(removeSkill)) {
-            account.getSkills().remove(removeSkill);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removeSkillGap(Long accountId, Skills removeSkillGap) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getSkillGap().contains(removeSkillGap)) {
-            account.getSkillGap().remove(removeSkillGap);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removeSkillGaps(Long accountId, List<Skills> removeSkillGaps) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        for (Skills skill : removeSkillGaps) {
-            if (!account.getSkillGap().contains(skill)) {
-                account.getSkillGap().remove(skill);
-            }
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removeFavoriteCourse(Long accountId, Integer removeFavoriteCourseId) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getFavoriteCourses().contains(removeFavoriteCourseId)) {
-            account.getFavoriteCourses().remove(removeFavoriteCourseId);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removePoints(Long accountId, Integer removePointsAchieved) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        Integer newPoints = account.getPoints() - removePointsAchieved;
-        account.setPoints(newPoints);
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-
-    @Override
-    public AccountDto removePayment(Long accountId, Payment removePayment) {
-        validate.validateAccountExists(accountId);
-        Account account = accountRepository.findById(accountId).orElseThrow();
-        if (!account.getPayments().contains(removePayment)) {
-            account.getPayments().remove(removePayment);
-        }
-        accountRepository.save(account);
-        return accountMapper.toDto(account);
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/account/service/ImplAccountService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/account/service/ImplAccountService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,41 +1,0 @@
-package com.shifterwebapp.shifter.account.service;
-
-import com.shifterwebapp.shifter.auth.RegisterDto;
-import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.account.AccountDto;
-import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-
-import java.util.List;
-
-public interface ImplAccountService {
-    List<AccountDto> getAllAccounts();
-    AccountDto getAccountById(Long id);
-
-    void createAccount(RegisterDto registerDto);
-    void deleteAccount(Long id);
-
-    AccountDto updateName(Long id, String newName);
-    AccountDto updateMail(Long id, String newMail);
-    AccountDto updatePassword(Long id, String newPassHash);
-    AccountDto updateWorkPosition(Long id, String newWorkPosition);
-    AccountDto updateCompanyType(Long id, CompanyType newCompanyType);
-
-    AccountDto addInterest(Long id, Interests newInterest);
-    AccountDto addSkill(Long id, Skills newSkill);
-    AccountDto addSkills(Long id, List<Skills> newSkills);
-    AccountDto addSkillGap(Long id, Skills newSkillGap);
-    AccountDto addFavoriteCourse(Long id, Integer newFavoriteCourseId);
-    AccountDto addPoints(Long id, Integer newPointsAchieved);
-    AccountDto addPayment(Long id, Payment newPayment);
-
-    AccountDto removeInterest(Long id, Interests removeInterest);
-    AccountDto removeSkill(Long id, Skills removeSkill);
-    AccountDto removeSkillGap(Long id, Skills removeSkillGap);
-    AccountDto removeSkillGaps(Long id, List<Skills> removeSkillGaps);
-    AccountDto removeFavoriteCourse(Long id, Integer removeFavoriteCourseId);
-    AccountDto removePoints(Long id, Integer removePointsAchieved);
-    AccountDto removePayment(Long id, Payment removePayment);
-
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/AuthController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthController.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/AuthController.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -1,9 +1,11 @@
 package com.shifterwebapp.shifter.auth;
 
-import com.shifterwebapp.shifter.account.service.AccountService;
-import jakarta.validation.Valid;
+import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
 
 @RequiredArgsConstructor
@@ -12,15 +14,27 @@
 public class AuthController {
 
-    private final AccountService accountService;
+    private final AuthService authService;
+
+    private final UserService userService;
 
     @PostMapping("/register")
-    public ResponseEntity<String> register(@Valid @RequestBody RegisterDto request) {
-        accountService.createAccount(request);
-        return ResponseEntity.ok("User registered successfully");
+    public ResponseEntity<AuthResponse> register(@RequestBody RegisterDto request) {
+        return ResponseEntity.ok(authService.register(request));
+    }
+
+    @PostMapping("/authenticate")
+    public ResponseEntity<AuthResponse> authenticate(@RequestBody LoginDto request) {
+        return ResponseEntity.ok(authService.authenticate(request));
+    }
+
+    @PostMapping("/refresh")
+    public ResponseEntity<AuthResponse> refreshToken(@RequestBody TokenRefreshDto request) {
+        AuthResponse response = authService.refreshToken(request.getRefreshToken());
+        return ResponseEntity.ok(response);
     }
 
     @PostMapping("/delete")
     public ResponseEntity<String> deleteAll(@RequestParam Long accountId) {
-        accountService.deleteAccount(accountId);
+        userService.deleteUser(accountId);
         return ResponseEntity.ok("User registered successfully");
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/AuthResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthResponse.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/AuthResponse.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,16 @@
+package com.shifterwebapp.shifter.auth;
+
+import com.shifterwebapp.shifter.user.UserDto;
+import lombok.*;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+@Setter
+@Builder
+public class AuthResponse {
+    private String accessToken;
+    private String refreshToken;
+    private UserDto user;
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -1,7 +1,11 @@
 package com.shifterwebapp.shifter.auth;
 
-import com.shifterwebapp.shifter.account.AccountRepository;
+import com.shifterwebapp.shifter.config.JwtService;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserMapper;
+import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
-import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.stereotype.Service;
 
@@ -9,6 +13,76 @@
 @RequiredArgsConstructor
 public class AuthService {
-    private final AccountRepository accountRepository;
-    private final PasswordEncoder passwordEncoder;
+
+    private final UserService userService;
+    private final JwtService jwtService;
+    private final UserMapper userMapper;
+    private final AuthenticationManager authenticationManager;
+
+    public AuthResponse register(RegisterDto request) {
+        // Create user in the database
+        User user = userService.createUser(request);
+
+        // Generate token
+        String accessToken = jwtService.generateToken(user);
+        String refreshToken = jwtService.generateRefreshToken(user);
+
+        System.out.println("Generated access token: " + accessToken);
+        System.out.println("Generated refresh token: " + refreshToken);
+
+        // Return response with tokens and user details
+        return AuthResponse.builder()
+                .accessToken(accessToken)
+                .refreshToken(refreshToken)
+                .user(userMapper.toDto(user))
+                .build();
+    }
+
+    public AuthResponse authenticate(LoginDto request) {
+        // Authenticate credentials
+        authenticationManager.authenticate(
+                new UsernamePasswordAuthenticationToken(
+                        request.getEmail(),
+                        request.getPassword()
+                )
+        );
+
+        // Load userDetails and generate token
+        User user = userService.getUserByEmail(request.getEmail());
+        String accessToken = jwtService.generateToken(user);
+        String refreshToken = jwtService.generateRefreshToken(user);
+
+        System.out.println(user);
+        System.out.println("------------------------------------------");
+        System.out.println(userMapper.toDto(user));
+
+        // Return response with tokens and user details
+        return AuthResponse.builder()
+                .accessToken(accessToken)
+                .refreshToken(refreshToken)
+                .user(userMapper.toDto(user))
+                .build();
+    }
+
+    public AuthResponse refreshToken(String refreshToken) {
+        String userEmail = jwtService.extractUsername(refreshToken);
+
+        if (userEmail == null) {
+            throw new RuntimeException("Invalid refresh token");
+        }
+
+        User user = userService.getUserByEmail(userEmail);
+
+        if (!jwtService.isTokenValid(refreshToken, user)) {
+            throw new RuntimeException("Expired or invalid refresh token");
+        }
+
+        String newAccessToken = jwtService.generateToken(user);
+
+        return AuthResponse.builder()
+                .accessToken(newAccessToken)
+                .refreshToken(refreshToken) // Keep same refresh token or rotate
+                .user(userMapper.toDto(user))
+                .build();
+    }
 
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/CustomUserDetails.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/CustomUserDetails.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,53 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.shifterwebapp.shifter.account.Account;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-import java.util.Collection;
-import java.util.List;
-
-public class CustomUserDetails implements UserDetails {
-
-    private final Account account;
-
-    public CustomUserDetails(Account account) {
-        this.account = account;
-    }
-
-    @Override
-    public Collection<? extends GrantedAuthority> getAuthorities() {
-        // Example: give ROLE_ADMIN if user.isAdmin() else ROLE_USER
-        return account.getIsAdmin()
-                ? List.of(new SimpleGrantedAuthority("ROLE_ADMIN"))
-                : List.of(new SimpleGrantedAuthority("ROLE_USER"));
-    }
-
-    @Override
-    public String getPassword() {
-        return account.getPasswordHash();
-    }
-
-    @Override
-    public String getUsername() {
-        return account.getEmail();
-    }
-
-    // You can implement these as you prefer
-    @Override
-    public boolean isAccountNonExpired() {
-        return true;
-    }
-    @Override
-    public boolean isAccountNonLocked() {
-        return true;
-    }
-    @Override
-    public boolean isCredentialsNonExpired() {
-        return true;
-    }
-    @Override
-    public boolean isEnabled() {
-        return true;
-    }
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/auth/CustomUserDetailsService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/CustomUserDetailsService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package com.shifterwebapp.shifter.auth;
-
-import com.shifterwebapp.shifter.account.Account;
-import com.shifterwebapp.shifter.account.AccountRepository;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class CustomUserDetailsService implements UserDetailsService {
-
-    private final AccountRepository accountRepository;
-
-    @Override
-    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
-        Account account = accountRepository.findByEmail(email)
-                .orElseThrow(() -> new UsernameNotFoundException("User not found with email: " + email));
-        return new CustomUserDetails(account);
-    }
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/LoginDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/LoginDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/LoginDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,15 @@
+package com.shifterwebapp.shifter.auth;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class LoginDto {
+    @Email
+    @NotBlank
+    private String email;
+
+    @NotBlank
+    private String password;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/TokenRefreshDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/TokenRefreshDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/TokenRefreshDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,9 @@
+package com.shifterwebapp.shifter.auth;
+
+import lombok.Data;
+
+@Data
+public class TokenRefreshDto {
+
+    String refreshToken;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/config/AppConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/AppConfig.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/AppConfig.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,44 @@
+package com.shifterwebapp.shifter.config;
+
+import com.shifterwebapp.shifter.user.UserRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+@RequiredArgsConstructor
+public class AppConfig {
+
+    private final UserRepository userRepository;
+
+    @Bean
+    public UserDetailsService userDetailsService() {
+        return username -> userRepository.findByEmail(username)
+                .orElseThrow(() -> new UsernameNotFoundException("User not found with email: " + username + "!"));
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
+        return config.getAuthenticationManager();
+    }
+
+    @Bean
+    public AuthenticationProvider authenticationProvider() {
+        DaoAuthenticationProvider provider = new DaoAuthenticationProvider(userDetailsService());
+        provider.setPasswordEncoder(passwordEncoder());
+        return provider;
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new BCryptPasswordEncoder(12);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,55 @@
+package com.shifterwebapp.shifter.config;
+
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+
+@Component
+@RequiredArgsConstructor
+public class JwtAuthFilter extends OncePerRequestFilter {
+
+    private final JwtService jwtService;
+    private final UserDetailsService userDetailsService;
+
+    @Override
+    protected void doFilterInternal(
+            @NotNull HttpServletRequest request,
+            @NotNull HttpServletResponse response,
+            @NotNull FilterChain filterChain) throws ServletException, IOException {
+        final String authHeader = request.getHeader("Authorization");
+        final String jwt;
+        final String userEmail;
+        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
+            filterChain.doFilter(request, response);
+            return;
+        }
+
+        jwt = authHeader.substring(7);
+        userEmail = jwtService.extractUsername(jwt);
+        if (userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null) {
+            UserDetails userDetails = userDetailsService.loadUserByUsername(userEmail);
+            if (jwtService.isTokenValid(jwt, userDetails)) {
+                UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+                authToken.setDetails(
+                        new WebAuthenticationDetailsSource().buildDetails(request)
+                );
+                SecurityContextHolder.getContext().setAuthentication(authToken);
+            }
+        }
+
+        filterChain.doFilter(request, response);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,94 @@
+package com.shifterwebapp.shifter.config;
+
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.security.Keys;
+import io.jsonwebtoken.Claims;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+
+import javax.crypto.SecretKey;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+
+@Service
+public class JwtService {
+
+    private final String SECRET_KEY;
+
+    public JwtService(@Value("${jwt.secret}") String secretKey) {
+        this.SECRET_KEY = secretKey;
+    }
+
+    // Helper to get SecretKey instance
+    private SecretKey getSignInKey() {
+        return Keys.hmacShaKeyFor(SECRET_KEY.getBytes(StandardCharsets.UTF_8));
+    }
+
+    // Generate Access Token
+    public String generateToken(UserDetails userDetails) {
+        return createToken(new HashMap<>(), userDetails.getUsername());
+    }
+
+    // Generate Refresh Token (30 days)
+    public String generateRefreshToken(UserDetails userDetails) {
+        return Jwts.builder()
+                .setSubject(userDetails.getUsername())
+                .setIssuedAt(new Date(System.currentTimeMillis()))
+                .setExpiration(new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 30)) // 30 days
+                .signWith(getSignInKey(), SignatureAlgorithm.HS256)
+                .compact();
+    }
+
+    // Create Access Token with optional claims
+    private String createToken(Map<String, Object> claims, String subject) {
+        return Jwts.builder()
+                .setClaims(claims)
+                .setSubject(subject)
+                .setIssuedAt(new Date(System.currentTimeMillis()))
+                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) // 1 day
+                .signWith(getSignInKey(), SignatureAlgorithm.HS256)
+                .compact();
+    }
+
+    // Validate token
+    public boolean isTokenValid(String token, UserDetails userDetails) {
+        final String username = extractUsername(token);
+        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
+    }
+
+    // Check expiration
+    private boolean isTokenExpired(String token) {
+        return extractExpiration(token).before(new Date());
+    }
+
+    // Extract expiration date
+    public Date extractExpiration(String token) {
+        return extractClaim(token, Claims::getExpiration);
+    }
+
+    // Extract username from token
+    public String extractUsername(String token) {
+        return extractClaim(token, Claims::getSubject);
+    }
+
+    // Extract single claim
+    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
+        final Claims claims = extractAllClaims(token);
+        return claimsResolver.apply(claims);
+    }
+
+    // Extract all claims using correct parser
+    private Claims extractAllClaims(String token) {
+        return Jwts
+                .parserBuilder()
+                .setSigningKey(getSignInKey())
+                .build()
+                .parseClaimsJws(token)
+                .getBody();
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/SecurityConfig.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,61 @@
+package com.shifterwebapp.shifter.config;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+
+
+@Configuration
+@EnableWebSecurity
+@RequiredArgsConstructor
+public class SecurityConfig {
+
+    private final AuthenticationProvider authenticationProvider;
+    private final JwtAuthFilter jwtAuthFilter;
+
+    @Bean
+    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+        http
+                .csrf(AbstractHttpConfigurer::disable)
+                .cors(Customizer.withDefaults())
+                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+                .authorizeHttpRequests(request -> request
+                        .requestMatchers("/api/auth/**").permitAll()
+                        .anyRequest().authenticated()
+                )
+                .authenticationProvider(authenticationProvider)
+                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
+
+//                .httpBasic(AbstractHttpConfigurer::disable)  // Disable basic auth for stateless
+//                .formLogin(AbstractHttpConfigurer::disable)   // Disable form login
+//                .logout(AbstractHttpConfigurer::disable);
+
+        return http.build();
+    }
+
+    @Bean
+    public CorsConfigurationSource corsConfigurationSource() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedOrigin("http://localhost:5173"); // your frontend origin
+        config.addAllowedHeader("*");
+        config.addAllowedMethod("*");
+        config.setAllowCredentials(true);
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", config);
+        return source;
+    }
+
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/Course.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -18,7 +18,12 @@
 public class Course {
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_seq")
-    @SequenceGenerator(name = "course_seq", sequenceName = "course_sequence", allocationSize = 1)
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_seq")
+//    @SequenceGenerator(name = "course_seq", sequenceName = "course_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
+
+    private String imageUrl;
+
+    private String color;
     
     private String title;
@@ -33,5 +38,5 @@
     private Float price;
     
-    private Float rating;
+    private Integer rating;
     
     private Integer ratingCount;
@@ -39,10 +44,11 @@
     private String descriptionShort;
 
-    @Lob
+    @Column(columnDefinition = "text")
     private String description;
 
-    @Lob
+    @Column(columnDefinition = "text")
     private String descriptionLong;
-    
+
+
     @ElementCollection(targetClass = Skills.class)
     @Enumerated(EnumType.STRING)
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -27,5 +27,5 @@
     private Float price;
 
-    private Float rating;
+    private Integer rating;
 
     private Integer ratingCount;
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -15,6 +15,7 @@
 
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_seq")
-    @SequenceGenerator(name = "course_seq", sequenceName = "course_sequence", allocationSize = 1)
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_seq")
+//    @SequenceGenerator(name = "course_seq", sequenceName = "course_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -18,6 +18,7 @@
 public class Enrollment {
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "enrollment_seq")
-    @SequenceGenerator(name = "enrollment_seq", sequenceName = "enrollment_sequence", allocationSize = 1)
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "enrollment_seq")
+//    @SequenceGenerator(name = "enrollment_seq", sequenceName = "enrollment_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -9,6 +9,6 @@
 public interface EnrollmentRepository extends JpaRepository<Enrollment, Long> {
 
-    @Query("select e from Enrollment e where e.payment.account.id = :accountId")
-    List<Enrollment> findEnrollmentsByAccount(@Param("accountId") Long accountId);
+    @Query("select e from Enrollment e where e.payment.user.id = :userId")
+    List<Enrollment> findEnrollmentsByUser(@Param("userId") Long userId);
 
     @Query("select e from Enrollment e where e.course.id = :courseId")
@@ -16,8 +16,8 @@
 
     @Query("select case when count(e) > 0 then true else false end" +
-            " from Enrollment e where e.payment.account.id = :accountId and e.course.id = :courseId")
-    Boolean findIsAccountEnrolledInCourse(@Param("accountId") Long accountId, @Param("courseId") Long courseId);
+            " from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
+    Boolean findIsUserEnrolledInCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
 
-    @Query("select e from Enrollment e where e.payment.account.id = :accountId and e.course.id = :courseId")
-    Enrollment findEnrollmentByAccountAndCourse(@Param("accountId") Long accountId, @Param("courseId") Long courseId);
+    @Query("select e from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
+    Enrollment findEnrollmentByUserAndCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -14,5 +14,5 @@
 import com.shifterwebapp.shifter.payment.PaymentRepository;
 import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.account.service.AccountService;
+import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -28,5 +28,5 @@
     private final CourseRepository courseRepository;
     private final PaymentRepository paymentRepository;
-    private final AccountService accountService;
+    private final UserService userService;
     private final EnrollmentMapper enrollmentMapper;
     private final Validate validate;
@@ -40,7 +40,7 @@
 
     @Override
-    public List<EnrollmentDto> getEnrollmentsByAccount(Long accountId) {
-        validate.validateAccountExists(accountId);
-        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByAccount(accountId);
+    public List<EnrollmentDto> getEnrollmentsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByUser(userId);
         return enrollmentMapper.toDto(enrollment);
     }
@@ -54,9 +54,9 @@
 
     @Override
-    public EnrollmentDto getEnrollmentByAccountAndCourse(Long accountId, Long courseId) {
-        validate.validateAccountExists(accountId);
+    public EnrollmentDto getEnrollmentByUserAndCourse(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
         validate.validateCourseExists(courseId);
 
-        Enrollment enrollment = enrollmentRepository.findEnrollmentByAccountAndCourse(accountId, courseId);
+        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
         return enrollmentMapper.toDto(enrollment);
     }
@@ -64,5 +64,5 @@
 
     @Override
-    public EnrollmentDto enrollAccount(Long courseId, Long paymentId) {
+    public EnrollmentDto enrollUser(Long courseId, Long paymentId) {
         validate.validateCourseExists(courseId);
         validate.validatePaymentExists(paymentId);
@@ -74,9 +74,9 @@
         }
 
-        Long accountId = payment.getAccount().getId();
-        validate.validateAccountExists(accountId);
-        boolean isAlreadyEnrolled = enrollmentRepository.findIsAccountEnrolledInCourse(accountId, courseId);
+        Long userId = payment.getUser().getId();
+        validate.validateUserExists(userId);
+        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
         if (isAlreadyEnrolled) {
-            throw new RuntimeException("account with ID " + accountId + " is already enrolled in course with ID " + courseId + "!");
+            throw new RuntimeException("user with ID " + userId + " is already enrolled in course with ID " + courseId + "!");
         }
 
@@ -98,9 +98,9 @@
 
     @Override
-    public Boolean isAccountEnrolledInCourse(Long accountId, Long courseId) {
-        validate.validateAccountExists(accountId);
+    public Boolean isUserEnrolledInCourse(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
         validate.validateCourseExists(courseId);
 
-        return enrollmentRepository.findIsAccountEnrolledInCourse(accountId, courseId);
+        return enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
     }
 
@@ -116,5 +116,5 @@
     }
 
-    // CALLING ACCOUNT SERVICE HERE. IS THERE A BETTER WAY FOR THIS ???
+    // CALLING user SERVICE HERE. IS THERE A BETTER WAY FOR THIS ???
     @Override
     public EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId) {
@@ -124,9 +124,9 @@
         enrollment.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
 
-        Long accountId = enrollment.getPayment().getAccount().getId();
+        Long userId = enrollment.getPayment().getUser().getId();
         List<Skills> skillsGained = enrollment.getCourse().getSkillsGained();
-        accountService.addPoints(accountId, PointsConstants.BUY_COURSE);
-        accountService.addSkills(accountId, skillsGained);
-        accountService.removeSkillGaps(accountId, skillsGained);
+        userService.addPoints(userId, PointsConstants.BUY_COURSE);
+        userService.addSkills(userId, skillsGained);
+        userService.removeSkillGaps(userId, skillsGained);
 
         enrollmentRepository.save(enrollment);
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -8,11 +8,11 @@
 public interface ImplEnrollmentService {
     EnrollmentDto getEnrollmentById(Long enrollmentId);
-    List<EnrollmentDto> getEnrollmentsByAccount(Long accountId);
+    List<EnrollmentDto> getEnrollmentsByUser(Long userId);
     List<EnrollmentDto> getEnrollmentsByCourse(Long courseId);
-    EnrollmentDto getEnrollmentByAccountAndCourse(Long accountId, Long courseId);
+    EnrollmentDto getEnrollmentByUserAndCourse(Long userId, Long courseId);
 
-    EnrollmentDto enrollAccount(Long courseId, Long paymentId);
+    EnrollmentDto enrollUser(Long courseId, Long paymentId);
 
-    Boolean isAccountEnrolledInCourse(Long accountId, Long courseId);
+    Boolean isUserEnrolledInCourse(Long userId, Long courseId);
 
     EnrollmentDto updateEnrollmentStatusToActive(Long enrollmentId);
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -5,5 +5,5 @@
     STARTUP,
     SME,
-    MIDMARKET,
+    MID_MARKET,
     ENTERPRISE,
     OTHER
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -4,5 +4,5 @@
 import com.shifterwebapp.shifter.enums.PaymentMethod;
 import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.account.Account;
+import com.shifterwebapp.shifter.user.User;
 import jakarta.persistence.*;
 import lombok.*;
@@ -18,6 +18,7 @@
 public class Payment {
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "payment_seq")
-    @SequenceGenerator(name = "payment_seq", sequenceName = "payment_sequence", allocationSize = 1)
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "payment_seq")
+//    @SequenceGenerator(name = "payment_seq", sequenceName = "payment_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
@@ -33,6 +34,6 @@
 
     @ManyToOne
-    @JoinColumn(name = "account_id")
-    private Account account;
+    @JoinColumn(name = "user_id")
+    private User user;
 
     @OneToOne(mappedBy = "payment", cascade = CascadeType.ALL, orphanRemoval = true)
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -16,6 +16,6 @@
 
     @GetMapping
-    public ResponseEntity<?> getPaymentsByAccount(@RequestParam("accountId") Long accountId) {
-        List<PaymentDto> paymentDtos = paymentService.getPaymentsByAccount(accountId);
+    public ResponseEntity<?> getPaymentsByUser(@RequestParam("userId") Long userId) {
+        List<PaymentDto> paymentDtos = paymentService.getPaymentsByUser(userId);
         return ResponseEntity.ok(paymentDtos);
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -9,5 +9,5 @@
 public interface PaymentRepository extends JpaRepository<Payment, Long> {
 
-    List<Payment> findPaymentByAccount_Id(Long accountId);
+    List<Payment> findPaymentByUser_Id(Long userId);
 
     @Query("select p from Payment p where p.enrollment.course.id = :courseId")
@@ -23,5 +23,5 @@
     Double findTotalYearlyRevenueByCourse(@Param("courseId") Long courseId, @Param("year") Integer year);
 
-    @Query("select case when p.paymentStatus = 'COMPLETED' then true else false end from Payment p where p.account.id = :accountId and p.enrollment.course.id = :courseId")
-    Boolean findHasAccountPaidForCourse(@Param("accountId") Long accountId, @Param("courseId") Long courseId);
+    @Query("select case when p.paymentStatus = 'COMPLETED' then true else false end from Payment p where p.user.id = :userId and p.enrollment.course.id = :courseId")
+    Boolean findHasUserPaidForCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -7,5 +7,5 @@
 
 public interface ImplPaymentService {
-    List<PaymentDto> getPaymentsByAccount(Long accountId);
+    List<PaymentDto> getPaymentsByUser(Long userId);
     List<PaymentDto> getPaymentsByCourse(Long courseId);
 
@@ -14,7 +14,7 @@
     Double getTotalYearlyRevenueByCourse(Long courseId, Integer year);
 
-    Boolean hasAccountPaidForCourse(Long accountId, Long courseId);
+    Boolean hasUserPaidForCourse(Long userId, Long courseId);
 
-    PaymentDto initiatePayment(Long accountId, Long courseId, PaymentMethod paymentMethod);
+    PaymentDto initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod);
     PaymentDto completePayment(Long paymentId);
     PaymentDto failPayment(Long paymentId);
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -12,6 +12,6 @@
 import com.shifterwebapp.shifter.enums.PaymentMethod;
 import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.account.Account;
-import com.shifterwebapp.shifter.account.AccountRepository;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserRepository;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -26,5 +26,5 @@
     private final PaymentRepository paymentRepository;
     private final PaymentMapper paymentMapper;
-    private final AccountRepository accountRepository;
+    private final UserRepository userRepository;
     private final EnrollmentRepository enrollmentRepository;
     private final CourseRepository courseRepository;
@@ -32,7 +32,7 @@
 
     @Override
-    public List<PaymentDto> getPaymentsByAccount(Long accountId) {
-        validate.validateAccountExists(accountId);
-        List<Payment> payments = paymentRepository.findPaymentByAccount_Id(accountId);
+    public List<PaymentDto> getPaymentsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Payment> payments = paymentRepository.findPaymentByUser_Id(userId);
         return paymentMapper.toDto(payments);
     }
@@ -64,21 +64,21 @@
 
     @Override
-    public Boolean hasAccountPaidForCourse(Long accountId, Long courseId) {
+    public Boolean hasUserPaidForCourse(Long userId, Long courseId) {
         validate.validateCourseExists(courseId);
-        validate.validateAccountExists(accountId);
-        return paymentRepository.findHasAccountPaidForCourse(accountId, courseId);
+        validate.validateUserExists(userId);
+        return paymentRepository.findHasUserPaidForCourse(userId, courseId);
     }
 
     @Override
-    public PaymentDto initiatePayment(Long accountId, Long courseId, PaymentMethod paymentMethod) {
-        validate.validateAccountExists(accountId);
+    public PaymentDto initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod) {
+        validate.validateUserExists(userId);
         validate.validateCourseExists(courseId);
 
-        Account account = accountRepository.findById(accountId).orElseThrow();
+        User user = userRepository.findById(userId).orElseThrow();
         Course course = courseRepository.findById(courseId).orElseThrow();
 
-        boolean isAlreadyEnrolled = enrollmentRepository.findIsAccountEnrolledInCourse(accountId, courseId);
+        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
         if (isAlreadyEnrolled) {
-            throw new RuntimeException("Account with ID " + accountId + " is already enrolled in course with ID " + courseId + " and cannot initiate payment!");
+            throw new RuntimeException("User with ID " + userId + " is already enrolled in course with ID " + courseId + " and cannot initiate payment!");
         }
 
@@ -88,5 +88,5 @@
                 .paymentMethod(paymentMethod)
                 .date(new Date())
-                .account(account)
+                .user(user)
                 .enrollment(new Enrollment())
                 .amount(course.getPrice())
Index: backend/src/main/java/com/shifterwebapp/shifter/review/Review.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -15,6 +15,7 @@
 public class Review {
     @Id
-    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "review_seq")
-    @SequenceGenerator(name = "review_seq", sequenceName = "review_sequence", allocationSize = 1)
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "review_seq")
+//    @SequenceGenerator(name = "review_seq", sequenceName = "review_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -27,7 +27,7 @@
     }
 
-    @GetMapping("/{accountId}")
-    public ResponseEntity<List<ReviewDto>> getReviewByaccount(@PathVariable Long accountId) {
-        List<ReviewDto> reviewDtos = reviewService.getReviewsByAccount(accountId);
+    @GetMapping("/{userId}")
+    public ResponseEntity<List<ReviewDto>> getReviewByuser(@PathVariable Long userId) {
+        List<ReviewDto> reviewDtos = reviewService.getReviewsByUser(userId);
         return ResponseEntity.ok(reviewDtos);
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -15,9 +15,9 @@
     List<Review> findReviewsByCourse(@Param("courseId") Long courseId);
 
-    @Query("select r from Review r where r.enrollment.payment.account.id = :accountId")
-    List<Review> findReviewsByAccount(@Param("accountId") Long accountId);
+    @Query("select r from Review r where r.enrollment.payment.user.id = :userId")
+    List<Review> findReviewsByUser(@Param("userId") Long userId);
 
     @Query("select case when count(r) > 0 then true else false end" +
-            " from Review r where r.enrollment.payment.account.id = :accountId and r.enrollment.course.id = :accountId")
-    Boolean findHasBeenReviewedByAccount(@Param("accountId") Long accountId, @Param("courseId") Long courseId);
+            " from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :userId")
+    Boolean findHasBeenReviewedByUser(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -8,9 +8,9 @@
     ReviewDto getReviewById(Long id);
     List<ReviewDto> getReviewsByCourse(Long courseId);
-    List<ReviewDto> getReviewsByAccount(Long accountId);
+    List<ReviewDto> getReviewsByUser(Long userId);
     Float getAverageRatingByCourse(Long courseId);
 
     ReviewDto writeReview(Long enrollmentId, ReviewDto reviewDto);
 
-    Boolean hasBeenReviewedByAccount(Long accountId, Long courseId);
+    Boolean hasBeenReviewedByUser(Long userId, Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -39,7 +39,7 @@
 
     @Override
-    public List<ReviewDto> getReviewsByAccount(Long accountId) {
-        validate.validateAccountExists(accountId);
-        List<Review> reviews = reviewRepository.findReviewsByAccount(accountId);
+    public List<ReviewDto> getReviewsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Review> reviews = reviewRepository.findReviewsByUser(userId);
         return reviewMapper.toDto(reviews);
     }
@@ -61,5 +61,5 @@
         }
         if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
-            throw new RuntimeException("Cannot review a course that has not been completed by account!");
+            throw new RuntimeException("Cannot review a course that has not been completed by user!");
         }
 
@@ -78,8 +78,8 @@
 
     @Override
-    public Boolean hasBeenReviewedByAccount(Long accountId, Long courseId) {
-        validate.validateAccountExists(accountId);
+    public Boolean hasBeenReviewedByUser(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
         validate.validateCourseExists(courseId);
-        return reviewRepository.findHasBeenReviewedByAccount(accountId, courseId);
+        return reviewRepository.findHasBeenReviewedByUser(userId, courseId);
     }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/sql/courseInitialize.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/courseInitialize.sql	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/sql/courseInitialize.sql	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,120 @@
+INSERT INTO course (title,
+                    description_short,
+                    description,
+                    description_long,
+                    difficulty,
+                    duration_hours,
+                    price,
+                    rating,
+                    rating_count,
+                    topic)
+VALUES ('From Manager to Leader: Empowering People, Managing Processes',
+        'Transform your managerial skills into effective leadership.',
+        'Learn to lead people and manage processes with proven leadership tools and models.',
+        'This course is designed for managers who want to become impactful leaders. It covers the core principles of leadership such as the 3xH’s of generative leadership, the difference between responsibility and guilt, communication strategies, feedback, and models like AB, Min/Max, and SMART objectives. Gain the mindset and practical tools to lead teams effectively, break silos, delegate with confidence, and mentor others.',
+        'INTERMEDIATE',
+        3,
+        29,
+        48,
+        10,
+        'Leadership & Management'),
+       ('Business Transformation Blueprint: Crafting the Path to Success',
+        'Design and implement successful business transformations.',
+        'Master the framework for guiding organizations through structured, sustainable transformation.',
+        'This course provides a complete blueprint for driving successful business transformations. You’ll learn to identify when transformation is needed, and why following the proper sequence of steps is critical. We explore the role of middle management, the six core stages of transformation (from purpose to KPIs), and how to establish agile and resilient structures. You’ll also develop a new paradigm and perspective to boost your business’s STABILITY, AGILITY, RESILIENCE, and SUSTAINABILITY.',
+        'ADVANCED',
+        5.5,
+        54,
+        49,
+        10,
+        'Business Strategy & Transformation'),
+       ('Business Roadmap for SME’s: A Step-by-Step Guide for Establishing Core Business Foundations for Sustainable Growth',
+        'Step-by-step guidance for SMEs to build solid business foundations.',
+        'Cut through the noise and build sustainable business foundations with clarity and confidence.',
+        'In today’s world of overwhelming information, especially around business growth, marketing, and sales strategies, it’s difficult to know where to begin. This course helps small and medium-sized businesses eliminate that confusion by providing a structured, step-by-step roadmap for building strong business foundations. Through a new paradigm and broadened perspective, you’ll increase your STABILITY, AGILITY, RESILIENCE, and SUSTAINABILITY while gaining clarity on what truly matters for long-term growth.',
+        'INTERMEDIATE',
+        6,
+        35,
+        49,
+        10,
+        'Entrepreneurship & SME Growth'),
+       ('Sales Masterclass: Leadership, Communication, and Modern Sales Process',
+        'Master modern sales strategies, leadership, and communication.',
+        'A complete guide to building elite sales skills, behaviors, and mindset.',
+        'This comprehensive masterclass is designed for sales professionals who want to excel in today’s fast-paced and client-centric environment. Learn the role of frontline salespeople, how to build team synergy, and understand the critical difference between being responsible and feeling guilty. Explore how silos hurt sales, how to manage time effectively, and what truly defines high-performance behavior. Master modern sales and negotiation techniques, improve communication and decision-making, and learn to lead with clarity and confidence. Includes practical tools like the AB model and marketing techniques tailored for salespeople.',
+        'ADVANCED',
+        4,
+        29,
+        47,
+        10,
+        'Sales & Communication'),
+       ('From Good to Extraordinary: Mastering Skills for Success',
+        'Unlock your full potential with practical skills for extraordinary success.',
+        'A holistic course for professionals aiming to elevate their effectiveness and mindset.',
+        'This course is built for individuals who want to go from good to extraordinary in their personal and professional lives. You’ll explore key topics like perception, time management, managing expectations, and setting smart priorities. Learn and apply powerful tools like the AB and Min/Max models, the SMART objectives model, and the method of deduction. Develop cognitive skills, improve communication maturity, and boost your efficiency in meetings, decision-making, and real-world interactions. Focused on practical results, not just theory.',
+        'INTERMEDIATE',
+        6,
+        35,
+        48,
+        10,
+        'Personal Development & Productivity'),
+       ('Winning Markets in 3 Steps: Building a Clear Go-to-Market Strategy',
+        'Build a clear, effective go-to-market strategy in just 3 steps.',
+        'Learn to target the right clients and approach the market with clarity and confidence.',
+        'Without a clear marketing strategy, businesses often drift without direction. This course shows you how to avoid that by creating a precise go-to-market strategy in 3 steps. Define your ideal target client using 8 key characteristics: needs, wants, expectations, challenges, fears, intentions, prejudices, and opportunities. Learn when, where, and how to reach your audience, using tools like the AB model and a quantification method for negotiation and sales. Includes real-world examples to help you implement a clear, winning strategy.',
+        'INTERMEDIATE',
+        5,
+        29,
+        49,
+        10,
+        'Marketing & Sales Strategy'),
+       ('Creating Added Value: How to Offer Solutions/Concepts, Instead of Services',
+        'Shift from selling services to offering impactful solutions and concepts.',
+        'Learn how to transition from offering services to delivering real value through solutions and long-term concepts.',
+        'In this course, you’ll learn how to move beyond just offering products or services by creating added value through solutions and concepts. Understand the importance of knowing your target audience, identifying the problems your offering solves, and crafting offers that connect deeply with client needs. We’ll explore the difference between selling a service vs. a solution, and what it means to go a step further into creating a long-term concept. Includes real-world examples like the Nescafe Frape concept to bring theory to life.',
+        'INTERMEDIATE',
+        3.5,
+        29,
+        49,
+        10,
+        'Value Creation & Strategic Marketing'),
+       ('Onboarding Fundamentals: How to Successfully Incorporate New Employees',
+        'Master the essentials of onboarding to boost retention and employee satisfaction.',
+        'Learn how to create a structured onboarding experience that accelerates productivity and ensures long-term success.',
+        'This course dives into the core principles of effective onboarding. You’ll learn how a well-designed onboarding process can significantly improve employee retention, boost engagement, and enhance workplace satisfaction. Discover how to help new employees smoothly integrate into company culture, quickly understand their roles, and feel empowered from day one. Practical strategies, examples, and onboarding templates are included to help you implement a seamless onboarding journey.',
+        'BEGINNER',
+        3,
+        25,
+        48,
+        10,
+        'HR & Talent Development'),
+       ('Professional Self-Assessment: Identify Barriers Holding You Back & Areas for Improvement',
+        'Use self-assessment tools to unlock growth and overcome personal barriers.',
+        'Gain insight into your professional strengths, weaknesses, and areas for growth using proven self-assessment techniques.',
+        'This course provides practical tools and frameworks to help you evaluate your professional performance and identify what’s holding you back. You’ll explore techniques like performance and need assessments, and learn to apply the method of deduction to draw clear conclusions about your development. Emphasis is placed on the role of efficiency and practical application in everyday work. Ideal for professionals looking to grow in self-awareness, accountability, and effectiveness.',
+        'BEGINNER',
+        2.5,
+        25,
+        47,
+        10,
+        'Personal Growth & Career Development'),
+       ('Establishing Continuous Business Excellence in Your Company',
+        'Create a high-performance culture through proven excellence frameworks.',
+        'Learn how to implement continuous improvement models to optimize operations, team alignment, and long-term success.',
+        'This course is designed for professionals and leaders who want to embed a culture of excellence within their organization. You’ll explore powerful models such as the Effective Meetings Model, AB model, DF model, and pre/post evaluation frameworks. Learn how to map and address organizational disproportions and improve performance across all departments. By the end, you’ll be equipped with tools to drive consistency, accountability, and strategic growth across your company.',
+        'ADVANCED',
+        4,
+        39,
+        49,
+        10,
+        'Operational Excellence & Leadership'),
+       ('High-Performing Teams and Systems: Organizational Success Through Structure',
+        'Build efficient, structured teams and systems that drive sustainable organizational success.',
+        'Explore how to structure your teams and systems to optimize performance, efficiency, and collaboration across your organization.',
+        'This course focuses on creating high-performing teams by implementing structured systems and eliminating inefficiencies. Learn how to apply a systematic approach to team organization, overcome the pitfalls of working in silos, and increase alignment through effective meetings, communication, confrontation, and decision-making practices. Ideal for team leaders and managers seeking a structured path to operational excellence.',
+        'INTERMEDIATE',
+        3.5,
+        32,
+        48,
+        10,
+        'Team Management & Organizational Structure');
Index: backend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,102 @@
+package com.shifterwebapp.shifter.user;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import jakarta.persistence.*;
+import lombok.*;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+import java.util.List;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@ToString
+@Table(name = "_user") // Using _user to avoid conflict with reserved keyword in SQL
+public class User implements UserDetails {
+    @Id
+//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
+//    @SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    private String name;
+
+    private String email;
+    
+    @JsonIgnore
+    private String passwordHash;    // SHOULD I USE JSON IGNORE HERE? OR IS IT ENOUGH TO NOT EXPOSE IT IN DTO?
+
+    private Boolean isAdmin;
+    
+    private CompanyType companyType;
+    
+    private String workPosition;
+    
+    @ElementCollection(targetClass = Interests.class)
+    @Enumerated(EnumType.STRING)
+    private List<Interests> interests;
+
+    @ElementCollection(targetClass = Skills.class)
+    @Enumerated(EnumType.STRING)
+    private List<Skills> skills;
+
+    @ElementCollection(targetClass = Skills.class)
+    @Enumerated(EnumType.STRING)
+    private List<Skills> skillGap;
+    
+    private Integer points;
+
+    @ElementCollection
+    private List<Integer> favoriteCourses;
+
+    @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
+    private List<Payment> payments;             // WHEN DELETING USER SET PAYMENTS TO NULL, BECAUSE PAYMENTS DONT GET DELETED
+
+
+
+    // USER DETAILS METHODS
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        // Example: give ROLE_ADMIN if user.isAdmin() else ROLE_USER
+        return isAdmin
+                ? List.of(new SimpleGrantedAuthority("ROLE_ADMIN"))
+                : List.of(new SimpleGrantedAuthority("ROLE_USER"));
+    }
+
+    @Override
+    public String getPassword() {
+        return passwordHash;
+    }
+    @Override
+    public String getUsername() {
+        return email;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,107 @@
+package com.shifterwebapp.shifter.user;
+
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.user.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/account")
+public class UserController {
+
+    private final UserService userService;
+
+    @GetMapping("/{accountId}")
+    public ResponseEntity<UserDto> getUser(@PathVariable Long accountId) {
+        UserDto userDto = userService.getUserById(accountId);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @DeleteMapping("/{accountId}")
+    public ResponseEntity<Void> deleteUser(@PathVariable Long accountId) {
+        userService.deleteUser(accountId);
+        return ResponseEntity.noContent().build();
+    }
+
+    @PutMapping("/{accountId}/name")
+    public ResponseEntity<?> updateName(@PathVariable Long accountId, @RequestParam String newName) {
+        UserDto userDto = userService.updateName(accountId, newName);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/mail")
+    public ResponseEntity<?> updateMail(@PathVariable Long accountId, @RequestParam String newMail) {
+        UserDto userDto = userService.updateMail(accountId, newMail);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/password")
+    public ResponseEntity<?> updatePassword(@PathVariable Long accountId, @RequestParam String newPassword) {
+        UserDto userDto = userService.updatePassword(accountId, newPassword);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/work-position")
+    public ResponseEntity<?> updateWorkPosition(@PathVariable Long accountId, @RequestParam String newWorkPosition) {
+        UserDto userDto = userService.updateWorkPosition(accountId, newWorkPosition);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/company-type")
+    public ResponseEntity<?> updateCompanyType(@PathVariable Long accountId, @RequestParam CompanyType newCompanyType) {
+        UserDto userDto = userService.updateCompanyType(accountId, newCompanyType);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/add/interest")
+    public ResponseEntity<?> addInterest(@PathVariable Long accountId, @RequestParam Interests newInterest) {
+        UserDto userDto = userService.addInterest(accountId, newInterest);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/add/skill")
+    public ResponseEntity<?> addSkill(@PathVariable Long accountId, @RequestParam Skills newSkill) {
+        UserDto userDto = userService.addSkill(accountId, newSkill);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/add/skill-gap")
+    public ResponseEntity<?> addSkillGap(@PathVariable Long accountId, @RequestParam Skills newSkillGap) {
+        UserDto userDto = userService.addSkillGap(accountId, newSkillGap);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/add/favorite-course")
+    public ResponseEntity<?> addFavoriteCourse(@PathVariable Long accountId, @RequestParam Integer newFavoriteCourse) {
+        UserDto userDto = userService.addFavoriteCourse(accountId, newFavoriteCourse);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/remove/interest")
+    public ResponseEntity<?> removeInterest(@PathVariable Long accountId, @RequestParam Interests oldInterest) {
+        UserDto userDto = userService.removeInterest(accountId, oldInterest);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/remove/skill")
+    public ResponseEntity<?> removeSkill(@PathVariable Long accountId, @RequestParam Skills oldSkill) {
+        UserDto userDto = userService.removeSkill(accountId, oldSkill);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/remove/skill-gap")
+    public ResponseEntity<?> removeSkillGap(@PathVariable Long accountId, @RequestParam Skills oldSkillGap) {
+        UserDto userDto = userService.removeSkillGap(accountId, oldSkillGap);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{accountId}/remove/favorite-course")
+    public ResponseEntity<?> removeFavoriteCourse(@PathVariable Long accountId, @RequestParam Integer oldFavoriteCourse) {
+        UserDto userDto = userService.removeFavoriteCourse(accountId, oldFavoriteCourse);
+        return ResponseEntity.ok(userDto);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,40 @@
+package com.shifterwebapp.shifter.user;
+
+import com.shifterwebapp.shifter.payment.PaymentDto;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserDto {
+
+    private Long id;
+
+    private String email;
+
+    private String name;
+
+    private CompanyType companyType;
+
+    private String workPosition;
+
+    private List<Interests> interests;
+
+    private List<Skills> skills;
+
+    private List<Skills> skillGap;
+
+    private Integer points;
+
+    private List<Integer> favoriteCourses;
+}
+
+
+
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.user;
+
+import com.shifterwebapp.shifter.payment.PaymentDto;
+import com.shifterwebapp.shifter.payment.PaymentMapper;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface UserMapper {
+
+    UserDto toDto(User user);
+    List<UserDto> toDto(List<User> users);
+
+    @InheritInverseConfiguration
+    User toEntity(UserDto userDto);
+    @InheritInverseConfiguration
+    List<User> toEntity(List<UserDto> userDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,12 @@
+package com.shifterwebapp.shifter.user;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+public interface UserRepository extends JpaRepository<User, Long> {
+
+    boolean existsUserByEmail(String email);
+
+    Optional<User> findByEmail(String email);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,43 @@
+package com.shifterwebapp.shifter.user.service;
+
+import com.shifterwebapp.shifter.auth.RegisterDto;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserDto;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+
+import java.util.List;
+
+public interface ImplUserService {
+    List<UserDto> getAllUsers();
+    UserDto getUserById(Long id);
+    User getUserByEmail(String email);
+
+    User createUser(RegisterDto registerDto);
+    void deleteUser(Long id);
+
+    UserDto updateName(Long id, String newName);
+    UserDto updateMail(Long id, String newMail);
+    UserDto updatePassword(Long id, String newPassHash);
+    UserDto updateWorkPosition(Long id, String newWorkPosition);
+    UserDto updateCompanyType(Long id, CompanyType newCompanyType);
+
+    UserDto addInterest(Long id, Interests newInterest);
+    UserDto addSkill(Long id, Skills newSkill);
+    UserDto addSkills(Long id, List<Skills> newSkills);
+    UserDto addSkillGap(Long id, Skills newSkillGap);
+    UserDto addFavoriteCourse(Long id, Integer newFavoriteCourseId);
+    UserDto addPoints(Long id, Integer newPointsAchieved);
+    UserDto addPayment(Long id, Payment newPayment);
+
+    UserDto removeInterest(Long id, Interests removeInterest);
+    UserDto removeSkill(Long id, Skills removeSkill);
+    UserDto removeSkillGap(Long id, Skills removeSkillGap);
+    UserDto removeSkillGaps(Long id, List<Skills> removeSkillGaps);
+    UserDto removeFavoriteCourse(Long id, Integer removeFavoriteCourseId);
+    UserDto removePoints(Long id, Integer removePointsAchieved);
+    UserDto removePayment(Long id, Payment removePayment);
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -0,0 +1,274 @@
+package com.shifterwebapp.shifter.user.service;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.auth.RegisterDto;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.user.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class UserService implements ImplUserService {
+
+    private final UserRepository userRepository;
+    private final UserMapper userMapper;
+    private final Validate validate;
+    private final PasswordEncoder passwordEncoder;
+
+    @Override
+    public List<UserDto> getAllUsers() {
+        List<User> users = userRepository.findAll();
+        return userMapper.toDto(users);
+    }
+
+    @Override
+    public UserDto getUserById(Long accountId) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public User getUserByEmail(String email) {
+        validate.validateUserExists(email);
+        User user = userRepository.findByEmail(email).orElseThrow();
+        return user;
+    }
+
+    @Override
+    public User createUser(RegisterDto registerDto) {
+        if (userRepository.existsUserByEmail(registerDto.getEmail())) {
+            throw new RuntimeException("Email already in use");
+        }
+
+        User user = User.builder()
+                .name(registerDto.getName())
+                .email(registerDto.getEmail())
+                .passwordHash(passwordEncoder.encode(registerDto.getPassword()))
+                .isAdmin(false)
+                .companyType(registerDto.getCompanyType())
+                .workPosition(registerDto.getWorkPosition())
+                .interests(registerDto.getInterests())
+                .skills(registerDto.getSkills())
+                .skillGap(registerDto.getSkillGap())
+                .points(0)
+                .favoriteCourses(List.of())
+                .build();
+
+        return userRepository.save(user);
+    }
+
+    @Override
+    public void deleteUser(Long accountId) {
+        validate.validateUserExists(accountId);
+        userRepository.deleteById(accountId);
+    }
+
+    @Override
+    public UserDto updateName(Long accountId, String newName) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        user.setName(newName);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateMail(Long accountId, String newMail) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        user.setEmail(newMail);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updatePassword(Long accountId, String newPass) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        user.setPasswordHash(passwordEncoder.encode(newPass));
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateWorkPosition(Long accountId, String newWorkPosition) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        user.setWorkPosition(newWorkPosition);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateCompanyType(Long accountId, CompanyType newCompanyType) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        user.setCompanyType(newCompanyType);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addInterest(Long accountId, Interests newInterest) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getInterests().contains(newInterest)) {
+            user.getInterests().add(newInterest);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addSkill(Long accountId, Skills newSkill) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getSkills().contains(newSkill)) {
+            user.getSkills().add(newSkill);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addSkills(Long accountId, List<Skills> newSkills) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        for (Skills skill : newSkills) {
+            if (!user.getSkills().contains(skill)) {
+                user.getSkills().add(skill);
+            }
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addSkillGap(Long accountId, Skills newSkillGap) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getSkillGap().contains(newSkillGap)) {
+            user.getSkillGap().add(newSkillGap);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addFavoriteCourse(Long accountId, Integer newFavoriteCourseId) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getFavoriteCourses().contains(newFavoriteCourseId)) {
+            user.getFavoriteCourses().add(newFavoriteCourseId);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addPoints(Long accountId, Integer newPointsAchieved) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        Integer newPoints = user.getPoints() + newPointsAchieved;
+        user.setPoints(newPoints);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addPayment(Long accountId, Payment newPayment) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getPayments().contains(newPayment)) {
+            user.getPayments().add(newPayment);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removeInterest(Long accountId, Interests removeInterest) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getInterests().contains(removeInterest)) {
+            user.getInterests().remove(removeInterest);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removeSkill(Long accountId, Skills removeSkill) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getSkills().contains(removeSkill)) {
+            user.getSkills().remove(removeSkill);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removeSkillGap(Long accountId, Skills removeSkillGap) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getSkillGap().contains(removeSkillGap)) {
+            user.getSkillGap().remove(removeSkillGap);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removeSkillGaps(Long accountId, List<Skills> removeSkillGaps) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        for (Skills skill : removeSkillGaps) {
+            if (!user.getSkillGap().contains(skill)) {
+                user.getSkillGap().remove(skill);
+            }
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removeFavoriteCourse(Long accountId, Integer removeFavoriteCourseId) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getFavoriteCourses().contains(removeFavoriteCourseId)) {
+            user.getFavoriteCourses().remove(removeFavoriteCourseId);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removePoints(Long accountId, Integer removePointsAchieved) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        Integer newPoints = user.getPoints() - removePointsAchieved;
+        user.setPoints(newPoints);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removePayment(Long accountId, Payment removePayment) {
+        validate.validateUserExists(accountId);
+        User user = userRepository.findById(accountId).orElseThrow();
+        if (!user.getPayments().contains(removePayment)) {
+            user.getPayments().remove(removePayment);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+}
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/main/resources/application.properties	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -1,4 +1,26 @@
-spring.datasource.hikari.data-source-properties.useServerPrepStmts=false
-spring.datasource.hikari.data-source-properties.prepareThreshold=0
+# application.properties
+
+# General app config
+spring.application.name=Shifter
+
+#spring.datasource.hikari.data-source-properties.useServerPrepStmts=false
+#spring.datasource.hikari.data-source-properties.prepareThreshold=0
+
+logging.level.org.springframework.security=DEBUG
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+# JPA & Hibernate
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.show-sql=false
+#spring.jpa.properties.hibernate.format_sql=true
+#logging.level.org.hibernate.SQL=DEBUG
+#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
+
+
+# Optional HikariCP settings
+spring.datasource.hikari.maximum-pool-size=10
+
+# Base API path
+api.base.path=/api
 
 spring.profiles.active=dev
Index: backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -13,6 +13,6 @@
 import com.shifterwebapp.shifter.payment.PaymentRepository;
 import com.shifterwebapp.shifter.enums.PaymentStatus;
-import com.shifterwebapp.shifter.account.Account;
-import com.shifterwebapp.shifter.account.service.AccountService;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.service.UserService;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -39,5 +39,5 @@
     EnrollmentMapper enrollmentMapper;
     @Mock
-    AccountService accountService;
+    UserService userService;
     @Mock
     Validate validate;
@@ -60,6 +60,6 @@
 
     @Test
-    public void test_getEnrollmentsByAccount() {
-        Long accountId = 1L;
+    public void test_getEnrollmentsByUser() {
+        Long userId = 1L;
 
         List<Enrollment> enrollments = List.of(enrollment);
@@ -70,9 +70,9 @@
 
 
-        Mockito.when(enrollmentRepository.findEnrollmentsByAccount(accountId)).thenReturn(enrollments);
-        Mockito.doNothing().when(validate).validateAccountExists(accountId);
+        Mockito.when(enrollmentRepository.findEnrollmentsByUser(userId)).thenReturn(enrollments);
+        Mockito.doNothing().when(validate).validateUserExists(userId);
         Mockito.when(enrollmentMapper.toDto(enrollments)).thenReturn(dtos);
 
-        List<EnrollmentDto> result = enrollmentService.getEnrollmentsByAccount(accountId);
+        List<EnrollmentDto> result = enrollmentService.getEnrollmentsByUser(userId);
         Assertions.assertEquals(dtos, result);
     }
@@ -82,9 +82,9 @@
         Long enrollmentId = 1L;
 
-        Account mockAccount = Mockito.mock(Account.class);
-        Mockito.when(mockAccount.getId()).thenReturn(2L);
+        User mockUser = Mockito.mock(User.class);
+        Mockito.when(mockUser.getId()).thenReturn(2L);
 
         Payment mockPayment = Mockito.mock(Payment.class);
-        Mockito.when(mockPayment.getAccount()).thenReturn(mockAccount);
+        Mockito.when(mockPayment.getUser()).thenReturn(mockUser);
 
         Course mockCourse = Mockito.mock(Course.class);
@@ -125,17 +125,17 @@
 
     @Test
-    public void test_enrollAccount() {
+    public void test_enrollUser() {
         Long courseId = 1L;
         Long paymentId = 1L;
-        Long accountId = 1L;
+        Long userId = 1L;
         EnrollmentDto dto = new EnrollmentDto();
         dto.setPercentCompleted(60);
         dto.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
 
-        Account mockAccount = Mockito.mock(Account.class);
-        Mockito.when(mockAccount.getId()).thenReturn(accountId);
+        User mockUser = Mockito.mock(User.class);
+        Mockito.when(mockUser.getId()).thenReturn(userId);
 
         Payment mockPayment = Mockito.mock(Payment.class);
-        Mockito.when(mockPayment.getAccount()).thenReturn(mockAccount);
+        Mockito.when(mockPayment.getUser()).thenReturn(mockUser);
         Mockito.when(mockPayment.getPaymentStatus()).thenReturn(PaymentStatus.COMPLETED);
 
@@ -143,11 +143,11 @@
         Mockito.doNothing().when(validate).validateCourseExists(courseId);
         Mockito.doNothing().when(validate).validatePaymentExists(paymentId);
-        Mockito.doNothing().when(validate).validateAccountExists(accountId);
-        Mockito.when(enrollmentRepository.findIsAccountEnrolledInCourse(accountId, courseId)).thenReturn(false);
+        Mockito.doNothing().when(validate).validateUserExists(userId);
+        Mockito.when(enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId)).thenReturn(false);
         Mockito.when(courseRepository.findById(courseId)).thenReturn(Optional.of(new Course()));
         Mockito.when(enrollmentRepository.save(Mockito.any(Enrollment.class))).thenAnswer(arguments -> arguments.getArgument(0));
         Mockito.when(enrollmentMapper.toDto(Mockito.any(Enrollment.class))).thenReturn(dto);
 
-        EnrollmentDto result = enrollmentService.enrollAccount(courseId, paymentId);
+        EnrollmentDto result = enrollmentService.enrollUser(courseId, paymentId);
         Assertions.assertEquals(dto, result);
     }
Index: backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java	(revision 6af7133d721b5e8b4e5f1c526496a7ba6bb780c4)
+++ backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java	(revision 1c1f32c44018e7dc8338fb2c8fc396baf0604223)
@@ -77,13 +77,13 @@
 
     @Test
-    public void test_hasBeenReviewedByAccount() {
+    public void test_hasBeenReviewedByUser() {
         Long courseId = 1L;
-        Long accountId = 1L;
+        Long userId = 1L;
 
-        Mockito.when(reviewRepository.findHasBeenReviewedByAccount(accountId, courseId)).thenReturn(true);
-        Mockito.doNothing().when(validate).validateAccountExists(accountId);
+        Mockito.when(reviewRepository.findHasBeenReviewedByUser(userId, courseId)).thenReturn(true);
+        Mockito.doNothing().when(validate).validateUserExists(userId);
         Mockito.doNothing().when(validate).validateCourseExists(courseId);
 
-        Boolean result = reviewService.hasBeenReviewedByAccount(accountId, courseId);
+        Boolean result = reviewService.hasBeenReviewedByUser(userId, courseId);
         Assertions.assertEquals(true, result);
     }
