Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -6,3 +6,10 @@
 import { StudentCardComponent } from './question/student-card/student-card.component';
 
-export const COMPONENTS: any[] = [ButtonComponent, FormErrorComponent, FileUploadComponent, QuestionPreviewComponent, VoteComponent, StudentCardComponent];
+export const COMPONENTS: any[] = [
+  ButtonComponent,
+  FormErrorComponent,
+  FileUploadComponent,
+  QuestionPreviewComponent,
+  VoteComponent,
+  StudentCardComponent
+];
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/directives/directives.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/directives/directives.ts	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/directives/directives.ts	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,3 +1,15 @@
-import { HandleInputFormErrorsDirective, HoverElevationDirective, LoaderDirective, HandleSelectFormErrorsDirective, ShareLinkDirective } from '.';
+import {
+  HandleInputFormErrorsDirective,
+  HoverElevationDirective,
+  LoaderDirective,
+  HandleSelectFormErrorsDirective,
+  ShareLinkDirective
+} from '.';
 
-export const DIRECTIVES: any[] = [HandleInputFormErrorsDirective, LoaderDirective, HoverElevationDirective, HandleSelectFormErrorsDirective, ShareLinkDirective];
+export const DIRECTIVES: any[] = [
+  HandleInputFormErrorsDirective,
+  LoaderDirective,
+  HoverElevationDirective,
+  HandleSelectFormErrorsDirective,
+  ShareLinkDirective
+];
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/CategoriesController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/CategoriesController.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/CategoriesController.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -0,0 +1,34 @@
+﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Api.ApplicationServices.Questioning;
+using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Contracts.Questioning;
+using FinkiChattery.Queries.Questioning;
+using IdentityServer4.AccessTokenValidation;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.Controllers.v1
+{
+    [ApiVersion(ApiVersions.ApiVersion1)]
+    [Route("api/v{version:apiVersion}/[controller]")]
+    [ApiController]
+    public class CategoriesController : ControllerBase
+    {
+        public CategoriesController(IMediatorService mediatorService)
+        {
+            MediatorService = mediatorService;
+        }
+
+        public IMediatorService MediatorService { get; }
+
+        [HttpGet]
+        [Authorize]
+        public async Task<IActionResult> GetCategories()
+        {
+            return Ok();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -9,4 +9,5 @@
 using FinkiChattery.Persistence.Models;
 using FinkiChattery.Persistence.Repositories;
+using FinkiChattery.Persistence.UnitOfWork;
 using FinkiChattery.Queries.Questioning;
 using Hangfire;
@@ -101,10 +102,7 @@
         }
 
-        public static void AddRepos(this IServiceCollection services)
+        public static void AddUnitOfWork(this IServiceCollection services)
         {
-            services.AddScoped<ICategoriesRepo, CategoriesRepo>();
-            services.AddScoped<ITeamRepo, TeamRepo>();
-            services.AddScoped<IQuestionRepo, QuestionRepo>();
-            services.AddScoped<IStudentRepo, StudentRepo>();
+            services.AddScoped<IUnitOfWork, UnitOfWork>();
         }
 
Index: src/FinkiChattery/FinkiChattery.Api/Startup.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Startup.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Api/Startup.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -35,5 +35,5 @@
             services.AddOriginUrlSettings();
             services.AddCurrentUser();
-            services.AddRepos();
+            services.AddUnitOfWork();
             services.AddAwsClient(Configuration);
             services.AddHangfireService(Configuration);
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionCommand.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionCommand.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,7 +1,6 @@
 ﻿using FinkiChattery.Common.Mediator.Contracs;
 using FinkiChattery.Common.User;
-using FinkiChattery.Persistence.Context;
 using FinkiChattery.Persistence.Models;
-using FinkiChattery.Persistence.Repositories;
+using FinkiChattery.Persistence.UnitOfWork;
 using System;
 using System.Collections.Generic;
@@ -27,21 +26,17 @@
     public class AskQuestionHandler : ICommandHandler<AskQuestionCommand, Guid>
     {
-        public AskQuestionHandler(ApplicationDbContext dbContext, ICategoriesRepo categoriesRepo, IStudentRepo studentRepo, ICurrentUser currentUser)
+        public AskQuestionHandler(IUnitOfWork unitOfWork, ICurrentUser currentUser)
         {
-            DbContext = dbContext;
-            CategoriesRepo = categoriesRepo;
-            StudentRepo = studentRepo;
+            UnitOfWork = unitOfWork;
             CurrentUser = currentUser;
         }
 
-        public ApplicationDbContext DbContext { get; }
-        public ICategoriesRepo CategoriesRepo { get; }
-        public IStudentRepo StudentRepo { get; }
+        public IUnitOfWork UnitOfWork { get; }
         public ICurrentUser CurrentUser { get; }
 
         public async Task<Guid> Handle(AskQuestionCommand request, CancellationToken cancellationToken)
         {
-            var questionCategories = await CategoriesRepo.GetCategories(request.Categories);
-            var currentStudent = await StudentRepo.GetStudent(CurrentUser.Id);
+            var questionCategories = await UnitOfWork.Categories.GetCategories(request.Categories);
+            var currentStudent = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
 
             var questionDatabaseEntity = new Question()
@@ -60,6 +55,6 @@
             }
 
-            DbContext.Questions.Add(questionDatabaseEntity);
-            await DbContext.SaveChangesAsync();
+            UnitOfWork.Questions.Add(questionDatabaseEntity);
+            await UnitOfWork.SaveAsync();
             return questionDatabaseEntity.Uid;
         }
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionValidator.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionValidator.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/AskQuestion/AskQuestionValidator.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,4 +1,4 @@
 ﻿using FinkiChattery.Commands.Questioning.Validators;
-using FinkiChattery.Persistence.Repositories;
+using FinkiChattery.Persistence.UnitOfWork;
 using FluentValidation;
 
@@ -7,9 +7,9 @@
     public class AskQuestionValidator : AbstractValidator<AskQuestionCommand>
     {
-        public AskQuestionValidator(ICategoriesRepo categoriesRepo)
+        public AskQuestionValidator(IUnitOfWork unitOfWork)
         {
             RuleFor(x => x.Title).QuestionTitleValidate();
             RuleFor(x => x.Text).QuestionTextValidate();
-            RuleFor(x => x.Categories).Cascade(CascadeMode.Stop).ListNotNull().SetValidator(new CategoriesUidsExist(categoriesRepo));
+            RuleFor(x => x.Categories).Cascade(CascadeMode.Stop).ListNotNull().SetValidator(new CategoriesUidsExist(unitOfWork));
         }
     }
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,3 +1,4 @@
 ﻿using FinkiChattery.Persistence.Repositories;
+using FinkiChattery.Persistence.UnitOfWork;
 using FluentValidation.Validators;
 using System;
@@ -10,10 +11,10 @@
     public class CategoriesUidsExist : AsyncValidatorBase
     {
-        public CategoriesUidsExist(ICategoriesRepo categoriesRepo)
+        public CategoriesUidsExist(IUnitOfWork unitOfWork)
         {
-            CategoriesRepo = categoriesRepo;
+            UnitOfWork = unitOfWork;
         }
 
-        public ICategoriesRepo CategoriesRepo { get; }
+        public IUnitOfWork UnitOfWork { get; }
 
         protected override async Task<bool> IsValidAsync(PropertyValidatorContext context, CancellationToken cancellation)
@@ -21,5 +22,5 @@
             var categoriesUids = (IEnumerable<Guid>)context.PropertyValue;
 
-            return await CategoriesRepo.CategoriesExist(categoriesUids);
+            return await UnitOfWork.Categories.CategoriesExist(categoriesUids);
         }
 
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/TeamWithUidExist.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/TeamWithUidExist.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/TeamWithUidExist.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,3 +1,3 @@
-﻿using FinkiChattery.Persistence.Repositories;
+﻿using FinkiChattery.Persistence.UnitOfWork;
 using FluentValidation.Validators;
 using System;
@@ -9,15 +9,15 @@
     public class TeamWithUidExist : AsyncValidatorBase
     {
-        public TeamWithUidExist(ITeamRepo teamRepo)
+        public TeamWithUidExist(IUnitOfWork unitOfWork)
         {
-            TeamRepo = teamRepo;
+            UnitOfWork = unitOfWork;
         }
 
-        public ITeamRepo TeamRepo { get; }
+        public IUnitOfWork UnitOfWork { get; }
 
         protected override async Task<bool> IsValidAsync(PropertyValidatorContext context, CancellationToken cancellation)
         {
             var teamUid = (Guid)context.PropertyValue;
-            return await TeamRepo.TeamWithUidExists(teamUid);        
+            return await UnitOfWork.Teams.TeamWithUidExists(teamUid);
         }
 
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -13,5 +13,5 @@
         Task<T> GetByIdAsync(int id);
 
-        Task Add(T entity);
+        void Add(T entity);
     }
 }
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -29,8 +29,7 @@
         }
 
