diff --git a/common/constants.js b/common/constants.js
index 8c0565a7d88280f824b152e9920f1c207613e30c..69ffc91ca8e0e1ce6e4914b1e17d719a3edca3aa 100644
--- a/common/constants.js
+++ b/common/constants.js
@@ -62,6 +62,10 @@
   exports.CONST = {
     MULTI_REGION_SELECTION: `Multi region selection`,
     REGIONAL_FEATURES: 'Regional features',
-    NO_ADDIONTAL_INFO_AVAIL: `Currently, no additional information is linked to this region.`
+    NO_ADDIONTAL_INFO_AVAIL: `Currently, no additional information is linked to this region.`,
+
+    ATLAS_NOT_FOUND: `Atlas not found. Maybe it is still loading. Try again in a few seconds?`,
+    TEMPLATE_NOT_FOUND: `Template not found. Maybe it is still loading. Try again in a few seconds?`,
+    PARC_NOT_FOUND: ``
   }
 })(typeof exports === 'undefined' ? module.exports : exports)
diff --git a/src/atlasViewer/atlasViewer.apiService.service.ts b/src/atlasViewer/atlasViewer.apiService.service.ts
index 7277a3ebb7422137b55ea234b7d1b3db591baeab..d4872bb8221e35bd018b7d6e906c54979f788a25 100644
--- a/src/atlasViewer/atlasViewer.apiService.service.ts
+++ b/src/atlasViewer/atlasViewer.apiService.service.ts
@@ -5,6 +5,7 @@ import { Observable, Subject, Subscription, from, race, of, } from "rxjs";
 import { distinctUntilChanged, map, filter, startWith, switchMap, catchError, mapTo, take } from "rxjs/operators";
 import { DialogService } from "src/services/dialogService.service";
 import { uiStateMouseOverSegmentsSelector } from "src/services/state/uiState/selectors";
