diff --git a/src/components/boris/Superpower/index.tsx b/src/components/boris/Superpower/index.tsx
index 1864c677..cbb117b7 100644
--- a/src/components/boris/Superpower/index.tsx
+++ b/src/components/boris/Superpower/index.tsx
@@ -1,5 +1,5 @@
 import React, { FC } from 'react';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectAuthIsTester, selectUser } from '~/redux/auth/selectors';
 
 interface IProps {}
diff --git a/src/components/comment/CommentForm/index.tsx b/src/components/comment/CommentForm/index.tsx
index 0f1a2b2b..235d3707 100644
--- a/src/components/comment/CommentForm/index.tsx
+++ b/src/components/comment/CommentForm/index.tsx
@@ -1,9 +1,9 @@
 import React, { FC, useCallback, useState } from 'react';
-import { useCommentFormFormik } from '~/utils/hooks/useCommentFormFormik';
+import { useCommentFormFormik } from '~/hooks/comments/useCommentFormFormik';
 import { FormikProvider } from 'formik';
 import { LocalCommentFormTextarea } from '~/components/comment/LocalCommentFormTextarea';
 import { Button } from '~/components/input/Button';
-import { FileUploaderProvider, useFileUploader } from '~/utils/hooks/useFileUploader';
+import { FileUploaderProvider, useFileUploader } from '~/hooks/data/useFileUploader';
 import { UPLOAD_SUBJECTS, UPLOAD_TARGETS } from '~/redux/uploads/constants';
 import { CommentFormAttachButtons } from '~/components/comment/CommentFormAttachButtons';
 import { CommentFormFormatButtons } from '~/components/comment/CommentFormFormatButtons';
@@ -14,7 +14,7 @@ import { EMPTY_COMMENT } from '~/redux/node/constants';
 import { UploadDropzone } from '~/components/upload/UploadDropzone';
 import styles from './styles.module.scss';
 import { ERROR_LITERAL } from '~/constants/errors';
