Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -2,6 +2,6 @@
 import { Injectable } from '@angular/core';
 import { Action, Store } from '@ngrx/store';
-import { Observable, Subject, throwError } from 'rxjs';
-import { catchError, filter, map } from 'rxjs/operators';
+import { Observable, Subject } from 'rxjs';
+import { filter } from 'rxjs/operators';
 
 import {
@@ -9,5 +9,6 @@
   PreviewQuestionViewModel,
   QuestionStateViewModel,
-  SearchQuestionsQueryViewModel
+  SearchQuestionsQueryViewModel,
+  VoteType
 } from 'src/app/shared-app/models';
 import {
@@ -16,5 +17,6 @@
   GetPreviewQuestionsPopular,
   GetQuestionState,
-  GetSearchQuestions
+  GetSearchQuestions,
+  VoteAnswer
 } from './question-state/question.actions';
 import { questionStateQuery } from './question-state/question.selectors';
@@ -30,17 +32,5 @@
 
   constructor(private store: Store<QuestionState>) {
-    this.effectWorking$ = this.store.select(questionStateQuery.effectWorking).pipe(
-      filter((effect) => effect !== null),
-      map((effect) => {
-        if (effect instanceof HttpErrorResponse) {
-          throw effect;
-        } else {
-          return effect;
-        }
-      }),
-      catchError((err) => {
-        return throwError(err);
-      })
-    );
+    this.effectWorking$ = this.store.select(questionStateQuery.effectWorking).pipe(filter((effect) => effect !== null));
   }
 
@@ -81,4 +71,8 @@
   }
 
+  public voteAnswer(answerUid: string, questionUid: string, voteType: VoteType): void {
+    this.dispatchEffect(new VoteAnswer(questionUid, answerUid, voteType));
+  }
+
   public fetchQuestion(questionUid: string): void {
     this.dispatchEffect(new GetQuestionState(questionUid));
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-request.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-request.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-request.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,5 @@
+import { VoteType } from 'src/app/shared-app/models';
+
+export class VoteAnswerRequest {
+  constructor(public voteType: VoteType) {}
+}
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-response.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-response.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-response.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,82 @@
+import { VoteType } from 'src/app/shared-app/models';
+
+export class QuestionStateResponse {
+  public uid!: string;
+  public title!: string;
+  public text!: string;
+  public createdOn!: moment.Moment;
+  public views!: number;
+  public lastActiveOn!: moment.Moment;
+  public studentResponse!: StudentQuestionStateResponse;
+  public answersResponse!: AnswerQuestionStateResponse[];
+  public categoriesResponse!: QuestionCategoryQuestionStateResponse[];
+  public teamResponse!: TeamQuestionStateResponse | null;
+}
+
+export class StudentQuestionStateResponse {
+  public uid!: string;
+  public index!: string;
+  public imageUrl!: string;
+  public reputation!: number;
+}
+
+export class TeamQuestionStateResponse {
+  public uid!: string;
+  public name!: string;
+}
+
+export class QuestionCategoryQuestionStateResponse {
+  public uid!: string;
+  public name!: string;
+}
+
+export class AnswerQuestionStateResponse {
+  public uid!: string;
+  public text!: string;
+  public correctAnswer!: boolean;
+  public createdOn!: moment.Moment;
+  public votesCount!: number;
+  public studentResponse!: AnswerStudentQuestionStateResponse;
+  public answerResponsesResponse!: AnswerResponseQuestionStateResponse[];
+}
+
+export class AnswerStudentQuestionStateResponse {
+  public uid!: string;
+  public index!: string;
+  public imageUrl!: string;
+  public reputation!: number;
+}
+
+export class AnswerResponseQuestionStateResponse {
+  public uid!: string;
+  public text!: string;
+  public createdOn!: moment.Moment;
+  public studentResponse!: AnswerResponseStudentQuestionStateResponse;
+}
+
+export class AnswerResponseStudentQuestionStateResponse {
+  public uid!: string;
+  public index!: string;
+  public imageUrl!: string;
+  public reputation!: number;
+}
+
+export class PreviewQuestionResponse {
+  public uid!: string;
+  public title!: string;
+  public createdOn!: moment.Moment;
+  public views!: number;
+  public answersCount!: number;
+  public categories!: PreviewQuestionCategoryResponse[];
+}
+
+export class PreviewQuestionCategoryResponse {
+  public uid!: string;
+  public text!: string;
+}
+
+export class VoteAnswerResponse {
+  public answerUid!: string;
+  public voteUid!: string;
+  public voteType!: VoteType;
+}
Index: c/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state.models.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ 	(revision )
@@ -1,74 +1,0 @@
-export class QuestionStateResponse {
-  public uid!: string;
-  public title!: string;
-  public text!: string;
-  public createdOn!: moment.Moment;
-  public views!: number;
-  public lastActiveOn!: moment.Moment;
-  public studentResponse!: StudentQuestionStateResponse;
-  public answersResponse!: AnswerQuestionStateResponse[];
-  public categoriesResponse!: QuestionCategoryQuestionStateResponse[];
-  public teamResponse!: TeamQuestionStateResponse | null;
-}
-
-export class StudentQuestionStateResponse {
-  public uid!: string;
-  public index!: string;
-  public imageUrl!: string;
-  public reputation!: number;
-}
-
-export class TeamQuestionStateResponse {
-  public uid!: string;
-  public name!: string;
-}
-
-export class QuestionCategoryQuestionStateResponse {
-  public uid!: string;
-  public name!: string;
-}
-
-export class AnswerQuestionStateResponse {
-  public uid!: string;
-  public text!: string;
-  public correctAnswer!: boolean;
-  public createdOn!: moment.Moment;
-  public upvotesCount!: number;
-  public studentResponse!: AnswerStudentQuestionStateResponse;
-  public answerResponsesResponse!: AnswerResponseQuestionStateResponse[];
-}
-
-export class AnswerStudentQuestionStateResponse {
-  public uid!: string;
-  public index!: string;
-  public imageUrl!: string;
-  public reputation!: number;
-}
-
-export class AnswerResponseQuestionStateResponse {
-  public uid!: string;
-  public text!: string;
-  public createdOn!: moment.Moment;
-  public studentResponse!: AnswerResponseStudentQuestionStateResponse;
-}
-
-export class AnswerResponseStudentQuestionStateResponse {
-  public uid!: string;
-  public index!: string;
-  public imageUrl!: string;
-  public reputation!: number;
-}
-
-export class PreviewQuestionResponse {
-  public uid!: string;
-  public title!: string;
-  public createdOn!: moment.Moment;
-  public views!: number;
-  public answersCount!: number;
-  public categories!: PreviewQuestionCategoryResponse[];
-}
-
-export class PreviewQuestionCategoryResponse {
-  public uid!: string;
-  public text!: string;
-}
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -2,5 +2,11 @@
 import { Action } from '@ngrx/store';
 
-import { PreviewQuestionViewModel, QuestionStateViewModel, SearchQuestionsQueryViewModel } from 'src/app/shared-app/models';
+import {
+  PreviewQuestionViewModel,
+  QuestionStateViewModel,
+  SearchQuestionsQueryViewModel,
+  VoteAnswerViewModel,
+  VoteType
+} from 'src/app/shared-app/models';
 
 export enum QuestionActionTypes {
@@ -13,4 +19,6 @@
   GetSearchQuestions = '[Question] Get search questions',
   GetSearchQuestionsSuccess = '[Question] Get search questions Success',
+  VoteAnswer = '[Question] Vote answer',
+  VoteAnswerSuccess = '[Question] Vote answer Success',
   EffectStartedWorking = '[Question] Effect Started Working',
   EffectFinishedWorking = '[Question] Effect Finished Working',
@@ -66,4 +74,16 @@
 }
 
+export class VoteAnswer implements Action {
+  readonly type = QuestionActionTypes.VoteAnswer;
+
+  constructor(public questionUid: string, public answerUid: string, public voteType: VoteType) {}
+}
+
+export class VoteAnswerSuccess implements Action {
+  readonly type = QuestionActionTypes.VoteAnswerSuccess;
+
+  constructor(public payload: VoteAnswerViewModel) {}
+}
+
 export class EffectStartedWorking implements Action {
   readonly type = QuestionActionTypes.EffectStartedWorking;
@@ -89,4 +109,5 @@
   | GetPreviewQuestionsPopularSuccess
   | GetSearchQuestionsSuccess
+  | VoteAnswerSuccess
   | EffectStartedWorking
   | EffectFinishedWorking
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -7,5 +7,6 @@
 import { BaseApiService } from 'src/app/shared-app/services/base-api.service';
 import { QuestionFacadeService } from '../question-facade.service';
-import { PreviewQuestionResponse, QuestionStateResponse } from './question-state.models';
+import { VoteAnswerRequest } from './question-state-request.models';
+import { PreviewQuestionResponse, QuestionStateResponse, VoteAnswerResponse } from './question-state-response.models';
 import {
   EffectFinishedWorking,
@@ -19,5 +20,7 @@
   GetSearchQuestions,
   GetSearchQuestionsSuccess,
-  QuestionActionTypes
+  QuestionActionTypes,
+  VoteAnswer,
+  VoteAnswerSuccess
 } from './question.actions';
 import { QuestionMapper } from './question.mapper';
@@ -103,3 +106,16 @@
     );
   });
