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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-facade.service.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -5,10 +5,16 @@
 import { catchError, filter, map } from 'rxjs/operators';
 
-import { PreviewQuestionsOrderEnum, PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
+import {
+  PreviewQuestionsOrderEnum,
+  PreviewQuestionViewModel,
+  QuestionStateViewModel,
+  SearchQuestionsQueryViewModel
+} from 'src/app/shared-app/models';
 import {
   EffectStartedWorking,
   GetPreviewQuestionsLatest,
   GetPreviewQuestionsPopular,
-  GetQuestionState
+  GetQuestionState,
+  GetSearchQuestions
 } from './question-state/question.actions';
 import { questionStateQuery } from './question-state/question.selectors';
@@ -43,4 +49,14 @@
   }
 
+  public getSearchQuestions(): Observable<PreviewQuestionViewModel[]> {
+    return this.store.select(questionStateQuery.getSearchQuestions);
+  }
+
+  public getSearchQuestionsQuery(): Observable<SearchQuestionsQueryViewModel> {
+    return this.store
+      .select(questionStateQuery.getSearchQuestionsQuery)
+      .pipe(filter((x: SearchQuestionsQueryViewModel | null): x is SearchQuestionsQueryViewModel => x !== null));
+  }
+
   public getPreviewQuestionsLatest(): Observable<PreviewQuestionViewModel[]> {
     return this.store.select(questionStateQuery.getPreviewQuestionsLatest);
@@ -63,4 +79,8 @@
   }
 