-        public async Task Add(T entity)
+        public void Add(T entity)
         {
             DbSet.Add(entity);
-            await DbContext.SaveChangesAsync();
         }
 
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ICategoriesRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ICategoriesRepo.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ICategoriesRepo.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -8,5 +8,5 @@
 namespace FinkiChattery.Persistence.Repositories
 {
-    public interface ICategoriesRepo
+    public interface ICategoriesRepo : IRepository<Category>
     {
         public Task<bool> CategoriesExist(IEnumerable<Guid> categoriesUids);
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,3 +1,4 @@
-﻿using FinkiChattery.Persistence.Repositories.Contracts;
+﻿using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.Repositories.Contracts;
 using System;
 using System.Threading.Tasks;
@@ -5,5 +6,5 @@
 namespace FinkiChattery.Persistence.Repositories
 {
-    public interface IQuestionRepo
+    public interface IQuestionRepo : IRepository<Question>
     {
         Task<QuestionStateDto> GetQuestionState(Guid questionUid);
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentRepo.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentRepo.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -4,5 +4,5 @@
 namespace FinkiChattery.Persistence.Repositories
 {
-    public interface IStudentRepo
+    public interface IStudentRepo : IRepository<Student>
     {
         public Task<Student> GetStudent(long applicationUserFk);
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ITeamRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ITeamRepo.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/ITeamRepo.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,8 +1,9 @@
-﻿using System;
+﻿using FinkiChattery.Persistence.Models;
+using System;
 using System.Threading.Tasks;
 
 namespace FinkiChattery.Persistence.Repositories
 {
-    public interface ITeamRepo
+    public interface ITeamRepo : IRepository<Team>
     {
         public Task<bool> TeamWithUidExists(Guid teamUid);
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -0,0 +1,15 @@
+﻿using FinkiChattery.Persistence.Repositories;
+using System;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.UnitOfWork
+{
+    public interface IUnitOfWork : IDisposable
+    {
+        ICategoriesRepo Categories { get; }
+        IQuestionRepo Questions { get; }
+        IStudentRepo Students { get; }
+        ITeamRepo Teams { get; }
+        Task<int> SaveAsync();
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -0,0 +1,102 @@
+﻿using FinkiChattery.Persistence.Context;
+using FinkiChattery.Persistence.Repositories;
+using System;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.UnitOfWork
+{
+    public class UnitOfWork : IUnitOfWork
+    {
+        private QuestionRepo _questions;
+        private CategoriesRepo _categories;
+        private StudentRepo _students;
+        private TeamRepo _teams;
+
+        public UnitOfWork(ApplicationDbContext dbContext)
+        {
+            DbContext = dbContext;
+        }
+
+        public ICategoriesRepo Categories
+        {
+            get
+            {
+                if (_categories == null)
+                {
+                    _categories = new CategoriesRepo(DbContext);
+                }
+
+                return _categories;
+            }
+        }
+
+        public IQuestionRepo Questions
+        {
+            get
+            {
+                if (_questions == null)
+                {
+                    _questions = new QuestionRepo(DbContext);
+                }
+
+                return _questions;
+            }
+        }
+
+        public IStudentRepo Students
+        {
+            get
+            {
+                if (_students == null)
+                {
+                    _students = new StudentRepo(DbContext);
+                }
+
+                return _students;
+            }
+        }
+
+        public ITeamRepo Teams
+        {
+            get
+            {
+                if (_teams == null)
+                {
+                    _teams = new TeamRepo(DbContext);
+                }
+
+                return _teams;
+            }
+        }
+
+        public ApplicationDbContext DbContext { get; }
+
+        public async Task<int> SaveAsync()
+        {
+            return await DbContext.SaveChangesAsync();
+        }
+
+        #region IDisposable Support
+        bool DisposedValue { get; set; }
+
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!DisposedValue)
+            {
+                if (disposing)
+                {
+                    DbContext.Dispose();
+                }
+
+                DisposedValue = true;
+            }
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+        #endregion
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Queries/Questioning/GetQuestionState/GetQuestionStateQuery.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Queries/Questioning/GetQuestionState/GetQuestionStateQuery.cs	(revision dab7a9bf82d3735c97ab80d59182deeee09d0359)
+++ src/FinkiChattery/FinkiChattery.Queries/Questioning/GetQuestionState/GetQuestionStateQuery.cs	(revision 3b395c5e170f381fef5308d3acd7ddc5dc205fe3)
@@ -1,5 +1,5 @@
 ﻿using FinkiChattery.Common.Mediator.Contracs;
-using FinkiChattery.Persistence.Repositories;
 using FinkiChattery.Persistence.Repositories.Contracts;
+using FinkiChattery.Persistence.UnitOfWork;
 using System;
 using System.Threading;
@@ -20,14 +20,14 @@
     public class GetQuestionStateQueryHandler : IQueryHandler<GetQuestionStateQuery, QuestionStateDto>
     {
-        public GetQuestionStateQueryHandler(IQuestionRepo questionRepo)
+        public GetQuestionStateQueryHandler(IUnitOfWork unitOfWork)
         {
-            QuestionRepo = questionRepo;
+            UnitOfWork = unitOfWork;
         }
 
-        public IQuestionRepo QuestionRepo { get; }
+        public IUnitOfWork UnitOfWork { get; }
 
         public async Task<QuestionStateDto> Handle(GetQuestionStateQuery request, CancellationToken cancellationToken)
         {
-            return await QuestionRepo.GetQuestionState(request.QuestionUid);
+            return await UnitOfWork.Questions.GetQuestionState(request.QuestionUid);
         }
     }