+
+  voteAnswer$ = createEffect(() => {
+    return this.actions$.pipe(
+      ofType<VoteAnswer>(QuestionActionTypes.VoteAnswer),
+      mergeMap((action) => {
+        const body = new VoteAnswerRequest(action.voteType);
+        return this.api.post<VoteAnswerResponse>(`v1/questions/${action.questionUid}/answers/${action.answerUid}/votes`, body).pipe(
+          switchMap((state) => [new VoteAnswerSuccess(QuestionMapper.ToVoteAnswerViewModel(state)), new EffectFinishedWorking()]),
+          catchError((err) => [new EffectFinishedWorkingError(err)])
+        );
+      })
+    );
+  });
 }
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -10,8 +10,9 @@
   QuestionStateViewModel,
   StudentQuestionStateViewModel,
-  TeamQuestionStateViewModel
+  TeamQuestionStateViewModel,
+  VoteAnswerViewModel
 } from 'src/app/shared-app/models';
 import { TranslateFromJsonService } from 'src/app/shared-app/services';
-import { PreviewQuestionResponse, QuestionStateResponse } from './question-state.models';
+import { PreviewQuestionResponse, QuestionStateResponse, VoteAnswerResponse } from './question-state-response.models';
 
 export class QuestionMapper {
@@ -51,5 +52,5 @@
           x.correctAnswer,
           moment(x.createdOn),
-          x.upvotesCount,
+          x.votesCount,
           answerStudent,
           answerResponses
@@ -113,3 +114,7 @@
     return questions;
   }
+
+  public static ToVoteAnswerViewModel(response: VoteAnswerResponse): VoteAnswerViewModel {
+    return new VoteAnswerViewModel(response.answerUid, response.voteUid, response.voteType);
+  }
 }
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,2 +1,3 @@
+import { VoteType } from 'src/app/shared-app/models';
 import { QuestionAction, QuestionActionTypes } from './question.actions';
 import { initialState, QuestionState } from './question.state';
@@ -25,4 +26,39 @@
         searchQuestionsQuery: action.query
       };
