diff --git a/config/install/content_lock.settings.yml b/config/install/content_lock.settings.yml
index f4f5e36..fb9b751 100644
--- a/config/install/content_lock.settings.yml
+++ b/config/install/content_lock.settings.yml
@@ -1,3 +1,4 @@
 verbose: 1
 types: {}
 types_translation_lock: {}
+form_op_lock: {}
diff --git a/config/schema/content_lock.schema.yml b/config/schema/content_lock.schema.yml
index 8fb1782..e6fdc9d 100644
--- a/config/schema/content_lock.schema.yml
+++ b/config/schema/content_lock.schema.yml
@@ -16,3 +16,18 @@ content_lock.settings:
     types_translation_lock:
       type: sequence
       label: 'Entity types with translation lock on'
+    form_op_lock:
+      type: sequence
+      label: 'Entity types'
+      sequence:
+        type: mapping
+        mapping:
+          mode:
+            type: integer
+            label: 'Disabled / blacklist / whitelist mode per entity type'
+          values:
+            type: sequence
+            label: 'Whitelisted / blacklisted form operations per entity type'
+            sequence:
+              type: string
+              label: 'form operation'
diff --git a/content_lock.install b/content_lock.install
index 1eb4dfd..efafb4e 100644
--- a/content_lock.install
+++ b/content_lock.install
@@ -5,6 +5,7 @@
  * Create content_lock table.
  */
 
+use Drupal\Core\Database\Database;
 use Drupal\Core\Language\LanguageInterface;
 
 /**
@@ -29,6 +30,13 @@ function content_lock_schema() {
         'not null' => TRUE,
         'default' => 'node',
       ],
+      'form_op' => [
+        'description' => 'The entity form operation.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '*',
+      ],
       'langcode' => [
         'description' => 'The language code of the entity.',
         'type' => 'varchar_ascii',
@@ -66,3 +74,32 @@ function content_lock_schema() {
 
   return $schema;
 }
+
+/**
+ * Add new schema for form op and translation locks.
+ */
+function content_lock_update_8001() {
+  $schema = Database::getConnection()->schema();
+  $table_name = 'content_lock';
+  $new_columns = [
+    'form_op' => [
+      'description' => 'The entity form operation.',
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '*',
+    ],
+    'langcode' => [
+      'description' => 'The language code of the entity.',
+      'type' => 'varchar_ascii',
+      'length' => 12,
+      'not null' => TRUE,
+      'default' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+    ],
+  ];
+  foreach ($new_columns as $column_name => $spec) {
+    if (!$schema->fieldExists($table_name, $column_name)) {
+      $schema->addField($table_name, $column_name, $spec);
+    }
+  }
+}
diff --git a/content_lock.module b/content_lock.module
index 2a92c21..92b4a58 100644
--- a/content_lock.module
+++ b/content_lock.module
@@ -5,15 +5,16 @@
  * Content lock - Main functions of the module.
  */
 
+use Drupal\Core\Entity\ContentEntityTypeInterface;
+use Drupal\Core\Entity\EntityFormInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Routing\LocalRedirectResponse;
 use Drupal\Core\Routing\RouteMatchInterface;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Entity\EntityInterface;
-use Drupal\user\Entity\User;
 use Drupal\Core\Url;
-use Drupal\Core\Routing\LocalRedirectResponse;
-use Drupal\Core\Entity\EntityFormInterface;
-use Drupal\Core\Entity\ContentEntityTypeInterface;
+use Drupal\user\Entity\User;
 
 /**
  * Implements hook_help().
@@ -73,7 +74,8 @@ function content_lock_form_alter(&$form, FormStateInterface $form_state, $form_i
   // Check if we must lock this entity.
   /** @var \Drupal\content_lock\ContentLock\ContentLock $lock_service */
   $lock_service = \Drupal::service('content_lock');
