diff --git a/Procfile b/Procfile
index 71d87a27e072c18469da468debe7e46a43b60989..f1d10088b53181f25d28ad34ffd7496837f236c3 100644
--- a/Procfile
+++ b/Procfile
@@ -1 +1 @@
-web: gunicorn app.server:app -b 0.0.0.0:$PORT -w 3 -k gevent --max-requests 250
\ No newline at end of file
+web: gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 app.server:app
\ No newline at end of file
diff --git a/app/__pycache__/database_helper.cpython-38.pyc b/app/__pycache__/database_helper.cpython-38.pyc
index 88d0ffae2b68e05345e641a44654e743e61549c9..5d4ac866e8ace646b18df5e7be54ad6b02332d68 100644
Binary files a/app/__pycache__/database_helper.cpython-38.pyc and b/app/__pycache__/database_helper.cpython-38.pyc differ
diff --git a/app/__pycache__/server.cpython-38.pyc b/app/__pycache__/server.cpython-38.pyc
index e823edadb12398c139804afefd56e7eee14b85a3..b3a77e14e5b3d98e2fc2c18b3e8254d796151032 100644
Binary files a/app/__pycache__/server.cpython-38.pyc and b/app/__pycache__/server.cpython-38.pyc differ
diff --git a/app/client.html b/app/client.html
index 2298c65498c3bef3f0e31d175b936774fe0e5d80..1e6312abe949df2e63bf7f684ffc413677f0e863 100644
--- a/app/client.html
+++ b/app/client.html
@@ -91,7 +91,7 @@
                     <div id="postLoad">
                         <div id="post">
                             <form onsubmit="postMsg(this, 'home'); return false;">
-                                <textarea name="message" rows="5"></textarea><br>
+                                <textarea name="message" rows="5" ondrop="drop(event)" ondragover="allowDrop(event)"></textarea><br>
                                 <input type="submit" value="Send">
                             </form>
                         </div>
diff --git a/app/database.db b/app/database.db
index 0236928455fd8263062afbc0280ca06e69e7ce80..16a987f7ba2a636d9a8adecea3971f76054ef406 100644
Binary files a/app/database.db and b/app/database.db differ
diff --git a/app/database_helper.py b/app/database_helper.py
index 314dc62c9bfde20e2b895384d6dd66ce19fac75c..50a09ce114375d180f807847bb4212a2962643f8 100644
--- a/app/database_helper.py
+++ b/app/database_helper.py
@@ -32,6 +32,7 @@ class Message(Base):
   sender_id = Column(String(60), ForeignKey(User.id), nullable=False)
   receiver_id = Column(Integer, ForeignKey(User.id), nullable=False)
   message = Column(Text())
+  location = Column(Text())
 
 # Init table
 Base.metadata.create_all(engine)
@@ -150,12 +151,13 @@ def ShowUserIdByToken(token):
   else:
     return None
 
-def CreateMessage(sender_id, receiver_id, message):
+def CreateMessage(sender_id, receiver_id, message, location):
   session = fs_db.session
   new_msg = Message(
     receiver_id=receiver_id,
     sender_id=sender_id,
     message=message,
+    location=location
   )
   session.add(new_msg)
   session.commit()