+  public searchQuestions(searchText: string, categories: string[]): void {
+    this.dispatchEffect(new GetSearchQuestions(searchText, categories));
+  }
+
   private fetchPreviewQuestionsLatest(): void {
     this.dispatchEffect(new GetPreviewQuestionsLatest());
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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.actions.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -2,6 +2,5 @@
 import { Action } from '@ngrx/store';
 
-import { PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
-import { PreviewQuestionResponse } from './question-state.models';
+import { PreviewQuestionViewModel, QuestionStateViewModel, SearchQuestionsQueryViewModel } from 'src/app/shared-app/models';
 
 export enum QuestionActionTypes {
@@ -12,4 +11,6 @@
   GetPreviewQuestionsPopular = '[Question] Get preview questions Popular',
   GetPreviewQuestionsPopularSuccess = '[Question] Get preview questions Popular Success',
+  GetSearchQuestions = '[Question] Get search questions',
+  GetSearchQuestionsSuccess = '[Question] Get search questions Success',
   EffectStartedWorking = '[Question] Effect Started Working',
   EffectFinishedWorking = '[Question] Effect Finished Working',
@@ -53,4 +54,16 @@
 }
 
+export class GetSearchQuestions implements Action {
+  readonly type = QuestionActionTypes.GetSearchQuestions;
+
+  constructor(public searchText: string, public categories: string[]) {}
+}
+
+export class GetSearchQuestionsSuccess implements Action {
+  readonly type = QuestionActionTypes.GetSearchQuestionsSuccess;
+
+  constructor(public payload: PreviewQuestionViewModel[], public query: SearchQuestionsQueryViewModel) {}
+}
+
 export class EffectStartedWorking implements Action {
   readonly type = QuestionActionTypes.EffectStartedWorking;
@@ -75,4 +88,5 @@
   | GetPreviewQuestionsLatestSuccess
   | GetPreviewQuestionsPopularSuccess
+  | GetSearchQuestionsSuccess
   | 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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.effects.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -1,6 +1,6 @@
 import { Injectable } from '@angular/core';
-import { Actions, createEffect, ofType } from '@ngrx/effects';
-import { catchError, filter, switchMap, withLatestFrom } from 'rxjs/operators';
-import { PreviewQuestionsOrderEnum } from 'src/app/shared-app/models';
+import { act, Actions, createEffect, ofType } from '@ngrx/effects';
+import { catchError, filter, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators';
+import { PreviewQuestionsOrderEnum, SearchQuestionsQueryViewModel } from 'src/app/shared-app/models';
 import { TranslateFromJsonService } from 'src/app/shared-app/services';
 
@@ -11,8 +11,12 @@
   EffectFinishedWorking,
   EffectFinishedWorkingError,
+  GetPreviewQuestionsLatest,
   GetPreviewQuestionsLatestSuccess,
+  GetPreviewQuestionsPopular,
   GetPreviewQuestionsPopularSuccess,
   GetQuestionState,
   GetQuestionStateSuccess,
+  GetSearchQuestions,
+  GetSearchQuestionsSuccess,
   QuestionActionTypes
 } from './question.actions';
@@ -44,5 +48,5 @@
   getPreviewQuestionsLatest$ = createEffect(() => {
     return this.actions$.pipe(
-      ofType<GetQuestionState>(QuestionActionTypes.GetPreviewQuestionsLatest),
+      ofType<GetPreviewQuestionsLatest>(QuestionActionTypes.GetPreviewQuestionsLatest),
       withLatestFrom(this.facade.getPreviewQuestionsLatest()),
       filter(([action, questions]) => questions.length === 0),
@@ -61,5 +65,5 @@
   getPreviewQuestionsPopular$ = createEffect(() => {
     return this.actions$.pipe(
-      ofType<GetQuestionState>(QuestionActionTypes.GetPreviewQuestionsPopular),
+      ofType<GetPreviewQuestionsPopular>(QuestionActionTypes.GetPreviewQuestionsPopular),
       withLatestFrom(this.facade.getPreviewQuestionsPopular()),
       filter(([action, questions]) => questions.length === 0),
@@ -75,3 +79,24 @@
     );
   });
+
+  getSearchQuestions$ = createEffect(() => {
+    return this.actions$.pipe(
+      ofType<GetSearchQuestions>(QuestionActionTypes.GetSearchQuestions),
+      mergeMap((action) => {
+        const categoriesAsString = action.categories !== null ? action.categories.join(',') : '';
+        return this.api
+          .get<PreviewQuestionResponse[]>(`v1/questions/search?searchText=${action.searchText}&categories=${categoriesAsString}`)
+          .pipe(
+            switchMap((state) => [
+              new GetSearchQuestionsSuccess(
+                QuestionMapper.ToPreviwQuestionsViewModel(state, this.translate),
+                new SearchQuestionsQueryViewModel(action.searchText)
+              ),
+              new EffectFinishedWorking()
+            ]),
+            catchError((err) => [new EffectFinishedWorkingError(err)])
+          );
+      })
+    );
+  });
 }
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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.reducers.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -18,4 +18,10 @@
         ...state,
         previewQuestionsPopular: action.payload
+      };
+    case QuestionActionTypes.GetSearchQuestionsSuccess:
+      return {
+        ...state,
+        searchQuestions: action.payload,
+        searchQuestionsQuery: action.query
       };
     case QuestionActionTypes.EffectStartedWorking: {
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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.selectors.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -7,4 +7,6 @@
 const getPreviewQuestionsLatest = createSelector(getQuestionState, (state) => state.previewQuestionsLatest);
 const getPreviewQuestionsPopular = createSelector(getQuestionState, (state) => state.previewQuestionsPopular);
+const getSearchQuestions = createSelector(getQuestionState, (state) => state.searchQuestions);
+const getSearchQuestionsQuery = createSelector(getQuestionState, (state) => state.searchQuestionsQuery);
 const effectWorking = createSelector(getQuestionState, (state) => state.effectWorking);
 
@@ -13,4 +15,6 @@
   getQuestion,
   getPreviewQuestionsLatest,
-  getPreviewQuestionsPopular
+  getPreviewQuestionsPopular,
+  getSearchQuestions,
+  getSearchQuestionsQuery
 };
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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/core/state/question-state/question.state.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -1,4 +1,4 @@
 import { HttpErrorResponse } from '@angular/common/http';
-import { PreviewQuestionViewModel, QuestionStateViewModel } from 'src/app/shared-app/models';
+import { PreviewQuestionViewModel, QuestionStateViewModel, SearchQuestionsQueryViewModel } from 'src/app/shared-app/models';
 
 export const questionStateKey = 'question';
@@ -9,4 +9,6 @@
   previewQuestionsPopular: PreviewQuestionViewModel[];
   effectWorking: boolean | HttpErrorResponse;
+  searchQuestions: PreviewQuestionViewModel[];
+  searchQuestionsQuery: SearchQuestionsQueryViewModel | null;
 }
 
@@ -15,4 +17,6 @@
   previewQuestionsLatest: [],
   previewQuestionsPopular: [],
-  effectWorking: false
+  searchQuestions: [],
+  effectWorking: false,
+  searchQuestionsQuery: null
 };
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questioning-components.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questioning-components.ts	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questioning-components.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -2,8 +2,10 @@
 import { QuestioningGeneralComponent } from './questioning-general/questioning-general.component';
 import { QuestionsPreviewGeneralComponent } from './questions-preview-general/questions-preview-general.component';
+import { QuestionsSearchComponent } from './questions-search/questions-search.component';
 
 export const QUESTIONING_COMPONENTS: any[] = [
   QuestionPreviewGeneralComponent,
   QuestionsPreviewGeneralComponent,
-  QuestioningGeneralComponent
+  QuestioningGeneralComponent,
+  QuestionsSearchComponent
 ];
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.html	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.html	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -1,3 +1,3 @@
-<app-search-question></app-search-question>
+<app-search-question (searched)="routeToSearch()"></app-search-question>
 <div class="margin-x-lg">
   <h1 class="mat-headline">{{ 'questions-preview' | translate }}</h1>
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.ts	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-preview-general/questions-preview-general.component.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -36,3 +36,7 @@
     this.router.navigateByUrl(`questioning/${uid}`);
   }
+
+  routeToSearch(): void {
+    this.router.navigateByUrl(`questioning/search`);
+  }
 }
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.html	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.html	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -0,0 +1,9 @@
+<app-search-question></app-search-question>
+<div class="margin-x-lg">
+  <h1 class="mat-headline">{{ 'questions-search-title' | translate: { searchQuery: (searchQuestionsQuery$ | async)?.text } }}</h1>
+</div>
+<app-preview-question-display
+  *ngFor="let question of searchQuestions$ | async"
+  [question]="question"
+  (questionClicked)="goToQuestion(question.uid)"
+></app-preview-question-display>
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.spec.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.spec.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.spec.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { QuestionsSearchComponent } from './questions-search.component';
+
+describe('QuestionsSearchComponent', () => {
+  let component: QuestionsSearchComponent;
+  let fixture: ComponentFixture<QuestionsSearchComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ QuestionsSearchComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(QuestionsSearchComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/components/questions-search/questions-search.component.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -0,0 +1,22 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+
+import { QuestionFacadeService } from 'src/app/core/state/question-facade.service';
+
+@Component({
+  selector: 'app-questions-search',
+  templateUrl: './questions-search.component.html',
+  styleUrls: ['./questions-search.component.scss']
+})
+export class QuestionsSearchComponent implements OnInit {
+  searchQuestions$ = this.questionFacade.getSearchQuestions();
+  searchQuestionsQuery$ = this.questionFacade.getSearchQuestionsQuery();
+
+  constructor(private questionFacade: QuestionFacadeService, private router: Router) {}
+
+  ngOnInit(): void {}
+
+  goToQuestion(uid: string): void {
+    this.router.navigateByUrl(`questioning/${uid}`);
+  }
+}
Index: src/Clients/Angular/finki-chattery/src/app/modules/questioning/questioning.routes.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/modules/questioning/questioning.routes.ts	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/modules/questioning/questioning.routes.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -4,4 +4,5 @@
 import { QuestioningGeneralComponent } from './components/questioning-general/questioning-general.component';
 import { QuestionsPreviewGeneralComponent } from './components/questions-preview-general/questions-preview-general.component';
+import { QuestionsSearchComponent } from './components/questions-search/questions-search.component';
 
 const routes: Routes = [
@@ -14,4 +15,9 @@
         pathMatch: 'full',
         component: QuestionsPreviewGeneralComponent
+      },
+      {
+        path: 'search',
+        pathMatch: 'full',
+        component: QuestionsSearchComponent
       },
       {
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.html
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.html	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.html	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -11,5 +11,5 @@
       <mat-icon matSuffix>search</mat-icon>
     </mat-form-field>
-    <mat-form-field appearance="fill">
+    <mat-form-field class="full-width" appearance="fill">
       <mat-select
         [formControl]="questionCategoriesFormContor"
Index: src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.ts
===================================================================
--- src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.ts	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/components/question/search-question/search-question.component.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -1,6 +1,7 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, EventEmitter, OnInit, Output } from '@angular/core';
 import { FormControl, Validators } from '@angular/forms';
+
 import { CategoryFacadeService } from 'src/app/core/state/category-facade.service';
-import { CategoryStateViewModel } from 'src/app/shared-app/models';
+import { QuestionFacadeService } from 'src/app/core/state/question-facade.service';
 import { ButtonType } from '../../generic/button/button.models';
 
@@ -11,4 +12,6 @@
 })
 export class SearchQuestionComponent implements OnInit {
+  @Output() searched = new EventEmitter();
+
   ButtonType = ButtonType;
   questionSearchFormContor = new FormControl('', [Validators.required, Validators.maxLength(250)]);
@@ -16,5 +19,5 @@
   categories$ = this.categoriesFacade.getCategories();
 
-  constructor(private categoriesFacade: CategoryFacadeService) {}
+  constructor(private categoriesFacade: CategoryFacadeService, private questionsFacade: QuestionFacadeService) {}
 
   ngOnInit(): void {}
@@ -27,5 +30,6 @@
 
   public searchQuestions(): void {
-    alert('SEARCH');
+    this.questionsFacade.searchQuestions(this.questionSearchFormContor.value, this.questionCategoriesFormContor.value);
+    this.searched.emit();
   }
 }
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 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/app/shared-app/models/question-state-view-models.models.ts	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -69,2 +69,6 @@
   constructor(public uid: string, public text: string, public nameTranslated: string) {}
 }
