diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts
index ac2036d50462fbdd7af9f1a49b62302347b944e4..25ff354d76bd8639602ba2835e2b5f5f96f43c05 100644
--- a/src/middlewares/auth/complete.ts
+++ b/src/middlewares/auth/complete.ts
@@ -14,30 +14,20 @@ const complete = () => async (req: Request, res: Response) => {
 
   try {
     const token = await oauth2().authorizationCode.getToken(tokenConfig);
+    let isRegistered = false;
     await axios
       .get<authschResponse>(
         `https://auth.sch.bme.hu/api/profile/?access_token=${token.access_token}`
       )
-      .then((response) => {
-        Profile.findOne(
+      .then(async (response) => {
+        await Profile.findOne(
           { external_id: response.data.internal_id },
           (error, profile) => {
             if (error) {
               console.warn(error);
               return res.status(400);
             } else {
-              if (!profile) {
-                const newProfile = new Profile();
-                newProfile.external_id = response.data.internal_id;
-                newProfile.email = response.data.mail;
-                newProfile.name = `${response.data.sn} ${response.data.givenName}`;
-                newProfile.save((err) => {
-                  if (err) {
-                    console.log(err);
-                    return res.status(400);
-                  }
-                });
-              }
+              if (!!profile) isRegistered = true;
             }
           }
         );
@@ -45,6 +35,7 @@ const complete = () => async (req: Request, res: Response) => {
           id: String(response.data.internal_id),
           email: String(response.data.mail),
           name: `${response.data.sn} ${response.data.givenName}`,
+          isRegistered,
           token,
         };
       })
diff --git a/src/middlewares/user/addUser.ts b/src/middlewares/user/addUser.ts
index ede1490decdb0c849d1b950059ae622d7c5c8757..74eceb9e215da9cb3ae2d4bbe34fbb144166ab52 100644
--- a/src/middlewares/user/addUser.ts
+++ b/src/middlewares/user/addUser.ts
@@ -1,27 +1,67 @@
 import { NextFunction, Request, Response } from "express";
 import Profile, { Role } from "../../models/ProfileSchema";
 
-const addUser = () => (req: Request, res: Response, next: NextFunction) => {
-  const profile = new Profile();
+import { ValidationError } from "../utils/ValidationError";
 
-  const fields = ["studentCardNumber", "roomNumber", "picture"];
-  fields.forEach((field) => {
-    const value = req.body[field];
-    if (value) profile.set(field, value);
-  });
+const addUser = () => async (
+  req: Request,
+  res: Response,
+  next: NextFunction
+) => {
+  // Already registered
+  if (req.session?.user?.isRegistered) {
+    await Profile.findOne(
+      { external_id: req.session.user.id },
+      (error, profile) => {
+        if (error) {
+          console.warn(error);
+          return res.status(400);
+        } else {
+          res.status(200);
+          res.data = { profile };
+        }
+      }
+    );
+    return next();
+  }
+  // Register
+  try {
+    const profile = new Profile();
 
-  profile.external_id = req.session!.user!.id;
-  profile.role = Role.User;
+    const fields = [
+      { name: "studentCardNumber", required: true },
+      { name: "roomNumber", required: true },
+      { name: "picture", required: false },
+    ];
+    fields.forEach((field) => {
+      const value = req.body[field.name];
+      if (field.required && !value) {
+        res.status(400);
+        throw new ValidationError(400, `Field: {${field.name}} is required!`);
+      }
+      if (value) profile.set(field.name, value);
+    });
 
-  profile.save((err) => {
-    if (err) {
-      res.status(400);
-    } else {
-      res.status(201);
-      res.data = { profile };
+    profile.external_id = req.session!.user!.id;
+    profile.email = req.session?.user?.email;
+    profile.name = req.session?.user?.name;
+
+    profile.save((err) => {
+      if (err) {
+        res.status(400);
+      } else {
+        res.status(201);
+        res.data = { profile };
+        req.session!.user!.isRegistered = true;
+      }
+      next();
+    });
+  } catch (error) {
+    if (error instanceof ValidationError) {
+      const { code, message } = error;
+      return res.status(code).send({ message });
     }
-    next();
-  });
+  }
 };
 
 export default addUser;
diff --git a/src/middlewares/utils/ValidationError.ts b/src/middlewares/utils/ValidationError.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4da9eeaa20f57ba786a10cb8befc10df8a05e4c3
--- /dev/null
+++ b/src/middlewares/utils/ValidationError.ts
@@ -0,0 +1,9 @@
+export class ValidationError extends Error {
+  code: number;
+  constructor(code: number, message: string) {
+    super(message);
+    this.code = code;
+    this.name = "ValidationError";
+    Object.setPrototypeOf(this, new.target.prototype);
+  }
+}
diff --git a/src/models/user.interface.ts b/src/models/user.interface.ts
index d571e6900b31d73bab2ef717146431c8041d3dc3..3790163841341078e60796c7fa257048892eaa06 100644
--- a/src/models/user.interface.ts
+++ b/src/models/user.interface.ts
@@ -4,5 +4,6 @@ export interface User {
   email: string;
   name: string;
   id: string;
+  isRegistered: boolean;
   token: Token;
 }
diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts
index 6d004f4f33ad3c529a7d21f4f28281439024e601..77bdbb461ed6d7d90e6d5fb05666477b57081c8f 100644
--- a/src/utils/declarations/response.d.ts
+++ b/src/utils/declarations/response.d.ts
@@ -9,6 +9,7 @@ declare global {
         newsObject?: INews | null;
         profile?: IProfile | null;
         profiles?: IProfile[] | null;
+        error?: string | null;
       };
     }
   }