diff --git a/src/Hook/ViewsConditionalViewsHooks.php b/src/Hook/ViewsConditionalViewsHooks.php
new file mode 100644
index 0000000..63679ee
--- /dev/null
+++ b/src/Hook/ViewsConditionalViewsHooks.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\views_conditional\Hook;
+
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for views_conditional.
+ */
+class ViewsConditionalViewsHooks {
+  use StringTranslationTrait;
+  /**
+   * @file
+   * Include file for defining views handlers and data.
+   */
+
+  /**
+   * Implements hook_views_data().
+   *
+   * {@inheritdoc}
+   */
+  #[Hook('views_data')]
+  public function viewsData(): array {
+    $data = [];
+    $data['views_conditional']['table']['group'] = $this->t('Views');
+    $data['views_conditional']['table']['join'] = [
+      '#global' => [],
+    ];
+    $data['views_conditional']['views_conditional_field'] = [
+      'title' => $this->t('Views Conditional'),
+      'field' => [
+        'title' => $this->t('Views Conditional'),
+        'help' => $this->t('Output data based off of certain criteria.'),
+        'id' => 'views_conditional_field',
+      ],
+    ];
+    return $data;
+  }
+
+}
diff --git a/tests/src/Kernel/ViewsConditionalEdgeCasesTest.php b/tests/src/Kernel/ViewsConditionalEdgeCasesTest.php
index cebcfdf..4aa6431 100644
--- a/tests/src/Kernel/ViewsConditionalEdgeCasesTest.php
+++ b/tests/src/Kernel/ViewsConditionalEdgeCasesTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\views_conditional\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
 use Drupal\views\Views;
 use Drupal\views\Entity\View;
@@ -15,6 +16,7 @@ use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
  * @group views_conditional
  */
 #[RunTestsInSeparateProcesses]
+#[Group('views_conditional')]
 class ViewsConditionalEdgeCasesTest extends ViewsKernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/ViewsConditionalOperatorsTest.php b/tests/src/Kernel/ViewsConditionalOperatorsTest.php
index 3358569..95e4bea 100644
--- a/tests/src/Kernel/ViewsConditionalOperatorsTest.php
+++ b/tests/src/Kernel/ViewsConditionalOperatorsTest.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\views_conditional\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
 use Drupal\views\Views;
 use Drupal\views\Entity\View;
@@ -15,6 +16,7 @@ use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
  * @group views_conditional
  */
 #[RunTestsInSeparateProcesses]