-import { useInputPasteUpload } from '~/utils/hooks/useInputPasteUpload';
+import { useInputPasteUpload } from '~/hooks/dom/useInputPasteUpload';
 import { Filler } from '~/components/containers/Filler';
 
 interface IProps {
diff --git a/src/components/comment/CommentFormAttaches/index.tsx b/src/components/comment/CommentFormAttaches/index.tsx
index 1523a578..52d970d3 100644
--- a/src/components/comment/CommentFormAttaches/index.tsx
+++ b/src/components/comment/CommentFormAttaches/index.tsx
@@ -5,9 +5,9 @@ import { SortableAudioGrid } from '~/components/editors/SortableAudioGrid';
 import { IFile } from '~/redux/types';
 import { SortEnd } from 'react-sortable-hoc';
 import { moveArrItem } from '~/utils/fn';
-import { useFileDropZone } from '~/utils/hooks';
+import { useFileDropZone } from '~/hooks';
 import { COMMENT_FILE_TYPES, UPLOAD_TYPES } from '~/redux/uploads/constants';
-import { useFileUploaderContext } from '~/utils/hooks/useFileUploader';
+import { useFileUploaderContext } from '~/hooks/data/useFileUploader';
 
 const CommentFormAttaches: FC = () => {
   const uploader = useFileUploaderContext();
diff --git a/src/components/comment/CommentFormFormatButtons/index.tsx b/src/components/comment/CommentFormFormatButtons/index.tsx
index 17df65e6..5de43ccc 100644
--- a/src/components/comment/CommentFormFormatButtons/index.tsx
+++ b/src/components/comment/CommentFormFormatButtons/index.tsx
@@ -1,7 +1,7 @@
 import React, { FC, useCallback, useEffect } from 'react';
 import { ButtonGroup } from '~/components/input/ButtonGroup';
 import { Button } from '~/components/input/Button';
-import { useFormatWrapper, wrapTextInsideInput } from '~/utils/hooks/useFormatWrapper';
+import { useFormatWrapper, wrapTextInsideInput } from '~/hooks/dom/useFormatWrapper';
 import styles from './styles.module.scss';
 
 interface IProps {
diff --git a/src/components/comment/LocalCommentFormTextarea/index.tsx b/src/components/comment/LocalCommentFormTextarea/index.tsx
index 2dab51fb..36234743 100644
--- a/src/components/comment/LocalCommentFormTextarea/index.tsx
+++ b/src/components/comment/LocalCommentFormTextarea/index.tsx
@@ -1,6 +1,6 @@
 import React, { FC, KeyboardEventHandler, useCallback } from 'react';
 import { Textarea } from '~/components/input/Textarea';
-import { useCommentFormContext } from '~/utils/hooks/useCommentFormFormik';
+import { useCommentFormContext } from '~/hooks/comments/useCommentFormFormik';
 import { useRandomPhrase } from '~/constants/phrases';
 
 interface IProps {
diff --git a/src/components/containers/Authorized/index.tsx b/src/components/containers/Authorized/index.tsx
index e0b6085b..08fc6e69 100644
--- a/src/components/containers/Authorized/index.tsx
+++ b/src/components/containers/Authorized/index.tsx
@@ -1,5 +1,5 @@
 import React, { FC } from 'react';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectUser } from '~/redux/auth/selectors';
 
 interface IProps {}
diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx
index 335f651c..4ac55d37 100644
--- a/src/components/editors/AudioEditor/index.tsx
+++ b/src/components/editors/AudioEditor/index.tsx
@@ -8,10 +8,10 @@ import { selectUploads } from '~/redux/uploads/selectors';
 import * as UPLOAD_ACTIONS from '~/redux/uploads/actions';
 import styles from './styles.module.scss';
 import { NodeEditorProps } from '~/redux/node/types';
-import { useNodeImages } from '~/utils/hooks/node/useNodeImages';
-import { useNodeAudios } from '~/utils/hooks/node/useNodeAudios';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
-import { useFileUploaderContext } from '~/utils/hooks/useFileUploader';
+import { useNodeImages } from '~/hooks/node/useNodeImages';
+import { useNodeAudios } from '~/hooks/node/useNodeAudios';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
+import { useFileUploaderContext } from '~/hooks/data/useFileUploader';
 import { UploadDropzone } from '~/components/upload/UploadDropzone';
 
 type IProps = NodeEditorProps;
diff --git a/src/components/editors/EditorActionsPanel/index.tsx b/src/components/editors/EditorActionsPanel/index.tsx
index 4a1f9164..a0771b43 100644
--- a/src/components/editors/EditorActionsPanel/index.tsx
+++ b/src/components/editors/EditorActionsPanel/index.tsx
@@ -2,7 +2,7 @@ import React, { FC, createElement } from 'react';
 import styles from './styles.module.scss';
 import { NODE_PANEL_COMPONENTS } from '~/redux/node/constants';
 import { has } from 'ramda';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 
 const EditorActionsPanel: FC = () => {
   const { values } = useNodeFormContext();
diff --git a/src/components/editors/EditorButtons/index.tsx b/src/components/editors/EditorButtons/index.tsx
index 996dd2ba..b0679907 100644
--- a/src/components/editors/EditorButtons/index.tsx
+++ b/src/components/editors/EditorButtons/index.tsx
@@ -4,7 +4,7 @@ import { Group } from '~/components/containers/Group';
 import { InputText } from '~/components/input/InputText';
 import { Button } from '~/components/input/Button';
 import { Padder } from '~/components/containers/Padder';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 
 const EditorButtons: FC = () => {
   const { values, handleChange, isSubmitting } = useNodeFormContext();
diff --git a/src/components/editors/EditorPublicSwitch/index.tsx b/src/components/editors/EditorPublicSwitch/index.tsx
index 0022db25..fa94f004 100644
--- a/src/components/editors/EditorPublicSwitch/index.tsx
+++ b/src/components/editors/EditorPublicSwitch/index.tsx
@@ -3,7 +3,7 @@ import { IEditorComponentProps } from '~/redux/node/types';
 import { Button } from '~/components/input/Button';
 import { Icon } from '~/components/input/Icon';
 import styles from './styles.module.scss';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 
 interface IProps extends IEditorComponentProps {}
 
diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx
index a5b0849c..42a45b37 100644
--- a/src/components/editors/EditorUploadButton/index.tsx
+++ b/src/components/editors/EditorUploadButton/index.tsx
@@ -3,9 +3,9 @@ import styles from './styles.module.scss';
 import { Icon } from '~/components/input/Icon';
 import { UPLOAD_TYPES } from '~/redux/uploads/constants';
 import { IEditorComponentProps } from '~/redux/node/types';
-import { useFileUploaderContext } from '~/utils/hooks/useFileUploader';
+import { useFileUploaderContext } from '~/hooks/data/useFileUploader';
 import { getFileType } from '~/utils/uploader';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 import { Button } from '~/components/input/Button';
 
 type IProps = IEditorComponentProps & {
diff --git a/src/components/editors/EditorUploadCoverButton/index.tsx b/src/components/editors/EditorUploadCoverButton/index.tsx
index f74ddfa1..140d2242 100644
--- a/src/components/editors/EditorUploadCoverButton/index.tsx
+++ b/src/components/editors/EditorUploadCoverButton/index.tsx
@@ -11,8 +11,8 @@ import { getURL } from '~/utils/dom';
 import { Icon } from '~/components/input/Icon';
 import { PRESETS } from '~/constants/urls';
 import { IEditorComponentProps } from '~/redux/node/types';
-import { useFileUploader, useFileUploaderContext } from '~/utils/hooks/useFileUploader';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useFileUploader, useFileUploaderContext } from '~/hooks/data/useFileUploader';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 import { getFileType } from '~/utils/uploader';
 
 type IProps = IEditorComponentProps & {};
diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx
index 8dc2a0f0..90b9e0c4 100644
--- a/src/components/editors/ImageEditor/index.tsx
+++ b/src/components/editors/ImageEditor/index.tsx
@@ -2,7 +2,7 @@ import React, { FC } from 'react';
 import { ImageGrid } from '~/components/editors/ImageGrid';
 import styles from './styles.module.scss';
 import { NodeEditorProps } from '~/redux/node/types';
-import { useFileUploaderContext } from '~/utils/hooks/useFileUploader';
+import { useFileUploaderContext } from '~/hooks/data/useFileUploader';
 import { UploadDropzone } from '~/components/upload/UploadDropzone';
 
 type IProps = NodeEditorProps;
diff --git a/src/components/editors/TextEditor/index.tsx b/src/components/editors/TextEditor/index.tsx
index a6d7e217..cdba234b 100644
--- a/src/components/editors/TextEditor/index.tsx
+++ b/src/components/editors/TextEditor/index.tsx
@@ -4,7 +4,7 @@ import styles from './styles.module.scss';
 import { Textarea } from '~/components/input/Textarea';
 import { path } from 'ramda';
 import { NodeEditorProps } from '~/redux/node/types';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 
 type IProps = NodeEditorProps & {};
 
diff --git a/src/components/editors/VideoEditor/index.tsx b/src/components/editors/VideoEditor/index.tsx
index 489046ac..dc0caced 100644
--- a/src/components/editors/VideoEditor/index.tsx
+++ b/src/components/editors/VideoEditor/index.tsx
@@ -6,7 +6,7 @@ import { InputText } from '~/components/input/InputText';
 import classnames from 'classnames';
 import { getYoutubeThumb } from '~/utils/dom';
 import { NodeEditorProps } from '~/redux/node/types';
-import { useNodeFormContext } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik';
 
 type IProps = NodeEditorProps & {};
 
diff --git a/src/components/flow/FlowCell/index.tsx b/src/components/flow/FlowCell/index.tsx
index cd48a6f6..a0a182f2 100644
--- a/src/components/flow/FlowCell/index.tsx
+++ b/src/components/flow/FlowCell/index.tsx
@@ -6,8 +6,8 @@ import { FlowDisplay, INode } from '~/redux/types';
 import { FlowCellText } from '~/components/flow/FlowCellText';
 import classNames from 'classnames';
 import { FlowCellMenu } from '~/components/flow/FlowCellMenu';
-import { useFlowCellControls } from '~/utils/hooks/flow/useFlowCellControls';
-import { useClickOutsideFocus } from '~/utils/hooks/useClickOutsideFocus';
+import { useFlowCellControls } from '~/hooks/flow/useFlowCellControls';
+import { useClickOutsideFocus } from '~/hooks/dom/useClickOutsideFocus';
 import { MenuDots } from '~/components/common/MenuDots';
 import { FlowCellImage } from '~/components/flow/FlowCellImage';
 
diff --git a/src/components/input/InputText/index.tsx b/src/components/input/InputText/index.tsx
index 737b1485..3899fac4 100644
--- a/src/components/input/InputText/index.tsx
+++ b/src/components/input/InputText/index.tsx
@@ -4,7 +4,7 @@ import styles from '~/styles/common/inputs.module.scss';
 import { Icon } from '~/components/input/Icon';
 import { IInputTextProps } from '~/redux/types';
 import { LoaderCircle } from '~/components/input/LoaderCircle';
-import { useTranslatedError } from '~/utils/hooks/useTranslatedError';
+import { useTranslatedError } from '~/hooks/data/useTranslatedError';
 
 const InputText: FC<IInputTextProps> = ({
   wrapperClassName,
diff --git a/src/components/lab/LabDescription/index.tsx b/src/components/lab/LabDescription/index.tsx
index 05a0c537..f71fe917 100644
--- a/src/components/lab/LabDescription/index.tsx
+++ b/src/components/lab/LabDescription/index.tsx
@@ -3,7 +3,7 @@ import { INodeComponentProps } from '~/redux/node/constants';
 import styles from './styles.module.scss';
 import { Markdown } from '~/components/containers/Markdown';
 import { formatText } from '~/utils/dom';
-import { useGotoNode } from '~/utils/hooks/node/useGotoNode';
+import { useGotoNode } from '~/hooks/node/useGotoNode';
 import { Paragraph } from '~/components/placeholders/Paragraph';
 
 const LabDescription: FC<INodeComponentProps> = ({ node, isLoading }) => {
diff --git a/src/components/lab/LabImage/index.tsx b/src/components/lab/LabImage/index.tsx
index b8205e5e..715d4991 100644
--- a/src/components/lab/LabImage/index.tsx
+++ b/src/components/lab/LabImage/index.tsx
@@ -9,8 +9,8 @@ import 'swiper/components/zoom/zoom.scss';
 import 'swiper/components/navigation/navigation.scss';
 
 import styles from './styles.module.scss';
-import { useNodeImages } from '~/utils/hooks/node/useNodeImages';
-import { useGotoNode } from '~/utils/hooks/node/useGotoNode';
+import { useNodeImages } from '~/hooks/node/useNodeImages';
+import { useGotoNode } from '~/hooks/node/useGotoNode';
 import { Placeholder } from '~/components/placeholders/Placeholder';
 import { normalizeBrightColor } from '~/utils/color';
 import { ImagePreloader } from '~/components/media/ImagePreloader';
diff --git a/src/components/lab/LabLine/index.tsx b/src/components/lab/LabLine/index.tsx
index 5c863b61..5096d117 100644
--- a/src/components/lab/LabLine/index.tsx
+++ b/src/components/lab/LabLine/index.tsx
@@ -1,7 +1,7 @@
 import React, { FC } from 'react';
 import styles from './styles.module.scss';
 import { INodeComponentProps } from '~/redux/node/constants';
-import { useColorGradientFromString } from '~/utils/hooks/useColorGradientFromString';
+import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString';
 
 interface Props extends INodeComponentProps {}
 
diff --git a/src/components/lab/LabNode/index.tsx b/src/components/lab/LabNode/index.tsx
index 83b6da31..32d608a9 100644
--- a/src/components/lab/LabNode/index.tsx
+++ b/src/components/lab/LabNode/index.tsx
@@ -1,11 +1,11 @@
 import React, { FC, useMemo } from 'react';
 import { INode } from '~/redux/types';
-import { useNodeBlocks } from '~/utils/hooks/node/useNodeBlocks';
+import { useNodeBlocks } from '~/hooks/node/useNodeBlocks';
 import styles from './styles.module.scss';
 import { LabBottomPanel } from '~/components/lab/LabBottomPanel';
 import { isAfter, parseISO } from 'date-fns';
 import classNames from 'classnames';
-import { useColorGradientFromString } from '~/utils/hooks/useColorGradientFromString';
+import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString';
 
 interface IProps {
   node: INode;
diff --git a/src/components/lab/LabNodeTitle/index.tsx b/src/components/lab/LabNodeTitle/index.tsx
index 45e37624..fad48b86 100644
--- a/src/components/lab/LabNodeTitle/index.tsx
+++ b/src/components/lab/LabNodeTitle/index.tsx
@@ -4,7 +4,7 @@ import styles from './styles.module.scss';
 import { Group } from '~/components/containers/Group';
 import { Icon } from '~/components/input/Icon';
 import Tippy from '@tippy.js/react';
-import { useGotoNode } from '~/utils/hooks/node/useGotoNode';
+import { useGotoNode } from '~/hooks/node/useGotoNode';
 import { INodeComponentProps } from '~/redux/node/constants';
 import { Placeholder } from '~/components/placeholders/Placeholder';
 
diff --git a/src/components/lab/LabPad/index.tsx b/src/components/lab/LabPad/index.tsx
index cee7be45..45dd71da 100644
--- a/src/components/lab/LabPad/index.tsx
+++ b/src/components/lab/LabPad/index.tsx
@@ -1,7 +1,7 @@
 import React, { FC } from 'react';
 import styles from './styles.module.scss';
 import { INodeComponentProps } from '~/redux/node/constants';
-import { useGotoNode } from '~/utils/hooks/node/useGotoNode';
+import { useGotoNode } from '~/hooks/node/useGotoNode';
 
 const LabPad: FC<INodeComponentProps> = ({ node }) => {
   const onClick = useGotoNode(node.id);
diff --git a/src/components/lab/LabText/index.tsx b/src/components/lab/LabText/index.tsx
index aeeb61ee..9c562b0a 100644
--- a/src/components/lab/LabText/index.tsx
+++ b/src/components/lab/LabText/index.tsx
@@ -4,7 +4,7 @@ import { INodeComponentProps } from '~/redux/node/constants';
 import { formatTextParagraphs } from '~/utils/dom';
 import { path } from 'ramda';
 import styles from './styles.module.scss';
-import { useGotoNode } from '~/utils/hooks/node/useGotoNode';
+import { useGotoNode } from '~/hooks/node/useGotoNode';
 import { Paragraph } from '~/components/placeholders/Paragraph';
 
 const LabText: FC<INodeComponentProps> = ({ node, isLoading }) => {
diff --git a/src/components/main/Header/index.tsx b/src/components/main/Header/index.tsx
index f8f26e8d..d343a561 100644
--- a/src/components/main/Header/index.tsx
+++ b/src/components/main/Header/index.tsx
@@ -19,7 +19,7 @@ import * as AUTH_ACTIONS from '~/redux/auth/actions';
 import { IState } from '~/redux/store';
 import isBefore from 'date-fns/isBefore';
 import { Authorized } from '~/components/containers/Authorized';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectLabUpdatesNodes } from '~/redux/lab/selectors';
 import { selectFlowUpdated } from '~/redux/flow/selectors';
 import { Button } from '~/components/input/Button';
diff --git a/src/components/media/ImagePreloader/index.tsx b/src/components/media/ImagePreloader/index.tsx
index 0afa1743..d37a738d 100644
--- a/src/components/media/ImagePreloader/index.tsx
+++ b/src/components/media/ImagePreloader/index.tsx
@@ -6,7 +6,7 @@ import styles from './styles.module.scss';
 import { IFile } from '~/redux/types';
 import { LoaderCircle } from '~/components/input/LoaderCircle';
 import { Icon } from '~/components/input/Icon';
-import { useResizeHandler } from '~/utils/hooks/useResizeHandler';
+import { useResizeHandler } from '~/hooks/dom/useResizeHandler';
 import { DEFAULT_DOMINANT_COLOR } from '~/constants/node';
 
 interface IProps {
diff --git a/src/components/node/NodeAudioBlock/index.tsx b/src/components/node/NodeAudioBlock/index.tsx
index c064e831..1a44d2fd 100644
--- a/src/components/node/NodeAudioBlock/index.tsx
+++ b/src/components/node/NodeAudioBlock/index.tsx
@@ -4,7 +4,7 @@ import { UPLOAD_TYPES } from '~/redux/uploads/constants';
 import { AudioPlayer } from '~/components/media/AudioPlayer';
 import styles from './styles.module.scss';
 import { INodeComponentProps } from '~/redux/node/constants';
-import { useNodeAudios } from '~/utils/hooks/node/useNodeAudios';
+import { useNodeAudios } from '~/hooks/node/useNodeAudios';
 
 interface IProps extends INodeComponentProps {}
 
diff --git a/src/components/node/NodeAudioImageBlock/index.tsx b/src/components/node/NodeAudioImageBlock/index.tsx
index e7834737..60ac2148 100644
--- a/src/components/node/NodeAudioImageBlock/index.tsx
+++ b/src/components/node/NodeAudioImageBlock/index.tsx
@@ -6,7 +6,7 @@ import { path } from 'ramda';
 import { getURL } from '~/utils/dom';
 import { PRESETS } from '~/constants/urls';
 import { INodeComponentProps } from '~/redux/node/constants';
-import { useNodeImages } from '~/utils/hooks/node/useNodeImages';
+import { useNodeImages } from '~/hooks/node/useNodeImages';
 
 interface IProps extends INodeComponentProps {}
 
diff --git a/src/components/node/NodeAuthorBlock/index.tsx b/src/components/node/NodeAuthorBlock/index.tsx
index da314400..66ba3662 100644
--- a/src/components/node/NodeAuthorBlock/index.tsx
+++ b/src/components/node/NodeAuthorBlock/index.tsx
@@ -2,7 +2,7 @@ import React, { FC, useCallback } from 'react';
 import styles from './styles.module.scss';
 import { Avatar } from '~/components/common/Avatar';
 import { openUserProfile } from '~/utils/user';
-import { useUserDescription } from '~/utils/hooks/user/useUserDescription';
+import { useUserDescription } from '~/hooks/user/useUserDescription';
 import { INodeUser } from '~/redux/types';
 
 interface Props {
diff --git a/src/components/node/NodeImageSwiperBlock/index.tsx b/src/components/node/NodeImageSwiperBlock/index.tsx
index cc52d330..c7e5a8c1 100644
--- a/src/components/node/NodeImageSwiperBlock/index.tsx
+++ b/src/components/node/NodeImageSwiperBlock/index.tsx
@@ -10,12 +10,11 @@ import styles from './styles.module.scss';
 
 import SwiperCore, { Keyboard, Navigation, Pagination, SwiperOptions } from 'swiper';
 
-import { useNodeImages } from '~/utils/hooks/node/useNodeImages';
+import { useNodeImages } from '~/hooks/node/useNodeImages';
 import SwiperClass from 'swiper/types/swiper-class';
-import { modalShowPhotoswipe } from '~/redux/modal/actions';
-import { useDispatch } from 'react-redux';
 import { ImagePreloader } from '~/components/media/ImagePreloader';
 import { normalizeBrightColor } from '~/utils/color';
+import { useImageModal } from '~/hooks/navigation/useImageModal';
 
 SwiperCore.use([Navigation, Pagination, Keyboard]);
 
@@ -28,8 +27,8 @@ const breakpoints: SwiperOptions['breakpoints'] = {
 };
 
 const NodeImageSwiperBlock: FC<IProps> = ({ node }) => {
-  const dispatch = useDispatch();
   const [controlledSwiper, setControlledSwiper] = useState<SwiperClass | undefined>(undefined);
+  const showPhotoSwiper = useImageModal();
 
   const images = useNodeImages(node);
 
@@ -50,9 +49,9 @@ const NodeImageSwiperBlock: FC<IProps> = ({ node }) => {
         return;
       }
 
-      dispatch(modalShowPhotoswipe(images, index));
+      showPhotoSwiper(images, index);
     },
-    [dispatch, images, controlledSwiper]
+    [images, controlledSwiper, showPhotoSwiper]
   );
 
   if (!images?.length) {
diff --git a/src/components/node/NodeRelatedItem/index.tsx b/src/components/node/NodeRelatedItem/index.tsx
index c3d6e0d3..d5bda108 100644
--- a/src/components/node/NodeRelatedItem/index.tsx
+++ b/src/components/node/NodeRelatedItem/index.tsx
@@ -6,7 +6,7 @@ import { PRESETS, URLS } from '~/constants/urls';
 import { RouteComponentProps, withRouter } from 'react-router';
 import { getURL } from '~/utils/dom';
 import { Avatar } from '~/components/common/Avatar';
-import { useColorGradientFromString } from '~/utils/hooks/useColorGradientFromString';
+import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString';
 
 type IProps = RouteComponentProps & {
   item: Partial<INode>;
diff --git a/src/components/upload/UploadDropzone/index.tsx b/src/components/upload/UploadDropzone/index.tsx
index a4e70e8f..c72f71a9 100644
--- a/src/components/upload/UploadDropzone/index.tsx
+++ b/src/components/upload/UploadDropzone/index.tsx
@@ -5,7 +5,7 @@ import classNames from 'classnames';
 import styles from './styles.module.scss';
 import { DivProps } from '~/utils/types';
 import { DropHereIcon } from '~/components/input/DropHereIcon';
-import { useDragDetector } from '~/utils/hooks/useDragDetector';
+import { useDragDetector } from '~/hooks/dom/useDragDetector';
 
 interface IProps extends DivProps {
   onUpload: (files: File[]) => void;
diff --git a/src/containers/App.tsx b/src/containers/App.tsx
index c69ff69c..63395741 100644
--- a/src/containers/App.tsx
+++ b/src/containers/App.tsx
@@ -7,8 +7,8 @@ import { Modal } from '~/containers/dialogs/Modal';
 import { PageCover } from '~/components/containers/PageCover';
 import { BottomContainer } from '~/containers/main/BottomContainer';
 import { MainRouter } from '~/containers/main/MainRouter';
-import { DragDetectorProvider } from '~/utils/hooks/useDragDetector';
-import { useUser } from '~/utils/hooks/user/userUser';
+import { DragDetectorProvider } from '~/hooks/dom/useDragDetector';
+import { useUser } from '~/hooks/user/userUser';
 import { UserContextProvider } from '~/utils/context/UserContextProvider';
 import { SWRConfigProvider } from '~/utils/providers/SWRConfigProvider';
 
diff --git a/src/containers/dialogs/BetterScrollDialog/index.tsx b/src/containers/dialogs/BetterScrollDialog/index.tsx
index f2a42838..7b7d6d98 100644
--- a/src/containers/dialogs/BetterScrollDialog/index.tsx
+++ b/src/containers/dialogs/BetterScrollDialog/index.tsx
@@ -3,7 +3,7 @@ import styles from './styles.module.scss';
 import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock';
 import { Icon } from '~/components/input/Icon';
 import { LoaderCircle } from '~/components/input/LoaderCircle';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 
 interface IProps {
   children: React.ReactChild;
diff --git a/src/containers/dialogs/EditorCreateDialog/index.tsx b/src/containers/dialogs/EditorCreateDialog/index.tsx
index ab13143a..867e75ee 100644
--- a/src/containers/dialogs/EditorCreateDialog/index.tsx
+++ b/src/containers/dialogs/EditorCreateDialog/index.tsx
@@ -5,8 +5,8 @@ import { useHistory, useRouteMatch } from 'react-router';
 import { values } from 'ramda';
 import { INode } from '~/redux/types';
 import { apiPostNode } from '~/redux/node/api';
-import { useUpdateNode } from '~/utils/hooks/data/useUpdateNode';
-import { useCreateNode } from '~/utils/hooks/data/useCreateNode';
+import { useUpdateNode } from '~/hooks/node/useUpdateNode';
+import { useCreateNode } from '~/hooks/node/useCreateNode';
 
 const EditorCreateDialog: FC = () => {
   const history = useHistory();
diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx
index ebb67a0e..7982e156 100644
--- a/src/containers/dialogs/EditorDialog/index.tsx
+++ b/src/containers/dialogs/EditorDialog/index.tsx
@@ -5,15 +5,15 @@ import { NODE_EDITORS } from '~/redux/node/constants';
 import { BetterScrollDialog } from '../BetterScrollDialog';
 import { CoverBackdrop } from '~/components/containers/CoverBackdrop';
 import { prop } from 'ramda';
-import { useNodeFormFormik } from '~/utils/hooks/node/useNodeFormFormik';
+import { useNodeFormFormik } from '~/hooks/node/useNodeFormFormik';
 import { EditorButtons } from '~/components/editors/EditorButtons';
-import { FileUploaderProvider, useFileUploader } from '~/utils/hooks/useFileUploader';
+import { FileUploaderProvider, useFileUploader } from '~/hooks/data/useFileUploader';
 import { UPLOAD_SUBJECTS, UPLOAD_TARGETS } from '~/redux/uploads/constants';
 import { FormikProvider } from 'formik';
 import { INode } from '~/redux/types';
 import { ModalWrapper } from '~/components/dialogs/ModalWrapper';
-import { useTranslatedError } from '~/utils/hooks/useTranslatedError';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useTranslatedError } from '~/hooks/data/useTranslatedError';
+import { useCloseOnEscape } from '~/hooks';
 import { EditorConfirmClose } from '~/components/editors/EditorConfirmClose';
 import { on } from 'cluster';
 
diff --git a/src/containers/dialogs/EditorEditDialog/index.tsx b/src/containers/dialogs/EditorEditDialog/index.tsx
index 61afe612..3ef76cde 100644
--- a/src/containers/dialogs/EditorEditDialog/index.tsx
+++ b/src/containers/dialogs/EditorEditDialog/index.tsx
@@ -4,8 +4,8 @@ import { useHistory, useRouteMatch } from 'react-router';
 import { ModalWrapper } from '~/components/dialogs/ModalWrapper';
 import { LoaderCircle } from '~/components/input/LoaderCircle';
 import styles from './styles.module.scss';
-import { useGetNode } from '~/utils/hooks/data/useGetNode';
-import { useUpdateNode } from '~/utils/hooks/data/useUpdateNode';
+import { useGetNode } from '~/hooks/node/useGetNode';
+import { useUpdateNode } from '~/hooks/node/useUpdateNode';
 import { INode } from '~/redux/types';
 
 const EditorEditDialog: FC = () => {
diff --git a/src/containers/dialogs/LoginDialog/index.tsx b/src/containers/dialogs/LoginDialog/index.tsx
index 607dd7e6..f10f46cc 100644
--- a/src/containers/dialogs/LoginDialog/index.tsx
+++ b/src/containers/dialogs/LoginDialog/index.tsx
@@ -1,7 +1,7 @@
 import React, { FC, FormEvent, useCallback, useEffect, useState } from 'react';
 import { connect } from 'react-redux';
 import { DIALOGS, IDialogProps } from '~/redux/modal/constants';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 import { Group } from '~/components/containers/Group';
 import { InputText } from '~/components/input/InputText';
 import { Button } from '~/components/input/Button';
@@ -18,7 +18,7 @@ import { pick } from 'ramda';
 import { LoginDialogButtons } from '~/containers/dialogs/LoginDialogButtons';
 import { OAUTH_EVENT_TYPES } from '~/redux/types';
 import { DialogTitle } from '~/components/dialogs/DialogTitle';
-import { useTranslatedError } from '~/utils/hooks/useTranslatedError';
+import { useTranslatedError } from '~/hooks/data/useTranslatedError';
 
 const mapStateToProps = state => ({
   ...pick(['error', 'is_registering'], selectAuthLogin(state)),
@@ -80,7 +80,7 @@ const LoginDialogUnconnected: FC<IProps> = ({
     [authGotOauthLoginEvent]
   );
 
-  useEffect(() => { 
+  useEffect(() => {
     if (error) userSetLoginError('');
     // eslint-disable-next-line react-hooks/exhaustive-deps
   }, [username, password]);
diff --git a/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx b/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx
index 658d9fbc..3db43cdf 100644
--- a/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx
+++ b/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx
@@ -9,7 +9,7 @@ import { InputText } from '~/components/input/InputText';
 import styles from './styles.module.scss';
 import { selectAuthRegisterSocial } from '~/redux/auth/selectors';
 import * as AUTH_ACTIONS from '~/redux/auth/actions';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 import { LoginSocialRegisterButtons } from '~/containers/dialogs/LoginSocialRegisterButtons';
 import { Toggle } from '~/components/input/Toggle';
 
diff --git a/src/containers/dialogs/Modal/index.tsx b/src/containers/dialogs/Modal/index.tsx
index 12184b9a..d9ee618d 100644
--- a/src/containers/dialogs/Modal/index.tsx
+++ b/src/containers/dialogs/Modal/index.tsx
@@ -1,7 +1,7 @@
 import React, { FC, useCallback } from 'react';
 import { useDispatch } from 'react-redux';
 import { DIALOG_CONTENT } from '~/constants/dialogs';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectModal } from '~/redux/modal/selectors';
 import { modalSetDialog, modalSetShown, modalShowDialog } from '~/redux/modal/actions';
 import { ModalWrapper } from '~/components/dialogs/ModalWrapper';
diff --git a/src/containers/dialogs/PhotoSwipe/index.tsx b/src/containers/dialogs/PhotoSwipe/index.tsx
index e0ef6d33..1a70f0dc 100644
--- a/src/containers/dialogs/PhotoSwipe/index.tsx
+++ b/src/containers/dialogs/PhotoSwipe/index.tsx
@@ -12,7 +12,7 @@ import { PRESETS } from '~/constants/urls';
 import * as MODAL_ACTIONS from '~/redux/modal/actions';
 import styles from './styles.module.scss';
 import classNames from 'classnames';
-import { useBlockBackButton } from '~/utils/hooks/useBlockBackButton';
+import { useBlockBackButton } from '~/hooks/navigation/useBlockBackButton';
 
 const mapStateToProps = (state: IState) => ({
   photoswipe: selectModal(state).photoswipe,
diff --git a/src/containers/dialogs/RestorePasswordDialog/index.tsx b/src/containers/dialogs/RestorePasswordDialog/index.tsx
index b47ab5f1..5f00a682 100644
--- a/src/containers/dialogs/RestorePasswordDialog/index.tsx
+++ b/src/containers/dialogs/RestorePasswordDialog/index.tsx
@@ -12,7 +12,7 @@ import { pick } from 'ramda';
 import { selectAuthRestore } from '~/redux/auth/selectors';
 import { ERROR_LITERAL, ERRORS } from '~/constants/errors';
 import { Icon } from '~/components/input/Icon';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 
 const mapStateToProps = state => ({
   restore: selectAuthRestore(state),
diff --git a/src/containers/dialogs/RestoreRequestDialog/index.tsx b/src/containers/dialogs/RestoreRequestDialog/index.tsx
index 3e1c7fd1..3faa6394 100644
--- a/src/containers/dialogs/RestoreRequestDialog/index.tsx
+++ b/src/containers/dialogs/RestoreRequestDialog/index.tsx
@@ -12,7 +12,7 @@ import { pick } from 'ramda';
 import { selectAuthRestore } from '~/redux/auth/selectors';
 import { ERROR_LITERAL } from '~/constants/errors';
 import { Icon } from '~/components/input/Icon';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 
 const mapStateToProps = state => ({
   restore: selectAuthRestore(state),
diff --git a/src/containers/lab/LabGrid/index.tsx b/src/containers/lab/LabGrid/index.tsx
index 4bc112c2..792cd8bc 100644
--- a/src/containers/lab/LabGrid/index.tsx
+++ b/src/containers/lab/LabGrid/index.tsx
@@ -4,7 +4,7 @@ import styles from './styles.module.scss';
 import { LabNode } from '~/components/lab/LabNode';
 import { EMPTY_NODE, NODE_TYPES } from '~/redux/node/constants';
 import { values } from 'ramda';
-import { useLabPagination } from '~/utils/hooks/lab/useLabPagination';
+import { useLabPagination } from '~/hooks/lab/useLabPagination';
 import { useLabContext } from '~/utils/context/LabContextProvider';
 
 interface IProps {}
diff --git a/src/containers/main/MainRouter/index.tsx b/src/containers/main/MainRouter/index.tsx
index 09e681e6..8d62488c 100644
--- a/src/containers/main/MainRouter/index.tsx
+++ b/src/containers/main/MainRouter/index.tsx
@@ -2,7 +2,7 @@ import React, { FC } from 'react';
 import { URLS } from '~/constants/urls';
 import { ErrorNotFound } from '~/containers/pages/ErrorNotFound';
 import { Redirect, Route, Switch, useLocation } from 'react-router';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectAuthUser } from '~/redux/auth/selectors';
 import { ProfileLayout } from '~/layouts/ProfileLayout';
 import FlowPage from '~/pages';
diff --git a/src/containers/node/NodeBottomBlock/index.tsx b/src/containers/node/NodeBottomBlock/index.tsx
index 348891a1..32e67c47 100644
--- a/src/containers/node/NodeBottomBlock/index.tsx
+++ b/src/containers/node/NodeBottomBlock/index.tsx
@@ -4,7 +4,7 @@ import { Group } from '~/components/containers/Group';
 import { Padder } from '~/components/containers/Padder';
 import { NodeCommentForm } from '~/components/node/NodeCommentForm';
 import { NodeRelatedBlock } from '~/components/node/NodeRelatedBlock';
-import { useNodeBlocks } from '~/utils/hooks/node/useNodeBlocks';
+import { useNodeBlocks } from '~/hooks/node/useNodeBlocks';
 import { NodeTagsBlock } from '~/components/node/NodeTagsBlock';
 import StickyBox from 'react-sticky-box/dist/esnext';
 import styles from './styles.module.scss';
diff --git a/src/containers/node/NodeComments/index.tsx b/src/containers/node/NodeComments/index.tsx
index 0d129c4a..0410039b 100644
--- a/src/containers/node/NodeComments/index.tsx
+++ b/src/containers/node/NodeComments/index.tsx
@@ -5,7 +5,7 @@ import { ICommentGroup } from '~/redux/types';
 import { canEditComment } from '~/utils/node';
 import { COMMENTS_DISPLAY } from '~/redux/node/constants';
 import { plural } from '~/utils/dom';
-import { useGrouppedComments } from '~/utils/hooks/node/useGrouppedComments';
+import { useGrouppedComments } from '~/hooks/node/useGrouppedComments';
 import { useCommentContext } from '~/utils/context/CommentContextProvider';
 import { Comment } from '~/components/comment/Comment';
 import { useUserContext } from '~/utils/context/UserContextProvider';
diff --git a/src/containers/player/PlayerView/index.tsx b/src/containers/player/PlayerView/index.tsx
index b7ba2824..441fd16e 100644
--- a/src/containers/player/PlayerView/index.tsx
+++ b/src/containers/player/PlayerView/index.tsx
@@ -1,6 +1,6 @@
 import React, { VFC } from 'react';
 import { PlayerBar } from '~/components/bars/PlayerBar';
-import { usePlayer } from '~/utils/hooks/player/usePlayer';
+import { usePlayer } from '~/hooks/player/usePlayer';
 
 interface PlayerViewProps {}
 
diff --git a/src/containers/sidebars/ProfileSidebar/index.tsx b/src/containers/sidebars/ProfileSidebar/index.tsx
index 0d8195bc..8408a83b 100644
--- a/src/containers/sidebars/ProfileSidebar/index.tsx
+++ b/src/containers/sidebars/ProfileSidebar/index.tsx
@@ -9,7 +9,7 @@ import { Filler } from '~/components/containers/Filler';
 import { Route, Switch, useHistory, useRouteMatch } from 'react-router';
 import * as USER_ACTIONS from '~/redux/auth/actions';
 import { ProfileSidebarMenu } from '~/components/profile/ProfileSidebarMenu';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 import { Icon } from '~/components/input/Icon';
 import { ProfileSidebarSettings } from '~/components/profile/ProfileSidebarSettings';
 import classNames from 'classnames';
diff --git a/src/containers/sidebars/SidebarWrapper/index.tsx b/src/containers/sidebars/SidebarWrapper/index.tsx
index fb16af23..29f88b00 100644
--- a/src/containers/sidebars/SidebarWrapper/index.tsx
+++ b/src/containers/sidebars/SidebarWrapper/index.tsx
@@ -2,7 +2,7 @@ import React, { FC, useEffect, useRef } from 'react';
 import styles from './styles.module.scss';
 import { createPortal } from 'react-dom';
 import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock';
-import { useCloseOnEscape } from '~/utils/hooks';
+import { useCloseOnEscape } from '~/hooks';
 
 interface IProps {
   onClose?: () => void;
diff --git a/src/utils/hooks/boris/useBoris.ts b/src/hooks/boris/useBoris.ts
similarity index 92%
rename from src/utils/hooks/boris/useBoris.ts
rename to src/hooks/boris/useBoris.ts
index a29cfd9d..17067d90 100644
--- a/src/utils/hooks/boris/useBoris.ts
+++ b/src/hooks/boris/useBoris.ts
@@ -3,9 +3,9 @@ import { useCallback, useEffect } from 'react';
 import isBefore from 'date-fns/isBefore';
 import { authSetState, authSetUser } from '~/redux/auth/actions';
 import { borisLoadStats } from '~/redux/boris/actions';
-import { useUser } from '~/utils/hooks/user/userUser';
+import { useUser } from '~/hooks/user/userUser';
 import { IComment } from '~/redux/types';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectAuthIsTester } from '~/redux/auth/selectors';
 import { selectBorisStats } from '~/redux/boris/selectors';
 import { useRandomPhrase } from '~/constants/phrases';
diff --git a/src/utils/hooks/useColorFromString.ts b/src/hooks/color/useColorFromString.ts
similarity index 100%
rename from src/utils/hooks/useColorFromString.ts
rename to src/hooks/color/useColorFromString.ts
diff --git a/src/utils/hooks/useColorGradientFromString.ts b/src/hooks/color/useColorGradientFromString.ts
similarity index 100%
rename from src/utils/hooks/useColorGradientFromString.ts
rename to src/hooks/color/useColorGradientFromString.ts
diff --git a/src/utils/hooks/useCommentFormFormik.ts b/src/hooks/comments/useCommentFormFormik.ts
similarity index 96%
rename from src/utils/hooks/useCommentFormFormik.ts
rename to src/hooks/comments/useCommentFormFormik.ts
index 5b666a15..7e814fcc 100644
--- a/src/utils/hooks/useCommentFormFormik.ts
+++ b/src/hooks/comments/useCommentFormFormik.ts
@@ -2,7 +2,7 @@ import { IComment, INode } from '~/redux/types';
 import { useCallback, useEffect, useRef } from 'react';
 import { FormikHelpers, useFormik, useFormikContext } from 'formik';
 import { array, object, string } from 'yup';
-import { FileUploader } from '~/utils/hooks/useFileUploader';
+import { FileUploader } from '~/hooks/data/useFileUploader';
 import { useDispatch } from 'react-redux';
 import { nodePostLocalComment } from '~/redux/node/actions';
 
diff --git a/src/utils/hooks/useFileUploader.tsx b/src/hooks/data/useFileUploader.tsx
similarity index 97%
rename from src/utils/hooks/useFileUploader.tsx
rename to src/hooks/data/useFileUploader.tsx
index 4d6b834b..79179f88 100644
--- a/src/utils/hooks/useFileUploader.tsx
+++ b/src/hooks/data/useFileUploader.tsx
@@ -13,7 +13,7 @@ import { getFileType } from '~/utils/uploader';
 import uuid from 'uuid4';
 import { useDispatch } from 'react-redux';
 import { uploadUploadFiles } from '~/redux/uploads/actions';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectUploads } from '~/redux/uploads/selectors';
 import { path } from 'ramda';
 import { IUploadStatus } from '~/redux/uploads/reducer';
diff --git a/src/utils/hooks/usePersistedState.ts b/src/hooks/data/usePersistedState.ts
similarity index 100%
rename from src/utils/hooks/usePersistedState.ts
rename to src/hooks/data/usePersistedState.ts
diff --git a/src/utils/hooks/useShallowSelect.ts b/src/hooks/data/useShallowSelect.ts
similarity index 100%
rename from src/utils/hooks/useShallowSelect.ts
rename to src/hooks/data/useShallowSelect.ts
diff --git a/src/utils/hooks/useTranslatedError.ts b/src/hooks/data/useTranslatedError.ts
similarity index 100%
rename from src/utils/hooks/useTranslatedError.ts
rename to src/hooks/data/useTranslatedError.ts
diff --git a/src/utils/hooks/useClickOutsideFocus.ts b/src/hooks/dom/useClickOutsideFocus.ts
similarity index 93%
rename from src/utils/hooks/useClickOutsideFocus.ts
rename to src/hooks/dom/useClickOutsideFocus.ts
index 17500715..7fd0d045 100644
--- a/src/utils/hooks/useClickOutsideFocus.ts
+++ b/src/hooks/dom/useClickOutsideFocus.ts
@@ -2,7 +2,7 @@
  * Handles blur by detecting clicks outside refs.
  */
 import { useCallback, useEffect, useRef, useState } from 'react';
-import { useCloseOnEscape } from '~/utils/hooks/index';
+import { useCloseOnEscape } from '~/hooks';
 
 export const useClickOutsideFocus = () => {
   const ref = useRef<HTMLElement>();
diff --git a/src/utils/hooks/useDragDetector.tsx b/src/hooks/dom/useDragDetector.tsx
similarity index 100%
rename from src/utils/hooks/useDragDetector.tsx
rename to src/hooks/dom/useDragDetector.tsx
diff --git a/src/utils/hooks/useFocusEvent.ts b/src/hooks/dom/useFocusEvent.ts
similarity index 100%
rename from src/utils/hooks/useFocusEvent.ts
rename to src/hooks/dom/useFocusEvent.ts
diff --git a/src/utils/hooks/useFormatWrapper.ts b/src/hooks/dom/useFormatWrapper.ts
similarity index 92%
rename from src/utils/hooks/useFormatWrapper.ts
rename to src/hooks/dom/useFormatWrapper.ts
index 3ffa2f9f..1ef5cddc 100644
--- a/src/utils/hooks/useFormatWrapper.ts
+++ b/src/hooks/dom/useFormatWrapper.ts
@@ -1,5 +1,6 @@
 import { useCallback } from 'react';
 
+/** wraps text inside textarea with tags */
 export const useFormatWrapper = (
   target: HTMLTextAreaElement,
   onChange: (val: string) => void,
@@ -15,6 +16,7 @@ export const useFormatWrapper = (
   );
 };
 
+/** wraps text inside textarea with tags */
 export const wrapTextInsideInput = (
   target: HTMLTextAreaElement,
   prefix: string,
diff --git a/src/utils/hooks/useInfiniteLoader.ts b/src/hooks/dom/useInfiniteLoader.ts
similarity index 100%
rename from src/utils/hooks/useInfiniteLoader.ts
rename to src/hooks/dom/useInfiniteLoader.ts
diff --git a/src/utils/hooks/useInputPasteUpload.ts b/src/hooks/dom/useInputPasteUpload.ts
similarity index 100%
rename from src/utils/hooks/useInputPasteUpload.ts
rename to src/hooks/dom/useInputPasteUpload.ts
diff --git a/src/utils/hooks/usePopperModifiers.ts b/src/hooks/dom/usePopperModifiers.ts
similarity index 100%
rename from src/utils/hooks/usePopperModifiers.ts
rename to src/hooks/dom/usePopperModifiers.ts
diff --git a/src/utils/hooks/useResizeHandler.ts b/src/hooks/dom/useResizeHandler.ts
similarity index 100%
rename from src/utils/hooks/useResizeHandler.ts
rename to src/hooks/dom/useResizeHandler.ts
diff --git a/src/utils/hooks/useScrollToTop.ts b/src/hooks/dom/useScrollToTop.ts
similarity index 100%
rename from src/utils/hooks/useScrollToTop.ts
rename to src/hooks/dom/useScrollToTop.ts
diff --git a/src/utils/hooks/flow/useFlow.ts b/src/hooks/flow/useFlow.ts
similarity index 82%
rename from src/utils/hooks/flow/useFlow.ts
rename to src/hooks/flow/useFlow.ts
index 275af84d..6f7ab46e 100644
--- a/src/utils/hooks/flow/useFlow.ts
+++ b/src/hooks/flow/useFlow.ts
@@ -1,9 +1,9 @@
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectFlow } from '~/redux/flow/selectors';
-import { useFlowLayout } from '~/utils/hooks/flow/useFlowLayout';
+import { useFlowLayout } from '~/hooks/flow/useFlowLayout';
 import { selectLabUpdatesNodes } from '~/redux/lab/selectors';
 import { useDispatch } from 'react-redux';
-import { useFlowPagination } from '~/utils/hooks/flow/useFlowPagination';
+import { useFlowPagination } from '~/hooks/flow/useFlowPagination';
 import { useCallback, useMemo } from 'react';
 import { FlowDisplay, INode } from '~/redux/types';
 import { flowSetCellView } from '~/redux/flow/actions';
diff --git a/src/utils/hooks/flow/useFlowCellControls.ts b/src/hooks/flow/useFlowCellControls.ts
similarity index 100%
rename from src/utils/hooks/flow/useFlowCellControls.ts
rename to src/hooks/flow/useFlowCellControls.ts
diff --git a/src/utils/hooks/flow/useFlowLayout.ts b/src/hooks/flow/useFlowLayout.ts
similarity index 88%
rename from src/utils/hooks/flow/useFlowLayout.ts
rename to src/hooks/flow/useFlowLayout.ts
index edcab5e9..aedd1555 100644
--- a/src/utils/hooks/flow/useFlowLayout.ts
+++ b/src/hooks/flow/useFlowLayout.ts
@@ -1,5 +1,5 @@
 import { useCallback } from 'react';
-import { usePersistedState } from '~/utils/hooks/usePersistedState';
+import { usePersistedState } from '~/hooks/data/usePersistedState';
 import { experimentalFeatures } from '~/constants/features';
 
 enum Layout {
diff --git a/src/utils/hooks/flow/useFlowPagination.ts b/src/hooks/flow/useFlowPagination.ts
similarity index 83%
rename from src/utils/hooks/flow/useFlowPagination.ts
rename to src/hooks/flow/useFlowPagination.ts
index de0b6c15..31dd5596 100644
--- a/src/utils/hooks/flow/useFlowPagination.ts
+++ b/src/hooks/flow/useFlowPagination.ts
@@ -1,7 +1,7 @@
 import { useCallback } from 'react';
 import { flowGetMore } from '~/redux/flow/actions';
 import { useDispatch } from 'react-redux';
-import { useInfiniteLoader } from '~/utils/hooks/useInfiniteLoader';
+import { useInfiniteLoader } from '~/hooks/dom/useInfiniteLoader';
 
 export const useFlowPagination = ({ isLoading }) => {
   const dispatch = useDispatch();
diff --git a/src/utils/hooks/index.ts b/src/hooks/index.ts
similarity index 100%
rename from src/utils/hooks/index.ts
rename to src/hooks/index.ts
diff --git a/src/utils/hooks/lab/useLab.ts b/src/hooks/lab/useLab.ts
similarity index 93%
rename from src/utils/hooks/lab/useLab.ts
rename to src/hooks/lab/useLab.ts
index aefeb123..e3005ed9 100644
--- a/src/utils/hooks/lab/useLab.ts
+++ b/src/hooks/lab/useLab.ts
@@ -1,4 +1,4 @@
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import {
   selectLabList,
   selectLabStatsHeroes,
diff --git a/src/utils/hooks/lab/useLabPagination.ts b/src/hooks/lab/useLabPagination.ts
similarity index 100%
rename from src/utils/hooks/lab/useLabPagination.ts
rename to src/hooks/lab/useLabPagination.ts
diff --git a/src/utils/hooks/useBlockBackButton.ts b/src/hooks/navigation/useBlockBackButton.ts
similarity index 100%
rename from src/utils/hooks/useBlockBackButton.ts
rename to src/hooks/navigation/useBlockBackButton.ts
diff --git a/src/utils/hooks/useImageModal.ts b/src/hooks/navigation/useImageModal.ts
similarity index 100%
rename from src/utils/hooks/useImageModal.ts
rename to src/hooks/navigation/useImageModal.ts
diff --git a/src/utils/hooks/data/useCreateNode.ts b/src/hooks/node/useCreateNode.ts
similarity index 94%
rename from src/utils/hooks/data/useCreateNode.ts
rename to src/hooks/node/useCreateNode.ts
index 91f46546..1f02c85a 100644
--- a/src/utils/hooks/data/useCreateNode.ts
+++ b/src/hooks/node/useCreateNode.ts
@@ -5,7 +5,7 @@ import { selectFlowNodes } from '~/redux/flow/selectors';
 import { flowSetNodes } from '~/redux/flow/actions';
 import { selectLabListNodes } from '~/redux/lab/selectors';
 import { labSetList } from '~/redux/lab/actions';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { useDispatch } from 'react-redux';
 
 export const useCreateNode = () => {
diff --git a/src/utils/hooks/node/useFullNode.ts b/src/hooks/node/useFullNode.ts
similarity index 69%
rename from src/utils/hooks/node/useFullNode.ts
rename to src/hooks/node/useFullNode.ts
index 8ace61f7..4ee20fe6 100644
--- a/src/utils/hooks/node/useFullNode.ts
+++ b/src/hooks/node/useFullNode.ts
@@ -1,7 +1,7 @@
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectNode } from '~/redux/node/selectors';
-import { useLoadNode } from '~/utils/hooks/node/useLoadNode';
-import { useOnNodeSeen } from '~/utils/hooks/node/useOnNodeSeen';
+import { useLoadNode } from '~/hooks/node/useLoadNode';
+import { useOnNodeSeen } from '~/hooks/node/useOnNodeSeen';
 
 export const useFullNode = (id: string) => {
   const {
diff --git a/src/utils/hooks/data/useGetNode.ts b/src/hooks/node/useGetNode.ts
similarity index 92%
rename from src/utils/hooks/data/useGetNode.ts
rename to src/hooks/node/useGetNode.ts
index 547f8315..de1d35e5 100644
--- a/src/utils/hooks/data/useGetNode.ts
+++ b/src/hooks/node/useGetNode.ts
@@ -1,7 +1,7 @@
 import useSWR from 'swr';
 import { ApiGetNodeResponse } from '~/redux/node/types';
 import { API } from '~/constants/api';
-import { useOnNodeSeen } from '~/utils/hooks/node/useOnNodeSeen';
+import { useOnNodeSeen } from '~/hooks/node/useOnNodeSeen';
 import { apiGetNode } from '~/redux/node/api';
 import { useCallback } from 'react';
 import { INode } from '~/redux/types';
diff --git a/src/utils/hooks/data/useGetNodeRelated.ts b/src/hooks/node/useGetNodeRelated.ts
similarity index 100%
rename from src/utils/hooks/data/useGetNodeRelated.ts
rename to src/hooks/node/useGetNodeRelated.ts
diff --git a/src/utils/hooks/node/useGotoNode.ts b/src/hooks/node/useGotoNode.ts
similarity index 100%
rename from src/utils/hooks/node/useGotoNode.ts
rename to src/hooks/node/useGotoNode.ts
diff --git a/src/utils/hooks/node/useGrouppedComments.ts b/src/hooks/node/useGrouppedComments.ts
similarity index 100%
rename from src/utils/hooks/node/useGrouppedComments.ts
rename to src/hooks/node/useGrouppedComments.ts
diff --git a/src/utils/hooks/node/useLoadNode.ts b/src/hooks/node/useLoadNode.ts
similarity index 100%
rename from src/utils/hooks/node/useLoadNode.ts
rename to src/hooks/node/useLoadNode.ts
diff --git a/src/utils/hooks/node/useNodeActions.ts b/src/hooks/node/useNodeActions.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeActions.ts
rename to src/hooks/node/useNodeActions.ts
diff --git a/src/utils/hooks/node/useNodeAudios.ts b/src/hooks/node/useNodeAudios.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeAudios.ts
rename to src/hooks/node/useNodeAudios.ts
diff --git a/src/utils/hooks/node/useNodeBlocks.ts b/src/hooks/node/useNodeBlocks.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeBlocks.ts
rename to src/hooks/node/useNodeBlocks.ts
diff --git a/src/utils/hooks/node/useNodeComments.ts b/src/hooks/node/useNodeComments.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeComments.ts
rename to src/hooks/node/useNodeComments.ts
diff --git a/src/utils/hooks/node/useNodeCoverImage.ts b/src/hooks/node/useNodeCoverImage.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeCoverImage.ts
rename to src/hooks/node/useNodeCoverImage.ts
diff --git a/src/utils/hooks/node/useNodeFormFormik.ts b/src/hooks/node/useNodeFormFormik.ts
similarity index 96%
rename from src/utils/hooks/node/useNodeFormFormik.ts
rename to src/hooks/node/useNodeFormFormik.ts
index 43e95829..00b43af4 100644
--- a/src/utils/hooks/node/useNodeFormFormik.ts
+++ b/src/hooks/node/useNodeFormFormik.ts
@@ -1,5 +1,5 @@
 import { INode } from '~/redux/types';
-import { FileUploader } from '~/utils/hooks/useFileUploader';
+import { FileUploader } from '~/hooks/data/useFileUploader';
 import { useCallback, useRef } from 'react';
 import { FormikConfig, FormikHelpers, useFormik, useFormikContext } from 'formik';
 import { object } from 'yup';
diff --git a/src/utils/hooks/node/useNodeImages.ts b/src/hooks/node/useNodeImages.ts
similarity index 100%
rename from src/utils/hooks/node/useNodeImages.ts
rename to src/hooks/node/useNodeImages.ts
diff --git a/src/utils/hooks/node/useNodePermissions.ts b/src/hooks/node/useNodePermissions.ts
similarity index 88%
rename from src/utils/hooks/node/useNodePermissions.ts
rename to src/hooks/node/useNodePermissions.ts
index 08eea085..681d789a 100644
--- a/src/utils/hooks/node/useNodePermissions.ts
+++ b/src/hooks/node/useNodePermissions.ts
@@ -1,6 +1,6 @@
 import { useMemo } from 'react';
 import { canEditNode, canLikeNode, canStarNode } from '~/utils/node';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectUser } from '~/redux/auth/selectors';
 import { INode } from '~/redux/types';
 
diff --git a/src/utils/hooks/node/useNodeTags.ts b/src/hooks/node/useNodeTags.ts
similarity index 95%
rename from src/utils/hooks/node/useNodeTags.ts
rename to src/hooks/node/useNodeTags.ts
index ff175f15..0838978e 100644
--- a/src/utils/hooks/node/useNodeTags.ts
+++ b/src/hooks/node/useNodeTags.ts
@@ -2,7 +2,7 @@ import { useHistory } from 'react-router';
 import { useCallback } from 'react';
 import { ITag } from '~/redux/types';
 import { URLS } from '~/constants/urls';
-import { useGetNode } from '~/utils/hooks/data/useGetNode';
+import { useGetNode } from '~/hooks/node/useGetNode';
 import { apiDeleteNodeTag, apiPostNodeTags } from '~/redux/node/api';
 
 export const useNodeTags = (id: number) => {
diff --git a/src/utils/hooks/node/useOnNodeSeen.ts b/src/hooks/node/useOnNodeSeen.ts
similarity index 100%
rename from src/utils/hooks/node/useOnNodeSeen.ts
rename to src/hooks/node/useOnNodeSeen.ts
diff --git a/src/utils/hooks/data/useUpdateNode.ts b/src/hooks/node/useUpdateNode.ts
similarity index 91%
rename from src/utils/hooks/data/useUpdateNode.ts
rename to src/hooks/node/useUpdateNode.ts
index 6a9a8277..5d8bd35a 100644
--- a/src/utils/hooks/data/useUpdateNode.ts
+++ b/src/hooks/node/useUpdateNode.ts
@@ -1,4 +1,4 @@
-import { useGetNode } from '~/utils/hooks/data/useGetNode';
+import { useGetNode } from '~/hooks/node/useGetNode';
 import { useCallback } from 'react';
 import { INode } from '~/redux/types';
 import { apiPostNode } from '~/redux/node/api';
@@ -6,7 +6,7 @@ import { selectFlowNodes } from '~/redux/flow/selectors';
 import { flowSetNodes } from '~/redux/flow/actions';
 import { selectLabListNodes } from '~/redux/lab/selectors';
 import { labSetList } from '~/redux/lab/actions';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { useDispatch } from 'react-redux';
 
 export const useUpdateNode = (id: number) => {
diff --git a/src/utils/hooks/player/usePlayer.ts b/src/hooks/player/usePlayer.ts
similarity index 92%
rename from src/utils/hooks/player/usePlayer.ts
rename to src/hooks/player/usePlayer.ts
index 56aba1e8..7a99e83e 100644
--- a/src/utils/hooks/player/usePlayer.ts
+++ b/src/hooks/player/usePlayer.ts
@@ -1,4 +1,4 @@
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectPlayer } from '~/redux/player/selectors';
 import { useCallback } from 'react';
 import { playerPause, playerPlay, playerSeek, playerStop } from '~/redux/player/actions';
diff --git a/src/utils/hooks/search/useSearch.ts b/src/hooks/search/useSearch.ts
similarity index 91%
rename from src/utils/hooks/search/useSearch.ts
rename to src/hooks/search/useSearch.ts
index e2aff97e..dad36945 100644
--- a/src/utils/hooks/search/useSearch.ts
+++ b/src/hooks/search/useSearch.ts
@@ -1,7 +1,7 @@
 import { useCallback } from 'react';
 import { flowChangeSearch, flowLoadMoreSearch } from '~/redux/flow/actions';
 import { useDispatch } from 'react-redux';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectFlow } from '~/redux/flow/selectors';
 
 export const useSearch = () => {
diff --git a/src/utils/hooks/user/useUserDescription.ts b/src/hooks/user/useUserDescription.ts
similarity index 100%
rename from src/utils/hooks/user/useUserDescription.ts
rename to src/hooks/user/useUserDescription.ts
diff --git a/src/utils/hooks/user/userUser.ts b/src/hooks/user/userUser.ts
similarity index 62%
rename from src/utils/hooks/user/userUser.ts
rename to src/hooks/user/userUser.ts
index 018b5fde..5c0693ad 100644
--- a/src/utils/hooks/user/userUser.ts
+++ b/src/hooks/user/userUser.ts
@@ -1,4 +1,4 @@
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectUser } from '~/redux/auth/selectors';
 
 export const useUser = () => useShallowSelect(selectUser);
diff --git a/src/layouts/NodeLayout/index.tsx b/src/layouts/NodeLayout/index.tsx
index 6bbce31d..1f641a3d 100644
--- a/src/layouts/NodeLayout/index.tsx
+++ b/src/layouts/NodeLayout/index.tsx
@@ -6,16 +6,16 @@ import { Footer } from '~/components/main/Footer';
 
 import { SidebarRouter } from '~/containers/main/SidebarRouter';
 import { Container } from '~/containers/main/Container';
-import { useNodeBlocks } from '~/utils/hooks/node/useNodeBlocks';
+import { useNodeBlocks } from '~/hooks/node/useNodeBlocks';
 import { NodeBottomBlock } from '~/containers/node/NodeBottomBlock';
-import { useNodeCoverImage } from '~/utils/hooks/node/useNodeCoverImage';
+import { useNodeCoverImage } from '~/hooks/node/useNodeCoverImage';
 import { URLS } from '~/constants/urls';
 import { EditorEditDialog } from '~/containers/dialogs/EditorEditDialog';
 
 import styles from './styles.module.scss';
 import { useNodeContext } from '~/utils/context/NodeContextProvider';
-import { useNodePermissions } from '~/utils/hooks/node/useNodePermissions';
-import { useNodeActions } from '~/utils/hooks/node/useNodeActions';
+import { useNodePermissions } from '~/hooks/node/useNodePermissions';
+import { useNodeActions } from '~/hooks/node/useNodeActions';
 import { NodeTitle } from '~/components/node/NodeTitle';
 
 type IProps = {};
diff --git a/src/layouts/ProfileLayout/index.tsx b/src/layouts/ProfileLayout/index.tsx
index bcd70fa5..f20ca4f0 100644
--- a/src/layouts/ProfileLayout/index.tsx
+++ b/src/layouts/ProfileLayout/index.tsx
@@ -3,7 +3,7 @@ import styles from './styles.module.scss';
 import { RouteComponentProps } from 'react-router';
 import { useDispatch } from 'react-redux';
 import { authLoadProfile } from '~/redux/auth/actions';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectAuthProfile, selectUser } from '~/redux/auth/selectors';
 import { ProfilePageLeft } from '~/containers/profile/ProfilePageLeft';
 import { Container } from '~/containers/main/Container';
diff --git a/src/pages/boris.tsx b/src/pages/boris.tsx
index 936b1b87..b4d017fd 100644
--- a/src/pages/boris.tsx
+++ b/src/pages/boris.tsx
@@ -1,15 +1,15 @@
 import React, { useEffect, VFC } from 'react';
 import { useDispatch } from 'react-redux';
-import { useShallowSelect } from '~/utils/hooks/useShallowSelect';
+import { useShallowSelect } from '~/hooks/data/useShallowSelect';
 import { selectNode } from '~/redux/node/selectors';
 import { BorisLayout } from '~/layouts/BorisLayout';
 import { nodeLoadNode } from '~/redux/node/actions';
 import { CommentContextProvider } from '~/utils/context/CommentContextProvider';
-import { useImageModal } from '~/utils/hooks/useImageModal';
-import { useNodeComments } from '~/utils/hooks/node/useNodeComments';
-import { useBoris } from '~/utils/hooks/boris/useBoris';
+import { useImageModal } from '~/hooks/navigation/useImageModal';
+import { useNodeComments } from '~/hooks/node/useNodeComments';
+import { useBoris } from '~/hooks/boris/useBoris';
 import { NodeContextProvider } from '~/utils/context/NodeContextProvider';
-import { useGetNode } from '~/utils/hooks/data/useGetNode';
+import { useGetNode } from '~/hooks/node/useGetNode';
 
 const BorisPage: VFC = () => {
   const dispatch = useDispatch();
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 01943ef9..eac397d7 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,8 +1,8 @@
 import React, { FC } from 'react';
 import { FlowLayout } from '~/layouts/FlowLayout';
-import { useFlow } from '~/utils/hooks/flow/useFlow';
-import { useSearch } from '~/utils/hooks/search/useSearch';
-import { useUser } from '~/utils/hooks/user/userUser';
+import { useFlow } from '~/hooks/flow/useFlow';
+import { useSearch } from '~/hooks/search/useSearch';
+import { useUser } from '~/hooks/user/userUser';
 
 interface Props {}
 
diff --git a/src/pages/node/[id].tsx b/src/pages/node/[id].tsx
index 92a941b6..f9c7fd1a 100644
--- a/src/pages/node/[id].tsx
+++ b/src/pages/node/[id].tsx
@@ -1,18 +1,18 @@
 import React, { FC } from 'react';
 import { NodeLayout } from '~/layouts/NodeLayout';
 import { RouteComponentProps } from 'react-router';
-import { useScrollToTop } from '~/utils/hooks/useScrollToTop';
-import { useFullNode } from '~/utils/hooks/node/useFullNode';
-import { useImageModal } from '~/utils/hooks/useImageModal';
-import { useNodeComments } from '~/utils/hooks/node/useNodeComments';
-import { useUser } from '~/utils/hooks/user/userUser';
-import { useNodeTags } from '~/utils/hooks/node/useNodeTags';
+import { useScrollToTop } from '~/hooks/dom/useScrollToTop';
+import { useFullNode } from '~/hooks/node/useFullNode';
+import { useImageModal } from '~/hooks/navigation/useImageModal';
+import { useNodeComments } from '~/hooks/node/useNodeComments';
+import { useUser } from '~/hooks/user/userUser';
+import { useNodeTags } from '~/hooks/node/useNodeTags';
 import { NodeContextProvider } from '~/utils/context/NodeContextProvider';
 import { CommentContextProvider } from '~/utils/context/CommentContextProvider';
 import { TagsContextProvider } from '~/utils/context/TagsContextProvider';
-import { useNodePermissions } from '~/utils/hooks/node/useNodePermissions';
+import { useNodePermissions } from '~/hooks/node/useNodePermissions';
 import { NodeRelatedProvider } from '~/utils/providers/NodeRelatedProvider';
-import { useGetNode } from '~/utils/hooks/data/useGetNode';
+import { useGetNode } from '~/hooks/node/useGetNode';
 
 type Props = RouteComponentProps<{ id: string }> & {};
 
diff --git a/src/utils/hooks/keys.ts b/src/utils/hooks/keys.ts
deleted file mode 100644
index 93432d00..00000000
--- a/src/utils/hooks/keys.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { useCallback, useEffect } from 'react';
-
-export const useArrows = (onNext: () => void, onPrev: () => void, locked) => {
-  const onKeyDown = useCallback(
-    event => {
-      if ((event.target.tagName && ['TEXTAREA', 'INPUT'].includes(event.target.tagName)) || locked)
-        return;
-
-      switch (event.key) {
-        case 'ArrowLeft':
-          return onPrev();
-        case 'ArrowRight':
-          return onNext();
-      }
-    },
-    [onNext, onPrev, locked]
-  );
-
-  useEffect(() => {
-    window.addEventListener('keydown', onKeyDown);
-    return () => window.removeEventListener('keydown', onKeyDown);
-  }, [onKeyDown]);
-};
diff --git a/src/utils/providers/LabProvider.tsx b/src/utils/providers/LabProvider.tsx
index d33accc6..087f19aa 100644
--- a/src/utils/providers/LabProvider.tsx
+++ b/src/utils/providers/LabProvider.tsx
@@ -1,6 +1,6 @@
 import React, { FC } from 'react';
 import { LabContextProvider } from '~/utils/context/LabContextProvider';
-import { useLab } from '~/utils/hooks/lab/useLab';
+import { useLab } from '~/hooks/lab/useLab';
 
 interface LabProviderProps {}
 
diff --git a/src/utils/providers/NodeRelatedProvider.tsx b/src/utils/providers/NodeRelatedProvider.tsx
index 5211b2a1..31d9c4ce 100644
--- a/src/utils/providers/NodeRelatedProvider.tsx
+++ b/src/utils/providers/NodeRelatedProvider.tsx
@@ -2,7 +2,7 @@ import React, { FC, useEffect } from 'react';
 import { INode, ITag } from '~/redux/types';
 import { NodeRelatedContextProvider } from '~/utils/context/NodeRelatedContextProvider';
 import { INodeRelated } from '~/redux/node/types';
-import { useGetNodeRelated } from '~/utils/hooks/data/useGetNodeRelated';
+import { useGetNodeRelated } from '~/hooks/node/useGetNodeRelated';
 
 interface NodeRelatedProviderProps {
   id: INode['id'];