diff --git a/override_node_options.module b/override_node_options.module
index 672c961..f144832 100644
--- a/override_node_options.module
+++ b/override_node_options.module
@@ -5,106 +5,36 @@
  * Main module file for override_node_options.
  */
 
-use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\node\NodeForm;
+use Drupal\override_node_options\Access\FieldAccess\GrantAuthoredByAccess;
+use Drupal\override_node_options\Access\FieldAccess\GrantCreatedAccess;
+use Drupal\override_node_options\Access\FieldAccess\GrantPromoteAccess;
+use Drupal\override_node_options\Access\FieldAccess\GrantPublishedStatusAccess;
+use Drupal\override_node_options\Access\FieldAccess\GrantRevisionLogAccess;
+use Drupal\override_node_options\Access\FieldAccess\GrantStickyAccess;
+use Drupal\override_node_options\Access\FormAccess\GrantRevisionAccess;
 
 /**
  * Implements hook_form_alter().
  */
 function override_node_options_form_alter(array &$form, FormStateInterface $form_state) {
-  $form_object = $form_state->getFormObject();
-
-  if ($form_object instanceof NodeForm) {
-    /** @var Drupal\Core\Session\AccountProxyInterface $user */
-    $user = \Drupal::currentUser();
-
-    if ($user->hasPermission('administer nodes')) {
-      return;
-    }
-
-    $node_type = $form_object->getEntity()->bundle();
-
-    $form['revision']['#access'] = $user->hasPermission("override $node_type revision option")
-      || $user->hasPermission('override all revision option');
-  }
+  GrantRevisionAccess::access($form, $form_state);
 }
 
 /**
  * Implements hook_entity_field_access_alter().
  */
 function override_node_options_entity_field_access_alter(array &$grants, array $context) {
-  $entity_type = $context['field_definition']->getTargetEntityTypeId();
-
-  if ($entity_type == 'node' && $context['operation'] == 'edit' && !$context['account']->hasPermission('administer nodes')) {
-    $bundle = $context['items']->getEntity()->bundle();
-
-    switch ($context['field_definition']->getName()) {
-      case 'promote':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "override $bundle promote to front page option",
-            'override all promote to front page option',
-          ],
-          'OR'
-        );
-        break;
-
-      case 'sticky':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "override $bundle sticky option",
-            'override all sticky option',
-          ],
-          'OR'
-        );
-        break;
-
-      case 'revision_log':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "enter $bundle revision log entry",
-            'enter all revision log entry',
-          ],
-          'OR'
-        );
-        break;
-
-      case 'created':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "override $bundle authored on option",
-            'override all authored on option',
-          ],
-          'OR'
-        );
-        break;
-
-      case 'uid':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "override $bundle authored by option",
-            'override all authored by option',
-          ],
-          'OR'
-        );
-        break;
-
-      case 'status':
-        $grants[':default'] = AccessResult::allowedIfHasPermissions(
-          $context['account'],
-          [
-            "override $bundle published option",
-            'override all published option',
-          ],
-          'OR'
-        );
-        break;
-    }
+  $fieldAccessOverrides = [
+    GrantAuthoredByAccess::class,
+    GrantCreatedAccess::class,
+    GrantPromoteAccess::class,
+    GrantPublishedStatusAccess::class
+    GrantRevisionLogAccess::class,
+    GrantStickyAccess::class,
+  ];
+
+  foreach ($fieldAccessOverrides as $override) {
+    $override::access($grants, $context);
   }
 }