+#[Group('views_conditional')]
 class ViewsConditionalOperatorsTest extends ViewsKernelTestBase {
 
   /**
diff --git a/tests/src/Kernel/ViewsConditionalReplacementTest.php b/tests/src/Kernel/ViewsConditionalReplacementTest.php
index 28b40dd..b9c52d0 100644
--- a/tests/src/Kernel/ViewsConditionalReplacementTest.php
+++ b/tests/src/Kernel/ViewsConditionalReplacementTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\views_conditional\Kernel;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
@@ -28,6 +30,8 @@ use Drupal\node\Entity\NodeType;
  *
  * @group views_conditional
  */
+#[Group('views_conditional')]
+#[RunTestsInSeparateProcesses]
 class ViewsConditionalReplacementTest extends ViewsKernelTestBase {
 
   /**
diff --git a/tests/src/Unit/ViewsConditionalFieldUnitTest.php b/tests/src/Unit/ViewsConditionalFieldUnitTest.php
index 460e0f3..3c88a9c 100644
--- a/tests/src/Unit/ViewsConditionalFieldUnitTest.php
+++ b/tests/src/Unit/ViewsConditionalFieldUnitTest.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\Tests\views_conditional\Unit;
 
+use PHPUnit\Framework\Attributes\Group;
+use PHPUnit\Framework\Attributes\DataProvider;
 use Drupal\Component\Datetime\TimeInterface;
 use Drupal\Component\Render\MarkupInterface;
 use Drupal\Core\Datetime\DateFormatter;
@@ -16,6 +18,7 @@ use Drupal\views_conditional\Plugin\views\field\ViewsConditionalField;
  *
  * @group views_conditional
  */
+#[Group('views_conditional')]
 class ViewsConditionalFieldUnitTest extends UnitTestCase {
 
   /**
@@ -84,6 +87,7 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
    *
    * @covers ::cleanVar
    */
+  #[DataProvider('providerTestCleanVarWithoutStripTags')]
   public function testCleanVarWithoutStripTags($input, $expected) {
     $this->plugin->options['strip_tags'] = FALSE;
 
@@ -155,6 +159,7 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
    *
    * @covers ::cleanVar
    */
+  #[DataProvider('providerTestCleanVarWithStripTags')]
   public function testCleanVarWithStripTags($input, $expected) {
     $this->plugin->options['strip_tags'] = TRUE;
 
@@ -251,6 +256,7 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
    *
    * @covers ::markup
    */
+  #[DataProvider('providerTestMarkup')]
   public function testMarkup($value, $expectedRendered) {
     // Configure the renderer mock to return the expected value.
     $this->renderer->expects($this->once())
@@ -266,7 +272,6 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
     // Use reflection to access the private markup() method.
     $reflection = new \ReflectionClass($this->plugin);
     $method = $reflection->getMethod('markup');
-    $method->setAccessible(TRUE);
 
     $result = $method->invoke($this->plugin, $value);
     $this->assertEquals($expectedRendered, $result);
@@ -341,7 +346,6 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
     // Use reflection to access the private markup() method.
     $reflection = new \ReflectionClass($this->plugin);
     $method = $reflection->getMethod('markup');
-    $method->setAccessible(TRUE);
 
     $result = $method->invoke($this->plugin, $value);
     $this->assertEquals('rendered: ' . $value, $result);
@@ -432,6 +436,7 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
    *
    * @covers ::markup
    */
+  #[DataProvider('providerTestMarkupUsesMarkupInterface')]
   public function testMarkupUsesMarkupInterface($value) {
     $this->renderer->expects($this->once())
       ->method('render')
@@ -444,7 +449,6 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
 
     $reflection = new \ReflectionClass($this->plugin);
     $method = $reflection->getMethod('markup');
-    $method->setAccessible(TRUE);
 
     $result = $method->invoke($this->plugin, $value);
 
@@ -482,7 +486,6 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
 
     $reflection = new \ReflectionClass($this->plugin);
     $method = $reflection->getMethod('markup');
-    $method->setAccessible(TRUE);
 
     $result = $method->invoke($this->plugin, '');
 
@@ -574,7 +577,6 @@ class ViewsConditionalFieldUnitTest extends UnitTestCase {
   public function testMarkupWithEmptyValues() {
     $reflection = new \ReflectionClass($this->plugin);
     $method = $reflection->getMethod('markup');
-    $method->setAccessible(TRUE);
 
     $this->renderer->expects($this->exactly(3))
       ->method('render')
diff --git a/views_conditional.info.yml b/views_conditional.info.yml
index dc92f03..6b51089 100755
--- a/views_conditional.info.yml
+++ b/views_conditional.info.yml
@@ -4,4 +4,4 @@ description: 'Allows conditional views output.'
 dependencies:
   - drupal:views
 package: Views
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^10.1 || ^11 || ^12
diff --git a/views_conditional.install b/views_conditional.install
index cb14b15..9248dd5 100644
--- a/views_conditional.install
+++ b/views_conditional.install
@@ -46,7 +46,7 @@ function views_conditional_update_8001(&$sandbox): void {
     }
     if ($save) {
       $view->set('display', $displays);
-      $view->save(TRUE);
+      $view->save();
     }
   }
 }
diff --git a/views_conditional.services.yml b/views_conditional.services.yml
new file mode 100644
index 0000000..3ef6a2b
--- /dev/null
+++ b/views_conditional.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\views_conditional\Hook\ViewsConditionalViewsHooks:
+    class: Drupal\views_conditional\Hook\ViewsConditionalViewsHooks
+    autowire: true
diff --git a/views_conditional.views.inc b/views_conditional.views.inc
index 2ac1a59..e456b01 100755
--- a/views_conditional.views.inc
+++ b/views_conditional.views.inc
@@ -1,5 +1,12 @@
 <?php
 
+/**
+ * @file
+ */
+
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\views_conditional\Hook\ViewsConditionalViewsHooks;
+
 /**
  * @file
  * Include file for defining views handlers and data.
@@ -10,21 +17,7 @@
  *
  * {@inheritdoc}
  */
+#[LegacyHook]
 function views_conditional_views_data(): array {
-  $data = [];
-  $data['views_conditional']['table']['group'] = t('Views');
-  $data['views_conditional']['table']['join'] = [
-    '#global' => [],
-  ];
-
-  $data['views_conditional']['views_conditional_field'] = [
-    'title' => t('Views Conditional'),
-    'field' => [
-      'title' => t('Views Conditional'),
-      'help' => t('Output data based off of certain criteria.'),
-      'id' => 'views_conditional_field',
-    ],
-  ];
-
-  return $data;
+  return \Drupal::service(ViewsConditionalViewsHooks::class)->viewsData();
 }