+
+export class SearchQuestionsQueryViewModel {
+  constructor(public text: string) {}
+}
Index: src/Clients/Angular/finki-chattery/src/assets/translations/en.json
===================================================================
--- src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/Clients/Angular/finki-chattery/src/assets/translations/en.json	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -43,4 +43,5 @@
   "questions-preview-question-subtitle": "Asked on: {{date}}",
   "questions-preview-question-answers": "Answers",
-  "questions-preview-question-views": "Views"
+  "questions-preview-question-views": "Views",
+  "questions-search-title": "Search results for: {{searchQuery}}"
 }
Index: src/FinkiChattery/FinkiChattery.Api/Controllers/v1/QuestionsController.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Api/Controllers/v1/QuestionsController.cs	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/FinkiChattery/FinkiChattery.Api/Controllers/v1/QuestionsController.cs	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -35,5 +35,5 @@
         [HttpGet("{questionUid:Guid}")]
         [Authorize]
-        public async Task<IActionResult> GetQuestionState([FromRoute]Guid questionUid)
+        public async Task<IActionResult> GetQuestionState([FromRoute] Guid questionUid)
         {
             var questionDto = await MediatorService.SendQueryAsync(new GetQuestionStateQuery(questionUid));
@@ -48,4 +48,12 @@
             return Ok(questions.ToPreviewQuestionsResponse());
         }
