Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateQuestionAnswersCountAndLastActivityEventHandler.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateQuestionAnswersCountAndLastActivityEventHandler.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/EventHandlers/UpdateQuestionAnswersCountAndLastActivityEventHandler.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,34 @@
+﻿using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.UnitOfWork;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.ApplicationServices.Questioning.EventHandlers
+{
+    public class UpdateQuestionAnswersCountAndLastActivityEventHandler : IEventHandler<QuestionAnsweredEvent>
+    {
+        public UpdateQuestionAnswersCountAndLastActivityEventHandler(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task Handle(QuestionAnsweredEvent notification, CancellationToken cancellationToken)
+        {
+            var question = await UnitOfWork.Questions.GetByUidAsync(notification.QuestionUid);
+
+            if (question == null)
+            {
+                return;
+            }
+
+            question.AnswersCount++;
+            question.LastActiveOn = DateTime.UtcNow;
+
+            await UnitOfWork.SaveAsync();
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswersController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswersController.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswersController.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,33 @@
+﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Contracts.Questioning;
+using IdentityServer4.AccessTokenValidation;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Api.Controllers.v1
+{
+    [ApiVersion(ApiVersions.ApiVersion1)]
+    [Route("api/v{version:apiVersion}/questions/{questionUid:Guid}/[controller]/")]
+    [ApiController]
+    public class AnswersController : ControllerBase
+    {
+        public AnswersController(IMediatorService mediatorService)
+        {
+            MediatorService = mediatorService;
+        }
+
+        public IMediatorService MediatorService { get; }
+
+        [HttpPost]
+        [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Policy = AuthenticationPolicy.Student)]
+        public async Task<IActionResult> AnswerQuestion([FromRoute] Guid questionUid, [FromBody] AnswerQuestionRequest request)
+        {
+            var answerUid = await MediatorService.SendAsync(new AnswerQuestionCommand(questionUid, request.Text));
+            return Ok(answerUid);
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionCommand.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionCommand.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,57 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.UnitOfWork;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class AnswerQuestionCommand : ICommand<Guid>
+    {
+        public AnswerQuestionCommand(Guid questionUid, string text)
+        {
+            QuestionUid = questionUid;
+            Text = text;
+        }
+
+        public Guid QuestionUid { get; }
+        public string Text { get; }
+    }
+
+    public class AnswerQuestionHandler : ICommandHandler<AnswerQuestionCommand, Guid>
+    {
+        public AnswerQuestionHandler(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(AnswerQuestionCommand request, CancellationToken cancellationToken)
+        {
+            var question = await UnitOfWork.Questions.GetByUidAsync(request.QuestionUid);
+            var student = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
+
+            var answer = new Answer()
+            {
+                Text = request.Text,
+                QuestionFk = question.Id,
+                StudentFk = student.Id,
+            };
+
+            UnitOfWork.Answers.Add(answer);
+            await UnitOfWork.SaveAsync();
+
+            EventService.Enqueue(new QuestionAnsweredEvent(question.Uid, answer.Uid, student.Uid));
+
+            return answer.Uid;
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionValidator.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionValidator.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/AnswerQuestionValidator.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,19 @@
+﻿using FinkiChattery.Commands.Questioning.Validators;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class AnswerQuestionValidator : AbstractValidator<AnswerQuestionCommand>
+    {
+        public AnswerQuestionValidator(IUnitOfWork unitOfWork, ICurrentUser currentUser)
+        {
+            CascadeMode = CascadeMode.Stop;
+
+            RuleFor(x => x.Text).AnswerTextValidate();
+            RuleFor(x => x.QuestionUid).SetValidator(new QuestionWithUidsExist(unitOfWork));
+            RuleFor(x => x).SetValidator(new StudentHasGoodReputationAndCanVoteAndAnswer(unitOfWork, currentUser));
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/QuestionAnsweredEvent.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/QuestionAnsweredEvent.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/AnswerQuestion/QuestionAnsweredEvent.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,19 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using System;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class QuestionAnsweredEvent : IEvent
+    {
+        public QuestionAnsweredEvent(Guid questionUid, Guid answerUid, Guid studentUid)
+        {
+            QuestionUid = questionUid;
+            AnswerUid = answerUid;
+            StudentUid = studentUid;
+        }
+
+        public Guid QuestionUid { get; }
+        public Guid AnswerUid { get; }
+        public Guid StudentUid { get; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -11,5 +11,7 @@
         public const string AnswerAlreadyUpvoted = "AnswerAlreadyUpvoted";
         public const string AnswerAlreadyDownvoted = "AnswerAlreadyDownvoted";
-        public const string StudentHasBadReputation = "StudentHasBadReputation";
+        public const string StudentHasBadReputation = "StudentHasBadReputation"; 
+        public const string AnswerTextLengthInvalid = "AnswerTextLengthInvalid";
+        public const string QuestionNotFound = "QuestionNotFound"; 
     }
 }
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestionWithUidsExist.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestionWithUidsExist.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestionWithUidsExist.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,30 @@
+﻿using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation.Validators;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning.Validators
+{
+    public class QuestionWithUidsExist : AsyncValidatorBase
+    {
+        public QuestionWithUidsExist(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        protected override async Task<bool> IsValidAsync(PropertyValidatorContext context, CancellationToken cancellation)
+        {
+            var questionUid = (Guid)context.PropertyValue;
+
+            return (await UnitOfWork.Questions.GetByUidAsync(questionUid)) != null;
+        }
+
+        protected override string GetDefaultMessageTemplate()
+        {
+            return QuestioningErrorCodes.QuestionNotFound;
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -16,4 +16,9 @@
         }
 
+        public static IRuleBuilderOptions<T, string> AnswerTextValidate<T>(this IRuleBuilder<T, string> ruleBuilder)
+        {
+            return ruleBuilder.NotNull().WithMessage(QuestioningErrorCodes.CantBeNull).MaximumLength(4000).WithMessage(QuestioningErrorCodes.AnswerTextLengthInvalid);
+        }
+
         public static IRuleBuilderOptions<T, IEnumerable<U>> ListNotNull<T, U>(this IRuleBuilder<T, IEnumerable<U>> ruleBuilder)
         {
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/AnswerQuestion/AnswerQuestionRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/AnswerQuestion/AnswerQuestionRequest.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/AnswerQuestion/AnswerQuestionRequest.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -0,0 +1,7 @@
+﻿namespace FinkiChattery.Contracts.Questioning
+{
+    public class AnswerQuestionRequest
+    {
+        public string Text { get; set; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs	(revision 728eb316de9be9ba28d63df71b9f6558bbb0b604)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/Answer.cs	(revision 846cf1ab3f1dccbe9e74c46429cfc751f81a0500)
@@ -6,4 +6,11 @@
     public class Answer : BaseEntity
     {
+        public Answer() : base()
+        {
+            CreatedOn = DateTime.UtcNow;
+            VotesCount = 0;
+            CorrectAnswer = false;
+        }
+
         public string Text { get; set; }
 