diff --git a/src/Access/FieldAccess/AbstractFieldAccessOverride.php b/src/Access/FieldAccess/AbstractFieldAccessOverride.php
new file mode 100644
index 0000000..96bbee4
--- /dev/null
+++ b/src/Access/FieldAccess/AbstractFieldAccessOverride.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+abstract class AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  /** @var array */
+  protected static $context;
+
+  protected static function hasNodeEditPermission() {
+    $entityType = self::$context['field_definition']->getTargetEntityTypeId();
+
+    return $entityType == 'node'
+      && self::$context['operation'] == 'edit'
+      && !self::$context['account']->hasPermission('administer nodes');
+  }
+
+  protected static function isFieldName($fieldName){
+    return self::$context['field_definition']->getName() == $fieldName;
+  }
+
+}
diff --git a/src/Access/FieldAccess/FieldAccessOverride.php b/src/Access/FieldAccess/FieldAccessOverride.php
new file mode 100644
index 0000000..d062cfa
--- /dev/null
+++ b/src/Access/FieldAccess/FieldAccessOverride.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+interface FieldAccessOverride
+{
+  public static function access(array &$grants, array $context);
+}
diff --git a/src/Access/FieldAccess/GrantAuthoredByAccess.php b/src/Access/FieldAccess/GrantAuthoredByAccess.php
new file mode 100644
index 0000000..79ea200
--- /dev/null
+++ b/src/Access/FieldAccess/GrantAuthoredByAccess.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+class GrantAuthoredByAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('uid')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "override $bundle authored by option",
+          'override all authored by option',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FieldAccess/GrantCreatedAccess.php b/src/Access/FieldAccess/GrantCreatedAccess.php
new file mode 100644
index 0000000..e7b0f7c
--- /dev/null
+++ b/src/Access/FieldAccess/GrantCreatedAccess.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+/**
+ * Grant access to the "created" option.
+ */
+class GrantCreatedAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('created')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "override $bundle authored on option",
+          'override all authored on option',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FieldAccess/GrantPromoteAccess.php b/src/Access/FieldAccess/GrantPromoteAccess.php
new file mode 100644
index 0000000..d5be34b
--- /dev/null
+++ b/src/Access/FieldAccess/GrantPromoteAccess.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+class GrantPromoteAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('promote')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "override $bundle promote to front page option",
+          'override all promote to front page option',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FieldAccess/GrantPublishedStatusAccess.php b/src/Access/FieldAccess/GrantPublishedStatusAccess.php
new file mode 100644
index 0000000..a9e667a
--- /dev/null
+++ b/src/Access/FieldAccess/GrantPublishedStatusAccess.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+class GrantPublishedStatusAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('status')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "override $bundle published option",
+          'override all published option',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FieldAccess/GrantRevisionLogAccess.php b/src/Access/FieldAccess/GrantRevisionLogAccess.php
new file mode 100644
index 0000000..116a83d
--- /dev/null
+++ b/src/Access/FieldAccess/GrantRevisionLogAccess.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+class GrantRevisionLogAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('revision_log')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "enter $bundle revision log entry",
+          'enter all revision log entry',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FieldAccess/GrantStickyAccess.php b/src/Access/FieldAccess/GrantStickyAccess.php
new file mode 100644
index 0000000..e7b9fc4
--- /dev/null
+++ b/src/Access/FieldAccess/GrantStickyAccess.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FieldAccess;
+
+use Drupal\Core\Access\AccessResult;
+
+class GrantStickyAccess extends AbstractFieldAccessOverride implements FieldAccessOverride {
+
+  public static function access(array &$grants, array $context) {
+    self::$context = $context;
+
+    if (self::hasNodeEditPermission() && self::isFieldName('sticky')) {
+      $bundle = $context['items']->getEntity()->bundle();
+      $grants[':default'] = AccessResult::allowedIfHasPermissions(
+        $context['account'],
+        [
+          "override $bundle sticky option",
+          'override all sticky option',
+        ],
+        'OR'
+      );
+    }
+  }
+
+}
diff --git a/src/Access/FormAccess/FormAccessOverride.php b/src/Access/FormAccess/FormAccessOverride.php
new file mode 100644
index 0000000..24a71b1
--- /dev/null
+++ b/src/Access/FormAccess/FormAccessOverride.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FormAccess;
+
+use Drupal\Core\Form\FormStateInterface;
+
+interface FormAccessOverride {
+
+  public static function access(array &$form, FormStateInterface $form_state);
+
+}
diff --git a/src/Access/FormAccess/GrantRevisionAccess.php b/src/Access/FormAccess/GrantRevisionAccess.php
new file mode 100644
index 0000000..f0c6724
--- /dev/null
+++ b/src/Access/FormAccess/GrantRevisionAccess.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Drupal\override_node_options\Access\FormAccess;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Session\AccountProxyInterface;
+use Drupal\node\NodeForm;
+
+class GrantRevisionAccess implements FormAccessOverride {
+
+  public static function access(array &$form, FormStateInterface $form_state) {
+    $form_object = $form_state->getFormObject();
+
+    if ($form_object instanceof NodeForm) {
+      /** @var AccountProxyInterface $user */
+      $user = \Drupal::currentUser();
+
+      if ($user->hasPermission('administer nodes')) {
+        return;
+      }
+
+      $node_type = $form_object->getEntity()->bundle();
+
+      $form['revision']['#access'] = $user->hasPermission("override $node_type revision option")
+        || $user->hasPermission('override all revision option');
+    }
+  }
+
+}
