diff --git a/data/demo.mv.db b/data/demo.mv.db
index 48b78e205563195cf8a3d851906185290eda3b40..af0b988bb1e79148e9d69e18f5f74a08beecf0ac 100644
Binary files a/data/demo.mv.db and b/data/demo.mv.db differ
diff --git a/src/main/java/com/quackr/demo/user/User.java b/src/main/java/com/quackr/demo/user/User.java
index 45ecb23821d1d44269e6ed7c0e77119d26c33401..a7611971b7da28a181fe4b19bb65aa247cd5af6d 100644
--- a/src/main/java/com/quackr/demo/user/User.java
+++ b/src/main/java/com/quackr/demo/user/User.java
@@ -11,7 +11,7 @@ public class User implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "userId", unique = true)
-    private int userId;
+    private Long userId;
 
     @Column(name = "first_name", nullable = false)
     private String first_name;
@@ -37,11 +37,11 @@ public class User implements Serializable {
 
     }
 
-    public int getUserId() {
+    public Long getUserId() {
         return userId;
     }
 
-    public void setUserId(int id) {
+    public void setUserId(Long id) {
         this.userId = id;
     }
 
@@ -77,4 +77,14 @@ public class User implements Serializable {
         this.username = username;
     }
 
+    @Override
+    public String toString() {
+        return "User{" +
+                "userId=" + userId +
+                ", first_name='" + first_name + '\'' +
+                ", last_name='" + last_name + '\'' +
+                ", email='" + email + '\'' +
+                ", username='" + username + '\'' +
+                '}';
+    }
 }
diff --git a/src/main/java/com/quackr/demo/user/UserController.java b/src/main/java/com/quackr/demo/user/UserController.java
index abf4b09c3c00b66b2ca351d6387654302817c357..d73f1286d35a6eacd3ef4323ed2372c885ed2efe 100644
--- a/src/main/java/com/quackr/demo/user/UserController.java
+++ b/src/main/java/com/quackr/demo/user/UserController.java
@@ -1,9 +1,7 @@
 package com.quackr.demo.user;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -22,4 +20,23 @@ public class UserController {
     public List<User> getUsers(){
         return userService.getUsers();
     }
+
+    @PostMapping
+    public void registerNewUser(@RequestBody User user){
+        userService.addNewUser(user);
+    }
+
+    @DeleteMapping(path = "{userId}")
+    public void deleteUser(@PathVariable("userId") Long userId){
+        userService.deleteUser(userId);
+    }
+
+    @PutMapping(path =  "{userId}")
+    public void updateUser(@PathVariable("userId") Long userId,
+                           @RequestParam(required = false) String first_name,
+                           @RequestParam(required = false) String last_name,
+                           @RequestParam(required = false) String email,
+                           @RequestParam(required = false) String username){
+        userService.updateUser(userId, first_name, last_name, email, username);
+    }
 }
diff --git a/src/main/java/com/quackr/demo/user/UserRepository.java b/src/main/java/com/quackr/demo/user/UserRepository.java
index 61b2dec9941a973005c0fc0f1ee8b46211c6aa59..f83668a841bfeb4804b73d1e6b8658f8bb1a3345 100644
--- a/src/main/java/com/quackr/demo/user/UserRepository.java
+++ b/src/main/java/com/quackr/demo/user/UserRepository.java
@@ -1,9 +1,15 @@
 package com.quackr.demo.user;
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
 
+    @Query("SELECT u FROM User u WHERE u.email = ?1")
+    Optional<User> findUserByEmail(String email);
+
 }
diff --git a/src/main/java/com/quackr/demo/user/UserService.java b/src/main/java/com/quackr/demo/user/UserService.java
index 2e9d7ae69d4169d5528f7636cad75f5a0d8f89a4..b20ab38a990b4017fac652ba2d15f832b9bb380b 100644
--- a/src/main/java/com/quackr/demo/user/UserService.java
+++ b/src/main/java/com/quackr/demo/user/UserService.java
@@ -6,8 +6,11 @@ import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.transaction.Transactional;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 
 @Service
 public class UserService {
@@ -24,4 +27,49 @@ public class UserService {
         return userRepository.findAll();
     }
 
+    public void addNewUser(User user) {
+        Optional<User> userOptional = userRepository.findUserByEmail(user.getEmail());
+        if(userOptional.isPresent()){
+            throw new IllegalStateException("email already taken");
+        }
+        userRepository.save(user);
+        System.out.println(user);
+    }
+
+    public void deleteUser(Long userId) {
+        boolean exists = userRepository.existsById(userId);
+        if(!exists){
+            throw new IllegalStateException("user with id "+ userId+ " does not exist");
+        }
+        userRepository.deleteById(userId);
+    }
+
+    @Transactional
+    public void updateUser(Long userId, String firstName, String lastName, String email, String username) {
+        User user = userRepository.findById(userId)
+                .orElseThrow(() -> new IllegalStateException("user with "+ userId + " does not exist"));
+
+
+        if(firstName != null && firstName.length()>0 && !Objects.equals(user.getFirst_name(), firstName)){
+            user.setFirst_name(firstName);
+        }
+
+        if(lastName != null && lastName.length()>0 && !Objects.equals(user.getLast_name(), lastName)){
+            user.setLast_name(lastName);
+        }
+
+        if(email != null && email.length()>0 && !Objects.equals(user.getEmail(),email)){
+            Optional<User> optionalUser = userRepository.findUserByEmail(email);
+            if(optionalUser.isPresent()){
+                throw new IllegalStateException("email is already taken");
+            }
+            user.setEmail(email);
+        }
+
+        if(username != null && username.length()>0 && !Objects.equals(user.getUsername(),username)){
+            //usernames can be used more than once
+            System.out.println("username update");
+            user.setUsername(username);
+        }
+    }
 }
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 243a167fc84d3ca13b93a3fca6fcebafc2d52293..6efb8f195bc1b99fefaa7936012b523040a39767 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -6,4 +6,7 @@ spring.datasource.password=password
 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
 spring.h2.console.enabled=true
 spring.datasource.initialization-mode=always
-spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
\ No newline at end of file
+spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+spring.jpa.show-sql=true
+
+server.error.include-message=always
\ No newline at end of file