+
+        [HttpGet("search")]
+        [Authorize(AuthenticationSchemes = IdentityServerAuthenticationDefaults.AuthenticationScheme, Policy = AuthenticationPolicy.Student)]
+        public async Task<IActionResult> SearchQuestions([FromQuery] string searchText, [FromQuery] string categories)
+        {
+            var questions = await MediatorService.SendQueryAsync(new SearchQuestionsQuery(searchText, categories));
+            return Ok(questions.ToPreviewQuestionsResponse());
+        }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Database/FullTextSearch/FullTextIndexQuestion.sql
===================================================================
--- src/FinkiChattery/FinkiChattery.Database/FullTextSearch/FullTextIndexQuestion.sql	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/FinkiChattery/FinkiChattery.Database/FullTextSearch/FullTextIndexQuestion.sql	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -1,3 +1,3 @@
 ﻿CREATE FULLTEXT INDEX ON [dbo].[Question] ([Search])
 KEY INDEX [PK_Question] ON [QuestionFullTextCatalog]
-WITH (CHANGE_TRACKING AUTO)
+WITH (CHANGE_TRACKING AUTO, STOPLIST OFF)
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Contracts/IQuestionRepo.cs	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -9,4 +9,6 @@
     public interface IQuestionRepo : IRepository<Question>
     {
+        Task<List<QuestionPreviewDto>> SearchQuestions(string searchText, IEnumerable<Guid> categories);
+
         Task<QuestionStateDto> GetQuestionState(Guid questionUid);
 
Index: src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs	(revision 466d1ac64f99c25e8b27cfba50cd766685313bb3)
+++ src/FinkiChattery/FinkiChattery.Persistence/Repositories/Implementations/QuestionRepo.cs	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -2,4 +2,5 @@
 using FinkiChattery.Persistence.Models;
 using FinkiChattery.Persistence.Repositories.Contracts;
+using Microsoft.Data.SqlClient;
 using Microsoft.EntityFrameworkCore;
 using System;
@@ -7,4 +8,5 @@
 using System.Linq;
 using System.Linq.Expressions;
+using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 
@@ -110,4 +112,36 @@
             return questionDto;
         }