+import { viewerStateFetchedTemplatesSelector } from "src/services/state/viewerState/selectors";
 import {
   getLabelIndexMap,
   getMultiNgIdsRegionsLabelIndexMap,
@@ -197,9 +198,7 @@ export class AtlasViewerAPIServices implements OnDestroy{
     }
 
     this.loadedTemplates$ = this.store.pipe(
-      select('viewerState'),
-      safeFilter('fetchedTemplates'),
-      map(state => state.fetchedTemplates),
+      select(viewerStateFetchedTemplatesSelector)
     )
 
     this.selectParcellation$ = this.store.pipe(
diff --git a/src/atlasViewer/atlasViewer.history.service.ts b/src/atlasViewer/atlasViewer.history.service.ts
index c58aa5a5f32d4081e5e922cc0d1fa31188aa915b..6df36758a8d45a192a1d8f2ea79e7ab728075285 100644
--- a/src/atlasViewer/atlasViewer.history.service.ts
+++ b/src/atlasViewer/atlasViewer.history.service.ts
@@ -40,7 +40,7 @@ export class AtlasViewerHistoryUseEffect implements OnDestroy {
     )),
   ).pipe(
     withLatestFrom(this.store$),
-    map(([searchUrl, storeState]: [string, IavRootStoreInterface] ) => {
+    map(([searchUrl, storeState]: [string, any] ) => {
       const search = new URLSearchParams(searchUrl)
       try {
         if (Array.from(search.keys()).length === 0) {
@@ -75,6 +75,10 @@ export class AtlasViewerHistoryUseEffect implements OnDestroy {
               ...defaultRootState.viewerState,
               fetchedTemplates: storeState.viewerState.fetchedTemplates,
             },
+            viewerStateHelper: {
+              ...defaultRootState.viewerStateHelper,
+              fetchedAtlases: storeState.viewerStateHelper.fetchedAtlases
+            }
           },
         }
       }
diff --git a/src/main.module.ts b/src/main.module.ts
index 06c2a92305d7213bf957698a7c9710827caa905e..7dbd23fa58c4521f5cfd915bbfe618500027fa86 100644
--- a/src/main.module.ts
+++ b/src/main.module.ts
@@ -1,8 +1,8 @@
 import { DragDropModule } from '@angular/cdk/drag-drop'
 import { CommonModule } from "@angular/common";
-import { CUSTOM_ELEMENTS_SCHEMA, NgModule, InjectionToken } from "@angular/core";
+import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from "@angular/core";
 import { FormsModule } from "@angular/forms";
-import { StoreModule, Store, ActionReducer } from "@ngrx/store";
+import { StoreModule, ActionReducer } from "@ngrx/store";
 import { AngularMaterialModule } from 'src/ui/sharedModules/angularMaterial.module'
 import { AtlasViewer } from "./atlasViewer/atlasViewer.component";
 import { ComponentsModule } from "./components/components.module";
@@ -54,11 +54,9 @@ import 'src/res/css/extra_styles.css'
 import 'src/res/css/version.css'
 import 'src/theme.scss'
 import { DatasetPreviewGlue, datasetPreviewMetaReducer, IDatasetPreviewGlue, GlueEffects, ClickInterceptorService } from './glue';
-import { viewerStateHelperReducer, viewerStateFleshOutDetail, viewerStateMetaReducers, ViewerStateHelperEffect } from './services/state/viewerState.store.helper';
+import { viewerStateHelperReducer, viewerStateMetaReducers, ViewerStateHelperEffect } from './services/state/viewerState.store.helper';
 import { TOS_OBS_INJECTION_TOKEN } from './ui/kgtos/kgtos.component';
 import { UiEffects } from './services/state/uiState/ui.effects';
-import { OVERWRITE_SHOW_DATASET_DIALOG_TOKEN, TOverwriteShowDatasetDialog } from './util/interfaces';
-import { uiActionShowDatasetWtihId } from './services/state/uiState/actions';
 
 export function debug(reducer: ActionReducer<any>): ActionReducer<any> {
   return function(state, action) {
@@ -115,7 +113,6 @@ export function debug(reducer: ActionReducer<any>): ActionReducer<any> {
         // debug,
         ...viewerStateMetaReducers,
         datasetPreviewMetaReducer,
-        viewerStateFleshOutDetail
       ]
     }),
     HttpClientModule,
diff --git a/src/services/state/uiState/ui.effects.ts b/src/services/state/uiState/ui.effects.ts
index 2f9287652937e0d517e59c1ebfc939f61b56e211..128655ad53c9ec87a3655dc4da19f336ab4f918a 100644
--- a/src/services/state/uiState/ui.effects.ts
+++ b/src/services/state/uiState/ui.effects.ts
@@ -1,4 +1,5 @@
 import { Injectable, OnDestroy } from "@angular/core";
+import { MatSnackBar } from "@angular/material/snack-bar";
 import { Actions, ofType } from "@ngrx/effects";
 import { Subscription } from "rxjs";
 import { generalActionError } from "src/services/stateStore.helper";
@@ -11,11 +12,17 @@ export class UiEffects implements OnDestroy{
 
   private subscriptions: Subscription[] = []
 
-  constructor(private actions$: Actions){
+  constructor(
+    private actions$: Actions,
+    snackBar: MatSnackBar
+  ){
     this.subscriptions.push(
       this.actions$.pipe(
         ofType(generalActionError.type)
-      ).subscribe(console.log)
+      ).subscribe((payload: any) => {
+        if (!payload.message) console.log(payload)
+        snackBar.open(payload.message || `Error: cannot complete your action.`, 'Dismiss', { duration: 5000 })
+      })
     )
   }
 
diff --git a/src/services/state/viewerState.store.helper.ts b/src/services/state/viewerState.store.helper.ts
index 307ea047fd31479f533094505faa96a56c3a64a4..8bfe2d676df861a97eb62a58259b877f4a6bd4d9 100644
--- a/src/services/state/viewerState.store.helper.ts
+++ b/src/services/state/viewerState.store.helper.ts
@@ -153,16 +153,6 @@ export const viewerStateHelperReducer = createReducer(
 
 export const viewerStateHelperStoreName = 'viewerStateHelper'
 
-export function viewerStateFleshOutDetail(reducer: ActionReducer<any>): ActionReducer<any> {
-  return (state, action) => {
-    if (action.type === viewerStateSelectAtlas.type) {
-      const reconstitutedAtlas = state[viewerStateHelperStoreName].fetchedAtlases.find(a => a['@id'] === (action as any).atlas['@id'])
-      return reducer(state, { type: action.type, atlas: reconstitutedAtlas } as any)
-    }
-    return reducer(state, action)
-  }
-}
-
 export const defaultState = initialState
 
 interface IVersion{
diff --git a/src/services/state/viewerState.store.ts b/src/services/state/viewerState.store.ts
index b28168b9e76ef0ed84a12aec010de6b5354c9b1d..36435f358d7f101f7881b97170d0b38fc8260432 100644
--- a/src/services/state/viewerState.store.ts
+++ b/src/services/state/viewerState.store.ts
@@ -87,32 +87,6 @@ export const defaultState: StateInterface = {
 
 export const getStateStore = ({ state = defaultState } = {}) => (prevState: Partial<StateInterface> = state, action: ActionInterface) => {
   switch (action.type) {
-  /**
-   * glue code. in future, viewerStateSelectAtlas should load templates and parcellations by it self
-   */
-  case viewerStateSelectAtlas.type: {
-    const { fetchedTemplates } = prevState
-    /**
-     * selecting atlas means selecting the first available templateSpace
-     */
-    const atlas = (action as any).atlas
-    const templateTobeSelected = atlas.templateSpaces[0]
-    const templateSpaceId = templateTobeSelected['@id']
-    
-    const parcellationId = (
-      templateTobeSelected.availableIn.find(p => !!p.baseLayer) ||
-      templateTobeSelected.availableIn[0]
-    )['@id']
-      
-    const templateSelected = fetchedTemplates.find(t => templateSpaceId === t['@id'])
-    const parcellationSelected = templateSelected.parcellations.find(p => p['@id'] === parcellationId)
-    
-    return {
-      ...prevState,
-      templateSelected,
-      parcellationSelected
-    }
-  }
   /**
      * TODO may be obsolete. test when nifti become available
      */
diff --git a/src/services/state/viewerState/selectors.ts b/src/services/state/viewerState/selectors.ts
index 934f6e003573d0b0955a3ac613d7da3e1261fd15..bb2bd592e782891df9f03398a7bf3171314270bc 100644
--- a/src/services/state/viewerState/selectors.ts
+++ b/src/services/state/viewerState/selectors.ts
@@ -40,6 +40,7 @@ export const viewerStateSelectedTemplatePureSelector = createSelector(
   viewerStateFetchedTemplatesSelector,
   viewerStateSelectedTemplateSelector,
   (fetchedTemplates, selectedTemplate) => {
+    if (!selectedTemplate) return null
     return fetchedTemplates.find(t => t['@id'] === selectedTemplate['@id'])
   }
 )
@@ -98,12 +99,17 @@ export const viewerStateGetOverlayingAdditionalParcellations = createSelector(
   }
 )
 
+export const viewerStateFetchedAtlasesSelector = createSelector(
+  state => state[viewerStateHelperStoreName],
+  helperState => helperState['fetchedAtlases']
+)
 
 export const viewerStateGetSelectedAtlas = createSelector(
   state => state[viewerStateHelperStoreName],
   helperState => {
     if (!helperState) return null
     const { selectedAtlasId, fetchedAtlases } = helperState
+    if (!selectedAtlasId) return null
     return selectedAtlasId && fetchedAtlases.find(a => a['@id'] === selectedAtlasId)
   }
 )
@@ -132,7 +138,7 @@ export const viewerStateAtlasParcellationSelector = createSelector(
 
 export const viewerStateAtlasLatestParcellationSelector = createSelector(
   viewerStateAtlasParcellationSelector,
-  parcs => parcs.filter( p => !p['@version'] || !p['@version']['@next'])
+  parcs => (parcs && parcs.filter( p => !p['@version'] || !p['@version']['@next']) || [])
 )
 
 export const viewerStateParcVersionSelector = createSelector(
@@ -178,12 +184,16 @@ export const viewerStateParcVersionSelector = createSelector(
 export const viewerStateSelectedTemplateFullInfoSelector = createSelector(
   viewerStateGetSelectedAtlas,
   viewerStateFetchedTemplatesSelector,
-  ({ templateSpaces }, fetchedTemplates) => templateSpaces.map(templateSpace => {
-    const fullTemplateInfo = fetchedTemplates.find(t => t['@id'] === templateSpace['@id'])
-    return {
-      ...templateSpace,
-      ...(fullTemplateInfo || {}),
-      darktheme: (fullTemplateInfo || {}).useTheme === 'dark'
-    }
-  })
+  (selectedAtlas, fetchedTemplates) => {
+    if (!selectedAtlas) return null
+    const { templateSpaces } = selectedAtlas
+    return templateSpaces.map(templateSpace => {
+      const fullTemplateInfo = fetchedTemplates.find(t => t['@id'] === templateSpace['@id'])
+      return {
+        ...templateSpace,
+        ...(fullTemplateInfo || {}),
+        darktheme: (fullTemplateInfo || {}).useTheme === 'dark'
+      }
+    })
+  } 
 )
diff --git a/src/ui/nehubaContainer/splashScreen/splashScreen.component.ts b/src/ui/nehubaContainer/splashScreen/splashScreen.component.ts
index 7e8fcac094bf7a344ee63ca0b9bcd8d52c5c0551..585083536b64287853ba3166840b32bb07021007 100644
--- a/src/ui/nehubaContainer/splashScreen/splashScreen.component.ts
+++ b/src/ui/nehubaContainer/splashScreen/splashScreen.component.ts
@@ -82,7 +82,7 @@ export class SplashScreen implements AfterViewInit {
      */
     this.subscriptions.push(
       fromEvent(this.parentContainer.nativeElement, 'mousedown').pipe(
-        filter((ev: MouseEvent) => ev.which === 1),
+        filter((ev: MouseEvent) => ev.button === 0),
         switchMap(() => fromEvent(this.parentContainer.nativeElement, 'mouseup').pipe(
           bufferTime(200),
           take(1),
diff --git a/src/ui/viewerStateController/viewerState.useEffect.spec.ts b/src/ui/viewerStateController/viewerState.useEffect.spec.ts
index d720dfa2c33a0b095aa5a69332d6cf155209501f..b38a7db90370f82ebe1c53b4811cefb053e0555a 100644
--- a/src/ui/viewerStateController/viewerState.useEffect.spec.ts
+++ b/src/ui/viewerStateController/viewerState.useEffect.spec.ts
@@ -3,7 +3,7 @@ import { Observable, of } from 'rxjs'
 import { TestBed, async } from '@angular/core/testing'
 import { provideMockActions } from '@ngrx/effects/testing'
 import { MockStore, provideMockStore } from '@ngrx/store/testing'
-import { defaultRootState, generalActionError, NEWVIEWER } from 'src/services/stateStore.service'
+import { defaultRootState, generalActionError } from 'src/services/stateStore.service'
 import { Injectable } from '@angular/core'
 import { TemplateCoordinatesTransformation, ITemplateCoordXformResp } from 'src/services/templateCoordinatesTransformation.service'
 import { hot } from 'jasmine-marbles'
@@ -11,7 +11,9 @@ import { AngularMaterialModule } from '../sharedModules/angularMaterial.module'
 import { HttpClientModule } from '@angular/common/http'
 import { WidgetModule } from 'src/widget'
 import { PluginModule } from 'src/atlasViewer/pluginUnit/plugin.module'
-import { viewerStateNavigateToRegion, viewerStateNavigationStateSelector, viewerStateNewViewer, viewerStateSelectTemplateWithName } from 'src/services/state/viewerState.store.helper'
+import { viewerStateFetchedTemplatesSelector, viewerStateNavigateToRegion, viewerStateNavigationStateSelector, viewerStateNewViewer, viewerStateSelectAtlas, viewerStateSelectTemplateWithName } from 'src/services/state/viewerState.store.helper'
+import { viewerStateFetchedAtlasesSelector } from 'src/services/state/viewerState/selectors'
+import { CONST } from 'common/constants'
 
 const bigbrainJson = require('!json-loader!src/res/ext/bigbrain.json')
 const bigBrainNehubaConfig = require('!json-loader!src/res/ext/bigbrainNehubaConfig.json')
@@ -346,6 +348,121 @@ describe('> viewerState.useEffect.ts', () => {
         })
       })
     })
+  
+    describe('> onSelectAtlasSelectTmplParc$', () => {
+      let mockStore: MockStore
+      beforeEach(() => {
+        mockStore = TestBed.inject(MockStore)
+      })
+
+      it('> if atlas not found, return general error', () => {
+        mockStore.overrideSelector(viewerStateFetchedTemplatesSelector, [])
+        mockStore.overrideSelector(viewerStateFetchedAtlasesSelector, [])
+        actions$ = hot('a', {
+          a: viewerStateSelectAtlas({
+            atlas: {
+              ['@id']: 'foo-bar',
+            }
+          })
+        })
+        
+        const viewerSTateCtrlEffect = TestBed.inject(ViewerStateControllerUseEffect)
+        expect(
+          viewerSTateCtrlEffect.onSelectAtlasSelectTmplParc$
+        ).toBeObservable(
+          hot('a', {
+            a: generalActionError({
+              message: CONST.ATLAS_NOT_FOUND
+            })
+          })
+        )
+      })
+    
+      describe('> if atlas found, will try to find id of first template', () => {
+        const mockParc1 = {
+          ['@id']: 'parc-1',
+          availableIn: [{
+            ['@id']: 'test-1'
+          }]
+        }
+        const mockParc0 = {
+          ['@id']: 'parc-0',
+          availableIn: [{
+            ['@id']: 'hello world'
+          }]
+        }
+        const mockTmplSpc = {
+          ['@id']: 'hello world',
+          availableIn: [ mockParc0 ]
+        }
+        const mockTmplSpc1 = {
+          ['@id']: 'test-1',
+          availableIn: [ mockParc1 ]
+        }
+        it('> if fails, will return general error', () => {
+
+          mockStore.overrideSelector(viewerStateFetchedTemplatesSelector, [
+            mockTmplSpc1
+          ])
+          mockStore.overrideSelector(viewerStateFetchedAtlasesSelector, [{
+            ['@id']: 'foo-bar',
+            templateSpaces: [ mockTmplSpc ]
+          }])
+          actions$ = hot('a', {
+            a: viewerStateSelectAtlas({
+              atlas: {
+                ['@id']: 'foo-bar',
+              }
+            })
+          })
+          
+          const viewerSTateCtrlEffect = TestBed.inject(ViewerStateControllerUseEffect)
+          expect(
+            viewerSTateCtrlEffect.onSelectAtlasSelectTmplParc$
+          ).toBeObservable(
+            hot('a', {
+              a: generalActionError({
+                message: CONST.TEMPLATE_NOT_FOUND
+              })
+            })
+          )
+        })
+      
+        it('> if succeeds, will dispatch new viewer', () => {
+          const completeMocktmpl = {
+            ...mockTmplSpc1,
+            parcellations: [ mockParc1 ]
+          }
+          mockStore.overrideSelector(viewerStateFetchedTemplatesSelector, [
+            completeMocktmpl
+          ])
+          mockStore.overrideSelector(viewerStateFetchedAtlasesSelector, [{
+            ['@id']: 'foo-bar',
+            templateSpaces: [ mockTmplSpc1 ]
+          }])
+          actions$ = hot('a', {
+            a: viewerStateSelectAtlas({
+              atlas: {
+                ['@id']: 'foo-bar',
+              }
+            })
+          })
+          
+          const viewerSTateCtrlEffect = TestBed.inject(ViewerStateControllerUseEffect)
+          expect(
+            viewerSTateCtrlEffect.onSelectAtlasSelectTmplParc$
+          ).toBeObservable(
+            hot('a', {
+              a: viewerStateNewViewer({
+                selectTemplate: completeMocktmpl,
+                selectParcellation: mockParc1
+              })
+            })
+          )
+        })
+      })
+    })
+  
   })
 
   describe('> cvtNehubaConfigToNavigationObj', () => {
diff --git a/src/ui/viewerStateController/viewerState.useEffect.ts b/src/ui/viewerStateController/viewerState.useEffect.ts
index f5ed55c0457129b8f615d8f59fc693ceccf2b852..18eef3feafbaebc9d4bdf05b60447a6619ce870c 100644
--- a/src/ui/viewerStateController/viewerState.useEffect.ts
+++ b/src/ui/viewerStateController/viewerState.useEffect.ts
@@ -7,12 +7,14 @@ import { CHANGE_NAVIGATION, FETCHED_TEMPLATE, IavRootStoreInterface, SELECT_PARC
 import { VIEWERSTATE_CONTROLLER_ACTION_TYPES } from "./viewerState.base";
 import { TemplateCoordinatesTransformation } from "src/services/templateCoordinatesTransformation.service";
 import { CLEAR_STANDALONE_VOLUMES } from "src/services/state/viewerState.store";
-import { viewerStateToggleRegionSelect, viewerStateHelperSelectParcellationWithId, viewerStateSelectTemplateWithId, viewerStateNavigateToRegion, viewerStateSelectedTemplateSelector, viewerStateFetchedTemplatesSelector, viewerStateNewViewer, viewerStateSelectedParcellationSelector, viewerStateNavigationStateSelector, viewerStateSelectTemplateWithName, viewerStateSelectedRegionsSelector } from "src/services/state/viewerState.store.helper";
+import { viewerStateToggleRegionSelect, viewerStateHelperSelectParcellationWithId, viewerStateSelectTemplateWithId, viewerStateNavigateToRegion, viewerStateSelectedTemplateSelector, viewerStateFetchedTemplatesSelector, viewerStateNewViewer, viewerStateSelectedParcellationSelector, viewerStateNavigationStateSelector, viewerStateSelectTemplateWithName, viewerStateSelectedRegionsSelector, viewerStateSelectAtlas } from "src/services/state/viewerState.store.helper";
 import { ngViewerSelectorClearViewEntries } from "src/services/state/ngViewerState/selectors";
 import { ngViewerActionClearView } from "src/services/state/ngViewerState/actions";
 import { PureContantService } from "src/util";
 import { verifyPositionArg } from 'common/util'
+import { CONST } from 'common/constants'
 import { uiActionHideAllDatasets } from "src/services/state/uiState/actions";
+import { viewerStateFetchedAtlasesSelector } from "src/services/state/viewerState/selectors";
 
 const defaultPerspectiveZoom = 1e6
 const defaultZoom = 1e6
@@ -115,6 +117,52 @@ export class ViewerStateControllerUseEffect implements OnDestroy {
     }),
   )
 
+  @Effect()
+  public onSelectAtlasSelectTmplParc$ = this.actions$.pipe(
+    ofType(viewerStateSelectAtlas.type),
+    withLatestFrom(
+      this.store$.pipe(
+        select(viewerStateFetchedTemplatesSelector),
+        startWith([])
+      ),
+      this.store$.pipe(
+        select(viewerStateFetchedAtlasesSelector),
+        startWith([])
+      )
+    ),
+    map(([action, fetchedTemplates, fetchedAtlases ])=> {
+
+      const atlas = fetchedAtlases.find(a => a['@id'] === (action as any).atlas['@id'])
+      if (!atlas) {
+        return generalActionError({
+          message: CONST.ATLAS_NOT_FOUND
+        })
+      }
+      /**
+       * selecting atlas means selecting the first available templateSpace
+       */
+      const templateTobeSelected = atlas.templateSpaces[0]
+      const templateSpaceId = templateTobeSelected['@id']
+      
+      const parcellationId = (
+        templateTobeSelected.availableIn.find(p => !!p.baseLayer) ||
+        templateTobeSelected.availableIn[0]
+      )['@id']
+        
+      const templateSelected = fetchedTemplates.find(t => templateSpaceId === t['@id'])
+      if (!templateSelected) {
+        return generalActionError({
+          message: CONST.TEMPLATE_NOT_FOUND
+        })
+      }
+      const parcellationSelected = templateSelected.parcellations.find(p => p['@id'] === parcellationId)
+      return viewerStateNewViewer({
+        selectTemplate: templateSelected,
+        selectParcellation: parcellationSelected
+      })
+    })
+  )
+
   /**
    * on region selected change (clear, select, or change selection), clear selected dataset ids
    */