Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateAnswerVotesEventHandler.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateStudentReputationEventHandler.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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/Controllers/v1/VotesController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/VotesController.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/VotesController.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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(voteUid);
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Api/Services/RegisterServices.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/CategoriesUidsExist.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/Contracts/VoteAnswerByStudentIsValidDto.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/StudentHasGoodReputationAndCanVoteAndAnswer.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/VoteAnswerByStudentIsValid.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/AnswerVotedEvent.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerCommand.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/VoteAnswer/VoteAnswerValidator.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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/VoteAnswer/VoteAnswerRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerRequest.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteAnswerRequest.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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/VoteTypeRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteTypeRequest.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/VoteAnswer/VoteTypeRequest.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -0,0 +1,8 @@
+﻿namespace FinkiChattery.Contracts.Questioning
+{
+    public enum VoteTypeRequest
+    {
+        Upvote,
+        Downvote
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Student.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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: src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs	(revision ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Vote.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -5,4 +5,8 @@
     public class Vote : BaseEntity
     {
+        public Vote() : base()
+        {
+        }
+
         public long StudentFk { get; set; }
 
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IVoteRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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/Implementations/AnswerRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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/VoteRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/VoteRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/VoteRepo.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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 ad0fcd30ce5ab16c07db1be60f8ef94fd38446b8)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision ad079e54536c1e15308ed26ddb1cd58456cab106)
@@ -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; }
 
