diff --git a/areas/users/user_service.py b/areas/users/user_service.py
index d394460df236e3bf395be73747e77970175a4d05..a0b50c39b84159a1a9befc314e792f591aaf50ba 100644
--- a/areas/users/user_service.py
+++ b/areas/users/user_service.py
@@ -68,6 +68,36 @@ class UserService:
 
         return UserService.get_user(id)
 
+    @staticmethod
+    def put_personal_info(id, data):
+        kratos_data = {
+            "schema_id": "default",
+            "traits": {"email": data["email"], "name": data["name"]},
+        }
+        KratosApi.put("/admin/identities/{}".format(id), kratos_data)
+
+        # TODO: if the user is no admin - he can't change app roles - implement
+
+        if data["app_roles"]:
+            app_roles = data["app_roles"]
+            for ar in app_roles:
+                app = App.query.filter_by(slug=ar["name"]).first()
+                app_role = AppRole.query.filter_by(user_id=id, app_id=app.id).first()
+
+                if app_role:
+                    app_role.role_id = ar["role_id"] if "role_id" in ar else None
+                    db.session.commit()
+                else:
+                    appRole = AppRole(
+                        user_id=id,
+                        role_id=ar["role_id"] if "role_id" in ar else None,
+                        app_id=app.id,
+                    )
+                    db.session.add(appRole)
+                    db.session.commit()
+
+        return UserService.get_user(id)
+
     @staticmethod
     def delete_user(id):
         app_role = AppRole.query.filter_by(user_id=id).all()
diff --git a/areas/users/users.py b/areas/users/users.py
index 4536586d4a636d11ace3c589df4a70df134dac59..03d059d5354600e807886ce40d2b39609fba5902 100644
--- a/areas/users/users.py
+++ b/areas/users/users.py
@@ -1,5 +1,5 @@
 from flask import jsonify, request
-from flask_jwt_extended import jwt_required
+from flask_jwt_extended import get_jwt, jwt_required
 from flask_cors import cross_origin
 from flask_expects_json import expects_json
 
@@ -23,6 +23,7 @@ def get_users():
 @api_v1.route("/users/<string:id>", methods=["GET"])
 @jwt_required()
 @cross_origin()
+@admin_required()
 def get_user(id):
     res = UserService.get_user(id)
     return jsonify(res)
@@ -43,6 +44,7 @@ def post_user():
 @jwt_required()
 @cross_origin()
 @expects_json(schema)
+@admin_required()
 def put_user(id):
     data = request.get_json()
     res = UserService.put_user(id, data)
@@ -59,3 +61,28 @@ def delete_user(id):
         UserService.delete_user(id)
         return jsonify(), res.status_code
     return jsonify(res.json()), res.status_code
+
+
+@api_v1.route("/me", methods=["GET"])
+@jwt_required()
+@cross_origin()
+def get_personal_info():
+    user_id = __get_user_id_from_jwt()
+    res = UserService.get_user(user_id)
+    return jsonify(res)
+
+
+@api_v1.route("/me", methods=["PUT"])
+@jwt_required()
+@cross_origin()
+@expects_json(schema)
+def update_personal_info():
+    data = request.get_json()
+    user_id = __get_user_id_from_jwt()
+    res = UserService.put_user(user_id, data)
+    return jsonify(res)
+
+
+def __get_user_id_from_jwt():
+    claims = get_jwt()
+    return claims["user_id"]
diff --git a/helpers/auth_guard.py b/helpers/auth_guard.py
index 900e35eddb7e3c3bd3fa100efc1d74f4049d5b41..36bbeeb1c3d3916ed68119fbd246496091aa9fc1 100644
--- a/helpers/auth_guard.py
+++ b/helpers/auth_guard.py
@@ -2,10 +2,10 @@ from functools import wraps
 
 from areas.roles.role_service import RoleService
 
-from flask_jwt_extended import verify_jwt_in_request
-from flask_jwt_extended import get_jwt
+from flask_jwt_extended import get_jwt, verify_jwt_in_request
 from helpers import Unauthorized
 
+
 def admin_required():
     def wrapper(fn):
         @wraps(fn)
@@ -21,4 +21,4 @@ def admin_required():
 
         return decorator
 
-    return wrapper
\ No newline at end of file
+    return wrapper