+
+        public async Task<List<QuestionPreviewDto>> SearchQuestions(string searchText, IEnumerable<Guid> categories)
+        {
+            var search = Regex.Replace(searchText, "[\\\\/:*?\"<>\\]\\[|&'`~^=%,(){}_\\-]", " ")
+                                     .Split(" ".ToArray(), StringSplitOptions.RemoveEmptyEntries)
+                                     .Select(c => $"\"{c}*\"");
+
+            var searchString = string.Join(" AND ", search);
+
+            var rawQuery = (IQueryable<Question>)
+                DbSet.FromSqlRaw(@"
+                        SELECT [q].[Id], [q].[Uid], [q].[Title], [q].[Views], [q].[AnswersCount], [q].[CreatedOn] 
+                        FROM [dbo].[Question] AS [q]
+                        INNER JOIN CONTAINSTABLE(Question, Search, @searchString, 30) ccontains ON [q].[Id] = ccontains.[KEY]",
+                        new SqlParameter("searchString", searchString))
+                .Include(x => x.QuestionCategories).ThenInclude(x => x.Category);
+
+            if (categories.Any())
+            {
+                rawQuery = rawQuery.Where(x => x.QuestionCategories.Any(y => categories.Contains(y.Category.Uid)));
+            }
+
+            return await rawQuery
+                .Select(x => new QuestionPreviewDto(x.Id,
+                                    x.Uid,
+                                    x.Title,
+                                    x.Views,
+                                    x.AnswersCount,
+                                    x.CreatedOn,
+                                    x.QuestionCategories.Select(y => new QuestionPreviewCategoryDto(y.Id, y.Uid, y.Category.Name))))
+                .ToListAsync();
+        }
     }
 }
Index: src/FinkiChattery/FinkiChattery.Queries/Questioning/SearchQuestions/SearchQuestionsQuery.cs
===================================================================
--- src/FinkiChattery/FinkiChattery.Queries/Questioning/SearchQuestions/SearchQuestionsQuery.cs	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
+++ src/FinkiChattery/FinkiChattery.Queries/Questioning/SearchQuestions/SearchQuestionsQuery.cs	(revision a3b5f340b5cd8d0bc0af425cee25bcc1b79f26ef)
@@ -0,0 +1,54 @@
+﻿using FinkiChattery.Common.Mediator.Contracs;
+using FinkiChattery.Persistence.Repositories.Contracts;
+using FinkiChattery.Persistence.UnitOfWork;
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FinkiChattery.Queries.Questioning
+{
+    public class SearchQuestionsQuery : IQuery<List<QuestionPreviewDto>>
+    {
+        public SearchQuestionsQuery(string searchText, string categories)
+        {
+            SearchText = searchText;
+            Categories = categories;
+        }
+
+        public string SearchText { get; }
+        public string Categories { get; }
+    }
+
+    public class SearchQuestionsQueryHandler : IQueryHandler<SearchQuestionsQuery, List<QuestionPreviewDto>>
+    {
+        public SearchQuestionsQueryHandler(IUnitOfWork unitOfWork)
+        {
+            UnitOfWork = unitOfWork;
+        }
+
+        public IUnitOfWork UnitOfWork { get; }
+
+        public async Task<List<QuestionPreviewDto>> Handle(SearchQuestionsQuery request, CancellationToken cancellationToken)
+        {
+            if (string.IsNullOrEmpty(request.SearchText))
+            {
+                return new List<QuestionPreviewDto>();
+            }
+
+            var categories = new List<Guid>();
+            if (!string.IsNullOrEmpty(request.Categories))
+            {
+                foreach (var item in request.Categories.Split(","))
+                {
+                    if (Guid.TryParse(item, out Guid result))
+                    {
+                        categories.Add(result);
+                    }
+                }
+            }
+
+            return await UnitOfWork.Questions.SearchQuestions(request.SearchText, categories);
+        }
+    }
+}
