diff --git a/docs/plugins/errors.md b/docs/plugins/errors.md
index 2795ec513330d084028e1cfe6cc7daee6c522687..08d08e23e7c71c881d0728d1fbc73d6c15dea2bc 100644
--- a/docs/plugins/errors.md
+++ b/docs/plugins/errors.md
@@ -15,3 +15,9 @@
 ## Project Errors
 
 - **Project does not exist**: This error occurs when the project data is not available.
+
+## Zoom errors
+
+- **Provided zoom value exeeds max zoom of ...**: This error occurs when `zoom` param of `setZoom` exeeds max zoom value of the selected map
+
+- **Provided zoom value exceeds min zoom of ...**: This error occurs when `zoom` param of `setZoom` exceeds min zoom value of the selected map
diff --git a/src/components/FunctionalArea/MapNavigation/MapNavigation.component.test.tsx b/src/components/FunctionalArea/MapNavigation/MapNavigation.component.test.tsx
index cefbc59f7cd06e4449d33f704ad4e42bf960eaea..cf1aa42facf833f95b5a7ef32899036716847ba4 100644
--- a/src/components/FunctionalArea/MapNavigation/MapNavigation.component.test.tsx
+++ b/src/components/FunctionalArea/MapNavigation/MapNavigation.component.test.tsx
@@ -170,7 +170,7 @@ describe('MapNavigation - component', () => {
         histamineMapCloseButton.click();
       });
 
-      expect(dispatchEventMock).toHaveBeenCalledTimes(4);
+      expect(dispatchEventMock).toHaveBeenCalledTimes(3);
       expect(dispatchEventMock).toHaveBeenCalledWith('onSubmapClose', 5052);
       expect(dispatchEventMock).toHaveBeenCalledWith('onSubmapOpen', 52);
     });
diff --git a/src/components/Map/MapViewer/utils/config/useOlMapView.ts b/src/components/Map/MapViewer/utils/config/useOlMapView.ts
index 4a4d9dc18032cb862f0bd6a88f96ab199f5bff47..cd4f2ac09559adf8dfdb4ab35378b52c6da6ab41 100644
--- a/src/components/Map/MapViewer/utils/config/useOlMapView.ts
+++ b/src/components/Map/MapViewer/utils/config/useOlMapView.ts
@@ -1,6 +1,6 @@
 /* eslint-disable no-magic-numbers */
 import { OPTIONS } from '@/constants/map';
-import { mapDataInitialPositionSelector } from '@/redux/map/map.selectors';
+import { mapDataInitialPositionSelector, mapDataSizeSelector } from '@/redux/map/map.selectors';
 import { MapInstance, Point } from '@/types/map';
 import { usePointToProjection } from '@/utils/map/usePointToProjection';
 import { View } from 'ol';