@@ -164,11 +166,11 @@ def CreateMessage(sender_id, receiver_id, message):
 def ShowMessageByToken(token):
   session = fs_db.session
   statement = text("""
-    select rcd.email as rcd_email, u.email as sender_email, rcd.message as message
+    select rcd.email as rcd_email, u.email as sender_email, rcd.message as message, rcd.location as location
     from user as u
     join 
     (
-      select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message
+      select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message, m.location as location
       from user as u, message as m
       where u.id = m.receiver_id
       and u.token = :token
@@ -188,11 +190,11 @@ def row2dict(rows):
 def ShowMessageByEmail(email):
   session = fs_db.session
   statement = text("""
-    select rcd.email as rcd_email, u.email as sender_email, rcd.message as message
+    select rcd.email as rcd_email, u.email as sender_email, rcd.message as message, rcd.location as location
     from user as u
     join 
     (
-      select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message
+      select u.id as uid, u.email as email, m.sender_id as sender_id, m.message as message, m.location as location
       from user as u, message as m
       where u.id = m.receiver_id
       and u.email = :email
diff --git a/app/schema.sql b/app/schema.sql
index edce3658d05793ed466ccc192059c9496d102b11..b467e09d1338a6dfacc506f213e00e4d40e2981c 100644
--- a/app/schema.sql
+++ b/app/schema.sql
@@ -14,5 +14,6 @@ create table Message (
   id integer PRIMARY KEY AUTOINCREMENT,
   user_id integer references User(id),
   sender integer NOT NULL,
-  message text
+  message text,
+  location text
 );
\ No newline at end of file
diff --git a/app/server.py b/app/server.py
index 36f6913b329695a7a2dccb9d99d5454571bd792d..05d869974b937329638b5c6860c2cc35aa7fbda1 100644
--- a/app/server.py
+++ b/app/server.py
@@ -11,6 +11,7 @@ from geventwebsocket.handler import WebSocketHandler
 
 app = flask.Flask(__name__, template_folder='.', static_folder='static')
 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
+app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 fs_db = SQLAlchemy(app)
 
 logged = {}
@@ -173,8 +174,8 @@ def showUserInfoByEmail():
   if db.CheckTokenExists(token):
     user = db.ShowUserInfoByEmail(data['email'])
     if user is not None:
+      status = 200
       response['success'] = True
-      response['status'] = '200'
       response['email'] = user['email']
       response['firstname'] = user['first_name']
       response['familyname'] = user['last_name']
@@ -182,13 +183,15 @@ def showUserInfoByEmail():
       response['city'] = user['city']
       response['gender'] = user['gender']
     else:
+      status = 400
       response['success'] = False
       response['message'] = "Email incorrect."
   else:
+    status = 400
     response['success'] = False
     response['message'] = "Token invalid."
 
-  return jsonify(response)
+  return jsonify(response), status
 
 @app.route('/showMessageByToken', methods=['POST'])
 def showMessageByToken():
@@ -246,14 +249,16 @@ def createMessage():
   receiver_id = db.ShowUserIdByEmail(data['email'])
 
   if sender_id is None or receiver_id is None:
+    status = 400
     response['success'] = False
     response['message'] = "Fail to create message."
   else:
-    db.CreateMessage(sender_id, receiver_id, data['message'])
+    status = 200
+    db.CreateMessage(sender_id, receiver_id, data['message'], data['location'])
     response['success'] = True
     response['message'] = "Success create message."
 
-  return jsonify(response)
+  return jsonify(response), status
 
 @app.route('/check')
 def check():
diff --git a/app/static/api.js b/app/static/api.js
index 9749cbd28a14578628d94a6700c6a2e4303ca661..c949287ea67f794af02d2896a7d22e4fdf384507 100644
--- a/app/static/api.js
+++ b/app/static/api.js
@@ -227,7 +227,7 @@ const showMessageByToken = function(tab){
       response.json().then((data) => {
         var msgs = data.data;
         for (var i = 0; msg = msgs[i++]; ) {
-          wall.innerHTML += `<p>${msg.sender_email}: ${msg.message}</p>`;
+          wall.innerHTML += `<p draggable="true" ondragstart="drag(event)" id="drag${i}">${msg.sender_email} @ ${msg.location}: ${msg.message}</p>`;
         }
       })
     }
@@ -258,7 +258,7 @@ const showMessageByEmail = function(email){
       response.json().then((data) => {
         var msgs = data.data;
         for (var i = 0; msg = msgs[i++]; ) {
-          wall.innerHTML += `<p>${msg.sender_email}: ${msg.message}</p>`;
+          wall.innerHTML += `<p>${msg.sender_email} @ ${msg.location}: ${msg.message}</p>`;
         }
       })
     }
@@ -268,7 +268,7 @@ const showMessageByEmail = function(email){
   });
 }
 
