diff --git a/README.md b/README.md
index 613f1f1c73c69c1328f24dbb939ddbb27132bd15..35d47986e8722426fd25d3444a36b808b6b9456d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
-# Grievance
\ No newline at end of file
+# grievance-service
+Customised service to create tickets
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index b937cae8d67980ee2105facf93b71583ba79724e..ee4c80991558c630fdfeee1bda726c032b140ffd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,17 +29,17 @@
 		<dependency>
 			<groupId>org.springframework.security</groupId>
 			<artifactId>spring-security-jwt</artifactId>
-			<version>1.1.0.RELEASE</version>
+			<version>1.1.1.RELEASE</version>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework.security.oauth</groupId>
 			<artifactId>spring-security-oauth2</artifactId>
-			<version>2.5.0.RELEASE</version>
+			<version>2.5.2.RELEASE</version>
 		</dependency>
 		<dependency>
 			<groupId>io.jsonwebtoken</groupId>
 			<artifactId>jjwt</artifactId>
-			<version>0.6.0</version>
+			<version>0.9.1</version>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
@@ -85,12 +85,13 @@
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
+			<version>3.1.0</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-artifact-manager</artifactId>
-			<version>2.0</version>
+			<version>2.2.1</version>
 		</dependency>
 	</dependencies>
 
