diff --git a/README.md b/README.md
index 3495978508902c6bb88b4e389e49586052647642..e5b7a7b2c0b43ab46b68a35faa8e59b9989974b2 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Interactive Atlas Viewer is an frontend module wrapping around [nehuba](https://
 A live version of the Interactive Atlas Viewer is available at [https://interactive-viewer.apps.hbp.eu](https://interactive-viewer.apps.hbp.eu). This section is useful for developers who would like to develop this project.
 
 ### General information
-Interactive atlas viewer is built with [Angular (v6.0)](https://angular.io/), [Bootstrap (v4)](http://getbootstrap.com/), and [fontawesome icons](https://fontawesome.com/). Some other notable packages used are: [ngx-bootstrap](https://valor-software.com/ngx-bootstrap/) for UI and [ngrx/store](https://github.com/ngrx/platform) for state management. 
+Interactive atlas viewer is built with [Angular (v6.0)](https://angular.io/), [Bootstrap (v4)](http://getbootstrap.com/), and [fontawesome icons](https://fontawesome.com/). Some other notable packages used are [ngrx/store](https://github.com/ngrx/platform) for state management. 
 
 Releases newer than [v0.2.9](https://github.com/HumanBrainProject/interactive-viewer/tree/v0.2.9) also uses a nodejs backend, which uses [passportjs](http://www.passportjs.org/) for user authentication, [express](https://expressjs.com/) as a http framework.
 
diff --git a/docs/releases/v2.1.0.md b/docs/releases/v2.1.0.md
index 0a6223d8c9a5eeb3fbab5280b2417c8258a031dd..fc1d454257ef8ad223d511c0d9f1d2309f71979f 100644
--- a/docs/releases/v2.1.0.md
+++ b/docs/releases/v2.1.0.md
@@ -12,3 +12,7 @@
 
 - Fixed a bug where on parcellation load, the colour of the parcellation fails to load (#454, #462)
 - Fixed a bug where, URL state is no longer parsed as state properly (#461)
+
+## Under the hood stuff
+
+- Removed `ngx-bootstrap` as dependency
diff --git a/package.json b/package.json
index db5b8f9e3d2d82ad00cbf76609206ec4b99b1ed3..213f18cda9c62339c81536c5eac9819ecfdbed03 100644
--- a/package.json
+++ b/package.json
@@ -72,7 +72,6 @@
     "kg-dataset-previewer": "0.0.10",
     "lodash.merge": "^4.6.2",
     "mini-css-extract-plugin": "^0.8.0",
-    "ngx-bootstrap": "^5.3.2",
     "node-sass": "^4.12.0",
     "protractor": "^5.4.2",
     "raw-loader": "^0.5.1",
diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts
index f0385c8e45bf12f32381cc81dbd200e757b0f645..ec2034833450b1e36706aab445850b5b831c73b4 100644
--- a/src/atlasViewer/atlasViewer.component.ts
+++ b/src/atlasViewer/atlasViewer.component.ts
@@ -28,7 +28,6 @@ import { AtlasViewerAPIServices } from "./atlasViewer.apiService.service";
 import { AtlasViewerConstantsServices, UNSUPPORTED_INTERVAL, UNSUPPORTED_PREVIEW } from "./atlasViewer.constantService.service";
 import { WidgetServices } from "./widgetUnit/widgetService.service";
 
-import { TabsetComponent } from "ngx-bootstrap/tabs";
 import { LocalFileService } from "src/services/localFile.service";
 import { LoggingService } from "src/services/logging.service";
 import { AGREE_COOKIE, AGREE_KG_TOS, SHOW_BOTTOM_SHEET, SHOW_KG_TOS } from "src/services/state/uiState.store";
@@ -76,8 +75,6 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit {
   @ViewChild(FixedMouseContextualContainerDirective) public rClContextualMenu: FixedMouseContextualContainerDirective
   @ViewChild(MouseHoverDirective) private mouseOverNehuba: MouseHoverDirective
 
-  @ViewChild('mobileMenuTabs') public mobileMenuTabs: TabsetComponent
-
   /**
    * required for styling of all child components
    */
diff --git a/src/atlasViewer/atlasViewer.style.css b/src/atlasViewer/atlasViewer.style.css
index 3a18311b9864ca06db18b3f15e58e74534222216..089cdace9107bc4265d7748c67580dc23fead9bf 100644
--- a/src/atlasViewer/atlasViewer.style.css
+++ b/src/atlasViewer/atlasViewer.style.css
@@ -61,10 +61,6 @@ mat-sidenav {
   box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
 }
 
-.mobileMenuTabs {
-  margin: 40px 0 0 5px;
-}
-
 landmark-ui,
 region-menu
 {
diff --git a/src/atlasViewerExports/export.module.ts b/src/atlasViewerExports/export.module.ts
index 0aa2e3fc15b42432a815594e311682be0aba6a47..6d8ceecc8e0bc03ae52732c02bb1ef0b3f8f1028 100644
--- a/src/atlasViewerExports/export.module.ts
+++ b/src/atlasViewerExports/export.module.ts
@@ -3,7 +3,6 @@ import { createCustomElement } from '@angular/elements'
 import { FormsModule } from "@angular/forms";
 import { BrowserModule } from "@angular/platform-browser";
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
-import { BsDropdownModule } from "ngx-bootstrap/dropdown";
 import { ComponentsModule } from "../components/components.module";
 import { MarkdownDom } from '../components/markdown/markdown.component'
 import { PanelComponent } from "../components/panel/panel.component";
@@ -18,7 +17,6 @@ import { SampleBoxUnit } from "./sampleBox/sampleBox.component";
     BrowserAnimationsModule,
     FormsModule,
     ComponentsModule,
-    BsDropdownModule.forRoot(),
   ],
   declarations : [
     SampleBoxUnit,
diff --git a/src/components/components.module.ts b/src/components/components.module.ts
index 1c9daeec33d6faafde1ec4501292af2a145a974e..c16f932a5fd11f5e613bbef20b1fdd54f65f8090 100644
--- a/src/components/components.module.ts
+++ b/src/components/components.module.ts
@@ -13,7 +13,6 @@ import { SafeHtmlPipe } from '../util/pipes/safeHtml.pipe'
 import { TreeSearchPipe } from '../util/pipes/treeSearch.pipe';
 import { ConfirmDialogComponent } from './confirmDialog/confirmDialog.component';
 import { DialogComponent } from './dialog/dialog.component';
-import { DropdownComponent } from './dropdown/dropdown.component';
 import { AppendSiblingFlagPipe } from './flatTree/appendSiblingFlag.pipe';
 import { ClusteringPipe } from './flatTree/clustering.pipe';
 import { FilterCollapsePipe } from './flatTree/filterCollapse.pipe';
@@ -46,7 +45,6 @@ import { TreeBaseDirective } from './tree/treeBase.directive';
     /* components */
     MarkdownDom,
     ReadmoreComponent,
-    DropdownComponent,
     TreeComponent,
     PanelComponent,
     PaginationComponent,
@@ -79,7 +77,6 @@ import { TreeBaseDirective } from './tree/treeBase.directive';
 
     MarkdownDom,
     ReadmoreComponent,
-    DropdownComponent,
     TreeComponent,
     PanelComponent,
     PaginationComponent,
diff --git a/src/components/dropdown/dropdown.animation.ts b/src/components/dropdown/dropdown.animation.ts
deleted file mode 100644
index 1a4c0a2a9a952619b893f1db6729066ff2b37628..0000000000000000000000000000000000000000
--- a/src/components/dropdown/dropdown.animation.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { animate, state, style, transition, trigger } from "@angular/animations";
-
-export const dropdownAnimation = trigger('showState', [
-  state('show',
-    style({
-      opacity : '1.0',
-    }),
-  ),
-  state('hide',
-    style({
-      "opacity" : '0.0',
-      'pointer-events': 'none',
-    }),
-  ),
-  transition('show => hide', [
-    animate('230ms ease-in'),
-  ]),
-  transition('hide => show', [
-    animate('230ms ease-out'),
-  ]),
-])
diff --git a/src/components/dropdown/dropdown.component.spec.ts b/src/components/dropdown/dropdown.component.spec.ts
deleted file mode 100644
index d4d9e9381441ed2c67cd5fee24c6e3d967182ab0..0000000000000000000000000000000000000000
--- a/src/components/dropdown/dropdown.component.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { async, TestBed } from '@angular/core/testing'
-import {} from 'jasmine'
-import { AngularMaterialModule } from '../../ui/sharedModules/angularMaterial.module'
-import { HoverableBlockDirective } from '../hoverableBlock.directive'
-import { RadioList } from '../radiolist/radiolist.component'
-import { DropdownComponent } from './dropdown.component';
-
-describe('dropdown component', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      imports: [
-        AngularMaterialModule,
-      ],
-      declarations : [
-        DropdownComponent,
-        HoverableBlockDirective,
-        RadioList,
-      ],
-    }).compileComponents()
-  }))
-  it('should create component', async(() => {
-
-    const fixture = TestBed.createComponent(DropdownComponent);
-    const app = fixture.debugElement.componentInstance;
-    expect(app).toBeTruthy();
-  }))
-})
diff --git a/src/components/dropdown/dropdown.component.ts b/src/components/dropdown/dropdown.component.ts
deleted file mode 100644
index 576ab2410bb92da0dadad1554e36f6d964e5461f..0000000000000000000000000000000000000000
--- a/src/components/dropdown/dropdown.component.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from "@angular/core";
-import { IExraBtnClickEvent, IExtraButton, IHasExtraButtons } from '../radiolist/radiolist.component'
-import { dropdownAnimation } from "./dropdown.animation";
-
-@Component({
-  selector : 'dropdown-component',
-  templateUrl : './dropdown.template.html',
-  styleUrls : [
-    `./dropdown.style.css`,
-  ],
-  animations: [
-    dropdownAnimation,
-  ],
-  changeDetection : ChangeDetectionStrategy.OnPush,
-})
-
-export class DropdownComponent {
-
-  @Input() public activeDisplayBtns: IExtraButton[] = []
-  @Output() public activeDisplayBtnClicked: EventEmitter<{extraBtn: IExtraButton, event: MouseEvent}> = new EventEmitter()
-
-  @Input() public inputArray: IHasExtraButtons[] = []
-  @Input() public selectedItem: any | null = null
-  @Input() public checkSelected: (selectedItem: any, item: any) => boolean = (si, i) => si === i
-
-  @Input() public listDisplay: (obj: any) => string = (obj) => obj.name
-  @Input() public activeDisplay: (obj: any|null) => string = (obj) => obj ? obj.name : `Please select an item.`
-
-  @Output() public itemSelected: EventEmitter<any> = new EventEmitter()
-  @Output() public extraBtnClicked: EventEmitter<IExraBtnClickEvent> = new EventEmitter()
-
-  @ViewChild('dropdownToggle', {read: ElementRef}) public dropdownToggle: ElementRef
-
-  public openState: boolean = false
-
-  @HostListener('document:click', ['$event'])
-  public close(event: MouseEvent) {
-    const contains = this.dropdownToggle.nativeElement.contains(event.target)
-    if (contains) {
-      this.openState = !this.openState
-    } else {
-      this.openState = false;
-    }
-  }
-
-  public handleActiveDisplayBtnClick(btn: IExtraButton, event: MouseEvent) {
-    this.activeDisplayBtnClicked.emit({
-      extraBtn: btn,
-      event,
-    })
-  }
-}
diff --git a/src/components/dropdown/dropdown.style.css b/src/components/dropdown/dropdown.style.css
deleted file mode 100644
index 99359c8ababa48549e10cad178d963e83a9695df..0000000000000000000000000000000000000000
--- a/src/components/dropdown/dropdown.style.css
+++ /dev/null
@@ -1,76 +0,0 @@
-:host
-{
-  position:relative;
-  display:block;
-}
-
-span[dropdownToggle]:hover
-{
-  cursor:default;
-}
-span[dropdownToggle]
-{
-  display:block;
-  text-align:left;
-}
-span[dropdownToggle]
-{
-  padding:0.5em 0.8em;
-  border-radius:0px;
-  cursor:default;
-  white-space: nowrap;
-}
-
-:host-context([darktheme="false"]) span[dropdownToggle]
-{
-  border:none;
-  box-shadow: 0 4px 6px 0 rgba(30,30,30,0.05);
-  background-color:rgba(255,255,255,0.8);
-}
-
-:host-context([darktheme="false"]) span[dropdownToggle]:hover
-{
-  box-shadow:rgba(30,30,30,0.1);
-  background-color:rgba(250,250,250,0.99);
-}
-
-
-:host-context([darktheme="true"]) span[dropdownToggle]
-{
-  border:none;
-  box-shadow: 0 4px 6px 0 rgba(0,0,0,0.05);
-  background-color:rgba(30,30,30,0.8);
-  color:rgba(255,255,255,0.8);
-}
-
-:host-context([darktheme="true"]) span[dropdownToggle]:hover
-{
-  box-shadow:rgba(0,0,0,0.1);
-  background-color:rgba(30,30,30,0.99);
-}
-
-radio-list
-{
-  width:100%;
-  height:0;
-  overflow-x:hidden;
-  display:block;
-}
-
-
-:host-context([isMobile="true"]) .dropdownTitle {
-  border: 1px solid !important;
-}
-
-:host-context([isMobile="true"]) .dropdownTitleOpen {
-  border: solid !important;
-  border-width: 1px 1px 0 1px !important;
-}
-
-:host-context([darktheme="true"][isMobile="true"]) .dropdownTitle {
-  border-color: white !important;
-}
-
-:host-context([darktheme="false"][isMobile="true"]) .dropdownTitle {
-  border-color: black !important;
-}
\ No newline at end of file
diff --git a/src/components/dropdown/dropdown.template.html b/src/components/dropdown/dropdown.template.html
deleted file mode 100644
index 1ab4afbdaa75c513a92f359885308b5e441b77c4..0000000000000000000000000000000000000000
--- a/src/components/dropdown/dropdown.template.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- TODO remove dependency on ismobile -->
-<div class="d-flex flex-column">
-  <div class="d-flex">
-
-    <span
-      class="btn btn-default dropdownTitle flex-grow-1 m-auto"
-      [innerHTML]="activeDisplay(selectedItem)"
-      [hoverable]="{translateY:-2}"
-      #dropdownToggle
-      dropdownToggle
-      [ngClass]="openState ? 'dropdownTitleOpen' : 'dropdownTitle'">
-    </span>
-    
-    <span
-      *ngFor="let btn of activeDisplayBtns"
-      class="btn btn-default"
-      (click)="handleActiveDisplayBtnClick(btn, $event)"
-      [hoverable]="{translateY:-1}"
-      dropdownToggle>
-      <div class="d-flex align-items-center">
-        <small [ngClass]="btn.faIcon"></small>
-      </div>
-    </span>
-  </div>
-</div>
-
-<!-- needed to ensure dropdown width matches  -->
-<ul class="m-0 h-0 overflow-hidden">
-  <li *ngFor="let item of inputArray">
-    {{ listDisplay(item) }}
-  </li>
-</ul>
-<radio-list
-  [ulClass]="'dropdown-menu shadow'"
-  (itemSelected)="itemSelected.emit($event)"
-  [listDisplay]="listDisplay"
-  [checkSelected]="checkSelected"
-  [selectedItem]="selectedItem"
-  [inputArray]="inputArray"
-  [@showState]="openState ? 'show' : 'hide'"
-  (extraBtnClicked)="extraBtnClicked.emit($event)">
-</radio-list>
diff --git a/src/main.module.ts b/src/main.module.ts
index d0e25476f263d78df2f028e2f6352d291372f8a5..8e1ccb17a6182bf6d251478c375ec642e9174c83 100644
--- a/src/main.module.ts
+++ b/src/main.module.ts
@@ -14,8 +14,6 @@ import { GetNamesPipe } from "./util/pipes/getNames.pipe";
 
 import {HttpClientModule} from "@angular/common/http";
 import { EffectsModule } from "@ngrx/effects";
-import { TabsModule } from 'ngx-bootstrap/tabs'
-import { TooltipModule } from "ngx-bootstrap/tooltip";
 import {CaptureClickListenerDirective} from "src/util/directives/captureClickListener.directive";
 import { AtlasViewerAPIServices } from "./atlasViewer/atlasViewer.apiService.service";
 import { AtlasWorkerService } from "./atlasViewer/atlasViewer.workerService.service";
@@ -68,8 +66,6 @@ import {TemplateCoordinatesTransformation} from "src/services/templateCoordinate
     AngularMaterialModule,
     UtilModule,
 
-    TooltipModule.forRoot(),
-    TabsModule.forRoot(),
     EffectsModule.forRoot([
       DataBrowserUseEffect,
       UseEffects,
diff --git a/src/res/css/extra_styles.css b/src/res/css/extra_styles.css
index 0639b9179922f9bcb336ed1fa5611d91939bea53..fe2e37e3fa217284365790cf3d3fc7b92c64aedc 100644
--- a/src/res/css/extra_styles.css
+++ b/src/res/css/extra_styles.css
@@ -70,16 +70,6 @@ ul#statusContainer
   /* width:25em; */
   max-width:999999px;
 }
-.inputSearchContainer .popover-arrow
-{
-  display:none;
-}
-
-.inputSearchContainer .popover-content.popover-body
-{
-  padding:0;
-  max-width:999999px;
-}
 
 .mute-text
 {
@@ -268,26 +258,6 @@ markdown-dom pre code
   color: rgba(255, 255, 255, 1.0);
 }
 
-.darktheme.popover
-{
-  background-color:rgba(0, 0, 0, 0.8);
-}
-
-.darktheme.popover .popover-body
-{
-  color:white;
-}
-
-.darktheme.popover.popover-bottom>.arrow::after
-{
-  border-bottom-color: rgba(0, 0, 0, 0.8);
-}
-
-.darktheme.popover.popover-right>.arrow::after
-{
-  border-right-color: rgba(0, 0, 0, 0.8);
-}
-
 .r-90
 {
   transform: rotate(90deg)!important;
@@ -476,21 +446,6 @@ markdown-dom pre code
   top: 0!important;
 }
 
-/* TODO fix hack */
-/* ngx boostrap default z index for modal-container is 1050, which is higher than material tooltip 1000 */
-/* when migration away from ngx bootstrap is complete, remove these classes */
-
-modal-container.modal
-{
-  z-index: 950;
-}
-
-bs-modal-backdrop.modal-backdrop
-{
-  z-index: 940;
-}
-
-
 .outline-none {
     outline: none;
 }
diff --git a/src/ui/databrowserModule/databrowser.module.ts b/src/ui/databrowserModule/databrowser.module.ts
index 0bd7944d6a3d7c258113146be6e3ac09b49d3192..3656b5d487fe9be1e7a445762e087952babf0f75 100644
--- a/src/ui/databrowserModule/databrowser.module.ts
+++ b/src/ui/databrowserModule/databrowser.module.ts
@@ -1,8 +1,6 @@
 import { CommonModule } from "@angular/common";
 import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
 import { FormsModule } from "@angular/forms";
-import { PopoverModule } from "ngx-bootstrap/popover";
-import { TooltipModule } from "ngx-bootstrap/tooltip";
 import { ComponentsModule } from "src/components/components.module";
 import { AngularMaterialModule } from 'src/ui/sharedModules/angularMaterial.module'
 import { DoiParserPipe } from "src/util/pipes/doiPipe.pipe";
@@ -37,8 +35,6 @@ import { DatasetPreviewList, UnavailableTooltip } from "./singleDataset/datasetP
     FormsModule,
     UtilModule,
     AngularMaterialModule,
-    TooltipModule.forRoot(),
-    PopoverModule.forRoot(),
   ],
   declarations: [
     DataBrowser,