diff --git a/lab3/twidder/database.db b/lab3/twidder/database.db
index 7f8b4c47c8b9224e9a2b10c3bee780fc3f53e50a..b46fceb8a2352e0276d2f3f4579482b0737cc090 100644
Binary files a/lab3/twidder/database.db and b/lab3/twidder/database.db differ
diff --git a/lab3/twidder/server.py b/lab3/twidder/server.py
index 3791a69c6763449fda1224a953d763a82bb11d66..46d60a97c10d60f1f235591e3ba6c3acf8abfc9a 100644
--- a/lab3/twidder/server.py
+++ b/lab3/twidder/server.py
@@ -6,17 +6,17 @@ import secrets
 import database_helper
 import json
 import uuid
-
+import logging
 
 app = Flask(__name__, static_url_path="")
-
+app.logger.setLevel(logging.DEBUG)
 active_sockets = dict()
 
 """ Helper functions """
 
 
 def hash_password(pw):
-    hashed_pw = sha256_crypt.encrypt(pw)
+    hashed_pw = sha256_crypt.hash(pw)
     return hashed_pw
 
 
@@ -89,8 +89,9 @@ def root():
 
 @app.route("/sign-in", methods=["POST"])
 def sign_in():
-    email = request.form["email"]
-    password = request.form["password"]
+    data = request.get_json()
+    email = data["email"]
+    password = data["password"]
 
     if validate_user(email, password):
 
@@ -120,7 +121,7 @@ def sign_in():
 
 @app.route("/sign-up", methods=["POST"])
 def sign_up():
-    user_data = request.form
+    user_data = request.get_json()
     if not is_signup_form_valid(user_data):
         return create_response(
             success=False, message="One or more fields are incorrect"
@@ -162,14 +163,15 @@ def change_password():
     if user:
         email = user[0]
         hashed_pw = user[1]
-        if validate_password(request.form["oldPassword"], hashed_pw):
-
-            if len(request.form["newPassword"]) < 6:
+        data = request.get_json()
+        if validate_password(data["oldPassword"], hashed_pw):
+            data = request.get_json()
+            if len(data["newPassword"]) < 6:
                 return create_response(
                     success=False, message="Password must be at least 6 characters"
                 )
 
-            hashed_password = hash_password(request.form["newPassword"])
+            hashed_password = hash_password(data["newPassword"])
             database_helper.set_password(email, hashed_password)
             return create_response(success=True, message="Password has been changed")
 
@@ -270,15 +272,16 @@ def post_message():
     token = get_token()
     current_user = get_user_by_token(token)
     if current_user:
+        data = request.get_json()
         sender_email = current_user[0]
-        receiver_email = request.form["email"]
+        receiver_email = data["email"]
         receiver_email = receiver_email if receiver_email else sender_email
         msg_id = uuid.uuid4().hex
         database_helper.add_message(
             msg_id=msg_id,
             to_email=receiver_email,
             from_email=sender_email,
-            message=request.form["message"],
+            message=data["message"],
         )
         return create_response(success=True, message="Message sent")
     else:
diff --git a/lab3/twidder/static/client.js b/lab3/twidder/static/client.js
index 8c1c57ee6a9c7630b09a89ed3e0d3f7ef0dec4e6..3410338b7c2015920a017a8de533edc9a5f1ce35 100644
--- a/lab3/twidder/static/client.js
+++ b/lab3/twidder/static/client.js
@@ -136,7 +136,12 @@ function postUserMessage() {
   let email = document.getElementById("user-email").innerHTML.slice(7); // strip email clean
 
   let userToken = window.localStorage.getItem("token");
-  let params = "&email=" + email + "&message=" + message_form.value;
+
+  let params = {
+    email: email,
+    message: message_form.value,
+  };
+  
   let myCallback = function (res) {
     if (res.success) {
       message_form.value = null;
@@ -155,7 +160,11 @@ function postMessageToSelf() {
   }
 
   let userToken = window.localStorage.getItem("token");
-  let params = "&email" + "" + "&message=" + message_form.value;
+  let params = {
+    email: "",
+    message: message_form.value,
+  };
+
   let myCallback = function (res) {
     if (res.success) {
       message_form.value = null;
@@ -205,7 +214,10 @@ function handleLogin() {
 }
 
 function signIn(email, password) {
-  let params = "&email=" + email + "&password=" + password;
+  let params = {
+    email: email,
+    password: password,
+  };
   let myCallback = function (res) {
     if (res.success) {
       localStorage.setItem("token", res.data);
@@ -282,21 +294,16 @@ function handleSignUp() {
     country: document.forms["signup-form"]["country"].value,
   };
 
-  let params =
-    "firstname=" +
-    userData.firstname +
-    "&familyname=" +
-    userData.familyname +
-    "&gender=" +
-    userData.gender +
-    "&city=" +
-    userData.city +
-    "&country=" +
-    userData.country +
-    "&email=" +
-    userData.email +
-    "&password=" +
-    userData.password;
+  let params = {
+    firstname: userData.firstname,
+    familyname: userData.familyname,
+    gender: userData.gender,
+    city: userData.city,
+    country: userData.country,
+    email: userData.email,
+    password: userData.password,
+  };
+
 
   let myCallback = function (res) {
     if (res.success) {
@@ -319,7 +326,11 @@ function changePassword() {
     return;
   }
 
-  let params = "&oldPassword=" + oldPw + "&newPassword=" + newPw;
+  let params = {
+    oldPassword: oldPw,
+    newPassword: newPw,
+  };
+
   let myCallback = function (res) {
     showModal(res.message);
   };
@@ -399,7 +410,7 @@ function connectWebSocket() {
 function xmlOther(url, callback, params, token, requestType) {
   let xhttp = new XMLHttpRequest();
   xhttp.open(requestType, url, true);
-  xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+  xhttp.setRequestHeader("Content-type", "application/json");
   if (token) {
     xhttp.setRequestHeader("Authorization", "Bearer " + token);
   }
@@ -408,5 +419,5 @@ function xmlOther(url, callback, params, token, requestType) {
       callback(JSON.parse(xhttp.responseText));
     }
   };
-  xhttp.send(params);
+  xhttp.send(JSON.stringify(params));
 }