Index: src/Clients/Angular/finki-chattery/package-lock.json
===================================================================
--- src/Clients/Angular/finki-chattery/package-lock.json	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/package-lock.json	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -7801,4 +7801,12 @@
       }
     },
+    "ngx-pipes": {
+      "version": "2.7.6",
+      "resolved": "https://registry.npmjs.org/ngx-pipes/-/ngx-pipes-2.7.6.tgz",
+      "integrity": "sha512-FAeMd1mI8jCnnrhUuNLXs+PaVT1ujhA0QD3KRBDuzGFcbnP7NMXR2EJ5KYbV39LDNuRCluhpfwZudQu/NvrVuA==",
+      "requires": {
+        "tslib": "^2.0.0"
+      }
+    },
     "ngx-toastr": {
       "version": "13.2.1",
Index: src/Clients/Angular/finki-chattery/package.json
===================================================================
--- src/Clients/Angular/finki-chattery/package.json	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/package.json	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -33,4 +33,5 @@
     "ng2-file-upload": "^1.4.0",
     "ngx-material-timepicker": "^5.5.3",
+    "ngx-pipes": "^2.7.6",
     "ngx-toastr": "^13.2.1",
     "oidc-client": "^1.11.5",
Index: src/Clients/Angular/finki-chattery/src/app/core/services/auth.service.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/services/auth.service.ts	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/core/services/auth.service.ts	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -107,3 +107,7 @@
     });
   }
+
+  public studentCheckedNotifications(): Observable<void> {
+    return this.baseApi.post('v1/students/checked-notifications');
+  }
 }
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.html	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.html	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -19,4 +19,15 @@
       'header-student-questions' | translate
     }}</app-button>
+    <app-button
+      matBadge="{{ auth.selfUser?.student?.notifications?.length }}"
+      matBadgeHidden="{{ studentCheckedNotifications || auth.selfUser?.student?.notifications?.length === 0 }}"
+      [matMenuTriggerFor]="notificationMenu"
+      class="margin-y-xs"
+      *ngIf="auth.isStudent()"
+      (click)="studentCheckedNotificationsClick()"
+      [buttonType]="ButtonType.Basic"
+    >
+      <mat-icon>notifications</mat-icon>
+    </app-button>
     <app-button class="margin-y-xs" *ngIf="auth.isLoggedIn()" (action)="logout()" [buttonType]="ButtonType.Basic">{{
       'header-logout' | translate
@@ -34,2 +45,8 @@
   </button>
 </mat-menu>
+
+<mat-menu #notificationMenu="matMenu">
+  <div (click)="goToQuestion(q.questionUid)" mat-menu-item *ngFor="let q of auth.selfUser?.student?.notifications">
+    {{ q?.text }} <span class="time-ago">{{ q?.createdOn | timeAgo }}</span>
+  </div>
+</mat-menu>
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.scss
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.scss	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.scss	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -14,2 +14,6 @@
   }
 }
+
+::ng-deep.mat-menu-panel {
+  max-width: none !important;
+}
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.ts	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/header/header.component.ts	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -11,4 +11,6 @@
 export class HeaderComponent implements OnInit {
   ButtonType = ButtonType;
+
+  public studentCheckedNotifications = false;
 
   constructor(public auth: AuthService, private router: Router) {}
@@ -36,3 +38,10 @@
     this.router.navigateByUrl(`questioning/${questionUid}`);
   }
