diff --git a/src/index.ts b/src/index.ts
index d4d4e03a90526f68b863acfb68616cf0268762d4..39b7a6ce455ec083a2e0f35ceb0c1d609ee5b056 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,6 +5,7 @@ import bodyParser from "body-parser";
 import expressSession from "express-session";
 import authRoute from "./routes/auth";
 import newsRoute from "./routes/news";
+import usersRoute from "./routes/user";
 
 mongoose
   .connect("mongodb://localhost:27017/bodysch", {
@@ -46,6 +47,10 @@ authRoute(app);
 // Register routes
 newsRoute(app);
 
+usersRoute(app);
+
+
+
 app.use((err: any, req: Request, res: Response, next: NextFunction) => {
   res.status(500).send("Houston, we have a problem!");
 
diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts
index 2f51c83720611deeaed408fdcf3c4abd7f1a7d74..988565680015af76bfebe882c9012ea1c9a9b6d3 100644
--- a/src/middlewares/auth/complete.ts
+++ b/src/middlewares/auth/complete.ts
@@ -15,7 +15,7 @@ const complete = () => async (req: Request, res: Response) => {
         await axios.get(`https://auth.sch.bme.hu/api/profile/?access_token=${token.access_token}`)
             .then( (response) =>  {
                 req.session!.user = {
-                    id: String(response.data.basic),
+                    id: String(response.data.internal_id),
                     email: String(response.data.mail),
                     name: `${response.data.sn} ${response.data.givenName}` ,
                     token,
diff --git a/src/middlewares/user/addUser.ts b/src/middlewares/user/addUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..af47ce6e30550e456d1b0db66100258cdc929114
--- /dev/null
+++ b/src/middlewares/user/addUser.ts
@@ -0,0 +1,29 @@
+import { Request, Response, NextFunction } from 'express';
+import Profile, { Role } from "../../models/ProfileSchema";
+
+const addUser = () => (req: Request, res: Response, next: NextFunction) => {
+  const profile = new Profile();
+  
+  const fields = ['studentCardNumber', 'roomNumber', 'picture'];
+  fields.forEach(field => {
+    const value = req.body[field]
+    if(value)
+      profile.set(field, value);
+  });
+  
+  profile.external_id = req.session!.user!.id;
+  profile.role = Role.User;
+  
+  profile.save(err => {
+    if (err) {
+      res.status(400);
+    }
+    else {
+      res.status(201);
+      res.data = {profile};
+    }
+    next()
+  });
+}
+
+export default addUser;
\ No newline at end of file
diff --git a/src/middlewares/user/addWarning.ts b/src/middlewares/user/addWarning.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e7eae54ef0692fb641e551038535e48883ac95e7
--- /dev/null
+++ b/src/middlewares/user/addWarning.ts
@@ -0,0 +1,7 @@
+import {Request, Response, NextFunction} from 'express';
+
+const addWarning = () => (req: Request, res: Response, next: NextFunction) =>{
+    res.send("Add warning");
+}
+
+export default addWarning;
\ No newline at end of file
diff --git a/src/middlewares/user/deleteUser.ts b/src/middlewares/user/deleteUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fe4eb181a4e0424b637227bf5cb8d5f67cfcd187
--- /dev/null
+++ b/src/middlewares/user/deleteUser.ts
@@ -0,0 +1,15 @@
+import { Request, Response, NextFunction } from 'express';
+import Profile from '../../models/ProfileSchema';
+
+const deletUser = () => (req: Request, res: Response, next: NextFunction) => {
+  Profile.findByIdAndDelete(req.params.id, (error) => {
+    if (error) {
+      res.status(400);
+    } else {
+      res.status(204);
+    }
+    next();
+  });
+}
+
+export default deletUser;
\ No newline at end of file
diff --git a/src/middlewares/user/deleteWarning.ts b/src/middlewares/user/deleteWarning.ts
new file mode 100644
index 0000000000000000000000000000000000000000..90ca8a2d9344ee0907f7de52b071f2e9f3341a73
--- /dev/null
+++ b/src/middlewares/user/deleteWarning.ts
@@ -0,0 +1,7 @@
+import {Request, Response, NextFunction} from 'express';
+
+const deleteWarning = () => (req: Request, res: Response, next: NextFunction) =>{
+    res.send("Delete warning");
+}
+
+export default deleteWarning;
\ No newline at end of file
diff --git a/src/middlewares/user/getUser.ts b/src/middlewares/user/getUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0f165ef4f5276bf5ba84b0f1cfb1cef2f4f63d34
--- /dev/null
+++ b/src/middlewares/user/getUser.ts
@@ -0,0 +1,17 @@
+import { Request, Response, NextFunction } from 'express';
+import Profile from '../../models/ProfileSchema';
+
+const getUser = () => (req: Request, res: Response, next: NextFunction) => {
+  Profile.findById(req.params.id, (error, profile) => {
+    if (error) {
+      console.warn(error);
+      res.status(400);
+    } else {
+      res.status(200);
+      res.data = { profile };
+    }
+    next();
+  });
+}
+
+export default getUser;
\ No newline at end of file
diff --git a/src/middlewares/user/getUsersList.ts b/src/middlewares/user/getUsersList.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5cd7a515512c99f6ba85587244de281666250d39
--- /dev/null
+++ b/src/middlewares/user/getUsersList.ts
@@ -0,0 +1,17 @@
+import {Request, Response, NextFunction} from 'express';
+import Profile from '../../models/ProfileSchema';
+
+const getUsersList = () => (req: Request, res: Response, next: NextFunction) =>{
+    Profile.find({}, (err, profiles) =>{
+        if(err) {
+            res.status(400);
+        }
+        else{
+            res.status(200);
+            res.data = {profiles}
+        }
+        next();       
+    })
+}
+
+export default getUsersList;
\ No newline at end of file
diff --git a/src/middlewares/user/getWarning.ts b/src/middlewares/user/getWarning.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d97d5d2523185bd35c6f3210608d79dfcd2faea5
--- /dev/null
+++ b/src/middlewares/user/getWarning.ts
@@ -0,0 +1,7 @@
+import {Request, Response, NextFunction} from 'express';
+
+const getWarning = () => (req: Request, res: Response, next: NextFunction) =>{
+    res.send("Get warning");
+}
+
+export default getWarning;
\ No newline at end of file
diff --git a/src/middlewares/user/getWarningsList.ts b/src/middlewares/user/getWarningsList.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c4cff031cc1d7cb1f3e435812a766f96cb296a4c
--- /dev/null
+++ b/src/middlewares/user/getWarningsList.ts
@@ -0,0 +1,7 @@
+import {Request, Response, NextFunction} from 'express';
+
+const getWarningsList = () => (req: Request, res: Response, next: NextFunction) =>{
+    res.send("Get warnings");
+}
+
+export default getWarningsList;
\ No newline at end of file
diff --git a/src/middlewares/user/responseUser.ts b/src/middlewares/user/responseUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..07d6958cbdeade91bea4ae0d8a24ba6b9f6dafb1
--- /dev/null
+++ b/src/middlewares/user/responseUser.ts
@@ -0,0 +1,7 @@
+import { Request, Response, NextFunction, response } from 'express';
+
+const responseUser = () => (req: Request, res: Response) => {
+    res.json(res.data.profile);
+}
+
+export default responseUser;
\ No newline at end of file
diff --git a/src/middlewares/user/responseUserList.ts b/src/middlewares/user/responseUserList.ts
new file mode 100644
index 0000000000000000000000000000000000000000..364b3c490615cf41d242baa211dd95cac0bde51a
--- /dev/null
+++ b/src/middlewares/user/responseUserList.ts
@@ -0,0 +1,7 @@
+import { Request, Response, NextFunction, response } from 'express';
+
+const responseUserList = () => (req: Request, res: Response) => {
+    res.json(res.data.profiles);
+}
+
+export default responseUserList;
\ No newline at end of file
diff --git a/src/middlewares/user/updateUser.ts b/src/middlewares/user/updateUser.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2097af527aff8f1f91a540563ebb766caccc9abe
--- /dev/null
+++ b/src/middlewares/user/updateUser.ts
@@ -0,0 +1,29 @@
+import {Request, Response, NextFunction} from 'express';
+import Profile from '../../models/ProfileSchema';
+
+const updateUser = () => (req: Request, res: Response, next: NextFunction) => {
+    const validFields = ['studentCardNumber', 'roomNumber', 'picture'];
+    Profile.findOne(
+      {_id : req.params.id},
+      (error, profile) => {
+        res.status(200);
+        if (error) {
+          res.status(400);
+        } 
+        else {
+          if(profile){
+            validFields.forEach(field => {
+              const value = req.body[field]
+              if(value)
+                profile.set(field, value);
+            });
+            profile.save();
+            res.data = {profile};
+          }
+        }
+        next();
+      }     
+    );
+}
+
+export default updateUser;
\ No newline at end of file
diff --git a/src/middlewares/user/updateWarning.ts b/src/middlewares/user/updateWarning.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6ff3f0bed90016310472a41c0505e4a729278cc4
--- /dev/null
+++ b/src/middlewares/user/updateWarning.ts
@@ -0,0 +1,7 @@
+import {Request, Response, NextFunction} from 'express';
+
+const updateWarning = () => (req: Request, res: Response, next: NextFunction) =>{
+    res.send("Update warning");
+}
+
+export default updateWarning;
\ No newline at end of file
diff --git a/src/middlewares/utils/emptyResponse.ts b/src/middlewares/utils/emptyResponse.ts
new file mode 100644
index 0000000000000000000000000000000000000000..60be09bb11e956e78c3db4ca2f3b886574b25535
--- /dev/null
+++ b/src/middlewares/utils/emptyResponse.ts
@@ -0,0 +1,5 @@
+import { Request, Response } from 'express';
+
+
+
+const emptyResponse = () => (req: Request, res: Response) => res.json({});
\ No newline at end of file
diff --git a/src/models/ProfileSchema.ts b/src/models/ProfileSchema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9e1aef52b979bcae7d57a32e30a625d0c1fb1ac0
--- /dev/null
+++ b/src/models/ProfileSchema.ts
@@ -0,0 +1,31 @@
+import { Document, Schema, model } from 'mongoose';
+import { IWarnings, WarningSchema } from './WarningSchema';
+import { Admin } from 'mongodb';
+
+export enum Role {
+    Admin,
+    Staff,
+    User,
+}
+
+export interface IProfile extends Document {
+    external_id: string,
+    studentCardNumber: string,
+    roomNumber?: string,
+    picture: string,
+    role: Role.Admin | Role.Staff | Role.User,
+    email?: string,
+    name?: string,
+    warnings: [IWarnings] | [],
+};
+
+const ProfileSchema = new Schema({
+    external_id: {type: String, required: true, unique : true, dropDups: true },
+    studentCardNumber: {type: String, required: true },
+    roomNumber: {type: String},
+    picture: {type: String},
+    role: {type: String, required: true},
+    warnings: [WarningSchema]
+});
+
+export default model<IProfile>('Profile', ProfileSchema);
\ No newline at end of file
diff --git a/src/models/WarningSchema.ts b/src/models/WarningSchema.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8eec29a2ef19a109417338ebd7147f5a376094de
--- /dev/null
+++ b/src/models/WarningSchema.ts
@@ -0,0 +1,19 @@
+import { Schema } from 'mongoose';
+
+export interface IWarnings extends Document{
+    text: string,
+    date: Date,
+    given_by: {
+        _id: string,
+        name: string,
+    } 
+}
+
+export const WarningSchema = new Schema({
+    text: {type: String, required: true},
+    date: {type: Date, required: true},
+    given_by: {required: true, type: {
+        _id: {type: String, required: true},
+        name: {String, required: true},
+    }}
+});
diff --git a/src/routes/user.ts b/src/routes/user.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cb39dd4dc86d6b16ec0c0cd11250047bb530511e
--- /dev/null
+++ b/src/routes/user.ts
@@ -0,0 +1,41 @@
+import { Application } from 'express';
+import addWarning from "../middlewares/user/addWarning";
+import deleteUser from "../middlewares/user/deleteUser";
+import deleteWarning from "../middlewares/user/deleteWarning";
+import getUser from "../middlewares/user/getUser";
+import getUsersList from "../middlewares/user/getUsersList";
+import getWarning from "../middlewares/user/getWarning";
+import getWarningsList from "../middlewares/user/getWarningsList";
+import updateUser from "../middlewares/user/updateUser";
+import updateWarning from "../middlewares/user/updateWarning";
+import addUser from '../middlewares/user/addUser';
+import authenticated from '../middlewares/auth/authenticated';
+import emptyResponse from 'src/middlewares/utils/emptyResponse';
+import responseUser from 'src/middlewares/user/responseUser';
+import responseUserList from 'src/middlewares/user/responseUserList';
+
+
+
+ const usersRoute = (app: Application): void => {
+    app.get('/users', authenticated(), getUsersList(), responseUserList());
+
+    app.post('/users', authenticated(), addUser(), responseUser());
+
+    app.get('/users/:id', getUser(), responseUser() );
+
+    app.get('/users/:id/warnings', getWarningsList() );
+    
+    app.get('/users/:userId/warnings/:warningId', getWarning() );
+
+    app.post('/users/:id/warnings', addWarning());
+
+    app.put('/users/:id', updateUser(), responseUser() );
+
+    app.put('/users/:userId/warnings/:warningId', updateWarning());
+    
+    app.delete('/users/:id', deleteUser(), emptyResponse());
+
+    app.delete('/users/:userId/warnings/:warningId', deleteWarning());    
+}
+
+export default usersRoute;
\ No newline at end of file
diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts
index fb2d7ee4b3aaea8c4fd741748c86631e764b969f..6d004f4f33ad3c529a7d21f4f28281439024e601 100644
--- a/src/utils/declarations/response.d.ts
+++ b/src/utils/declarations/response.d.ts
@@ -1,4 +1,5 @@
 import { INews } from "../../models/NewsSchema";
+import { IProfile } from "src/models/ProfileSchema";
 
 declare global {
   namespace Express {
@@ -6,6 +7,8 @@ declare global {
       data: {
         news?: INews[] | null;
         newsObject?: INews | null;
+        profile?: IProfile | null;
+        profiles?: IProfile[] | null;
       };
     }
   }