diff --git a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts
index f09533cfcbcdb05c2fe22f05ecef33f76f9367b6..320dd80334fc75b2bd707cae5e25bf2f7b518b23 100644
--- a/client/src/app/instance/store/effects/search-multiple.effects.spec.ts
+++ b/client/src/app/instance/store/effects/search-multiple.effects.spec.ts
@@ -11,6 +11,8 @@ import { SearchMultipleEffects } from './search-multiple.effects';
 import { SearchService } from '../services/search.service';
 import * as searchActions from '../actions/search.actions';
 import * as fromSearch from '../reducers/search.reducer';
+import * as fromSearchMultiple from '../reducers/search-multiple.reducer';
+import * as fromInstance from '../../../metamodel/reducers/instance.reducer';
 import * as datasetSelector from '../../../metamodel/selectors/dataset.selector';
 import * as searchSelector from '../selectors/search.selector';
 import * as attributeActions from '../../../metamodel/actions/attribute.actions';
@@ -32,7 +34,13 @@ describe('SearchMultipleEffects', () => {
     let searchService: SearchService;
     let toastr: ToastrService;
     let store: MockStore;
-    const initialState = { search: { ...fromSearch.initialState } };
+    const initialState = {
+        metamodel: { instance: { ...fromInstance.initialState }},
+        instance: {
+            search: {...fromSearch.initialState},
+            searchMultiple: {...fromSearchMultiple.initialState}
+        }
+    };
     let mockSearchMultipleSelectorSelectPristine;
     let mockSearchMultipleSelectorSelectSelectedDatasetsByRoute;
     let mockConeSearchSelectorSelectConeSearchByRoute;
@@ -43,10 +51,7 @@ describe('SearchMultipleEffects', () => {
         TestBed.configureTestingModule({
             providers: [
                 SearchMultipleEffects,
-                { provide: SearchService, useValue: {
-                        // retrieveData: jest.fn(),
-                        retrieveDataLength: jest.fn()
-                    }},
+                { provide: SearchService, useValue: { retrieveDataLength: jest.fn() }},
                 { provide: ToastrService, useValue: { error: jest.fn() }},
                 provideMockActions(() => actions),
                 provideMockStore({ initialState }),
@@ -66,43 +71,46 @@ describe('SearchMultipleEffects', () => {
         mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector(
             coneSearchSelector.selectConeSearchByRoute,''
         );
+        // mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector(
+        //     instanceSelector.selectInstanceByRouteName,{
+        //         name: 'myInstance',
+        //         label: 'My Instance',
+        //         data_path: 'data/path',
+        //         config: {
+        //             design: {
+        //                 design_color: 'green',
+        //                 design_background_color: 'darker green',
+        //                 design_logo: 'path/to/logo',
+        //                 design_favicon: 'path/to/favicon'
+        //             },
+        //             home: {
+        //                 home_component: 'HomeComponent',
+        //                 home_config: {
+        //                     home_component_text: 'Description',
+        //                     home_component_logo: 'path/to/logo'
+        //                 }
+        //             },
+        //             search: {
+        //                 search_by_criteria_allowed: true,
+        //                 search_by_criteria_label: 'Search',
+        //                 search_multiple_allowed: true,
+        //                 search_multiple_label: 'Search multiple',
+        //                 search_multiple_all_datasets_selected: true
+        //             },
+        //             documentation: {
+        //                 documentation_allowed: true,
+        //                 documentation_label: 'Documentation'
+        //             }
+        //         },
+        //         nb_dataset_families: 1,
+        //         nb_datasets: 2
+        //     }
+        // );
         mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector(
-            instanceSelector.selectInstanceByRouteName,{
-                name: 'myInstance',
-                label: 'My Instance',
-                data_path: 'data/path',
-                config: {
-                    design: {
-                        design_color: 'green',
-                        design_background_color: 'darker green',
-                        design_logo: 'path/to/logo',
-                        design_favicon: 'path/to/favicon'
-                    },
-                    home: {
-                        home_component: 'HomeComponent',
-                        home_config: {
-                            home_component_text: 'Description',
-                            home_component_logo: 'path/to/logo'
-                        }
-                    },
-                    search: {
-                        search_by_criteria_allowed: true,
-                        search_by_criteria_label: 'Search',
-                        search_multiple_allowed: true,
-                        search_multiple_label: 'Search multiple',
-                        search_multiple_all_datasets_selected: true
-                    },
-                    documentation: {
-                        documentation_allowed: true,
-                        documentation_label: 'Documentation'
-                    }
-                },
-                nb_dataset_families: 1,
-                nb_datasets: 2
-            }
+            instanceSelector.selectInstanceByRouteName,undefined
         );
         mockDatasetSelectorSelectAllConeSearchDatasets = store.overrideSelector(
-            searchSelector.selectOutputListByRoute,''
+            datasetSelector.selectAllConeSearchDatasets,[]
         );
     });
 
@@ -110,55 +118,14 @@ describe('SearchMultipleEffects', () => {
         expect(effects).toBeTruthy();
     });
 
-    describe('initSearch$ effect', () => {
+    describe.only('initSearch$ effect', () => {
         it('should dispatch the restartSearch action when dataset or cone search changed', () => {
             mockSearchMultipleSelectorSelectPristine = store.overrideSelector(
-                searchMultipleSelector.selectPristine,true
-            );
-            mockSearchMultipleSelectorSelectSelectedDatasetsByRoute = store.overrideSelector(
-                searchMultipleSelector.selectSelectedDatasetsByRoute,''
+                searchMultipleSelector.selectPristine,false
             );
             mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector(
                 coneSearchSelector.selectConeSearchByRoute,''
             );
-            mockInstanceSelectorSelectorSelectInstanceByRouteName = store.overrideSelector(
-                instanceSelector.selectInstanceByRouteName,{
-                    name: 'myInstance',
-                    label: 'My Instance',
-                    data_path: 'data/path',
-                    config: {
-                        design: {
-                            design_color: 'green',
-                            design_background_color: 'darker green',
-                            design_logo: 'path/to/logo',
-                            design_favicon: 'path/to/favicon'
-                        },
-                        home: {
-                            home_component: 'HomeComponent',
-                            home_config: {
-                                home_component_text: 'Description',
-                                home_component_logo: 'path/to/logo'
-                            }
-                        },
-                        search: {
-                            search_by_criteria_allowed: true,
-                            search_by_criteria_label: 'Search',
-                            search_multiple_allowed: true,
-                            search_multiple_label: 'Search multiple',
-                            search_multiple_all_datasets_selected: true
-                        },
-                        documentation: {
-                            documentation_allowed: true,
-                            documentation_label: 'Documentation'
-                        }
-                    },
-                    nb_dataset_families: 1,
-                    nb_datasets: 2
-                }
-            );
-            mockDatasetSelectorSelectAllConeSearchDatasets = store.overrideSelector(
-                searchSelector.selectOutputListByRoute,''
-            );
 
             const action = searchMultipleActions.initSearch();
             actions = hot('-a', { a: action });
@@ -170,6 +137,21 @@ describe('SearchMultipleEffects', () => {
             expect(effects.initSearch$).toBeObservable(expected);
         });
 
+        it('should not dispatch action when default form parameters already loaded or no dataset selected', () => {
+            mockSearchMultipleSelectorSelectPristine = store.overrideSelector(
+                searchMultipleSelector.selectPristine,false
+            );
+            mockConeSearchSelectorSelectConeSearchByRoute = store.overrideSelector(
+                coneSearchSelector.selectConeSearchByRoute,'1:2:3'
+            );
+
+            const action = searchMultipleActions.initSearch();
+            actions = hot('-a', { a: action });
+            const expected = cold('-b', { b: { type: '[No Action] Load Default Form Parameters' } });
+
+            expect(effects.initSearch$).toBeObservable(expected);
+        });
+
     //     it('should dispatch a bunch of actions when a dataset is selected or a page is reloaded', () => {
     //         mockDatasetSelectorSelectDatasetNameByRoute = store.overrideSelector(
     //             datasetSelector.selectDatasetNameByRoute, 'myDatasetName'
diff --git a/client/src/app/instance/store/effects/search-multiple.effects.ts b/client/src/app/instance/store/effects/search-multiple.effects.ts
index 8fd7a53c3b63b22bcd960f4016cb002cd33d69ad..2cd1eeab2499f9ad5e1ca91ba7d6dfda8768c8f1 100644
--- a/client/src/app/instance/store/effects/search-multiple.effects.ts
+++ b/client/src/app/instance/store/effects/search-multiple.effects.ts
@@ -41,16 +41,16 @@ export class SearchMultipleEffects {
                 this.store.select(datasetSelector.selectAllConeSearchDatasets)
             ]),
             mergeMap(([action, pristine, coneSearchByRoute, selectedDatasetsByRoute, instance, datasetList]) => {
+                // Restart search
                 if (!pristine && !coneSearchByRoute) {
-                    // Restart search
                     return [
                         coneSearchActions.deleteConeSearch(),
                         searchMultipleActions.restartSearch()
                     ];
                 }
 
+                // Default form parameters already loaded or no dataset selected
                 if (!pristine) {
-                    // Default form parameters already loaded or no dataset selected
                     return of({ type: '[No Action] Load Default Form Parameters' });
                 }
 
diff --git a/client/src/app/instance/store/models/criterion.model.ts b/client/src/app/instance/store/models/criterion.model.ts
index a6118e881162183a5c5bcbf1a4b63b5ad72ec2e9..95f9d974ce488501c9af3e0b868c91b3be1f2ac8 100644
--- a/client/src/app/instance/store/models/criterion.model.ts
+++ b/client/src/app/instance/store/models/criterion.model.ts
@@ -17,8 +17,9 @@ import {
 import { Attribute } from 'src/app/metamodel/models';
 
 /**
- * @class
- * @classdesc Criterion class.
+ * Interface for criterion.
+ *
+ * @interface Criterion
  */
 export interface Criterion {
     id: number;
diff --git a/client/src/app/instance/store/models/criterion/select-multiple-criterion.model.ts b/client/src/app/instance/store/models/criterion/select-multiple-criterion.model.ts
index 90fc0ae7499ea8d2f68ba3571503474e74a18532..e1da198fb35d9069df0126c9d1abb91439a8fae9 100644
--- a/client/src/app/instance/store/models/criterion/select-multiple-criterion.model.ts
+++ b/client/src/app/instance/store/models/criterion/select-multiple-criterion.model.ts
@@ -11,10 +11,9 @@ import { Criterion } from '../criterion.model';
 import { Option } from 'src/app/metamodel/models/option.model';
 
 /**
- * @class
- * @classdesc Select multiple criterion class.
+ * Interface for select multiple criterion.
  *
- * @implements Criterion
+ * @interface SelectMultipleCriterion
  */
 export interface SelectMultipleCriterion extends Criterion {
     id: number;
diff --git a/client/src/app/instance/store/models/search-multiple-dataset-data.ts b/client/src/app/instance/store/models/search-multiple-dataset-data.ts
index fa25ed88176093d7840cdd984c476aed52b25ed3..0f3d0d86928cb33b5ca735f14aea4fc281b1d4da 100644
--- a/client/src/app/instance/store/models/search-multiple-dataset-data.ts
+++ b/client/src/app/instance/store/models/search-multiple-dataset-data.ts
@@ -7,6 +7,11 @@
  * file that was distributed with this source code.
  */
 
+/**
+ * Interface for search multiple data.
+ *
+ * @interface SearchMultipleDatasetData
+ */
 export interface SearchMultipleDatasetData {
     datasetName: string;
     data: any[];
diff --git a/client/src/app/instance/store/models/search-multiple-dataset-length.ts b/client/src/app/instance/store/models/search-multiple-dataset-length.ts
index 75961a0d5c68acd8878099d32715c9a4c9143242..73a3e0de377302eeefc85bbd15f42be7a7882c46 100644
--- a/client/src/app/instance/store/models/search-multiple-dataset-length.ts
+++ b/client/src/app/instance/store/models/search-multiple-dataset-length.ts
@@ -7,6 +7,11 @@
  * file that was distributed with this source code.
  */
 
+/**
+ * Interface for search multiple data length.
+ *
+ * @interface SearchMultipleDatasetLength
+ */
 export interface SearchMultipleDatasetLength {
     datasetName: string;
     length: number;
diff --git a/client/src/app/instance/store/reducers/search-multiple.reducer.spec.ts b/client/src/app/instance/store/reducers/search-multiple.reducer.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5e3ce85eec3702448d7061a4d49d6d11bc0254a9
--- /dev/null
+++ b/client/src/app/instance/store/reducers/search-multiple.reducer.spec.ts
@@ -0,0 +1,363 @@
+import { Action } from '@ngrx/store';
+
+import * as fromSearchMultiple from './search-multiple.reducer';
+import * as searchMultipleActions from '../actions/search-multiple.actions';
+import { SearchMultipleDatasetData, SearchMultipleDatasetLength } from '../models';
+
+describe('SearchMultiple reducer', () => {
+    it('unknown action should return the default state', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = { type: 'Unknown' };
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state).toBe(initialState);
+    });
+
+    it('restartSearch action should set currentStep to \'position\'', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = searchMultipleActions.restartSearch();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toEqual('position');
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('changeStep action should change the currentStep', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = searchMultipleActions.changeStep({ step: 'myStep' });
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toEqual('myStep');
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('markAsDirty action should set pristine to false', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = searchMultipleActions.markAsDirty();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeFalsy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('checkDatasets action should set datasetsStepChecked to true', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = searchMultipleActions.checkDatasets();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeTruthy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('checkResult action should set resultStepChecked to true', () => {
+        const { initialState } = fromSearchMultiple;
+        const action = searchMultipleActions.checkResult();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeTruthy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('updateSelectedDatasets action should set selectedDatasets', () => {
+        const { initialState } = fromSearchMultiple;
+        const selectedDatasets: string[] = ['myDataset'];
+        const action = searchMultipleActions.updateSelectedDatasets({ selectedDatasets });
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(1);
+        expect(state.selectedDatasets).toEqual(selectedDatasets);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveDataLength action should set dataLengthIsLoading to true and dataLengthIsLoaded to false', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataLengthIsLoaded: true
+        };
+        const action = searchMultipleActions.retrieveDataLength();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeTruthy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveDataLengthSuccess action should set dataLength, set dataLengthIsLoading to true and dataLengthIsLoaded to false', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataLengthIsLoading: true
+        };
+        const dataLength: SearchMultipleDatasetLength[] = [{ datasetName: 'myDataset', length: 1 }];
+        const action = searchMultipleActions.retrieveDataLengthSuccess({ dataLength });
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeTruthy();
+        expect(state.dataLength.length).toEqual(1);
+        expect(state.dataLength).toEqual(dataLength);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveDataLengthFail action should set dataLengthIsLoading to false', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataLengthIsLoading: true
+        };
+        const action = searchMultipleActions.retrieveDataLengthFail();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveData action should set dataIsLoading to true and dataIsLoaded to false', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataIsLoaded: true
+        };
+        const action = searchMultipleActions.retrieveData();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeTruthy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveDataSuccess action should set data, set dataIsLoading to false and dataIsLoaded to true', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataIsLoading: true
+        };
+        const data: SearchMultipleDatasetData[] = [{ datasetName: 'myDataset', data: ['myData'] }];
+        const action = searchMultipleActions.retrieveDataSuccess({ data });
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeTruthy();
+        expect(state.data.length).toEqual(1);
+        expect(state.data).toEqual(data);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('retrieveDataFail action should set dataIsLoading to false', () => {
+        const initialState = {
+            ...fromSearchMultiple.initialState,
+            dataIsLoading: true
+        };
+        const action = searchMultipleActions.retrieveDataFail();
+        const state = fromSearchMultiple.searchMultipleReducer(initialState, action);
+
+        expect(state.pristine).toBeTruthy();
+        expect(state.currentStep).toBeNull();
+        expect(state.positionStepChecked).toBeFalsy();
+        expect(state.datasetsStepChecked).toBeFalsy();
+        expect(state.resultStepChecked).toBeFalsy();
+        expect(state.selectedDatasets.length).toEqual(0);
+        expect(state.dataLengthIsLoading).toBeFalsy();
+        expect(state.dataLengthIsLoaded).toBeFalsy();
+        expect(state.dataLength.length).toEqual(0);
+        expect(state.dataIsLoading).toBeFalsy();
+        expect(state.dataIsLoaded).toBeFalsy();
+        expect(state.data.length).toEqual(0);
+        expect(state).not.toBe(initialState);
+    });
+
+    it('should get pristine', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectPristine(state)).toBeTruthy();
+    });
+
+    it('should get currentStep', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectCurrentStep(state)).toBeNull();
+    });
+
+    it('should get positionStepChecked', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectPositionStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get datasetsStepChecked', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDatasetsStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get resultStepChecked', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectResultStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get selectedDatasets', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectSelectedDatasets(state).length).toEqual(0);
+    });
+
+    it('should get dataLengthIsLoading', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDataLengthIsLoading(state)).toBeFalsy();
+    });
+
+    it('should get dataLengthIsLoaded', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDataLengthIsLoaded(state)).toBeFalsy();
+    });
+
+    it('should get dataLength', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDataLength(state).length).toEqual(0);
+    });
+
+    it('should get dataIsLoading', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDataIsLoading(state)).toBeFalsy();
+    });
+
+    it('should get dataIsLoaded', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectDataIsLoaded(state)).toBeFalsy();
+    });
+
+    it('should get data', () => {
+        const action = {} as Action;
+        const state =  fromSearchMultiple.searchMultipleReducer(undefined, action);
+
+        expect(fromSearchMultiple.selectData(state).length).toEqual(0);
+    });
+});
diff --git a/client/src/app/instance/store/reducers/search-multiple.reducer.ts b/client/src/app/instance/store/reducers/search-multiple.reducer.ts
index bd73fbba1df15c2853d55d21157e8a7f30fb1dbb..d5cf3af087b2055e2b0caa99b846102e2c363ba2 100644
--- a/client/src/app/instance/store/reducers/search-multiple.reducer.ts
+++ b/client/src/app/instance/store/reducers/search-multiple.reducer.ts
@@ -12,9 +12,15 @@ import { createReducer, on } from '@ngrx/store';
 import { SearchMultipleDatasetLength, SearchMultipleDatasetData } from '../models';
 import * as searchMultipleActions from '../actions/search-multiple.actions';
 
+/**
+ * Interface for search multiple state.
+ *
+ * @interface State
+ */
 export interface State {
     pristine: boolean;
     currentStep: string;
+    // TODO: remove unused positionStepChecked variable
     positionStepChecked: boolean;
     datasetsStepChecked: boolean;
     resultStepChecked: boolean;
diff --git a/client/src/app/instance/store/selectors/search-multiple.selector.spec.ts b/client/src/app/instance/store/selectors/search-multiple.selector.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5b21c4ac104900ee2b3b3beef6ad151141cf8007
--- /dev/null
+++ b/client/src/app/instance/store/selectors/search-multiple.selector.spec.ts
@@ -0,0 +1,115 @@
+import * as searchMultipleSelector from './search-multiple.selector';
+import * as fromSearchMultiple from '../reducers/search-multiple.reducer';
+import * as fromConeSearch from '../reducers/cone-search.reducer';
+import { ConeSearch } from '../models';
+
+describe('Search multiple selector', () => {
+    it('should get selectPristine', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectPristine(state)).toBeTruthy();
+    });
+
+    it('should get currentStep', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectCurrentStep(state)).toBeNull();
+    });
+
+    it('should get positionStepChecked', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectPositionStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get datasetsStepChecked', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDatasetsStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get resultStepChecked', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectResultStepChecked(state)).toBeFalsy();
+    });
+
+    it('should get selectedDatasets', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectSelectedDatasets(state).length).toEqual(0);
+    });
+
+    it('should get dataLengthIsLoading', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDataLengthIsLoading(state)).toBeFalsy();
+    });
+
+    it('should get dataLengthIsLoaded', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDataLengthIsLoaded(state)).toBeFalsy();
+    });
+
+    it('should get dataLength', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDataLength(state).length).toEqual(0);
+    });
+
+    it('should get dataIsLoading', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDataIsLoading(state)).toBeFalsy();
+    });
+
+    it('should get dataIsLoaded', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectDataIsLoaded(state)).toBeFalsy();
+    });
+
+    it('should get data', () => {
+        const state = { instance: { searchMultiple: { ...fromSearchMultiple.initialState }}};
+        expect(searchMultipleSelector.selectData(state).length).toEqual(0);
+    });
+
+    it('should get queryParams', () => {
+        const state = {
+            instance: {
+                searchMultiple: { ...fromSearchMultiple.initialState },
+                coneSearch: { ...fromConeSearch.initialState }
+            }
+        };
+        const expected = { };
+
+        expect(searchMultipleSelector.selectQueryParams(state)).toEqual(expected);
+    });
+
+    it('should get queryParams with cone search', () => {
+        const coneSearch: ConeSearch = { ra: 3, dec: 4, radius: 5 };
+        const state = {
+            instance: {
+                searchMultiple: { ...fromSearchMultiple.initialState },
+                coneSearch: {
+                    ...fromConeSearch.initialState,
+                    coneSearch
+                }
+            }
+        };
+        const expected = { cs: '3:4:5' };
+
+        expect(searchMultipleSelector.selectQueryParams(state)).toEqual(expected);
+    });
+
+    it('should get queryParams with datasets', () => {
+        const selectedDatasets: string[] = ['d1', 'd2'];
+        const state = {
+            instance: {
+                searchMultiple: {
+                    ...fromSearchMultiple.initialState,
+                    selectedDatasets
+                },
+                coneSearch: { ...fromConeSearch.initialState }
+            }
+        };
+        const expected = { d: 'd1;d2' };
+
+        expect(searchMultipleSelector.selectQueryParams(state)).toEqual(expected);
+    });
+
+    it('should get steps by route', () => {
+        const state = { router: { state: { queryParams: { d: 'd1;d2' }}}};
+        expect(searchMultipleSelector.selectSelectedDatasetsByRoute(state)).toEqual('d1;d2');
+    });
+});