+    case QuestionActionTypes.VoteAnswerSuccess: {
+      if (state.question) {
+        return {
+          ...state,
+          question: {
+            ...state.question,
+            answers: state.question.answers.map((x) => {
+              if (x.uid === action.payload.answerUid) {
+                let votesCountNew = x.votesCount;
+
+                switch (action.payload.voteType) {
+                  case VoteType.Upvote:
+                    votesCountNew++;
+                    break;
+                  case VoteType.Downvote:
+                    votesCountNew--;
+                    break;
+                }
+
+                return {
+                  ...x,
+                  votesCount: votesCountNew
+                };
+              }
+
+              return x;
+            })
+          }
+        };
+      }
+
+      return {
+        ...state
+      };
+    }
     case QuestionActionTypes.EffectStartedWorking: {
       return {
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/vote/vote.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/vote/vote.component.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/generic/vote/vote.component.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,9 +1,5 @@
 import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { VoteType } from 'src/app/shared-app/models';
 import { ButtonType } from '../button/button.models';
-
-export enum VoteType {
-  Upvote,
-  Downvote
-}
 
 @Component({
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.html	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.html	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -14,5 +14,10 @@
       <mat-card-content>
         <div fxLayout="row wrap" fxLayoutAlign="space-around none">
-          <app-vote [voteCount]="answer.upvotesCount" [correct]="answer.correctAnswer" fxFlex="6%"></app-vote>
+          <app-vote
+            [voteCount]="answer.votesCount"
+            [correct]="answer.correctAnswer"
+            (voteClicked)="answerVoted($event, answer.uid, question.uid)"
+            fxFlex="6%"
+          ></app-vote>
           <div fxFlex="92%">
             <app-text-editor
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,6 +1,8 @@
+import { HttpErrorResponse } from '@angular/common/http';
 import { Component, OnInit } from '@angular/core';
+import { NotificationService } from 'src/app/core/services/notification.service';
 import { QuestionFacadeService } from 'src/app/core/state/question-facade.service';
 
-import { QuestionStateViewModel } from 'src/app/shared-app/models';
+import { QuestionStateViewModel, VoteType } from 'src/app/shared-app/models';
 import { ButtonType } from '../../generic/button/button.models';
 
@@ -14,5 +16,5 @@
   working = true;
   ButtonType = ButtonType;
-  constructor(private questionFacade: QuestionFacadeService) {}
+  constructor(private questionFacade: QuestionFacadeService, private notification: NotificationService) {}
 
   ngOnInit(): void {
@@ -21,4 +23,14 @@
       this.working = false;
     });
+
+    this.questionFacade.effectWorking$.subscribe((effect) => {
+      if (effect instanceof HttpErrorResponse) {
+        this.notification.handleErrorsNotification(effect.error);
+      }
+    });
+  }
+
+  answerVoted(voteType: VoteType, answerUid: string, questionUid: string): void {
+    this.questionFacade.voteAnswer(answerUid, questionUid, voteType);
   }
 }
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-enums.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-enums.models.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-enums.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -3,2 +3,7 @@
   Popular
 }
+
+export enum VoteType {
+  Upvote,
+  Downvote
+}
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,2 +1,4 @@
+import { VoteType } from '.';
+
 export class QuestionStateViewModel {
   constructor(
@@ -32,5 +34,5 @@
     public correctAnswer: boolean,
     public createdOn: moment.Moment,
-    public upvotesCount: number,
+    public votesCount: number,
     public student: AnswerStudentQuestionStateViewModel,
     public answerResponses: AnswerResponseQuestionStateViewModel[]
@@ -73,2 +75,6 @@
   constructor(public text: string) {}
 }
+
+export class VoteAnswerViewModel {
+  constructor(public answerUid: string, public voteUid: string, public voteType: VoteType) {}
+}
Index: src/Clients/Angular/finki-chattery/src/assets/translations/en.json
===================================================================
--- src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -53,4 +53,7 @@
   "ask-question-stepper-ask": "Ask question",
   "ask-question-ask-button-back": "Edit question",
-  "ask-question-ask-button": "Ask question"
+  "ask-question-ask-button": "Ask question",
+  "AnswerAlreadyUpvoted": "You have already upvoted this answer",
+  "AnswerAlreadyDownvoted": "You have already downvoted this answer",
+  "StudentHasBadReputation": "You have bad reputation and can not vote"
 }
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,41 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.UnitOfWork;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class UpdateAnswerVotesEventHandler : IEventHandler<AnswerVotedEvent>
+    {
+        public UpdateAnswerVotesEventHandler(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(AnswerVotedEvent notification, CancellationToken cancellationToken)
+        {
+            var answer = await UnitOfWork.Answers.GetByUidAsync(notification.AnswerUid);
+
+            if (answer == null)
+            {
+                return;
+            }
+
+            switch (notification.VoteType)
+            {
+                case VoteType.Upvote:
+                    answer.VotesCount++;
+                    break;
+                case VoteType.Downvote:
+                    answer.VotesCount--;
+                    break;
+            }
+
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateStudentReputationEventHandler.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateStudentReputationEventHandler.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateStudentReputationEventHandler.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,41 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.UnitOfWork;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class UpdateStudentReputationEventHandler : IEventHandler<AnswerVotedEvent>
+    {
+        public UpdateStudentReputationEventHandler(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(AnswerVotedEvent notification, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetByUidAsync(notification.StudentUid);
+
+            if (student == null)
+            {
+                return;
+            }
+
+            switch (notification.VoteType)
+            {
+                case VoteType.Upvote:
+                    student.Reputation++;
+                    break;
+                case VoteType.Downvote:
+                    student.Reputation--;
+                    break;
+            }
+
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -54,5 +54,5 @@
                     var answerStudent = new AnswerStudentQuestionStateResponse(x.StudentDto.Id, x.StudentDto.Uid, x.StudentDto.Index, x.StudentDto.ImageUrl, x.StudentDto.Reputation);
 
-                    return new AnswerQuestionStateResponse(x.Id, x.Uid, x.Text, x.CorrectAnswer, x.CreatedOn, x.UpvotesCount, answerStudent, answerResponses);
+                    return new AnswerQuestionStateResponse(x.Id, x.Uid, x.Text, x.CorrectAnswer, x.CreatedOn, x.VotesCount, answerStudent, answerResponses);
                 });
             }
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/VotesController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/VotesController.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/VotesController.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,35 @@
+﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Contracts.Questioning;
+using FinkiChattery.Persistence.Helpers;
+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}/questions/{questionUid:Guid}/answers/{answerUid:Guid}/[controller]")]
+    [ApiController]
+    public class VotesController : ControllerBase
+    {
+        public VotesController(IMediatorService mediatorService)
+        {
+            MediatorService = mediatorService;
+        }
+
+        public IMediatorService MediatorService { get; }
+
+        [HttpPost]
+        [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Policy = AuthenticationPolicy.Student)]
+        public async Task<IActionResult> VoteAnswer([FromRoute] Guid questionUid, [FromRoute] Guid answerUid, [FromBody] VoteAnswerRequest request)
+        {
+            VoteType voteType = request.VoteType == VoteTypeRequest.Upvote ? VoteType.Upvote : VoteType.Downvote;
+            var voteUid = await MediatorService.SendAsync(new VoteAnswerCommand(voteType, answerUid, questionUid));
+            return Ok(new VoteAnswerResponse(answerUid, voteUid, request.VoteType));
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,3 +1,4 @@
 ﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers;
 using FinkiChattery.Api.Services;
 using FinkiChattery.Commands.Questioning;
@@ -31,5 +32,5 @@
             services.AddScoped<IEventService, EventService>();
             services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
-            services.AddMediatR(typeof(AskQuestionCommand), typeof(GetQuestionStateQuery));
+            services.AddMediatR(typeof(AskQuestionCommand), typeof(GetQuestionStateQuery), typeof(UpdateAnswerVotesEventHandler));
         }
 
@@ -54,4 +55,9 @@
             });
             services.AddHangfireServer();