-const createMessage = function(email, message, form, tab){
+const createMessage = function(email, message, form, tab, loc){
   const token = sessionStorage.getItem('token');
   fetch(`${API_URL}/createMessage`, {
     method: "POST",
@@ -279,6 +279,7 @@ const createMessage = function(email, message, form, tab){
     body: JSON.stringify({ 
       email: email,
       message: message,
+      location: loc,
     }),
   })
   .then(function(response) {
@@ -290,7 +291,7 @@ const createMessage = function(email, message, form, tab){
     } else {
       response.json().then((data) => {
         form.message.value = "";
-        showMessageByEmail(email);
+        loadWall(tab);
       })
     }
   })
diff --git a/app/static/client.js b/app/static/client.js
index 6749cdd4c36bb9cc4639823fca9ec1222165cbce..15f2271abda9b27a6ea822c66b36339d8aaffe80 100644
--- a/app/static/client.js
+++ b/app/static/client.js
@@ -1,10 +1,28 @@
+var lat, longt, loc;
+
 window.onload = function(){
-    loadView();
+    getLocation();
 }
 
 var loadView = function(){
     var token = sessionStorage.getItem("token");
     var div = document.getElementById("container");
+    fetch(`https://geocode.xyz/${lat},${longt}?geoit=json`, {
+        method: "GET"
+    })
+    .then(function(response) {
+        if (response.status !== 200) {
+            console.log(`Looks like there was a problem. Status code: ${response.status}`);
+            return;
+        } else {
+            response.json().then((data) => {
+                window.loc = data.city;
+            })
+        }
+    })
+    .catch(function(error) {
+        console.log("Fetch error: " + error);
+    });
     if(token == null){
         var view = document.getElementById("welcome").innerHTML;
         div.innerHTML = view;
@@ -117,7 +135,13 @@ var initHome = function(div){
 }
 
 var loadWall = function(tab){
-  showMessageByToken(tab);
+  if(tab == 'home'){
+    showMessageByToken(tab);
+  }
+  else{
+    var email = document.getElementById(tab).getElementsByClassName("email")[0].innerHTML.slice(7);
+    showMessageByEmail(email)
+  }
 }
 
 const lookupFriend = function(e) {
@@ -131,6 +155,34 @@ var postMsg = function(form, tab){
     if(form.message.value.length == 0)
       return;
     var email = document.getElementById(tab).getElementsByClassName("email")[0].innerHTML.slice(7);
-    createMessage(email, form.message.value, form, tab);
-    loadWall(tab);
-}
\ No newline at end of file
+    createMessage(email, form.message.value, form, tab, window.loc);
+}
+
+function allowDrop(ev) {
+    ev.preventDefault();
+  }
+  
+  function drag(ev) {
+    ev.dataTransfer.setData("text", ev.target.id);
+  }
+  
+  function drop(ev) {
+    ev.preventDefault();
+    var data = ev.dataTransfer.getData("text");
+    var content = document.getElementById(data).innerHTML.split(":");
+    ev.target.innerHTML = content[1].slice(1);
+  }
+
+  function getLocation() {
+    if (navigator.geolocation) {
+      navigator.geolocation.getCurrentPosition(showPosition);
+    } else { 
+      x.innerHTML = "Geolocation is not supported by this browser.";
+    }
+  }
+  
+  function showPosition(position) {
+    window.lat = position.coords.latitude;
+    window.longt = position.coords.longitude;
+    loadView();
+  }
\ No newline at end of file
diff --git a/database.db b/database.db
index 53576b1434cbcfabf0b2c28ccea94780e6261cb7..615feaa0b7538c7d72bea4797d021d1640459f8e 100644
Binary files a/database.db and b/database.db differ