diff --git a/CHANGELOG b/CHANGELOG
index 8d971a9d8505802386fce2b25cfa29dedee661dd..417135f75f193e2f667b0193b8108f81689a404f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,39 @@
 minerva-front (19.0.0~alpha.0) stable; urgency=medium
   * Feature: support for matomo (#289)
 
- -- Piotr Gawron <piotr.gawron@uni.lu>  Thu, 19 Sep 2024 13:00:00 +0200
+ -- Piotr Gawron <piotr.gawron@uni.lu>  Fri, 18 Oct 2024 13:00:00 +0200
+
+minerva-front (18.0.0~beta.5) stable; urgency=medium
+  * Small improvements: when ToS is defined ask user to accept it (#298)
+  * Small improvements: there is a waiting spinner after clicking on download
+    button (#297)
+  * Small improvements: when exporting map as image provide default selections
+    in for format and submap  (#295)
+  * Small improvements: dropdown sections in exporting map as image are
+    unfolded permanently (#296)
+  * Bugfix: missing links added (#299)
+
+ -- Piotr Gawron <piotr.gawron@uni.lu>  Fri, 04 Oct 2024 13:00:00 +0200
+
+minerva-front (18.0.0~beta.4) stable; urgency=medium
+  * Bugfix: connectivity issue should report a problem with network instead of
+    submitting error report(#293)
+  * Bugfix: source map for js was missing (#292)
+  * Bugfix: sometimes project don't have link to disease or organism, this
+    crashed listing of projects after log in (#290)
+  * Bugfix: show proper message when there is a problem with overlay data
+    instead error report form (#291)
+
+ -- Piotr Gawron <piotr.gawron@uni.lu>  Wed, 02 Oct 2024 13:00:00 +0200
+
+minerva-front (18.0.0~beta.3) stable; urgency=medium
+  * Bugfix: link to download project source was invalid
+  * Bugfix: change background to empty after overlay is loaded so there is no
+    blank background (#285)
+  * Bugfix: license info styling (#280)
+  * Bugfix: list of plugins did not contain version (#287)
+
+ -- Piotr Gawron <piotr.gawron@uni.lu>  Thu, 26 Sep 2024 13:00:00 +0200
 
 minerva-front (18.0.0~beta.2) stable; urgency=medium
   * Feature: minerva frontend - first version
diff --git a/next.config.js b/next.config.js
index 058121d99d2307422ded5ead67dc0c021d164fa2..46540574b2843ee288ec10b756786a7ae1f14995 100644
--- a/next.config.js
+++ b/next.config.js
@@ -3,6 +3,7 @@ const nextConfig = {
   reactStrictMode: true,
   basePath: process.env.APP_PREFIX ? process.env.APP_PREFIX + '/index.html' : '',
   assetPrefix: process.env.APP_PREFIX ? process.env.APP_PREFIX : '',
+  productionBrowserSourceMaps: true,
   output: 'export',
   images: {
     unoptimized: true,
diff --git a/public/config.js b/public/config.js
index 1aed00bd421823eceba4b83d1cbf333bad7eac8b..486d01447b0a63fc61cf907a5f10c709b56f9832 100644
--- a/public/config.js
+++ b/public/config.js
@@ -1,7 +1,9 @@
+// const root = 'https://minerva-dev.lcsb.uni.lu';
+const root = 'https://lux1.atcomp.pl';
 window.config = {
-  BASE_API_URL: 'https://lux1.atcomp.pl/minerva/api',
-  BASE_NEW_API_URL: 'https://lux1.atcomp.pl/minerva/new_api/',
-  BASE_MAP_IMAGES_URL: 'https://lux1.atcomp.pl/',
-  DEFAULT_PROJECT_ID: 'pdmap_appu_test',
-  ADMIN_PANEL_URL: 'https://lux1.atcomp.pl/minerva/admin.xhtml',
+  BASE_API_URL: `${root}/minerva/api`,
+  BASE_NEW_API_URL: `${root}/minerva/new_api/`,
+  BASE_MAP_IMAGES_URL: `${root}/`,
+  DEFAULT_PROJECT_ID: 'sample',
+  ADMIN_PANEL_URL: `${root}/minerva/admin.xhtml`,
 };
diff --git a/src/components/AppWrapper/AppWrapper.component.tsx b/src/components/AppWrapper/AppWrapper.component.tsx
index 5014ee69cbf7e8d0baed57003a58d81dfe049335..2bae3997dd16e426802fd547b3235057ce22aa8c 100644
--- a/src/components/AppWrapper/AppWrapper.component.tsx
+++ b/src/components/AppWrapper/AppWrapper.component.tsx
@@ -8,19 +8,21 @@ interface AppWrapperProps {
   children: ReactNode;
 }
 
-export const AppWrapper = ({ children }: AppWrapperProps): JSX.Element => (
-  <MapInstanceProvider>
-    <Provider store={store}>
-      <>
-        <Toaster
-          position="top-center"
-          visibleToasts={1}
-          style={{
-            width: '700px',
-          }}
-        />
-        {children}
-      </>
-    </Provider>
-  </MapInstanceProvider>
-);
+export const AppWrapper = ({ children }: AppWrapperProps): JSX.Element => {
+  return (
+    <MapInstanceProvider>
+      <Provider store={store}>
+        <>
+          <Toaster
+            position="top-center"
+            visibleToasts={1}
+            style={{
+              width: '700px',
+            }}
+          />
+          {children}
+        </>
+      </Provider>
+    </MapInstanceProvider>
+  );
+};
diff --git a/src/components/FunctionalArea/Modal/Modal.component.tsx b/src/components/FunctionalArea/Modal/Modal.component.tsx
index 8b97ece7a85b1931420cb95c9c781dd9a72d6067..2768dfa3c5a4a66d968a6a7c3ce5ec61c4ea2c2a 100644
--- a/src/components/FunctionalArea/Modal/Modal.component.tsx
+++ b/src/components/FunctionalArea/Modal/Modal.component.tsx
@@ -4,6 +4,7 @@ import dynamic from 'next/dynamic';
 import { AccessDeniedModal } from '@/components/FunctionalArea/Modal/AccessDeniedModal/AccessDeniedModal.component';
 import { AddCommentModal } from '@/components/FunctionalArea/Modal/AddCommentModal/AddCommentModal.component';
 import { LicenseModal } from '@/components/FunctionalArea/Modal/LicenseModal';
+import { ToSModal } from '@/components/FunctionalArea/Modal/ToSModal/ToSModal.component';
 import { EditOverlayModal } from './EditOverlayModal';
 import { LoginModal } from './LoginModal';
 import { ErrorReportModal } from './ErrorReportModal';
@@ -63,6 +64,11 @@ export const Modal = (): React.ReactNode => {
           <AccessDeniedModal />
         </ModalLayout>
       )}
+      {isOpen && modalName === 'terms-of-service' && (
+        <ModalLayout>
+          <ToSModal />
+        </ModalLayout>
+      )}
       {isOpen && modalName === 'select-project' && (
         <ModalLayout>
           <AccessDeniedModal />
diff --git a/src/components/FunctionalArea/Modal/ModalLayout/ModalLayout.component.tsx b/src/components/FunctionalArea/Modal/ModalLayout/ModalLayout.component.tsx
index 56e1991ab095814ea1a03a1856b76e4ada43c07d..b202afcdc6c6088f8db048f00695235c4cbfe94d 100644
--- a/src/components/FunctionalArea/Modal/ModalLayout/ModalLayout.component.tsx
+++ b/src/components/FunctionalArea/Modal/ModalLayout/ModalLayout.component.tsx
@@ -30,6 +30,7 @@ export const ModalLayout = ({ children }: ModalLayoutProps): JSX.Element => {
             modalName === 'login' && 'h-auto w-[400px]',
             modalName === 'access-denied' && 'h-auto w-[400px]',
             modalName === 'select-project' && 'h-auto w-[400px]',
+            modalName === 'terms-of-service' && 'h-auto w-[400px]',
             modalName === 'add-comment' && 'h-auto w-[400px]',
             modalName === 'error-report' && 'h-auto w-[800px]',
             ['edit-overlay', 'logged-in-menu'].includes(modalName) && 'h-auto w-[432px]',
@@ -46,7 +47,7 @@ export const ModalLayout = ({ children }: ModalLayoutProps): JSX.Element => {
               <div> {modalTitle} </div>
             )}
 
-            {modalName !== 'logged-in-menu' && (
+            {modalName !== 'logged-in-menu' && modalName !== 'terms-of-service' && (
               <button type="button" onClick={handleCloseModal} aria-label="close button">
                 <Icon name="close" className="fill-font-500" />
               </button>
diff --git a/src/components/FunctionalArea/Modal/ToSModal/ToSModal.component.tsx b/src/components/FunctionalArea/Modal/ToSModal/ToSModal.component.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7d3d4e766253a5b8f061f9dc0758f65f4e10df2e
--- /dev/null
+++ b/src/components/FunctionalArea/Modal/ToSModal/ToSModal.component.tsx
@@ -0,0 +1,59 @@
+import React from 'react';
+import { useAppDispatch } from '@/redux/hooks/useAppDispatch';
+import { Button } from '@/shared/Button';
+
+import { getSessionValid, logout, updateUser } from '@/redux/user/user.thunks';
+import { closeModal } from '@/redux/modal/modal.slice';
+import { userSelector } from '@/redux/user/user.selectors';
+import { useAppSelector } from '@/redux/hooks/useAppSelector';
+import { termsOfServiceValSelector } from '@/redux/configuration/configuration.selectors';
+
+export const ToSModal: React.FC = () => {
+  const dispatch = useAppDispatch();
+  const { userData } = useAppSelector(userSelector);
+
+  const termsOfService = useAppSelector(termsOfServiceValSelector);
+
+  const updateUserTosHandler = async (): Promise<void> => {
+    // eslint-disable-next-line no-console
+    console.log('update');
+    if (userData) {
+      const user = { ...userData, termsOfUseConsent: true };
+      await dispatch(updateUser(user));
+      await dispatch(getSessionValid());
+      dispatch(closeModal());
+    }
+  };
+
+  const logoutHandler = async (): Promise<void> => {
+    await dispatch(logout());
+    dispatch(closeModal());
+  };
+
+  return (
+    <div className="w-[400px] border border-t-[#E1E0E6] bg-white p-[24px]">
+      <div>
+        I agree to the minerva{' '}
+        <a href={termsOfService} target="_blank" className="underline">
+          Terms of Service.
+        </a>
+      </div>
+      <div className="mt-4 grid grid-cols-2 gap-2">
+        <div>
+          <Button
+            className="ring-transparent hover:ring-transparent"
+            variantStyles="secondary"
+            onClick={updateUserTosHandler}
+          >
+            OK
+          </Button>
+        </div>
+        <div className="text-center">
+          <Button className="block w-full" onClick={logoutHandler}>
+            I disagree
+          </Button>
+        </div>
+      </div>
+    </div>
+  );
+};
diff --git a/src/components/FunctionalArea/NavBar/NavBar.component.test.tsx b/src/components/FunctionalArea/NavBar/NavBar.component.test.tsx
index 08d6c36c21ccbd80c7ccba9280e367952c96f99d..ea8cc7f408b675108e778871dc7242d5e20c1e95 100644
--- a/src/components/FunctionalArea/NavBar/NavBar.component.test.tsx
+++ b/src/components/FunctionalArea/NavBar/NavBar.component.test.tsx
@@ -23,7 +23,7 @@ describe('NavBar - component', () => {
 
     expect(screen.getByTestId('nav-buttons')).toBeInTheDocument();
     expect(screen.getByTestId('nav-logos-and-powered-by')).toBeInTheDocument();
-    expect(screen.getByAltText('luxembourg logo')).toBeInTheDocument();
-    expect(screen.getByAltText('logo')).toBeInTheDocument();
+    expect(screen.getByAltText('University of Luxembourg logo')).toBeInTheDocument();
+    expect(screen.getByAltText('Minerva logo')).toBeInTheDocument();
   });
 });
diff --git a/src/components/FunctionalArea/NavBar/NavBar.component.tsx b/src/components/FunctionalArea/NavBar/NavBar.component.tsx
index 7eb7b2b0f556a4f4fe4e7a805ed00a916a97cd8a..8b40cd7245480d4ce5ea88e59cf9296b88718c4c 100644
--- a/src/components/FunctionalArea/NavBar/NavBar.component.tsx
+++ b/src/components/FunctionalArea/NavBar/NavBar.component.tsx
@@ -92,14 +92,18 @@ export const NavBar = (): JSX.Element => {
         />
       </div>
       <div className="flex flex-col items-center gap-[20px]" data-testid="nav-logos-and-powered-by">
-        <Image
-          className="rounded rounded-e rounded-s bg-white-pearl pb-[7px]"
-          src={luxembourgLogoImg}
-          alt="luxembourg logo"
-          height={41}
-          width={48}
-        />
-        <Image src={logoImg} alt="logo" height={48} width={48} />
+        <a href="https://www.uni.lu/en/" target="_blank">
+          <Image
+            className="rounded rounded-e rounded-s bg-white-pearl pb-[7px]"
+            src={luxembourgLogoImg}
+            alt="University of Luxembourg logo"
+            height={41}
+            width={48}
+          />
+        </a>
+        <a href="https://minerva.uni.lu/" target="_blank">
+          <Image src={logoImg} alt="Minerva logo" height={48} width={48} />
+        </a>
         <span className="h-16 w-14 text-center text-[8px] leading-4">
           Powered by: MINERVA Platform{' '}
           <a href={MINERVA_WEBSITE_URL} target="_blank">
diff --git a/src/components/FunctionalArea/TopBar/User/AuthenticatedUser/AuthenticatedUser.component.tsx b/src/components/FunctionalArea/TopBar/User/AuthenticatedUser/AuthenticatedUser.component.tsx
index 57b836750126ed657facc8a79affd6edfa2b9d7e..3c5dc54d450e58321a497549684c9d1f3922f59f 100644
--- a/src/components/FunctionalArea/TopBar/User/AuthenticatedUser/AuthenticatedUser.component.tsx
+++ b/src/components/FunctionalArea/TopBar/User/AuthenticatedUser/AuthenticatedUser.component.tsx
@@ -1,6 +1,11 @@
 import { useSelect } from 'downshift';
 import { IconButton } from '@/shared/IconButton';
 import { twMerge } from 'tailwind-merge';
+import { useAppDispatch } from '@/redux/hooks/useAppDispatch';
+import { useAppSelector } from '@/redux/hooks/useAppSelector';
+import { userSelector } from '@/redux/user/user.selectors';
+import { openToSModal } from '@/redux/modal/modal.slice';
+import { termsOfServiceValSelector } from '@/redux/configuration/configuration.selectors';
 import { useUserActions } from '../hooks/useUserActions';
 
 export const AuthenticatedUser = (): React.ReactNode => {
@@ -10,6 +15,14 @@ export const AuthenticatedUser = (): React.ReactNode => {
     items: actions,
   });
 
+  const dispatch = useAppDispatch();
+  const { userData } = useAppSelector(userSelector);
+  const termsOfService = useAppSelector(termsOfServiceValSelector);
+
+  if (userData && !userData.termsOfUseConsent && termsOfService) {
+    dispatch(openToSModal());
+  }
+
   return (
     <>
       <IconButton
diff --git a/src/components/Map/Drawer/AvailablePluginsDrawer/AvailablePluginsDrawer.component.test.tsx b/src/components/Map/Drawer/AvailablePluginsDrawer/AvailablePluginsDrawer.component.test.tsx
index 436f89c6a9a4cd4737c4d4eb4627c2ffb65799fc..1e33584b23527b180c27d3fe864e2f0228c41c23 100644
--- a/src/components/Map/Drawer/AvailablePluginsDrawer/AvailablePluginsDrawer.component.test.tsx
+++ b/src/components/Map/Drawer/AvailablePluginsDrawer/AvailablePluginsDrawer.component.test.tsx
@@ -48,7 +48,7 @@ describe('AvailablePluginsDrawer - component', () => {
           },
         });
 
-        const pluginLabel = screen.getByText(currentPlugin.name);
+        const pluginLabel = screen.getByText(`${currentPlugin.name} (${currentPlugin.version})`);
         expect(pluginLabel).toBeInTheDocument();
       },
     );
diff --git a/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.test.tsx b/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.test.tsx
index ca74841a981e53d189e46e52b9a859ca73856620..a672f76aa035043a6fdcb1844a5d9c3833bd9350 100644
--- a/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.test.tsx
+++ b/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.test.tsx
@@ -43,7 +43,7 @@ describe('LoadPlugin - component', () => {
     it('renders plugin name', () => {
       renderComponent({ plugin });
 
-      const title = screen.getByText(plugin.name);
+      const title = screen.getByText(`${plugin.name} (${plugin.version})`);
       expect(title).toBeInTheDocument();
     });
 
diff --git a/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.tsx b/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.tsx
index 72ec131e851a51671c7f8b9934948613937421fb..b074ab0a0b66d09a2be8478fa69dff7fcdbac539 100644
--- a/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.tsx
+++ b/src/components/Map/Drawer/AvailablePluginsDrawer/LoadPlugin/LoadPlugin.component.tsx
@@ -22,7 +22,9 @@ export const LoadPlugin = ({ plugin }: Props): JSX.Element => {
 
   return (
     <div className="flex w-full items-center justify-between text-sm">
-      <span className="text-cetacean-blue">{plugin.name}</span>
+      <span className="text-cetacean-blue">
+        {plugin.name} ({plugin.version})
+      </span>
       <Button
         variantStyles="secondary"
         className="h-10 self-end rounded-e rounded-s text-xs font-medium"
diff --git a/src/components/Map/Drawer/ExportDrawer/CollapsibleSection/CollapsibleSection.component.tsx b/src/components/Map/Drawer/ExportDrawer/CollapsibleSection/CollapsibleSection.component.tsx
index 2dc750a9bc35c59817b96191ed83478d7b453d84..0ac2e56dcd3bdaa1e888bd93665a65a82b9a0c5d 100644
--- a/src/components/Map/Drawer/ExportDrawer/CollapsibleSection/CollapsibleSection.component.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/CollapsibleSection/CollapsibleSection.component.tsx
@@ -12,12 +12,14 @@ type CollapsibleSectionProps = {
   title: string;
   children: React.ReactNode;
   onOpened?(): void;
+  dangerouslySetExpanded?: boolean;
 };
 
 export const CollapsibleSection = ({
   title,
   children,
   onOpened,
+  dangerouslySetExpanded,
 }: CollapsibleSectionProps): React.ReactNode => {
   const handleOnChange = (ids: ID[]): void => {
     const hasBeenOpened = ids.length > ZERO;
@@ -29,7 +31,7 @@ export const CollapsibleSection = ({
 
   return (
     <Accordion allowZeroExpanded onChange={handleOnChange}>
-      <AccordionItem>
+      <AccordionItem dangerouslySetExpanded={dangerouslySetExpanded}>
         <AccordionItemHeading>
           <AccordionItemButton>{title}</AccordionItemButton>
         </AccordionItemHeading>
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadElements/DownloadElements.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadElements/DownloadElements.tsx
index 53276caa74a5bd4b0851f3b189df50e79a2a53f3..8a987f80d5a99437f0a06297a62daa1c8db2f8d4 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadElements/DownloadElements.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadElements/DownloadElements.tsx
@@ -1,13 +1,33 @@
-import { useContext } from 'react';
+import { useContext, useState } from 'react';
 import { Button } from '@/shared/Button';
+import Image from 'next/image';
+import spinnerIcon from '@/assets/vectors/icons/spinner.svg';
 import { ExportContext } from '../ExportCompound.context';
 
 export const DownloadElements = (): React.ReactNode => {
   const { handleDownloadElements } = useContext(ExportContext);
+  const [downloadingElements, setDownloadingElements] = useState<boolean>(false);
+
+  const handleDownloadElementsWrapper = async (): Promise<void> => {
+    setDownloadingElements(true);
+    await handleDownloadElements();
+    setDownloadingElements(false);
+  };
 
   return (
     <div className="mt-6">
-      <Button onClick={handleDownloadElements}>Download</Button>
+      <Button onClick={handleDownloadElementsWrapper}>
+        {downloadingElements && (
+          <Image
+            src={spinnerIcon}
+            alt="spinner icon"
+            height={12}
+            width={12}
+            className="mr-2 animate-spin"
+          />
+        )}
+        Download
+      </Button>
     </div>
   );
 };
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadNetwork/DownloadNetwork.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadNetwork/DownloadNetwork.tsx
index 8e0fb25dd7a80742635bc5039e63a74ceae686cc..8097900e7f1212f33af740a4746d86678a85cd9f 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadNetwork/DownloadNetwork.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/DownloadNetwork/DownloadNetwork.tsx
@@ -1,13 +1,33 @@
-import { useContext } from 'react';
+import { useContext, useState } from 'react';
 import { Button } from '@/shared/Button';
+import Image from 'next/image';
+import spinnerIcon from '@/assets/vectors/icons/spinner.svg';
 import { ExportContext } from '../ExportCompound.context';
 
 export const DownloadNetwork = (): React.ReactNode => {
   const { handleDownloadNetwork } = useContext(ExportContext);
+  const [downloadingNetwork, setDownloadingNetwork] = useState<boolean>(false);
+
+  const handleDownloadNetworkWrapper = async (): Promise<void> => {
+    setDownloadingNetwork(true);
+    await handleDownloadNetwork();
+    setDownloadingNetwork(false);
+  };
 
   return (
     <div className="mt-6">
-      <Button onClick={handleDownloadNetwork}>Download</Button>
+      <Button onClick={handleDownloadNetworkWrapper}>
+        {downloadingNetwork && (
+          <Image
+            src={spinnerIcon}
+            alt="spinner icon"
+            height={12}
+            width={12}
+            className="mr-2 animate-spin"
+          />
+        )}
+        Download
+      </Button>
     </div>
   );
 };
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.component.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.component.tsx
index 52bc373224656a1994d53acf5fbda4b6a9619273..f5803c10f60e163d333a9eadc1fb8b6855d7486c 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.component.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.component.tsx
@@ -52,8 +52,7 @@ export const Export = ({ children }: ExportProps): JSX.Element => {
       includedCompartmentPathways,
       excludedCompartmentPathways,
     });
-
-    dispatch(downloadElements(body));
+    await dispatch(downloadElements(body));
   }, [modelIds, annotations, includedCompartmentPathways, excludedCompartmentPathways, dispatch]);
 
   const handleDownloadNetwork = useCallback(async () => {
@@ -65,7 +64,7 @@ export const Export = ({ children }: ExportProps): JSX.Element => {
       excludedCompartmentPathways,
     });
 
-    dispatch(downloadNetwork(data));
+    await dispatch(downloadNetwork(data));
   }, [modelIds, annotations, includedCompartmentPathways, excludedCompartmentPathways, dispatch]);
 
   const handleDownloadGraphics = useCallback(async () => {
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.constant.ts b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.constant.ts
index a07ae4c58f7b2fa3ec8ef4f652c1d4c9dbca075b..5a7e4f086b680db77987b73ae01317a6d0cb74b4 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.constant.ts
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.constant.ts
@@ -54,8 +54,8 @@ export const EXPORT_CONTEXT_DEFAULT_VALUE: ExportContextType = {
   setModels: () => {},
   setImageSize: () => {},
   setImageFormats: () => {},
-  handleDownloadElements: () => {},
-  handleDownloadNetwork: () => {},
+  handleDownloadElements: () => Promise.resolve(),
+  handleDownloadNetwork: () => Promise.resolve(),
   handleDownloadGraphics: () => {},
   data: {
     annotations: [],
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.types.ts b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.types.ts
index b6e70397e6d6edb1ca1a5220aebb814c3518ff4e..02c87101e98091a30464c03f9d46d9deba6f56a8 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.types.ts
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ExportCompound.types.ts
@@ -8,8 +8,8 @@ export type ExportContextType = {
   setModels: React.Dispatch<React.SetStateAction<CheckboxItem[]>>;
   setImageSize: React.Dispatch<React.SetStateAction<ImageSize>>;
   setImageFormats: React.Dispatch<React.SetStateAction<CheckboxItem[]>>;
-  handleDownloadElements: () => void;
-  handleDownloadNetwork: () => void;
+  handleDownloadElements: () => Promise<void>;
+  handleDownloadNetwork: () => Promise<void>;
   handleDownloadGraphics: () => void;
   data: {
     annotations: CheckboxItem[];
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.test.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.test.tsx
index e8c6df3921c6a70d96caeb543b922cd4e6de6ac8..33a1897e0ce24acfe01d55c03fabed60c191a44a 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.test.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.test.tsx
@@ -40,8 +40,6 @@ describe('ImageFormat - component', () => {
       },
     });
 
-    expect(screen.queryByTestId('checkbox-filter')).not.toBeVisible();
-
     const navigationButton = screen.getByTestId('accordion-item-button');
 
     act(() => {
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.tsx
index 48ab881789d2445fc5f67e5f6a7ffc6c0b7c85e1..84e59e239b00bd0769b97ecbcad0f4871e790688 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageFormat/ImageFormat.component.tsx
@@ -4,7 +4,8 @@ import {
   loadingConfigurationMainSelector,
 } from '@/redux/configuration/configuration.selectors';
 import { useAppSelector } from '@/redux/hooks/useAppSelector';
-import { useContext } from 'react';
+import { useContext, useState } from 'react';
+import { CheckboxItem } from '@/components/Map/Drawer/ExportDrawer/CheckboxFilter/CheckboxFilter.types';
 import { CheckboxFilter } from '../../CheckboxFilter';
 import { CollapsibleSection } from '../../CollapsibleSection';
 import { ExportContext } from '../ExportCompound.context';
@@ -23,8 +24,18 @@ export const ImageFormat = (): React.ReactNode => {
       label: name,
     }));
 
+  const options = useState<CheckboxItem[]>(mappedElementAnnotations);
+  if (
+    !isPending &&
+    currentImageFormats.length === ZERO &&
+    options.length > ZERO &&
+    options[ZERO].length > ZERO
+  ) {
+    setImageFormats([options[ZERO][ZERO]]);
+  }
+
   return (
-    <CollapsibleSection title="Image format">
+    <CollapsibleSection title="Image format" dangerouslySetExpanded>
       {isPending && <p>Loading...</p>}
       {!isPending && mappedElementAnnotations.length > ZERO && (
         <CheckboxFilter
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageSize/ImageSize.component.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageSize/ImageSize.component.tsx
index 1a66c44e45e0895fb78380222618fa74666cb59b..0847c46023efa0359df362fa47d60377f1ef0338 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageSize/ImageSize.component.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/ImageSize/ImageSize.component.tsx
@@ -5,7 +5,7 @@ export const ImageSize = (): React.ReactNode => {
   const { width, height, handleChangeHeight, handleChangeWidth } = useImageSize();
 
   return (
-    <CollapsibleSection title="Image size">
+    <CollapsibleSection title="Image size" dangerouslySetExpanded>
       <div className="flex flex-col gap-4">
         <label className="flex h-9 items-center gap-4">
           <span className="w-12">Width:&nbsp;</span>
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.test.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.test.tsx
index 2374285dc947b4e0fa4c66e0ab8384f2ab58571f..6ee9cb42426c0d218bcf1922f0d4db5a0d6a41fd 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.test.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.test.tsx
@@ -39,8 +39,6 @@ describe('Submap - component', () => {
       },
     });
 
-    expect(screen.queryByTestId('checkbox-filter')).not.toBeVisible();
-
     const navigationButton = screen.getByTestId('accordion-item-button');
 
     act(() => {
diff --git a/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.tsx b/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.tsx
index 5c5590ce5c669473922f966cfdfcc13df4269f77..422c4b7385fffdac8bde41a57f9c1ed0543986dd 100644
--- a/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.tsx
+++ b/src/components/Map/Drawer/ExportDrawer/ExportCompound/Submap/Submap.component.tsx
@@ -1,7 +1,8 @@
 import { ZERO } from '@/constants/common';
 import { useAppSelector } from '@/redux/hooks/useAppSelector';
 import { loadingModelsSelector, modelsDataSelector } from '@/redux/models/models.selectors';
-import { useContext } from 'react';
+import { useContext, useState } from 'react';
+import { CheckboxItem } from '@/components/Map/Drawer/ExportDrawer/CheckboxFilter/CheckboxFilter.types';
 import { CheckboxFilter } from '../../CheckboxFilter';
 import { CollapsibleSection } from '../../CollapsibleSection';
 import { ExportContext } from '../ExportCompound.context';
@@ -18,8 +19,18 @@ export const Submap = (): React.ReactNode => {
     label: name,
   }));
 
+  const options = useState<CheckboxItem[]>(mappedElementAnnotations);
+  if (
+    !isPending &&
+    currentSelectedModels.length === ZERO &&
+    options.length > ZERO &&
+    options[ZERO].length > ZERO
+  ) {
+    setModels([options[ZERO][ZERO]]);
+  }
+
   return (
-    <CollapsibleSection title="Submap">
+    <CollapsibleSection title="Submap" dangerouslySetExpanded>
       {isPending && <p>Loading...</p>}
       {!isPending && mappedElementAnnotations && mappedElementAnnotations.length > ZERO && (
         <CheckboxFilter
diff --git a/src/components/Map/Drawer/OverlaysDrawer/hooks/useOverlay.ts b/src/components/Map/Drawer/OverlaysDrawer/hooks/useOverlay.ts
index 4c5fdcbe66ba761f34aac9f3a9e54f79d04d5f2f..6fde317abae032b522992d79244258e437df87db 100644
--- a/src/components/Map/Drawer/OverlaysDrawer/hooks/useOverlay.ts
+++ b/src/components/Map/Drawer/OverlaysDrawer/hooks/useOverlay.ts
@@ -39,12 +39,12 @@ export const useOverlay = (overlayId: number): UseOverlay => {
     }
   };
 
-  const toggleOverlay = (): void => {
+  const toggleOverlay = async (): Promise<void> => {
     if (isOverlayActive) {
       dispatch(removeOverlayBioEntityForGivenOverlay({ overlayId }));
     } else {
+      await dispatch(getOverlayBioEntityForAllModels({ overlayId }));
       setBackgroundtoEmptyIfAvailable();
-      dispatch(getOverlayBioEntityForAllModels({ overlayId }));
     }
 
     dispatchPluginEvents();
diff --git a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx
index ef21f2dc7f3df531e4a1bc64d988af4546dceac7..1c24ab14aa18f6f2113a54fcf786b178484fa3e2 100644
--- a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx
+++ b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx
@@ -98,7 +98,7 @@ describe('ProjectInfoDrawer', () => {
     expect(downloadButton).toBeInTheDocument();
     expect(downloadButton).toHaveAttribute(
       'href',
-      'localhost/projects/pdmap_appu_test:downloadSource',
+      'https://lux1.atcomp.pl/minerva/api/projects/pdmap_appu_test:downloadSource',
     );
     expect(downloadButton).toHaveAttribute('download', 'sourceFile.txt');
   });
diff --git a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx
index 3d92366ef43188b3c75df84ac204b9e55a592137..80c6cd351b1dce422bbc0cec3c861e2f481c1dbf 100644
--- a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx
+++ b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx
@@ -16,6 +16,7 @@ import { DrawerHeading } from '@/shared/DrawerHeading';
 import { LinkButton } from '@/shared/LinkButton';
 import { useEffect } from 'react';
 import './ProjectInfoDrawer.styles.css';
+import { BASE_API_URL } from '@/constants';
 
 export const ProjectInfoDrawer = (): JSX.Element => {
   const dispatch = useAppDispatch();
@@ -28,7 +29,10 @@ export const ProjectInfoDrawer = (): JSX.Element => {
   const version = useAppSelector(versionSelector);
   const description = useAppSelector(mainMapModelDescriptionSelector);
 
-  const sourceDownloadLink = window.location.hostname + apiPath.getSourceFile();
+  const sourceDownloadLink = BASE_API_URL + apiPath.getSourceFile();
+
+  // eslint-disable-next-line no-console
+  console.log(sourceDownloadLink);
 
   let licenseName: string = '';
   if (project) {
@@ -94,7 +98,7 @@ export const ProjectInfoDrawer = (): JSX.Element => {
               <button
                 type="button"
                 onClick={onLicenseClick}
-                className="truncate text-base font-semibold"
+                className="w-full truncate text-base font-semibold"
                 title={licenseName}
               >
                 {licenseName}
diff --git a/src/models/disease.ts b/src/models/disease.ts
index 7152a107591c97797fb840aae640a4f49ac191d0..b83325f70086e89274803983a72e495687a9bb58 100644
--- a/src/models/disease.ts
+++ b/src/models/disease.ts
@@ -2,7 +2,7 @@ import { z } from 'zod';
 
 export const disease = z.object({
   id: z.number().int().positive(),
-  link: z.string().optional(),
+  link: z.string().nullable(),
   type: z.string(),
   resource: z.string(),
   annotatorClassName: z.string(),
diff --git a/src/models/organism.ts b/src/models/organism.ts
index f583456293d3886270327f55285aaa67d8cd90a6..899cbe4695713cc4011f3055462f74ac3185ec45 100644
--- a/src/models/organism.ts
+++ b/src/models/organism.ts
@@ -2,7 +2,7 @@ import { z } from 'zod';
 
 export const organism = z.object({
   id: z.number().int().positive(),
-  link: z.string().optional(),
+  link: z.string().nullable(),
   type: z.string(),
   resource: z.string(),
   annotatorClassName: z.string(),
diff --git a/src/redux/apiPath.ts b/src/redux/apiPath.ts
index 01fae40c7ce0e33a8e140d734d054c440aa3425e..00bbeff82177add3c514c5c2d3c9a4dd9974aacf 100644
--- a/src/redux/apiPath.ts
+++ b/src/redux/apiPath.ts
@@ -105,6 +105,7 @@ export const apiPath = {
   getSubmapConnections: (): string => `projects/${PROJECT_ID}/submapConnections/`,
   logout: (): string => `doLogout`,
   user: (login: string): string => `users/${login}`,
+  updateUser: (login: string): string => `users/${login}`,
   getStacktrace: (code: string): string => `stacktrace/${code}`,
   submitError: (): string => `minervanet/submitError`,
   getOauthProviders: (): string => `oauth/providers/`,
diff --git a/src/redux/configuration/configuration.constants.ts b/src/redux/configuration/configuration.constants.ts
index c6084ddf6c5aee1da7ec1cb6c98938ff3dd8aed4..64cad84b74a151e569c9e7f02dd51ef0dc29a06e 100644
--- a/src/redux/configuration/configuration.constants.ts
+++ b/src/redux/configuration/configuration.constants.ts
@@ -5,6 +5,7 @@ export const NEUTRAL_COLOR_VAL_NAME_ID = 'NEUTRAL_COLOR_VAL';
 export const OVERLAY_OPACITY_NAME_ID = 'OVERLAY_OPACITY';
 export const SEARCH_DISTANCE_NAME_ID = 'SEARCH_DISTANCE';
 export const REQUEST_ACCOUNT_EMAIL = 'REQUEST_ACCOUNT_EMAIL';
+export const TERMS_OF_SERVICE_ID = 'TERMS_OF_USE';
 export const MATOMO_URL = 'MATOMO_URL';
 
 export const LEGEND_FILE_NAMES_IDS = [
diff --git a/src/redux/configuration/configuration.selectors.ts b/src/redux/configuration/configuration.selectors.ts
index ae5b97b7bc077a3f8316f26faf57e32ce2f8a5bf..176847d40d89b9e31dd50f1fe1e8fb3657c14b94 100644
--- a/src/redux/configuration/configuration.selectors.ts
+++ b/src/redux/configuration/configuration.selectors.ts
@@ -18,6 +18,7 @@ import {
   SVG_IMAGE_HANDLER_NAME_ID,
   SEARCH_DISTANCE_NAME_ID,
   REQUEST_ACCOUNT_EMAIL,
+  TERMS_OF_SERVICE_ID,
 } from './configuration.constants';
 
 import { ConfigurationHandlersIds, ConfigurationImageHandlersIds } from './configuration.types';
@@ -63,6 +64,11 @@ export const adminEmailValSelector = createSelector(
   state => configurationAdapterSelectors.selectById(state, REQUEST_ACCOUNT_EMAIL)?.value,
 );
 
+export const termsOfServiceValSelector = createSelector(
+  configurationOptionsSelector,
+  state => configurationAdapterSelectors.selectById(state, TERMS_OF_SERVICE_ID)?.value,
+);
+
 export const defaultLegendImagesSelector = createSelector(configurationOptionsSelector, state =>
   LEGEND_FILE_NAMES_IDS.map(
     legendNameId => configurationAdapterSelectors.selectById(state, legendNameId)?.value,
diff --git a/src/redux/middlewares/error.middleware.ts b/src/redux/middlewares/error.middleware.ts
index 56ba18c0f5cfcef3435ac3d6b86aa2e8db452f45..0a8913b5ee876bb9fe9a232525afd75939a6b856 100644
--- a/src/redux/middlewares/error.middleware.ts
+++ b/src/redux/middlewares/error.middleware.ts
@@ -3,6 +3,9 @@ import { Action, createListenerMiddleware, isRejected } from '@reduxjs/toolkit';
 import { createErrorData } from '@/utils/error-report/errorReporting';
 import { openAccessDeniedModal, openErrorReportModal } from '@/redux/modal/modal.slice';
 import { getProjects } from '@/redux/projects/projects.thunks';
+import axios from 'axios';
+import { AXIOS_ERROR_NETWORK } from '@/utils/getErrorMessage/getErrorMessage.constants';
+import { showToast } from '@/utils/showToast';
 
 export const errorListenerMiddleware = createListenerMiddleware();
 
@@ -16,6 +19,17 @@ export const errorMiddlewareListener = async (
     if (action.error.code === '403') {
       dispatch(getProjects());
       dispatch(openAccessDeniedModal());
+    } else if (axios.isAxiosError(action.error) && action.error.code === AXIOS_ERROR_NETWORK) {
+      // eslint-disable-next-line no-console
+      console.log(action.error);
+      showToast({
+        type: 'error',
+        message:
+          'There was a problem with fetching data from minerva server. ' +
+          'Please check your internet connection and try again. ' +
+          'If problem problem persists contact system administrator.',
+        duration: 15000,
+      });
     } else {
       const errorData = await createErrorData(action.error, getState());
       dispatch(openErrorReportModal(errorData));
diff --git a/src/redux/modal/modal.reducers.ts b/src/redux/modal/modal.reducers.ts
index 4556c17cc91238adaa87cb538d3d8548ea4376e4..236f7f809f2b3d01bca4d20b095ad25917dba6a8 100644
--- a/src/redux/modal/modal.reducers.ts
+++ b/src/redux/modal/modal.reducers.ts
@@ -109,3 +109,9 @@ export const openLicenseModalReducer = (state: ModalState, action: PayloadAction
   state.modalName = 'license';
   state.modalTitle = `License: ${action.payload}`;
 };
+
+export const openToSModalReducer = (state: ModalState): void => {
+  state.isOpen = true;
+  state.modalName = 'terms-of-service';
+  state.modalTitle = 'Terms of service!';
+};
diff --git a/src/redux/modal/modal.slice.ts b/src/redux/modal/modal.slice.ts
index 3e945e4a1e01b8d6cba771860700e4e2e9177927..bb145852246d450ffde3acb6e935f77eaac280f6 100644
--- a/src/redux/modal/modal.slice.ts
+++ b/src/redux/modal/modal.slice.ts
@@ -15,6 +15,7 @@ import {
   openAccessDeniedModalReducer,
   openSelectProjectModalReducer,
   openLicenseModalReducer,
+  openToSModalReducer,
 } from './modal.reducers';
 
 const modalSlice = createSlice({
@@ -35,6 +36,7 @@ const modalSlice = createSlice({
     openAccessDeniedModal: openAccessDeniedModalReducer,
     openSelectProjectModal: openSelectProjectModalReducer,
     openLicenseModal: openLicenseModalReducer,
+    openToSModal: openToSModalReducer,
   },
 });
 
@@ -53,6 +55,7 @@ export const {
   openAccessDeniedModal,
   openSelectProjectModal,
   openLicenseModal,
+  openToSModal,
 } = modalSlice.actions;
 
 export default modalSlice.reducer;
diff --git a/src/redux/overlays/overlays.thunks.ts b/src/redux/overlays/overlays.thunks.ts
index 5a685bc8f5f5ab1140d28411895fd7f9a7cb3d8c..389da3066415557b1c8f02aa7ec6395cf9ff3172 100644
--- a/src/redux/overlays/overlays.thunks.ts
+++ b/src/redux/overlays/overlays.thunks.ts
@@ -15,6 +15,7 @@ import { showToast } from '@/utils/showToast';
 import { ThunkConfig } from '@/types/store';
 import { BASE_API_URL } from '@/constants';
 import { getError } from '@/utils/error-report/getError';
+import axios from 'axios';
 import { apiPath } from '../apiPath';
 import {
   CHUNK_SIZE,
@@ -221,7 +222,12 @@ export const addOverlay = createAsyncThunk<undefined, AddOverlayArgs, ThunkConfi
 
       showToast({ type: 'success', message: USER_OVERLAY_ADD_SUCCESS_MESSAGE });
     } catch (error) {
-      return Promise.reject(getError({ error, prefix: USER_OVERLAY_ADD_ERROR_PREFIX }));
+      if (axios.isAxiosError(error) && error.code === 'ERR_BAD_REQUEST') {
+        const data = error.response?.data;
+        showToast({ type: 'error', message: data.reason, duration: 120000 });
+      } else {
+        return Promise.reject(getError({ error, prefix: USER_OVERLAY_ADD_ERROR_PREFIX }));
+      }
     }
   },
 );
diff --git a/src/redux/project/project.selectors.ts b/src/redux/project/project.selectors.ts
index c009c3c484281be0171234ca818ba6870b38d63d..7263a04051e0278d1f6163ccc7e76a239b18e886 100644
--- a/src/redux/project/project.selectors.ts
+++ b/src/redux/project/project.selectors.ts
@@ -45,14 +45,12 @@ export const diseaseNameSelector = createSelector(
   projectData => projectData?.diseaseName,
 );
 
-export const diseaseLinkSelector = createSelector(
-  projectDataSelector,
-  projectData => projectData?.disease?.link,
+export const diseaseLinkSelector = createSelector(projectDataSelector, projectData =>
+  projectData?.disease?.link ? projectData?.disease?.link : undefined,
 );
 
-export const organismLinkSelector = createSelector(
-  projectDataSelector,
-  projectData => projectData?.organism?.link,
+export const organismLinkSelector = createSelector(projectDataSelector, projectData =>
+  projectData?.organism?.link ? projectData?.organism?.link : undefined,
 );
 
 export const organismNameSelector = createSelector(
diff --git a/src/redux/root/init.thunks.ts b/src/redux/root/init.thunks.ts
index 41fa48fabdf9d984e8117917b4f01c338ab0d1b2..e1344cc06dc845d4fc59a7fbb943a21c4a62c603 100644
--- a/src/redux/root/init.thunks.ts
+++ b/src/redux/root/init.thunks.ts
@@ -1,3 +1,4 @@
+import spinnerIcon from '@/assets/vectors/icons/spinner.svg';
 import { PROJECT_ID } from '@/constants';
 import { openOverlaysDrawer, openSearchDrawerWithSelectedTab } from '@/redux/drawer/drawer.slice';
 import { AppDispatch, store } from '@/redux/store';
@@ -162,4 +163,5 @@ export const fetchInitialAppData = createAsyncThunk<
     await dispatch(getProjects());
     dispatch(openSelectProjectModal());
   }
+  new Image().src = spinnerIcon.src;
 });
diff --git a/src/redux/user/user.thunks.ts b/src/redux/user/user.thunks.ts
index 3e1f7bc1079e8524940facf371cd28bf14511fb1..9b016dd81526e58f529f591b18c39c7d9f451bf0 100644
--- a/src/redux/user/user.thunks.ts
+++ b/src/redux/user/user.thunks.ts
@@ -9,9 +9,11 @@ import { getError } from '@/utils/error-report/getError';
 import axios, { HttpStatusCode } from 'axios';
 import { showToast } from '@/utils/showToast';
 import { setLoginForOldMinerva } from '@/utils/setLoginForOldMinerva';
-import { apiPath } from '../apiPath';
-import { closeModal, openLoggedInMenuModal } from '../modal/modal.slice';
+import { ThunkConfig } from '@/types/store';
+import { userSchema } from '@/models/userSchema';
 import { hasPrivilege } from './user.utils';
+import { closeModal, openLoggedInMenuModal } from '../modal/modal.slice';
+import { apiPath } from '../apiPath';
 
 const getUserRole = (privileges: UserPrivilege[]): string => {
   if (hasPrivilege(privileges, 'IS_ADMIN')) {
@@ -118,3 +120,29 @@ export const logout = createAsyncThunk('user/logout', async () => {
     return Promise.reject(getError({ error, prefix: 'Log out' }));
   }
 });
+
+export const updateUser = createAsyncThunk<undefined, User, ThunkConfig>(
+  'users/updateUser',
+  // eslint-disable-next-line consistent-return
+  async user => {
+    try {
+      const newUser = await axiosInstance.patch<User>(
+        apiPath.updateUser(user.login),
+        {
+          user: {
+            termsOfUseConsent: user.termsOfUseConsent,
+          },
+        },
+        {
+          withCredentials: true,
+        },
+      );
+
+      validateDataUsingZodSchema(newUser, userSchema);
+
+      showToast({ type: 'success', message: 'ToS agreement registered' });
+    } catch (error) {
+      return Promise.reject(getError({ error }));
+    }
+  },
+);
diff --git a/src/services/api/utils/axiosInstance.ts b/src/services/api/utils/axiosInstance.ts
index aaa17d287f1f0d3023f1d178e7ac54adf57ea9a8..7f39522e40a96dc990ae1f90c04626327f32e20d 100644
--- a/src/services/api/utils/axiosInstance.ts
+++ b/src/services/api/utils/axiosInstance.ts
@@ -8,3 +8,39 @@ export const axiosInstance = axios.create({
 export const axiosInstanceNewAPI = axios.create({
   baseURL: BASE_NEW_API_URL,
 });
+
+axiosInstance.interceptors.request.use(config => {
+  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+  // @ts-expect-error
+  // eslint-disable-next-line no-param-reassign
+  config.errorContext = new Error('Thrown at:');
+  return config;
+});
+
+axiosInstance.interceptors.response.use(undefined, async error => {
+  const originalStackTrace = error.config?.errorContext?.stack;
+  if (originalStackTrace) {
+    // eslint-disable-next-line no-param-reassign
+    error.stack = `${error.stack}\n${originalStackTrace}`;
+  }
+
+  throw error;
+});
+
+axiosInstanceNewAPI.interceptors.request.use(config => {
+  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+  // @ts-expect-error
+  // eslint-disable-next-line no-param-reassign
+  config.errorContext = new Error('Thrown at:');
+  return config;
+});
+
+axiosInstanceNewAPI.interceptors.response.use(undefined, async error => {
+  const originalStackTrace = error.config?.errorContext?.stack;
+  if (originalStackTrace) {
+    // eslint-disable-next-line no-param-reassign
+    error.stack = `${error.stack}\n${originalStackTrace}`;
+  }
+
+  throw error;
+});
diff --git a/src/shared/Toast/Toast.component.tsx b/src/shared/Toast/Toast.component.tsx
index 02e1d965aa9bfc79143337d7ac11254cc6059f8c..a311fa5713af686010bbefd63faaace2f4377790 100644
--- a/src/shared/Toast/Toast.component.tsx
+++ b/src/shared/Toast/Toast.component.tsx
@@ -16,7 +16,7 @@ export const Toast = ({ type, message, onDismiss }: ToastArgs): React.ReactNode
   >
     <p
       className={twMerge(
-        'text-base font-bold ',
+        'h-full overflow-y-auto text-base font-bold',
         type === 'error' ? 'text-red-500' : 'text-green-500',
       )}
     >
diff --git a/src/types/modal.ts b/src/types/modal.ts
index 1030c46b8b181cbc81f54e7e74054064825b6e16..eaf3a498c59005f9a2b5c2f2470305970f2e07dc 100644
--- a/src/types/modal.ts
+++ b/src/types/modal.ts
@@ -10,4 +10,5 @@ export type ModalName =
   | 'error-report'
   | 'access-denied'
   | 'select-project'
+  | 'terms-of-service'
   | 'logged-in-menu';
diff --git a/src/utils/getErrorMessage/getErrorMessage.constants.ts b/src/utils/getErrorMessage/getErrorMessage.constants.ts
index e6d05b2732652bf8ceb927f41c324af05b0526b8..3f9fa192f4ff9070126f2f394fc6f5ea8c19416b 100644
--- a/src/utils/getErrorMessage/getErrorMessage.constants.ts
+++ b/src/utils/getErrorMessage/getErrorMessage.constants.ts
@@ -2,6 +2,7 @@ export const UNKNOWN_ERROR = 'An unknown error occurred. Please try again later.
 export const UNKNOWN_AXIOS_ERROR_CODE = 'UNKNOWN_AXIOS_ERROR';
 export const NOT_FOUND_AXIOS_ERROR_CODE = '404';
 export const GENERIC_AXIOS_ERROR_CODE = 'ERR_BAD_REQUEST';
+export const AXIOS_ERROR_NETWORK = 'ERR_NETWORK';
 
 export const HTTP_ERROR_MESSAGES = {
   400: "The server couldn't understand your request. Please check your input and try again.",
diff --git a/src/utils/showToast.tsx b/src/utils/showToast.tsx
index c7ea4329137a508aec4b93357e63442ef6c3c795..19cf088efa33e211ecc440c0ca3b5ceb96d4ef61 100644
--- a/src/utils/showToast.tsx
+++ b/src/utils/showToast.tsx
@@ -1,13 +1,17 @@
 import { toast } from 'sonner';
 import { Toast } from '@/shared/Toast';
 
+const DEFAULT_DURATION_MS = 5000;
+
 type ShowToastArgs = {
   type: 'success' | 'error';
   message: string;
+  duration?: number;
 };
 
 export const showToast = (args: ShowToastArgs): void => {
-  toast.custom(t => (
-    <Toast message={args.message} onDismiss={() => toast.dismiss(t)} type={args.type} />
-  ));
+  toast.custom(
+    t => <Toast message={args.message} onDismiss={() => toast.dismiss(t)} type={args.type} />,
+    { duration: args.duration ? args.duration : DEFAULT_DURATION_MS },
+  );
 };