+
+            services.AddScoped<IBackgroundJobClient>(provider =>
+            {
+                return new BackgroundJobClient(JobStorage.Current);
+            });
         }
 
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -9,4 +9,7 @@
         public const string CategoriesDontExist = "CategoriesDontExist";
         public const string TeamDontExist = "TeamDontExist";
+        public const string AnswerAlreadyUpvoted = "AnswerAlreadyUpvoted";
+        public const string AnswerAlreadyDownvoted = "AnswerAlreadyDownvoted";
+        public const string StudentHasBadReputation = "StudentHasBadReputation";
     }
 }
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -1,4 +1,3 @@
-﻿using FinkiChattery.Persistence.Repositories;
-using FinkiChattery.Persistence.UnitOfWork;
+﻿using FinkiChattery.Persistence.UnitOfWork;
 using FluentValidation.Validators;
 using System;
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/Contracts/VoteAnswerByStudentIsValidDto.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/Contracts/VoteAnswerByStudentIsValidDto.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/Contracts/VoteAnswerByStudentIsValidDto.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,17 @@
+﻿using FinkiChattery.Persistence.Helpers;
+using System;
+
+namespace FinkiChattery.Commands.Questioning.Validators.Contracts
+{
+    public class VoteAnswerByStudentIsValidDto
+    {
+        public VoteAnswerByStudentIsValidDto(VoteType voteType, Guid answerUid)
+        {
+            VoteType = voteType;
+            AnswerUid = answerUid;
+        }
+
+        public VoteType VoteType { get; }
+        public Guid AnswerUid { get; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/StudentHasGoodReputationAndCanVoteAndAnswer.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/StudentHasGoodReputationAndCanVoteAndAnswer.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/StudentHasGoodReputationAndCanVoteAndAnswer.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,37 @@
+﻿using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation.Validators;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning.Validators
+{
+    public class StudentHasGoodReputationAndCanVoteAndAnswer : AsyncValidatorBase
+    {
+        public StudentHasGoodReputationAndCanVoteAndAnswer(IUnitOfWork unitOfWork, ICurrentUser currentUser)
+        {
+            UnitOfWork = unitOfWork;
+            CurrentUser = currentUser;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+        public ICurrentUser CurrentUser { get; }
+
+        protected override async Task<bool> IsValidAsync(PropertyValidatorContext context, CancellationToken cancellation)
+        {
+            var student = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
+
+            if (student.ReportReputation > 100)
+            {
+                return false;
+            }
+
+            return true;
+        }
+
+        protected override string GetDefaultMessageTemplate()
+        {
+            return QuestioningErrorCodes.StudentHasBadReputation;
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/VoteAnswerByStudentIsValid.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/VoteAnswerByStudentIsValid.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/VoteAnswerByStudentIsValid.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,47 @@
+﻿using FinkiChattery.Commands.Questioning.Validators.Contracts;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation.Validators;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning.Validators
+{
+    public class VoteAnswerByStudentIsValid : AsyncValidatorBase
+    {
+        public VoteAnswerByStudentIsValid(IUnitOfWork unitOfWork, ICurrentUser currentUser)
+        {
+            UnitOfWork = unitOfWork;
+            CurrentUser = currentUser;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+        public ICurrentUser CurrentUser { get; }
+        private VoteType _voteType { get; set; }
+
+        protected override async Task<bool> IsValidAsync(PropertyValidatorContext context, CancellationToken cancellation)
+        {
+            var dto = (VoteAnswerByStudentIsValidDto)context.PropertyValue;
+
+            _voteType = dto.VoteType;
+
+            return dto.VoteType switch
+            {
+                VoteType.Upvote => !await UnitOfWork.Votes.StudentHasUpvotedAnswer(dto.AnswerUid, CurrentUser.Id),
+                VoteType.Downvote => !await UnitOfWork.Votes.StudentHasDownvotedAnswer(dto.AnswerUid, CurrentUser.Id),
+                _ => !await UnitOfWork.Votes.StudentHasUpvotedAnswer(dto.AnswerUid, CurrentUser.Id),
+            };
+        }
+
+        protected override string GetDefaultMessageTemplate()
+        {
+            return _voteType switch
+            {
+                VoteType.Upvote => QuestioningErrorCodes.AnswerAlreadyUpvoted,
+                VoteType.Downvote => QuestioningErrorCodes.AnswerAlreadyDownvoted,
+                _ => QuestioningErrorCodes.AnswerAlreadyUpvoted
+            };
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/AnswerVotedEvent.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/AnswerVotedEvent.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/AnswerVotedEvent.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,22 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Helpers;
+using System;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class AnswerVotedEvent : IEvent
+    {
+        public AnswerVotedEvent(Guid questionUid, Guid answerUid, Guid studentUid, VoteType voteType)
+        {
+            QuestionUid = questionUid;
+            AnswerUid = answerUid;
+            StudentUid = studentUid;
+            VoteType = voteType;
+        }
+
+        public Guid QuestionUid { get; }
+        public Guid AnswerUid { get; }
+        public Guid StudentUid { get; }
+        public VoteType VoteType { get; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerCommand.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerCommand.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,69 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.UnitOfWork;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class VoteAnswerCommand : ICommand<Guid>
+    {
+        public VoteAnswerCommand(VoteType voteType, Guid answerUid, Guid questionUid)
+        {
+            VoteType = voteType;
+            AnswerUid = answerUid;
+            QuestionUid = questionUid;
+        }
+
+        public VoteType VoteType { get; }
+        public Guid AnswerUid { get; }
+        public Guid QuestionUid { get; }
+    }
+
+    public class VoteAnswerHandler : ICommandHandler<VoteAnswerCommand, Guid>
+    {
+        public VoteAnswerHandler(IUnitOfWork unitOfWork, ICurrentUser currentUser, IEventService eventService)
+        {
+            UnitOfWork = unitOfWork;
+            CurrentUser = currentUser;
+            EventService = eventService;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+        public ICurrentUser CurrentUser { get; }
+        public IEventService EventService { get; }
+
+        public async Task<Guid> Handle(VoteAnswerCommand request, CancellationToken cancellationToken)
+        {
+            var student = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
+            var answer = await UnitOfWork.Answers.GetByUidAsync(request.AnswerUid);
+            var vote = await UnitOfWork.Votes.GetVoteForAnswerByStudent(request.AnswerUid, CurrentUser.Id);
+
+            if (vote == null)
+            {
+                vote = new Vote()
+                {
+                    AnswerFk = answer.Id,
+                    StudentFk = student.Id,
+                    VoteType = request.VoteType
+                };
+
+                UnitOfWork.Votes.Add(vote);
+            } 
+            else
+            {
+                vote.VoteType = request.VoteType;
+            }
+
+            await UnitOfWork.SaveAsync();
+
+            EventService.Enqueue(new AnswerVotedEvent(request.QuestionUid, request.AnswerUid, student.Uid, request.VoteType));
+
+            return vote.Uid;
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerValidator.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerValidator.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerValidator.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,19 @@
+﻿using FinkiChattery.Commands.Questioning.Validators;
+using FinkiChattery.Commands.Questioning.Validators.Contracts;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class VoteAnswerValidator : AbstractValidator<VoteAnswerCommand>
+    {
+        public VoteAnswerValidator(IUnitOfWork unitOfWork, ICurrentUser currentUser)
+        {
+            CascadeMode = CascadeMode.Stop;
+
+            RuleFor(x => x).SetValidator(new StudentHasGoodReputationAndCanVoteAndAnswer(unitOfWork, currentUser));
+            RuleFor(x => new VoteAnswerByStudentIsValidDto(x.VoteType, x.AnswerUid)).SetValidator(new VoteAnswerByStudentIsValid(unitOfWork, currentUser));
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/GetQuestionState/QuestionStateResponse.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/GetQuestionState/QuestionStateResponse.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/GetQuestionState/QuestionStateResponse.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -89,5 +89,5 @@
     public class AnswerQuestionStateResponse
     {
-        public AnswerQuestionStateResponse(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long upvotesCount, AnswerStudentQuestionStateResponse studentResponse, IEnumerable<AnswerResponseQuestionStateResponse> answerResponsesResponse)
+        public AnswerQuestionStateResponse(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long votesCount, AnswerStudentQuestionStateResponse studentResponse, IEnumerable<AnswerResponseQuestionStateResponse> answerResponsesResponse)
         {
             Id = id;
@@ -96,5 +96,5 @@
             CorrectAnswer = correctAnswer;
             CreatedOn = createdOn;
-            UpvotesCount = upvotesCount;
+            VotesCount = votesCount;
             StudentResponse = studentResponse;
             AnswerResponsesResponse = answerResponsesResponse;
@@ -107,5 +107,5 @@
         public bool CorrectAnswer { get; }
         public DateTime CreatedOn { get; }
-        public long UpvotesCount { get; }
+        public long VotesCount { get; }
         public AnswerStudentQuestionStateResponse StudentResponse { get; }
         public IEnumerable<AnswerResponseQuestionStateResponse> AnswerResponsesResponse { get; }
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerRequest.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerRequest.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,10 @@
+﻿using System.ComponentModel.DataAnnotations;
+
+namespace FinkiChattery.Contracts.Questioning
+{
+    public class VoteAnswerRequest
+    {
+        [EnumDataType(typeof(VoteTypeRequest))]
+        public VoteTypeRequest VoteType { get; set; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerResponse.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerResponse.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerResponse.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,18 @@
+﻿using System;
+
+namespace FinkiChattery.Contracts.Questioning
+{
+    public class VoteAnswerResponse
+    {
+        public VoteAnswerResponse(Guid answerUid, Guid voteUid, VoteTypeRequest voteType)
+        {
+            AnswerUid = answerUid;
+            VoteUid = voteUid;
+            VoteType = voteType;
+        }
+
+        public Guid AnswerUid { get; }
+        public Guid VoteUid { get; }
+        public VoteTypeRequest VoteType { get; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteTypeRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteTypeRequest.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteTypeRequest.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,8 @@
+﻿namespace FinkiChattery.Contracts.Questioning
+{
+    public enum VoteTypeRequest
+    {
+        Upvote,
+        Downvote
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Database/FinkiChattery.Database.sqlproj	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -75,4 +75,5 @@
     <Folder Include="dbo\Tables\QuestionCategory" />
     <Folder Include="Snapshots" />
+    <Folder Include="dbo\Tables\Vote" />
   </ItemGroup>
   <ItemGroup>
@@ -81,5 +82,4 @@
     <Build Include="dbo\Tables\StudentTeam.sql" />
     <Build Include="dbo\Tables\TeacherTeam.sql" />
-    <Build Include="dbo\Tables\Upvote.sql" />
     <Build Include="dbo\Tables\User\AspNetRoleClaims.sql" />
     <Build Include="dbo\Tables\User\AspNetRoles.sql" />
@@ -100,4 +100,5 @@
     <Build Include="dbo\Tables\QuestionCategory\QuestionCategory.sql" />
     <None Include="dbo\Tables\QuestionCategory\QuestionCategory.Debug.Seed.sql" />
+    <Build Include="dbo\Tables\Vote\Vote.sql" />
   </ItemGroup>
   <ItemGroup>
Index: src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.Debug.Seed.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.Debug.Seed.sql	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.Debug.Seed.sql	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -12,5 +12,5 @@
             (3, N'cee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Answer 3', 2, 1, 1, GETUTCDATE(), 5),
             (4, N'dee193c3-9d36-4ed8-81b2-15eb4ff305f1', N'Answer 4', 2, 1, 0, GETUTCDATE(), 5)
-    ) AS temp ([Id], [Uid], [Text], [QuestionFk], [StudentFk], [CorrectAnswer], [CreatedOn], [UpvotesCount])
+    ) AS temp ([Id], [Uid], [Text], [QuestionFk], [StudentFk], [CorrectAnswer], [CreatedOn], [VotesCount])
     ) AS S
     ON T.[ID] = S.[ID]
@@ -21,5 +21,5 @@
                    T.[StudentFk] = S.[StudentFk],
                    T.[CorrectAnswer] = S.[CorrectAnswer],
-                   T.[UpvotesCount] = S.[UpvotesCount]
+                   T.[VotesCount] = S.[VotesCount]
     WHEN NOT MATCHED THEN
         INSERT
@@ -32,8 +32,8 @@
             [CorrectAnswer],
             [CreatedOn],
-            [UpvotesCount]
+            [VotesCount]
         )
         VALUES
-        (S.[Id], S.[Uid], S.[Text], S.[QuestionFk], S.[StudentFk], S.[CorrectAnswer], S.[CreatedOn], S.[UpvotesCount]);
+        (S.[Id], S.[Uid], S.[Text], S.[QuestionFk], S.[StudentFk], S.[CorrectAnswer], S.[CreatedOn], S.[VotesCount]);
     SET IDENTITY_INSERT [dbo].[Answer] OFF
 END
Index: src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.sql	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Answer/Answer.sql	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -7,5 +7,5 @@
     [CorrectAnswer] BIT              NOT NULL,
     [CreatedOn]     SMALLDATETIME    NOT NULL,
-    [UpvotesCount] BIGINT NOT NULL DEFAULT 0, 
+    [VotesCount] BIGINT NOT NULL DEFAULT 0, 
     CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([Id] ASC),
     CONSTRAINT [FK_Answer_Question_QuestionFk] FOREIGN KEY ([QuestionFk]) REFERENCES [dbo].[Question] ([Id]),
Index: c/FinkiChattery/FinkiChattery.Database/dbo/Tables/Upvote.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Upvote.sql	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ 	(revision )
@@ -1,20 +1,0 @@
-﻿CREATE TABLE [dbo].[Upvote] (
-    [Id]        BIGINT           IDENTITY (1, 1) NOT NULL,
-    [Uid]       UNIQUEIDENTIFIER NOT NULL,
-    [StudentFk] BIGINT           NOT NULL,
-    [AnswerFk]  BIGINT           NOT NULL,
-    CONSTRAINT [PK_Upvote] PRIMARY KEY CLUSTERED ([Id] ASC),
-    CONSTRAINT [FK_Upvote_Answer_AnswerFk] FOREIGN KEY ([AnswerFk]) REFERENCES [dbo].[Answer] ([Id]),
-    CONSTRAINT [FK_Upvote_Student_StudentFk] FOREIGN KEY ([StudentFk]) REFERENCES [dbo].[Student] ([Id])
-);
-
-
-GO
-CREATE NONCLUSTERED INDEX [IX_Upvote_AnswerFk]
-    ON [dbo].[Upvote]([AnswerFk] ASC);
-
-
-GO
-CREATE NONCLUSTERED INDEX [IX_Upvote_StudentFk]
-    ON [dbo].[Upvote]([StudentFk] ASC);
-
Index: src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Vote/Vote.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Vote/Vote.sql	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Database/dbo/Tables/Vote/Vote.sql	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,21 @@
+﻿CREATE TABLE [dbo].[Vote] (
+    [Id]        BIGINT           IDENTITY (1, 1) NOT NULL,
+    [Uid]       UNIQUEIDENTIFIER NOT NULL,
+    [StudentFk] BIGINT           NOT NULL,
+    [AnswerFk]  BIGINT           NOT NULL,
+    [VoteType] TINYINT           NOT NULL, 
+    CONSTRAINT [PK_Vote] PRIMARY KEY CLUSTERED ([Id] ASC),
+    CONSTRAINT [FK_Vote_Answer_AnswerFk] FOREIGN KEY ([AnswerFk]) REFERENCES [dbo].[Answer] ([Id]),
+    CONSTRAINT [FK_Vote_Student_StudentFk] FOREIGN KEY ([StudentFk]) REFERENCES [dbo].[Student] ([Id])
+);
+
+
+GO
+CREATE NONCLUSTERED INDEX [IX_Vote_AnswerFk]
+    ON [dbo].[Vote]([AnswerFk] ASC);
+
+
+GO
+CREATE NONCLUSTERED INDEX [IX_Vote_StudentFk]
+    ON [dbo].[Vote]([StudentFk] ASC);
+
Index: src/FinkiChattery/FinkiChattery.Persistence/Configurations/AnswerConfig.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Configurations/AnswerConfig.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Configurations/AnswerConfig.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -22,5 +22,5 @@
             builder.Property(x => x.CorrectAnswer).HasColumnName(@"CorrectAnswer").HasColumnType("bit").IsRequired();
             builder.Property(x => x.CreatedOn).HasColumnName(@"CreatedOn").HasColumnType("smalldatetime").IsRequired();
-            builder.Property(x => x.UpvotesCount).HasColumnName(@"UpvotesCount").HasColumnType("bigint").IsRequired().HasDefaultValue(0);
+            builder.Property(x => x.VotesCount).HasColumnName(@"VotesCount").HasColumnType("bigint").IsRequired().HasDefaultValue(0);
 
             builder.HasOne(x => x.Question).WithMany(x => x.Answers).HasForeignKey(x => x.QuestionFk).OnDelete(DeleteBehavior.Restrict);
Index: c/FinkiChattery/FinkiChattery.Persistence/Configurations/UpvoteConfig.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Configurations/UpvoteConfig.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ 	(revision )
@@ -1,31 +1,0 @@
-﻿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
-{
-    public class UpvoteConfig : BaseConfig<Upvote>
-    {
-        public UpvoteConfig(string schema) : base(schema)
-        {
-        }
-
-        public override void Configure(EntityTypeBuilder<Upvote> builder)
-        {
-            base.Configure(builder);
-
-            builder.ToTable("Upvote", Schema);
-
-            builder.Property(x => x.StudentFk).HasColumnName(@"StudentFk").HasColumnType("bigint").IsRequired();
-            builder.Property(x => x.AnswerFk).HasColumnName(@"AnswerFk").HasColumnType("bigint").IsRequired();
-
-            builder.HasOne(x => x.Student).WithMany().HasForeignKey(x => x.StudentFk).OnDelete(DeleteBehavior.Restrict);
-            builder.HasOne(x => x.Answer).WithMany(x => x.Upvotes).HasForeignKey(x => x.AnswerFk).OnDelete(DeleteBehavior.Restrict);
-        }
-    }
-}
Index: src/FinkiChattery/FinkiChattery.Persistence/Configurations/VoteConfig.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Configurations/VoteConfig.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Configurations/VoteConfig.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,27 @@
+﻿using FinkiChattery.Persistence.Models;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace FinkiChattery.Persistence.Configurations
+{
+    public class VoteConfig : BaseConfig<Vote>
+    {
+        public VoteConfig(string schema) : base(schema)
+        {
+        }
+
+        public override void Configure(EntityTypeBuilder<Vote> builder)
+        {
+            base.Configure(builder);
+
+            builder.ToTable("Vote", Schema);
+
+            builder.Property(x => x.StudentFk).HasColumnName(@"StudentFk").HasColumnType("bigint").IsRequired();
+            builder.Property(x => x.AnswerFk).HasColumnName(@"AnswerFk").HasColumnType("bigint").IsRequired();
+            builder.Property(x => x.VoteType).HasColumnName(@"VoteType").HasColumnType("tinyint").IsRequired();
+
+            builder.HasOne(x => x.Student).WithMany().HasForeignKey(x => x.StudentFk).OnDelete(DeleteBehavior.Restrict);
+            builder.HasOne(x => x.Answer).WithMany(x => x.Votes).HasForeignKey(x => x.AnswerFk).OnDelete(DeleteBehavior.Restrict);
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Context/ApplicationDbContext.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -23,5 +23,5 @@
         public DbSet<TeacherTeam> TeacherTeams { get; set; }
         public DbSet<Team> Teams { get; set; }
-        public DbSet<Upvote> Upvotes { get; set; }
+        public DbSet<Vote> Votes { get; set; }
 
         protected override void OnModelCreating(ModelBuilder builder)
@@ -42,5 +42,5 @@
             builder.ApplyConfiguration(new TeacherTeamConfig(schema));
             builder.ApplyConfiguration(new TeamConfig(schema));
-            builder.ApplyConfiguration(new UpvoteConfig(schema));
+            builder.ApplyConfiguration(new VoteConfig(schema));
         }
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/Helpers/Enums/VoteType.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Helpers/Enums/VoteType.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Helpers/Enums/VoteType.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,8 @@
+﻿namespace FinkiChattery.Persistence.Helpers
+{
+    public enum VoteType
+    {
+        Upvote,
+        Downvote
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -20,7 +20,7 @@
         public DateTime CreatedOn { get; set; }
 
-        public long UpvotesCount { get; set; }
+        public long VotesCount { get; set; }
 
-        public virtual ICollection<Upvote> Upvotes { get; set; }
+        public virtual ICollection<Vote> Votes { get; set; }
 
         public virtual ICollection<AnswerResponse> AnswerResponses { get; set; }
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -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
@@ -22,7 +18,7 @@
 
         public virtual ICollection<Question> Questions { get; set; }
-        
+
         public virtual ICollection<Answer> Answers { get; set; }
-        
+
         public virtual ICollection<StudentTeam> StudentTeams { get; set; }
     }
Index: c/FinkiChattery/FinkiChattery.Persistence/Models/Upvote.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Upvote.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ 	(revision )
@@ -1,19 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FinkiChattery.Persistence.Models
-{
-    public class Upvote : BaseEntity
-    {
-        public long StudentFk { get; set; }
-
-        public virtual Student Student { get; set; }
-
-        public long AnswerFk { get; set; }
-
-        public virtual Answer Answer { get; set; }
-    }
-}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,21 @@
+﻿using FinkiChattery.Persistence.Helpers;
+
+namespace FinkiChattery.Persistence.Models
+{
+    public class Vote : BaseEntity
+    {
+        public Vote() : base()
+        {
+        }
+
+        public long StudentFk { get; set; }
+
+        public virtual Student Student { get; set; }
+
+        public long AnswerFk { get; set; }
+
+        public virtual Answer Answer { get; set; }
+
+        public VoteType VoteType { get; set; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,8 @@
+﻿using FinkiChattery.Persistence.Models;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public interface IAnswerRepo : IRepository<Answer>
+    {
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IVoteRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IVoteRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IVoteRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,13 @@
+﻿using FinkiChattery.Persistence.Models;
+using System;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public interface IVoteRepo : IRepository<Vote>
+    {
+        Task<bool> StudentHasUpvotedAnswer(Guid answerUid, long userId);
+        Task<bool> StudentHasDownvotedAnswer(Guid answerUid, long userId);
+        Task<Vote> GetVoteForAnswerByStudent(Guid answerUid, long userId);
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Question/QuestionStateDto.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Question/QuestionStateDto.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/Question/QuestionStateDto.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -84,5 +84,5 @@
     public class AnswerQuestionStateDto
     {
-        public AnswerQuestionStateDto(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long upvotesCount, AnswerStudentQuestionStateDto studentDto, IEnumerable<AnswerResponseQuestionStateDto> answerResponsesDto)
+        public AnswerQuestionStateDto(long id, Guid uid, string text, bool correctAnswer, DateTime createdOn, long votesCount, AnswerStudentQuestionStateDto studentDto, IEnumerable<AnswerResponseQuestionStateDto> answerResponsesDto)
         {
             Id = id;
@@ -91,5 +91,5 @@
             CorrectAnswer = correctAnswer;
             CreatedOn = createdOn;
-            UpvotesCount = upvotesCount;
+            VotesCount = votesCount;
             StudentDto = studentDto;
             AnswerResponsesDto = answerResponsesDto;
@@ -101,5 +101,5 @@
         public bool CorrectAnswer { get; }
         public DateTime CreatedOn { get; }
-        public long UpvotesCount { get; }
+        public long VotesCount { get; }
         public AnswerStudentQuestionStateDto StudentDto { get; }
         public IEnumerable<AnswerResponseQuestionStateDto> AnswerResponsesDto { get; }
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,12 @@
+﻿using FinkiChattery.Persistence.Context;
+using FinkiChattery.Persistence.Models;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public class AnswerRepo : Repository<Answer>, IAnswerRepo
+    {
+        public AnswerRepo(ApplicationDbContext dbContext) : base(dbContext)
+        {
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -80,5 +80,5 @@
                                                     y.CorrectAnswer,
                                                     y.CreatedOn,
-                                                    y.UpvotesCount,
+                                                    y.VotesCount,
                                                     new AnswerStudentQuestionStateDto(
                                                         y.Student.Id,
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/VoteRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/VoteRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/VoteRepo.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -0,0 +1,40 @@
+﻿using FinkiChattery.Persistence.Context;
+using FinkiChattery.Persistence.Helpers;
+using FinkiChattery.Persistence.Models;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public class VoteRepo : Repository<Vote>, IVoteRepo
+    {
+        public VoteRepo(ApplicationDbContext dbContext) : base(dbContext)
+        {
+        }
+
+        public async Task<Vote> GetVoteForAnswerByStudent(Guid answerUid, long userId)
+        {
+            return await DbSet
+                .Where(x => x.Answer.Uid == answerUid &&  x.Student.ApplicationUserFk == userId)
+                .FirstOrDefaultAsync();
+        }
+
+        public async Task<bool> StudentHasDownvotedAnswer(Guid answerUid, long userId)
+        {
+            return await DbSet
+                .AsNoTracking()
+                .Where(x => x.Answer.Uid == answerUid && x.VoteType == VoteType.Downvote && x.Student.ApplicationUserFk == userId)
+                .AnyAsync();
+        }
+
+        public async Task<bool> StudentHasUpvotedAnswer(Guid answerUid, long userId)
+        {
+            return await DbSet
+                .AsNoTracking()
+                .Where(x => x.Answer.Uid == answerUid && x.VoteType == VoteType.Upvote && x.Student.ApplicationUserFk == userId)
+                .AnyAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -11,4 +11,6 @@
         IStudentRepo Students { get; }
         ITeamRepo Teams { get; }
+        IVoteRepo Votes { get; }
+        IAnswerRepo Answers { get; }
         Task<int> SaveAsync();
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 806f4eeff9ed8c99e0abc6d3650e6b16300e72ba)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
@@ -12,4 +12,6 @@
         private StudentRepo _students;
         private TeamRepo _teams;
+        private VoteRepo _votes;
+        private AnswerRepo _answers;
 
         public UnitOfWork(ApplicationDbContext dbContext)
@@ -70,4 +72,30 @@
         }
 
+        public IVoteRepo Votes
+        {
+            get
+            {
+                if (_votes == null)
+                {
+                    _votes = new VoteRepo(DbContext);
+                }
+
+                return _votes;
+            }
+        }
+
+        public IAnswerRepo Answers
+        {
+            get
+            {
+                if (_answers == null)
+                {
+                    _answers = new AnswerRepo(DbContext);
+                }
+
+                return _answers;
+            }
+        }
+
         public ApplicationDbContext DbContext { get; }
 
