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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -19,4 +19,5 @@
   GetQuestionState,
   GetSearchQuestions,
+  RespondToAnswer,
   SetCorrectAnswer,
   VoteAnswer
@@ -85,4 +86,8 @@
   }
 
+  public respondToAnswer(answerUid: string, questionUid: string, text: string): void {
+    this.dispatchEffect(new RespondToAnswer(questionUid, answerUid, text));
+  }
+
   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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state-request.models.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -4,2 +4,6 @@
   constructor(public voteType: VoteType) {}
 }
+
+export class RespondToAnswerRequest {
+  constructor(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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -3,4 +3,5 @@
 
 import {
+  AnswerResponseQuestionStateViewModel,
   PreviewQuestionViewModel,
   QuestionStateViewModel,
@@ -13,4 +14,6 @@
   GetQuestionState = '[Question] Get state',
   GetQuestionStateSuccess = '[Question] Get state success',
+  RespondToAnswer = '[Question] RespondToAnswer',
+  RespondToAnswerSuccess = '[Question] RespondToAnswer success',
   SetCorrectAnswer = '[Question] Set Correct Answer',
   SetCorrectAnswerSuccess = '[Question] Set Correct Answer success',
@@ -100,4 +103,16 @@
 }
 
+export class RespondToAnswer implements Action {
+  readonly type = QuestionActionTypes.RespondToAnswer;
+
+  constructor(public questionUid: string, public answerUid: string, public text: string) {}
+}
+
+export class RespondToAnswerSuccess implements Action {
+  readonly type = QuestionActionTypes.RespondToAnswerSuccess;
+
+  constructor(public payload: AnswerResponseQuestionStateViewModel, public answerUid: string) {}
+}
+
 export class EffectStartedWorking implements Action {
   readonly type = QuestionActionTypes.EffectStartedWorking;
@@ -125,4 +140,5 @@
   | VoteAnswerSuccess
   | SetCorrectAnswerSuccess
+  | RespondToAnswerSuccess
   | 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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -8,6 +8,11 @@
 import { NotificationService } from '../../services/notification.service';
 import { QuestionFacadeService } from '../question-facade.service';
-import { VoteAnswerRequest } from './question-state-request.models';
-import { PreviewQuestionResponse, QuestionStateResponse, VoteAnswerResponse } from './question-state-response.models';
+import { RespondToAnswerRequest, VoteAnswerRequest } from './question-state-request.models';
+import {
+  AnswerResponseQuestionStateResponse,
+  PreviewQuestionResponse,
+  QuestionStateResponse,
+  VoteAnswerResponse
+} from './question-state-response.models';
 import {
   EffectFinishedWorking,
@@ -22,4 +27,6 @@
   GetSearchQuestionsSuccess,
   QuestionActionTypes,
+  RespondToAnswer,
+  RespondToAnswerSuccess,
   SetCorrectAnswer,
   SetCorrectAnswerSuccess,
@@ -137,3 +144,24 @@
     );
   });
+
+  respondToAnswer$ = createEffect(() => {
+    return this.actions$.pipe(
+      ofType<RespondToAnswer>(QuestionActionTypes.RespondToAnswer),
+      mergeMap((action) => {
+        return this.api
+          .post<AnswerResponseQuestionStateResponse>(
+            `v1/questions/${action.questionUid}/answers/${action.answerUid}/answerresponses`,
+            new RespondToAnswerRequest(action.text)
+          )
+          .pipe(
+            tap((state) => this.notification.successNotification('success-answer-response')),
+            switchMap((state) => [
+              new RespondToAnswerSuccess(QuestionMapper.ToAnswerResponseQuestionStateViewModel(state), action.answerUid),
+              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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -14,5 +14,10 @@
 } from 'src/app/shared-app/models';
 import { TranslateFromJsonService } from 'src/app/shared-app/services';
-import { PreviewQuestionResponse, QuestionStateResponse, VoteAnswerResponse } from './question-state-response.models';
+import {
+  AnswerResponseQuestionStateResponse,
+  PreviewQuestionResponse,
+  QuestionStateResponse,
+  VoteAnswerResponse
+} from './question-state-response.models';
 
 export class QuestionMapper {
@@ -118,3 +123,16 @@
     return new VoteAnswerViewModel(response.answerUid, response.voteUid, response.voteType);
   }
+
+  public static ToAnswerResponseQuestionStateViewModel(
+    response: AnswerResponseQuestionStateResponse
+  ): AnswerResponseQuestionStateViewModel {
+    const answerResponseStudent = new AnswerResponseStudentQuestionStateViewModel(
+      response.studentResponse.uid,
+      response.studentResponse.index,
+      response.studentResponse.imageUrl,
+      response.studentResponse.reputation
+    );
+
+    return new AnswerResponseQuestionStateViewModel(response.uid, response.text, moment(response.createdOn), answerResponseStudent);
+  }
 }
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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -90,4 +90,28 @@
       };
     }
+    case QuestionActionTypes.RespondToAnswerSuccess: {
+      if (state.question) {
+        return {
+          ...state,
+          question: {
+            ...state.question,
+            answers: state.question.answers.map((x) => {
+              if (x.uid === action.answerUid) {
+                return {
+                  ...x,
+                  answerResponses: [...x.answerResponses, action.payload]
+                };
+              }
+
+              return x;
+            })
+          }
+        };
+      }
+
+      return {
+        ...state
+      };
+    }
     case QuestionActionTypes.EffectStartedWorking: {
       return {
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/components.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -9,4 +9,5 @@
 import { PreviewQuestionFullComponent } from './question/preview-question-full/preview-question-full.component';
 import { QuestionPreviewComponent } from './question/question-preview/question-preview.component';
+import { RespondToAnswerDialogComponent } from './question/respond-to-answer-dialog/respond-to-answer-dialog.component';
 import { SearchQuestionComponent } from './question/search-question/search-question.component';
 import { StudentCardComponent } from './question/student-card/student-card.component';
@@ -24,4 +25,5 @@
   AskQuestionSharedComponent,
   PreviewQuestionFullComponent,
-  TextEditorComponent
+  TextEditorComponent,
+  RespondToAnswerDialogComponent
 ];
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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.html	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -45,5 +45,5 @@
             <div *ngFor="let answerResponse of answer.answerResponses">
               {{ answerResponse.text }}
-              <mat-chip class="cursor" selected>{{ answerResponse.student.index }}</mat-chip> -
+              <mat-chip class="cursor">{{ answerResponse.student.index }}</mat-chip> -
               {{ answerResponse.createdOn | momentDate: 'LL' }}
               <hr />
@@ -52,5 +52,9 @@
         </div>
       </mat-card-content>
-      <mat-card-actions> </mat-card-actions>
+      <mat-card-actions>
+        <app-button (action)="openRespondToAnswerDialog(answer.uid)" [buttonType]="ButtonType.Basic">{{
+          'question-preview-respond-to-answer-button' | translate
+        }}</app-button>
+      </mat-card-actions>
     </mat-card>
   </ng-container>
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 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/question-preview/question-preview.component.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -5,4 +5,5 @@
 
 import { QuestionStateViewModel, VoteType } from 'src/app/shared-app/models';
+import { SharedDialogService } from 'src/app/shared-app/services/shared-dialog.service';
 import { ButtonType } from '../../generic/button/button.models';
 
@@ -17,5 +18,9 @@
   working = true;
   ButtonType = ButtonType;
-  constructor(private questionFacade: QuestionFacadeService, private notification: NotificationService) {}
+  constructor(
+    private questionFacade: QuestionFacadeService,
+    private notification: NotificationService,
+    private dialog: SharedDialogService
+  ) {}
 
   ngOnInit(): void {
@@ -39,3 +44,7 @@
     this.questionFacade.setCorrectAnswer(questionUid, answerUid);
   }
+
+  openRespondToAnswerDialog(answerUid: string): void {
+    this.dialog.respondToAnswer(this.question.uid, answerUid);
+  }
 }
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.html	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.html	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,21 @@
+<h1 mat-dialog-title>{{ 'respond-to-answer-title' | translate }}</h1>
+<mat-dialog-content>
+  <form [formGroup]="formGroup">
+    <mat-form-field class="full-width margin-bottom-md" appearance="standard" appHandleInputFormErrors>
+      <textarea
+        matInput
+        autocomplete="off"
+        [placeholder]="'respond-to-answer-title-text-placeholder' | translate"
+        [formControl]="textField"
+      ></textarea>
+    </mat-form-field>
+  </form>
+</mat-dialog-content>
+<mat-dialog-actions>
+  <app-button [buttonType]="ButtonType.Basic" (action)="dialogRef.close()">
+    {{ 'close-button' | translate }}
+  </app-button>
+  <app-button [buttonType]="ButtonType.CallToAction" [disabled]="!formGroup.valid" (action)="submit()">
+    {{ 'submit-button' | translate }}
+  </app-button>
+</mat-dialog-actions>
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.spec.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.spec.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.spec.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { RespondToAnswerDialogComponent } from './respond-to-answer-dialog.component';
+
+describe('RespondToAnswerDialogComponent', () => {
+  let component: RespondToAnswerDialogComponent;
+  let fixture: ComponentFixture<RespondToAnswerDialogComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ RespondToAnswerDialogComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(RespondToAnswerDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/respond-to-answer-dialog/respond-to-answer-dialog.component.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,32 @@
+import { Component, OnInit } from '@angular/core';
+import { FormControl, FormGroup, Validators } from '@angular/forms';
+import { MatDialogRef } from '@angular/material/dialog';
+
+import { QuestionFacadeService } from 'src/app/core/state/question-facade.service';
+import { ButtonType } from '../../generic/button/button.models';
+
+@Component({
+  selector: 'app-respond-to-answer-dialog',
+  templateUrl: './respond-to-answer-dialog.component.html',
+  styleUrls: ['./respond-to-answer-dialog.component.scss']
+})
+export class RespondToAnswerDialogComponent implements OnInit {
+  public ButtonType = ButtonType;
+  public textField = new FormControl('', [Validators.required, Validators.maxLength(4000)]);
+  public formGroup: FormGroup;
+  public questionUid!: string;
+  public answerUid!: string;
+
+  constructor(public dialogRef: MatDialogRef<RespondToAnswerDialogComponent>, private questionFacade: QuestionFacadeService) {
+    this.formGroup = new FormGroup({
+      text: this.textField
+    });
+  }
+
+  ngOnInit(): void {}
+
+  submit(): void {
+    this.questionFacade.respondToAnswer(this.answerUid, this.questionUid, this.textField.value);
+    this.dialogRef.close();
+  }
+}
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/services/shared-dialog.service.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/services/shared-dialog.service.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/services/shared-dialog.service.ts	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,24 @@
+import { Injectable } from '@angular/core';
+import { MatDialog, MatDialogRef } from '@angular/material/dialog';
+import { Observable } from 'rxjs';
+import { RespondToAnswerDialogComponent } from '../components/question/respond-to-answer-dialog/respond-to-answer-dialog.component';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class SharedDialogService {
+  constructor(private dialog: MatDialog) {}
+
+  public respondToAnswer(questionUid: string, answerUid: string): Observable<any> {
+    let dialogRef: MatDialogRef<RespondToAnswerDialogComponent>;
+    dialogRef = this.dialog.open(RespondToAnswerDialogComponent, {
+      width: '650px',
+      height: 'auto'
+    });
+
+    dialogRef.componentInstance.questionUid = questionUid;
+    dialogRef.componentInstance.answerUid = answerUid;
+
+    return dialogRef.afterClosed();
+  }
+}
Index: src/Clients/Angular/finki-chattery/src/assets/translations/en.json
===================================================================
--- src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -55,5 +55,11 @@
   "sucess-vote": "Successfully voted answer",
   "success-correct-answer": "Successfully set correct answer",
+  "success-answer-response": "Successfully responded to answer",
   "ask-question-ask-button": "Ask question",
+  "question-preview-respond-to-answer-button": "Respond to answer",
+  "respond-to-answer-title": "Respond to answer",
+  "respond-to-answer-title-text-placeholder": "Response text",
+  "close-button": "Close",
+  "submit-button": "Submit",
   "AnswerAlreadyUpvoted": "You have already upvoted this answer",
   "AnswerAlreadyDownvoted": "You have already downvoted this answer",
Index: src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Api/ApplicationServices/Questioning/Mapper/QuestionMapper.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -48,5 +48,5 @@
                             var answerResponseStudent = new AnswerResponseStudentQuestionStateResponse(y.StudentDto.Id, y.StudentDto.Uid, y.StudentDto.Index, y.StudentDto.ImageUrl, y.StudentDto.Reputation);
 
-                            return new AnswerResponseQuestionStateResponse(y.Id, y.Uid, y.Text, y.CreatedOn, answerResponseStudent);
+                            return ToAnswerResponseQuestionStateResponse(y);
                         });
                     }
@@ -76,4 +76,11 @@
             return new QuestionStateResponse(questionState.Id, questionState.Uid, questionState.Title, questionState.Text, questionState.CreatedOn, questionState.Views, questionState.LastActiveOn, student, answers, questionCategories, team);
         }
+
+        public static AnswerResponseQuestionStateResponse ToAnswerResponseQuestionStateResponse(this AnswerResponseQuestionStateDto dto)
+        {
+            var answerResponseStudent = new AnswerResponseStudentQuestionStateResponse(dto.StudentDto.Id, dto.StudentDto.Uid, dto.StudentDto.Index, dto.StudentDto.ImageUrl, dto.StudentDto.Reputation);
+
+            return new AnswerResponseQuestionStateResponse(dto.Id, dto.Uid, dto.Text, dto.CreatedOn, answerResponseStudent);
+        }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswerResponsesController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswerResponsesController.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/AnswerResponsesController.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,34 @@
+﻿using FinkiChattery.Api.ApplicationServices.Authentication;
+using FinkiChattery.Api.ApplicationServices.Questioning;
+using FinkiChattery.Commands.Questioning;
+using FinkiChattery.Common.Mediator.Interfaces;
+using FinkiChattery.Contracts.Questioning;
+using 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 AnswerResponsesController : ControllerBase
+    {
+        public AnswerResponsesController(IMediatorService mediatorService)
+        {
+            MediatorService = mediatorService;
+        }
+
+        public IMediatorService MediatorService { get; }
+
+        [HttpPost]
+        [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Policy = AuthenticationPolicy.Student)]
+        public async Task<IActionResult> AddResponseToAnswer([FromRoute] Guid questionUid, [FromRoute] Guid answerUid, [FromBody] AnswerResponseRequest request)
+        {
+            var answerResponse = await MediatorService.SendAsync(new RespondToAnswerCommand(questionUid, answerUid, request.Text));
+            return Ok(answerResponse.ToAnswerResponseQuestionStateResponse());
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/QuestioningErrorCodes.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -7,4 +7,5 @@
         public const string QuestionTitleLengthInvalid = "QuestionTitleLengthInvalid";
         public const string QuestionTextLengthInvalid = "QuestionTextLengthInvalid";
+        public const string AnswerResponseTextLengthInvalid = "AnswerResponseTextLengthInvalid";
         public const string CategoriesDontExist = "CategoriesDontExist";
         public const string TeamDontExist = "TeamDontExist";
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerCommand.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerCommand.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerCommand.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,63 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Common.User;
+using FinkiChattery.Persistence.Models;
+using FinkiChattery.Persistence.Repositories.Contracts;
+using FinkiChattery.Persistence.UnitOfWork;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class RespondToAnswerCommand : ICommand<AnswerResponseQuestionStateDto>
+    {
+        public RespondToAnswerCommand(Guid questionUid, Guid answerUid, string text)
+        {
+            QuestionUid = questionUid;
+            AnswerUid = answerUid;
+            Text = text;
+        }
+
+        public Guid QuestionUid { get; }
+        public Guid AnswerUid { get; }
+        public string Text { get; }
+    }
+
+    public class RespondToAnswerHandler : ICommandHandler<RespondToAnswerCommand, AnswerResponseQuestionStateDto>
+    {
+        public RespondToAnswerHandler(IUnitOfWork unitOfWork, ICurrentUser currentUser)
+        {
+            UnitOfWork = unitOfWork;
+            CurrentUser = currentUser;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+        public ICurrentUser CurrentUser { get; }
+
+        public async Task<AnswerResponseQuestionStateDto> Handle(RespondToAnswerCommand request, CancellationToken cancellationToken)
+        {
+            var answer = await UnitOfWork.Answers.GetByUidAsync(request.AnswerUid);
+            var student = await UnitOfWork.Students.GetStudent(CurrentUser.Id);
+
+            var answerResponse = new AnswerResponse()
+            {
+                Text = request.Text,
+                StudentFk = student.Id,
+                AnswerFk = answer.Id
+            };
+
+            UnitOfWork.AnswerResponses.Add(answerResponse);
+            await UnitOfWork.SaveAsync();
+
+            return new AnswerResponseQuestionStateDto(answerResponse.Id,
+                                                      answerResponse.Uid,
+                                                      answerResponse.Text,
+                                                      answerResponse.CreatedOn,
+                                                      new AnswerResponseStudentQuestionStateDto(student.Id,
+                                                                                                student.Uid,
+                                                                                                student.IndexNumber,
+                                                                                                student.ImageUrl,
+                                                                                                student.Reputation));
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerValidator.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerValidator.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/RespondToAnswer/RespondToAnswerValidator.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,18 @@
+﻿using FinkiChattery.Commands.Questioning.Validators;
+using FinkiChattery.Commands.Questioning.Validators.Contracts;
+using FinkiChattery.Persistence.UnitOfWork;
+using FluentValidation;
+
+namespace FinkiChattery.Commands.Questioning
+{
+    public class RespondToAnswerValidator : AbstractValidator<RespondToAnswerCommand>
+    {
+        public RespondToAnswerValidator(IUnitOfWork unitOfWork)
+        {
+            CascadeMode = CascadeMode.Stop;
+
+            RuleFor(x => x.Text).AnswerResponseTextValidate();
+            RuleFor(x => new AnswerInQuestionWithUidExistsDto(x.QuestionUid, x.AnswerUid)).SetValidator(new AnswerInQuestionWithUidExists(unitOfWork));
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Commands/Questioning/Validators/QuestioningFluentValidationRules.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -16,4 +16,9 @@
         }
 
+        public static IRuleBuilderOptions<T, string> AnswerResponseTextValidate<T>(this IRuleBuilder<T, string> ruleBuilder)
+        {
+            return ruleBuilder.NotNull().WithMessage(QuestioningErrorCodes.CantBeNull).MaximumLength(4000).WithMessage(QuestioningErrorCodes.AnswerResponseTextLengthInvalid);
+        }
+
         public static IRuleBuilderOptions<T, string> AnswerTextValidate<T>(this IRuleBuilder<T, string> ruleBuilder)
         {
Index: src/FinkiChattery/FinkiChattery.Contracts/Questioning/RespondToAnswer/AnswerResponseRequest.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Contracts/Questioning/RespondToAnswer/AnswerResponseRequest.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Contracts/Questioning/RespondToAnswer/AnswerResponseRequest.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,7 @@
+﻿namespace FinkiChattery.Contracts.Questioning
+{
+    public class AnswerResponseRequest
+    {
+        public string Text { get; set; }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Models/AnswerResponse.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Models/AnswerResponse.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Persistence/Models/AnswerResponse.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -1,7 +1,3 @@
 ﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace FinkiChattery.Persistence.Models
@@ -9,4 +5,9 @@
     public class AnswerResponse : BaseEntity
     {
+        public AnswerResponse() : base()
+        {
+            CreatedOn = DateTime.UtcNow;
+        }
+
         public string Text { get; set; }
 
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerResponseRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerResponseRepo.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IAnswerResponseRepo.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,8 @@
+﻿using FinkiChattery.Persistence.Models;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public interface IAnswerResponseRepo : IRepository<AnswerResponse>
+    {
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerResponseRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerResponseRepo.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/AnswerResponseRepo.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -0,0 +1,12 @@
+﻿using FinkiChattery.Persistence.Context;
+using FinkiChattery.Persistence.Models;
+
+namespace FinkiChattery.Persistence.Repositories
+{
+    public class AnswerResponseRepo : Repository<AnswerResponse>, IAnswerResponseRepo
+    {
+        public AnswerResponseRepo(ApplicationDbContext dbContext) : base(dbContext)
+        {
+        }
+    }
+}
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Contracts/IUnitOfWork.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -15,4 +15,5 @@
         ITeacherRepo Teachers { get; }
         IModeratorRepo Moderators { get; }
+        IAnswerResponseRepo AnswerResponses { get; }
         Task<int> SaveAsync();
     }
Index: src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 91bfcf410a3682811e194b56e2866d7c4cd5ac84)
+++ src/FinkiChattery/FinkiChattery.Persistence/UnitOfWork/Implementations/UnitOfWork.cs	(revision 68d02caf4319eccf561e8c0d8dd7188ab232094a)
@@ -16,8 +16,22 @@
         private ModeratorRepo _moderators;
         private TeacherRepo _teachers;
+        private AnswerResponseRepo _answerResponses;
 
         public UnitOfWork(ApplicationDbContext dbContext)
         {
             DbContext = dbContext;
+        }
+
+        public IAnswerResponseRepo AnswerResponses
+        {
+            get
+            {
+                if (_answerResponses == null)
+                {
+                    _answerResponses = new AnswerResponseRepo(DbContext);
+                }
+
+                return _answerResponses;
+            }
         }
 
