diff --git a/backend/bootstrap.sh b/backend/bootstrap.sh
index 73e43f7146e2b9b0d82013139bac82e4e4a5ce18..f81daafcd73bcc954e6ada53cc83472cc7c2e2e5 100755
--- a/backend/bootstrap.sh
+++ b/backend/bootstrap.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
+source $(pipenv --venv)/bin/activate
 export PYTHONPATH=.
 export FLASK_APP=./app.py
 export SECRET="aSHOwmmH75H5s2Nnfdl23J09Shg"
-source $(pipenv --venv)/bin/activate
 python3 app.py
\ No newline at end of file
diff --git a/backend/db.sqlite b/backend/db.sqlite
index 0c812abca8441045f224e5dcbfc5525078f7b9a1..c260d6e6c5036f1638e03c679cde794f3c48127c 100644
Binary files a/backend/db.sqlite and b/backend/db.sqlite differ
diff --git a/backend/socketio_helper.py b/backend/socketio_helper.py
index 8073b7ee2df1e52a70d1c7dd00c0dd1f08284312..da16e90b2cbb53ae69c8cfdf96e5ae2fc03d1859 100644
--- a/backend/socketio_helper.py
+++ b/backend/socketio_helper.py
@@ -6,6 +6,54 @@ from flask_socketio import SocketIO, send, emit, join_room, leave_room
 
 socketio = SocketIO(app)
 
+## Join user room
+@socketio.on('joinUserRoom')
+def on_join_user_room(data):
+    data = json.loads(data)
+    user_id = data['userId']
+    room = 'user' + str(user_id)
+    join_room(room)
+    emit('joinUserRoom', {
+        'on': 'joinUserRoom',
+        'userId': user_id
+        }, room=room)
+
+@socketio.on('leaveUserRoom')
+def on_leave_user_room(data):
+    data = json.loads(data)
+    user_id = data['userId']
+    room = 'user' + str(user_id)
+    join_room(room)
+    emit('leaveUserRoom', {
+        'on': 'leaveUserRoom',
+        'userId': user_id
+        }, room=room)
+
+## Join project room
+@socketio.on('joinProjectRoom')
+def on_join_project_room(data):
+    data = json.loads(data)
+    username = data['username']
+    project_id = data['projectId']
+    room = 'project' + str(project_id)
+    join_room(room)
+    emit('joinProjectRoom', {
+        'on': 'joinProjectRoom',
+        'username': username
+        }, room=room)
+
+@socketio.on('leaveProjectRoom')
+def on_leave_project_room(data):
+    data = json.loads(data)
+    username = data['username']
+    project_id = data['projectId']
+    room = 'project' + str(project_id)
+    leave_room(room)
+    emit('leaveProjectRoom', {
+        'on': 'leaveProjectRoom',
+        'username': username
+        }, room=room)
+
 ## Project handling ##
 @socketio.on('projectCreated')
 def handle_project_created(data):
@@ -13,7 +61,7 @@ def handle_project_created(data):
     emit('projectCreated', {
         'on': 'projectCreated',
         'project': project
-        }, broadcast=True)
+        }, room = 'project' + str(project['id']))
 
 @socketio.on('projectChanged')
 def handle_project_changed(data):
@@ -21,7 +69,7 @@ def handle_project_changed(data):
     emit('projectChanged', {
         'on': 'projectChanged',
         'project': project
-        }, broadcast=True)
+        }, room = 'project' + str(project['id']))
 
 @socketio.on('projectDeleted')
 def handle_project_deleted(data):
@@ -29,7 +77,15 @@ def handle_project_deleted(data):
     emit('projectDeleted', {
         'on': 'projectDeleted',
         'projectId': projectId
-        }, broadcast=True)
+        }, room = 'project' + str(projectId))
+
+@socketio.on('collaboratorAdded')
+def handle_collaborator_added(data):
+    collaborator = json.loads(data)
+    emit('collaboratorAdded', {
+        'on': 'collaboratorAdded',
+        'collaborator': collaborator
+        }, room = 'user' + str(collaborator['userId']))
 
 @socketio.on('collaboratorChanged')
 def handle_collaborator_changed(data):
@@ -37,7 +93,7 @@ def handle_collaborator_changed(data):
     emit('collaboratorChanged', {
         'on': 'collaboratorChanged',
         'collaborator': collaborator
-        }, broadcast=True)
+        }, room = 'project' + str(collaborator['projectId']))
 
 ## File handling ##
 @socketio.on('fileCreated')
@@ -46,7 +102,7 @@ def handle_file_created(data):
     emit('fileCreated', {
         'on': 'fileCreated',
         'file': file
-        }, room=file['projectId'])
+        }, room = 'project' + str(file['projectId']))
 
 @socketio.on('fileChanged')
 def handle_file_changed(data):
@@ -54,7 +110,7 @@ def handle_file_changed(data):
     emit('fileChanged', {
         'on': 'fileChanged',
         'file': file
-        }, room=file['projectId'])
+        }, room = 'project' + str(file['projectId']))
 
 @socketio.on('fileDeleted')
 def handle_file_deleted(data):
@@ -62,7 +118,7 @@ def handle_file_deleted(data):
     emit('fileDeleted', {
         'on': 'fileDeleted',
         'file': file
-        }, room=file['projectId'])
+        }, room = 'project' + str(file['projectId']))
 
 ## Chat ##
 @socketio.on('message')
@@ -86,26 +142,4 @@ def handle_message(data):
         'author': db.user_schema.dumps(author),
         'time': new_message.time,
         'message': message
-        }, room=projectId)
-
-@socketio.on('join')
-def on_join(data):
-    data = json.loads(data)
-    username = data['username']
-    room = data['projectId']
-    join_room(room)
-    emit('join', {
-        'on': 'join',
-        'username': username
-        }, room=room)
-
-@socketio.on('leave')
-def on_leave(data):
-    data = json.loads(data)
-    username = data['username']
-    room = data['projectId']
-    leave_room(room)
-    emit('leave', {
-        'on': 'leave',
-        'username': username
-        }, room=room)
\ No newline at end of file
+        }, room = 'project' + str(projectId))
\ No newline at end of file