diff --git a/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java b/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java
index 7cbe26cdc008b1662db7cde24f26c243955f1cbe..fc9d78edabc4b811a6608a804c4974ddc72a0e5a 100644
--- a/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java
+++ b/src/main/java/org/upsmf/grievance/GrievanceServiceApplication.java
@@ -3,8 +3,10 @@ package org.upsmf.grievance;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
+@EnableScheduling
 @EnableJpaRepositories(basePackages = "org.upsmf.grievance")
 public class GrievanceServiceApplication {
 
diff --git a/src/main/java/org/upsmf/grievance/controller/RoleController.java b/src/main/java/org/upsmf/grievance/controller/RoleController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f5bbba6cbff15bfcb33669d2bcd276d9c6f9d51
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/controller/RoleController.java
@@ -0,0 +1,47 @@
+package org.upsmf.grievance.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.upsmf.grievance.model.Role;
+import org.upsmf.grievance.service.RoleService;
+
+import javax.management.relation.RoleNotFoundException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/roles")
+public class RoleController {
+
+    @Autowired
+    private RoleService roleService;
+
+    @PostMapping("/addrole")
+    public ResponseEntity<Role> createRole(@RequestParam String roleName) {
+        Role createdRole = roleService.createRole(roleName);
+        return ResponseEntity.status(HttpStatus.CREATED).body(createdRole);
+    }
+
+    @PutMapping("/{roleId}")
+    public ResponseEntity<Role> updateRole(@PathVariable Long roleId, @RequestParam String newRoleName) throws RoleNotFoundException {
+        Role updatedRole = roleService.updateRole(roleId, newRoleName);
+        return ResponseEntity.ok(updatedRole);
+    }
+
+    @GetMapping
+    public ResponseEntity<List<Role>> getAllRoles() {
+        List<Role> roles = roleService.getAllRoles();
+        return ResponseEntity.ok(roles);
+    }
+
+    @GetMapping("/{roleId}")
+    public ResponseEntity<Role> getRoleById(@PathVariable Long roleId) {
+        Role role = roleService.getRoleById(roleId);
+        if (role != null) {
+            return ResponseEntity.ok(role);
+        } else {
+            return ResponseEntity.notFound().build();
+        }
+    }
+}
diff --git a/src/main/java/org/upsmf/grievance/controller/UserController.java b/src/main/java/org/upsmf/grievance/controller/UserController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b3721f916130c05382acf1a9bad52dba9876a4a
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/controller/UserController.java
@@ -0,0 +1,64 @@
+package org.upsmf.grievance.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.upsmf.grievance.model.User;
+import org.upsmf.grievance.service.UserService;
+
+
+@Controller
+@RequestMapping("/user")
+public class UserController {
+
+    @Autowired
+    private UserService userService;
+
+        @PostMapping("/register")
+    public ResponseEntity<String> registerUser(@RequestBody User user) {
+        userService.registerUser(user);
+        return ResponseEntity.ok("User registered successfully.");
+    }
+
+    @PostMapping("/forgot-password")
+    public ResponseEntity<String> forgotPassword(@RequestParam String email) {
+        User user = userService.findByEmail(email);
+        // Logic for sending reset password instructions
+        return ResponseEntity.ok("Password reset instructions sent.");
+    }
+
+    @PostMapping("/reset-password")
+    public ResponseEntity<String> resetPassword(@RequestParam String email, @RequestParam String newPassword) {
+        try {
+            userService.resetUserPassword(email, newPassword);
+            return ResponseEntity.ok("Password reset successful.");
+        } catch (Exception e) {
+            return ResponseEntity.badRequest().body("User not found.");
+        }
+    }
+
+    @PostMapping("/login")
+    public ResponseEntity<String> loginUser(@RequestParam String username, @RequestParam String password) {
+        User user = userService.findByUsername(username);
+
+        if (user == null) {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password.");
+        }
+
+        // Compare the provided password with the stored hashed password
+        if (userService.matchPassword(password, user.getPassword())) {
+            return ResponseEntity.ok("Login successful.");
+        } else {
+            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password.");
+        }
+    }
+
+
+
+
+}
diff --git a/src/main/java/org/upsmf/grievance/model/Role.java b/src/main/java/org/upsmf/grievance/model/Role.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8996acba548c0690bfa762c9a6681bd09f7fa26
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/model/Role.java
@@ -0,0 +1,25 @@
+package org.upsmf.grievance.model;
+
+import lombok.*;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "role")
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ToString
+public class Role {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(nullable=false, unique=true)
+    private String name;
+
+}
diff --git a/src/main/java/org/upsmf/grievance/model/User.java b/src/main/java/org/upsmf/grievance/model/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..f408cfb286ba9dbc2e9a7e67f0ec158352cf780c
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/model/User.java
@@ -0,0 +1,39 @@
+package org.upsmf.grievance.model;
+
+import lombok.*;
+
+import javax.persistence.*;
+import java.util.HashSet;
+import java.util.Set;
+
+@Entity
+@Table(name = "users")
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ToString
+public class User {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(nullable=false)
+    private String username;
+
+    @Column(nullable=false, unique=true)
+    private String email;
+
+    @Column(nullable=false)
+    private String password;
+
+    @ManyToMany(fetch = FetchType.EAGER)
+    @JoinTable(
+            name = "user_roles",
+            joinColumns = @JoinColumn(name = "user_id"),
+            inverseJoinColumns = @JoinColumn(name = "role_id")
+    )
+    private Set<Role> roles = new HashSet<>();
+}
diff --git a/src/main/java/org/upsmf/grievance/repository/RoleRepository.java b/src/main/java/org/upsmf/grievance/repository/RoleRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..b46cdf46071839b4280266000843f478bf5d6bb3
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/repository/RoleRepository.java
@@ -0,0 +1,9 @@
+package org.upsmf.grievance.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import org.upsmf.grievance.model.Role;
+@Repository("roleRepository")
+public interface RoleRepository extends JpaRepository<Role,Long> {
+    Role findByName(String name);
+}
diff --git a/src/main/java/org/upsmf/grievance/repository/UserRepository.java b/src/main/java/org/upsmf/grievance/repository/UserRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac2528667d50171a4c829d9ade5d1f785b959b7f
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/repository/UserRepository.java
@@ -0,0 +1,11 @@
+package org.upsmf.grievance.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import org.upsmf.grievance.model.User;
+@Repository("userRepository")
+public interface UserRepository extends JpaRepository<User,Long> {
+
+    User findByUsername(String username);
+    User findByEmail(String email);
+}
diff --git a/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java b/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..37ce9b58f78c274a804037fc47276dc896409017
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java
@@ -0,0 +1,23 @@
+package org.upsmf.grievance.scheduler;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.upsmf.grievance.controller.SearchTicketController;
+import org.upsmf.grievance.dto.SearchRequest;
+import org.upsmf.grievance.model.reponse.Response;
+import org.upsmf.grievance.model.reponse.TicketResponse;
+
+@Component
+public class BiWeeklyJobScheduler {
+
+    @Autowired
+    private SearchTicketController searchTicketController;
+    @Scheduled(cron = "0 0 0 */14 * ?")
+    public void runBiWeeklyJob(){
+        SearchRequest searchRequest = new SearchRequest();
+        ResponseEntity<Response> ticketResponse = searchTicketController.search(searchRequest);
+    }
+}
+
diff --git a/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java b/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..15a42895829b875e839df2b1a661eb137bd52a13
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java
@@ -0,0 +1,13 @@
+package org.upsmf.grievance.scheduler;
+
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class NightlyJobScheduler {
+
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void runNightlyJob(){
+
+    }
+}
diff --git a/src/main/java/org/upsmf/grievance/service/RoleService.java b/src/main/java/org/upsmf/grievance/service/RoleService.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ed4de05dd2c67603f91998d60d4b8dabb59c6e1
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/service/RoleService.java
@@ -0,0 +1,17 @@
+package org.upsmf.grievance.service;
+
+import org.springframework.stereotype.Service;
+import org.upsmf.grievance.model.Role;
+
+import javax.management.relation.RoleNotFoundException;
+import java.util.List;
+
+public interface RoleService {
+
+    Role createRole(String roleName);
+    Role updateRole(Long roleId, String newRoleName) throws RoleNotFoundException;
+
+    List<Role> getAllRoles();
+
+    Role getRoleById(Long roleId);
+}
diff --git a/src/main/java/org/upsmf/grievance/service/UserService.java b/src/main/java/org/upsmf/grievance/service/UserService.java
new file mode 100644
index 0000000000000000000000000000000000000000..371ec6743f2e4b77116ba6a2ab6ed99f6c356c40
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/service/UserService.java
@@ -0,0 +1,18 @@
+package org.upsmf.grievance.service;
+
+import org.springframework.stereotype.Service;
+import org.upsmf.grievance.model.User;
+
+
+public interface UserService {
+
+    User registerUser(User user);
+    User findByEmail(String email);
+
+    User findByUsername(String username);
+
+    boolean matchPassword(String rawPassword, String hashedPassword);
+
+    void resetUserPassword(String email, String newPassword) throws Exception;
+
+}
diff --git a/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ca7a2ed1b9de78672030e86e1b122c760ad6835
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/service/impl/RoleServiceImpl.java
@@ -0,0 +1,48 @@
+package org.upsmf.grievance.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.upsmf.grievance.model.Role;
+import org.upsmf.grievance.repository.RoleRepository;
+import org.upsmf.grievance.service.RoleService;
+
+import javax.management.relation.RoleNotFoundException;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class RoleServiceImpl implements RoleService {
+
+    @Autowired
+    private RoleRepository roleRepository;
+    @Override
+    public Role createRole(String roleName) {
+        Role role = new Role();
+        role.setName(roleName);
+        return roleRepository.save(role);
+    }
+
+    @Override
+    public Role updateRole(Long roleId, String newRoleName) throws RoleNotFoundException {
+        Optional<Role> optionalRole = roleRepository.findById(roleId);
+
+        if (optionalRole.isPresent()) {
+            Role role = optionalRole.get();
+            role.setName(newRoleName);
+            return roleRepository.save(role);
+        } else {
+            // Handle the case where the role with the given ID is not found
+            throw new RoleNotFoundException("Role not found with ID: " + roleId);
+        }
+    }
+
+    @Override
+    public List<Role> getAllRoles() {
+        return roleRepository.findAll();
+    }
+
+    @Override
+    public Role getRoleById(Long roleId) {
+        return roleRepository.findById(roleId).orElse(null);
+    }
+}
diff --git a/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java
index e683f5ba28c4353dc0c920af10e7d7c8761a8c80..06baf25472a299c26d6b642a67c1248852a79768 100644
--- a/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java
+++ b/src/main/java/org/upsmf/grievance/service/impl/TicketServiceImpl.java
@@ -196,15 +196,22 @@ public class TicketServiceImpl implements TicketService {
      */
     private void setUpdateTicket(UpdateTicketRequest updateTicketRequest, Ticket ticket) {
         // TODO check request role and permission
-        ticket.setStatus(updateTicketRequest.getStatus());
-        ticket.setAssignedToId(updateTicketRequest.getCc());
-        ticket.setPriority(updateTicketRequest.getPriority());
+        if(updateTicketRequest.getStatus()!=null)
+            ticket.setStatus(updateTicketRequest.getStatus());
+        if(updateTicketRequest.getCc()!=null)
+            ticket.setAssignedToId(updateTicketRequest.getCc());
+        if(updateTicketRequest.getPriority()!=null)
+            ticket.setPriority(updateTicketRequest.getPriority());
+        if(updateTicketRequest.getIsJunk()!=null)
+            ticket.setJunk(updateTicketRequest.getIsJunk());
         // update assignee comments
-        Comments comments = Comments.builder().comment(updateTicketRequest.getComment())
-                        .userId(updateTicketRequest.getRequestedBy())
-                        .ticketId(ticket.getId())
-                        .build();
-        commentRepository.save(comments);
+        if(updateTicketRequest.getComment()!=null) {
+            Comments comments = Comments.builder().comment(updateTicketRequest.getComment())
+                    .userId(updateTicketRequest.getRequestedBy())
+                    .ticketId(ticket.getId())
+                    .build();
+            commentRepository.save(comments);
+        }
         // update assignee attachment url
         if(updateTicketRequest.getAssigneeAttachmentURLs() != null) {
             for (String url : updateTicketRequest.getAssigneeAttachmentURLs()) {
diff --git a/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..09af433005fa5106444137820896491301a7ee39
--- /dev/null
+++ b/src/main/java/org/upsmf/grievance/service/impl/UserServiceImpl.java
@@ -0,0 +1,65 @@
+package org.upsmf.grievance.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.upsmf.grievance.model.Role;
+import org.upsmf.grievance.model.User;
+import org.upsmf.grievance.repository.RoleRepository;
+import org.upsmf.grievance.repository.UserRepository;
+import org.upsmf.grievance.service.UserService;
+
+import java.util.Collections;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @Autowired
+    private RoleRepository roleRepository;
+
+    @Autowired
+    private BCryptPasswordEncoder passwordEncoder;
+
+
+    @Override
+    public User registerUser(User user) {
+        user.setPassword(passwordEncoder.encode(user.getPassword()));
+        // Assign a default role for new users
+        Role userRole = roleRepository.findByName("ROLE_USER");
+        user.setRoles(Collections.singleton(userRole));
+        return userRepository.save(user);
+    }
+
+    @Override
+    public User findByUsername(String username) {
+
+        return userRepository.findByUsername(username);
+    }
+
+    @Override
+    public boolean matchPassword(String rawPassword, String hashedPassword) {
+        return passwordEncoder.matches(rawPassword, hashedPassword);
+    }
+
+    @Override
+    public void resetUserPassword(String email, String newPassword) throws Exception {
+        User user = userRepository.findByEmail(email);
+
+        if (user == null) {
+            throw new Exception("User not found");
+        }
+
+        user.setPassword(newPassword);
+        userRepository.save(user);
+    }
+
+    @Override
+    public User findByEmail(String email) {
+
+        return userRepository.findByEmail(email);
+    }
+
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3434466049ea180d8e16778601a098b223803f1e..cd21f6f2a2efa93e88e3bec0f39c10065179a1b7 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -43,4 +43,7 @@ gcp.bucket.folder.name=grievance
 gcp.max.file.size=2mb
 gcp.config.file.path=/Users/shishirsuman/Desktop/upsmf.json
 gcp.client.id=
+gcp.client.email=
+gcp.pkcs.key=
+gcp.private.key.id=