+
+  studentCheckedNotificationsClick(): void {
+    if (!this.studentCheckedNotifications) {
+      this.auth.studentCheckedNotifications().subscribe();
+    }
+    this.studentCheckedNotifications = true;
+  }
 }
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/models/user.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/models/user.models.ts	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/user.models.ts	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -1,2 +1,4 @@
+import * as moment from 'moment';
+
 export class ApplicationUser {
   constructor(
@@ -30,4 +32,19 @@
   public questions!: StudentQuestionResponse[];
   public teams!: StudentTeamResponse[];
+  public notifications!: StudentNotificationResponse[];
+}
+
+export class StudentNotificationResponse {
+  public uid!: string;
+  public createdOn!: moment.Moment;
+  public questionUid!: string;
+  public text!: string;
+
+  constructor(uid: string, createdOn: moment.Moment, questionUid: string, text: string) {
+    this.uid = uid;
+    this.createdOn = createdOn;
+    this.questionUid = questionUid;
+    this.text = text;
+  }
 }
 
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/services/base-api.service.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/services/base-api.service.ts	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/services/base-api.service.ts	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -4,5 +4,7 @@
 
 import { environment } from '@env/environment';
-import { SelfUserResponse } from '../models';
+import { SelfUserResponse, StudentNotificationResponse } from '../models';
+import { map } from 'rxjs/operators';
+import * as moment from 'moment';
 
 @Injectable({
@@ -19,5 +21,15 @@
 
   public getSelfUser(): Observable<SelfUserResponse> {
-    return this.get<SelfUserResponse>('v1/self');
+    return this.get<SelfUserResponse>('v1/self').pipe(
+      map((x) => {
+        if (x.student) {
+          x.student.notifications = x.student.notifications.map(
+            (y) => new StudentNotificationResponse(y.uid, moment(y.createdOn), y.questionUid, y.text)
+          );
+        }
+
+        return x;
+      })
+    );
   }
 
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/shared-app.module.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/shared-app.module.ts	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/shared-app.module.ts	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -14,4 +14,5 @@
 import { SERVICES } from './services/services';
 import { PIPES } from './pipes/pipes';
+import { NgPipesModule } from 'ngx-pipes';
 
 @NgModule({
@@ -27,5 +28,6 @@
     FileUploadModule,
     NgxMaterialTimepickerModule,
-    EditorModule
+    EditorModule,
+    NgPipesModule
   ],
   exports: [
@@ -41,5 +43,6 @@
     PIPES,
     SharedMaterialModule,
-    EditorModule
+    EditorModule,
+    NgPipesModule
   ]
 })
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsMarkedCorrect.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsMarkedCorrect.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsMarkedCorrect.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,46 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.UnitOfWork;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class NotifyStudentHisAnswerIsMarkedCorrect : IEventHandler<AnswerMarkedAsCorrectEvent>
+    {
+        public NotifyStudentHisAnswerIsMarkedCorrect(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(AnswerMarkedAsCorrectEvent notification, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetByIdAsync(notification.StudentFk);
+            var question = await UnitOfWork.Questions.GetByUidAsync(notification.QuestionUid);
+
+            if (student == null)
+            {
+                return;
+            }
+
+            if (question == null)
+            {
+                return;
+            }
+
+            var studentNotification = new StudentNotification()
+            {
+                StudentFk = student.Id,
+                QuestionUid = notification.QuestionUid,
+                Text = $"Your answer has been marked as correct on question {question.Title}"
+            };
+
+            UnitOfWork.StudentNotifications.Add(studentNotification);
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsVoted.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsVoted.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisAnswerIsVoted.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,46 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.UnitOfWork;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class NotifyStudentHisAnswerIsVoted : IEventHandler<AnswerVotedEvent>
+    {
+        public NotifyStudentHisAnswerIsVoted(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(AnswerVotedEvent notification, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetByUidAsync(notification.StudentUid);
+            var question = await UnitOfWork.Questions.GetByUidAsync(notification.QuestionUid);
+
+            if (student == null)
+            {
+                return;
+            }
+
+            if (question == null)
+            {
+                return;
+            }
+
+            var studentNotification = new StudentNotification()
+            {
+                StudentFk = student.Id,
+                QuestionUid = notification.QuestionUid,
+                Text = $"Your answer has been voted on question {question.Title}"
+            };
+
+            UnitOfWork.StudentNotifications.Add(studentNotification);
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisQuestionIsAnswered.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisQuestionIsAnswered.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/NotifyStudentHisQuestionIsAnswered.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,46 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.UnitOfWork;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class NotifyStudentHisQuestionIsAnswered : IEventHandler<QuestionAnsweredEvent>
+    {
+        public NotifyStudentHisQuestionIsAnswered(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(QuestionAnsweredEvent notification, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetByUidAsync(notification.StudentUid);
+            var question = await UnitOfWork.Questions.GetByUidAsync(notification.QuestionUid);
+
+            if (student == null)
+            {
+                return;
+            }
+
+            if (question == null)
+            {
+                return;
+            }
+
+            var studentNotification = new StudentNotification()
+            {
+                StudentFk = student.Id,
+                QuestionUid = notification.QuestionUid,
+                Text = $"Your question {question.Title} has been answered"
+            };
+
+            UnitOfWork.StudentNotifications.Add(studentNotification);
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/User/Mapper/SelfUserMapper.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/User/Mapper/SelfUserMapper.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/User/Mapper/SelfUserMapper.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -17,5 +17,6 @@
                                                       dto.StudentSelf.ImageUrl,
                                                       dto.StudentSelf.Questions.Select(x => new StudentQuestionResponse(x.QuestionUid, x.Title)),
-                                                      dto.StudentSelf.Teams.Select(x => new StudentTeamResponse(x.TeamUid, x.Name)));
+                                                      dto.StudentSelf.Teams.Select(x => new StudentTeamResponse(x.TeamUid, x.Name)),
+                                                      dto.StudentSelf.Notifications.Select(x => new StudentNotificationResponse(x.Uid, x.Text, x.CreatedOn, x.QuestionUid)));
 
                 return new SelfUserResponse(student);
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/StudentsController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/StudentsController.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/StudentsController.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,31 @@
+﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Commands.Notifications;
+using FinkiChattery.Common.Mediator.Interfaces;
+using IdentityServer4.AccessTokenValidation;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.Controllers.v1
+{
+    [ApiVersion(ApiVersions.ApiVersion1)]
+    [Route("api/v{version:apiVersion}/[controller]/")]
+    [ApiController]
+    public class StudentsController : ControllerBase
+    {
+        public StudentsController(IMediatorService mediatorService)
+        {
+            MediatorService = mediatorService;
+        }
+
+        public IMediatorService MediatorService { get; }
+
+        [HttpPost("checked-notifications")]
+        [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Policy = AuthenticationPolicy.Student)]
+        public async Task<IActionResult> AnswerQuestion()
+        {
+            await MediatorService.SendAsync(new StudentCheckedNotificationsCommand());
+            return Ok();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Notifications/StudentCheckedNotificationsCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Notifications/StudentCheckedNotificationsCommand.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Commands/Notifications/StudentCheckedNotificationsCommand.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,39 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.UnitOfWork;
+using MediatR;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Notifications
+{
+    public class StudentCheckedNotificationsCommand : ICommand<Unit>
+    {
+        public StudentCheckedNotificationsCommand()
+        {
+        }
+    }
+
+    public class StudentCheckedNotificationsHandler : ICommandHandler<StudentCheckedNotificationsCommand, Unit>
+    {
+        public StudentCheckedNotificationsHandler(ICurrentUser currentUser, IUnitOfWork unitOfWork)
+        {
+            CurrentUser = currentUser;
+            UnitOfWork = unitOfWork;
+        }
+
+        public ICurrentUser CurrentUser { get; }
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task<Unit> Handle(StudentCheckedNotificationsCommand request, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
+
+            student.LastCheckedNotifications = System.DateTime.UtcNow;
+
+            await UnitOfWork.SaveAsync();
+
+            return Unit.Value;
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/AnswerMarkedAsCorrectEvent.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/AnswerMarkedAsCorrectEvent.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/AnswerMarkedAsCorrectEvent.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -6,12 +6,14 @@
     public class AnswerMarkedAsCorrectEvent : IEvent
     {
-        public AnswerMarkedAsCorrectEvent(Guid questionUid, Guid answerUid)
+        public AnswerMarkedAsCorrectEvent(Guid questionUid, Guid answerUid, long studentFk)
         {
             QuestionUid = questionUid;
             AnswerUid = answerUid;
+            StudentFk = studentFk;
         }
 
         public Guid QuestionUid { get; }
         public Guid AnswerUid { get; }
+        public long StudentFk { get; }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/MarkAnswerCorrectCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/MarkAnswerCorrectCommand.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/MarkAnswerCorrect/MarkAnswerCorrectCommand.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -38,5 +38,5 @@
             await UnitOfWork.SaveAsync();
 
-            EventService.Enqueue(new AnswerMarkedAsCorrectEvent(request.QuestionUid, request.AnswerUid));
+            EventService.Enqueue(new AnswerMarkedAsCorrectEvent(request.QuestionUid, request.AnswerUid, answer.StudentFk));
 
             return answer.Uid;
Index: src/FinkiChattery/FinkiChattery.Contracts/User/GetSelfUser/SelfUserResponse.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/User/GetSelfUser/SelfUserResponse.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Contracts/User/GetSelfUser/SelfUserResponse.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -23,5 +23,5 @@
     public class StudentSelfResponse
     {
-        public StudentSelfResponse(Guid uid, long applicationUserId, string index, long reputation, string imageUrl, IEnumerable<StudentQuestionResponse> questions, IEnumerable<StudentTeamResponse> teams)
+        public StudentSelfResponse(Guid uid, long applicationUserId, string index, long reputation, string imageUrl, IEnumerable<StudentQuestionResponse> questions, IEnumerable<StudentTeamResponse> teams, IEnumerable<StudentNotificationResponse> notifications)
         {
             Uid = uid;
@@ -32,4 +32,5 @@
             Questions = questions;
             Teams = teams;
+            Notifications = notifications;
         }
 
@@ -41,4 +42,21 @@
         public IEnumerable<StudentQuestionResponse> Questions { get; }
         public IEnumerable<StudentTeamResponse> Teams { get; }
+        public IEnumerable<StudentNotificationResponse> Notifications { get; }
+    }
+
+    public class StudentNotificationResponse
+    {
+        public StudentNotificationResponse(Guid uid, string text, DateTime createdOn, Guid questionUid)
+        {
+            Uid = uid;
+            Text = text;
+            CreatedOn = createdOn;
+            QuestionUid = questionUid;
+        }
+
+        public Guid Uid { get; }
+        public string Text { get; }
+        public DateTime CreatedOn { get; }
+        public Guid QuestionUid { get; }
     }
 
Index: src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -77,4 +77,5 @@
     <Folder Include="dbo\Tables\Vote" />
     <Folder Include="dbo\Tables\Moderator" />
+    <Folder Include="dbo\Tables\StudentNotification" />
   </ItemGroup>
   <ItemGroup>
@@ -103,4 +104,5 @@
     <Build Include="dbo\Tables\Moderator\Moderator.sql" />
     <None Include="dbo\Tables\Moderator\Moderator.Debug.Seed.sql" />
+    <Build Include="dbo\Tables\StudentNotification\StudentNotification.sql" />
   </ItemGroup>
   <ItemGroup>
Index: src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Student/Student.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Student/Student.sql	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Student/Student.sql	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -7,4 +7,5 @@
     [ReportReputation]  BIGINT           DEFAULT (CONVERT([bigint],(0))) NOT NULL,
     [ImageUrl]          NVARCHAR (1000)     NOT NULL,
+    [LastCheckedNotifications] SMALLDATETIME NOT NULL DEFAULT GETUTCDATE(), 
     CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([Id] ASC),
     CONSTRAINT [FK_Student_AspNetUsers_ApplicationUserFk] FOREIGN KEY ([ApplicationUserFk]) REFERENCES [dbo].[AspNetUsers] ([Id])
Index: src/FinkiChattery/FinkiChattery.Database/dbo/Tables/StudentNotification/StudentNotification.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/StudentNotification/StudentNotification.sql	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Database/dbo/Tables/StudentNotification/StudentNotification.sql	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,15 @@
+﻿CREATE TABLE [dbo].[StudentNotification]
+(
+	[Id]        BIGINT           IDENTITY (1, 1) NOT NULL,
+    [Uid]       UNIQUEIDENTIFIER NOT NULL,
+	[StudentFk] BIGINT           NOT NULL, 
+    [Text]      NVARCHAR(500)    NOT NULL,
+    [QuestionUid] UNIQUEIDENTIFIER NOT NULL, 
+    [CreatedOn] SMALLDATETIME NOT NULL, 
+    CONSTRAINT [PK_StudentNotification] PRIMARY KEY CLUSTERED ([Id] ASC),
+    CONSTRAINT [FK_StudentNotification_Student_StudentFk] FOREIGN KEY ([StudentFk]) REFERENCES [dbo].[Student] ([Id]),
+)
+
+GO
+CREATE NONCLUSTERED INDEX [IX_StudentNotification_StudentFk]
+    ON [dbo].[StudentNotification]([StudentFk] ASC);
Index: src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentConfig.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentConfig.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentConfig.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -1,10 +1,6 @@
-﻿using Microsoft.EntityFrameworkCore;
+﻿using FinkiChattery.Persistence.Models;
+using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Metadata.Builders;
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using FinkiChattery.Persistence.Models;
 
 namespace FinkiChattery.Persistence.Configurations
@@ -27,4 +23,5 @@
             builder.Property(x => x.ReportReputation).HasColumnName(@"ReportReputation").HasColumnType("bigint").IsRequired().HasDefaultValue(0);
             builder.Property(x => x.ImageUrl).HasColumnName(@"ImageUrl").HasColumnType("nvarchar").IsRequired().HasMaxLength(1000);
+            builder.Property(x => x.LastCheckedNotifications).HasColumnName(@"LastCheckedNotifications").HasColumnType("smalldatetime").IsRequired().HasConversion(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));
 
             builder.HasOne(x => x.ApplicationUser).WithOne().HasForeignKey<Student>(x => x.ApplicationUserFk).OnDelete(DeleteBehavior.Restrict);
Index: src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentNotificationConfig.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentNotificationConfig.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Persistence/Configurations/StudentNotificationConfig.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,28 @@
+﻿using FinkiChattery.Persistence.Models;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using System;
+
+namespace FinkiChattery.Persistence.Configurations
+{
+    public class StudentNotificationConfig : BaseConfig<StudentNotification>
+    {
+        public StudentNotificationConfig(string schema) : base(schema)
+        {
+        }
+
+        public override void Configure(EntityTypeBuilder<StudentNotification> builder)
+        {
+            base.Configure(builder);
+
+            builder.ToTable("StudentNotification", Schema);
+
+            builder.Property(x => x.Text).HasColumnName(@"Text").HasColumnType("nvarchar").IsRequired().HasMaxLength(500);
+            builder.Property(x => x.StudentFk).HasColumnName(@"StudentFk").HasColumnType("bigint").IsRequired();
+            builder.Property(x => x.CreatedOn).HasColumnName(@"CreatedOn").HasColumnType("smalldatetime").IsRequired().HasConversion(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc)); ;
+            builder.Property(x => x.QuestionUid).HasColumnName(@"QuestionUid").HasColumnType("uniqueidentifier").IsRequired();
+
+            builder.HasOne(x => x.Student).WithMany(x => x.StudentNotifications).HasForeignKey(x => x.StudentFk).OnDelete(DeleteBehavior.Restrict);
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -24,4 +24,5 @@
         public DbSet<Team> Teams { get; set; }
         public DbSet<Vote> Votes { get; set; }
+        public DbSet<StudentNotification> StudentNotifications { get; set; }
 
         protected override void OnModelCreating(ModelBuilder builder)
@@ -43,4 +44,5 @@
             builder.ApplyConfiguration(new TeamConfig(schema));
             builder.ApplyConfiguration(new VoteConfig(schema));
+            builder.ApplyConfiguration(new StudentNotificationConfig(schema));
         }
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -1,3 +1,4 @@
-﻿using System.Collections.Generic;
+﻿using System;
+using System.Collections.Generic;
 
 namespace FinkiChattery.Persistence.Models
@@ -5,4 +6,6 @@
     public class Student : BaseEntity
     {
+        public DateTime LastCheckedNotifications { get; set; }
+
         public long ApplicationUserFk { get; set; }
 
@@ -22,4 +25,6 @@
 
         public virtual ICollection<StudentTeam> StudentTeams { get; set; }
+
+        public virtual ICollection<StudentNotification> StudentNotifications { get; set; }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/StudentNotification.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/StudentNotification.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/StudentNotification.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,22 @@
+﻿using System;
+
+namespace FinkiChattery.Persistence.Models
+{
+    public class StudentNotification : BaseEntity
+    {
+        public StudentNotification() : base()
+        {
+            CreatedOn = DateTime.UtcNow;
+        }
+
+        public string Text { get; set; }
+
+        public long StudentFk { get; set; }
+
+        public DateTime CreatedOn { get; set; }
+
+        public Guid QuestionUid { get; set; }
+
+        public Student Student { get; set; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Team.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Team.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Team.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -1,7 +1,3 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+﻿using System.Collections.Generic;
 
 namespace FinkiChattery.Persistence.Models
@@ -13,5 +9,5 @@
         public string Description { get; set; }
 
-        public virtual ICollection<Question> Questions{ get; set; }
+        public virtual ICollection<Question> Questions { get; set; }
 
         public virtual ICollection<StudentTeam> TeamStudents { get; set; }
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/IRepository.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -11,5 +11,5 @@
         Task<T> GetByUidAsync(Guid uid);
 
-        Task<T> GetByIdAsync(int id);
+        Task<T> GetByIdAsync(long id);
 
         void Delete(T entity);
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Base/Repository.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -24,5 +24,5 @@
         }
 
-        public async Task<T> GetByIdAsync(int id)
+        public async Task<T> GetByIdAsync(long id)
         {
             return await All().FirstOrDefaultAsync(f => f.Id == id);
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentNotificationRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentNotificationRepo.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IStudentNotificationRepo.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,11 @@
+﻿using FinkiChattery.Persistence.Models;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public interface IStudentNotificationRepo : IRepository<StudentNotification>
+    {
+        Task<List<StudentNotification>> GetStudentNotificationsForStudent(long studentFk); 
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfDto.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfDto.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfDto.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -1,4 +1,5 @@
 ﻿using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace FinkiChattery.Persistence.Repositories.Contracts
@@ -6,5 +7,5 @@
     public class StudentSelfDto
     {
-        public StudentSelfDto(Guid uid, long applicationUserId, string index, long reputation, string imageUrl, IEnumerable<StudentQuestionDto> questions, IEnumerable<StudentTeamDto> teams)
+        public StudentSelfDto(Guid uid, long applicationUserId, string index, long reputation, string imageUrl, DateTime lastCheckedNotifications, IEnumerable<StudentQuestionDto> questions, IEnumerable<StudentTeamDto> teams, IEnumerable<StudentSelfNotificationDto> notifications = null)
         {
             Uid = uid;
@@ -13,6 +14,8 @@
             Reputation = reputation;
             ImageUrl = imageUrl;
+            LastCheckedNotifications = lastCheckedNotifications;
             Questions = questions;
             Teams = teams;
+            Notifications = notifications;
         }
 
@@ -22,6 +25,8 @@
         public long Reputation { get; }
         public string ImageUrl { get; }
+        public DateTime LastCheckedNotifications { get; }
         public IEnumerable<StudentQuestionDto> Questions { get; }
         public IEnumerable<StudentTeamDto> Teams { get; }
+        public IEnumerable<StudentSelfNotificationDto> Notifications { get; set; }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfNotificationDto.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfNotificationDto.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Student/StudentSelfNotificationDto.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,20 @@
+﻿using System;
+
+namespace FinkiChattery.Persistence.Repositories.Contracts
+{
+    public class StudentSelfNotificationDto
+    {
+        public StudentSelfNotificationDto(Guid uid, string text, DateTime createdOn, Guid questionUid)
+        {
+            Uid = uid;
+            Text = text;
+            CreatedOn = createdOn;
+            QuestionUid = questionUid;
+        }
+
+        public Guid Uid { get; }
+        public string Text { get; }
+        public DateTime CreatedOn { get; }
+        public Guid QuestionUid { get; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentNotificationRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentNotificationRepo.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentNotificationRepo.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -0,0 +1,21 @@
+﻿using FinkiChattery.Persistence.Context;
+using FinkiChattery.Persistence.Models;
+using Microsoft.EntityFrameworkCore;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public class StudentNotificationRepo : Repository<StudentNotification>, IStudentNotificationRepo
+    {
+        public StudentNotificationRepo(ApplicationDbContext dbContext) : base(dbContext)
+        {
+        }
+
+        public async Task<List<StudentNotification>> GetStudentNotificationsForStudent(long studentFk)
+        {
+            return await DbSet.Where(x => x.StudentFk == studentFk).ToListAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentRepo.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/StudentRepo.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -21,5 +21,5 @@
         public async Task<StudentSelfDto> GetStudentSelfDto(long applicationUserFk)
         {
-            return await DbSet
+            var user = await DbSet
                 .AsNoTracking()
                 .Include(x => x.Questions)
@@ -31,7 +31,16 @@
                                                 x.Reputation,
                                                 x.ImageUrl,
+                                                x.LastCheckedNotifications,
                                                 x.Questions.Select(y => new StudentQuestionDto(y.Uid, y.Title)),
-                                                x.StudentTeams.Select(y => new StudentTeamDto(y.Team.Uid, y.Team.Name))))
+                                                x.StudentTeams.Select(y => new StudentTeamDto(y.Team.Uid, y.Team.Name)),
+                                                null))
                 .FirstOrDefaultAsync();
+
+            user.Notifications = await DbContext.StudentNotifications
+                .Where(x => x.CreatedOn > user.LastCheckedNotifications)
+                .Select(x => new StudentSelfNotificationDto(x.Uid, x.Text, x.CreatedOn, x.QuestionUid))
+                .ToListAsync();
+
+            return user;
         }
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -16,4 +16,5 @@
         IModeratorRepo Moderators { get; }
         IAnswerResponseRepo AnswerResponses { get; }
+        IStudentNotificationRepo StudentNotifications { get; }
         Task<int> SaveAsync();
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision f3c4950cc1a46557f6c15359e067de8c9e5e179a)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 6738cc08cebfbe351b250a75ae0aaf1295d2ff22)
@@ -17,4 +17,5 @@
         private TeacherRepo _teachers;
         private AnswerResponseRepo _answerResponses;
+        private StudentNotificationRepo _studentNotifications;
 
         public UnitOfWork(ApplicationDbContext dbContext)
@@ -33,4 +34,17 @@
 
                 return _answerResponses;
+            }
+        }
+
+        public IStudentNotificationRepo StudentNotifications
+        {
+            get
+            {
+                if (_studentNotifications == null)
+                {
+                    _studentNotifications = new StudentNotificationRepo(DbContext);
+                }
+
+                return _studentNotifications;
             }
         }