-  if (!$lock_service->isLockable($entity)) {
+  $form_op = $form_state->getFormObject()->getOperation();
+  if (!$lock_service->isLockable($entity, $form_op)) {
     return;
   }
 
@@ -83,7 +85,7 @@ function content_lock_form_alter(&$form, FormStateInterface $form_state, $form_i
     $form['actions']['publish']['#submit'][] = 'content_lock_form_submit';
 
     // We lock the content if it is currently edited by another user.
-    if (!$lock_service->locking($entity->id(), $entity->language()->getId(), $user->id(), $entity_type)) {
+    if (!$lock_service->locking($entity->id(), $entity->language()->getId(), $form_op, $user->id(), $entity_type)) {
       $form['#disabled'] = TRUE;
 
       // Do not allow deletion, publishing, or unpublishing if locked.
@@ -106,7 +108,7 @@ function content_lock_form_alter(&$form, FormStateInterface $form_state, $form_i
     else {
       // ContentLock::locking() returns TRUE if the content is locked by the
       // current user. Add an unlock button only for this user.
-      $form['actions']['unlock'] = $lock_service->unlockButton($entity_type, $entity->id(), $entity->language()->getId(), \Drupal::request()->query->get('destination'));
+      $form['actions']['unlock'] = $lock_service->unlockButton($entity_type, $entity->id(), $entity->language()->getId(), $form_op, \Drupal::request()->query->get('destination'));
     }
   }
 }
@@ -124,7 +126,7 @@ function content_lock_form_submit($form, FormStateInterface $form_state) {
   $entity = $form_state->getFormObject()->getEntity();
 
   // If the user submitting owns the lock, release it.
-  $lock_service->release($entity->id(), $entity->language()->getId(), $user->id(), $entity->getEntityTypeId());
+  $lock_service->release($entity->id(), $entity->language()->getId(), $form_state->getFormObject()->getOperation(), $user->id(), $entity->getEntityTypeId());
 
   // We need to redirect to the taxonomy term page after saving it. If not, we
   // stay on the taxonomy term edit form and we relock the term.
@@ -152,7 +154,7 @@ function content_lock_entity_predelete(EntityInterface $entity) {
     return;
   }
 
-  $data = $lock_service->fetchLock($entity_id, $entity->language()->getId(), $entity_type);
+  $data = $lock_service->fetchLock($entity_id, NULL, $entity->language()->getId(), $entity_type);
 
   if ($data !== FALSE) {
     $current_user = \Drupal::currentUser();
@@ -288,7 +290,7 @@ function content_lock_entity_operation(EntityInterface $entity) {
   $lock_service = \Drupal::service('content_lock');
   if ($lock_service->isLockable($entity)) {
 
-    $lock = $lock_service->fetchLock($entity->id(), $entity->getEntityTypeId());
+    $lock = $lock_service->fetchLock($entity->id(), NULL, $entity->getEntityTypeId());
 
     $user = \Drupal::currentUser();
     if ($lock && $user->hasPermission('break content lock')) {
@@ -296,6 +298,7 @@ function content_lock_entity_operation(EntityInterface $entity) {
       $route_parameters = [
         'entity' => $entity->id(),
         'langcode' => $lock_service->isTranslationLockEnabled($entity_type) ? $entity->language()->getId() : LanguageInterface::LANGCODE_NOT_SPECIFIED,
+        'form_op' => '*'
       ];
       $url = 'content_lock.break_lock.' . $entity->getEntityTypeId();
       $operations['break_lock'] = [
@@ -308,3 +311,72 @@ function content_lock_entity_operation(EntityInterface $entity) {
 
   return $operations;
 }
+
+/**
+ * Implements hook_theme().
+ */
+function content_lock_theme() {
+  return [
+    'content_lock_settings_entities' => array(
+      'render element' => 'element',
+    ),
+  ];
+}
+
+/**
+ * Prepares variables for content lock entity settings templates.
+ *
+ * Default template: content-lock-settings-entities.html.twig.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties of the element.
+ *     Properties used: #title.
+ */
+function template_preprocess_content_lock_settings_entities(&$variables) {
+  $element = $variables['element'];
+
+  $header = [
+    [
+      'data' => $element['bundles']['#title'],
+      'class' => ['bundle'],
+    ],
+    [
+      'data' => t('Configuration'),
+      'class' => ['operations'],
+    ],
+  ];
+
+  $rows = [];
+  foreach (Element::children($element['bundles']) as $bundle) {
+    $rows[$bundle] = [
+      'data' => [
+        [
+          'data' => $element['bundles'][$bundle],
+          'class' => ['bundle'],
+        ],
+      ],
+      'class' => [],
+    ];
+    if ($bundle == '*') {
+      $rows[$bundle]['data'][] = [
+        'data' => $element['settings'],
+        'class' => ['operations'],
+      ];
+    }
+    else {
+      $rows[$bundle]['data'][] = [
+        'data' => t('Uses "all" settings'),
+        'class' => ['operations'],
+      ];
+      $rows[$bundle]['class'][] = 'bundle-settings';
+    }
+  }
+
+  $variables['title'] = $element['#title'];
+  $variables['build'] = [
+    '#header' => $header,
+    '#rows' => $rows,
+    '#type' => 'table',
+  ];
+}
diff --git a/js/content_lock_settings.js b/js/content_lock_settings.js
index 876e23e..5e64f25 100644
--- a/js/content_lock_settings.js
+++ b/js/content_lock_settings.js
@@ -17,17 +17,24 @@
    */
   Drupal.behaviors.contentLockSettings = {
     attach: function (context, settings) {
-      $('.content-lock-entity-settings [value="*"]', context)
+      $('.content-lock-entity-settings[value="*"]', context)
         .once('content-lock-settings')
         // Init
-        .each(Drupal.behaviors.contentLockSettings.toogleBundles)
+        .each(Drupal.behaviors.contentLockSettings.toggleBundles)
         // Change
-        .change(Drupal.behaviors.contentLockSettings.toogleBundles);
+        .change(Drupal.behaviors.contentLockSettings.toggleBundles);
+
+      $('.content-lock-entity-types input', context)
+        .once('content-lock-settings')
+        .change(Drupal.behaviors.contentLockSettings.toggleEntityType);
     },
 
-    toogleBundles: function () {
+    /**
+     * Toggle the bundle rows if all option is changed.
+     */
+    toggleBundles: function () {
       var all_bundles_selected = this.checked;
-      $(this).parent('.form-type-checkbox').siblings().each(function () {
+      $(this).closest('tbody').find('.bundle-settings').each(function () {
         // If the "All bundles" checkbox is checked then uncheck and disable
         // all other options.
         var $checkbox = $('[type="checkbox"]', this);
@@ -45,6 +52,22 @@
           $(this).show();
         }
       });
+    },
+
+    /**
+     * Remove all selected bundles or auto select all when changing an entity type.
+     */
+    toggleEntityType: function () {
+      var entity_type_id = $(this).val();
+      if (this.checked) {
+        $('.' + entity_type_id + ' .content-lock-entity-settings[value="*"]')
+          .prop('checked', true)
+          .trigger('change');
+      }
+      else {
+        $('.' + entity_type_id + ' .content-lock-entity-settings')
+          .prop('checked', false);
+      }
     }
   };
 
diff --git a/modules/content_lock_timeout/content_lock_timeout.module b/modules/content_lock_timeout/content_lock_timeout.module
index 6503f18..d6354e7 100644
--- a/modules/content_lock_timeout/content_lock_timeout.module
+++ b/modules/content_lock_timeout/content_lock_timeout.module
@@ -33,7 +33,7 @@ function content_lock_timeout_cron() {
     ->condition('c.timestamp', $last_valid_time, '<');
   $count = 0;
   foreach ($query->execute() as $obj) {
-    $lock_service->release($obj->entity_id, $obj->langcode, $obj->uid, $obj->entity_type);
+    $lock_service->release($obj->entity_id, $obj->langcode, $obj->form_op, $obj->uid, $obj->entity_type);
     $count++;
   }
 
@@ -82,7 +82,7 @@ function content_lock_timeout_entity_prepare_form(EntityInterface $entity, $oper
       && $user->hasPermission('break content lock')
       && ($user->id() > 0)
     ) {
-      $lock_service->release($entity->id(), $entity->language()->getId(), $lock->uid, $entity->getEntityTypeId());
+      $lock_service->release($entity->id(), $entity->language()->getId(), $operation, $lock->uid, $entity->getEntityTypeId());
 
       if ($lock_service->verbose()) {
         $username = User::load($lock->uid)->getDisplayName();
diff --git a/src/ContentLock/ContentLock.php b/src/ContentLock/ContentLock.php
index 1d72265..42cbd1c 100644
--- a/src/ContentLock/ContentLock.php
+++ b/src/ContentLock/ContentLock.php
@@ -27,6 +27,21 @@ class ContentLock extends ServiceProviderBase {
   use StringTranslationTrait;
 
   /**
+   * Form operation mode disabled.
+   */
+  const FORM_OP_MODE_DISABLED = 0;
+
+  /**
+   * Form operation mode whitelist.
+   */
+  const FORM_OP_MODE_WHITELIST = 1;
+
+  /**
+   * Form operation mode blacklist.
+   */
+  const FORM_OP_MODE_BLACKLIST = 2;
+
+  /**
    * The database service.
    *
    * @var \Drupal\Core\Database\Connection
@@ -181,16 +196,21 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language code of the entity.
+   * @param string $form_op
+   *   (optional) The entity form operation.
    * @param string $entity_type
    *   The entity type.
    *
    * @return object
    *   The lock for the node. FALSE, if the document is not locked.
    */
-  public function fetchLock($entity_id, $langcode, $entity_type = 'node') {
+  public function fetchLock($entity_id, $langcode, $form_op = NULL, $entity_type = 'node') {
     if (!$this->isTranslationLockEnabled($entity_type)) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
     $query = $this->database->select('content_lock', 'c');
     $query->leftJoin('users_field_data', 'u', '%alias.uid = c.uid');
     $query->fields('c')
@@ -198,6 +218,9 @@ class ContentLock extends ServiceProviderBase {
       ->condition('c.entity_type', $entity_type)
       ->condition('c.entity_id', $entity_id)
       ->condition('c.langcode', $langcode);
+    if (isset($form_op)) {
+      $query->condition('c.form_op', $form_op);
+    }
 
     return $query->execute()->fetchObject();
   }
@@ -239,6 +262,8 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language code of the entity.
+   * @param string $form_op
+   *   The entity form operation.
    * @param int $uid
    *   The user id.
    * @param string $entity_type
@@ -247,17 +272,21 @@ class ContentLock extends ServiceProviderBase {
    * @return bool
    *   Return TRUE OR FALSE.
    */
-  public function isLockedBy($entity_id, $langcode, $uid, $entity_type = 'node') {
+  public function isLockedBy($entity_id, $langcode, $form_op, $uid, $entity_type = 'node') {
     if (!$this->isTranslationLockEnabled($entity_type)) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
     /** @var \Drupal\Core\Database\Query\SelectInterface $query */
     $query = $this->database->select('content_lock', 'c')
       ->fields('c')
       ->condition('entity_id', $entity_id)
       ->condition('uid', $uid)
       ->condition('entity_type', $entity_type)
-      ->condition('langcode', $langcode);;
+      ->condition('langcode', $langcode)
+      ->condition('form_op', $form_op);
     $num_rows = $query->countQuery()->execute()->fetchField();
     return (bool) $num_rows;
   }
@@ -269,21 +298,26 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language code of the entity.
+   * @param string $form_op
+   *   (optional) The entity form operation.
    * @param int $uid
    *   If set, verify that a lock belongs to this user prior to release.
    * @param string $entity_type
    *   The entity type.
    */
-  public function release($entity_id, $langcode, $uid = NULL, $entity_type = 'node') {
+  public function release($entity_id, $langcode, $form_op = NULL, $uid = NULL, $entity_type = 'node') {
     if (!$this->isTranslationLockEnabled($entity_type)) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
     // Delete locking item from database.
-    $this->lockingDelete($entity_id, $langcode, $uid, $entity_type);
+    $this->lockingDelete($entity_id, $langcode, $form_op, $uid, $entity_type);
 
     $this->moduleHandler->invokeAll(
       'content_lock_release',
-      [$entity_id, $langcode, $entity_type]
+      [$entity_id, $langcode, $form_op, $entity_type]
     );
   }
 
@@ -351,6 +385,8 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language of the entity.
+   * @param string $form_op
+   *   The entity form operation.
    * @param int $uid
    *   The user uid.
    * @param string $entity_type
@@ -359,20 +395,25 @@ class ContentLock extends ServiceProviderBase {
    * @return bool
    *   The result of the merge query.
    */
-  protected function lockingSave($entity_id, $langcode, $uid, $entity_type = 'node') {
+  protected function lockingSave($entity_id, $langcode, $form_op, $uid, $entity_type = 'node') {
     if (!$this->isTranslationLockEnabled($entity_type)) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
     $result = $this->database->merge('content_lock')
       ->key([
         'entity_id' => $entity_id,
         'entity_type' => $entity_type,
         'langcode' => $langcode,
+        'form_op' => $form_op,
       ])
       ->fields([
         'entity_id' => $entity_id,
         'entity_type' => $entity_type,
         'langcode' => $langcode,
+        'form_op' => $form_op,
         'uid' => $uid,
         'timestamp' => REQUEST_TIME,
       ])
@@ -388,6 +429,8 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language of the entity.
+   * @param string $form_op
+   *   (optional) The entity form operation.
    * @param int $uid
    *   The user uid.
    * @param string $entity_type
@@ -396,14 +439,20 @@ class ContentLock extends ServiceProviderBase {
    * @return bool
    *   The result of the delete query.
    */
-  protected function lockingDelete($entity_id, $langcode, $uid, $entity_type = 'node') {
+  protected function lockingDelete($entity_id, $langcode, $form_op = NULL, $uid, $entity_type = 'node') {
     if (!$this->isTranslationLockEnabled($entity_type)) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
     $query = $this->database->delete('content_lock')
       ->condition('entity_type', $entity_type)
       ->condition('entity_id', $entity_id)
       ->condition('langcode', $langcode);
+    if (isset($form_op)) {
+     $query->condition('form_op', $form_op);
+    }
     if (!empty($uid)) {
       $query->condition('uid', $uid);
     }
@@ -430,6 +479,8 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id.
    * @param string $langcode
    *   The translation language of the entity.
+   * @param string $form_op
+   *   The entity form operation.
    * @param int $uid
    *   The user id to lock the node for.
    * @param string $entity_type
@@ -439,20 +490,26 @@ class ContentLock extends ServiceProviderBase {
    *
    * @return bool
    *   FALSE, if a document has already been locked by someone else.
+   *
+   * @throws \InvalidArgumentException
+   *   An exception will be thrown if the
    */
-  public function locking($entity_id, $langcode, $uid, $entity_type = 'node', $quiet = FALSE) {
+  public function locking($entity_id, $langcode, $form_op, $uid, $entity_type = 'node', $quiet = FALSE) {
     $translation_lock = $this->isTranslationLockEnabled($entity_type);
     if (!$translation_lock) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
+    if (!$this->isFormOperationLockEnabled($entity_type)) {
+      $form_op = '*';
+    }
 
     // Check locking status.
-    $lock = $this->fetchLock($entity_id, $langcode, $entity_type);
+    $lock = $this->fetchLock($entity_id, $langcode, $form_op, $entity_type);
 
     // No lock yet.
     if ($lock === FALSE || !is_object($lock)) {
       // Save locking into database.
-      $this->lockingSave($entity_id, $langcode, $uid, $entity_type);
+      $this->lockingSave($entity_id, $langcode, $form_op, $uid, $entity_type);
 
       if ($this->verbose() && !$quiet) {
         if ($translation_lock) {
@@ -466,8 +523,9 @@ class ContentLock extends ServiceProviderBase {
       $this->moduleHandler->invokeAll('content_lock_locked', [
         $entity_id,
         $langcode,
+        $form_op,
         $uid,
-        $entity_type,
+        $entity_type
       ]);
 
       // Send success flag.
@@ -486,7 +544,11 @@ class ContentLock extends ServiceProviderBase {
           $link = Link::createFromRoute(
             $this->t('Break lock'),
             'content_lock.break_lock.' . $entity_type,
-            ['entity' => $entity_id, 'langcode' => $langcode],
+            [
+              'entity' => $entity_id,
+              'langcode' => $langcode,
+              'form_op' => $form_op,
+            ],
             ['query' => ['destination' => $this->currentRequest->getRequestUri()]]
           )->toString();
 
@@ -499,7 +561,7 @@ class ContentLock extends ServiceProviderBase {
       }
       else {
         // Save locking into database.
-        $this->lockingSave($entity_id, $langcode, $uid, $entity_type);
+        $this->lockingSave($entity_id, $langcode, $form_op, $uid, $entity_type);
 
         // Locked by current user.
         if ($this->verbose() && !$quiet) {
@@ -522,11 +584,13 @@ class ContentLock extends ServiceProviderBase {
    *
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity to check.
+   * @param string $form_op
+   *   (optional) The entity form operation.
    *
    * @return bool
    *   TRUE is entity is lockable
    */
-  public function isLockable(EntityInterface $entity) {
+  public function isLockable(EntityInterface $entity, $form_op = NULL) {
     $entity_id = $entity->id();
     $entity_type = $entity->getEntityTypeId();
     $bundle = $entity->bundle();
@@ -537,12 +601,26 @@ class ContentLock extends ServiceProviderBase {
       $entity,
       $entity_id,
       $entity->language()->getId(),
+      $form_op,
       $entity_type,
       $bundle,
       $config,
     ]);
 
     if (is_array($config) && (in_array($bundle, $config) || in_array('*', $config))) {
+      if (isset($form_op) && $this->isFormOperationLockEnabled($entity_type)) {
+        $mode = $this->configFactory->get('content_lock.settings')
+          ->get("form_op_lock.$entity_type.mode");
+        $values = $this->configFactory->get('content_lock.settings')
+          ->get("form_op_lock.$entity_type.values");
+
+        if ($mode == self::FORM_OP_MODE_BLACKLIST) {
+          return !in_array($form_op, $values);
+        }
+        elseif ($mode == self::FORM_OP_MODE_WHITELIST) {
+          return in_array($form_op, $values);
+        }
+      }
       return TRUE;
     }
 
@@ -559,13 +637,15 @@ class ContentLock extends ServiceProviderBase {
    *   The entity id of the content.
    * @param string $langcode
    *   The translation language code of the entity.
+   * @param string $form_op
+   *   The entity form operation.
    * @param string $destination
    *   The destination query parameter to build the link with.
    *
    * @return array
    *   The link form element.
    */
-  public function unlockButton($entity_type, $entity_id, $langcode, $destination) {
+  public function unlockButton($entity_type, $entity_id, $langcode, $form_op, $destination) {
     $unlock_url_options = [];
     if ($destination) {
       $unlock_url_options['query'] = ['destination' => $destination];
@@ -573,6 +653,7 @@ class ContentLock extends ServiceProviderBase {
     $route_parameters = [
       'entity' => $entity_id,
       'langcode' => $this->isTranslationLockEnabled($entity_type) ? $langcode : LanguageInterface::LANGCODE_NOT_SPECIFIED,
+      'form_op' => $this->isFormOperationLockEnabled($entity_type) ? $form_op : '*',
     ];
     return [
       '#type' => 'link',
@@ -600,4 +681,18 @@ class ContentLock extends ServiceProviderBase {
     return $this->moduleHandler->moduleExists('conflict') && in_array($entity_type_id, $this->configFactory->get('content_lock.settings')->get("types_translation_lock"));
   }
 
+  /**
+   * Checks whether the entity type is lockable on translation level.
+   *
+   * @param $entity_type_id
+   *   The entity type ID.
+   *
+   * @return bool
+   *   TRUE if the entity type should be locked on translation level, FALSE if
+   *   it should be locked on entity level.
+   */
+  public function isFormOperationLockEnabled($entity_type_id) {
+    return $this->configFactory->get('content_lock.settings')->get("form_op_lock.$entity_type_id.mode") != self::FORM_OP_MODE_DISABLED;
+  }
+
 }
diff --git a/src/Form/ContentLockSettingsForm.php b/src/Form/ContentLockSettingsForm.php
index 3047c70..5ee1387 100644
--- a/src/Form/ContentLockSettingsForm.php
+++ b/src/Form/ContentLockSettingsForm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\content_lock\Form;
 
+use Drupal\content_lock\ContentLock\ContentLock;
 use Drupal\Core\Entity\ContentEntityTypeInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\ConfigFormBase;
@@ -101,10 +102,44 @@ class ContentLockSettingsForm extends ConfigFormBase {
     ];
 
     $definitions = $this->entityTypeManager->getDefinitions();
+    $entity_types = [];
+    $selected_entity_types = [];
     foreach ($definitions as $definition) {
       if ($definition instanceof ContentEntityTypeInterface) {
+        $entity_types[$definition->id()] = $definition->getLabel();
+        if (!empty($config->get('types.' . $definition->id()))) {
+          $selected_entity_types[] = $definition->id();
+        }
+      }
+    }
+    $form['entities']['entity_types'] = [
+      '#type' => 'checkboxes',
+      '#title' => 'Protected entity types',
+      '#options' => $entity_types,
+      '#default_value' => $selected_entity_types,
+      '#attributes' => [
+        'class' => ['content-lock-entity-types']
+      ],
+    ];
+
+    foreach ($definitions as $definition) {
+      if ($definition instanceof ContentEntityTypeInterface) {
+        $form['entities'][$definition->id()] = [
+          '#type' => 'container',
+          '#title' => $definition->getLabel(),
+          '#theme' => 'content_lock_settings_entities',
+          '#states' => [
+            'visible' => [
+              ':input[name="entity_types[' . $definition->id() . ']"]' => ['checked' => TRUE],
+            ],
+          ],
+          '#attributes' => [
+            'class' => [$definition->id()],
+          ],
+        ];
+
         $options = [
-          '*' => $this->t('All bundles'),
+          '*' => $this->t('All'),
         ];
 
         if ($definition->getBundleEntityType()) {
@@ -119,24 +154,23 @@ class ContentLockSettingsForm extends ConfigFormBase {
         else {
           $options[$definition->id()] = $definition->getLabel();
         }
-
         $form['entities'][$definition->id()]['bundles'] = [
           '#type' => 'checkboxes',
-          '#title' => $definition->getLabel(),
+          '#title' => $definition->getBundleLabel() ?: $definition->getLabel(),
           '#description' => $this->t('Select the bundles on which enable content lock'),
           '#options' => $options,
           '#default_value' => $config->get('types.' . $definition->id()) ?: [],
           '#attributes' => ['class' => ['content-lock-entity-settings']],
         ];
 
-        $form['entities'][$definition->id()]['translation_lock'] = [
+        $form['entities'][$definition->id()]['settings']['translation_lock'] = [
           '#type' => 'checkbox',
           '#title' => $this->t('Lock only on entity translation level.'),
           '#default_value' => in_array($definition->id(), $config->get('types_translation_lock')),
           '#description' => $this->t('Activating this options allows users to edit multiple translations concurrently'),
         ];
         if (!$this->moduleHandler->moduleExists('conflict')) {
-          $form['entities'][$definition->id()]['translation_lock'] = [
+          $form['entities'][$definition->id()]['settings']['translation_lock'] = [
             '#disabled' => TRUE,
             '#default_value' => FALSE,
             '#description' => $this->t('To allow editing multiple translations concurrently you need to install %module',
@@ -144,7 +178,38 @@ class ContentLockSettingsForm extends ConfigFormBase {
                 '%module' => $this->getLinkGenerator()->generate('Conflict', Url::fromUri('https://www.drupal.org/project/conflict')),
               ]
             ),
-          ] + $form['entities'][$definition->id()]['translation_lock'];
+          ] + $form['entities'][$definition->id()]['settings']['translation_lock'];
+        }
+
+        if (!empty($definition->getHandlerClasses()['form'])) {
+          $form['entities'][$definition->id()]['settings']['form_op_lock'] = [
+            '#tree' => 1,
+          ];
+          $form['entities'][$definition->id()]['settings']['form_op_lock']['mode'] = [
+            '#type' => 'radios',
+            '#title' => $this->t('Lock only on entity form operation level.'),
+            '#options' => [
+              ContentLock::FORM_OP_MODE_DISABLED => $this->t('Disabled'),
+              ContentLock::FORM_OP_MODE_WHITELIST => $this->t('Enable lock for selected form operations'),
+              ContentLock::FORM_OP_MODE_BLACKLIST => $this->t('Disable lock for selected form operations'),
+            ],
+            '#default_value' => $config->get('form_op_lock.' . $definition->id() . '.mode') ?: ContentLock::FORM_OP_MODE_DISABLED,
+            '#description' => $this->t('Activating this options allows users to edit different entity forms concurrently')
+          ];
+
+          $form_ops = array_keys($definition->getHandlerClasses()['form']);
+          $form_ops = array_combine($form_ops, $form_ops);
+          $form['entities'][$definition->id()]['settings']['form_op_lock']['values'] = [
+            '#type' => 'checkboxes',
+            '#title' => $this->t('Form operations'),
+            '#options' => $form_ops,
+            '#default_value' => (array) $config->get('form_op_lock.' . $definition->id() . '.values'),
+            '#states' => [
+              'invisible' => [
+                ':input[name="' . $definition->id() . '[settings][form_op_lock][mode]"]' => ['value' => ContentLock::FORM_OP_MODE_DISABLED],
+              ],
+            ],
+          ];
         }
       }
     }
@@ -165,7 +230,8 @@ class ContentLockSettingsForm extends ConfigFormBase {
         if ($form_state->getValue($definition->id())) {
           $content_lock = $this->config('content_lock.settings');
           $content_lock->set('types.' . $definition->id(), $this->removeEmptyValue($form_state->getValue([$definition->id(), 'bundles'])));
-          $translation_lock = (bool) $form_state->getValue([$definition->id(), 'translation_lock']);
+
+          $translation_lock = (bool) $form_state->getValue([$definition->id(), 'settings', 'translation_lock']);
           $types_translation_lock = $content_lock->get('types_translation_lock');
           if ($translation_lock && !in_array($definition->id(), $types_translation_lock)) {
             $types_translation_lock[] = $definition->id();
@@ -174,6 +240,9 @@ class ContentLockSettingsForm extends ConfigFormBase {
             $types_translation_lock = array_diff($types_translation_lock, [$definition->id()]);
           }
           $content_lock->set('types_translation_lock', $types_translation_lock);
+
+          $content_lock->set('form_op_lock.' . $definition->id() . '.mode', $form_state->getValue([$definition->id(), 'settings', 'form_op_lock', 'mode']));
+          $content_lock->set('form_op_lock.' . $definition->id() . '.values', $this->removeEmptyValue((array) $form_state->getValue([$definition->id(), 'settings', 'form_op_lock', 'values'])));
         }
       }
     }
diff --git a/src/Form/EntityBreakLockForm.php b/src/Form/EntityBreakLockForm.php
index 6535c94..86f8b70 100644
--- a/src/Form/EntityBreakLockForm.php
+++ b/src/Form/EntityBreakLockForm.php
@@ -62,8 +62,9 @@ class EntityBreakLockForm extends FormBase {
     $entity_type = $form_state->getValue('entity_type_id');
     $entity_id = $form_state->getValue('entity_id');
     $langcode = $form_state->getValue('langcode');
+    $form_op = $form_state->getValue('form_op') ?: NULL;
 
-    $this->lockService->release($entity_id, $langcode, NULL, $entity_type);
+    $this->lockService->release($entity_id, $langcode, $form_op,NULL, $entity_type);
     if ($form_state->get('translation_lock')) {
       drupal_set_message($this->t('Lock broken. Anyone can now edit this content translation.'));
     }
@@ -91,12 +92,18 @@ class EntityBreakLockForm extends FormBase {
   /**
    * {@inheritdoc}
    */
-  public function buildForm(array $form, FormStateInterface $form_state, ContentEntityInterface $entity = NULL, $langcode = NULL) {
+  public function buildForm(array $form, FormStateInterface $form_state, ContentEntityInterface $entity = NULL, $langcode = NULL, $form_op = NULL) {
     $translation_lock = $this->lockService->isTranslationLockEnabled($entity->getEntityTypeId());
     if (!$translation_lock) {
       $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
     }
     $form_state->set('translation_lock', $translation_lock);
+
+    $form_op_lock = $this->lockService->isFormOperationLockEnabled($entity->getEntityTypeId());
+    if (!$form_op_lock) {
+      $form_op = '*';
+    }
+
     $form['#title'] = $this->t('Break Lock for content @label', ['@label' => $entity->label()]);
     $form['entity_id'] = [
       '#type' => 'value',
@@ -110,6 +117,10 @@ class EntityBreakLockForm extends FormBase {
       '#type' => 'value',
       '#value' => $langcode,
     ];
+    $form['form_op'] = [
+      '#type' => 'value',
+      '#value' => $form_op,
+    ];
     $form['submit'] = [
       '#type' => 'submit',
       '#value' => $this->t('Confirm break lock'),
diff --git a/src/Routing/BreakLockRoutes.php b/src/Routing/BreakLockRoutes.php
index 3601a0b..44b58ec 100644
--- a/src/Routing/BreakLockRoutes.php
+++ b/src/Routing/BreakLockRoutes.php
@@ -43,7 +43,7 @@ class BreakLockRoutes implements ContainerInjectionInterface {
     foreach ($definitions as $definition) {
       if ($definition instanceof ContentEntityTypeInterface) {
         $routes['content_lock.break_lock.' . $definition->id()] = new Route(
-          '/admin/break-lock/' . $definition->id() . '/{entity}/{langcode}',
+          '/admin/break-lock/' . $definition->id() . '/{entity}/{langcode}/{form_op}',
           [
             '_form' => $definition->getHandlerClass('break_lock_form'),
             '_title' => 'Break lock',
diff --git a/templates/content-lock-settings-entities.html.twig b/templates/content-lock-settings-entities.html.twig
new file mode 100644
index 0000000..7589da6
--- /dev/null
+++ b/templates/content-lock-settings-entities.html.twig
@@ -0,0 +1,12 @@
+{#
+/**
+ * @file
+ * Theme override to display the content lock entity settings.
+ *
+ * Available variables:
+ * - title: The title of the entity.
+ * - build: Settings form of the entity
+ */
+#}
+<h4>{{ title }}</h4>
+{{ build }}