@@ -14,6 +14,7 @@ interface UseOlMapViewInput {
 
 export const useOlMapView = ({ mapInstance }: UseOlMapViewInput): MapConfig['view'] => {
   const mapInitialPosition = useSelector(mapDataInitialPositionSelector);
+  const mapSize = useSelector(mapDataSizeSelector);
   const pointToProjection = usePointToProjection();
 
   const center = useMemo((): Point => {
@@ -35,8 +36,10 @@ export const useOlMapView = ({ mapInstance }: UseOlMapViewInput): MapConfig['vie
       center: [center.x, center.y],
       zoom: mapInitialPosition.z,
       showFullExtent: OPTIONS.showFullExtent,
+      maxZoom: mapSize.maxZoom,
+      minZoom: mapSize.minZoom,
     }),
-    [center.x, center.y, mapInitialPosition.z],
+    [center.x, center.y, mapInitialPosition.z, mapSize.maxZoom, mapSize.minZoom],
   );
 
   const view = useMemo(() => new View(viewConfig), [viewConfig]);
diff --git a/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.test.ts b/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.test.ts
index bc9228f024b01e1369e832ae32a93dcbf16c1b3d..295b91d1aad607f60565dbb88c33f6bc043659a0 100644
--- a/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.test.ts
+++ b/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.test.ts
@@ -16,8 +16,6 @@ const getEvent = (targetValues: ObjectEvent['target']['values_']): ObjectEvent =
 
 /* eslint-disable no-magic-numbers */
 describe('onMapPositionChange - util', () => {
-  const MAP_ID = 52;
-  const LAST_ZOOM = 4;
   const cases: [MapSize, ObjectEvent['target']['values_'], Point][] = [
     [
       {
@@ -65,7 +63,7 @@ describe('onMapPositionChange - util', () => {
       const dispatch = result.current;
       const event = getEvent(targetValues);
 
-      onMapPositionChange(mapSize, dispatch, MAP_ID, LAST_ZOOM)(event);
+      onMapPositionChange(mapSize, dispatch)(event);
 
       const { position } = mapDataSelector(store.getState());
       expect(position.last).toMatchObject(lastPosition);
diff --git a/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.ts b/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.ts
index d49f6f3edfd3d4a108619cf890fbc45a90a68d56..7102fec7fdecfd1f771295030dd82e30c42bc767 100644
--- a/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.ts
+++ b/src/components/Map/MapViewer/utils/listeners/onMapPositionChange.ts
@@ -1,33 +1,19 @@
 import { setMapPosition } from '@/redux/map/map.slice';
 import { MapSize } from '@/redux/map/map.types';
 import { AppDispatch } from '@/redux/store';
-import { PluginsEventBus } from '@/services/pluginsManager/pluginsEventBus';
 import { latLngToPoint } from '@/utils/map/latLngToPoint';
 import { toLonLat } from 'ol/proj';
 import { ObjectEvent } from 'openlayers';
 
 /* prettier-ignore */
 export const onMapPositionChange =
-  (mapSize: MapSize, dispatch: AppDispatch, modelId: number, mapLastZoomValue: number | undefined) =>
+  (mapSize: MapSize, dispatch: AppDispatch) =>
     (e: ObjectEvent): void => {
       // eslint-disable-next-line no-underscore-dangle
       const { center, zoom } = e.target.values_;
       const [lng, lat] = toLonLat(center);
       const { x, y } = latLngToPoint([lat, lng], mapSize, { rounded: true });
 
-      if (mapLastZoomValue !== zoom) {
-        PluginsEventBus.dispatchEvent('onZoomChanged', {
-          modelId,
-          zoom,
-        });
-      }
-
-      PluginsEventBus.dispatchEvent('onCenterChanged', {
-        modelId,
-        x,
-        y
-      });
-
       dispatch(
         setMapPosition({
           x,
diff --git a/src/components/Map/MapViewer/utils/listeners/useOlMapListeners.ts b/src/components/Map/MapViewer/utils/listeners/useOlMapListeners.ts
index 1742d6fa7304541ec8f13ba93f5811b7be0b8bde..5d7631ff007bc82ddcc675b81e67bd5eb384fdf4 100644
--- a/src/components/Map/MapViewer/utils/listeners/useOlMapListeners.ts
+++ b/src/components/Map/MapViewer/utils/listeners/useOlMapListeners.ts
@@ -1,6 +1,6 @@
 import { OPTIONS } from '@/constants/map';
 import { useAppDispatch } from '@/redux/hooks/useAppDispatch';
-import { mapDataLastZoomValue, mapDataSizeSelector } from '@/redux/map/map.selectors';
+import { mapDataSizeSelector } from '@/redux/map/map.selectors';
 import { currentModelIdSelector } from '@/redux/models/models.selectors';
 import { MapInstance } from '@/types/map';
 import { View } from 'ol';
@@ -22,7 +22,6 @@ interface UseOlMapListenersInput {
 export const useOlMapListeners = ({ view, mapInstance }: UseOlMapListenersInput): void => {
   const mapSize = useSelector(mapDataSizeSelector);
   const modelId = useSelector(currentModelIdSelector);
-  const mapLastZoomValue = useSelector(mapDataLastZoomValue);
   const coordinate = useRef<Coordinate>([]);
   const pixel = useRef<Pixel>([]);
   const dispatch = useAppDispatch();
@@ -36,7 +35,7 @@ export const useOlMapListeners = ({ view, mapInstance }: UseOlMapListenersInput)
   );
 
   const handleChangeCenter = useDebouncedCallback(
-    onMapPositionChange(mapSize, dispatch, modelId, mapLastZoomValue),
+    onMapPositionChange(mapSize, dispatch),
     OPTIONS.queryPersistTime,
     { leading: false },
   );
diff --git a/src/constants/errors.ts b/src/constants/errors.ts
index b8639a2f43545749b6be91055fa69ec9c8ab852e..cba5c0d0c5954b0a36f8b40c6188afbb20117dd1 100644
--- a/src/constants/errors.ts
+++ b/src/constants/errors.ts
@@ -3,3 +3,10 @@ export const DEFAULT_ERROR: Error = { message: '', name: '' };
 export const OVERVIEW_IMAGE_ERRORS = {
   IMAGE_ID_IS_INVALID: "Image id is invalid. There's no such image in overview images list",
 };
+
+export const ZOOM_ERRORS = {
+  ZOOM_VALUE_TOO_HIGH: (maxZoom: number): string =>
+    `Provided zoom value exeeds max zoom of ${maxZoom}`,
+  ZOOM_VALUE_TOO_LOW: (minZoom: number): string =>
+    `Provided zoom value exceeds min zoom of ${minZoom}`,
+};
diff --git a/src/redux/map/map.reducers.ts b/src/redux/map/map.reducers.ts
index e21b6566379527c7da5bf2ed8d6cf43ae54c10a0..6ef980497d6f6f97f70b9c65f6a416cbb3f7e650 100644
--- a/src/redux/map/map.reducers.ts
+++ b/src/redux/map/map.reducers.ts
@@ -33,6 +33,7 @@ export const setMapDataReducer = (state: MapState, action: SetMapDataAction): vo
 export const setMapPositionReducer = (state: MapState, action: SetMapPositionDataAction): void => {
   const position = action.payload || {};
   const statePosition = state.data.position;
+  const lastZoom = statePosition.last.z;
   const finalPosition = getPointMerged(position || {}, statePosition.last);
   const { modelId } = state.data;
 
@@ -42,7 +43,7 @@ export const setMapPositionReducer = (state: MapState, action: SetMapPositionDat
     y: finalPosition.y,
   });
 
-  if (position?.z) {
+  if (position?.z && lastZoom && lastZoom !== position?.z) {
     PluginsEventBus.dispatchEvent('onZoomChanged', {
       modelId,
       zoom: position?.z,
diff --git a/src/services/pluginsManager/map/zoom/setZoom.test.ts b/src/services/pluginsManager/map/zoom/setZoom.test.ts
index dc92068af316a5a7b667f0e225b40197c0c3944d..55502f302a70e74e6e7b7983e1bc12601e1071d9 100644
--- a/src/services/pluginsManager/map/zoom/setZoom.test.ts
+++ b/src/services/pluginsManager/map/zoom/setZoom.test.ts
@@ -1,6 +1,8 @@
 /* eslint-disable no-magic-numbers */
+import { ZOOM_ERRORS } from '@/constants/errors';
+import { initialMapDataFixture, openedMapsThreeSubmapsFixture } from '@/redux/map/map.fixtures';
 import { setLastPositionZoom } from '@/redux/map/map.slice';
-import { store } from '@/redux/store';
+import { RootState, store } from '@/redux/store';
 import { ZodError } from 'zod';
 import { setZoom } from './setZoom';
 
@@ -8,8 +10,38 @@ jest.mock('../../../../redux/store');
 
 describe('setZoom - plugin method', () => {
   const dispatchSpy = jest.spyOn(store, 'dispatch');
+  const getStateSpy = jest.spyOn(store, 'getState');
 
-  describe('when zoom is invalid', () => {
+  beforeEach(() => {
+    getStateSpy.mockImplementation(
+      () =>
+        ({
+          map: {
+            data: {
+              ...initialMapDataFixture,
+              position: {
+                ...initialMapDataFixture.position,
+                last: {
+                  x: 2137,
+                  y: 420,
+                  z: 1.488,
+                },
+              },
+              size: {
+                ...initialMapDataFixture.size,
+                minZoom: 2,
+                maxZoom: 8,
+              },
+            },
+            loading: 'succeeded',
+            error: { message: '', name: '' },
+            openedMaps: openedMapsThreeSubmapsFixture,
+          },
+        }) as RootState,
+    );
+  });
+
+  describe('when zoom value type is invalid', () => {
     const invalidZoom = [-1, -123, '-123'] as number[];
 
     it.each(invalidZoom)('should throw error', zoom => {
@@ -17,6 +49,22 @@ describe('setZoom - plugin method', () => {
     });
   });
 
+  describe('when zoom value value exeeds max zoom', () => {
+    const invalidZoom = [444, 21, 9] as number[];
+
+    it.each(invalidZoom)('should throw error', zoom => {
+      expect(() => setZoom(zoom)).toThrow(ZOOM_ERRORS.ZOOM_VALUE_TOO_HIGH(8));
+    });
+  });
+
+  describe('when zoom value value exeeds min zoom', () => {
+    const invalidZoom = [1, 0] as number[];
+
+    it.each(invalidZoom)('should throw error', zoom => {
+      expect(() => setZoom(zoom)).toThrow(ZOOM_ERRORS.ZOOM_VALUE_TOO_LOW(2));
+    });
+  });
+
   describe('when zoom is valid', () => {
     const zoom = 2;
 
diff --git a/src/services/pluginsManager/map/zoom/setZoom.ts b/src/services/pluginsManager/map/zoom/setZoom.ts
index 8d599604907f7900c9799979d2226e91b69f8311..f161d1c0588e5010c701d4e64ed2e6a7e83f7f5a 100644
--- a/src/services/pluginsManager/map/zoom/setZoom.ts
+++ b/src/services/pluginsManager/map/zoom/setZoom.ts
@@ -1,10 +1,21 @@
+import { ZOOM_ERRORS } from '@/constants/errors';
 import { zPointSchema } from '@/models/pointSchema';
+import { mapDataSizeSelector } from '@/redux/map/map.selectors';
 import { setLastPositionZoom } from '@/redux/map/map.slice';
 import { store } from '@/redux/store';
 
 export const setZoom = (zoom: number): void => {
-  const { dispatch } = store;
+  const { dispatch, getState } = store;
+  const { minZoom, maxZoom } = mapDataSizeSelector(getState());
   zPointSchema.parse(zoom);
 
+  if (zoom < minZoom) {
+    throw Error(ZOOM_ERRORS.ZOOM_VALUE_TOO_LOW(minZoom));
+  }
+
+  if (zoom > maxZoom) {
+    throw Error(ZOOM_ERRORS.ZOOM_VALUE_TOO_HIGH(maxZoom));
+  }
+
   dispatch(setLastPositionZoom({ zoom }));
 };