diff --git a/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java b/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java
index 56412f38b4549aef95148d7dd14fe040189b772f..80b47dc5fee9d1eb640097c1db2fe025a3533663 100644
--- a/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java
+++ b/src/main/java/com/backend/glowhouse/controller/AuthenticationController.java
@@ -7,8 +7,9 @@ import com.backend.glowhouse.model.response.JwtAuthenticationResponse;
 import com.backend.glowhouse.model.Role;
 import com.backend.glowhouse.model.RoleType;
 import com.backend.glowhouse.model.User;
-import com.backend.glowhouse.repository.UserRepository;
+import com.backend.glowhouse.repository.user.UserRepository;
 import com.backend.glowhouse.security.JwtTokenProvider;
+import com.backend.glowhouse.service.AuthenticationService;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,6 +26,7 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 import javax.validation.Valid;
 import java.net.URI;
 import java.util.Collections;
+import java.util.Date;
 
 @RestController
 @RequestMapping("/api/auth")
@@ -32,77 +34,15 @@ public class AuthenticationController {
     ObjectMapper mapper = new ObjectMapper();
 
     @Autowired
-    private AuthenticationManager authenticationManager;
-
-    @Autowired
-    private UserRepository userRepository;
-
-    @Autowired
-    private PasswordEncoder passwordEncoder;
-
-    @Autowired
-    private JwtTokenProvider tokenProvider;
+    private AuthenticationService authenticationService;
 
     @PostMapping("/login")
     public String authenticateUser(@Valid @RequestBody LoginRequest loginRequest) throws JsonProcessingException {
-
-        Authentication authentication = authenticationManager.authenticate(
-                new UsernamePasswordAuthenticationToken(
-                        loginRequest.getUsernameOrEmail(),
-                        loginRequest.getPassword()
-                )
-        );
-
-        SecurityContextHolder.getContext().setAuthentication(authentication);
-        String jwt = tokenProvider.generateToken(authentication);
-        JwtAuthenticationResponse response = new JwtAuthenticationResponse(jwt);
-
-        return mapper.writeValueAsString(response);
+        return authenticationService.handleLoginRequest(loginRequest);
     }
 
     @PostMapping("/register")
     public ResponseEntity<?> registerUser(@Valid @RequestBody RegistrationRequest registrationRequest) {
-        if(userRepository.existsByUsername(registrationRequest.getUsername())) {
-            return new ResponseEntity<>(
-                new ApiResponse(
-                        false,
-                        "Username is already taken!"
-                ),
-                HttpStatus.BAD_REQUEST
-            );
-        }
-
-        if(userRepository.existsByEmail(registrationRequest.getEmail())) {
-            return new ResponseEntity<>(
-                new ApiResponse(
-                    false,
-                    "Email Address already in use!"
-                ),
-                HttpStatus.BAD_REQUEST
-            );
-        }
-
-        // Creating user's account
-        User user = new User(
-                registrationRequest.getName(),
-                registrationRequest.getUsername(),
-                registrationRequest.getEmail(),
-                registrationRequest.getPassword()
-        );
-
-        user.setPassword(passwordEncoder.encode(user.getPassword()));
-
-        Role userRole = new Role();
-        userRole.setName(RoleType.ROLE_USER);
-
-        user.setRoles(Collections.singleton(userRole));
-
-        User result = userRepository.save(user);
-
-        URI location = ServletUriComponentsBuilder
-                .fromCurrentContextPath().path("/api/users/{username}")
-                .buildAndExpand(result.getUsername()).toUri();
-
-        return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully"));
+        return authenticationService.handleRegistrationRequest(registrationRequest);
     }
 }
diff --git a/src/main/java/com/backend/glowhouse/service/AuthenticationService.java b/src/main/java/com/backend/glowhouse/service/AuthenticationService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f9898e45e344c81cb5b7ada51da102b53919b2d
--- /dev/null
+++ b/src/main/java/com/backend/glowhouse/service/AuthenticationService.java
@@ -0,0 +1,107 @@
+package com.backend.glowhouse.service;
+
+import com.backend.glowhouse.model.Role;
+import com.backend.glowhouse.model.RoleType;
+import com.backend.glowhouse.model.User;
+import com.backend.glowhouse.model.request.LoginRequest;
+import com.backend.glowhouse.model.request.RegistrationRequest;
+import com.backend.glowhouse.model.response.ApiResponse;
+import com.backend.glowhouse.model.response.JwtAuthenticationResponse;
+import com.backend.glowhouse.repository.user.UserRepository;
+import com.backend.glowhouse.security.JwtTokenProvider;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.Date;
+
+@Service
+public class AuthenticationService {
+    private ObjectMapper mapper = new ObjectMapper();
+    private AuthenticationManager authenticationManager;
+    private UserRepository userRepository;
+    private PasswordEncoder passwordEncoder;
+    private JwtTokenProvider tokenProvider;
+
+    @Autowired
+    public AuthenticationService(AuthenticationManager authenticationManager, UserRepository userRepository, PasswordEncoder passwordEncoder, JwtTokenProvider tokenProvider) {
+        this.authenticationManager = authenticationManager;
+        this.userRepository = userRepository;
+        this.passwordEncoder = passwordEncoder;
+        this.tokenProvider = tokenProvider;
+    }
+
+    public String handleLoginRequest(LoginRequest loginRequest) throws JsonProcessingException {
+        //authenticate user using spring security package
+        Authentication authentication = authenticationManager.authenticate(
+                new UsernamePasswordAuthenticationToken(
+                        loginRequest.getUsernameOrEmail(),
+                        loginRequest.getPassword()
+                )
+        );
+        //generate json web token for user
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+        String jwt = tokenProvider.generateToken(authentication);
+        JwtAuthenticationResponse response = new JwtAuthenticationResponse(jwt);
+        //return token to user
+        return mapper.writeValueAsString(response);
+    }
+
+    public ResponseEntity<?> handleRegistrationRequest(RegistrationRequest registrationRequest) {
+        //check if username already taken
+        if(userRepository.existsByUsername(registrationRequest.getUsername())) {
+            return new ResponseEntity<>(
+                    new ApiResponse(
+                            false,
+                            "Username is already taken!"
+                    ),
+                    HttpStatus.BAD_REQUEST
+            );
+        }
+        //check if email already registered
+        if(userRepository.existsByEmail(registrationRequest.getEmail())) {
+            return new ResponseEntity<>(
+                    new ApiResponse(
+                            false,
+                            "Email Address already in use!"
+                    ),
+                    HttpStatus.BAD_REQUEST
+            );
+        }
+
+        //creating user object
+        User user = new User(
+                registrationRequest.getName(),
+                registrationRequest.getUsername(),
+                registrationRequest.getEmail(),
+                registrationRequest.getPassword()
+        );
+        //hash password
+        user.setPassword(passwordEncoder.encode(user.getPassword()));
+        //assign user role
+        Role userRole = new Role();
+        userRole.setName(RoleType.ROLE_USER);
+        user.setRoles(Collections.singleton(userRole));
+        //set joined at date
+        user.setJoinedAt(new Date());
+        //persist user to db
+        User result = userRepository.save(user);
+
+        URI location = ServletUriComponentsBuilder
+                .fromCurrentContextPath().path("/api/users/{username}")
+                .buildAndExpand(result.getUsername()).toUri();
+        //return response to user
+        return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully"));
+    }
+}