diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx
index f77bd93e000a5089d10e9a32e950338f2c221e11..259f2b7f0cf625d91047389266b27e2906319bed 100644
--- a/apps/web/src/app/app.tsx
+++ b/apps/web/src/app/app.tsx
@@ -18,7 +18,7 @@ import { wsQueryRequest } from '@graphpolaris/shared/lib/data-access/broker';
 import { URLParams, setParam } from '@graphpolaris/shared/lib/data-access/api/url';
 import { VisualizationPanel } from '@graphpolaris/shared/lib/vis';
 import { QueryBuilder } from '@graphpolaris/shared/lib/querybuilder';
-import DataViewer from '@graphpolaris/shared/lib/data-viewer';
+import Sidebar from '@graphpolaris/shared/lib/sidebar';
 import { useVisualizationManager } from '@graphpolaris/shared/lib/vis/hooks';
 import { ConfigPanel } from '@graphpolaris/shared/lib/vis/components/config';
 
@@ -73,7 +73,7 @@ export function App(props: App) {
               </aside>
               <main className="flex w-screen h-[calc(100%-4.2rem)]">
                 <Resizable divisorSize={3} horizontal={true} defaultProportion={0.33}>
-                  <DataViewer auth={authCheck} />
+                  <Sidebar auth={authCheck} />
                   <div className="h-full w-full">
                     <Resizable divisorSize={3} horizontal={false}>
                       <div className="w-full h-full border">
diff --git a/libs/shared/lib/data-access/store/visualizationSlice.ts b/libs/shared/lib/data-access/store/visualizationSlice.ts
index 1299b0488d0c1bf65147d0bb75d6e24bc64135d8..46d3a32b3f7617e2d7facfb61df885aac9eab2bb 100644
--- a/libs/shared/lib/data-access/store/visualizationSlice.ts
+++ b/libs/shared/lib/data-access/store/visualizationSlice.ts
@@ -1,6 +1,6 @@
 import { createSlice, PayloadAction } from '@reduxjs/toolkit';
 import type { RootState } from './store';
-import { VisualizationConfiguration } from '../../vis/visualization.types';
+import { VisualizationConfiguration } from '../../vis/shared';
 import { isEqual } from 'lodash-es';
 
 export type VisStateSettings = {
diff --git a/libs/shared/lib/data-viewer/index.tsx b/libs/shared/lib/sidebar/index.tsx
similarity index 98%
rename from libs/shared/lib/data-viewer/index.tsx
rename to libs/shared/lib/sidebar/index.tsx
index 1df6c93a7935ea5f1c444dc77516f09a4a74d2fe..5af63b646daa1638f8f4ba57470134da151ddc20 100644
--- a/libs/shared/lib/data-viewer/index.tsx
+++ b/libs/shared/lib/sidebar/index.tsx
@@ -6,7 +6,7 @@ import Searchbar from './search/searchbar';
 import ColorMode from '../components/color-mode';
 import ControlContainer from '../components/controls';
 
-export default function DataViewer({ auth }: { auth: boolean }) {
+export default function Sidebar({ auth }: { auth: boolean }) {
   const [tab, setTab] = useState('Schema');
   const [showDialog, setShowDialog] = useState<boolean>(true);
 
diff --git a/libs/shared/lib/data-viewer/search/searchbar.tsx b/libs/shared/lib/sidebar/search/searchbar.tsx
similarity index 100%
rename from libs/shared/lib/data-viewer/search/searchbar.tsx
rename to libs/shared/lib/sidebar/search/searchbar.tsx
diff --git a/libs/shared/lib/data-viewer/search/similarity.ts b/libs/shared/lib/sidebar/search/similarity.ts
similarity index 100%
rename from libs/shared/lib/data-viewer/search/similarity.ts
rename to libs/shared/lib/sidebar/search/similarity.ts
diff --git a/libs/shared/lib/vis/components/bar.tsx b/libs/shared/lib/vis/components/bar.tsx
index 72736b772af6193179c77992fef9752412bdf282..23f2c1d916e45ca4030444635eaf2f53e855f9e6 100644
--- a/libs/shared/lib/vis/components/bar.tsx
+++ b/libs/shared/lib/vis/components/bar.tsx
@@ -1,19 +1,17 @@
-import React, { useState } from 'react';
+import React from 'react';
 import { Button } from '../../components';
 import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip';
 import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
 import { Add, Close, Fullscreen } from '@mui/icons-material';
 import ControlContainer from '../../components/controls';
 import { Visualizations } from '../hooks';
-import { VisualizationManager } from '../visualization.types';
+import { VisualizationManager } from '../shared';
 
 type Props = {
   manager: VisualizationManager;
 };
 
 export default function VisualizationBar({ manager }: Props) {
-  const [visDropdownOpen, setVisDropdownOpen] = useState<boolean>(false);
-
   const handleDragStart = (e: React.DragEvent<HTMLDivElement>, visId: string) => {
     e.dataTransfer.setData('text/plain', visId);
   };
@@ -72,7 +70,7 @@ export default function VisualizationBar({ manager }: Props) {
                   <TooltipTrigger>
                     <Button type="secondary" variant="ghost" size="xs" iconComponent={<Add />} onClick={() => {}} />
                   </TooltipTrigger>
-                  <TooltipContent side={'bottom'} disabled={visDropdownOpen}>
+                  <TooltipContent side={'bottom'}>
                     <p>Add visualization</p>
                   </TooltipContent>
                 </Tooltip>
@@ -85,8 +83,6 @@ export default function VisualizationBar({ manager }: Props) {
                     key={key}
                     className="text-sm px-2 py-1 rounded cursor-pointer hover:bg-secondary-200"
                     onClick={(e) => {
-                      e.preventDefault();
-                      setVisDropdownOpen(false);
                       manager.changeActive(key);
                     }}
                   >
diff --git a/libs/shared/lib/vis/components/config/panel.tsx b/libs/shared/lib/vis/components/config/panel.tsx
index 2ffd796423c78d5afaee3baa2fa24792a19a2fb1..3268205e8f2165052b929881a4302e2d0998555a 100644
--- a/libs/shared/lib/vis/components/config/panel.tsx
+++ b/libs/shared/lib/vis/components/config/panel.tsx
@@ -3,7 +3,7 @@ import { Button, Icon } from '../../../components';
 import { Delete, Person } from '@mui/icons-material';
 import Input from '../../../components/inputs';
 import { VISUALIZATION_TYPES } from '../../hooks';
-import { VisualizationManager } from '../../visualization.types';
+import { VisualizationManager } from '../../shared';
 import { SettingsHeader } from './components';
 import { useSessionCache } from '../../../data-access';
 
diff --git a/libs/shared/lib/vis/components/panel.tsx b/libs/shared/lib/vis/components/panel.tsx
index 1e9260879f6f0380823850e8985541a105d7db13..50556010dbedaf23e2e3efb3eab6cdbf1514cfec 100644
--- a/libs/shared/lib/vis/components/panel.tsx
+++ b/libs/shared/lib/vis/components/panel.tsx
@@ -1,7 +1,7 @@
 import React from 'react';
 import { useGraphQueryResult, useQuerybuilderGraph } from '@graphpolaris/shared/lib/data-access';
 import VisualizationBar from './bar';
-import { VisualizationManager } from '../visualization.types';
+import { VisualizationManager } from '../shared';
 import { Recommender, NoData, Querying } from '../views';
 
 export const VisualizationPanel = ({ manager }: { manager: VisualizationManager }) => {
diff --git a/libs/shared/lib/vis/hooks/useVisualizationManager.tsx b/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
index c2ebee597d66a4cd5cd7eddeb9687f190da028f0..bd029a3cf0e993b8946d0adcbf7b676863633eb4 100644
--- a/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
+++ b/libs/shared/lib/vis/hooks/useVisualizationManager.tsx
@@ -1,5 +1,5 @@
 import React, { useState, useEffect, Suspense } from 'react';
-import { VISComponentType, VisualizationConfiguration } from '../visualization.types';
+import { VISComponentType, VisualizationConfiguration } from '../shared';
 import {
   removeVisualization,
   reorderVisState,
@@ -15,7 +15,7 @@ import {
   useSessionCache,
   useVisualization,
 } from '../../data-access';
-import { VisualizationManager } from '../visualization.types';
+import { VisualizationManager } from '../shared';
 import { HoverType, SelectType, addHover, addSelect } from '../../data-access/store/interactionSlice';
 
 export const Visualizations: Record<string, Function> = {
diff --git a/libs/shared/lib/vis/shared/index.ts b/libs/shared/lib/vis/shared/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7c0954347fda348698be19f898b1549a9da32c75
--- /dev/null
+++ b/libs/shared/lib/vis/shared/index.ts
@@ -0,0 +1 @@
+export type { VisualizationConfiguration, VISComponentType, VisualizationPropTypes, VisualizationManager } from './types';
diff --git a/libs/shared/lib/vis/visualization.types.ts b/libs/shared/lib/vis/shared/types.ts
similarity index 71%
rename from libs/shared/lib/vis/visualization.types.ts
rename to libs/shared/lib/vis/shared/types.ts
index 9a3479e8579b7b9c6b624c12be441b718f5cf7db..746b19811c22239091da6054ed1b416942a623a0 100644
--- a/libs/shared/lib/vis/visualization.types.ts
+++ b/libs/shared/lib/vis/shared/types.ts
@@ -1,9 +1,9 @@
-import { GraphQueryResult } from '../data-access/store/graphQueryResultSlice';
-import { ML } from '../data-access/store/mlSlice';
-import { SchemaGraph } from '../schema';
-import type { AppDispatch } from '../data-access';
+import { GraphQueryResult } from '../../data-access/store/graphQueryResultSlice';
+import { ML } from '../../data-access/store/mlSlice';
+import { SchemaGraph } from '../../schema';
+import type { AppDispatch } from '../../data-access';
 import { FC } from 'react';
-import { Visualizations } from './hooks/useVisualizationManager';
+import { Visualizations } from '../hooks';
 
 export type VisualizationConfiguration = { [id: string]: any };
 
@@ -24,7 +24,7 @@ export type VisualizationPropTypes = {
   handleSelect: (val: any) => void;
 };
 
-export interface VisualizationManager {
+export type VisualizationManager = {
   renderComponent: () => React.ReactNode;
   renderSettings: () => React.ReactNode;
   active: string | undefined;
@@ -33,4 +33,4 @@ export interface VisualizationManager {
   changeActive: (id: string) => void;
   reorderVisualizations: (args: { draggedVisId: string; dropVisId: string }) => void;
   deleteVisualization: (id: string) => void;
-}
+};
diff --git a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx
index c3f0045c21374209c54a6601406f9b83e69ea9fa..363603889d55d4ffa2604e801680315d3fbceeb5 100644
--- a/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx
+++ b/libs/shared/lib/vis/visualizations/mapvis/mapvis.tsx
@@ -2,7 +2,7 @@ import React from 'react';
 import { MapPanel, LayerPanel } from './components';
 import GraphModel from './graphModel';
 import { GraphType, Layer } from './Types';
-import { VISComponentType, VisualizationPropTypes } from '../../visualization.types';
+import { VISComponentType, VisualizationPropTypes } from '../../shared';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
 
 export type MapProps = {};
diff --git a/libs/shared/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx b/libs/shared/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx
index ae3cb0b29e1b40474ffe520530bc1b96b661abb0..00c79f3989e350f7d0a6220f44b74f61ff9c9b44 100644
--- a/libs/shared/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx
+++ b/libs/shared/lib/vis/visualizations/matrixvis/components/MatrixPixi.tsx
@@ -24,7 +24,7 @@ import { Actions, Interpolations } from 'pixi-actions';
 import Color from 'color';
 import { createColumn } from './ColumnGraphicsComponent';
 import { ReorderingManager } from './ReorderingManager';
-import { VisualizationConfiguration } from '../../../visualization.types';
+import { VisualizationConfiguration } from '../../../shared';
 
 type Props = {
   // onClick: (node: NodeType, pos: IPointData) => void;
diff --git a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
index c58e4daeeece3bd4ffbd4c4672428e95d30fe92e..95583b1200a17dd442d7901fcfad9c914d777b8c 100644
--- a/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
+++ b/libs/shared/lib/vis/visualizations/matrixvis/matrixvis.tsx
@@ -3,7 +3,7 @@ import { useImmer } from 'use-immer';
 import { GraphQueryResult } from '../../../data-access/store';
 import { LinkType, NodeType } from './Types';
 import { MatrixPixi } from './components/MatrixPixi';
-import { VisualizationPropTypes, VISComponentType } from '../../visualization.types';
+import { VisualizationPropTypes, VISComponentType } from '../../shared';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
 import { SettingsContainer } from '@graphpolaris/shared/lib/vis/components/config';
diff --git a/libs/shared/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx b/libs/shared/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx
index 2fcb9ab4cb9d602952dc29f339c091cd80f2bb48..3c4a9097e2fa4b7f8c02856646709c4a70ee973b 100644
--- a/libs/shared/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx
+++ b/libs/shared/lib/vis/visualizations/nodelinkvis/components/NLPixi.tsx
@@ -7,7 +7,7 @@ import * as force from './NLForce';
 import { Viewport } from 'pixi-viewport';
 import { useAppDispatch, useML, useSearchResultData } from '../../../../data-access';
 import { NLPopup } from './NLPopup';
-import { VisualizationConfiguration } from '../../../visualization.types';
+import { VisualizationConfiguration } from '../../../shared';
 
 type Props = {
   onClick: (node: NodeType, pos: IPointData) => void;
diff --git a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
index 5c8ba45319d562c717d6af5ef66b2d4d928efcda..abefb821bc0e5699fe912e1f0e9dc6e9571a2c06 100644
--- a/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
+++ b/libs/shared/lib/vis/visualizations/nodelinkvis/nodelinkvis.tsx
@@ -4,7 +4,7 @@ import { NLPixi } from './components/NLPixi';
 import { parseQueryResult } from './components/query2NL';
 import { useImmer } from 'use-immer';
 import { ML, setShortestPathSource, setShortestPathTarget } from '../../../data-access/store/mlSlice';
-import { VisualizationPropTypes, VISComponentType } from '../../visualization.types';
+import { VisualizationPropTypes, VISComponentType } from '../../shared';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
 import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/vis/components/config';
diff --git a/libs/shared/lib/vis/visualizations/paohvis/components/MakePaohvisMenu.tsx b/libs/shared/lib/vis/visualizations/paohvis/components/MakePaohvisMenu.tsx
index 0f676c0fa2e0617c393173464e26bcc71cc86337..7d4474ace44a8d08c9a2f8a8b647079b31c895f7 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/components/MakePaohvisMenu.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/components/MakePaohvisMenu.tsx
@@ -26,7 +26,7 @@ import { useImmer } from 'use-immer';
 import { useGraphQueryResult, useSchemaGraph } from '@graphpolaris/shared/lib/data-access';
 import { calculateAttributesAndRelations, calculateAttributesFromRelation } from '../utils/utils';
 import calcEntitiesFromQueryResult from '../utils/CalcEntitiesFromQueryResult';
-import { isNodeLinkResult } from '../../../shared/ResultNodeLinkParserUseCase';
+import { isNodeLinkResult } from '../utils/ResultNodeLinkParserUseCase';
 import { select } from 'd3';
 import { Button } from '../../../../components/buttons';
 
@@ -38,7 +38,7 @@ type MakePaohvisMenuProps = {
     relationName: string,
     isEntityFromRelationFrom: boolean,
     chosenAttribute: Attribute,
-    nodeOrder: PaohvisNodeOrder
+    nodeOrder: PaohvisNodeOrder,
   ) => void;
 };
 
@@ -325,7 +325,7 @@ export const MakePaohvisMenu = (props: MakePaohvisMenuProps) => {
         {
           orderBy: state.sortOrder,
           isReverseOrder: state.isReverseOrder,
-        }
+        },
       );
     } else {
       setState((draft) => {
diff --git a/libs/shared/lib/vis/visualizations/paohvis/components/PaohvisFilterComponent.tsx b/libs/shared/lib/vis/visualizations/paohvis/components/PaohvisFilterComponent.tsx
index de427444589e55e3cdbbfc3b9539bd643a05ec09..4b014f72b6a8b54ff55ec0892b8bd6d65ffdfab0 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/components/PaohvisFilterComponent.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/components/PaohvisFilterComponent.tsx
@@ -13,7 +13,7 @@ import styles from './PaohvisFilterComponent.module.scss';
 import { AttributeNames, FilterType } from '../Types';
 import { useImmer } from 'use-immer';
 import { useGraphQueryResult, useSchemaGraph } from '@graphpolaris/shared/lib/data-access';
-import { isNodeLinkResult } from '../../../shared/ResultNodeLinkParserUseCase';
+import { isNodeLinkResult } from '../utils/ResultNodeLinkParserUseCase';
 import { calculateAttributesAndRelations, calculateAttributesFromRelation } from '../utils/utils';
 import { boolPredicates, numberPredicates, textPredicates } from '../models/FilterPredicates';
 import { style } from 'd3';
@@ -77,19 +77,19 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => {
       // check all text attributes
       if (attributesPerEntityOrRelation[filterTarget].textAttributeNames.length > 0)
         attributesPerEntityOrRelation[filterTarget].textAttributeNames.map((attributeName) =>
-          draft.attributeNamesOptions.push(`${attributeName}:text`)
+          draft.attributeNamesOptions.push(`${attributeName}:text`),
         );
 
       // check all number attributes
       if (attributesPerEntityOrRelation[filterTarget].numberAttributeNames.length > 0)
         attributesPerEntityOrRelation[filterTarget].numberAttributeNames.map((attributeName) =>
-          draft.attributeNamesOptions.push(`${attributeName}:number`)
+          draft.attributeNamesOptions.push(`${attributeName}:number`),
         );
 
       // check all bool attributes
       if (attributesPerEntityOrRelation[filterTarget].boolAttributeNames.length > 0)
         attributesPerEntityOrRelation[filterTarget].boolAttributeNames.map((attributeName) =>
-          draft.attributeNamesOptions.push(`${attributeName}:bool`)
+          draft.attributeNamesOptions.push(`${attributeName}:bool`),
         );
       return draft;
     });
@@ -159,7 +159,7 @@ export const PaohvisFilterComponent = (props: PaohvisFilterProps) => {
       console.log(
         containsFilterTargetChosenAttribute(draft.attributeNameAndType),
         isPredicateValid(draft.predicate),
-        isCompareValueTypeValid(draft.compareValue)
+        isCompareValueTypeValid(draft.compareValue),
       );
 
       draft.isFilterButtonEnabled = isFilterConfigurationValid(draft);
diff --git a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
index 32782fdf12a1da0fc5ff30474f7850b6fa441533..a9060ba684527164542ce3cb7af7ac60d597436b 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/paohvis.tsx
@@ -17,9 +17,9 @@ import { useImmer } from 'use-immer';
 
 import { getWidthOfText } from '../../../schema/schema-utils';
 import { useGraphQueryResult, useSchemaGraph } from '../../../data-access';
-import { isNodeLinkResult } from '../../shared/ResultNodeLinkParserUseCase';
+import { isNodeLinkResult } from './utils/ResultNodeLinkParserUseCase';
 import { calculateAttributesAndRelations, calculateAttributesFromRelation } from './utils/utils';
-import VisConfigPanelComponent from '../../shared/VisConfigPanel/VisConfigPanel';
+import VisConfigPanelComponent from './utils/VisConfigPanel';
 import { PaohvisFilterComponent } from './components/PaohvisFilterComponent';
 import Tooltip from './components/Tooltip';
 import { pointer, select, selectAll } from 'd3';
@@ -27,9 +27,9 @@ import { HyperEdgeRange } from './components/HyperEdgesRange';
 import ToPaohvisDataParserUseCase from './utils/ToPaohvisDataParserUsecase';
 import MakePaohvisMenu from './components/MakePaohvisMenu';
 import { RowLabelColumn } from './components/RowLabelColumn';
-import { VISComponentType, VisualizationPropTypes } from '../../visualization.types';
+import { VISComponentType, VisualizationPropTypes } from '../../shared';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
-import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/vis/components/config';
+import { SettingsContainer } from '@graphpolaris/shared/lib/vis/components/config';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 
 type PaohvisViewModelState = {
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx b/libs/shared/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx
index 685d7d2597de366cae81d50bd6a5afd896e912a5..bc64b802a93e7112e4cb01683173507aec5fca65 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/AttributesFilterUseCase.tsx
@@ -5,7 +5,7 @@
  */
 
 import { FilterInfo, PaohvisFilters } from '../Types';
-import { AxisType, isNotInGroup } from '../../../shared/ResultNodeLinkParserUseCase';
+import { AxisType, isNotInGroup } from './ResultNodeLinkParserUseCase';
 import { boolPredicates, numberPredicates, textPredicates } from '../models/FilterPredicates';
 import { Edge, GraphQueryResult, Node } from '@graphpolaris/shared/lib/data-access';
 
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/CalcEntitiesFromQueryResult.tsx b/libs/shared/lib/vis/visualizations/paohvis/utils/CalcEntitiesFromQueryResult.tsx
index c6988eab456eec6753ddc67f1879ea7745112670..4303c89a0a6597a01efdb4bb438a8abc71ecf249 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/utils/CalcEntitiesFromQueryResult.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/CalcEntitiesFromQueryResult.tsx
@@ -5,7 +5,7 @@
  */
 
 import { GraphQueryResult } from '@graphpolaris/shared/lib/data-access';
-import { getGroupName } from '../../../shared/ResultNodeLinkParserUseCase';
+import { getGroupName } from './ResultNodeLinkParserUseCase';
 
 /**
  * This calculates all entities from the query result.
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx b/libs/shared/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..2af931efa0be54e2dd8f0bce197b3add43e065f4
--- /dev/null
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/ResultNodeLinkParserUseCase.tsx
@@ -0,0 +1,102 @@
+/**
+ * This program has been developed by students from the bachelor Computer Science at
+ * Utrecht University within the Software Project course.
+ * © Copyright Utrecht University (Department of Information and Computing Sciences)
+ */
+import { GraphType, LinkType, NodeType } from '../../nodelinkvis/types';
+import { Edge, Node, GraphQueryResult } from '../../../../data-access/store';
+
+export type AxisType = Node | Edge;
+
+/** Gets the group to which the node/edge belongs */
+export function getGroupName(axisType: AxisType): string {
+  // FIXME: only works in arangodb
+  return axisType.label;
+}
+
+/** Returns true if the given id belongs to the target group. */
+export function isNotInGroup(nodeOrEdge: AxisType, targetGroup: string): boolean {
+  return getGroupName(nodeOrEdge) != targetGroup;
+}
+
+/** Checks if a query result form the backend contains valid NodeLinkResultType data.
+ * @param {any} jsonObject The query result object received from the frontend.
+ * @returns True and the jsonObject will be casted, false if the jsonObject did not contain all the data fields.
+ */
+export function isNodeLinkResult(jsonObject: any): jsonObject is GraphQueryResult {
+  if (typeof jsonObject === 'object' && jsonObject !== null && 'nodes' in jsonObject && 'edges' in jsonObject) {
+    if (!Array.isArray(jsonObject.nodes) || !Array.isArray(jsonObject.edges)) return false;
+
+    const validNodes = jsonObject.nodes.every((node: any) => 'id' in node && 'attributes' in node);
+    const validEdges = jsonObject.edges.every((edge: any) => 'from' in edge && 'to' in edge);
+
+    return validNodes && validEdges;
+  } else return false;
+}
+
+/** Returns a record with a type of the nodes as key and a number that represents how many times this type is present in the nodeLinkResult as value. */
+export function getNodeTypes(nodeLinkResult: GraphQueryResult): Record<string, number> {
+  const types: Record<string, number> = {};
+
+  nodeLinkResult.nodes.forEach((node) => {
+    const type = getGroupName(node);
+    if (types[type] != undefined) types[type]++;
+    else types[type] = 0;
+  });
+
+  return types;
+}
+
+export type UniqueEdge = {
+  from: string;
+  to: string;
+  count: number;
+  attributes: Record<string, any>;
+};
+
+export class ParseToUniqueEdges {
+  /**
+   * Parse a message (containing query result) edges to unique edges.
+   * @param {Link[]} queryResultEdges Edges from a query result.
+   * @param {boolean} isLinkPredictionData True if parsing LinkPredictionData, false otherwise.
+   * @returns {UniqueEdge[]} Unique edges with a count property added.
+   */
+  public static parse(queryResultEdges: Edge[], isLinkPredictionData: boolean): UniqueEdge[] {
+    // Edges to be returned
+    const edges: UniqueEdge[] = [];
+
+    // Collect the edges in map, to only keep unique edges
+    // And count the number of same edges
+    const edgesMap = new Map<string, number>();
+    const attriMap = new Map<string, Record<string, any>>();
+    if (queryResultEdges != null) {
+      if (!isLinkPredictionData) {
+        for (let j = 0; j < queryResultEdges.length; j++) {
+          const newLink = queryResultEdges[j].from + ':' + queryResultEdges[j].to;
+          edgesMap.set(newLink, (edgesMap.get(newLink) || 0) + 1);
+          attriMap.set(newLink, queryResultEdges[j].attributes);
+        }
+
+        edgesMap.forEach((count, key) => {
+          const fromTo = key.split(':');
+          edges.push({
+            from: fromTo[0],
+            to: fromTo[1],
+            count: count,
+            attributes: attriMap.get(key) ?? [],
+          });
+        });
+      } else {
+        for (let i = 0; i < queryResultEdges.length; i++) {
+          edges.push({
+            from: queryResultEdges[i].from,
+            to: queryResultEdges[i].to,
+            count: queryResultEdges[i].attributes.jaccard_coefficient as number,
+            attributes: queryResultEdges[i].attributes,
+          });
+        }
+      }
+    }
+    return edges;
+  }
+}
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/ToPaohvisDataParserUsecase.tsx b/libs/shared/lib/vis/visualizations/paohvis/utils/ToPaohvisDataParserUsecase.tsx
index 63d1303023cae44cd7c1de9c6fd443dad8d447f5..e6e83d038110869df51a8a0142bf92e1d40d1fab 100644
--- a/libs/shared/lib/vis/visualizations/paohvis/utils/ToPaohvisDataParserUsecase.tsx
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/ToPaohvisDataParserUsecase.tsx
@@ -4,7 +4,7 @@
  * © Copyright Utrecht University (Department of Information and Computing Sciences)
  */
 
-import { AxisType, getGroupName } from '../../../shared/ResultNodeLinkParserUseCase';
+import { AxisType, getGroupName } from './ResultNodeLinkParserUseCase';
 import { Edge, GraphQueryResult, Node } from '@graphpolaris/shared/lib/data-access';
 
 import {
@@ -66,7 +66,7 @@ export default class ToPaohvisDataParserUseCase {
     const hyperEdgeDegree: Record<string, number> = ToPaohvisDataParserUseCase.GetHyperEdgeDegreeDict(
       nodes,
       edges,
-      axisInfo.isYAxisEntityEqualToRelationFrom
+      axisInfo.isYAxisEntityEqualToRelationFrom,
     );
 
     //parse nodes
@@ -75,7 +75,7 @@ export default class ToPaohvisDataParserUseCase {
       hyperEdgeDegree,
       nodeOrder,
       this.yAxisNodeGroup,
-      this.xAxisNodeGroup
+      this.xAxisNodeGroup,
     );
     const maxLabelWidth = calcMaxRowLabelWidth(rowInfo.rowLabels);
 
@@ -120,7 +120,7 @@ export default class ToPaohvisDataParserUseCase {
     hyperEdgeDegree: Record<string, number>,
     nodeOrder: PaohvisNodeOrder,
     yAxisNodeType: string,
-    xAxisNodeType: string
+    xAxisNodeType: string,
   ): PaohvisNodeInfo {
     const rowNodes = filterRowNodes(nodes, hyperEdgeDegree, yAxisNodeType);
     SortUseCase.sortNodes(nodeOrder, rowNodes, hyperEdgeDegree);
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.module.scss b/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.module.scss
new file mode 100644
index 0000000000000000000000000000000000000000..0b117146151f8374de1b3031143a6027acb18a45
--- /dev/null
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.module.scss
@@ -0,0 +1,101 @@
+/**
+ * This program has been developed by students from the bachelor Computer Science at
+ * Utrecht University within the Software Project course.
+ * © Copyright Utrecht University (Department of Information and Computing Sciences)
+ */
+
+/* istanbul ignore file */
+/* The comment above was added so the code coverage wouldn't count this file towards code coverage.
+ * We do not test components/renderfunctions/styling files.
+ * See testing plan for more details.*/
+/** Stylesheet for the VisConfigPanelComponent */
+$expandButtonSize: 13px;
+
+:export {
+  expandButtonSize: $expandButtonSize;
+}
+
+.container {
+  height: 100%;
+  position: absolute;
+  top: 0;
+  background-color: #f0f0f0;
+
+  transition:
+    right 0.2s,
+    left 0.2s;
+  z-index: 100;
+
+  border-radius: 0 0 0 5px;
+
+  .expandButton {
+    position: absolute;
+    height: 100%;
+    width: $expandButtonSize;
+    background-color: #f0f0f0;
+    cursor: pointer;
+    border-radius: 0 0 0 5px;
+
+    &:hover {
+      background-color: rgb(230, 230, 230);
+    }
+
+    svg {
+      position: absolute;
+      width: 100%;
+      top: 50%;
+      margin-top: -0.5em;
+    }
+    .arrowLeft {
+      transform: rotate(180deg);
+    }
+  }
+
+  .childrenContainer {
+    width: 100%;
+    height: 100%;
+
+    .children {
+      padding-left: 15px;
+
+      width: 100%;
+      height: 100%;
+
+      overflow-x: hidden;
+      overflow-y: auto;
+
+      // SCROLLBAR STYLING
+      /* Works on Firefox */
+      scrollbar-width: thin;
+      scrollbar-color: #bebebe #f0f0f0;
+
+      /* Works on Chrome, Edge, and Safari */
+      &::-webkit-scrollbar {
+        width: 12px;
+      }
+
+      &::-webkit-scrollbar-track {
+        background: #f0f0f0;
+      }
+
+      &::-webkit-scrollbar-thumb {
+        background-color: #bebebe;
+        border-radius: 20px;
+        border: 3px solid #f0f0f0;
+      }
+    }
+  }
+}
+
+/* .expandButton::after {
+  content: '<';
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  font-size: 16px;
+  display: block;
+  position: absolute;
+  top: 50%;
+  text-align: center;
+  margin-top: -0.5em;
+} */
diff --git a/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.tsx b/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b0575f99e70ee168341b5e293769b202335f5cb8
--- /dev/null
+++ b/libs/shared/lib/vis/visualizations/paohvis/utils/VisConfigPanel.tsx
@@ -0,0 +1,29 @@
+import React, { useState } from 'react';
+import styles from './VisConfigPanel.module.scss';
+
+export default function VisConfigPanelComponent({
+  width = 250,
+  children,
+  isLeft = false,
+}: {
+  width?: number;
+  children?: React.ReactNode;
+  isLeft?: boolean;
+}) {
+  const [show, setShow] = useState(false);
+  const containerStyle = isLeft ? { left: show ? 0 : -width + 13, width: width } : { right: show ? 0 : -width + 13, width: width };
+  const arrowStyle = isLeft ? { right: 0 } : { left: 0 };
+
+  return (
+    <div className={styles.container} style={containerStyle} key="placeholderKey">
+      <div className={styles.expandButton} key="placeholderKey2" onClick={() => (show ? setShow(false) : setShow(true))} style={arrowStyle}>
+        {/* <ArrowRightSVG className={show == isLeft ? '' : styles.arrowLeft} key="placeholderKey3" /> */}
+      </div>
+      <div className={styles.childrenContainer} key="placeholderKey4">
+        <div className={styles.children} key="placeholderKey5">
+          {children}
+        </div>
+      </div>
+    </div>
+  );
+}
diff --git a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
index 691b28d858dbd666def308716cf677c2d576445d..b4e64596b56e4608fa0f38448cc5f975192bc0ec 100644
--- a/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
+++ b/libs/shared/lib/vis/visualizations/rawjsonvis/rawjsonvis.tsx
@@ -1,6 +1,6 @@
 import React, { useEffect } from 'react';
 import ReactJSONView from 'react-json-view';
-import { VisualizationPropTypes, VISComponentType } from '../../visualization.types';
+import { VisualizationPropTypes, VISComponentType } from '../../shared';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
 import { SettingsContainer } from '@graphpolaris/shared/lib/vis/components/config';
 import Input from '@graphpolaris/shared/lib/components/inputs';
diff --git a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
index a0af56f16ad724421536a29052648b7ec5713b0a..6f94fbc27a8351dce580e0ec70fb55d3ca57bd58 100644
--- a/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
+++ b/libs/shared/lib/vis/visualizations/tablevis/tablevis.tsx
@@ -1,7 +1,7 @@
 import React, { useMemo, useRef } from 'react';
 import { Table, AugmentedNodeAttributes } from './components/Table';
 import { SchemaAttribute } from '../../../schema';
-import { VisualizationPropTypes, VISComponentType } from '../../visualization.types';
+import { VisualizationPropTypes, VISComponentType } from '../../shared';
 import Input from '@graphpolaris/shared/lib/components/inputs';
 import { GraphMetaData } from '@graphpolaris/shared/lib/data-access/statistics';
 import { SettingsContainer, SettingsHeader } from '@graphpolaris/shared/lib/vis/components/config';