Index: src/Clients/Angular/finki-chattery/src/app/core/core.module.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/core.module.ts	(revision 7f1a891c4cac6c184571b0dc9ee52304626637c9)
+++ src/Clients/Angular/finki-chattery/src/app/core/core.module.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -14,4 +14,6 @@
 import { reducers } from './state';
 import { TokenInterceptor } from './interceptors/token.interceptor';
+import { EffectsModule } from '@ngrx/effects';
+import { QuestionEffects } from './state/question-state/question.effects';
 
 @NgModule({
@@ -33,5 +35,6 @@
       maxAge: 25,
       logOnly: !environment.production
-    })
+    }),
+    EffectsModule.forRoot([QuestionEffects])
   ],
   exports: [HttpClientModule, COMPONENTS]
Index: src/Clients/Angular/finki-chattery/src/app/core/state/index.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/index.ts	(revision 7f1a891c4cac6c184571b0dc9ee52304626637c9)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/index.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -1,5 +1,11 @@
 import { ActionReducerMap } from '@ngrx/store';
+import { QuestionState } from './question-state/question.state';
+import { reducer as questionReducer } from './question-state/question.reducers';
 
-export interface State {}
+export interface State {
+  question: QuestionState;
+}
 
-export const reducers: ActionReducerMap<State, any> = {};
+export const reducers: ActionReducerMap<State, any> = {
+  question: questionReducer
+};
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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,50 @@
+import { HttpErrorResponse } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Action, Store } from '@ngrx/store';
+import { Observable, throwError } from 'rxjs';
+import { catchError, filter, map } from 'rxjs/operators';
+
+import { QuestionStateViewModel } from 'src/app/shared-app/models';
+import { EffectStartedWorking, GetQuestionState } from './question-state/question.actions';
+import { questionStateQuery } from './question-state/question.selectors';
+import { QuestionState } from './question-state/question.state';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class QuestionFacadeService {
+  effectWorking$: Observable<boolean | HttpErrorResponse>;
+  question$: Observable<QuestionStateViewModel>;
+
+  constructor(private store: Store<QuestionState>) {
+    this.question$ = this.store
+      .select(questionStateQuery.getQuestion)
+      .pipe(filter((x: QuestionStateViewModel | null): x is QuestionStateViewModel => x !== null));
+    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);
+      })
+    );
+  }
+
+  public fetchQuestion(questionUid: string): void {
+    this.dispatchEffect(new GetQuestionState(questionUid));
+  }
+
+  private dispatch(action: Action): void {
+    this.store.dispatch(action);
+  }
+
+  private dispatchEffect(action: Action): void {
+    this.dispatch(new EffectStartedWorking());
+    this.dispatch(action);
+  }
+}
Index: src/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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question-state.models.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,57 @@
+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;
+}
+
+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;
+}
+
+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;
+}
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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,44 @@
+import { HttpErrorResponse } from '@angular/common/http';
+import { Action } from '@ngrx/store';
+
+import { QuestionStateViewModel } from 'src/app/shared-app/models';
+
+export enum QuestionActionTypes {
+  GetQuestionState = '[Question] Get state',
+  GetQuestionStateSuccess = '[Question] Get state success',
+  EffectStartedWorking = '[Question] Effect Started Working',
+  EffectFinishedWorking = '[Question] Effect Finished Working',
+  EffectFinishedWorkingError = '[Question] Effect Finished Working error'
+}
+
+export class GetQuestionState implements Action {
+  readonly type = QuestionActionTypes.GetQuestionState;
+
+  constructor(public questionUid: string) {}
+}
+
+export class GetQuestionStateSuccess implements Action {
+  readonly type = QuestionActionTypes.GetQuestionStateSuccess;
+
+  constructor(public payload: QuestionStateViewModel) {}
+}
+
+export class EffectStartedWorking implements Action {
+  readonly type = QuestionActionTypes.EffectStartedWorking;
+
+  constructor() {}
+}
+
+export class EffectFinishedWorking implements Action {
+  readonly type = QuestionActionTypes.EffectFinishedWorking;
+
+  constructor() {}
+}
+
+export class EffectFinishedWorkingError implements Action {
+  readonly type = QuestionActionTypes.EffectFinishedWorkingError;
+
+  constructor(public payload: HttpErrorResponse) {}
+}
+
+export type QuestionAction = GetQuestionStateSuccess | EffectStartedWorking | EffectFinishedWorking | EffectFinishedWorkingError;
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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,33 @@
+import { Injectable } from '@angular/core';
+import { Actions, createEffect, ofType } from '@ngrx/effects';
+import { catchError, switchMap } from 'rxjs/operators';
+
+import { BaseApiService } from 'src/app/shared-app/services/base-api.service';
+import { QuestionStateResponse } from './question-state.models';
+import {
+  EffectFinishedWorking,
+  EffectFinishedWorkingError,
+  GetQuestionState,
+  GetQuestionStateSuccess,
+  QuestionActionTypes
+} from './question.actions';
+import { QuestionMapper } from './question.mapper';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class QuestionEffects {
+  constructor(private actions$: Actions, private api: BaseApiService) {}
+
+  getQuestionState$ = createEffect(() => {
+    return this.actions$.pipe(
+      ofType<GetQuestionState>(QuestionActionTypes.GetQuestionState),
+      switchMap((action) => {
+        return this.api.get<QuestionStateResponse>(`v1/questions/${action.questionUid}`).pipe(
+          switchMap((state) => [new GetQuestionStateSuccess(QuestionMapper.ToQuestionStateViewModel(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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.mapper.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,83 @@
+import * as moment from 'moment';
+import {
+  AnswerQuestionStateViewModel,
+  AnswerResponseQuestionStateViewModel,
+  AnswerResponseStudentQuestionStateViewModel,
+  AnswerStudentQuestionStateViewModel,
+  QuestionCategoryQuestionStateViewModel,
+  QuestionStateViewModel,
+  StudentQuestionStateViewModel,
+  TeamQuestionStateViewModel
+} from 'src/app/shared-app/models';
+import { QuestionStateResponse } from './question-state.models';
+
+export class QuestionMapper {
+  public static ToQuestionStateViewModel(questionStateResponse: QuestionStateResponse): QuestionStateViewModel {
+    let answers: AnswerQuestionStateViewModel[] = [];
+
+    if (questionStateResponse.answersResponse.length > 0) {
+      answers = questionStateResponse.answersResponse.map((x) => {
+        let answerResponses: AnswerResponseQuestionStateViewModel[] = [];
+
+        if (x.answerResponsesResponse.length > 0) {
+          answerResponses = x.answerResponsesResponse.map((y) => {
+            const answerResponseStudent = new AnswerResponseStudentQuestionStateViewModel(
+              y.studentResponse.uid,
+              y.studentResponse.index,
+              y.studentResponse.imageUrl
+            );
+
+            return new AnswerResponseQuestionStateViewModel(y.uid, y.text, moment(y.createdOn), answerResponseStudent);
+          });
+        }
+
+        const answerStudent = new AnswerStudentQuestionStateViewModel(
+          x.studentResponse.uid,
+          x.studentResponse.index,
+          x.studentResponse.imageUrl
+        );
+
+        return new AnswerQuestionStateViewModel(
+          x.uid,
+          x.text,
+          x.correctAnswer,
+          moment(x.createdOn),
+          x.upvotesCount,
+          answerStudent,
+          answerResponses
+        );
+      });
+    }
+
+    let categories: QuestionCategoryQuestionStateViewModel[] = [];
+
+    if (questionStateResponse.categoriesResponse.length > 0) {
+      categories = questionStateResponse.categoriesResponse.map((x) => new QuestionCategoryQuestionStateViewModel(x.uid, x.name));
+    }
+
+    let team: TeamQuestionStateViewModel | null = null;
+
+    if (questionStateResponse.teamResponse) {
+      team = new TeamQuestionStateViewModel(questionStateResponse.teamResponse.uid, questionStateResponse.teamResponse.name);
+    }
+
+    const student = new StudentQuestionStateViewModel(
+      questionStateResponse.studentResponse.uid,
+      questionStateResponse.studentResponse.index,
+      questionStateResponse.studentResponse.imageUrl
+    );
+
+    return new QuestionStateViewModel(
+      questionStateResponse.uid,
+      questionStateResponse.title,
+      questionStateResponse.text,
+      moment(questionStateResponse.createdOn),
+      questionStateResponse.views,
+      moment(questionStateResponse.lastActiveOn),
+      student,
+      answers,
+      categories,
+      team
+    );
+  }
+}
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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,38 @@
+import { QuestionAction, QuestionActionTypes } from './question.actions';
+import { initialState, QuestionState } from './question.state';
+
+export function reducer(state = initialState, action: QuestionAction): QuestionState {
+  switch (action.type) {
+    case QuestionActionTypes.GetQuestionStateSuccess:
+      return {
+        ...state,
+        question: action.payload
+      };
+    case QuestionActionTypes.EffectStartedWorking: {
+      return {
+        ...state,
+        effectWorking: true
+      };
+    }
+
+    case QuestionActionTypes.EffectFinishedWorking: {
+      return {
+        ...state,
+        effectWorking: false
+      };
+    }
+
+    case QuestionActionTypes.EffectFinishedWorkingError: {
+      return {
+        ...state,
+        effectWorking: action.payload
+      };
+    }
+
+    default: {
+      return {
+        ...state
+      };
+    }
+  }
+}
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.selectors.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.selectors.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.selectors.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,12 @@
+import { createFeatureSelector, createSelector } from '@ngrx/store';
+import { QuestionState, questionStateKey } from './question.state';
+
+export const getQuestionState = createFeatureSelector<QuestionState>(questionStateKey);
+
+const getQuestion = createSelector(getQuestionState, (state) => state.question);
+const effectWorking = createSelector(getQuestionState, (state) => state.effectWorking);
+
+export const questionStateQuery = {
+  effectWorking,
+  getQuestion
+};
Index: src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.state.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.state.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.state.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,14 @@
+import { HttpErrorResponse } from '@angular/common/http';
+import { QuestionStateViewModel } from 'src/app/shared-app/models';
+
+export const questionStateKey = 'question';
+
+export interface QuestionState {
+  question: QuestionStateViewModel | null;
+  effectWorking: boolean | HttpErrorResponse;
+}
+
+export const initialState: QuestionState = {
+  question: null,
+  effectWorking: false
+};
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/models/index.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/models/index.ts	(revision 7f1a891c4cac6c184571b0dc9ee52304626637c9)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/index.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -1,2 +1,3 @@
 export * from './error.models';
 export * from './user.models';
+export * from './question-state-view-models.models';
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 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts	(revision 6d639c9f163118ea8bedfe5620f64c92d2d3b36d)
@@ -0,0 +1,55 @@
+export class QuestionStateViewModel {
+  constructor(
+    public uid: string,
+    public title: string,
+    public text: string,
+    public createdOn: moment.Moment,
+    public views: number,
+    public lastActiveOn: moment.Moment,
+    public student: StudentQuestionStateViewModel,
+    public answers: AnswerQuestionStateViewModel[],
+    public categories: QuestionCategoryQuestionStateViewModel[],
+    public team: TeamQuestionStateViewModel | null
+  ) {}
+}
+
+export class StudentQuestionStateViewModel {
+  constructor(public uid: string, public index: string, public imageUrl: string) {}
+}
+
+export class TeamQuestionStateViewModel {
+  constructor(public uid: string, public name: string) {}
+}
+
+export class QuestionCategoryQuestionStateViewModel {
+  constructor(public uid: string, public name: string) {}
+}
+
+export class AnswerQuestionStateViewModel {
+  constructor(
+    public uid: string,
+    public text: string,
+    public correctAnswer: boolean,
+    public createdOn: moment.Moment,
+    public upvotesCount: number,
+    public student: AnswerStudentQuestionStateViewModel,
+    public answerResponses: AnswerResponseQuestionStateViewModel[]
+  ) {}
+}
+
+export class AnswerStudentQuestionStateViewModel {
+  constructor(public uid: string, public index: string, public imageUrl: string) {}
+}
+
+export class AnswerResponseQuestionStateViewModel {
+  constructor(
+    public uid: string,
+    public text: string,
+    public createdOn: moment.Moment,
+    public student: AnswerResponseStudentQuestionStateViewModel
+  ) {}
+}
+
+export class AnswerResponseStudentQuestionStateViewModel {
+  constructor(public uid: string, public index: string, public imageUrl: string) {}
+}
