diff --git a/osm_mon/dashboarder/backends/grafana.py b/osm_mon/dashboarder/backends/grafana.py
index eeb5e75..a1cbcba 100644
--- a/osm_mon/dashboarder/backends/grafana.py
+++ b/osm_mon/dashboarder/backends/grafana.py
@@ -207,6 +207,7 @@
         requests.request("POST", self.url + "/api/folders/{}/permissions".format(folder_name),
                          json=permission_data, headers=self.headers)
 
+    # delete user from grafana
     def delete_grafana_users(self, user_name):
         # Get user id
         response_id = requests.request("GET", self.url + "/api/users/lookup?loginOrEmail={}".format(user_name),
@@ -220,6 +221,7 @@
         log.info("User %s deleted in Grafana", user_name)
         return response
 
+    # delete team from grafana
     def delete_grafana_team(self, project_name):
         # Delete Grafana folder
         requests.request("DELETE", self.url + "/api/folders/{}".format(project_name),
@@ -232,6 +234,7 @@
         log.info("Team %s deleted in Grafana", project_name)
         return response
 
+    # update grafana team
     def update_grafana_teams(self, project_new_name, project_old_name):
         team_obj = requests.request("GET", self.url + "/api/teams/search?name={}".format(project_old_name),
                                     headers=self.headers)
@@ -240,3 +243,18 @@
         response = requests.request("PUT", self.url + "/api/teams/{}".format(team_id), json=data, headers=self.headers)
         log.info("Grafana team updated %s", response.text)
         return response
+
+    # remove member from grafana team
+    def remove_grafana_team_member(self, user_name, project_data):
+        # Get user id
+        response_id = requests.request("GET", self.url + "/api/users/lookup?loginOrEmail={}".format(user_name),
+                                       headers=self.headers)
+        user_id = json.loads(response_id.text)["id"]
+        for project in project_data:
+            # Get team id
+            team_obj = requests.request("GET", self.url + "/api/teams/search?name={}".format(project['project']),
+                                        headers=self.headers)
+            team_id = json.loads(team_obj.text)["teams"][0]["id"]
+            response = requests.request("DELETE", self.url + "/api/teams/{}/members/{}".format(team_id, user_id),
+                                        headers=self.headers)
+        return response
diff --git a/osm_mon/dashboarder/dashboarder.py b/osm_mon/dashboarder/dashboarder.py
index a6ff5bc..35364d6 100644
--- a/osm_mon/dashboarder/dashboarder.py
+++ b/osm_mon/dashboarder/dashboarder.py
@@ -55,8 +55,28 @@
         try:
             if topic == "users" and key == "created":
                 log.debug("Received message from kafka for creating user")
-                user = values['username']
+                if values.get('username'):
+                    user = values['username']
+                else:
+                    user = values['changes']['username']
                 self.service.create_grafana_user(user)
+                # user-created and mapping is done with osm cli
+                if values.get('changes'):
+                    # user-project-role mapping is included in change
+                    if values['changes'].get('project_role_mappings'):
+                        user_id = values["_id"]
+                        project_data = values["changes"]["project_role_mappings"]
+                        project_list = values["changes"].get("projects")
+                        self.service.create_grafana_team_member(project_data, user_id, project_list)
+                elif values.get('project_role_mappings'):
+                    # for fresh project-role-mapping
+                    user_id = values.get("_id")
+                    project_data = values["project_role_mappings"]
+                    if user_id:
+                        self.service.create_grafana_team_member(project_data, user_id)
+                    else:
+                        # for keystone we will get username
+                        self.service.create_grafana_team_member(project_data, user=values['username'])
             elif topic == "users" and key == "deleted":
                 log.debug("Received message from kafka for deleting user")
                 user = values['username']
@@ -64,8 +84,18 @@
             elif topic == "users" and key == "edited":
                 log.debug("Received message from kafka for associating user to team")
                 user_id = values["_id"]
-                project_data = values["changes"]["project_role_mappings"]
-                self.service.create_grafana_team_member(project_data, user_id)
+                if values["changes"].get("remove_project_role_mappings") and not \
+                        values["changes"].get("add_project_role_mappings"):
+                    # Removing user-project role mapping
+                    self.service.remove_grafana_team_members(user_id,
+                                                             values["changes"].get("remove_project_role_mappings"))
+                else:
+                    # Changing user project role mapping
+                    if values["changes"].get("project_role_mappings"):
+                        project_data = values["changes"]["project_role_mappings"]
+                    else:
+                        project_data = values["changes"]["add_project_role_mappings"]
+                    self.service.create_grafana_team_member(project_data, user_id)
             elif topic == "project" and key == "created":
                 log.debug("Received message from kafka for creating team")
                 team_name = values["name"]
diff --git a/osm_mon/dashboarder/service.py b/osm_mon/dashboarder/service.py
index 79cccb4..d791fa9 100644
--- a/osm_mon/dashboarder/service.py
+++ b/osm_mon/dashboarder/service.py
@@ -135,27 +135,72 @@
     def create_grafana_user(self, user):
         self.grafana.create_grafana_users(user)
 
-    def create_grafana_team_member(self, project_data, userid):
-        try:
-            # Get user details from  commondb
-            user = self.common_db.get_user_by_id(userid)
-            user_name = user["username"]
-        except Exception as e:
-            # User not found in commondb
+    def create_grafana_team_member(self, project_data, userid=None, project_list=None, user=None):
+        if user:
+            user_name = user
+        else:
+            try:
+                # Get user details from  commondb
+                user = self.common_db.get_user_by_id(userid)
+                user_name = user["username"]
+            except Exception as e:
+                # User not found in commondb
+                if self.keystone:
+                    # Search user in keystone
+                    user = self.keystone.getUserById(userid)
+                    user_name = user.name
+                else:
+                    log.info('User %s not found', userid)
+                    log.debug('Exception %s' % e)
+        if project_list:
+            # user-project mapping is done by osm cli
+            for proj in project_data:
+                project = self.common_db.get_project(proj["project"])
+                proj_name = project['name']
+                role_obj = self.common_db.get_role_by_id(proj["role"])
+                is_admin = role_obj["permissions"].get("admin")
+                self.grafana.create_grafana_teams_members(proj_name, user_name, is_admin, project_list)
+        else:
+            # user-project mapping is done by osm ui
+            proj_list = []
             if self.keystone:
-                # Serach user in keystone
-                user = self.keystone.getUserById(userid)
-                user_name = user.name
+                users_proj_list = self.keystone.getProjectsById(userid)
+                for project in users_proj_list:
+                    proj_list.append(project.name)
             else:
-                log.info('User %s not found', userid)
-                log.debug('Exception %s' % e)
-        proj_list = []
-        for project in project_data:
-            proj_list.append(project["project"])
-        for proj in project_data:
-            role_obj = self.common_db.get_role_by_name(proj["role"])
-            is_admin = role_obj["permissions"].get("admin")
-            self.grafana.create_grafana_teams_members(proj["project"], user_name, is_admin, proj_list)
+                users_proj_list = user.get("project_role_mappings")
+                for project in users_proj_list:
+                    proj_data = self.common_db.get_project(project["project"])
+                    proj_list.append(proj_data['name'])
+            for proj in project_data:
+                if self.keystone:
+                    # Backend authentication type is keystone
+                    try:
+                        # Getting project and role objects from keystone using ids
+                        role_obj = self.keystone.getRoleById(proj["role"])
+                        proj_data = self.keystone.getProjectsByProjectId(proj["project"])
+                        log.info('role object {} {}'.format(role_obj.permissions, proj_data.name))
+                        is_admin = role_obj.permissions['admin']
+                    except Exception:
+                        # Getting project and role objects from keystone using names
+                        role_obj = self.keystone.getRoleByName(proj["role"])[0]
+                        proj_data = self.keystone.getProjectsByProjectName(proj["project"])[0]
+                        is_admin = role_obj.to_dict().get("permissions").get('admin')
+                        log.info('role object {} {}'.format(role_obj.to_dict(), proj_data.name))
+                    proj_name = proj_data.name
+                else:
+                    # Backend authentication type is internal
+                    try:
+                        # Getting project and role object from commondb using names
+                        role_obj = self.common_db.get_role_by_name(proj["role"])
+                        proj_name = proj["project"]
+                    except Exception:
+                        # Getting project and role object from commondb using ids
+                        role_obj = self.common_db.get_role_by_id(proj["role"])
+                        proj_data = self.common_db.get_project(proj["project"])
+                        proj_name = proj_data['name']
+                    is_admin = role_obj["permissions"].get("admin")
+                self.grafana.create_grafana_teams_members(proj_name, user_name, is_admin, proj_list)
 
     def create_grafana_team(self, team_name):
         self.grafana.create_grafana_teams(team_name)
@@ -168,3 +213,19 @@
 
     def update_grafana_team(self, project_new_name, project_old_name):
         self.grafana.update_grafana_teams(project_new_name, project_old_name)
+
+    def remove_grafana_team_members(self, user_id, proj_data):
+        try:
+            # Get user details from  commondb
+            user = self.common_db.get_user_by_id(user_id)
+            user_name = user["username"]
+        except Exception as e:
+            # User not found in commondb
+            if self.keystone:
+                # Find user in keystone
+                user = self.keystone.getUserById(user_id)
+                user_name = user.name
+            else:
+                log.info('User %s not found', user_id)
+                log.debug('Exception %s' % e)
+        self.grafana.remove_grafana_team_member(user_name, proj_data)
