diff --git a/includes/widget_engine.theme.inc b/includes/widget_engine.theme.inc
index a78fa2c..3157b47 100644
--- a/includes/widget_engine.theme.inc
+++ b/includes/widget_engine.theme.inc
@@ -4,34 +4,17 @@
  * @file
  * Preprocess for widget_engine module.
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\widget_engine\Hook\WidgetEngineThemeHooks;
 use Drupal\Core\Render\Element;
 
 /**
  * Implements hook_theme().
  */
-function widget_engine_theme($existing, $type, $theme, $path) {
-  $theme = [];
-  $theme['widget'] = [
-    'render element' => 'elements',
-    'template' => 'widget',
-  ];
-  $theme['widget_content_add_list'] = [
-    'render element' => 'content',
-    'variables' => ['content' => NULL],
-  ];
-  $theme['html__widget_engine'] = [
-    'template' => 'html--widget-engine',
-    'render element' => 'html',
-    'preprocess functions' => ['template_preprocess_html'],
-  ];
-  $theme['page__widget_engine'] = [
-    'template' => 'page--widget-engine',
-    'render element' => 'html',
-    'preprocess functions' => ['template_preprocess_page'],
-  ];
-
-  return $theme;
+#[LegacyHook]
+function widget_engine_theme($existing, $type, $theme, $path)
+{
+    return \Drupal::service(WidgetEngineThemeHooks::class)->theme($existing, $type, $theme, $path);
 }
 
 /**
@@ -56,15 +39,8 @@ function template_preprocess_widget(array &$variables) {
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
-function widget_engine_theme_suggestions_widget(array $variables) {
-  $suggestions = [];
-  $entity = $variables['elements']['#widget'];
-  $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
-
-  $suggestions[] = 'widget__' . $sanitized_view_mode;
-  $suggestions[] = 'widget__' . $entity->bundle();
-  $suggestions[] = 'widget__' . $entity->bundle() . '__' . $sanitized_view_mode;
-  $suggestions[] = 'widget__' . $entity->id();
-  $suggestions[] = 'widget__' . $entity->id() . '__' . $sanitized_view_mode;
-  return $suggestions;
+#[LegacyHook]
+function widget_engine_theme_suggestions_widget(array $variables)
+{
+    return \Drupal::service(WidgetEngineThemeHooks::class)->themeSuggestionsWidget($variables);
 }
diff --git a/modules/widget_engine_entity_form/includes/widget_engine_entity_form.theme.inc b/modules/widget_engine_entity_form/includes/widget_engine_entity_form.theme.inc
index 8000712..cc85f97 100644
--- a/modules/widget_engine_entity_form/includes/widget_engine_entity_form.theme.inc
+++ b/modules/widget_engine_entity_form/includes/widget_engine_entity_form.theme.inc
@@ -1,5 +1,8 @@
 <?php
 
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormThemeHooks;
+
 /**
  * @file
  * Preprocess for widget_engine_entity_form module.
@@ -8,14 +11,10 @@
 /**
  * Implements hook_theme().
  */
-function widget_engine_entity_form_theme($existing, $type, $theme, $path) {
-  $theme = [];
-  $theme['widget__widget_form'] = array(
-    'base hook' => 'widget',
-    'template' => 'widget--widget-form',
-  );
-
-  return $theme;
+#[LegacyHook]
+function widget_engine_entity_form_theme($existing, $type, $theme, $path)
+{
+    return \Drupal::service(WidgetEngineEntityFormThemeHooks::class)->theme($existing, $type, $theme, $path);
 }
 
 /**
@@ -23,12 +22,10 @@ function widget_engine_entity_form_theme($existing, $type, $theme, $path) {
  *
  * Preprocess to widget entity.
  */
-function widget_engine_preprocess_widget(&$vars) {
-  $view_mode = $vars['elements']['#view_mode'];
-  $callback = '_widget_engine_preprocess_' . $view_mode;
-  if (function_exists($callback)) {
-    $callback($vars);
-  }
+#[LegacyHook]
+function widget_engine_preprocess_widget(&$vars)
+{
+    \Drupal::service(WidgetEngineEntityFormThemeHooks::class)->widgetEnginePreprocessWidget($vars);
 }
 
 /**
diff --git a/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormHooks.php b/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormHooks.php
new file mode 100644
index 0000000..0612a02
--- /dev/null
+++ b/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormHooks.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Drupal\widget_engine_entity_form\Hook;
+
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\entity_browser\Form\WidgetsConfig;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+/**
+ * Hook implementations for widget_engine_entity_form.
+ */
+class WidgetEngineEntityFormHooks
+{
+    use StringTranslationTrait;
+    /**
+     * Implements hook_ajax_render_alter().
+     */
+    #[Hook('ajax_render_alter')]
+    public function ajaxRenderAlter(&$commands)
+    {
+        $selector = '.field--widget-widget-entity-browser-entity-reference';
+        $command = new \Drupal\Core\Ajax\InvokeCommand($selector, 'trigger', [
+            'afterSaveWidget',
+        ]);
+        $commands[] = $command->render();
+    }
+    /**
+     * Implements hook_form_FORM_ID_alter().
+     */
+    #[Hook('form_entity_browser_widgets_config_form_alter')]
+    public function formEntityBrowserWidgetsConfigFormAlter(&$form, \Drupal\Core\Form\FormStateInterface $form_state)
+    {
+        /** @var \Drupal\entity_browser\Form\WidgetsConfig $form_object */
+        $form_object = $form_state->getFormObject();
+        $entity_browser = $form_object->getEntity();
+        $widget_selector = $entity_browser->getWidgetSelector();
+        if ($widget_selector->getPluginId() == 'select_add_tabs') {
+            // Add specific description.
+            $description = $form['widget']['#description'];
+            $widget_note = '<strong>' . $this->t('NOTE: For "Select&Add tabs" widget selector plugin you should observe the following rules:') . '</strong><ul>';
+            $widget_note .= '<li>' . $this->t('At first place you should place "View" widget plugin.') . '</li>';
+            $widget_note .= '<li>' . $this->t('On other places you should locate "Entity form" widget plugin(s).') . '</li>';
+            $widget_note .= '</ul>';
+            $description["#items"][] = [
+                '#markup' => $widget_note,
+            ];
+            $form['widget']['#description'] = $description;
+            // Add validation.
+            $form['actions']['submit']['#validate'][] = 'widget_engine_entity_form_select_add_tabs_validate';
+        }
+    }
+}
diff --git a/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormThemeHooks.php b/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormThemeHooks.php
new file mode 100644
index 0000000..16e3979
--- /dev/null
+++ b/modules/widget_engine_entity_form/src/Hook/WidgetEngineEntityFormThemeHooks.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\widget_engine_entity_form\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+/**
+ * Hook implementations for widget_engine_entity_form.
+ */
+class WidgetEngineEntityFormThemeHooks
+{
+    /**
+     * @file
+     * Preprocess for widget_engine_entity_form module.
+     */
+    /**
+     * Implements hook_theme().
+     */
+    #[Hook('theme')]
+    public function theme($existing, $type, $theme, $path)
+    {
+        $theme = [
+        ];
+        $theme['widget__widget_form'] = [
+            'base hook' => 'widget',
+            'template' => 'widget--widget-form',
+        ];
+        return $theme;
+    }
+    /**
+     * Implements hook_preprocess_HOOK().
+     *
+     * Preprocess to widget entity.
+     */
+    #[Hook('preprocess_widget', module: 'widget_engine')]
+    public function widgetEnginePreprocessWidget(&$vars)
+    {
+        $view_mode = $vars['elements']['#view_mode'];
+        $callback = '_widget_engine_preprocess_' . $view_mode;
+        if (function_exists($callback)) {
+            $callback($vars);
+        }
+    }
+}
diff --git a/modules/widget_engine_entity_form/widget_engine_entity_form.module b/modules/widget_engine_entity_form/widget_engine_entity_form.module
index eca19e2..9c65685 100644
--- a/modules/widget_engine_entity_form/widget_engine_entity_form.module
+++ b/modules/widget_engine_entity_form/widget_engine_entity_form.module
@@ -4,12 +4,12 @@
  * @file
  * Module file for widget_engine_entity_form.info.yml.
  */
-
 /**
  * @defgroup widget_engine_entity_form.info.yml
  * @}
  */
-
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormHooks;
 use Drupal\Core\Ajax\InvokeCommand;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\entity_browser\Form\WidgetsConfig;
@@ -22,34 +22,19 @@ require_once 'includes/widget_engine_entity_form.theme.inc';
 /**
  * Implements hook_ajax_render_alter().
  */
-function widget_engine_entity_form_ajax_render_alter(&$commands) {
-  $selector = '.field--widget-widget-entity-browser-entity-reference';
-  $command = new InvokeCommand($selector, 'trigger', ['afterSaveWidget']);
-  $commands[] = $command->render();
+#[LegacyHook]
+function widget_engine_entity_form_ajax_render_alter(&$commands)
+{
+    \Drupal::service(WidgetEngineEntityFormHooks::class)->ajaxRenderAlter($commands);
 }
 
 /**
  * Implements hook_form_FORM_ID_alter().
  */
-function widget_engine_entity_form_form_entity_browser_widgets_config_form_alter(&$form, FormStateInterface $form_state) {
-  /** @var \Drupal\entity_browser\Form\WidgetsConfig $form_object */
-  $form_object = $form_state->getFormObject();
-  $entity_browser = $form_object->getEntity();
-  $widget_selector = $entity_browser->getWidgetSelector();
-  if ($widget_selector->getPluginId() == 'select_add_tabs') {
-    // Add specific description.
-    $description = $form['widget']['#description'];
-    $widget_note = '<strong>' . t('NOTE: For "Select&Add tabs" widget selector plugin you should observe the following rules:') . '</strong><ul>';
-    $widget_note .= '<li>' . t('At first place you should place "View" widget plugin.') . '</li>';
-    $widget_note .= '<li>' . t('On other places you should locate "Entity form" widget plugin(s).') . '</li>';
-    $widget_note .= '</ul>';
-    $description["#items"][] = [
-      '#markup' => $widget_note,
-    ];
-    $form['widget']['#description'] = $description;
-    // Add validation.
-    $form['actions']['submit']['#validate'][] = 'widget_engine_entity_form_select_add_tabs_validate';
-  }
+#[LegacyHook]
+function widget_engine_entity_form_form_entity_browser_widgets_config_form_alter(&$form, FormStateInterface $form_state)
+{
+    \Drupal::service(WidgetEngineEntityFormHooks::class)->formEntityBrowserWidgetsConfigFormAlter($form, $form_state);
 }
 
 /**
diff --git a/modules/widget_engine_entity_form/widget_engine_entity_form.services.yml b/modules/widget_engine_entity_form/widget_engine_entity_form.services.yml
index 80f165b..3e9f690 100644
--- a/modules/widget_engine_entity_form/widget_engine_entity_form.services.yml
+++ b/modules/widget_engine_entity_form/widget_engine_entity_form.services.yml
@@ -3,3 +3,11 @@ services:
     class: Drupal\widget_engine_entity_form\Routing\RouteSubscriber
     tags:
       - { name: event_subscriber }
+
+  Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormHooks:
+    class: Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormHooks
+    autowire: true
+
+  Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormThemeHooks:
+    class: Drupal\widget_engine_entity_form\Hook\WidgetEngineEntityFormThemeHooks
+    autowire: true
diff --git a/src/Hook/WidgetEngineThemeHooks.php b/src/Hook/WidgetEngineThemeHooks.php
new file mode 100644
index 0000000..332e59f
--- /dev/null
+++ b/src/Hook/WidgetEngineThemeHooks.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Drupal\widget_engine\Hook;
+
+use Drupal\Core\Render\Element;
+use Drupal\Core\Hook\Attribute\Hook;
+/**
+ * Hook implementations for widget_engine.
+ */
+class WidgetEngineThemeHooks
+{
+    /**
+     * Implements hook_theme().
+     */
+    #[Hook('theme')]
+    public function theme($existing, $type, $theme, $path)
+    {
+        $theme = [
+        ];
+        $theme['widget'] = [
+            'render element' => 'elements',
+            'template' => 'widget',
+        ];
+        $theme['widget_content_add_list'] = [
+            'render element' => 'content',
+            'variables' => [
+                'content' => NULL,
+            ],
+        ];
+        $theme['html__widget_engine'] = [
+            'template' => 'html--widget-engine',
+            'render element' => 'html',
+            'preprocess functions' => [
+                'template_preprocess_html',
+            ],
+        ];
+        $theme['page__widget_engine'] = [
+            'template' => 'page--widget-engine',
+            'render element' => 'html',
+            'preprocess functions' => [
+                'template_preprocess_page',
+            ],
+        ];
+        return $theme;
+    }
+    /**
+     * Implements hook_theme_suggestions_HOOK().
+     */
+    #[Hook('theme_suggestions_widget')]
+    public function themeSuggestionsWidget(array $variables)
+    {
+        $suggestions = [
+        ];
+        $entity = $variables['elements']['#widget'];
+        $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
+        $suggestions[] = 'widget__' . $sanitized_view_mode;
+        $suggestions[] = 'widget__' . $entity->bundle();
+        $suggestions[] = 'widget__' . $entity->bundle() . '__' . $sanitized_view_mode;
+        $suggestions[] = 'widget__' . $entity->id();
+        $suggestions[] = 'widget__' . $entity->id() . '__' . $sanitized_view_mode;
+        return $suggestions;
+    }
+}
diff --git a/widget_engine.services.yml b/widget_engine.services.yml
new file mode 100644
index 0000000..719c62f
--- /dev/null
+++ b/widget_engine.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\widget_engine\Hook\WidgetEngineThemeHooks:
+    class: Drupal\widget_engine\Hook\WidgetEngineThemeHooks
+    autowire: true
